summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIndoteknik . <it@fixcomart.co.id>2025-07-12 11:29:35 +0700
committerIndoteknik . <it@fixcomart.co.id>2025-07-12 11:29:35 +0700
commitd23611b8e7e97b86e54100949457ca86858d2e86 (patch)
tree3744290efaa7039056e723bafd56f29f8212985a
parent6f4d19cd6985790414b06678fe2147c431caed9e (diff)
parentf6d21f2f6a8bbc597e70aa07a4f6c2fc43b4c176 (diff)
Merge branch 'odoo-backup' of https://bitbucket.org/altafixco/indoteknik-addons into odoo-backup
-rw-r--r--indoteknik_custom/models/approval_payment_term.py72
-rw-r--r--indoteknik_custom/views/approval_payment_term.xml13
2 files changed, 78 insertions, 7 deletions
diff --git a/indoteknik_custom/models/approval_payment_term.py b/indoteknik_custom/models/approval_payment_term.py
index 6e1c8103..025f9ed4 100644
--- a/indoteknik_custom/models/approval_payment_term.py
+++ b/indoteknik_custom/models/approval_payment_term.py
@@ -31,7 +31,13 @@ class ApprovalPaymentTerm(models.Model):
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)
+ state = fields.Selection([
+ ('waiting_approval_sales_manager', 'Waiting Approval Sales Manager'),
+ ('waiting_approval_finance', 'Waiting Approval Finance'),
+ ('waiting_approval_leader', 'Waiting Approval Leader'),
+ ('approved', 'Approved'),
+ ('rejected', 'Rejected')],
+ default='waiting_approval_sales_manager', 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',
@@ -47,6 +53,68 @@ class ApprovalPaymentTerm(models.Model):
grand_total = fields.Float(string='Grand Total', compute="_compute_grand_total")
+ change_log_688 = fields.Text(string="Change Log", readonly=True, copy=False)
+
+ def write(self, vals):
+ # Ambil nilai lama sebelum perubahan
+ old_values_dict = {
+ rec.id: rec.read(vals.keys())[0]
+ for rec in self
+ }
+
+ res = super().write(vals)
+
+ self._track_changes_for_user_688(vals, old_values_dict)
+ return res
+
+ def _track_changes_for_user_688(self, vals, old_values_dict):
+ if self.env.user.id != 688:
+ return
+
+ for rec in self:
+ changes = []
+ old_values = old_values_dict.get(rec.id, {})
+
+ for field_name, new_value in vals.items():
+ if field_name not in rec._fields or field_name == 'change_log_688':
+ continue
+
+ field = rec._fields[field_name]
+ old_value = old_values.get(field_name)
+
+ field_label = field.string # Ambil label user-friendly
+
+ # Relational field
+ if field.type == 'many2one':
+ old_id = old_value[0] if old_value else False
+ is_different = old_id != new_value
+ if is_different:
+ old_display = old_value[1] if old_value else 'False'
+ new_display = rec.env[field.comodel_name].browse(new_value).display_name if new_value else 'False'
+ changes.append(f"[{field_label}] dari '{old_display}' ke '{new_display}'")
+
+ else:
+ # Float khusus
+ if field.type == 'float':
+ is_different = not self._float_equal(old_value, new_value)
+ else:
+ is_different = old_value != new_value
+
+ if is_different:
+ changes.append(f"[{field_label}] dari '{old_value}' ke '{new_value}'")
+
+ if changes:
+ timestamp = fields.Datetime.now().strftime('%Y-%m-%d %H:%M:%S')
+ rec.change_log_688 = f"{timestamp} - Perubahan oleh Widya:\n" + "\n".join(changes)
+
+
+ @staticmethod
+ def _float_equal(val1, val2, eps=1e-6):
+ try:
+ return abs(float(val1 or 0.0) - float(val2 or 0.0)) < eps
+ except Exception:
+ return False
+
def _compute_grand_total(self):
for rec in self:
grand_total = sum(order.amount_total for order in rec.sale_order_ids)
@@ -77,10 +145,12 @@ class ApprovalPaymentTerm(models.Model):
if (not user.id ==7 and user.id == 19 and not self.approve_sales_manager) or is_it:
self.approve_sales_manager = True
+ self.state = 'waiting_approval_finance'
return
if (not user.id ==7 and user.id == 688 and not self.approve_finance) or is_it:
self.approve_finance = True
+ self.state = 'waiting_approval_leader'
return
if (user.id == 7 and self.approve_finance) or is_it:
diff --git a/indoteknik_custom/views/approval_payment_term.xml b/indoteknik_custom/views/approval_payment_term.xml
index e785b72a..cc9db914 100644
--- a/indoteknik_custom/views/approval_payment_term.xml
+++ b/indoteknik_custom/views/approval_payment_term.xml
@@ -9,18 +9,19 @@
<field name="partner_id"/>
<field name="parent_id"/>
<field name="property_payment_term_id"/>
+ <field name="create_date" optional="hide"/>
<field name="approve_date" optional="hide"/>
<field name="approve_sales_manager" optional="hide"/>
<field name="approve_finance" optional="hide"/>
<field name="approve_leader" optional="hide"/>
- <field name="create_date" optional="hide"/>
<field name="create_uid" optional="hide"/>
<field name="sale_order_ids" optional="hide" widget="many2many_tags"/>
<field name="total" optional="hide"/>
<field name="grand_total" optional="hide"/>
<field name="state" widget="badge" decoration-danger="state == 'rejected'"
decoration-success="state == 'approved'"
- decoration-info="state == 'waiting_approval'"/>
+ decoration-info="state in ['waiting_approval_sales_manager', 'waiting_approval_finance', 'waiting_approval_leader']"/>
+ <field name="change_log_688" optional="hide"/>
</tree>
</field>
</record>
@@ -51,10 +52,10 @@
<field name="number" readonly="1"/>
<field name="partner_id"/>
<field name="parent_id" readonly="1"/>
- <field name="blocking_stage" attrs="{'readonly': [('number', '=', False), ('state', 'in', ['approved','rejected'])]}"/>
- <field name="warning_stage" attrs="{'readonly': [('number', '=', False), ('state', 'in', ['approved','rejected'])]}"/>
- <field name="property_payment_term_id" attrs="{'readonly': [('number', '=', False), ('state', 'in', ['approved','rejected'])]}"/>
- <field name="active_limit" attrs="{'readonly': [('number', '=', False), ('state', 'in', ['approved','rejected'])]}"/>
+ <field name="blocking_stage" attrs="{'readonly': ['|', ('number', '=', False), ('state', 'in', ['approved','rejected'])]}"/>
+ <field name="warning_stage" attrs="{'readonly': ['|', ('number', '=', False), ('state', 'in', ['approved','rejected'])]}"/>
+ <field name="property_payment_term_id" attrs="{'readonly': ['|', ('number', '=', False), ('state', 'in', ['approved','rejected'])]}"/>
+ <field name="active_limit" attrs="{'readonly': ['|', ('number', '=', False), ('state', 'in', ['approved','rejected'])]}"/>
</group>
<group>
<field name="reason"/>