diff options
| author | Azka Nathan <darizkyfaz@gmail.com> | 2025-04-21 15:06:14 +0700 |
|---|---|---|
| committer | Azka Nathan <darizkyfaz@gmail.com> | 2025-04-21 15:06:14 +0700 |
| commit | cd51ac345b0898034428aab3b8ded24d03c0fdfd (patch) | |
| tree | 751f186080b57d1b8a73beef0096622a5d906bb8 | |
| parent | dd776fedab7a86f5c031f9cdd76bf2084e894f21 (diff) | |
approval invoice date
| -rwxr-xr-x | indoteknik_custom/__manifest__.py | 1 | ||||
| -rwxr-xr-x | indoteknik_custom/models/__init__.py | 1 | ||||
| -rw-r--r-- | indoteknik_custom/models/approval_invoice_date.py | 46 | ||||
| -rw-r--r-- | indoteknik_custom/models/stock_picking.py | 40 | ||||
| -rwxr-xr-x | indoteknik_custom/security/ir.model.access.csv | 1 | ||||
| -rw-r--r-- | indoteknik_custom/views/approval_invoice_date.xml | 92 | ||||
| -rw-r--r-- | indoteknik_custom/views/ir_sequence.xml | 10 |
7 files changed, 190 insertions, 1 deletions
diff --git a/indoteknik_custom/__manifest__.py b/indoteknik_custom/__manifest__.py index a7096346..8272efc4 100755 --- a/indoteknik_custom/__manifest__.py +++ b/indoteknik_custom/__manifest__.py @@ -143,6 +143,7 @@ 'views/sale_order_multi_uangmuka_penjualan.xml', 'views/shipment_group.xml', 'views/approval_date_doc.xml', + 'views/approval_invoice_date.xml', 'views/partner_payment_term.xml', 'views/vendor_payment_term.xml', 'views/approval_unreserve.xml', diff --git a/indoteknik_custom/models/__init__.py b/indoteknik_custom/models/__init__.py index 935a0aa0..08fa9803 100755 --- a/indoteknik_custom/models/__init__.py +++ b/indoteknik_custom/models/__init__.py @@ -149,3 +149,4 @@ from . import sales_order_koli from . import stock_backorder_confirmation from . import account_payment_register from . import stock_inventory +from . import approval_invoice_date diff --git a/indoteknik_custom/models/approval_invoice_date.py b/indoteknik_custom/models/approval_invoice_date.py new file mode 100644 index 00000000..48546e55 --- /dev/null +++ b/indoteknik_custom/models/approval_invoice_date.py @@ -0,0 +1,46 @@ +from odoo import models, api, fields +from odoo.exceptions import AccessError, UserError, ValidationError +from datetime import timedelta, date, datetime +import logging + +_logger = logging.getLogger(__name__) + +class ApprovalInvoiceDate(models.Model): + _name = "approval.invoice.date" + _description = "Approval Invoice Date" + _rec_name = 'number' + + picking_id = fields.Many2one('stock.picking', string='Picking') + number = fields.Char(string='Document No', index=True, copy=False, readonly=True, tracking=True) + date_invoice = fields.Datetime( + string='Invoice Date', + copy=False + ) + date_doc_do = fields.Datetime( + string='Tanggal Kirim di SJ', + copy=False + ) + state = fields.Selection([('draft', 'Draft'), ('done', 'Done'), ('cancel', 'Cancel')], string='State', default='draft', tracking=True) + approve_date = fields.Datetime(string='Approve Date', copy=False) + approve_by = fields.Many2one('res.users', string='Approve By', copy=False) + sale_id = fields.Many2one('sale.order', string='Sale Order') + partner_id = fields.Many2one('res.partner', string='Partner') + move_id = fields.Many2one('account.move', string='Invoice') + note = fields.Char(string='Note') + + def button_approve(self): + if not self.env.user.is_accounting: + raise UserError("Hanya Accounting Yang Bisa Approve") + self.move_id.invoice_date = self.date_doc_do + self.state = 'done' + self.approve_date = datetime.utcnow() + self.approve_by = self.env.user.id + + def button_cancel(self): + self.state = 'cancel' + + @api.model + def create(self, vals): + vals['number'] = self.env['ir.sequence'].next_by_code('approval.invoice.date') or '0' + result = super(ApprovalInvoiceDate, self).create(vals) + return result diff --git a/indoteknik_custom/models/stock_picking.py b/indoteknik_custom/models/stock_picking.py index 923c56f5..0701a989 100644 --- a/indoteknik_custom/models/stock_picking.py +++ b/indoteknik_custom/models/stock_picking.py @@ -248,11 +248,40 @@ class StockPicking(models.Model): final_seq = fields.Float(string='Remaining Time') shipping_method_so_id = fields.Many2one('delivery.carrier', string='Shipping Method SO', related='sale_id.carrier_id') state_packing = fields.Selection([('not_packing', 'Belum Packing'), ('packing_done', 'Sudah Packing')], string='Packing Status') + approval_invoice_date_id = fields.Many2one('approval.invoice.date', string='Approval Invoice Date') @api.constrains('date_doc_kirim') def _constrains_date_doc_kirim(self): for rec in self: rec.calculate_line_no() + + invoice = self.env['account.move'].search([('sale_id', '=', rec.sale_id.id)], limit=1, order='create_date desc') + + if invoice: + if rec.date_doc_kirim != invoice.invoice_date: + get_approval_invoice_date = self.env['approval.invoice.date'].search([('picking_id', '=', rec.id),('state', '=', 'draft')], limit=1) + + if get_approval_invoice_date and get_approval_invoice_date.state == 'draft': + get_approval_invoice_date.date_doc_do = rec.date_doc_kirim + else: + approval_invoice_date = self.env['approval.invoice.date'].create({ + 'picking_id': rec.id, + 'date_invoice': invoice.invoice_date, + 'date_doc_do': rec.date_doc_kirim, + 'sale_id': rec.sale_id.id, + 'move_id': invoice.id, + 'partner_id': rec.partner_id.id + }) + + rec.approval_invoice_date_id = approval_invoice_date.id + + if approval_invoice_date: + return { + 'type': 'ir.actions.client', + 'tag': 'display_notification', + 'params': { 'title': 'Notification', 'message': 'Invoice Date Tidak Sesuai, Document Approval Invoice Date Terbuat', 'next': {'type': 'ir.actions.act_window_close'} }, + } + @api.constrains('scan_koli_lines') def _constrains_scan_koli_lines(self): @@ -1002,6 +1031,8 @@ class StockPicking(models.Model): raise UserError('Hanya MD yang bisa Approve') def button_validate(self): + self.check_invoice_date() + threshold_datetime = waktu(2025, 4, 11, 6, 26) group_id = self.env.ref('indoteknik_custom.group_role_merchandiser').id users_in_group = self.env['res.users'].search([('groups_id', 'in', [group_id])]) active_model = self.env.context.get('active_model') @@ -1013,7 +1044,6 @@ class StockPicking(models.Model): if self.location_id.id == 47 and self.env.user.id in users_in_group.mapped('id'): self.state_approve_md = 'done' - threshold_datetime = waktu(2025, 4, 11, 6, 26) if (len(self.konfirm_koli_lines) == 0 and 'BU/OUT/' in self.name @@ -1129,6 +1159,14 @@ class StockPicking(models.Model): self.send_mail_bills() return res + def check_invoice_date(self): + for picking in self: + invoice = self.env['account.move'].search([('sale_id', '=', picking.sale_id.id)]) + + if invoice: + if picking.date_doc_kirim.date() != invoice.invoice_date: + raise UserError("Tanggal Kirim tidak sesuai dengan Invoice") + def set_picking_code_out(self): for picking in self: # Check if picking meets criteria diff --git a/indoteknik_custom/security/ir.model.access.csv b/indoteknik_custom/security/ir.model.access.csv index 098fe49c..30088680 100755 --- a/indoteknik_custom/security/ir.model.access.csv +++ b/indoteknik_custom/security/ir.model.access.csv @@ -138,6 +138,7 @@ access_shipment_group,access.shipment.group,model_shipment_group,,1,1,1,1 access_shipment_group_line,access.shipment.group.line,model_shipment_group_line,,1,1,1,1 access_sales_order_reject,access.sales.order.reject,model_sales_order_reject,,1,1,1,1 access_approval_date_doc,access.approval.date.doc,model_approval_date_doc,,1,1,1,1 +access_approval_invoice_date,access.approval.invoice.date,model_approval_invoice_date,,1,1,1,1 access_account_tax,access.account.tax,model_account_tax,,1,1,1,1 access_approval_unreserve,access.approval.unreserve,model_approval_unreserve,,1,1,1,1 access_approval_unreserve_line,access.approval.unreserve.line,model_approval_unreserve_line,,1,1,1,1 diff --git a/indoteknik_custom/views/approval_invoice_date.xml b/indoteknik_custom/views/approval_invoice_date.xml new file mode 100644 index 00000000..31f346e7 --- /dev/null +++ b/indoteknik_custom/views/approval_invoice_date.xml @@ -0,0 +1,92 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<odoo> + <record id="approval_invoice_date_tree" model="ir.ui.view"> + <field name="name">approval.invoice.date.tree</field> + <field name="model">approval.invoice.date</field> + <field name="arch" type="xml"> + <tree> + <field name="number"/> + <field name="picking_id"/> + <field name="partner_id"/> + <field name="sale_id"/> + <field name="date_doc_do"/> + <field name="date_invoice"/> + <field name="state" widget="badge" decoration-danger="state == 'cancel'" + decoration-success="state == 'done'" + decoration-info="state == 'draft'"/> + <field name="approve_date"/> + <field name="approve_by"/> + <field name="create_uid"/> + </tree> + </field> + </record> + + <record id="approval_invoice_date_form" model="ir.ui.view"> + <field name="name">approval.invoice.date.form</field> + <field name="model">approval.invoice.date</field> + <field name="arch" type="xml"> + <form> + <header> + <button name="button_approve" + string="Approve" + type="object" + attrs="{'invisible': [('state', '=', 'done')]}" + /> + <button name="button_cancel" + string="Cancel" + type="object" + attrs="{'invisible': [('state', '=', 'cancel')]}" + /> + <field name="state" widget="statusbar" + statusbar_visible="draft,cancel,done" + statusbar_colors='{"cancel":"red", "done":"green"}'/> + </header> + <sheet string="Approval Invoice Date"> + <group> + <group> + <field name="number"/> + <field name="picking_id"/> + <field name="partner_id"/> + <field name="sale_id"/> + <field name="move_id"/> + <field name="date_doc_do"/> + <field name="date_invoice"/> + <field name="approve_date"/> + <field name="approve_by"/> + <field name="create_uid"/> + <field name="note" attrs="{'invisible': [('state', '!=', 'cancel')]}"/> + </group> + </group> + </sheet> + </form> + </field> + </record> + + <record id="view_approval_invoice_date_filter" model="ir.ui.view"> + <field name="name">approval.invoice.date.list.select</field> + <field name="model">approval.invoice.date</field> + <field name="priority" eval="15"/> + <field name="arch" type="xml"> + <search string="Search Approval Invoice Date"> + <field name="number"/> + <field name="partner_id"/> + <field name="picking_id"/> + <field name="sale_id"/> + </search> + </field> + </record> + + <record id="approval_invoice_date_action" model="ir.actions.act_window"> + <field name="name">Approval Invoice Date</field> + <field name="type">ir.actions.act_window</field> + <field name="res_model">approval.invoice.date</field> + <field name="view_mode">tree,form</field> + </record> + + <menuitem id="menu_approval_invoice_date" name="Approval Invoice Date" + parent="account.menu_finance_receivables" + action="approval_invoice_date_action" + sequence="100" + /> + +</odoo>
\ No newline at end of file diff --git a/indoteknik_custom/views/ir_sequence.xml b/indoteknik_custom/views/ir_sequence.xml index dfb56100..9f980751 100644 --- a/indoteknik_custom/views/ir_sequence.xml +++ b/indoteknik_custom/views/ir_sequence.xml @@ -21,6 +21,16 @@ <field name="number_increment">1</field> </record> + <record id="sequence_invoice_date" model="ir.sequence"> + <field name="name">Approval Invoice Date</field> + <field name="code">approval.invoice.date</field> + <field name="active">TRUE</field> + <field name="prefix">AID/%(year)s/</field> + <field name="padding">5</field> + <field name="number_next">1</field> + <field name="number_increment">1</field> + </record> + <record id="sequence_vendor_approval" model="ir.sequence"> <field name="name">Vendor Approval</field> <field name="code">vendor.approval</field> |
