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
|
from odoo import models, api, fields
from odoo.exceptions import AccessError, UserError, ValidationError
from datetime import timedelta, date, datetime
import logging
_logger = logging.getLogger(__name__)
class ApprovalPaymentTerm(models.Model):
_name = "approval.payment.term"
_description = "Approval Payment Term"
_inherit = ['mail.thread']
_rec_name = 'number'
number = fields.Char(string='Document No', index=True, copy=False, readonly=True, tracking=True)
partner_id = fields.Many2one('res.partner', string='Partner', copy=False)
property_payment_term_id = fields.Many2one('account.payment.term', string='Payment Term', copy=False, tracking=True)
parent_id = fields.Many2one('res.partner', string='Related Company', copy=False)
blocking_stage = fields.Float(string='Blocking Amount',
help="Cannot make sales once the selected "
"customer is crossed blocking amount."
"Set its value to 0.00 to disable "
"this feature", tracking=True, copy=False)
warning_stage = fields.Float(string='Warning Amount',
help="A warning message will appear once the "
"selected customer is crossed warning "
"amount. Set its value to 0.00 to"
" disable this feature", tracking=True, copy=False)
active_limit = fields.Boolean('Active Credit Limit', copy=False, tracking=True)
approve_sales_manager = fields.Boolean('Approve Sales Manager', tracking=True, copy=False)
approve_finance = fields.Boolean('Approve Finance', tracking=True, copy=False)
approve_leader = fields.Boolean('Approve Pimpinan', tracking=True, copy=False)
reason = fields.Text('Reason', tracking=True)
approve_date = fields.Datetime('Approve Date')
state = fields.Selection([('waiting_approval', 'Waiting Approval'), ('approved', 'Approved'), ('rejected', 'Rejected')], default='waiting_approval', tracking=True)
reason_reject = fields.Selection([('reason1', 'Reason 1'), ('reason2', 'Reason 2'), ('reason3', 'Reason 3')], string='Reason Reject', tracking=True)
sale_order_ids = fields.Many2many(
'sale.order',
string='Sale Orders',
copy=False,
tracking=True
)
total = fields.Char(
string='Sale Order Totals',
compute='_compute_total'
)
grand_total = fields.Float(string='Grand Total', compute="_compute_grand_total")
def _compute_grand_total(self):
for rec in self:
grand_total = sum(order.amount_total for order in rec.sale_order_ids)
rec.grand_total = grand_total
def _compute_total(self):
for rec in self:
totals_list = []
for order in rec.sale_order_ids:
formatted_total = "{:,.2f}".format(order.amount_total)
totals_list.append(f"{order.name}: {formatted_total}")
rec.total = "\n".join(totals_list) if totals_list else "No Sale Orders"
@api.constrains('partner_id')
def constrains_partner_id(self):
if self.partner_id:
self.parent_id = self.partner_id.parent_id.id if self.partner_id.parent_id else None
self.blocking_stage = self.partner_id.blocking_stage
self.warning_stage = self.partner_id.warning_stage
self.active_limit = self.partner_id.active_limit
self.property_payment_term_id = self.partner_id.property_payment_term_id.id
def button_approve(self):
user = self.env.user
is_it = user.has_group('indoteknik_custom.group_role_it')
if (not user.id ==7 and user.id == 19 and not self.approve_sales_manager) or is_it:
self.approve_sales_manager = True
return
if (not user.id ==7 and user.id == 688 and not self.approve_finance) or is_it:
self.approve_finance = True
return
if (user.id == 7 and self.approve_finance) or is_it:
self.approve_leader = True
if not self.approve_finance and not is_it:
raise UserError('Harus Approval Finance!!')
if not self.approve_leader and not is_it:
raise UserError('Harus Approval Pimpinan!!')
if user.id == 7:
if not self.approve_finance:
raise UserError('Belum Di Approve Oleh Finance')
if self.approve_leader == True:
self.partner_id.write({
'blocking_stage': self.blocking_stage,
'warning_stage': self.warning_stage,
'active_limit': self.active_limit,
'property_payment_term_id': self.property_payment_term_id.id
})
self.approve_date = datetime.utcnow()
self.state = 'approved'
def button_reject(self):
if self.env.user.id not in [688, 7]:
raise UserError("Hanya Finance atau Pimpinan Yang Bisa Reject")
self.state = 'rejected'
@api.model
def create(self, vals):
vals['number'] = self.env['ir.sequence'].next_by_code('approval.payment.term') or '0'
result = super(ApprovalPaymentTerm, self).create(vals)
return result
|