1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
|
from odoo import models, fields, tools
from odoo.exceptions import AccessError, UserError, ValidationError
from datetime import timedelta, date
class PurchasingJob(models.Model):
_name = 'purchasing.job'
_description = 'Procurement Monitoring by Product'
_auto = False
_rec_name = 'product'
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')
action = fields.Char(string='Action')
product_id = fields.Many2one('product.product', string='Product')
vendor_id = fields.Many2one('res.partner', string='Vendor')
brand_id = fields.Many2one('brands', string='Brand')
def create_automatic_purchase(self):
if not self:
raise UserError("No Purchasing Job selected.")
automatic_purchase = self.env['automatic.purchase'].create({
'apo_type': 'purchasing_job',
})
lines_to_create = []
for stock in self:
manage_stock = self.env['manage.stock'].search([
('product_id', '=', stock.product_id.id)
], limit=1)
qty_purchase = stock.outgoing - (stock.onhand + stock.incoming)
qty_purchase = max(qty_purchase, 0.0)
pricelist = self.env['purchase.pricelist'].search([
('product_id', '=', stock.product_id.id),
('vendor_id', '=', stock.vendor_id.id)
], limit=1)
price = pricelist.price if pricelist else 0.0
subtotal = qty_purchase * price
lines_to_create.append({
'automatic_purchase_id': automatic_purchase.id,
'product_id': stock.product_id.id,
'qty_purchase': qty_purchase,
'qty_min': manage_stock.min_stock,
'qty_buffer': manage_stock.buffer_stock,
'partner_id': stock.vendor_id.id,
'taxes_id': stock.vendor_id.tax_id.id if stock.vendor_id.tax_id else False,
'price': price,
'brand_id': stock.brand_id.id,
'product_public_category_id': stock.product_id.product_public_category_id.id,
})
self.env['automatic.purchase.line'].create(lines_to_create)
return {
'type': 'ir.actions.act_window',
'res_model': 'automatic.purchase',
'view_mode': 'form',
'res_id': automatic_purchase.id,
'target': 'current',
}
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()
|