summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--indoteknik_custom/models/automatic_purchase.py71
-rwxr-xr-xindoteknik_custom/security/ir.model.access.csv3
-rw-r--r--indoteknik_custom/views/automatic_purchase.xml44
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">