summaryrefslogtreecommitdiff
path: root/indoteknik_custom/models/advance_payment_request.py
diff options
context:
space:
mode:
Diffstat (limited to 'indoteknik_custom/models/advance_payment_request.py')
-rw-r--r--indoteknik_custom/models/advance_payment_request.py110
1 files changed, 104 insertions, 6 deletions
diff --git a/indoteknik_custom/models/advance_payment_request.py b/indoteknik_custom/models/advance_payment_request.py
index ed0b0809..039d18a5 100644
--- a/indoteknik_custom/models/advance_payment_request.py
+++ b/indoteknik_custom/models/advance_payment_request.py
@@ -155,6 +155,18 @@ class AdvancePaymentRequest(models.Model):
compute='_compute_is_current_user_ap'
)
+ estimate_line_ids = fields.One2many('advance.payment.request.estimate.line', 'request_id', string='Rincian Estimasi')
+
+ @api.constrains('nominal', 'estimate_line_ids')
+ def _check_nominal_vs_estimate_total(self):
+ for rec in self:
+ if rec.type_request == 'pum':
+ if not rec.estimate_line_ids:
+ raise UserError("Rincian estimasi wajib diisi untuk PUM. Silakan tambahkan rincian estimasi.")
+ total_estimate = sum(line.nominal for line in rec.estimate_line_ids)
+ if round(total_estimate, 2) != round(rec.nominal, 2):
+ raise UserError("Total estimasi harus sama dengan nominal PUM. Silakan sesuaikan rincian estimasi atau nominal PUM.")
+
@api.onchange('grand_total_reimburse', 'type_request')
def _onchange_reimburse_line_update_nominal(self):
if self.type_request == 'reimburse':
@@ -641,10 +653,16 @@ class AdvancePaymentRequest(models.Model):
today = date.today()
for rec in self:
- current_days = rec.days_remaining or 0
- current_due_date = rec.estimated_return_date or False
- if rec.type_request == 'pum':
- is_settlement_approved = any(s.status == 'approved' for s in rec.settlement_ids)
+ # current_days = rec.days_remaining or 0
+ # current_due_date = rec.estimated_return_date or False
+ current_days = 0
+ current_due_date = False
+
+ is_settlement_approved = any(s.status == 'approved' for s in rec.settlement_ids)
+ is_pum_canceled = (rec.status == 'cancel')
+
+ if rec.type_request == 'pum' and not is_pum_canceled and not is_settlement_approved:
+
if not is_settlement_approved:
due_date = False
@@ -745,7 +763,7 @@ class AdvancePaymentRequest(models.Model):
pum_ids = self.search([
('user_id', '=', user.id),
- ('status', '!=', 'reject'),
+ ('status', '!=', 'cancel'),
('type_request', '=', 'pum')
])
@@ -905,6 +923,35 @@ class AdvancePaymentUsageLine(models.Model):
compute='_compute_is_current_user_ap'
)
+ category_usage = fields.Selection([
+ ('parkir', 'Parkir'),
+ ('tol', 'Tol'),
+ ('bbm', 'BBM'),
+ ('kuli', 'Kuli'),
+ ('konsumsi', 'Konsumsi'),
+ ('lain_lain', 'Lain-lain'),
+ ], string='Kategori System', compute='_compute_category_usage')
+
+ @api.depends('account_id')
+ def _compute_category_usage(self):
+ for rec in self:
+ if not rec.account_id:
+ rec.category_usage = False
+ continue
+ name = rec.account_id.name.lower()
+ if 'bbm' in name or 'bahan bakar' in name:
+ rec.category_usage = 'bbm'
+ elif 'tol' in name:
+ rec.category_usage = 'tol'
+ elif 'parkir' in name:
+ rec.category_usage = 'parkir'
+ elif 'kuli' in name or 'bongkar' in name:
+ rec.category_usage = 'kuli'
+ elif 'konsumsi' in name or 'makan' in name or 'minum' in name:
+ rec.category_usage = 'konsumsi'
+ else:
+ rec.category_usage = 'lain_lain'
+
def _compute_is_current_user_ap(self):
ap_user_ids = [23, 9468, 16729]
is_ap = self.env.user.id in ap_user_ids
@@ -1138,6 +1185,11 @@ class AdvancePaymentSettlement(models.Model):
string="Is Current User AP",
compute='_compute_is_current_user_ap'
)
+ pum_estimate_line_ids = fields.One2many(
+ related='pum_id.estimate_line_ids',
+ string='Rincian Estimasi PUM',
+ readonly=True
+ )
def _compute_is_current_user_ap(self):
ap_user_ids = [23, 9468, 16729]
@@ -1606,4 +1658,50 @@ class CreateReimburseCabWizard(models.TransientModel):
'type': 'ir.actions.act_window',
'res_id': move.id,
'target': 'current',
- } \ No newline at end of file
+ }
+
+class AdvancePaymentRequestEstimateLine(models.Model):
+ _name = 'advance.payment.request.estimate.line'
+ _description = 'Advance Payment Request Estimate Line'
+
+ request_id = fields.Many2one('advance.payment.request', string='Request')
+ category_estimate = fields.Selection([
+ ('parkir', 'Parkir'),
+ ('tol', 'Tol'),
+ ('bbm', 'BBM'),
+ ('kuli', 'Kuli'),
+ ('konsumsi', 'Konsumsi'),
+ ('lain_lain', 'Lain-lain'),
+ ], string='Kategori Estimasi', required=True)
+ description = fields.Text(string='Description', help='Deskripsi tambahan untuk estimasi biaya yang diperlukan.')
+ nominal = fields.Float(string='Nominal Estimasi', required=True, help='Masukkan nominal estimasi untuk kategori ini (tidak mesti akurat, hanya untuk gambaran umum).')
+ currency_id = fields.Many2one(related='request_id.currency_id')
+
+ total_actual = fields.Float(string='Nominal Realisasi', compute='_compute_actual_data')
+ frequency = fields.Integer(string='Qty Realisasi', compute='_compute_actual_data')
+
+ @api.depends('request_id.settlement_ids.penggunaan_line_ids.nominal',
+ 'request_id.settlement_ids.penggunaan_line_ids.account_id')
+ def _compute_actual_data(self):
+ for rec in self:
+ total_act = 0
+ freq = 0
+ if rec.request_id and rec.request_id.settlement_ids:
+ all_usage_lines = rec.request_id.settlement_ids.mapped('penggunaan_line_ids')
+ valid_lines = all_usage_lines.filtered(lambda l: l.account_id and l.category_usage)
+ planned_category = rec.request_id.estimate_line_ids.mapped('category_estimate')
+ if rec.category_estimate == 'lain_lain':
+ matched_lines = valid_lines.filtered(
+ lambda l: l.category_usage == 'lain_lain' or \
+ l.category_usage not in planned_category
+ )
+ else:
+ matched_lines = valid_lines.filtered(
+ lambda l: l.category_usage == rec.category_estimate
+ )
+
+ total_act = sum(matched_lines.mapped('nominal'))
+ freq = len(matched_lines)
+ rec.total_actual = total_act
+ rec.frequency = freq
+