summaryrefslogtreecommitdiff
path: root/fixco_custom/models/purchasing_job.py
blob: 2c7138a0f7affb871c1518df11d6908a51bb46fa (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
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()