From 855f63e1c39ba1ff4d84360845949bc260462c83 Mon Sep 17 00:00:00 2001 From: Azka Nathan Date: Fri, 14 Jul 2023 16:40:27 +0700 Subject: bill receipt --- indoteknik_custom/__manifest__.py | 1 + indoteknik_custom/models/__init__.py | 3 +- indoteknik_custom/models/bill_receipt.py | 70 ++++++++++++++++++++++++ indoteknik_custom/security/ir.model.access.csv | 2 + indoteknik_custom/views/bill_receipt.xml | 76 ++++++++++++++++++++++++++ indoteknik_custom/views/ir_sequence.xml | 10 ++++ 6 files changed, 161 insertions(+), 1 deletion(-) create mode 100644 indoteknik_custom/models/bill_receipt.py create mode 100644 indoteknik_custom/views/bill_receipt.xml diff --git a/indoteknik_custom/__manifest__.py b/indoteknik_custom/__manifest__.py index 4fa736f6..f91b33d7 100755 --- a/indoteknik_custom/__manifest__.py +++ b/indoteknik_custom/__manifest__.py @@ -79,6 +79,7 @@ 'views/landedcost.xml', 'views/product_sla.xml', 'views/voucher.xml', + 'views/bill_receipt.xml', 'report/report.xml', 'report/report_banner_banner.xml', 'report/report_banner_banner2.xml', diff --git a/indoteknik_custom/models/__init__.py b/indoteknik_custom/models/__init__.py index 9e4d2cf9..8b3296a5 100755 --- a/indoteknik_custom/models/__init__.py +++ b/indoteknik_custom/models/__init__.py @@ -66,4 +66,5 @@ from . import requisition from . import token_storage from . import product_sla from . import account_move_due_extension -from . import voucher \ No newline at end of file +from . import voucher +from . import bill_receipt \ No newline at end of file diff --git a/indoteknik_custom/models/bill_receipt.py b/indoteknik_custom/models/bill_receipt.py new file mode 100644 index 00000000..31c09b33 --- /dev/null +++ b/indoteknik_custom/models/bill_receipt.py @@ -0,0 +1,70 @@ +from odoo import models, api, fields +from odoo.exceptions import AccessError, UserError, ValidationError +from datetime import timedelta, date +import logging + +_logger = logging.getLogger(__name__) + +class BillReceipt(models.Model): + _name = "bill.receipt" + _description = "Bill Receipt" + _rec_name = 'number' + + number = fields.Char(string='Document No', index=True, copy=False, readonly=True, tracking=True) + vendor_id = fields.Many2one('res.partner', string="Vendor") + document_date = fields.Date(string="Document Date") + description = fields.Text(string='Description') + validated = fields.Boolean(string="Validated", readonly=True) + bill_line = fields.One2many('bill.receipt.line', 'bill_id', string='Bill Receipt Lines') + + @api.model + def create(self, vals): + vals['number'] = self.env['ir.sequence'].next_by_code('due.extension') or '0' + result = super(BillReceipt, self).create(vals) + return result + + def validate_button(self): + if not self.bill_line: + raise UserError('Bill receipt line masih kosong') + + self.validated = True + + def cancel_button(self): + if not self.bill_line: + raise UserError('Bill receipt line masih kosong') + + if self.validated != True: + raise UserError('Document ini belum di validate') + + self.validated = False + +class BillReceiptLine(models.Model): + _name = 'bill.receipt.line' + _description = 'Bill Receipt Line' + _order = 'bill_id, id' + + bill_id = fields.Many2one('bill.receipt', string='Bill Receipt') + po_id = fields.Many2one('purchase.order', string='PO') + sale_order_id = fields.Many2one('sale.order', string='Sale Order') + user_id = fields.Many2one('res.users', string='Purchase Rep') + payment_term_id = fields.Many2one('account.payment.term', string='Payment Terms') + amount_total = fields.Float(string='Total') + reference = fields.Char(string='Reference') + + @api.onchange('po_id') + def onchange_user_id(self): + self.user_id = self.po_id.user_id + + @api.onchange('po_id') + def onchange_sale_order_id(self): + self.sale_order_id = self.po_id.sale_order_id + + @api.onchange('po_id') + def onchange_payment_term_id(self): + self.payment_term_id = self.po_id.payment_term_id + + @api.onchange('po_id') + def onchange_amount_total(self): + self.amount_total = self.po_id.amount_total + + diff --git a/indoteknik_custom/security/ir.model.access.csv b/indoteknik_custom/security/ir.model.access.csv index 2b269417..379c4c8e 100755 --- a/indoteknik_custom/security/ir.model.access.csv +++ b/indoteknik_custom/security/ir.model.access.csv @@ -57,3 +57,5 @@ access_requisition_purchase_match,access.requisition.purchase.match,model_requis access_token_storage,access.token_storage,model_token_storage,,1,1,1,1 access_product_sla,access.product_sla,model_product_sla,,1,1,1,1 access_voucher,access.voucher,model_voucher,,1,1,1,1 +access_bill_receipt,access.bill.receipt,model_bill_receipt,,1,1,1,1 +access_bill_receipt_line,access.bill.receipt.line,model_bill_receipt_line,,1,1,1,1 diff --git a/indoteknik_custom/views/bill_receipt.xml b/indoteknik_custom/views/bill_receipt.xml new file mode 100644 index 00000000..6e27ee12 --- /dev/null +++ b/indoteknik_custom/views/bill_receipt.xml @@ -0,0 +1,76 @@ + + + + bill.receipt.tree + bill.receipt + + + + + + + + + + + + + bill.receipt.form + bill.receipt + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + Bill Line + ir.actions.act_window + bill.receipt + tree,form + + + +
diff --git a/indoteknik_custom/views/ir_sequence.xml b/indoteknik_custom/views/ir_sequence.xml index a8348772..6798e5b4 100644 --- a/indoteknik_custom/views/ir_sequence.xml +++ b/indoteknik_custom/views/ir_sequence.xml @@ -41,6 +41,16 @@ 1 + + Bill Receipt + bill.receipt + TRUE + BR/%(year)s/ + 5 + 1 + 1 + + Requisition requisition -- cgit v1.2.3 From bb8d8fe7824dc929634bf00f2dcc7d51630257d3 Mon Sep 17 00:00:00 2001 From: Azka Nathan Date: Mon, 17 Jul 2023 13:35:08 +0700 Subject: add new field to receipt bill --- indoteknik_custom/models/bill_receipt.py | 34 ++++++++++++++++++++++++++++++ indoteknik_custom/views/bill_receipt.xml | 30 +++++++++++++++++--------- indoteknik_custom/views/purchase_order.xml | 1 + 3 files changed, 55 insertions(+), 10 deletions(-) diff --git a/indoteknik_custom/models/bill_receipt.py b/indoteknik_custom/models/bill_receipt.py index 31c09b33..806edc25 100644 --- a/indoteknik_custom/models/bill_receipt.py +++ b/indoteknik_custom/models/bill_receipt.py @@ -16,6 +16,15 @@ class BillReceipt(models.Model): description = fields.Text(string='Description') validated = fields.Boolean(string="Validated", readonly=True) bill_line = fields.One2many('bill.receipt.line', 'bill_id', string='Bill Receipt Lines') + grand_total = fields.Float(string="Grand Total") + + def compute_amt_total_without_service(self): + for order in self: + sum_price_total = 0 + for line in order.order_line: + if line.product_id.type == 'product': + sum_price_total += line.price_total + order.amount_total_without_service = sum_price_total @api.model def create(self, vals): @@ -48,8 +57,33 @@ class BillReceiptLine(models.Model): sale_order_id = fields.Many2one('sale.order', string='Sale Order') user_id = fields.Many2one('res.users', string='Purchase Rep') payment_term_id = fields.Many2one('account.payment.term', string='Payment Terms') + vendor_id = fields.Many2one('res.partner', string='Vendor') + date_approve = fields.Datetime(string='Confirmation Date') + date_planned = fields.Datetime(string='Receipt Date') + amount_untaxed = fields.Float(string='Untaxed Amount') amount_total = fields.Float(string='Total') reference = fields.Char(string='Reference') + partner_ref = fields.Char(string='Vendor Reference') + + @api.onchange('po_id') + def onchange_partner_ref(self): + self.partner_ref = self.po_id.partner_ref + + @api.onchange('po_id') + def onchange_vendor_id(self): + self.vendor_id = self.po_id.partner_id + + @api.onchange('po_id') + def onchange_date_approve(self): + self.date_approve = self.po_id.date_approve + + @api.onchange('po_id') + def onchange_date_planned(self): + self.date_planned = self.po_id.date_planned + + @api.onchange('po_id') + def onchange_amount_untaxed(self): + self.amount_untaxed = self.po_id.amount_untaxed @api.onchange('po_id') def onchange_user_id(self): diff --git a/indoteknik_custom/views/bill_receipt.xml b/indoteknik_custom/views/bill_receipt.xml index 6e27ee12..cfc268b0 100644 --- a/indoteknik_custom/views/bill_receipt.xml +++ b/indoteknik_custom/views/bill_receipt.xml @@ -14,6 +14,25 @@ + + bill.receipt.line.tree + bill.receipt.line + + + + + + + + + + + + + + + + bill.receipt.form bill.receipt @@ -42,16 +61,7 @@ - - - - - - - - - - + diff --git a/indoteknik_custom/views/purchase_order.xml b/indoteknik_custom/views/purchase_order.xml index 4efa8cf4..2f8590f3 100755 --- a/indoteknik_custom/views/purchase_order.xml +++ b/indoteknik_custom/views/purchase_order.xml @@ -32,6 +32,7 @@ + -- cgit v1.2.3 From cc4150ade5d8f6cea80ce4acf92907be0a3ed29a Mon Sep 17 00:00:00 2001 From: Azka Nathan Date: Tue, 18 Jul 2023 10:31:56 +0700 Subject: refactor receipt bill --- indoteknik_custom/models/bill_receipt.py | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/indoteknik_custom/models/bill_receipt.py b/indoteknik_custom/models/bill_receipt.py index 806edc25..39d5f31b 100644 --- a/indoteknik_custom/models/bill_receipt.py +++ b/indoteknik_custom/models/bill_receipt.py @@ -11,24 +11,15 @@ class BillReceipt(models.Model): _rec_name = 'number' number = fields.Char(string='Document No', index=True, copy=False, readonly=True, tracking=True) - vendor_id = fields.Many2one('res.partner', string="Vendor") - document_date = fields.Date(string="Document Date") + vendor_id = fields.Many2one('res.partner', string="Vendor", required=True) + document_date = fields.Date(string="Document Date", required=True) description = fields.Text(string='Description') validated = fields.Boolean(string="Validated", readonly=True) bill_line = fields.One2many('bill.receipt.line', 'bill_id', string='Bill Receipt Lines') - grand_total = fields.Float(string="Grand Total") - - def compute_amt_total_without_service(self): - for order in self: - sum_price_total = 0 - for line in order.order_line: - if line.product_id.type == 'product': - sum_price_total += line.price_total - order.amount_total_without_service = sum_price_total @api.model def create(self, vals): - vals['number'] = self.env['ir.sequence'].next_by_code('due.extension') or '0' + vals['number'] = self.env['ir.sequence'].next_by_code('bill.receipt') or '0' result = super(BillReceipt, self).create(vals) return result @@ -53,8 +44,8 @@ class BillReceiptLine(models.Model): _order = 'bill_id, id' bill_id = fields.Many2one('bill.receipt', string='Bill Receipt') - po_id = fields.Many2one('purchase.order', string='PO') sale_order_id = fields.Many2one('sale.order', string='Sale Order') + po_id = fields.Many2one('purchase.order', string='PO') user_id = fields.Many2one('res.users', string='Purchase Rep') payment_term_id = fields.Many2one('account.payment.term', string='Payment Terms') vendor_id = fields.Many2one('res.partner', string='Vendor') -- cgit v1.2.3 From 9e0f8349ef5038bc3d7a3424ff5b6cfc0d1154ae Mon Sep 17 00:00:00 2001 From: Azka Nathan Date: Tue, 18 Jul 2023 13:43:15 +0700 Subject: replace menu bill line --- indoteknik_custom/views/bill_receipt.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/indoteknik_custom/views/bill_receipt.xml b/indoteknik_custom/views/bill_receipt.xml index cfc268b0..c73802c2 100644 --- a/indoteknik_custom/views/bill_receipt.xml +++ b/indoteknik_custom/views/bill_receipt.xml @@ -79,8 +79,8 @@ -- cgit v1.2.3 From f953c7c5915e15bd499f374d49403ef2567e0071 Mon Sep 17 00:00:00 2001 From: Azka Nathan Date: Tue, 18 Jul 2023 16:37:47 +0700 Subject: refactor bill receipt --- indoteknik_custom/models/bill_receipt.py | 98 +++++++++++++++----------------- indoteknik_custom/views/bill_receipt.xml | 20 +++---- 2 files changed, 54 insertions(+), 64 deletions(-) diff --git a/indoteknik_custom/models/bill_receipt.py b/indoteknik_custom/models/bill_receipt.py index 39d5f31b..b3f7f0ae 100644 --- a/indoteknik_custom/models/bill_receipt.py +++ b/indoteknik_custom/models/bill_receipt.py @@ -11,8 +11,8 @@ class BillReceipt(models.Model): _rec_name = 'number' number = fields.Char(string='Document No', index=True, copy=False, readonly=True, tracking=True) - vendor_id = fields.Many2one('res.partner', string="Vendor", required=True) - document_date = fields.Date(string="Document Date", required=True) + partner_id = fields.Many2one('res.partner', string="Vendor") + document_date = fields.Date(string="Document Date") description = fields.Text(string='Description') validated = fields.Boolean(string="Validated", readonly=True) bill_line = fields.One2many('bill.receipt.line', 'bill_id', string='Bill Receipt Lines') @@ -24,8 +24,41 @@ class BillReceipt(models.Model): return result def validate_button(self): - if not self.bill_line: - raise UserError('Bill receipt line masih kosong') + if self.validated: + raise UserError('Sudah di validate, tidak bisa digenerate ulang') + if self.bill_line: + raise UserError('Harus hapus semua line jika ingin generate ulang') + if self.partner_id.parent_id: + raise UserError('Harus pilih parent company') + + partners = [] + partners += self.partner_id.child_ids + partners.append(self.partner_id) + + for partner in partners: + query = [ + ('move_type', '=', 'in_invoice'), + ('state', '=', 'posted'), + ('payment_state', '=', 'not_paid'), + ('partner_id', '=', partner.id), + ('date_kirim_tukar_faktur', '=', False), + ] + invoices = self.env['account.move'].search(query, order='invoice_date') + count = 0 + for invoice in invoices: + self.env['bill.receipt.line'].create([{ + 'bill_id': self.id, + 'partner_id': invoice.partner_id.id, + 'invoice_id': invoice.id, + 'date_invoice': invoice.invoice_date, + 'efaktur_id': invoice.efaktur_id.id, + 'reference': invoice.ref, + 'total_amt': invoice.amount_total, + 'open_amt': invoice.amount_residual_signed, + 'due_date': invoice.invoice_date_due + }]) + count += 1 + _logger.info("Bill Receipt Line generated %s" % count) self.validated = True @@ -43,53 +76,12 @@ class BillReceiptLine(models.Model): _description = 'Bill Receipt Line' _order = 'bill_id, id' - bill_id = fields.Many2one('bill.receipt', string='Bill Receipt') - sale_order_id = fields.Many2one('sale.order', string='Sale Order') - po_id = fields.Many2one('purchase.order', string='PO') - user_id = fields.Many2one('res.users', string='Purchase Rep') - payment_term_id = fields.Many2one('account.payment.term', string='Payment Terms') - vendor_id = fields.Many2one('res.partner', string='Vendor') - date_approve = fields.Datetime(string='Confirmation Date') - date_planned = fields.Datetime(string='Receipt Date') - amount_untaxed = fields.Float(string='Untaxed Amount') - amount_total = fields.Float(string='Total') + bill_id = fields.Many2one('bill.receipt', string='Bill Ref', required=True, ondelete='cascade', index=True, copy=False) + partner_id = fields.Many2one('res.partner', string='Customer') + invoice_id = fields.Many2one('account.move', string='Invoice') + date_invoice = fields.Date(string='Invoice Date') + efaktur_id = fields.Many2one('vit.efaktur', string='Faktur Pajak') reference = fields.Char(string='Reference') - partner_ref = fields.Char(string='Vendor Reference') - - @api.onchange('po_id') - def onchange_partner_ref(self): - self.partner_ref = self.po_id.partner_ref - - @api.onchange('po_id') - def onchange_vendor_id(self): - self.vendor_id = self.po_id.partner_id - - @api.onchange('po_id') - def onchange_date_approve(self): - self.date_approve = self.po_id.date_approve - - @api.onchange('po_id') - def onchange_date_planned(self): - self.date_planned = self.po_id.date_planned - - @api.onchange('po_id') - def onchange_amount_untaxed(self): - self.amount_untaxed = self.po_id.amount_untaxed - - @api.onchange('po_id') - def onchange_user_id(self): - self.user_id = self.po_id.user_id - - @api.onchange('po_id') - def onchange_sale_order_id(self): - self.sale_order_id = self.po_id.sale_order_id - - @api.onchange('po_id') - def onchange_payment_term_id(self): - self.payment_term_id = self.po_id.payment_term_id - - @api.onchange('po_id') - def onchange_amount_total(self): - self.amount_total = self.po_id.amount_total - - + total_amt = fields.Float(string='Total Amount') + open_amt = fields.Float(string='Open Amount') + due_date = fields.Date(string='Due Date') \ No newline at end of file diff --git a/indoteknik_custom/views/bill_receipt.xml b/indoteknik_custom/views/bill_receipt.xml index c73802c2..138bd0a0 100644 --- a/indoteknik_custom/views/bill_receipt.xml +++ b/indoteknik_custom/views/bill_receipt.xml @@ -6,7 +6,7 @@ - + @@ -19,16 +19,14 @@ bill.receipt.line - - - - - - - + + + + - - + + + @@ -51,7 +49,7 @@ - + -- cgit v1.2.3 From ce1c11b9be9274cf281a00cc340969f094a698be Mon Sep 17 00:00:00 2001 From: Azka Nathan Date: Fri, 21 Jul 2023 10:00:16 +0700 Subject: update receipt bill --- indoteknik_custom/models/bill_receipt.py | 98 ++++++++++++++++++++++---------- indoteknik_custom/views/bill_receipt.xml | 57 ++++++++++++++----- 2 files changed, 110 insertions(+), 45 deletions(-) diff --git a/indoteknik_custom/models/bill_receipt.py b/indoteknik_custom/models/bill_receipt.py index b3f7f0ae..5e03fdce 100644 --- a/indoteknik_custom/models/bill_receipt.py +++ b/indoteknik_custom/models/bill_receipt.py @@ -1,30 +1,68 @@ from odoo import models, api, fields from odoo.exceptions import AccessError, UserError, ValidationError -from datetime import timedelta, date +from datetime import timedelta import logging _logger = logging.getLogger(__name__) + class BillReceipt(models.Model): - _name = "bill.receipt" - _description = "Bill Receipt" - _rec_name = 'number' + _name = 'bill.receipt' + _description = 'Bill Receipt' + _order = 'bill_date desc, id desc' - number = fields.Char(string='Document No', index=True, copy=False, readonly=True, tracking=True) - partner_id = fields.Many2one('res.partner', string="Vendor") - document_date = fields.Date(string="Document Date") - description = fields.Text(string='Description') - validated = fields.Boolean(string="Validated", readonly=True) - bill_line = fields.One2many('bill.receipt.line', 'bill_id', string='Bill Receipt Lines') + number = fields.Char(string='Document No', index=True, copy=False, readonly=True) + bill_date = fields.Date(string='Bill Date', required=True) + partner_id = fields.Many2one( + 'res.partner', string='Vendor', + required=True, change_default=True, index=True, tracking=1) + bill_line = fields.One2many('bill.receipt.line', 'bill_id', string='Bill Receipt Lines', auto_join=True) + # dunning_level = fields.Integer(string='Bill Level', default=30, help='30 hari sebelum jatuh tempo invoice') + date_kirim_tukar_faktur = fields.Date(string='Kirim Faktur') + resi_tukar_faktur = fields.Char(string='Resi Faktur') + date_terima_tukar_faktur = fields.Date(string='Terima Faktur') + shipper_faktur_id = fields.Many2one('delivery.carrier', string='Shipper Faktur') + is_validated = fields.Boolean(string='Validated') + notification = fields.Char(string='Notification') - @api.model - def create(self, vals): - vals['number'] = self.env['ir.sequence'].next_by_code('bill.receipt') or '0' - result = super(BillReceipt, self).create(vals) - return result - - def validate_button(self): - if self.validated: + def copy_date_faktur(self): + if not self.is_validated: + raise UserError('Harus di validate dulu') + for line in self.bill_line: + invoice = line.invoice_id + if not invoice.date_kirim_tukar_faktur and self.date_kirim_tukar_faktur: + invoice.date_kirim_tukar_faktur = self.date_kirim_tukar_faktur + tukar_date = self.date_kirim_tukar_faktur + term = invoice.invoice_payment_term_id + add_days = 0 + for line in term.line_ids: + add_days += line.days + due_date = tukar_date + timedelta(days=add_days) + invoice.invoice_date_due = due_date + if not invoice.resi_tukar_faktur: + invoice.resi_tukar_faktur = self.resi_tukar_faktur + if not invoice.date_terima_tukar_faktur and self.date_terima_tukar_faktur: + invoice.date_terima_tukar_faktur = self.date_terima_tukar_faktur + tukar_date = self.date_terima_tukar_faktur + term = invoice.invoice_payment_term_id + add_days = 0 + for line in term.line_ids: + add_days += line.days + due_date = tukar_date + timedelta(days=add_days) + invoice.invoice_date_due = due_date + if not invoice.shipper_faktur_id: + invoice.shipper_faktur_id = self.shipper_faktur_id + self.notification = 'Berhasil copy tanggal terima faktur ke setiap invoice %s' % self.date_terima_tukar_faktur + + def validate_bill(self): + if not self.bill_line: + raise UserError('Bill Line masih kosong, generate dulu') + else: + self.is_validated = True + self.notification = 'Jangan lupa klik Copy Date jika sudah ada tanggal kirim / tanggal terima faktur' + + def generate_bill_line(self): + if self.is_validated: raise UserError('Sudah di validate, tidak bisa digenerate ulang') if self.bill_line: raise UserError('Harus hapus semua line jika ingin generate ulang') @@ -39,8 +77,8 @@ class BillReceipt(models.Model): query = [ ('move_type', '=', 'in_invoice'), ('state', '=', 'posted'), - ('payment_state', '=', 'not_paid'), ('partner_id', '=', partner.id), + ('payment_state', '=', 'not_paid'), ('date_kirim_tukar_faktur', '=', False), ] invoices = self.env['account.move'].search(query, order='invoice_date') @@ -58,19 +96,15 @@ class BillReceipt(models.Model): 'due_date': invoice.invoice_date_due }]) count += 1 - _logger.info("Bill Receipt Line generated %s" % count) - - self.validated = True + _logger.info("Bill Line generated %s" % count) + + @api.model + def create(self, vals): + vals['number'] = self.env['ir.sequence'].next_by_code('bill.receipt') or '0' + result = super(BillReceipt, self).create(vals) + return result - def cancel_button(self): - if not self.bill_line: - raise UserError('Bill receipt line masih kosong') - - if self.validated != True: - raise UserError('Document ini belum di validate') - self.validated = False - class BillReceiptLine(models.Model): _name = 'bill.receipt.line' _description = 'Bill Receipt Line' @@ -80,8 +114,10 @@ class BillReceiptLine(models.Model): partner_id = fields.Many2one('res.partner', string='Customer') invoice_id = fields.Many2one('account.move', string='Invoice') date_invoice = fields.Date(string='Invoice Date') + # due_date = fields.Date(string='Due Date') efaktur_id = fields.Many2one('vit.efaktur', string='Faktur Pajak') reference = fields.Char(string='Reference') total_amt = fields.Float(string='Total Amount') open_amt = fields.Float(string='Open Amount') - due_date = fields.Date(string='Due Date') \ No newline at end of file + due_date = fields.Date(string='Due Date') + diff --git a/indoteknik_custom/views/bill_receipt.xml b/indoteknik_custom/views/bill_receipt.xml index 138bd0a0..c9ab492a 100644 --- a/indoteknik_custom/views/bill_receipt.xml +++ b/indoteknik_custom/views/bill_receipt.xml @@ -6,10 +6,13 @@ + - - - + + + + + @@ -37,29 +40,41 @@
-
- - - + + + + - + + + + + - - + + @@ -67,16 +82,30 @@ + + bill.receipt.list.select + bill.receipt + + + + + + + + + + Bill Line ir.actions.act_window bill.receipt + tree,form