summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xindoteknik_custom/__manifest__.py1
-rwxr-xr-xindoteknik_custom/models/__init__.py1
-rw-r--r--indoteknik_custom/models/approval_invoice_date.py46
-rw-r--r--indoteknik_custom/models/stock_picking.py40
-rwxr-xr-xindoteknik_custom/security/ir.model.access.csv1
-rw-r--r--indoteknik_custom/views/approval_invoice_date.xml92
-rw-r--r--indoteknik_custom/views/ir_sequence.xml10
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>