diff options
| author | IT Fixcomart <it@fixcomart.co.id> | 2023-07-21 03:41:22 +0000 |
|---|---|---|
| committer | IT Fixcomart <it@fixcomart.co.id> | 2023-07-21 03:41:22 +0000 |
| commit | 7489d3fba967e711cb0fdfd6d3cb5097751e883f (patch) | |
| tree | 877b3e47216f1667513161410439dc2626b455c0 | |
| parent | 3c9ef63acb42298d948ee86407d9a5ca67004246 (diff) | |
| parent | ce1c11b9be9274cf281a00cc340969f094a698be (diff) | |
Merged in receipt-bill (pull request #60)
Receipt bill
| -rwxr-xr-x | indoteknik_custom/__manifest__.py | 1 | ||||
| -rwxr-xr-x | indoteknik_custom/models/__init__.py | 3 | ||||
| -rw-r--r-- | indoteknik_custom/models/bill_receipt.py | 123 | ||||
| -rwxr-xr-x | indoteknik_custom/security/ir.model.access.csv | 2 | ||||
| -rw-r--r-- | indoteknik_custom/views/bill_receipt.xml | 113 | ||||
| -rw-r--r-- | indoteknik_custom/views/ir_sequence.xml | 10 | ||||
| -rwxr-xr-x | indoteknik_custom/views/purchase_order.xml | 1 |
7 files changed, 252 insertions, 1 deletions
diff --git a/indoteknik_custom/__manifest__.py b/indoteknik_custom/__manifest__.py index 2b6edffe..b6dea5a0 100755 --- a/indoteknik_custom/__manifest__.py +++ b/indoteknik_custom/__manifest__.py @@ -83,6 +83,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 e91eadf2..929fc8ba 100755 --- a/indoteknik_custom/models/__init__.py +++ b/indoteknik_custom/models/__init__.py @@ -70,4 +70,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..5e03fdce --- /dev/null +++ b/indoteknik_custom/models/bill_receipt.py @@ -0,0 +1,123 @@ +from odoo import models, api, fields +from odoo.exceptions import AccessError, UserError, ValidationError +from datetime import timedelta +import logging + +_logger = logging.getLogger(__name__) + + +class BillReceipt(models.Model): + _name = 'bill.receipt' + _description = 'Bill Receipt' + _order = 'bill_date desc, id desc' + + 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') + + 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') + 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'), + ('partner_id', '=', partner.id), + ('payment_state', '=', 'not_paid'), + ('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 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 + + +class BillReceiptLine(models.Model): + _name = 'bill.receipt.line' + _description = 'Bill Receipt Line' + _order = 'bill_id, id' + + 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') + # 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') + diff --git a/indoteknik_custom/security/ir.model.access.csv b/indoteknik_custom/security/ir.model.access.csv index 94c8a7d1..f115da56 100755 --- a/indoteknik_custom/security/ir.model.access.csv +++ b/indoteknik_custom/security/ir.model.access.csv @@ -61,3 +61,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..c9ab492a --- /dev/null +++ b/indoteknik_custom/views/bill_receipt.xml @@ -0,0 +1,113 @@ +<?xml version="1.0" encoding="UTF-8"?> +<odoo> + <record id="bill_receipt_tree" model="ir.ui.view"> + <field name="name">bill.receipt.tree</field> + <field name="model">bill.receipt</field> + <field name="arch" type="xml"> + <tree> + <field name="number"/> + <field name="bill_date"/> + <field name="partner_id"/> + <field name="is_validated" readonly="1"/> + <field name="date_kirim_tukar_faktur"/> + <field name="resi_tukar_faktur"/> + <field name="date_terima_tukar_faktur"/> + <field name="shipper_faktur_id"/> + </tree> + </field> + </record> + + <record id="bill_receipt_line_tree" model="ir.ui.view"> + <field name="name">bill.receipt.line.tree</field> + <field name="model">bill.receipt.line</field> + <field name="arch" type="xml"> + <tree> + <field name="partner_id"/> + <field name="invoice_id"/> + <field name="date_invoice"/> + <field name="efaktur_id"/> + <field name="reference"/> + <field name="total_amt"/> + <field name="open_amt"/> + <field name="due_date"/> + </tree> + </field> + </record> + + <record id="bill_receipt_form" model="ir.ui.view"> + <field name="name">bill.receipt.form</field> + <field name="model">bill.receipt</field> + <field name="arch" type="xml"> + <form> + <header> + <button name="generate_bill_line" + string="Generate" + type="object" + class="mr-2 oe_highlight oe_edit_only" + /> + <button name="validate_bill" + string="Validate" + type="object" + class="mr-2 oe_highlight oe_edit_only" + /> + <button name="copy_date_faktur" + string="Copy Date" + type="object" + class="oe_highlight oe_edit_only" + /> + </header> + <sheet> + <group> + <group> + <field name="number"/> + <field name="partner_id"/> + <field name="bill_date"/> + <field name="notification" readonly="1"/> + </group> + <group> + <field name="is_validated" readonly="1"/> + <field name="date_kirim_tukar_faktur"/> + <field name="resi_tukar_faktur"/> + <field name="date_terima_tukar_faktur"/> + <field name="shipper_faktur_id"/> + </group> + </group> + <notebook> + <page string="Bills"> + <field name="bill_line" attrs="{'readonly': [('is_validated', '=', True)]}"/> + </page> + </notebook> + </sheet> + </form> + </field> + </record> + + <record id="view_bill_receipt_filter" model="ir.ui.view"> + <field name="name">bill.receipt.list.select</field> + <field name="model">bill.receipt</field> + <field name="priority" eval="15"/> + <field name="arch" type="xml"> + <search string="Search Bills"> + <field name="number"/> + <field name="partner_id"/> + <field name="bill_line" string="Bill" filter_domain="[('bill_line.invoice_id', 'ilike', self)]"/> + </search> + </field> + </record> + + <record id="bill_receipt_action" model="ir.actions.act_window"> + <field name="name">Bill Line</field> + <field name="type">ir.actions.act_window</field> + <field name="res_model">bill.receipt</field> + <field name="search_view_id" ref="view_bill_receipt_filter"/> + <field name="view_mode">tree,form</field> + </record> + + <menuitem + id="menu_bill_receipt" + name="Bill Receipt" + parent="account.menu_finance_reports" + sequence="250" + action="bill_receipt_action" + /> +</odoo> 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 @@ <field name="number_increment">1</field> </record> + <record id="sequence_bill_receipt" model="ir.sequence"> + <field name="name">Bill Receipt</field> + <field name="code">bill.receipt</field> + <field name="active">TRUE</field> + <field name="prefix">BR/%(year)s/</field> + <field name="padding">5</field> + <field name="number_next">1</field> + <field name="number_increment">1</field> + </record> + <record id="sequence_requisition" model="ir.sequence"> <field name="name">Requisition</field> <field name="code">requisition</field> 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 @@ <field name="date_order" position="before"> <field name="sale_order_id" attrs="{'readonly': [('state', 'not in', ['draft'])]}"/> <field name="approval_status"/> + <field name="amount_total_without_service"/> </field> <field name="currency_id" position="after"> <field name="summary_qty_po"/> |
