diff options
| -rw-r--r-- | indoteknik_custom/models/automatic_purchase.py | 71 | ||||
| -rwxr-xr-x | indoteknik_custom/security/ir.model.access.csv | 3 | ||||
| -rw-r--r-- | indoteknik_custom/views/automatic_purchase.xml | 44 |
3 files changed, 105 insertions, 13 deletions
diff --git a/indoteknik_custom/models/automatic_purchase.py b/indoteknik_custom/models/automatic_purchase.py index 63eefb93..438d365f 100644 --- a/indoteknik_custom/models/automatic_purchase.py +++ b/indoteknik_custom/models/automatic_purchase.py @@ -18,13 +18,14 @@ class AutomaticPurchase(models.Model): purchase_lines = fields.One2many('automatic.purchase.line', 'automatic_purchase_id', string='Lines', auto_join=True) notification = fields.Char(string='Notification') is_po = fields.Boolean(string='Is PO') - purchase_match = fields.One2many('automatic.purchase.match', 'automatic_purchase_id', string='Matches', auto_join=True) + purchase_match = fields.One2many('automatic.purchase.match', 'automatic_purchase_id', string='PO Matches', auto_join=True) vendor_id = fields.Many2one('res.partner', string='Vendor', help='boleh kosong, jika diisi, maka hanya keluar data untuk vendor tersebut') responsible_id = fields.Many2one('res.users', string='Responsible', required=True) apo_type = fields.Selection([ ('regular', 'Regular Fulfill SO'), ('reordering', 'Reordering Rule'), - ], string='Type') + ], string='Type', tracking=3) + sales_match = fields.One2many('automatic.purchase.sales.match', 'automatic_purchase_id', string='SO Matches', auto_join=True) @api.model def create(self, vals): @@ -95,9 +96,56 @@ class AutomaticPurchase(models.Model): _logger.info('Automatic Create PO Line %s' % product.product_id.name) self.notification = self.notification + ' %s' % new_po.name self.is_po = True - + + def generate_regular_purchase(self): + if self.apo_type == 'reordering': + raise UserError('Tombol ini hanya untuk Regular Fulfill SO') + if self.vendor_id: + raise UserError('Vendor tidak dapat diisi jika Regular Fulfill SO') + if self.purchase_lines: + raise UserError('Sudah digenerate sebelumnya, hapus line terlebih dahulu') + #TODO must add order by for fifo mechanism + #change the view of v.purchasing.job and use order by in query + query = [ + ('action', '=', 'kurang beli') + ] + jobs = self.env['v.purchasing.job'].search(query) + count = 0 + for job in jobs: + qty_purchase = job.outgoing - job.onhand + job.incoming + qty_available = job.onhand + job.incoming - job.outgoing + + domain = [ + ('product_id.id', '=', job.product_id.id), + ] + orderby = 'count_trx_po desc, count_trx_po_vendor desc' + purchase_pricelist = self.env['purchase.pricelist'].search(domain, order=orderby, limit=1) + + vendor_id = purchase_pricelist.vendor_id + price = self._get_valid_purchase_price(purchase_pricelist) + last_po_line = self.env['purchase.order.line'].search([('product_id', '=', job.product_id.id), ('order_id.state', '=', 'done')], order='id desc', limit=1) + + self.env['automatic.purchase.line'].create([{ + 'automatic_purchase_id': self.id, + 'product_id': job.product_id.id, + 'qty_purchase': qty_purchase, + 'qty_available': qty_available, + 'partner_id': vendor_id.id, + 'last_price': price, + 'subtotal': qty_purchase * price, + 'last_order_id': last_po_line.order_id.id, + 'last_orderline_id': last_po_line.id, + 'brand_id': job.product_id.product_tmpl_id.x_manufacture.id + }]) + count += 1 + _logger.info('Create Automatic Purchase Line %s' % job.product_id.name) + self.notification = "Automatic PO Created %s Lines" % count + print(1) + def generate_automatic_purchase(self): # for reordering rule only + if self.apo_type == 'regular': + raise UserError('Tombol ini hanya untuk Reordering Rule') if self.purchase_lines: raise UserError('Sudah digenerate sebelumnya, hapus line terlebih dahulu') @@ -187,6 +235,11 @@ class AutomaticPurchaseLine(models.Model): current_po_line_id = fields.Many2one('purchase.order.line', string='Current Line') brand_id = fields.Many2one('x_manufactures', string='Brand') + @api.onchange('last_price', 'qty_purchase') + def _calculate_subtotal(self): + for line in self: + line.subtotal = line.qty_purchase * line.last_price + class AutomaticPurchaseMatch(models.Model): _name = 'automatic.purchase.match' @@ -201,3 +254,15 @@ class AutomaticPurchaseMatch(models.Model): for match in self: match.vendor = match.order_id.partner_id.name match.total = match.order_id.amount_total + + +class AutomaticPurchaseSalesMatch(models.Model): + _name = 'automatic.purchase.sales.match' + _order = 'automatic_purchase_id, id' + + automatic_purchase_id = fields.Many2one('automatic.purchase', string='Ref', required=True, ondelete='cascade', index=True, copy=False) + sale_id = fields.Many2one('sale.order', string='SO') + partner_id = fields.Many2one('res.partner', string='Customer') + salesperson_id = fields.Many2one('res.user', string='Sales') + product_id = fields.Many2one('product.product', string='Product') + qty_so = fields.Float(string='Qty') diff --git a/indoteknik_custom/security/ir.model.access.csv b/indoteknik_custom/security/ir.model.access.csv index 6dfa3ee4..6ba720c2 100755 --- a/indoteknik_custom/security/ir.model.access.csv +++ b/indoteknik_custom/security/ir.model.access.csv @@ -85,4 +85,5 @@ access_customer_rebate,access.customer.rebate,model_customer_rebate,,1,1,1,1 access_wati_history,access.wati.history,model_wati_history,,1,1,1,1 access_wati_history_line,access.wati.history.line,model_wati_history_line,,1,1,1,1 access_v_purchasing_job,access.v.purchasing.job,model_v_purchasing_job,,1,1,1,1 -access_purchasing_job_multi_update,access.purchasing.job.multi.update,model_purchasing_job_multi_update,,1,1,1,1
\ No newline at end of file +access_purchasing_job_multi_update,access.purchasing.job.multi.update,model_purchasing_job_multi_update,,1,1,1,1 +access_automatic_purchase_sales_match,access.automatic.purchase.sales.match,model_automatic_purchase_sales_match,,1,1,1,1
\ No newline at end of file diff --git a/indoteknik_custom/views/automatic_purchase.xml b/indoteknik_custom/views/automatic_purchase.xml index 6f10653f..58184d63 100644 --- a/indoteknik_custom/views/automatic_purchase.xml +++ b/indoteknik_custom/views/automatic_purchase.xml @@ -21,18 +21,32 @@ <field name="name">automatic.purchase.line.tree</field> <field name="model">automatic.purchase.line</field> <field name="arch" type="xml"> - <tree> + <tree editable="bottom"> <field name="brand_id"/> <field name="product_id"/> - <field name="qty_purchase"/> - <field name="qty_min"/> - <field name="qty_max"/> + <field name="qty_min" optional="hide"/> + <field name="qty_max" optional="hide"/> <field name="qty_available"/> + <field name="qty_purchase"/> <field name="partner_id"/> <field name="last_price"/> <field name="subtotal"/> - <field name="last_order_id" readonly="1"/> - <field name="current_po_line_id" readonly="1"/> + <field name="last_order_id" readonly="1" optional="hide"/> + <field name="current_po_line_id" readonly="1" optional="hide"/> + </tree> + </field> + </record> + + <record id="automatic_purchase_sales_match_tree" model="ir.ui.view"> + <field name="name">automatic.purchase.sales.match.tree</field> + <field name="model">automatic.purchase.sales.match</field> + <field name="arch" type="xml"> + <tree> + <field name="sale_id" readonly="1"/> + <field name="partner_id" readonly="1"/> + <field name="salesperson_id" readonly="1"/> + <field name="product_id" readonly="1"/> + <field name="qty_so" readonly="1"/> </tree> </field> </record> @@ -59,7 +73,7 @@ <group> <group> <field name="number"/> - <field name="apo_type"/> + <field name="apo_type" required="1"/> <field name="vendor_id"/> <field name="description"/> </group> @@ -68,10 +82,19 @@ <field name="responsible_id"/> <div> <button name="generate_automatic_purchase" - string="Generate Line" + string="Generate Reordering" type="object" class="mr-2 oe_highlight" /> + </div> + <div> + <button name="generate_regular_purchase" + string="Generate Fulfillment" + type="object" + class="mr-2 oe_highlight" + /> + </div> + <div> <button name="create_po_from_automatic_purchase" string="Create PO" type="object" @@ -84,7 +107,10 @@ <page string="Lines"> <field name="purchase_lines"/> </page> - <page string="Matches"> + <page string="Matches SO"> + <field name="sales_match"/> + </page> + <page string="Matches PO"> <field name="purchase_match"/> </page> <page string="Info" name="automatic_purchase_info"> |
