summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIT Fixcomart <it@fixcomart.co.id>2023-07-21 03:41:22 +0000
committerIT Fixcomart <it@fixcomart.co.id>2023-07-21 03:41:22 +0000
commit7489d3fba967e711cb0fdfd6d3cb5097751e883f (patch)
tree877b3e47216f1667513161410439dc2626b455c0
parent3c9ef63acb42298d948ee86407d9a5ca67004246 (diff)
parentce1c11b9be9274cf281a00cc340969f094a698be (diff)
Merged in receipt-bill (pull request #60)
Receipt bill
-rwxr-xr-xindoteknik_custom/__manifest__.py1
-rwxr-xr-xindoteknik_custom/models/__init__.py3
-rw-r--r--indoteknik_custom/models/bill_receipt.py123
-rwxr-xr-xindoteknik_custom/security/ir.model.access.csv2
-rw-r--r--indoteknik_custom/views/bill_receipt.xml113
-rw-r--r--indoteknik_custom/views/ir_sequence.xml10
-rwxr-xr-xindoteknik_custom/views/purchase_order.xml1
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"/>