diff options
| author | IT Fixcomart <it@fixcomart.co.id> | 2023-07-15 06:18:06 +0000 |
|---|---|---|
| committer | IT Fixcomart <it@fixcomart.co.id> | 2023-07-15 06:18:06 +0000 |
| commit | 884524fc6d8edebb0a4cbcb03c3038bdb46b45c5 (patch) | |
| tree | 863e5c637ea589771859072c350f3c63b3faefed | |
| parent | b496b7907c60d8b262ddba42e55dd8485f718fce (diff) | |
| parent | 855f63e1c39ba1ff4d84360845949bc260462c83 (diff) | |
Merged in receipt-bill (pull request #52)
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/account_move.py | 4 | ||||
| -rw-r--r-- | indoteknik_custom/models/account_move_due_extension.py | 119 | ||||
| -rw-r--r-- | indoteknik_custom/models/bill_receipt.py | 70 | ||||
| -rw-r--r-- | indoteknik_custom/models/res_partner.py | 8 | ||||
| -rwxr-xr-x | indoteknik_custom/models/sale_order.py | 43 | ||||
| -rwxr-xr-x | indoteknik_custom/security/ir.model.access.csv | 2 | ||||
| -rw-r--r-- | indoteknik_custom/views/account_move.xml | 12 | ||||
| -rw-r--r-- | indoteknik_custom/views/account_move_views.xml | 2 | ||||
| -rw-r--r-- | indoteknik_custom/views/bill_receipt.xml | 76 | ||||
| -rw-r--r-- | indoteknik_custom/views/ir_sequence.xml | 10 |
12 files changed, 262 insertions, 88 deletions
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/account_move.py b/indoteknik_custom/models/account_move.py index c2e93632..99439915 100644 --- a/indoteknik_custom/models/account_move.py +++ b/indoteknik_custom/models/account_move.py @@ -13,6 +13,8 @@ class AccountMove(models.Model): 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') + due_extension = fields.Integer(string='Due Extension', default=0) + new_due_date = fields.Date(string='New Due') def unlink(self): res = super(AccountMove, self).unlink() @@ -70,6 +72,8 @@ class AccountMove(models.Model): invoice_day_to_due = 0 if invoice.payment_state not in ['paid', 'in_payment', 'reversed'] and invoice.invoice_date_due: invoice_day_to_due = invoice.invoice_date_due - date.today() + if invoice.new_due_date: + invoice_day_to_due = invoice.new_due_date - date.today() invoice_day_to_due = invoice_day_to_due.days invoice.invoice_day_to_due = invoice_day_to_due diff --git a/indoteknik_custom/models/account_move_due_extension.py b/indoteknik_custom/models/account_move_due_extension.py index 1e3bdad1..27c8577d 100644 --- a/indoteknik_custom/models/account_move_due_extension.py +++ b/indoteknik_custom/models/account_move_due_extension.py @@ -62,72 +62,66 @@ class DueExtension(models.Model): raise UserError('Hanya Finance yang bisa cancel') def approve_new_due(self): - if self.env.user.is_accounting: - if not self.approval_status == 'approved': - self.is_approve = True - self.approval_status = 'approved' + if not self.env.user.is_accounting: + raise UserError('Hanya Finance Yang Bisa Approve') + + if self.approval_status == 'approved': + raise UserError('Document ini sudah di approve') + + self.is_approve = True + self.approval_status = 'approved' - self.partner_id.counter+=1 + self.partner_id.counter+=1 - if self.partner_id: - if self.day_extension: - day_extension = int(self.day_extension) - new_due = date.today() + timedelta(days=day_extension) - - for line in self.due_line: - line.invoice_id.invoice_date_due = new_due - - if self.order_id._notification_margin_leader(): - self.order_id.approval_status = 'pengajuan2' - return self.order_id._notification_has_margin_leader() + day_extension = int(self.day_extension) + if self.partner_id: + new_due = date.today() + timedelta(days=day_extension) + + for line in self.due_line: + line.invoice_id.new_due_date = new_due + line.invoice_id.due_extension = day_extension + + if self.order_id._notification_margin_leader(): + self.order_id.approval_status = 'pengajuan2' + return self.order_id._notification_has_margin_leader() - if self.order_id._notification_margin_manager(): - self.order_id.approval_status = 'pengajuan1' - return self.order_id._notification_has_margin_manager() - - sales = self.env['sale.order'].search([ - ('id', '=', self.order_id.id) - ]) - - # sales.state = 'sale' - sales.action_confirm() - self.order_id.due_id = self.id - else: - raise UserError('Document ini sudah di approve') - else: - raise UserError('Hanya Finance Yang Bisa Approve') + if self.order_id._notification_margin_manager(): + self.order_id.approval_status = 'pengajuan1' + return self.order_id._notification_has_margin_manager() + + sales = self.env['sale.order'].browse(self.order_id.id) + + sales.action_confirm() + self.order_id.due_id = self.id def generate_due_line(self): - partners = [] - partners += self.partner_id.child_ids - partners.append(self.partner_id) - + partners = self.partner_id.get_child_ids() - for partner in partners: - query = [ - ('partner_id', '=', partner.id), - ('state', '=', 'posted'), - ('move_type', '=', 'out_invoice'), - ('amount_residual_signed', '>', 0) - ] - invoices = self.env['account.move'].search(query, order='invoice_date') - count = 0 - - for invoice in invoices: - if invoice.invoice_day_to_due < 0: - self.env['due.extension.line'].create([{ - 'due_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("Due Extension Line generated %s" % count) + query = [ + ('partner_id', 'in', partners), + ('state', '=', 'posted'), + ('move_type', '=', 'out_invoice'), + ('amount_residual_signed', '>', 0) + ] + invoices = self.env['account.move'].search(query, order='invoice_date') + count = 0 + + for invoice in invoices: + day_to_due = invoice.invoice_day_to_due + invoice.due_extension + if day_to_due < 0: + self.env['due.extension.line'].create([{ + 'due_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 + }]) + count += 1 + _logger.info("Due Extension Line generated %s" % count) + def unlink(self): res = super(DueExtension, self).unlink() if not self._name == 'due.extension': @@ -157,5 +151,8 @@ class DueExtensionLine(models.Model): def _compute_due_date(self): for line in self: - line.due_date = line.invoice_id.invoice_date_due + if line.invoice_id.new_due_date: + line.due_date = line.invoice_id.new_due_date + else: + line.due_date = line.invoice_id.invoice_date_due 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/models/res_partner.py b/indoteknik_custom/models/res_partner.py index 5dec8da8..1695639d 100644 --- a/indoteknik_custom/models/res_partner.py +++ b/indoteknik_custom/models/res_partner.py @@ -20,6 +20,14 @@ class ResPartner(models.Model): sppkp = fields.Char(string="SPPKP") counter = fields.Integer(string="Counter", default=0) + def get_child_ids(self): + partner = self.env['res.partner'].search([('id', '=', self.id)], limit=1) + partner_child_ids = [x['id'] for x in partner.child_ids] + [partner.id] + if partner.parent_id: + partner_child_ids += [x['id'] for x in partner.parent_id.child_ids] + partner_child_ids += [partner.parent_id.id] + return partner_child_ids + def unlink(self): if self._name == 'res.partner': raise UserError('Maaf anda tidak bisa delete contact') diff --git a/indoteknik_custom/models/sale_order.py b/indoteknik_custom/models/sale_order.py index e54b9ae2..3d0dfc17 100755 --- a/indoteknik_custom/models/sale_order.py +++ b/indoteknik_custom/models/sale_order.py @@ -8,6 +8,7 @@ import string import requests import math import json +from datetime import timedelta, date _logger = logging.getLogger(__name__) @@ -390,26 +391,28 @@ class SaleOrder(models.Model): if self.due_id and self.due_id.is_approve == False: raise UserError('Document Over Due Yang Anda Buat Belum Di Approve') - if not self.env.user.is_leader and not self.env.user.is_sales_manager: - query = [ - ('partner_id', '=', parent_id), - ('state', '=', 'posted'), - ('move_type', '=', 'out_invoice'), - ('amount_residual_signed', '>', 0) - ] - invoices = self.env['account.move'].search(query, order='invoice_date') - due_extension = self.env['due.extension'].create([{ - 'partner_id': parent_id, - 'day_extension': '3', - 'order_id': self.id, - }]) - due_extension.generate_due_line() - self.due_id = due_extension.id - if len(self.due_id.due_line) > 0: - return True - else: - due_extension.unlink() - return False + query = [ + ('partner_id', '=', parent_id), + ('state', '=', 'posted'), + ('move_type', '=', 'out_invoice'), + ('amount_residual_signed', '>', 0) + ] + invoices = self.env['account.move'].search(query, order='invoice_date') + + if invoices: + if not self.env.user.is_leader and not self.env.user.is_sales_manager: + due_extension = self.env['due.extension'].create([{ + 'partner_id': parent_id, + 'day_extension': '3', + 'order_id': self.id, + }]) + due_extension.generate_due_line() + self.due_id = due_extension.id + if len(self.due_id.due_line) > 0: + return True + else: + due_extension.unlink() + return False def _notification_margin_leader(self): if self.total_percent_margin <= 15 and not self.env.user.is_leader: 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/account_move.xml b/indoteknik_custom/views/account_move.xml index 9faf3149..7f7fb228 100644 --- a/indoteknik_custom/views/account_move.xml +++ b/indoteknik_custom/views/account_move.xml @@ -15,6 +15,7 @@ <field name="shipper_faktur_id"/> <field name="resi_tukar_faktur"/> <field name="date_terima_tukar_faktur"/> + <field name="due_extension"/> </field> </field> </record> @@ -30,13 +31,14 @@ </field> <field name="invoice_date_due" position="after"> <field name="invoice_day_to_due" attrs="{'invisible': [['payment_state', 'in', ('paid', 'in_payment', 'reversed')]]}"/> + <field name="due_extension" optional="hide"/> </field> <field name="payment_state" position="after"> - <field name="invoice_payment_term_id"/> - <field name="date_kirim_tukar_faktur"/> - <field name="shipper_faktur_id" optional="1"/> - <field name="resi_tukar_faktur" optional="1"/> - <field name="date_terima_tukar_faktur"/> + <field name="invoice_payment_term_id" optional="hide"/> + <field name="date_kirim_tukar_faktur" optional="hide"/> + <field name="shipper_faktur_id" optional="hide"/> + <field name="resi_tukar_faktur" optional="hide"/> + <field name="date_terima_tukar_faktur" optional="hide"/> </field> </field> </record> diff --git a/indoteknik_custom/views/account_move_views.xml b/indoteknik_custom/views/account_move_views.xml index 983fbd5a..fee94b42 100644 --- a/indoteknik_custom/views/account_move_views.xml +++ b/indoteknik_custom/views/account_move_views.xml @@ -4,7 +4,7 @@ <field name="name">due.extension.tree</field> <field name="model">due.extension</field> <field name="arch" type="xml"> - <tree create="false"> + <tree default_order="create_date desc" create="0"> <field name="number"/> <field name="partner_id"/> <field name="day_extension"/> 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 @@ +<?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="vendor_id"/> + <field name="document_date"/> + <field name="description"/> + <field name="validated"/> + </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="validate_button" + string="Validate" + type="object" + /> + <button name="cancel_button" + string="Cancel" + type="object" + /> + </header> + <sheet> + <group> + <group> + <field name="vendor_id" attrs="{'readonly': [('validated', '=', True)]}"/> + <field name="document_date" attrs="{'readonly': [('validated', '=', True)]}"/> + <field name="description" attrs="{'readonly': [('validated', '=', True)]}"/> + </group> + <group> + <field name="validated" readonly="1"/> + </group> + </group> + <notebook> + <page string="Bill Line" name="bill_line"> + <field name="bill_line" attrs="{'readonly': [('validated', '=', True)]}"> + <tree editable="bottom"> + <field name="po_id"/> + <field name="sale_order_id"/> + <field name="user_id"/> + <field name="payment_term_id"/> + <field name="amount_total"/> + <field name="reference"/> + </tree> + </field> + </page> + </notebook> + </sheet> + </form> + </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="view_mode">tree,form</field> + </record> + + <menuitem + id="menu_bill_receipt" + name="Bill Line" + parent="sale.product_menu_catalog" + sequence="4" + 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> |
