summaryrefslogtreecommitdiff
path: root/fixco_custom/models/manage_stock.py
blob: e654b4ea7ff3dc0b7e996f648826aa1b88e40d68 (plain)
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',
        }