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