From 3c5b4bbecca6614c0b6f894e41e9551793957b00 Mon Sep 17 00:00:00 2001 From: stephanchrst Date: Mon, 11 Nov 2024 13:24:11 +0700 Subject: bug fix match requisition and purchase order --- indoteknik_custom/models/requisition.py | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'indoteknik_custom/models/requisition.py') diff --git a/indoteknik_custom/models/requisition.py b/indoteknik_custom/models/requisition.py index c4104ec5..92b222a8 100644 --- a/indoteknik_custom/models/requisition.py +++ b/indoteknik_custom/models/requisition.py @@ -108,6 +108,13 @@ class Requisition(models.Model): new_po_line = self.env['purchase.order.line'].create([param_line]) line.current_po_id = new_po.id line.current_po_line_id = new_po_line.id + + self.env['requisition.purchase.match'].create([{ + 'requisition_id': self.id, + 'order_id': new_po.id + }]) + self.is_po = True + return po_ids # def create_po_from_requisition(self): -- cgit v1.2.3 From c8359019759d78dcddea6d419c4a8f8eebe23c69 Mon Sep 17 00:00:00 2001 From: stephanchrst Date: Mon, 11 Nov 2024 13:27:04 +0700 Subject: validasi SO harus diisi pada saat create PO di requisition --- indoteknik_custom/models/requisition.py | 2 ++ 1 file changed, 2 insertions(+) (limited to 'indoteknik_custom/models/requisition.py') diff --git a/indoteknik_custom/models/requisition.py b/indoteknik_custom/models/requisition.py index 92b222a8..576857df 100644 --- a/indoteknik_custom/models/requisition.py +++ b/indoteknik_custom/models/requisition.py @@ -35,6 +35,8 @@ class Requisition(models.Model): raise UserError('Tidak ada Lines, belum bisa create PO') if self.is_po: raise UserError('Sudah pernah di create PO') + if self.sale_order_id: + raise UserError('Tidak ada link dengan Sales Order, tidak bisa dihitung sebagai Plafon Qty di PO') vendor_ids = self.env['requisition.line'].read_group([ ('requisition_id', '=', self.id), -- cgit v1.2.3 From 1bb2d9edb764ee3de50b0a005ff40aeef60bf5d6 Mon Sep 17 00:00:00 2001 From: Azka Nathan Date: Mon, 11 Nov 2024 13:38:49 +0700 Subject: add approval sales manager and marketing manager on rpo --- indoteknik_custom/models/requisition.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) (limited to 'indoteknik_custom/models/requisition.py') diff --git a/indoteknik_custom/models/requisition.py b/indoteknik_custom/models/requisition.py index c4104ec5..a90a5718 100644 --- a/indoteknik_custom/models/requisition.py +++ b/indoteknik_custom/models/requisition.py @@ -22,15 +22,31 @@ class Requisition(models.Model): requisition_match = fields.One2many('requisition.purchase.match', 'requisition_id', string='Matches', auto_join=True) sale_order_id = fields.Many2one('sale.order', string='SO', help='harus diisi nomor SO yang ingin digenerate', domain="[('state', '=', 'sale')]") + sales_approve = fields.Boolean(string='Sales Approve', tracking=3, copy=False) + merchandise_approve = fields.Boolean(string='Merchandise Approve', tracking=3, copy=False) @api.model def create(self, vals): vals['number'] = self.env['ir.sequence'].next_by_code('requisition') or '0' result = super(Requisition, self).create(vals) return result + + def button_approve(self): + if self.env.user.id not in [377, 19]: + raise UserError('Hanya Vita dan Darren Yang Bisa Approve') + if self.env.user.id == 377: + self.sales_approve = True + elif self.env.user.id == 19: + if not self.sales_approve: + raise UserError('Vita Belum Approve') + self.merchandise_approve = True def create_po_from_requisition(self): + if not self.sales_approve: + raise UserError('Harus Di Approve oleh Vita') + if not self.merchandise_approve: + raise UserError('Harus Di Approve oleh Darren') if not self.requisition_lines: raise UserError('Tidak ada Lines, belum bisa create PO') if self.is_po: -- cgit v1.2.3 From beefbce9a41d0210582cf8ceb6e4e7a6a5bc8fef Mon Sep 17 00:00:00 2001 From: stephanchrst Date: Mon, 11 Nov 2024 13:41:46 +0700 Subject: add view of requisition match po --- indoteknik_custom/models/requisition.py | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) (limited to 'indoteknik_custom/models/requisition.py') diff --git a/indoteknik_custom/models/requisition.py b/indoteknik_custom/models/requisition.py index 576857df..e5053d34 100644 --- a/indoteknik_custom/models/requisition.py +++ b/indoteknik_custom/models/requisition.py @@ -1,4 +1,4 @@ -from odoo import models, fields, api, _ +from odoo import models, fields, api, tools, _ from odoo.exceptions import UserError from datetime import datetime import math @@ -7,6 +7,30 @@ import logging _logger = logging.getLogger(__name__) +class RequisitionMatchPO(models.Model): + _name = 'v.requisition.match.po' + _auto = False + _rec_name = 'purchase_id' + + id = fields.Integer(string='ID') + requisition_id = fields.Many2one('requisition', string='Requisition') + line_id = fields.Many2one('requisition.line', string='Requisition Line') + product_id = fields.Many2one('product.product', string='Product') + partner_id = fields.Many2one('res.partner', string='Partner') + purchase_id = fields.Many2one('purchase.order', string='Purchase Order') + + def init(self): + tools.drop_view_if_exists(self.env.cr, self._table) + self.env.cr.execute(""" + create or replace view %s as + select rpm.id as id, r.id as requisition_id, rl.id as line_id, rl.product_id, rl.partner_id, + rpm.order_id as purchase_id + from requisition_line rl + join requisition r on r.id = rl.requisition_id + join requisition_purchase_match rpm on rpm.requisition_id = r.id + """ % self._table) + + class Requisition(models.Model): _name = 'requisition' _order = 'id desc' -- cgit v1.2.3 From 03e9f9e8997836e37a5ab38798edb310ce6a6c76 Mon Sep 17 00:00:00 2001 From: stephanchrst Date: Mon, 11 Nov 2024 13:43:48 +0700 Subject: add sale order --- indoteknik_custom/models/requisition.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indoteknik_custom/models/requisition.py') diff --git a/indoteknik_custom/models/requisition.py b/indoteknik_custom/models/requisition.py index e5053d34..68c57e4c 100644 --- a/indoteknik_custom/models/requisition.py +++ b/indoteknik_custom/models/requisition.py @@ -24,7 +24,7 @@ class RequisitionMatchPO(models.Model): self.env.cr.execute(""" create or replace view %s as select rpm.id as id, r.id as requisition_id, rl.id as line_id, rl.product_id, rl.partner_id, - rpm.order_id as purchase_id + rpm.order_id as purchase_id, r.sale_order_id as sale_id from requisition_line rl join requisition r on r.id = rl.requisition_id join requisition_purchase_match rpm on rpm.requisition_id = r.id -- cgit v1.2.3 From e40f5a21ec251363b3b71d81b7801a782716ca0a Mon Sep 17 00:00:00 2001 From: Azka Nathan Date: Mon, 11 Nov 2024 13:43:58 +0700 Subject: add approval sales manager and marketing manager on rpo --- indoteknik_custom/models/requisition.py | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) (limited to 'indoteknik_custom/models/requisition.py') diff --git a/indoteknik_custom/models/requisition.py b/indoteknik_custom/models/requisition.py index c4104ec5..e09c9e41 100644 --- a/indoteknik_custom/models/requisition.py +++ b/indoteknik_custom/models/requisition.py @@ -22,15 +22,30 @@ class Requisition(models.Model): requisition_match = fields.One2many('requisition.purchase.match', 'requisition_id', string='Matches', auto_join=True) sale_order_id = fields.Many2one('sale.order', string='SO', help='harus diisi nomor SO yang ingin digenerate', domain="[('state', '=', 'sale')]") + sales_approve = fields.Boolean(string='Sales Approve', tracking=3, copy=False) + merchandise_approve = fields.Boolean(string='Merchandise Approve', tracking=3, copy=False) @api.model def create(self, vals): vals['number'] = self.env['ir.sequence'].next_by_code('requisition') or '0' result = super(Requisition, self).create(vals) return result - + + def button_approve(self): + if self.env.user.id not in [377, 19]: + raise UserError('Hanya Vita dan Darren Yang Bisa Approve') + if self.env.user.id == 377: + self.sales_approve = True + elif self.env.user.id == 19: + if not self.sales_approve: + raise UserError('Vita Belum Approve') + self.merchandise_approve = True def create_po_from_requisition(self): + if not self.sales_approve: + raise UserError('Harus di Approve Vita') + if not self.merchandise_approve: + raise UserError('Harus di Approve Darren') if not self.requisition_lines: raise UserError('Tidak ada Lines, belum bisa create PO') if self.is_po: -- cgit v1.2.3 From e573a766b997e4dc60935f8cc87e887d09f64b7a Mon Sep 17 00:00:00 2001 From: stephanchrst Date: Mon, 11 Nov 2024 13:53:22 +0700 Subject: add sale order condition in match requisition --- indoteknik_custom/models/requisition.py | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'indoteknik_custom/models/requisition.py') diff --git a/indoteknik_custom/models/requisition.py b/indoteknik_custom/models/requisition.py index 68c57e4c..583a25c4 100644 --- a/indoteknik_custom/models/requisition.py +++ b/indoteknik_custom/models/requisition.py @@ -28,6 +28,11 @@ class RequisitionMatchPO(models.Model): from requisition_line rl join requisition r on r.id = rl.requisition_id join requisition_purchase_match rpm on rpm.requisition_id = r.id + join purchase_order po on po.id = rpm.order_id + join sale_order so on so.id = r.sale_order_id + where r.date_doc >= '2024-11-11' + and po.state in ('done', 'purchase') + and so.state in ('draft', 'sent') """ % self._table) -- cgit v1.2.3 From 9a0fd25e54491bd14a5b29b62b31a440dfa1bebc Mon Sep 17 00:00:00 2001 From: stephanchrst Date: Mon, 11 Nov 2024 14:10:13 +0700 Subject: change view requisition match --- indoteknik_custom/models/requisition.py | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) (limited to 'indoteknik_custom/models/requisition.py') diff --git a/indoteknik_custom/models/requisition.py b/indoteknik_custom/models/requisition.py index 0ab78530..704ae8c0 100644 --- a/indoteknik_custom/models/requisition.py +++ b/indoteknik_custom/models/requisition.py @@ -13,26 +13,24 @@ class RequisitionMatchPO(models.Model): _rec_name = 'purchase_id' id = fields.Integer(string='ID') - requisition_id = fields.Many2one('requisition', string='Requisition') - line_id = fields.Many2one('requisition.line', string='Requisition Line') product_id = fields.Many2one('product.product', string='Product') - partner_id = fields.Many2one('res.partner', string='Partner') - purchase_id = fields.Many2one('purchase.order', string='Purchase Order') + qty_rpo = fields.Float(string='Qty RPO', help='Qty RPO yang sudah di PO namun SO masih Draft') def init(self): tools.drop_view_if_exists(self.env.cr, self._table) self.env.cr.execute(""" create or replace view %s as - select rpm.id as id, r.id as requisition_id, rl.id as line_id, rl.product_id, rl.partner_id, - rpm.order_id as purchase_id, r.sale_order_id as sale_id + select rl.product_id as id, rl.product_id, sum(rl.qty_purchase) as qty_rpo from requisition_line rl join requisition r on r.id = rl.requisition_id join requisition_purchase_match rpm on rpm.requisition_id = r.id join purchase_order po on po.id = rpm.order_id join sale_order so on so.id = r.sale_order_id - where r.date_doc >= '2024-11-11' + where 1=1 + and r.date_doc >= '2024-11-11' and po.state in ('done', 'purchase') and so.state in ('draft', 'sent') + group by rl.product_id """ % self._table) -- cgit v1.2.3 From 17d46cf9f4eede8177b2373c03d5b36123f712c1 Mon Sep 17 00:00:00 2001 From: stephanchrst Date: Mon, 11 Nov 2024 14:39:26 +0700 Subject: change rec name view match requisition --- indoteknik_custom/models/requisition.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indoteknik_custom/models/requisition.py') diff --git a/indoteknik_custom/models/requisition.py b/indoteknik_custom/models/requisition.py index 704ae8c0..3d9ca876 100644 --- a/indoteknik_custom/models/requisition.py +++ b/indoteknik_custom/models/requisition.py @@ -10,7 +10,7 @@ _logger = logging.getLogger(__name__) class RequisitionMatchPO(models.Model): _name = 'v.requisition.match.po' _auto = False - _rec_name = 'purchase_id' + _rec_name = 'product_id' id = fields.Integer(string='ID') product_id = fields.Many2one('product.product', string='Product') -- cgit v1.2.3 From 4be403f544f63a5161275f0d600c6f6950f3a30c Mon Sep 17 00:00:00 2001 From: Azka Nathan Date: Mon, 11 Nov 2024 16:13:27 +0700 Subject: push --- indoteknik_custom/models/requisition.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indoteknik_custom/models/requisition.py') diff --git a/indoteknik_custom/models/requisition.py b/indoteknik_custom/models/requisition.py index a90a5718..89ed4a27 100644 --- a/indoteknik_custom/models/requisition.py +++ b/indoteknik_custom/models/requisition.py @@ -117,7 +117,7 @@ class Requisition(models.Model): 'product_id': product.id, 'product_qty': line.qty_purchase, 'product_uom_qty': line.qty_purchase, - 'name': product.name, + 'name': product.display_name, 'price_unit': line.price_unit, 'taxes_id': tax, } -- cgit v1.2.3 From 8d087106a29341d7ffe8725fff92c43dd3a2dbf2 Mon Sep 17 00:00:00 2001 From: stephanchrst Date: Tue, 12 Nov 2024 08:33:32 +0700 Subject: change domain sale order in requisition --- indoteknik_custom/models/requisition.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'indoteknik_custom/models/requisition.py') diff --git a/indoteknik_custom/models/requisition.py b/indoteknik_custom/models/requisition.py index 3d9ca876..fcc111d5 100644 --- a/indoteknik_custom/models/requisition.py +++ b/indoteknik_custom/models/requisition.py @@ -47,8 +47,7 @@ class Requisition(models.Model): notification = fields.Char(string='Notification') is_po = fields.Boolean(string='Is PO') requisition_match = fields.One2many('requisition.purchase.match', 'requisition_id', string='Matches', auto_join=True) - sale_order_id = fields.Many2one('sale.order', string='SO', help='harus diisi nomor SO yang ingin digenerate', - domain="[('state', '=', 'sale')]") + sale_order_id = fields.Many2one('sale.order', string='SO', help='harus diisi nomor SO yang ingin digenerate') sales_approve = fields.Boolean(string='Sales Approve', tracking=3, copy=False) merchandise_approve = fields.Boolean(string='Merchandise Approve', tracking=3, copy=False) -- cgit v1.2.3 From 0c6f047cab337f7463ef359bbb744a2be7145267 Mon Sep 17 00:00:00 2001 From: stephanchrst Date: Tue, 12 Nov 2024 08:34:52 +0700 Subject: change domain sale order in requisition --- indoteknik_custom/models/requisition.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'indoteknik_custom/models/requisition.py') diff --git a/indoteknik_custom/models/requisition.py b/indoteknik_custom/models/requisition.py index 8ebdd31b..d53fc796 100644 --- a/indoteknik_custom/models/requisition.py +++ b/indoteknik_custom/models/requisition.py @@ -47,8 +47,7 @@ class Requisition(models.Model): notification = fields.Char(string='Notification') is_po = fields.Boolean(string='Is PO') requisition_match = fields.One2many('requisition.purchase.match', 'requisition_id', string='Matches', auto_join=True) - sale_order_id = fields.Many2one('sale.order', string='SO', help='harus diisi nomor SO yang ingin digenerate', - domain="[('state', '=', 'sale')]") + sale_order_id = fields.Many2one('sale.order', string='SO', help='harus diisi nomor SO yang ingin digenerate') sales_approve = fields.Boolean(string='Sales Approve', tracking=3, copy=False) merchandise_approve = fields.Boolean(string='Merchandise Approve', tracking=3, copy=False) -- cgit v1.2.3 From 45811de91c682cea9ade1e975f241a651c68b1df Mon Sep 17 00:00:00 2001 From: stephanchrst Date: Tue, 12 Nov 2024 10:53:04 +0700 Subject: after UAT plafon --- indoteknik_custom/models/requisition.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'indoteknik_custom/models/requisition.py') diff --git a/indoteknik_custom/models/requisition.py b/indoteknik_custom/models/requisition.py index fcc111d5..dbf236e2 100644 --- a/indoteknik_custom/models/requisition.py +++ b/indoteknik_custom/models/requisition.py @@ -58,6 +58,9 @@ class Requisition(models.Model): return result def button_approve(self): + state = ['done', 'sale'] + if self.sale_order_id.state in state: + raise UserError('SO sudah Confirm, akan berakibat double Purchase melalui PJ') if self.env.user.id not in [377, 19]: raise UserError('Hanya Vita dan Darren Yang Bisa Approve') if self.env.user.id == 377: @@ -76,7 +79,7 @@ class Requisition(models.Model): raise UserError('Tidak ada Lines, belum bisa create PO') if self.is_po: raise UserError('Sudah pernah di create PO') - if self.sale_order_id: + if not self.sale_order_id: raise UserError('Tidak ada link dengan Sales Order, tidak bisa dihitung sebagai Plafon Qty di PO') vendor_ids = self.env['requisition.line'].read_group([ -- cgit v1.2.3 From 1f42c0b0adf937e238e68fc2f7307234fff51952 Mon Sep 17 00:00:00 2001 From: stephanchrst Date: Tue, 12 Nov 2024 11:26:13 +0700 Subject: add button copy so line to requisition --- indoteknik_custom/models/requisition.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) (limited to 'indoteknik_custom/models/requisition.py') diff --git a/indoteknik_custom/models/requisition.py b/indoteknik_custom/models/requisition.py index dbf236e2..3aa564df 100644 --- a/indoteknik_custom/models/requisition.py +++ b/indoteknik_custom/models/requisition.py @@ -51,6 +51,27 @@ class Requisition(models.Model): sales_approve = fields.Boolean(string='Sales Approve', tracking=3, copy=False) merchandise_approve = fields.Boolean(string='Merchandise Approve', tracking=3, copy=False) + def generate_requisition_from_so(self): + state = ['done', 'sale'] + if not self.sale_order_id: + raise UserError('Sale Order Wajib Diisi dan Harus Draft') + if self.sale_order_id.state in state: + raise UserError('SO sudah Confirm, akan berakibat double Purchase melalui PJ') + if not self.sale_order_id.order_line: + raise UserError('Line SO masih kosong, harus diisi dulu') + for order_line in self.sale_order_id.order_line: + param = { + 'requisition_id': self.id, + 'product_id': order_line.product_id.id, + 'partner_id': order_line.vendor_id.id, + 'qty_purchase': order_line.product_uom_qty, + 'price_unit': order_line.purchase_price, + 'taxes_id': order_line.purchase_tax_id.id, + 'subtotal': order_line.purchase_price * order_line.product_uom_qty, + 'brand_id': order_line.product_id.x_manufacture.id + } + self.env['requisition.line'].create([param]) + @api.model def create(self, vals): vals['number'] = self.env['ir.sequence'].next_by_code('requisition') or '0' -- cgit v1.2.3