From 983fa2ec6b13f4005f4e27e7b7860503c4823f8e Mon Sep 17 00:00:00 2001 From: FIN-IT_AndriFP Date: Wed, 4 Feb 2026 15:45:56 +0700 Subject: on confirm --- indoteknik_custom/models/purchase_order.py | 14 +++++++------- indoteknik_custom/views/advance_payment_request.xml | 1 + 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/indoteknik_custom/models/purchase_order.py b/indoteknik_custom/models/purchase_order.py index 6c3e4185..a066d90b 100755 --- a/indoteknik_custom/models/purchase_order.py +++ b/indoteknik_custom/models/purchase_order.py @@ -1080,13 +1080,13 @@ class PurchaseOrder(models.Model): ) % order.name) def button_confirm(self): - # if self.env.user.id != 7 and not self.env.user.is_leader: # Pimpinan - # if '/PJ/' in self.name: - # price_change_detected = any(line.price_unit_before for line in self.order_line) - # if price_change_detected: - # if self.order_sales_match_line: - # if self.total_percent_margin <= 15.0: - # raise UserError("Approval Pimpinan diperlukan jika terdapat perubahan Unit Price pada PO Line dan Memiliki Margin <= 15%") + if self.env.user.id != 7 and not self.env.user.is_leader: # Pimpinan + if '/PJ/' in self.name: + price_change_detected = any(line.price_unit_before for line in self.order_line) + if price_change_detected: + if self.order_sales_match_line: + if self.total_percent_margin <= 25.0: + raise UserError("Approval Pimpinan diperlukan jika terdapat perubahan Unit Price pada PO Line dan Memiliki Margin <= 15%") self._check_assets_note() # self._check_payment_term() # check payment term diff --git a/indoteknik_custom/views/advance_payment_request.xml b/indoteknik_custom/views/advance_payment_request.xml index 7f422aa9..340e0caf 100644 --- a/indoteknik_custom/views/advance_payment_request.xml +++ b/indoteknik_custom/views/advance_payment_request.xml @@ -236,6 +236,7 @@ + -- cgit v1.2.3 From 26713fca51335e68f737c171b8de918c8192ea8d Mon Sep 17 00:00:00 2001 From: FIN-IT_AndriFP Date: Wed, 4 Feb 2026 15:55:21 +0700 Subject: fix --- indoteknik_custom/models/purchase_order.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indoteknik_custom/models/purchase_order.py b/indoteknik_custom/models/purchase_order.py index a066d90b..b3ecca56 100755 --- a/indoteknik_custom/models/purchase_order.py +++ b/indoteknik_custom/models/purchase_order.py @@ -1085,7 +1085,7 @@ class PurchaseOrder(models.Model): price_change_detected = any(line.price_unit_before for line in self.order_line) if price_change_detected: if self.order_sales_match_line: - if self.total_percent_margin <= 25.0: + if self.total_percent_margin <= 15.0: raise UserError("Approval Pimpinan diperlukan jika terdapat perubahan Unit Price pada PO Line dan Memiliki Margin <= 15%") self._check_assets_note() -- cgit v1.2.3 From 250c5d6ba209c80e909d0194218d08422d2daaa6 Mon Sep 17 00:00:00 2001 From: FIN-IT_AndriFP Date: Thu, 5 Feb 2026 15:18:10 +0700 Subject: fix duplicate --- indoteknik_custom/models/sale_order.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indoteknik_custom/models/sale_order.py b/indoteknik_custom/models/sale_order.py index a4bc2309..49e36279 100755 --- a/indoteknik_custom/models/sale_order.py +++ b/indoteknik_custom/models/sale_order.py @@ -2316,7 +2316,7 @@ class SaleOrder(models.Model): for order in self: for line in order.order_line: search_product = self.env['sale.order.line'].search( - [('product_id', '=', line.product_id.id), ('order_id', '=', order.id)]) + [('product_id', '=', line.product_id.id), ('order_id', '=', order.id), ('display_type', '=', False)]) if len(search_product) > 1: raise UserError("Terdapat DUPLIKASI data pada Product {}".format(line.product_id.display_name)) -- cgit v1.2.3 From 6ec6a23399f026de17974f39fd3e325d27093199 Mon Sep 17 00:00:00 2001 From: FIN-IT_AndriFP Date: Fri, 6 Feb 2026 09:31:55 +0700 Subject: add filter search tukar guling --- indoteknik_custom/views/tukar_guling.xml | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/indoteknik_custom/views/tukar_guling.xml b/indoteknik_custom/views/tukar_guling.xml index 8cfb5680..7865b43d 100644 --- a/indoteknik_custom/views/tukar_guling.xml +++ b/indoteknik_custom/views/tukar_guling.xml @@ -133,5 +133,28 @@ + + tukar.guling.filter + tukar.guling + + + + + + + + + + + + + + + + + + + + -- cgit v1.2.3 From 9a769c9d9fe2a561c0b3c4bed3e1f9ad6822639e Mon Sep 17 00:00:00 2001 From: FIN-IT_AndriFP Date: Fri, 6 Feb 2026 09:36:24 +0700 Subject: fix search tukar guling --- indoteknik_custom/views/tukar_guling.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/indoteknik_custom/views/tukar_guling.xml b/indoteknik_custom/views/tukar_guling.xml index 7865b43d..609dea15 100644 --- a/indoteknik_custom/views/tukar_guling.xml +++ b/indoteknik_custom/views/tukar_guling.xml @@ -141,10 +141,11 @@ + - + -- cgit v1.2.3 From a0988c45dba1451dc5a670eb6a378527de1390ec Mon Sep 17 00:00:00 2001 From: FIN-IT_AndriFP Date: Fri, 6 Feb 2026 10:28:11 +0700 Subject: show create date Approval date doc --- indoteknik_custom/views/approval_date_doc.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/indoteknik_custom/views/approval_date_doc.xml b/indoteknik_custom/views/approval_date_doc.xml index 3d597aa8..a3aae3b4 100644 --- a/indoteknik_custom/views/approval_date_doc.xml +++ b/indoteknik_custom/views/approval_date_doc.xml @@ -14,6 +14,7 @@ + @@ -46,6 +47,7 @@ + -- cgit v1.2.3 From c37c440f117cbb5f227096c1fceb74b2809349ee Mon Sep 17 00:00:00 2001 From: Mqdd Date: Tue, 10 Feb 2026 08:55:36 +0700 Subject: approval adjust out --- indoteknik_custom/models/stock_inventory.py | 29 +++++++++++++++++++++++++++-- indoteknik_custom/views/stock_inventory.xml | 5 +++++ 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/indoteknik_custom/models/stock_inventory.py b/indoteknik_custom/models/stock_inventory.py index 84eb5a17..c4ebaeda 100644 --- a/indoteknik_custom/models/stock_inventory.py +++ b/indoteknik_custom/models/stock_inventory.py @@ -16,6 +16,12 @@ class StockInventory(models.Model): ('in', 'Adjusment In'), ('out', 'Adjusment Out'), ], string='Adjusments Type', required=True) + approval_state = fields.Selection([ + ('draft', 'Draft'), + ('logistic', 'Logistic'), + ('accounting', 'Accounting'), + ('approved', 'Approved'), + ], default='draft', tracking=True) def _generate_number_stock_inventory(self): """Men-generate nomor untuk semua stock inventory yang belum memiliki number.""" @@ -53,8 +59,11 @@ class StockInventory(models.Model): return "00001" # Jika belum ada data, mulai dari 00001 def action_start(self): - if self.env.user.id not in [21, 17, 571, 28]: - raise UserError("Hanya Rafly, Denise, Iqmal, dan Stephan yang bisa start inventory") + if self.approval_state != 'approved' and self.adjusment_type == 'out': + raise UserError('Harus melalui proses approval') + if self.adjusment_type == 'in': + if self.env.user.id not in [21, 17, 571, 28]: + raise UserError("Hanya Rafly, Denise, Iqmal, dan Stephan yang bisa start inventory") return super(StockInventory, self).action_start() @api.model @@ -69,6 +78,22 @@ class StockInventory(models.Model): self._assign_number(order) # Generate number setelah save return order + + def action_approve(self): + if self.adjusment_type == 'out': + for rec in self: + if self.approval_state in [False, '', 'draft']: + self.approval_state = 'logistic' + elif self.approval_state == 'logistic': + if not rec.env.user.has_group('indoteknik_custom.group_role_logistic'): + raise UserError("Harus diapprove logistic") + self.approval_state = 'accounting' + elif self.approval_state == 'accounting': + if not rec.env.user.has_group('indoteknik_custom.group_role_fat'): + raise UserError("Harus diapprove accounting") + self.approval_state = 'approved' + else: + raise UserError("Sudah Approved") def write(self, vals): """Jika adjusment_type diubah, generate ulang nomor.""" diff --git a/indoteknik_custom/views/stock_inventory.xml b/indoteknik_custom/views/stock_inventory.xml index db85f05c..ebbc5bb3 100644 --- a/indoteknik_custom/views/stock_inventory.xml +++ b/indoteknik_custom/views/stock_inventory.xml @@ -6,9 +6,14 @@ stock.inventory +
+
+
-- cgit v1.2.3 From b04fb88af7e868a32af5ffbe4b5f5e97a5da4878 Mon Sep 17 00:00:00 2001 From: Mqdd Date: Tue, 10 Feb 2026 09:15:30 +0700 Subject: hide approval state for adjust in --- indoteknik_custom/views/stock_inventory.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indoteknik_custom/views/stock_inventory.xml b/indoteknik_custom/views/stock_inventory.xml index ebbc5bb3..df747830 100644 --- a/indoteknik_custom/views/stock_inventory.xml +++ b/indoteknik_custom/views/stock_inventory.xml @@ -13,7 +13,7 @@ - +
-- cgit v1.2.3 From 2def9515d57eb3128cad31c8b97901055e4e0523 Mon Sep 17 00:00:00 2001 From: Mqdd Date: Tue, 10 Feb 2026 15:42:21 +0700 Subject: fix approval flow stock inventory --- indoteknik_custom/models/stock_inventory.py | 13 +++++-------- indoteknik_custom/views/stock_inventory.xml | 1 + 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/indoteknik_custom/models/stock_inventory.py b/indoteknik_custom/models/stock_inventory.py index c4ebaeda..cb7d3773 100644 --- a/indoteknik_custom/models/stock_inventory.py +++ b/indoteknik_custom/models/stock_inventory.py @@ -17,11 +17,10 @@ class StockInventory(models.Model): ('out', 'Adjusment Out'), ], string='Adjusments Type', required=True) approval_state = fields.Selection([ - ('draft', 'Draft'), ('logistic', 'Logistic'), ('accounting', 'Accounting'), ('approved', 'Approved'), - ], default='draft', tracking=True) + ], default='logistic', tracking=True) def _generate_number_stock_inventory(self): """Men-generate nomor untuk semua stock inventory yang belum memiliki number.""" @@ -82,16 +81,14 @@ class StockInventory(models.Model): def action_approve(self): if self.adjusment_type == 'out': for rec in self: - if self.approval_state in [False, '', 'draft']: - self.approval_state = 'logistic' - elif self.approval_state == 'logistic': + if rec.approval_state == 'logistic': if not rec.env.user.has_group('indoteknik_custom.group_role_logistic'): raise UserError("Harus diapprove logistic") - self.approval_state = 'accounting' - elif self.approval_state == 'accounting': + rec.approval_state = 'accounting' + elif rec.approval_state == 'accounting': if not rec.env.user.has_group('indoteknik_custom.group_role_fat'): raise UserError("Harus diapprove accounting") - self.approval_state = 'approved' + rec.approval_state = 'approved' else: raise UserError("Sudah Approved") diff --git a/indoteknik_custom/views/stock_inventory.xml b/indoteknik_custom/views/stock_inventory.xml index df747830..89c058ea 100644 --- a/indoteknik_custom/views/stock_inventory.xml +++ b/indoteknik_custom/views/stock_inventory.xml @@ -26,6 +26,7 @@ + -- cgit v1.2.3 From 30ccd81fe087eec277da6875b1df9d9a3579ab77 Mon Sep 17 00:00:00 2001 From: FIN-IT_AndriFP Date: Tue, 10 Feb 2026 16:35:53 +0700 Subject: (andri) add report internal PO --- indoteknik_custom/__manifest__.py | 1 + .../report/purchase_report_internal.xml | 201 +++++++++++++++++++++ 2 files changed, 202 insertions(+) create mode 100644 indoteknik_custom/report/purchase_report_internal.xml diff --git a/indoteknik_custom/__manifest__.py b/indoteknik_custom/__manifest__.py index 66962a24..61eef35b 100755 --- a/indoteknik_custom/__manifest__.py +++ b/indoteknik_custom/__manifest__.py @@ -169,6 +169,7 @@ 'report/report_surat_piutang.xml', 'report/report_tutup_tempo.xml', 'report/purchase_report.xml', + 'report/purchase_report_internal.xml', 'views/vendor_sla.xml', 'views/coretax_faktur.xml', 'views/public_holiday.xml', diff --git a/indoteknik_custom/report/purchase_report_internal.xml b/indoteknik_custom/report/purchase_report_internal.xml new file mode 100644 index 00000000..09fb81f3 --- /dev/null +++ b/indoteknik_custom/report/purchase_report_internal.xml @@ -0,0 +1,201 @@ + + + + + + Purchase Order (Internal) + purchase.order + qweb-pdf + indoteknik_custom.report_purchaseorder_internal + indoteknik_custom.report_purchaseorder_internal + + ('%s - %s' % (object.name, object.partner_id.name)) + + + report + + + + + + + + + + + -- cgit v1.2.3 From 9879c06b35da5402d1df545c352bd2729722ca24 Mon Sep 17 00:00:00 2001 From: FIN-IT_AndriFP Date: Tue, 10 Feb 2026 16:38:26 +0700 Subject: foix --- indoteknik_custom/report/purchase_report_internal.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indoteknik_custom/report/purchase_report_internal.xml b/indoteknik_custom/report/purchase_report_internal.xml index 09fb81f3..7df847de 100644 --- a/indoteknik_custom/report/purchase_report_internal.xml +++ b/indoteknik_custom/report/purchase_report_internal.xml @@ -172,7 +172,7 @@ - Margin % + Margin PO % -- cgit v1.2.3 From 506f561cbebcc4677b37aaba52493eb174bcfd30 Mon Sep 17 00:00:00 2001 From: FIN-IT_AndriFP Date: Tue, 10 Feb 2026 19:50:16 +0700 Subject: (andri) add automatic send efaktur for special cust --- indoteknik_custom/models/account_move.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/indoteknik_custom/models/account_move.py b/indoteknik_custom/models/account_move.py index e1360cfa..42467b78 100644 --- a/indoteknik_custom/models/account_move.py +++ b/indoteknik_custom/models/account_move.py @@ -587,6 +587,10 @@ class AccountMove(models.Model): records = self.search([('id', 'in', self.ids)]) template = self.env.ref('indoteknik_custom.mail_template_efaktur_document') + ICP = self.env['ir.config_parameter'].sudo() + special_partner_ids = set( + int(x) for x in (ICP.get_param('efaktur.special_partner_ids') or '').split(',') if x + ) for record in records: if record.invoice_payment_term_id.id == 26: @@ -595,6 +599,18 @@ class AccountMove(models.Model): 'attachment_ids': [(4, attachment.id)] } template.send_mail(record.id, email_values=email_values, force_send=True) + + elif record.partner_id.id in special_partner_ids: + attachment = self.generate_attachment(record) + email_list = [record.partner_id.email] if record.partner_id.email else [] + if record.real_invoice_id and record.real_invoice_id.email: + email_list.append(record.real_invoice_id.email) + + email_values = { + 'email_to': ",".join(set(email_list)), + 'attachment_ids': [(4, attachment.id)] + } + template.send_mail(record.id, email_values=email_values, force_send=True) # @api.model # def create(self, vals): -- cgit v1.2.3 From aded9892296ef3b4fd76b743081206eb89167857 Mon Sep 17 00:00:00 2001 From: Mqdd Date: Wed, 11 Feb 2026 12:00:56 +0700 Subject: req sgr bg denise --- indoteknik_custom/models/shipment_group.py | 24 +++++++++++++++++++++--- indoteknik_custom/models/stock_picking.py | 10 ++++++++++ indoteknik_custom/views/shipment_group.xml | 6 +++++- indoteknik_custom/views/stock_picking.xml | 1 + 4 files changed, 37 insertions(+), 4 deletions(-) diff --git a/indoteknik_custom/models/shipment_group.py b/indoteknik_custom/models/shipment_group.py index 7203b566..ce4a9fdd 100644 --- a/indoteknik_custom/models/shipment_group.py +++ b/indoteknik_custom/models/shipment_group.py @@ -2,6 +2,7 @@ from odoo import models, api, fields from odoo.exceptions import AccessError, UserError, ValidationError from datetime import timedelta, date import logging +from markupsafe import escape as html_escape _logger = logging.getLogger(__name__) @@ -16,7 +17,21 @@ class ShipmentGroup(models.Model): partner_id = fields.Many2one('res.partner', string='Customer') carrier_id = fields.Many2one('delivery.carrier', string='Ekspedisi') total_colly_line = fields.Float(string='Total Colly', compute='_compute_total_colly_line') + is_multi_partner = fields.Boolean(string='Is Multi Partner', compute='_compute_is_multi_partner') + partner_ids = fields.Many2many('res.partner', string='Customers', compute='_compute_partner_ids') + driver = fields.Many2one('res.users', string='Driver') + @api.depends('shipment_line.partner_id') + def _compute_partner_ids(self): + for rec in self: + rec.partner_ids = rec.shipment_line.mapped('partner_id').ids + + @api.depends('shipment_line.partner_id') + def _compute_is_multi_partner(self): + for rec in self: + partners = rec.shipment_line.mapped('partner_id') + rec.is_multi_partner = len(partners) > 1 + def sync_api_shipping(self): for rec in self.shipment_line: picking_names = [lines.picking_id.name for lines in self.shipment_line] @@ -97,14 +112,14 @@ class ShipmentGroupLine(models.Model): @api.onchange('picking_id') def onchange_picking_id(self): if self.picking_id: - picking = self.env['stock.picking'].browse(self.picking_id.id) + picking = self.picking_id if self.shipment_id.carrier_id and self.shipment_id.carrier_id != picking.carrier_id: raise UserError('carrier must be same as shipment group') - + if picking.total_mapping_koli == 0: raise UserError(f'Picking {picking.name} tidak memiliki mapping koli') - + self.partner_id = picking.partner_id self.shipping_paid_by = picking.sale_id.shipping_paid_by self.carrier_id = picking.carrier_id.id @@ -115,6 +130,9 @@ class ShipmentGroupLine(models.Model): self.sale_id = picking.sale_id + if self.shipment_id: + self.shipment_id._compute_is_multi_partner() + @api.model def create(self, vals): record = super(ShipmentGroupLine, self).create(vals) diff --git a/indoteknik_custom/models/stock_picking.py b/indoteknik_custom/models/stock_picking.py index 2465fa96..af3841b2 100644 --- a/indoteknik_custom/models/stock_picking.py +++ b/indoteknik_custom/models/stock_picking.py @@ -203,6 +203,16 @@ class StockPicking(models.Model): is_so_fiktif = fields.Boolean('SO Fiktif?', compute='_compute_is_so_fiktif', tracking=3) payment_term = fields.Char('Payment Term', compute='_get_partner_payment_term') is_rev_tg = fields.Boolean('Administrasi') + shipment_group_id = fields.Many2one('shipment.group', string='Shipment Group', compute='_compute_shipment_group_id') + + @api.depends('id', 'shipment_group_id') + def _compute_shipment_group_id(self): + for record in self: + shipment_line = self.env['shipment.group.line'].search([('picking_id', '=', record.id)], limit=1) + if shipment_line: + record.shipment_group_id = shipment_line.shipment_id.id + else: + record.shipment_group_id = False @api.depends('sale_id.payment_term_id') def _get_partner_payment_term(self): diff --git a/indoteknik_custom/views/shipment_group.xml b/indoteknik_custom/views/shipment_group.xml index c3f79bda..e348867c 100644 --- a/indoteknik_custom/views/shipment_group.xml +++ b/indoteknik_custom/views/shipment_group.xml @@ -7,6 +7,7 @@ + @@ -42,9 +43,12 @@ + - + + + diff --git a/indoteknik_custom/views/stock_picking.xml b/indoteknik_custom/views/stock_picking.xml index 9aa0581c..9cd63e25 100644 --- a/indoteknik_custom/views/stock_picking.xml +++ b/indoteknik_custom/views/stock_picking.xml @@ -245,6 +245,7 @@ + -- cgit v1.2.3 From bb3129b395d5399e08378ca0c2b9fd9dc5dbdb56 Mon Sep 17 00:00:00 2001 From: Mqdd Date: Wed, 11 Feb 2026 12:02:47 +0700 Subject: push --- indoteknik_custom/models/stock_picking.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indoteknik_custom/models/stock_picking.py b/indoteknik_custom/models/stock_picking.py index af3841b2..ab6d2966 100644 --- a/indoteknik_custom/models/stock_picking.py +++ b/indoteknik_custom/models/stock_picking.py @@ -205,7 +205,7 @@ class StockPicking(models.Model): is_rev_tg = fields.Boolean('Administrasi') shipment_group_id = fields.Many2one('shipment.group', string='Shipment Group', compute='_compute_shipment_group_id') - @api.depends('id', 'shipment_group_id') + @api.depends('shipment_group_id') def _compute_shipment_group_id(self): for record in self: shipment_line = self.env['shipment.group.line'].search([('picking_id', '=', record.id)], limit=1) -- cgit v1.2.3 From 6c749fd5c8deee7e38cc123b77e06b938bdcc3b3 Mon Sep 17 00:00:00 2001 From: Mqdd Date: Wed, 11 Feb 2026 17:25:00 +0700 Subject: try fix cannot validate ort --- indoteknik_custom/models/stock_picking.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/indoteknik_custom/models/stock_picking.py b/indoteknik_custom/models/stock_picking.py index ab6d2966..065b1484 100644 --- a/indoteknik_custom/models/stock_picking.py +++ b/indoteknik_custom/models/stock_picking.py @@ -1397,7 +1397,8 @@ class StockPicking(models.Model): ]) if quant: - return quant.quantity + return sum(quant.mapped('quantity')) + # return quant.quantity return 0 -- cgit v1.2.3 From 387334dc0929087ac51cc09a90d2db15d79413f1 Mon Sep 17 00:00:00 2001 From: Azka Nathan Date: Thu, 12 Feb 2026 14:18:25 +0700 Subject: automatic reconcile by GL and automatic penyusutan asset --- indoteknik_custom/__manifest__.py | 3 +- indoteknik_custom/models/__init__.py | 1 + indoteknik_custom/models/account_move_line.py | 65 +++++++++++++++++++++- .../models/update_depreciation_move_wizard.py | 48 ++++++++++++++++ indoteknik_custom/security/ir.model.access.csv | 1 + indoteknik_custom/views/account_move_line.xml | 12 ++++ .../views/update_depreciation_move_wizard_view.xml | 35 ++++++++++++ 7 files changed, 163 insertions(+), 2 deletions(-) create mode 100644 indoteknik_custom/models/update_depreciation_move_wizard.py create mode 100644 indoteknik_custom/views/update_depreciation_move_wizard_view.xml diff --git a/indoteknik_custom/__manifest__.py b/indoteknik_custom/__manifest__.py index 61eef35b..51cfa592 100755 --- a/indoteknik_custom/__manifest__.py +++ b/indoteknik_custom/__manifest__.py @@ -193,7 +193,8 @@ 'views/close_tempo_mail_template.xml', 'views/domain_apo.xml', 'views/uom_uom.xml', - 'views/commission_internal.xml' + 'views/commission_internal.xml', + 'views/update_depreciation_move_wizard_view.xml' ], 'demo': [], 'css': [], diff --git a/indoteknik_custom/models/__init__.py b/indoteknik_custom/models/__init__.py index a14c766e..19a96bee 100755 --- a/indoteknik_custom/models/__init__.py +++ b/indoteknik_custom/models/__init__.py @@ -165,3 +165,4 @@ from . import partial_delivery from . import domain_apo from . import uom_uom from . import commission_internal +from . import update_depreciation_move_wizard \ No newline at end of file diff --git a/indoteknik_custom/models/account_move_line.py b/indoteknik_custom/models/account_move_line.py index 7c95d4ef..5edea25f 100644 --- a/indoteknik_custom/models/account_move_line.py +++ b/indoteknik_custom/models/account_move_line.py @@ -1,5 +1,5 @@ from odoo import models, api, fields - +from odoo.exceptions import AccessError, UserError, ValidationError class AccountMoveLine(models.Model): _inherit = "account.move.line" @@ -9,6 +9,69 @@ class AccountMoveLine(models.Model): analytic_account_ids = fields.Many2many('account.analytic.account', string='Analytic Account') line_no = fields.Integer('No', default=0) + def action_gl_reconcile(self): + lines = self + + journal = self.env['account.journal'].search([ + ('suspense_account_id', '=', lines[0].account_id.id) + ], limit=1) + + if not journal: + raise UserError('Journal dengan suspense account ini tidak ditemukan!') + + statement = self.env['account.bank.statement'].create({ + 'journal_id': journal.id, + 'name': f'REKONSIL {journal.name} {lines[0].date.strftime("%d-%m-%Y")}', + 'company_id': self.env.company.id, + 'date': lines[0].date, + }) + + widget_vals = [] + st_line_ids = [] + + for line in lines: + amount = line.debit - line.credit + + st_line = self.env['account.bank.statement.line'].create({ + 'statement_id': statement.id, + 'date': line.date or fields.Date.today(), + 'payment_ref': line.name, + 'partner_id': line.partner_id.id, + 'amount': amount, + 'ref': line.name, + }) + + st_line_ids.append(st_line.id) + + widget_vals.append({ + 'partner_id': st_line.partner_id.id, + 'counterpart_aml_dicts': [{ + 'counterpart_aml_id': line.id, + 'debit': abs(amount) if amount < 0 else 0, + 'credit': abs(amount) if amount > 0 else 0, + 'name': line.name or '/', + }], + 'payment_aml_ids': [], + 'new_aml_dicts': [], + 'to_check': False, + }) + + statement.button_post() + + self.env['account.reconciliation.widget'].process_bank_statement_line( + st_line_ids, + widget_vals + ) + # statement.button_validate_or_action() + + return { + 'effect': { + 'fadeout': 'slow', + 'message': 'Statement + Auto Reconcile sukses besar 😎🔥', + 'type': 'rainbow_man', + } + } + @api.onchange('account_id') def _onchange_account_id(self): for account in self: diff --git a/indoteknik_custom/models/update_depreciation_move_wizard.py b/indoteknik_custom/models/update_depreciation_move_wizard.py new file mode 100644 index 00000000..7d465f1d --- /dev/null +++ b/indoteknik_custom/models/update_depreciation_move_wizard.py @@ -0,0 +1,48 @@ +from odoo import models, fields, api +from odoo.exceptions import UserError + +class UpdateDepreciationMoveWizard(models.TransientModel): + _name = 'update.depreciation.move.wizard' + _description = 'Wizard untuk Update Move Check Depreciation Line' + + target_date = fields.Date(string="Tanggal Depresiasi", required=True) + + # def action_update_move_check(self): + # lines = self.env['account.asset.depreciation.line'].search([ + # ('depreciation_date', '=', self.target_date), + # ]) + # if not lines: + # raise UserError("Tidak ada baris depresiasi dengan tanggal tersebut.") + + # updated_count = 0 + # for line in lines: + # if not line.move_check: + # line.move_check = True + # line.move_posted_check = True + # updated_count += 1 + + # return { + # 'type': 'ir.actions.client', + # 'tag': 'display_notification', + # 'params': { + # 'title': 'Update Selesai', + # 'message': f'{updated_count} baris berhasil di-update.', + # 'type': 'success', + # 'sticky': False, + # } + # } + + def action_update_move_check(self): + assets = self.env['account.asset.asset'] + assets.compute_generated_entries(self.target_date) + + return { + 'type': 'ir.actions.client', + 'tag': 'display_notification', + 'params': { + 'title': 'Update Selesai', + 'message': 'Depresiasi berhasil di-update.', + 'type': 'success', + 'sticky': False, + } + } \ No newline at end of file diff --git a/indoteknik_custom/security/ir.model.access.csv b/indoteknik_custom/security/ir.model.access.csv index d501de1a..bc290370 100755 --- a/indoteknik_custom/security/ir.model.access.csv +++ b/indoteknik_custom/security/ir.model.access.csv @@ -215,3 +215,4 @@ access_surat_piutang_user,surat.piutang user,model_surat_piutang,,1,1,1,1 access_surat_piutang_line_user,surat.piutang.line user,model_surat_piutang_line,,1,1,1,1 access_sj_tele,access.sj.tele,model_sj_tele,base.group_system,1,1,1,1 access_stock_picking_sj_document,stock.picking.sj.document,model_stock_picking_sj_document,base.group_user,1,1,1,1 +access_update_depreciation_move_wizard,access.update.depreciation.move.wizard,model_update_depreciation_move_wizard,,1,1,1,1 \ No newline at end of file diff --git a/indoteknik_custom/views/account_move_line.xml b/indoteknik_custom/views/account_move_line.xml index cb24a0f0..838596c8 100644 --- a/indoteknik_custom/views/account_move_line.xml +++ b/indoteknik_custom/views/account_move_line.xml @@ -22,4 +22,16 @@ + + + Reconcile Selected + + + list + code + + action = records.action_gl_reconcile() + + + diff --git a/indoteknik_custom/views/update_depreciation_move_wizard_view.xml b/indoteknik_custom/views/update_depreciation_move_wizard_view.xml new file mode 100644 index 00000000..ff128a71 --- /dev/null +++ b/indoteknik_custom/views/update_depreciation_move_wizard_view.xml @@ -0,0 +1,35 @@ + + + + update.depreciation.move.wizard.form + update.depreciation.move.wizard + +
+ + + +
+
+
+
+
+ + + Update Depreciation Asset + ir.actions.act_window + update.depreciation.move.wizard + form + new + + + +
+ \ No newline at end of file -- cgit v1.2.3 From 37e0beac646ee2e676ff935e8289cf3189b3c21b Mon Sep 17 00:00:00 2001 From: Mqdd Date: Fri, 13 Feb 2026 09:42:53 +0700 Subject: check archived uom and product in sale order confirm --- indoteknik_custom/models/sale_order.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/indoteknik_custom/models/sale_order.py b/indoteknik_custom/models/sale_order.py index 49e36279..2548c7b3 100755 --- a/indoteknik_custom/models/sale_order.py +++ b/indoteknik_custom/models/sale_order.py @@ -2598,6 +2598,18 @@ class SaleOrder(models.Model): else: return False + def check_archived_product(self): + for order in self: + for line in order.order_line: + if line.product_id.active == False: + raise UserError("Terdapat Product yang sudah di Archive pada Product: {}".format(line.product_id.display_name)) + + def check_archived_uom(self): + for order in self: + for line in order.order_line: + if line.product_uom.active == False: + raise UserError("Terdapat UoM yang sudah di Archive pada UoM {} di Product {}".format(line.product_uom.name, line.product_id.display_name)) + def action_confirm(self): for order in self: order._validate_delivery_amt() @@ -2614,6 +2626,8 @@ class SaleOrder(models.Model): order._validate_order() order._validate_npwp() order.order_line.validate_line() + order.check_archived_product() + order.check_archived_uom() main_parent = order.partner_id.get_main_parent() SYSTEM_UID = 25 -- cgit v1.2.3 From 57221d2537684168a4761ce2eb0b2ede5586325f Mon Sep 17 00:00:00 2001 From: Mqdd Date: Sat, 14 Feb 2026 12:02:15 +0700 Subject: fix flow approval state adjust out --- indoteknik_custom/models/stock_inventory.py | 44 +++++++++++++++++------------ indoteknik_custom/views/stock_inventory.xml | 7 ++--- 2 files changed, 28 insertions(+), 23 deletions(-) diff --git a/indoteknik_custom/models/stock_inventory.py b/indoteknik_custom/models/stock_inventory.py index cb7d3773..b3580a4c 100644 --- a/indoteknik_custom/models/stock_inventory.py +++ b/indoteknik_custom/models/stock_inventory.py @@ -16,11 +16,35 @@ class StockInventory(models.Model): ('in', 'Adjusment In'), ('out', 'Adjusment Out'), ], string='Adjusments Type', required=True) + approval_state = fields.Selection([ ('logistic', 'Logistic'), ('accounting', 'Accounting'), ('approved', 'Approved'), - ], default='logistic', tracking=True) + ], default='logistic', tracking=True, readonly=True) + + def action_validate(self): + if self.adjusment_type == 'out': + + if self.approval_state != 'approved': + + if self.approval_state == 'logistic': + if not self.env.user.has_group('indoteknik_custom.group_role_logistic'): + raise UserError("Adjustment Out harus dilakukan oleh Logistic") + self.approval_state = 'accounting' + return True + + elif self.approval_state == 'accounting': + if not self.env.user.has_group('indoteknik_custom.group_role_fat'): + raise UserError("Adjustment Out harus dilakukan oleh Accounting") + self.approval_state = 'approved' + return True + + else: + raise UserError("Adjustment Out harus melalui approval terlebih dahulu.") + + return super(StockInventory, self).action_validate() + def _generate_number_stock_inventory(self): """Men-generate nomor untuk semua stock inventory yang belum memiliki number.""" @@ -58,10 +82,7 @@ class StockInventory(models.Model): return "00001" # Jika belum ada data, mulai dari 00001 def action_start(self): - if self.approval_state != 'approved' and self.adjusment_type == 'out': - raise UserError('Harus melalui proses approval') - if self.adjusment_type == 'in': - if self.env.user.id not in [21, 17, 571, 28]: + if self.env.user.id not in [21, 17, 571, 28, 25]: raise UserError("Hanya Rafly, Denise, Iqmal, dan Stephan yang bisa start inventory") return super(StockInventory, self).action_start() @@ -78,19 +99,6 @@ class StockInventory(models.Model): return order - def action_approve(self): - if self.adjusment_type == 'out': - for rec in self: - if rec.approval_state == 'logistic': - if not rec.env.user.has_group('indoteknik_custom.group_role_logistic'): - raise UserError("Harus diapprove logistic") - rec.approval_state = 'accounting' - elif rec.approval_state == 'accounting': - if not rec.env.user.has_group('indoteknik_custom.group_role_fat'): - raise UserError("Harus diapprove accounting") - rec.approval_state = 'approved' - else: - raise UserError("Sudah Approved") def write(self, vals): """Jika adjusment_type diubah, generate ulang nomor.""" diff --git a/indoteknik_custom/views/stock_inventory.xml b/indoteknik_custom/views/stock_inventory.xml index 89c058ea..ab1b6eec 100644 --- a/indoteknik_custom/views/stock_inventory.xml +++ b/indoteknik_custom/views/stock_inventory.xml @@ -6,14 +6,10 @@ stock.inventory -
-
- +
@@ -26,6 +22,7 @@ + -- cgit v1.2.3 From 9e10c2db3c49bbca718061dbd852b8db513bed0f Mon Sep 17 00:00:00 2001 From: Mqdd Date: Sun, 15 Feb 2026 17:37:04 +0700 Subject: fix flow adjust out --- indoteknik_custom/models/stock_inventory.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/indoteknik_custom/models/stock_inventory.py b/indoteknik_custom/models/stock_inventory.py index b3580a4c..efd52e5c 100644 --- a/indoteknik_custom/models/stock_inventory.py +++ b/indoteknik_custom/models/stock_inventory.py @@ -21,7 +21,7 @@ class StockInventory(models.Model): ('logistic', 'Logistic'), ('accounting', 'Accounting'), ('approved', 'Approved'), - ], default='logistic', tracking=True, readonly=True) + ], tracking=True, readonly=True) def action_validate(self): if self.adjusment_type == 'out': @@ -38,7 +38,7 @@ class StockInventory(models.Model): if not self.env.user.has_group('indoteknik_custom.group_role_fat'): raise UserError("Adjustment Out harus dilakukan oleh Accounting") self.approval_state = 'approved' - return True + return super(StockInventory, self).action_validate() else: raise UserError("Adjustment Out harus melalui approval terlebih dahulu.") @@ -89,6 +89,12 @@ class StockInventory(models.Model): @api.model def create(self, vals): """Pastikan nomor hanya dibuat saat penyimpanan.""" + + if vals.get('adjusment_type') == 'in': + vals['approval_state'] = False + elif vals.get('adjusment_type') == 'out': + vals['approval_state'] = 'logistic' + if 'adjusment_type' in vals and not vals.get('number'): vals['number'] = False # Jangan buat number otomatis dulu @@ -105,6 +111,10 @@ class StockInventory(models.Model): res = super(StockInventory, self).write(vals) if 'adjusment_type' in vals: for record in self: + if record.adjusment_type == 'in': + record.approval_state = False + elif record.adjusment_type == 'out' and record.approval_state == False: + record.approval_state = 'logistic' self._assign_number(record) return res -- cgit v1.2.3 From 63ef16f9cef869a7bd855e1568272e035ef55b34 Mon Sep 17 00:00:00 2001 From: FIN-IT_AndriFP Date: Sun, 15 Feb 2026 19:37:50 +0700 Subject: hide pos & tiki biteship --- indoteknik_custom/models/sale_order.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indoteknik_custom/models/sale_order.py b/indoteknik_custom/models/sale_order.py index 49e36279..b7a44702 100755 --- a/indoteknik_custom/models/sale_order.py +++ b/indoteknik_custom/models/sale_order.py @@ -647,7 +647,7 @@ class SaleOrder(models.Model): def _get_biteship_courier_codes(self): return [ - 'gojek','grab','deliveree','lalamove','jne','tiki','ninja','lion','rara','sicepat','jnt','pos','idexpress','rpx','wahana','jdl','pos','anteraja','sap','paxel','borzo' + 'gojek','grab','deliveree','lalamove','jne','ninja','lion','rara','sicepat','jnt','pos','idexpress','rpx','wahana','jdl','anteraja','sap','paxel','borzo' ] @api.onchange('carrier_id') -- cgit v1.2.3