summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--indoteknik_api/models/res_users.py9
-rw-r--r--indoteknik_custom/models/purchasing_job.py19
-rw-r--r--indoteknik_custom/models/res_partner.py3
-rwxr-xr-xindoteknik_custom/models/sale_order.py80
-rw-r--r--indoteknik_custom/models/stock_picking_return.py2
-rw-r--r--indoteknik_custom/views/res_partner.xml2
6 files changed, 90 insertions, 25 deletions
diff --git a/indoteknik_api/models/res_users.py b/indoteknik_api/models/res_users.py
index 015b9e0e..c4e19bf3 100644
--- a/indoteknik_api/models/res_users.py
+++ b/indoteknik_api/models/res_users.py
@@ -14,6 +14,11 @@ class ResUsers(models.Model):
'manager': 2,
'director': 3
}
+ payment_term = (
+ main_partner.previous_payment_term_id
+ if main_partner.is_cbd_locked
+ else main_partner.property_payment_term_id
+ )
partner_tempo = False
is_tempo_request = request.env['user.pengajuan.tempo.request'].search([('user_company_id', '=', main_partner.id)], limit=1)
tempo_progres = (
@@ -21,8 +26,8 @@ class ResUsers(models.Model):
'rejected' if is_tempo_request.state_tempo == 'reject' else
'approve' if is_tempo_request.state_tempo == 'approval_director' else ''
)
- if main_partner:
- partner_tempo = True if 'tempo' in main_partner.get_check_payment_term().lower() else False
+ if payment_term:
+ partner_tempo = True if 'tempo' in payment_term.name.lower() else False
data = {
'id': res_user.id,
diff --git a/indoteknik_custom/models/purchasing_job.py b/indoteknik_custom/models/purchasing_job.py
index db733b5a..3151f0f6 100644
--- a/indoteknik_custom/models/purchasing_job.py
+++ b/indoteknik_custom/models/purchasing_job.py
@@ -29,20 +29,23 @@ class PurchasingJob(models.Model):
so_number = fields.Text(string='SO Number', copy=False)
check_pj = fields.Boolean(compute='_get_check_pj', string='Linked')
+
def action_open_job_detail(self):
self.ensure_one()
Seen = self.env['purchasing.job.seen']
+
seen = Seen.search([
- ('user_id', '=', self.env.uid),
('product_id', '=', self.product_id.id)
], limit=1)
if seen:
- seen.so_snapshot = self.so_number
- seen.seen_date = fields.Datetime.now()
+ seen.write({
+ 'so_snapshot': self.so_number,
+ 'seen_date': fields.Datetime.now(),
+ 'user_id': self.env.user.id, })
else:
Seen.create({
- 'user_id': self.env.uid,
+ 'user_id': self.env.user.id,
'product_id': self.product_id.id,
'so_snapshot': self.so_number,
})
@@ -56,17 +59,13 @@ class PurchasingJob(models.Model):
'target': 'current',
}
-
@api.depends('so_number')
def _get_check_pj(self):
+ Seen = self.env['purchasing.job.seen']
for rec in self:
- seen = self.env['purchasing.job.seen'].search([
- ('user_id', '=', self.env.uid),
- ('product_id', '=', rec.product_id.id)
- ], limit=1)
+ seen = Seen.search([('product_id', '=', rec.product_id.id)], limit=1)
rec.check_pj = bool(seen and seen.so_snapshot == rec.so_number)
-
def unlink(self):
# Example: Delete related records from the underlying model
underlying_records = self.env['purchasing.job'].search([
diff --git a/indoteknik_custom/models/res_partner.py b/indoteknik_custom/models/res_partner.py
index 8aaee47e..ef1a5cf4 100644
--- a/indoteknik_custom/models/res_partner.py
+++ b/indoteknik_custom/models/res_partner.py
@@ -196,8 +196,7 @@ class ResPartner(models.Model):
previous_payment_term_id = fields.Many2one(
'account.payment.term',
- string='Previous Payment Term',
- readonly=True
+ string='Previous Payment Term'
)
diff --git a/indoteknik_custom/models/sale_order.py b/indoteknik_custom/models/sale_order.py
index 36dcbb4e..663cba58 100755
--- a/indoteknik_custom/models/sale_order.py
+++ b/indoteknik_custom/models/sale_order.py
@@ -398,6 +398,23 @@ class SaleOrder(models.Model):
compute="_compute_partner_is_cbd_locked"
)
+ def action_open_partial_delivery_wizard(self):
+ self.ensure_one()
+ pickings = self.picking_ids.filtered(lambda p: p.state not in ['done', 'cancel'] and p.name and 'BU/PICK/' in p.name)
+ return {
+ 'type': 'ir.actions.act_window',
+ 'name': 'Partial Delivery',
+ 'res_model': 'partial.delivery.wizard',
+ 'view_mode': 'form',
+ 'target': 'new',
+ 'context': {
+ 'default_sale_id': self.id,
+ # kasih langsung list of int biar ga ribet di wizard
+ 'default_picking_ids': pickings.ids,
+ }
+ }
+
+
@api.depends('partner_id.is_cbd_locked')
def _compute_partner_is_cbd_locked(self):
for order in self:
@@ -406,13 +423,13 @@ class SaleOrder(models.Model):
@api.constrains('payment_term_id', 'partner_id', 'state')
def _check_cbd_lock_sale_order(self):
- # cbd_term = self.env['account.payment.term'].browse(26)
+ cbd_term = self.env['account.payment.term'].browse(26)
for rec in self:
if rec.state == 'draft' and rec.partner_id.is_cbd_locked:
- # if rec.payment_term_id and rec.payment_term_id != cbd_term:
- raise ValidationError(
- "Customer ini terkunci ke CBD, hanya boleh pakai Payment Term CBD."
- )
+ if rec.payment_term_id and rec.payment_term_id != cbd_term:
+ raise ValidationError(
+ "Customer ini terkunci ke CBD, hanya boleh pakai Payment Term CBD."
+ )
@api.depends('invoice_ids.payment_state', 'invoice_ids.amount_total', 'invoice_ids.amount_residual')
def _compute_payment_state_custom(self):
@@ -1748,9 +1765,54 @@ class SaleOrder(models.Model):
# 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:
+ # if not rec.expected_ready_to_ship:
+ # continue
+ #
+ # # ADDED: gunakan "sekarang" lokal user, bukan datetime.now() server
+ # current_date = fields.Datetime.context_timestamp(rec, fields.Datetime.now())
+ #
+ # # 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:
+ # 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)
+ #
+ # 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.")
+ # % {'tgl': eta_minimum.strftime('%d-%m-%Y')}
+ # )
+ # else:
+ # 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()
@@ -2214,7 +2276,7 @@ class SaleOrder(models.Model):
raise UserError("Terdapat DUPLIKASI data pada Product {}".format(line.product_id.display_name))
def sale_order_approve(self):
- self.check_duplicate_product()
+ # self.check_duplicate_product()
self.check_product_bom()
self.check_credit_limit()
self.check_limit_so_to_invoice()
@@ -2484,7 +2546,7 @@ class SaleOrder(models.Model):
for order in self:
order._validate_delivery_amt()
order._validate_uniform_taxes()
- order.check_duplicate_product()
+ # order.check_duplicate_product()
order.check_product_bom()
order.check_credit_limit()
order.check_limit_so_to_invoice()
diff --git a/indoteknik_custom/models/stock_picking_return.py b/indoteknik_custom/models/stock_picking_return.py
index 88acf83c..53a85f67 100644
--- a/indoteknik_custom/models/stock_picking_return.py
+++ b/indoteknik_custom/models/stock_picking_return.py
@@ -110,7 +110,7 @@ class ReturnPicking(models.TransientModel):
if mapping_koli_vals:
context['default_mapping_koli_ids'] = mapping_koli_vals
- if picking.purchase_id or 'PO' in (picking.origin or ''):
+ if picking.name and any(k in picking.name.upper() for k in ('PUT', 'INPUT')):
_logger.info("Redirect ke Tukar Guling PO via purchase_id / origin")
return {
'name': _('Tukar Guling PO'),
diff --git a/indoteknik_custom/views/res_partner.xml b/indoteknik_custom/views/res_partner.xml
index a7770f1e..72751187 100644
--- a/indoteknik_custom/views/res_partner.xml
+++ b/indoteknik_custom/views/res_partner.xml
@@ -21,7 +21,7 @@
<field name="reference_number"/>
</field>
<field name="property_payment_term_id" position="after">
- <field name="previous_payment_term_id" />
+ <field name="previous_payment_term_id" readonly="1"/>
<field name="is_cbd_locked" readonly="1"/>
<field name="user_payment_terms_sales" readonly="1"/>
<field name="date_payment_terms_sales" readonly="1"/>