summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiqdad <ahmadmiqdad27@gmail.com>2025-09-23 08:32:19 +0700
committerMiqdad <ahmadmiqdad27@gmail.com>2025-09-23 08:32:19 +0700
commitfca5c08671169703d935161fc4bb0c5c05548a62 (patch)
treece2082be6373a08e6932ed17a6c8436539dd2113
parentf58e6e2fa013789bfa8ac8456cd29735a83a56d0 (diff)
<Miqdad> fix validation error when creating SO in midnight
-rwxr-xr-xindoteknik_custom/models/sale_order.py88
1 files changed, 66 insertions, 22 deletions
diff --git a/indoteknik_custom/models/sale_order.py b/indoteknik_custom/models/sale_order.py
index 39830ffc..02ceb62b 100755
--- a/indoteknik_custom/models/sale_order.py
+++ b/indoteknik_custom/models/sale_order.py
@@ -1700,57 +1700,101 @@ class SaleOrder(models.Model):
# .format(eta_minimum.strftime('%d-%m-%Y'), eta_minimum.strftime('%d-%m-%Y'))
# )
+ # def _validate_expected_ready_ship_date(self):
+ # """
+ # Pastikan expected_ready_to_ship tidak lebih awal dari SLA minimum.
+ # Dipanggil setiap onchange / simpan SO.
+ # """
+ # for rec in self:
+ # # ─────────────────────────────────────────────────────
+ # # 1. Hanya validasi kalau field sudah terisi
+ # # (quotation baru / belum ada tanggal → abaikan)
+ # # ─────────────────────────────────────────────────────
+ # if not rec.expected_ready_to_ship:
+ # continue
+ #
+ # current_date = datetime.now()
+ #
+ # # ─────────────────────────────────────────────────────
+ # # 2. Hitung SLA berdasarkan product lines (jika ada)
+ # # ─────────────────────────────────────────────────────
+ # products = rec.order_line
+ # if products:
+ # sla_data = rec.calculate_sla_by_vendor(products)
+ # max_sla_time = sla_data.get('slatime', 1)
+ # else:
+ # # belum ada item → gunakan default 1 hari
+ # max_sla_time = 1
+ #
+ # # offset hari libur / weekend
+ # offset, is3pm = rec.get_days_until_next_business_day(current_date)
+ # min_days = max_sla_time + offset - 1
+ # eta_minimum = current_date + timedelta(days=min_days)
+ #
+ # # ─────────────────────────────────────────────────────
+ # # 3. Validasi - raise error bila terlalu cepat
+ # # ─────────────────────────────────────────────────────
+ # if rec.expected_ready_to_ship.date() < eta_minimum.date():
+ # # set otomatis ke tanggal minimum supaya user tidak perlu
+ # # menekan Save dua kali
+ # rec.expected_ready_to_ship = eta_minimum
+ #
+ # raise ValidationError(
+ # _("Tanggal 'Expected Ready to Ship' tidak boleh "
+ # "lebih kecil dari %(tgl)s. Mohon pilih minimal %(tgl)s.")
+ # % {'tgl': eta_minimum.strftime('%d-%m-%Y')}
+ # )
+ # else:
+ # # sinkronkan ke field commitment_date
+ # rec.commitment_date = rec.expected_ready_to_ship
+
def _validate_expected_ready_ship_date(self):
"""
Pastikan expected_ready_to_ship tidak lebih awal dari SLA minimum.
Dipanggil setiap onchange / simpan SO.
"""
for rec in self:
- # ─────────────────────────────────────────────────────
- # 1. Hanya validasi kalau field sudah terisi
- # (quotation baru / belum ada tanggal → abaikan)
- # ─────────────────────────────────────────────────────
if not rec.expected_ready_to_ship:
continue
- current_date = datetime.now()
+ # ADDED: gunakan "sekarang" lokal user, bukan datetime.now() server
+ current_date = fields.Datetime.context_timestamp(rec, fields.Datetime.now())
- # ─────────────────────────────────────────────────────
- # 2. Hitung SLA berdasarkan product lines (jika ada)
- # ─────────────────────────────────────────────────────
+ # Hitung SLA
products = rec.order_line
if products:
sla_data = rec.calculate_sla_by_vendor(products)
max_sla_time = sla_data.get('slatime', 1)
else:
- # belum ada item → gunakan default 1 hari
max_sla_time = 1
- # offset hari libur / weekend
+ # offset hari libur/weekend
offset, is3pm = rec.get_days_until_next_business_day(current_date)
min_days = max_sla_time + offset - 1
eta_minimum = current_date + timedelta(days=min_days)
- # ─────────────────────────────────────────────────────
- # 3. Validasi - raise error bila terlalu cepat
- # ─────────────────────────────────────────────────────
- if rec.expected_ready_to_ship.date() < eta_minimum.date():
- # set otomatis ke tanggal minimum supaya user tidak perlu
- # menekan Save dua kali
- rec.expected_ready_to_ship = eta_minimum
+ if rec._fields['expected_ready_to_ship'].type == 'date':
+ exp_date_local = rec.expected_ready_to_ship
+ else:
+ exp_date_local = fields.Datetime.context_timestamp(
+ rec, rec.expected_ready_to_ship
+ ).date()
+
+ if exp_date_local < eta_minimum.date():
+ # (opsional) auto-set ke minimum → konversi balik ke UTC naive bila field Datetime
+ if rec._fields['expected_ready_to_ship'].type == 'date':
+ rec.expected_ready_to_ship = eta_minimum.date()
+ else:
+ rec.expected_ready_to_ship = eta_minimum.astimezone(pytz.UTC).replace(tzinfo=None)
raise ValidationError(
_("Tanggal 'Expected Ready to Ship' tidak boleh "
- "lebih kecil dari %(tgl)s. Mohon pilih minimal %(tgl)s.")
+ "lebih kecil dari %(tgl)s. Mohon pilih minimal %(tgl)s.")
% {'tgl': eta_minimum.strftime('%d-%m-%Y')}
)
else:
- # sinkronkan ke field commitment_date
rec.commitment_date = rec.expected_ready_to_ship
-
-
-
@api.onchange('expected_ready_to_ship') #Hangle Onchange form Expected Ready to Ship
def _onchange_expected_ready_ship_date(self):
self._validate_expected_ready_ship_date()