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
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
|
from odoo import fields, models, api, _
from odoo.exceptions import AccessError, UserError, ValidationError
class PurchaseOrder(models.Model):
_inherit = 'purchase.order'
sale_order_id = fields.Many2one('sale.order', string='Sale Order')
procurement_status = fields.Char(string='Procurement Status', compute='get_procurement_status', readonly=True)
approval_status = fields.Selection([
('pengajuan1', 'Approval Manager'), #siapa? darren - 11
('pengajuan2', 'Approval Pimpinan'), #akbar - 7 temporary not used
('approved', 'Approved'),
], string='Approval Status', readonly=True, copy=False, index=True, tracking=3)
count_line_product = fields.Float('Count Line Product', compute='compute_count_line_product')
delivery_amount = fields.Float('Delivery Amount', compute='compute_delivery_amount')
def get_procurement_status(self):
for purchase_order in self:
product_uom_qty = sum_qty_received = 0
for order_line in purchase_order.order_line:
product_uom_qty += order_line.product_uom_qty
sum_qty_received += order_line.qty_received
if product_uom_qty == sum_qty_received:
status = 'Terproses'
elif product_uom_qty > sum_qty_received > 0:
status = 'Sebagian Diproses'
else:
status = 'Menunggu Diproses'
purchase_order.procurement_status = status
def sale_order_sync(self):
if not self.sale_order_id:
return
purchase_orders = self.search(['&', ('sale_order_id', '=', self.sale_order_id.id), ('id', '!=', self.id)])
products_exception = []
for purchase_order in purchase_orders:
for order_line in purchase_order.order_line:
products_exception.append(order_line.product_id.id)
self.order_line.unlink()
for order_line in self.sale_order_id.order_line:
if order_line.product_id.id and order_line.product_id.id not in products_exception:
values = {
'order_id': self.id,
'product_id': order_line.product_id.id,
'name': order_line.product_id.display_name,
'product_qty': order_line.product_qty,
}
self.env['purchase.order.line'].sudo().create(values)
def compute_count_line_product(self):
for order in self:
count = 0
for line in order.order_line:
if line.product_id.type == 'product':
count += 1
if count == 0:
order.count_line_product = 1
else:
order.count_line_product = count
def compute_delivery_amount(self):
for order in self:
amount = 0
for line in order.order_line:
if line.product_id.type == 'service':
amount += line.price_total
order.delivery_amount = amount
def button_confirm(self):
res = super(PurchaseOrder, self).button_confirm()
for line in self.order_line:
if not line.product_id:
continue
if line.product_id.type == 'service' and self.env.user.id != 6:
raise UserError("Ada tambahan Ongkos kirim, harus Approval Manager")
sale_order_line = self.env['sale.order.line'].search(
[('product_id', '=', line.product_id.id),
('order_id', '=', line.order_id.sale_order_id.id)], limit=1, order='price_reduce_taxexcl')
est_purchase_price = sale_order_line.purchase_price
real_purchase_price = line.price_unit
real_tax = real_tax_amount = count_real_tax = 0
for tax in line.taxes_id:
count_real_tax += 1
real_tax = tax
real_tax_amount += tax.amount
if (sale_order_line.purchase_tax_id.amount != real_tax_amount or count_real_tax > 1 \
or real_tax.price_include != sale_order_line.purchase_tax_id.price_include) \
and (self.env.user.id != 6 and self.env.user.id != 7):
raise UserError("Beda tax amount dengan Sales, harus Approval Manager")
elif est_purchase_price < real_purchase_price and self.env.user.id != 6 and self.env.user.id != 7:
raise UserError("Beda Price dengan Sales, harus Approval Manager")
# elif line.product_id.type == 'service' and self.env.user_id != 6:
# raise UserError("Ada tambahan Ongkos kirim, harus Approval Manager")
self.approval_status = 'approved'
return res
def po_approve(self):
approval = 0
for line in self.order_line:
if not line.product_id:
continue
elif line.product_id.type == 'service' and self.env.user.id != 6:
approval += 1
else:
sale_order_line = self.env['sale.order.line'].search(
[('product_id', '=', line.product_id.id),
('order_id', '=', line.order_id.sale_order_id.id)], limit=1, order='price_reduce_taxexcl')
est_purchase_price = sale_order_line.purchase_price
real_purchase_price = line.price_unit
real_tax = real_tax_amount = count_real_tax = 0
for tax in line.taxes_id:
count_real_tax += 1
real_tax = tax
real_tax_amount += tax.amount
if (sale_order_line.purchase_tax_id.amount != real_tax_amount or count_real_tax > 1 \
or real_tax.price_include != sale_order_line.purchase_tax_id.price_include) \
and (self.env.user.id != 6 and self.env.user.id != 7):
approval += 1
elif est_purchase_price != real_purchase_price and self.env.user.id != 6 and self.env.user.id != 7:
approval += 1
elif line.product_id.type == 'service' and self.env.user.id != 6 and self.env.user.id != 7:
approval += 1
if approval > 0:
self.approval_status = "pengajuan1"
else:
raise UserError("Bisa langsung Confirm")
def button_cancel(self):
res = super(PurchaseOrder, self).button_cancel()
self.approval_status = False
return res
|