Odoo Help


This community is for beginners and experts willing to share their Odoo knowledge. It's not a forum to discuss ideas, but a knowledge base of questions and their answers.


Problem with generation of an Invoice

Kapil More
on 6/22/15, 9:24 AM 322 views

Hi, I am working on module for Restaurant Management, where I added the tabs like Table Booking, Orders, Table Order and Kitchen Order Ticket.

Here, after confirmation of Table Booking an Order will crete and after that KOT will generate.

Now, I want to generate an Invoice for the final payment of a customer and I wish that, this particular invoice can shown in accounting module inside customer invoices.

I also tried workflows but there is a problem with the amount_total field. How to get the value of amount_total field inside of another module.(accounting-customer invoices)

Here is my code,


class hotel_restaurant_reservation(osv.Model):

def create_order(self, cr, uid, ids, context=None):

proxy = self.pool.get('hotel.reservation.order')

for record in self.browse(cr, uid, ids):

table_ids = [tableno.id for tableno in record.tableno]

values = {



'table_no':[(6, 0, table_ids)],


proxy.create(cr, uid, values, context=context)

return True

def onchange_partner_id(self, cr, uid, ids, part):

if not part:

return {'value':{'partner_address_id': False}}

addr = self.pool.get('res.partner').address_get(cr, uid, [part], ['default'])

return {'value':{'partner_address_id': addr['default']}}

def action_set_to_draft(self, cr, uid, ids, *args):

self.write(cr, uid, ids, {'state': 'draft'})

wf_service = netsvc.LocalService('workflow')

for id in ids:

wf_service.trg_create(uid, self._name, id, cr)

return True

def table_reserved(self, cr, uid, ids, *args):

for reservation in self.browse(cr, uid, ids):

cr.execute("select count(*) from hotel_restaurant_reservation as hrr " \

"inner join reservation_table as rt on rt.reservation_table_id = hrr.id " \

"where (start_date,end_date)overlaps( timestamp %s , timestamp %s ) " \

"and hrr.id<> %s " \

"and rt.name in (select rt.name from hotel_restaurant_reservation as hrr " \

"inner join reservation_table as rt on rt.reservation_table_id = hrr.id " \

"where hrr.id= %s) " \

, (reservation.start_date, reservation.end_date, reservation.id, reservation.id))

res = cr.fetchone()

roomcount = res and res[0] or 0.0

if roomcount:

raise osv.except_osv(_('Warning'), _('You tried to confirm reservation with table those already reserved in this reservation period'))


self.write(cr, uid, ids, {'state':'confirm'})

return True

def table_cancel(self, cr, uid, ids, *args):

self.write(cr, uid, ids, {



return True

def table_done(self, cr, uid, ids, *args):

self.write(cr, uid, ids, {



return True

_name = "hotel.restaurant.reservation"

_description = "Includes Hotel Restaurant Reservation"

_columns = {

'reservation_id':fields.char('Reservation No', size=64, required=True),

'room_no':fields.many2one('hotel.room', 'Room No', size=64),

'start_date':fields.datetime('Start Time', required=True),

'end_date':fields.datetime('End Time', required=True),

'cname':fields.many2one('res.partner', 'Customer Name', size=64, required=True),

'partner_address_id':fields.many2one('res.partner', 'Address'),

'tableno':fields.many2many('hotel.restaurant.tables', 'reservation_table', 'reservation_table_id', 'name', 'Table Number', help="Table reservation detail. "),

'state' : fields.selection([('draft', 'Draft'), ('confirm', 'Confirmed'), ('done', 'Done'), ('cancel', 'Cancelled')], 'state', select=True, required=True, readonly=True),


_defaults = {

'state': lambda * a: 'draft',

'reservation_id':lambda obj, cr, uid, context: obj.pool.get('ir.sequence').get(cr, uid, 'hotel.restaurant.reservation'),


_sql_constraints = [

('check_dates', 'CHECK (start_date<=end_date)', 'Start Date Should be less than the End Date!'),


Model for Orders ......

class hotel_restaurant_order(osv.Model):

def _sub_total(self, cr, uid, ids, field_name, arg, context=None):

res = {}

for sale in self.browse(cr, uid, ids, context=context):

res[sale.id] = sum(line.price_subtotal for line in sale.order_list)

return res

def _total(self, cr, uid, ids, field_name, arg, context=None):

res = {}

for line in self.browse(cr, uid, ids, context=context):

res[line.id] = line.amount_subtotal + (line.amount_subtotal * line.tax) / 100

return res

def generate_kot(self, cr, uid, ids, part):

order_tickets_obj = self.pool.get('hotel.restaurant.kitchen.order.tickets')

restaurant_order_list_obj = self.pool.get('hotel.restaurant.order.list')

for order in self.browse(cr, uid, ids):

table_ids = [x.id for x in order.table_no]

kot_data = order_tickets_obj.create(cr, uid, {





'tableno':[(6, 0, table_ids)],


for order_line in order.order_list:

o_line = {





restaurant_order_list_obj.create(cr, uid, o_line)

return True

_name = "hotel.restaurant.order"

_description = "Includes Hotel Restaurant Order"

_columns = {

'order_no':fields.char('Order Number', size=64, required=True),

'o_date':fields.datetime('Date', required=True),

'room_no':fields.many2one('hotel.room', 'Room No'),

'waiter_name':fields.many2one('res.partner', 'Waiter Name'),

'table_no':fields.many2many('hotel.restaurant.tables', 'temp_table2', 'table_no', 'name', 'Table Number'),

'order_list':fields.one2many('hotel.restaurant.order.list', 'o_list', 'Order List'),

'tax': fields.float('Tax (%) '),

'amount_subtotal': fields.function(_sub_total, method=True, string='Subtotal'),

'amount_total':fields.function(_total, method=True, string='Total'),


_defaults = {

'order_no': lambda obj, cr, uid, context: obj.pool.get('ir.sequence').get(cr, uid, 'hotel.restaurant.order'),



<!-- Workflow definition -->

<record model="workflow" id="wkf_table_resrvation">

<field name="name">wkf.table.reservation</field>

<field name="osv">hotel.restaurant.reservation</field>

<field name="on_create">True</field>




<record model="workflow.activity" id="act_draft">

<field name="wkf_id" ref="wkf_table_resrvation" />

<field name="flow_start">True</field>

<field name="name">draft</field>


<record model="workflow.activity" id="act_confirm">

<field name="wkf_id" ref="wkf_table_resrvation" />

<field name="name">confirm</field>

<field name="kind">function</field>

<field name="action">table_reserved()</field>

<field name="split_mode">OR</field>


<record model="workflow.activity" id="act_cancel">

<field name="wkf_id" ref="wkf_table_resrvation" />

<field name="name">cancel</field>

<field name="kind">function</field>

<field name="action">table_cancel()</field>


<record model="workflow.activity" id="act_done">

<field name="wkf_id" ref="wkf_table_resrvation" />

<field name="name">done</field>

<field name="flow_stop">True</field>

<field name="kind">stopall</field>

<field name="action">table_done()</field>


<record model="workflow.activity" id="act_create_order">

<field name="wkf_id" ref="wkf_table_resrvation" />

<field name="name">create_order</field>

<field name="kind">function</field>


<!-- Transition -->

<record model="workflow.transition" id="t1">

<field name="act_from" ref="act_draft" />

<field name="act_to" ref="act_confirm" />

<field name="signal">confirm</field>


<record model="workflow.transition" id="t2">

<field name="act_from" ref="act_confirm" />

<field name="act_to" ref="act_done" />

<field name="signal">done</field>


<record model="workflow.transition" id="t3">

<field name="act_from" ref="act_confirm" />

<field name="act_to" ref="act_cancel" />

<field name="signal">cancel</field>


<record model="workflow.transition" id="t7">

<field name="act_from" ref="act_cancel" />

<field name="act_to" ref="act_draft" />

<field name="signal">settodraft</field>


<record model="workflow.transition" id="t8">

<field name="act_from" ref="act_done" />

<field name="act_to" ref="act_create_order" />

<field name="signal">create_order</field>


Your Answer

Please try to give a substantial answer. If you wanted to comment on the question or answer, just use the commenting tool. Please remember that you can always revise your answers - no need to answer the same question twice. Also, please don't forget to vote - it really helps to select the best questions and answers!

About This Community

This community is for professionals and enthusiasts of our products and services. Read Guidelines

Question tools

1 follower(s)


Asked: 6/22/15, 9:24 AM
Seen: 322 times
Last updated: 6/22/15, 9:24 AM