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 30e7aae41d50528a4e61e6f55f38e3dd647e41c6 Mon Sep 17 00:00:00 2001 From: Mqdd Date: Sat, 14 Feb 2026 11:14:22 +0700 Subject: merge --- indoteknik_custom/models/__init__.py | 5 +---- indoteknik_custom/security/ir.model.access.csv | 2 +- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/indoteknik_custom/models/__init__.py b/indoteknik_custom/models/__init__.py index 2b1851ce..3b3dcd9d 100755 --- a/indoteknik_custom/models/__init__.py +++ b/indoteknik_custom/models/__init__.py @@ -165,8 +165,5 @@ from . import partial_delivery from . import domain_apo from . import uom_uom from . import commission_internal -<<<<<<< HEAD from . import gudang_service -======= -from . import update_depreciation_move_wizard ->>>>>>> 37e0beac646ee2e676ff935e8289cf3189b3c21b +from . import update_depreciation_move_wizard \ 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 50e2b382..9859b127 100755 --- a/indoteknik_custom/security/ir.model.access.csv +++ b/indoteknik_custom/security/ir.model.access.csv @@ -217,4 +217,4 @@ 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_gudang_service,gudang.service,model_gudang_service,base.group_user,1,1,1,1 access_gudang_service_line,gudang.service.line,model_gudang_service_line,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 +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 -- 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 d951091bcb1bcab9d5aedf8060bbc1cd8905326c Mon Sep 17 00:00:00 2001 From: Mqdd Date: Sun, 15 Feb 2026 00:05:12 +0700 Subject: fix state typo & code improvement --- indoteknik_custom/models/gudang_service.py | 65 ++++++++++++++++++++++-------- 1 file changed, 48 insertions(+), 17 deletions(-) diff --git a/indoteknik_custom/models/gudang_service.py b/indoteknik_custom/models/gudang_service.py index 4900113f..5d89cfad 100644 --- a/indoteknik_custom/models/gudang_service.py +++ b/indoteknik_custom/models/gudang_service.py @@ -45,15 +45,49 @@ class GudangService(models.Model): ('cancel', 'Cancel')], default='draft', tracking=True) cancel_reason = fields.Text('Cancel Reason', tracking=True) + @api.constrains('gudang_service_lines') + def _check_qty(self): + for rec in self: + if not rec.origin: + continue + + so_qty_map = { + line.product_id.id: line.product_uom_qty + for line in rec.origin.order_line + } + + for line in rec.gudang_service_lines: + if line.quantity <= 0: + raise ValidationError( + f"Quantity for product {line.product_id.display_name} cannot be 0 or negative." + ) + + so_qty = so_qty_map.get(line.product_id.id, 0) + + if line.quantity > so_qty: + raise ValidationError( + f"Quantity for product {line.product_id.display_name} " + f"cannot exceed SO quantity ({so_qty})." + ) + + + @api.constrains('state', 'schedule_date') + def _check_edit_after_sent(self): + for rec in self: + if rec.state in ['sent_to_vendor', 'received_from_vendor', 'delivered_to_cust']: + if rec._origin.schedule_date != rec.schedule_date: + raise ValidationError("Schedule cannot be modified after sent to vendor") + + def _send_logistic_notification(self): group = self.env.ref('indoteknik_custom.group_role_logistic', raise_if_not_found=False) if not group: return users = group.users - # Safa - md = self.env['res.users'].browse([3425]) - # send to logistic and safa + # MD + md = self.env['res.users'].browse([3425, 4801, 1036]) + # send to logistic and MD users = users | md if not users: @@ -88,7 +122,7 @@ class GudangService(models.Model): @api.model def cron_notify_onprogress_gudang_service(self): records = self.search([ - ('state', 'in', ['draft', 'received_from_customer']), + ('state', 'in', ['draft', 'received_from_cust']), ]) if records: @@ -127,19 +161,16 @@ class GudangService(models.Model): rec.state = 'received_from_vendor' def action_done(self): - if self.state != 'received_from_vendor': - raise UserError("Only 'Received From Vendor' state can be set to Done") - else: - for rec in self: - activities = self.env['mail.activity'].search([ - ('res_id', '=', rec.id), - ('res_model', '=', 'gudang.service'), - ('state', '=', 'delivered_to_cust'), - ]) - activities.unlink() - rec.state = 'delivered_to_cust' - if not rec.done_date: - rec.done_date = fields.Datetime.now() + for rec in self: + if rec.state != 'received_from_vendor': + raise UserError("Only 'Received From Vendor' state can be set to Done") + + rec.activity_ids.unlink() + + rec.write({ + 'state': 'delivered_to_cust', + 'done_date': fields.Datetime.now() + }) def action_draft(self): """Reset to draft state""" -- cgit v1.2.3 From c08d16f53c4e2c97e74f33018e00efabd08664b3 Mon Sep 17 00:00:00 2001 From: Mqdd Date: Sun, 15 Feb 2026 17:36:26 +0700 Subject: push --- indoteknik_custom/views/gudang_service.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indoteknik_custom/views/gudang_service.xml b/indoteknik_custom/views/gudang_service.xml index e5cc94c4..769664c5 100644 --- a/indoteknik_custom/views/gudang_service.xml +++ b/indoteknik_custom/views/gudang_service.xml @@ -54,7 +54,7 @@ - + -- cgit v1.2.3