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
|
from odoo import models, api, fields
from odoo.exceptions import AccessError, UserError, ValidationError
from datetime import timedelta, date
import logging
_logger = logging.getLogger(__name__)
class ManageStock(models.Model):
_name = "manage.stock"
_description = "Manage Stock"
_inherit = ['mail.thread']
_rec_name = 'product_id'
product_id = fields.Many2one('product.product', string="Product", required=True)
min_stock = fields.Float(string='Min Stock', required=True)
buffer_stock = fields.Float(string='Buffer Stock', required=True)
vendor_id = fields.Many2one('res.partner', string="Vendor", required=True)
qty_available = fields.Float(string='Qty Available', compute='_compute_qty_available')
qty_onhand = fields.Float(string='Qty Onhand', compute='_compute_qty_available')
_sql_constraints = [
('product_unique', 'unique (product_id)', 'This product already has a stock management rule!'),
]
def _compute_qty_available(self):
for record in self:
quant_records = self.env['stock.quant'].search([
('product_id', '=', record.product_id.id),
# ('id','in', [80,81]),
('location_id', '=', 55)
])
total_available = quant_records.available_quantity or 0.0
total_onhand = quant_records.quantity or 0.0
record.qty_available = total_available
record.qty_onhand = total_onhand
def create_automatic_purchase(self):
if not self:
raise UserError("No stock records selected.")
automatic_purchase = self.env['automatic.purchase'].create({
'apo_type': 'reordering',
})
lines_to_create = []
for stock in self:
location_id = 55
quant_records = self.env['stock.quant'].search([
('product_id', '=', stock.product_id.id),
('location_id', '=', location_id)
])
total_available = quant_records.quantity or 0.0
qty_incoming = stock.product_id.incoming_qty or 0.0
qty_purchase = stock.buffer_stock - (total_available + qty_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': stock.min_stock,
'qty_buffer': 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,
'subtotal': subtotal,
})
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',
}
|