diff options
Diffstat (limited to 'fixco_custom/models/purchasing_job.py')
| -rw-r--r-- | fixco_custom/models/purchasing_job.py | 169 |
1 files changed, 120 insertions, 49 deletions
diff --git a/fixco_custom/models/purchasing_job.py b/fixco_custom/models/purchasing_job.py index 2c7138a..5d37c8c 100644 --- a/fixco_custom/models/purchasing_job.py +++ b/fixco_custom/models/purchasing_job.py @@ -6,11 +6,10 @@ class PurchasingJob(models.Model): _name = 'purchasing.job' _description = 'Procurement Monitoring by Product' _auto = False - _rec_name = 'product' + _rec_name = 'product_id' id = fields.Integer(string='ID', readonly=True) item_code = fields.Char(string='Item Code') - product = fields.Char(string='Product') onhand = fields.Float(string='On Hand') incoming = fields.Float(string='Incoming') outgoing = fields.Float(string='Outgoing') @@ -18,6 +17,30 @@ class PurchasingJob(models.Model): product_id = fields.Many2one('product.product', string='Product') vendor_id = fields.Many2one('res.partner', string='Vendor') brand_id = fields.Many2one('brands', string='Brand') + note = fields.Text(string='Note', compute='_compute_note') + + def action_open_note_wizard(self): + self.ensure_one() + return { + 'name': 'Add/Edit Note', + 'type': 'ir.actions.act_window', + 'res_model': 'purchasing.job.note.wizard', + 'view_mode': 'form', + 'target': 'new', + 'context': { + 'default_product_id': self.product_id.id, + 'default_note': self.note, + } + } + + + def _compute_note(self): + for rec in self: + note_obj = self.env['purchasing.job.note'].search([ + ('product_id', '=', rec.product_id.id) + ], limit=1) + rec.note = note_obj.note if note_obj else '' + def create_automatic_purchase(self): if not self: @@ -72,54 +95,102 @@ class PurchasingJob(models.Model): def init(self): tools.drop_view_if_exists(self.env.cr, self._table) self.env.cr.execute(""" - CREATE OR REPLACE VIEW %s AS - SELECT * FROM ( - SELECT - row_number() OVER () AS id, - a.item_code, - a.product, - a.onhand, - a.incoming, - a.outgoing, - CASE - WHEN (a.incoming + a.onhand) < a.outgoing THEN 'kurang' - ELSE 'cukup' - END AS action, - a.product_id, - pp2.vendor_id, - b.id AS brand_id - FROM ( - SELECT - COALESCE(pp.default_code, pt.default_code) AS item_code, - pt.name AS product, - get_qty_onhand(pp.id::numeric) AS onhand, - get_qty_incoming(pp.id::numeric) AS incoming, - get_qty_outgoing(pp.id::numeric) AS outgoing, - pp.id AS product_id, - pp.brand_id - FROM stock_move sm - JOIN stock_picking sp ON sp.id = sm.picking_id - JOIN product_product pp ON pp.id = sm.product_id - JOIN product_template pt ON pt.id = pp.product_tmpl_id - WHERE sp.state IN ('draft', 'waiting', 'confirmed', 'assigned') - AND sp.name LIKE '%%OUT%%' - AND sm.location_id = 55 - GROUP BY pp.id, pp.default_code, pt.default_code, pt.name, pp.brand_id - ) a - LEFT JOIN brands b ON b.id = a.brand_id - LEFT JOIN LATERAL ( - SELECT vendor_id - FROM purchase_pricelist - WHERE product_id = a.product_id - ORDER BY id ASC - LIMIT 1 - ) pp2 ON true - ) final - WHERE final.action = 'kurang' + CREATE OR REPLACE VIEW %s + AS SELECT + row_number() OVER ()::integer AS id, + pmp.item_code, + max(pmp.onhand) AS onhand, + max(pmp.incoming) AS incoming, + max(pmp.outgoing) AS outgoing, + pmp.action, + pmp.product_id, + pmp.brand_id, + pmp.vendor_id + FROM v_procurement_monitoring_by_product pmp + WHERE pmp.action = 'kurang'::text + GROUP BY pmp.product_id, pmp.item_code, pmp.action, pmp.brand_id, pmp.vendor_id; """ % self._table) - super(PurchasingJob, self).init() - - + # def init(self): + # tools.drop_view_if_exists(self.env.cr, self._table) + # self.env.cr.execute(""" + # CREATE OR REPLACE VIEW %s AS + # SELECT * FROM ( + # SELECT + # row_number() OVER () AS id, + # a.item_code, + # a.product, + # a.onhand, + # a.incoming, + # a.outgoing, + # CASE + # WHEN (a.incoming + a.onhand) < a.outgoing THEN 'kurang' + # ELSE 'cukup' + # END AS action, + # a.product_id, + # pp2.vendor_id, + # b.id AS brand_id + # FROM ( + # SELECT + # COALESCE(pp.default_code, pt.default_code) AS item_code, + # pt.name AS product, + # get_qty_onhand(pp.id::numeric) AS onhand, + # get_qty_incoming(pp.id::numeric) AS incoming, + # get_qty_outgoing(pp.id::numeric) AS outgoing, + # pp.id AS product_id, + # pp.brand_id + # FROM stock_move sm + # JOIN stock_picking sp ON sp.id = sm.picking_id + # JOIN product_product pp ON pp.id = sm.product_id + # JOIN product_template pt ON pt.id = pp.product_tmpl_id + # WHERE sp.state IN ('draft', 'waiting', 'confirmed', 'assigned') + # AND sp.name LIKE '%%OUT%%' + # AND sm.location_id = 55 + # GROUP BY pp.id, pp.default_code, pt.default_code, pt.name, pp.brand_id + # ) a + # LEFT JOIN brands b ON b.id = a.brand_id + # LEFT JOIN LATERAL ( + # SELECT vendor_id + # FROM purchase_pricelist + # WHERE product_id = a.product_id + # ORDER BY id ASC + # LIMIT 1 + # ) pp2 ON true + # ) final + # WHERE final.action = 'kurang' + # """ % self._table) + + # super(PurchasingJob, self).init() + +class PurchasingJobNote(models.Model): + _name = 'purchasing.job.note' + _description = 'Note for Product in Purchasing Job' + + product_id = fields.Many2one('product.product', string='Product', required=True, ondelete='cascade', index=True) + note = fields.Text(string='Note') + user_id = fields.Many2one('res.users', string='Created by', default=lambda self: self.env.user) + + + +class PurchasingJobNoteWizard(models.TransientModel): + _name = 'purchasing.job.note.wizard' + _description = 'Add/Edit Note for Product' + + product_id = fields.Many2one('product.product', string='Product', required=True) + note = fields.Text(string='Note') + + def action_confirm(self): + self.ensure_one() + existing = self.env['purchasing.job.note'].search([ + ('product_id', '=', self.product_id.id) + ], limit=1) + if existing: + existing.note = self.note + else: + self.env['purchasing.job.note'].create({ + 'product_id': self.product_id.id, + 'note': self.note, + }) + return {'type': 'ir.actions.act_window_close'} |
