summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortrisusilo48 <tri.susilo@altama.co.id>2025-04-10 08:51:12 +0700
committertrisusilo48 <tri.susilo@altama.co.id>2025-04-10 08:51:12 +0700
commit337e86c31691544a49a04e3f8d3a4b259e6b126a (patch)
tree625e22040d09a2b45f5a9356a71b5d56cbc91a09
parent87dad63e8ee0ace13b2d87bae26a045b80409572 (diff)
testing biteship dinamis eta
-rw-r--r--indoteknik_custom/models/sale_order_delay.py10
-rw-r--r--indoteknik_custom/models/stock_picking.py91
2 files changed, 39 insertions, 62 deletions
diff --git a/indoteknik_custom/models/sale_order_delay.py b/indoteknik_custom/models/sale_order_delay.py
index e2735a3c..dfd94650 100644
--- a/indoteknik_custom/models/sale_order_delay.py
+++ b/indoteknik_custom/models/sale_order_delay.py
@@ -4,26 +4,28 @@ from odoo import api, fields, models
class SaleOrderDelay(models.Model):
_name = 'sale.order.delay'
_description = 'Sale Order Delay'
- _rec_name = 'so_number'
+ _primary_key = 'so_number'
so_number = fields.Char(string="SO Number", required=True)
- days_delayed = fields.Integer(string="Day ", required=True)
+ days_delayed = fields.Integer(string="Day Delayed or Erly")
status = fields.Selection([
('delayed', 'Delayed'),
('on track', 'On Track'),
('early', 'Early')
], string='Status', required=True)
+ _sql_constraints = [
+ ('unique_so_number', 'unique(so_number)', 'SO Number must be unique!')
+ ]
+
def update_delay(self):
query = "SELECT check_so_delay();"
self.env.cr.execute(query)
@api.model
def create(self, vals):
- vals['updated_at'] = fields.Datetime.now()
return super(SaleOrderDelay, self).create(vals)
def write(self, vals):
- vals['updated_at'] = fields.Datetime.now()
return super(SaleOrderDelay, self).write(vals)
\ No newline at end of file
diff --git a/indoteknik_custom/models/stock_picking.py b/indoteknik_custom/models/stock_picking.py
index a11bf29f..b741e94e 100644
--- a/indoteknik_custom/models/stock_picking.py
+++ b/indoteknik_custom/models/stock_picking.py
@@ -16,8 +16,8 @@ import re
_logger = logging.getLogger(__name__)
_biteship_url = "https://api.biteship.com/v1"
-# _biteship_api_key = "biteship_test.eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiSW5kb3Rla25payIsInVzZXJJZCI6IjY3MTViYTJkYzVkMjdkMDAxMjRjODk2MiIsImlhdCI6MTcyOTQ5ODAwMX0.L6C73couP4-cgVEfhKI2g7eMCMo3YOFSRZhS-KSuHNA"
-_biteship_api_key = "biteship_live.eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiaW5kb3Rla25payIsInVzZXJJZCI6IjY3MTViYTJkYzVkMjdkMDAxMjRjODk2MiIsImlhdCI6MTc0MTE1NTU4M30.pbFCai9QJv8iWhgdosf8ScVmEeP3e5blrn33CHe7Hgo"
+_biteship_api_key = "biteship_test.eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiSW5kb3Rla25payIsInVzZXJJZCI6IjY3MTViYTJkYzVkMjdkMDAxMjRjODk2MiIsImlhdCI6MTcyOTQ5ODAwMX0.L6C73couP4-cgVEfhKI2g7eMCMo3YOFSRZhS-KSuHNA"
+# _biteship_api_key = "biteship_live.eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiaW5kb3Rla25payIsInVzZXJJZCI6IjY3MTViYTJkYzVkMjdkMDAxMjRjODk2MiIsImlhdCI6MTc0MTE1NTU4M30.pbFCai9QJv8iWhgdosf8ScVmEeP3e5blrn33CHe7Hgo"
@@ -189,63 +189,12 @@ class StockPicking(models.Model):
biteship_id = fields.Char(string="Biteship Respon ID")
biteship_tracking_id = fields.Char(string="Biteship Trackcking ID")
biteship_waybill_id = fields.Char(string="Biteship Waybill ID")
- # estimated_ready_ship_date = fields.Datetime(string='ET Ready to Ship', copy=False, related='sale_id.estimated_ready_ship_date')
- # countdown_hours = fields.Float(string='Countdown in Hours', compute='_callculate_sequance', default=False, store=False, compute_sudo=False)
- # countdown_ready_to_ship = fields.Char(string='Countdown Ready to Ship', compute='_callculate_sequance', store=False, compute_sudo=False)
final_seq = fields.Float(string='Remaining Time')
def schduled_update_sequance(self):
query = "SELECT update_sequance_stock_picking();"
self.env.cr.execute(query)
-
-
- # @api.depends('estimated_ready_ship_date', 'state')
- # def _callculate_sequance(self):
- # for record in self:
- # try :
- # if record.estimated_ready_ship_date and record.state not in ('cancel', 'done'):
- # rts = record.estimated_ready_ship_date - waktu.now()
- # rts_days = rts.days
- # rts_hours = divmod(rts.seconds, 3600)
-
- # estimated_by_erts = rts.total_seconds() / 3600
-
- # record.countdown_ready_to_ship = f"{rts_days} days, {rts_hours} hours"
- # record.countdown_hours = estimated_by_erts
- # else:
- # record.countdown_hours = 999999999999
- # record.countdown_ready_to_ship = False
- # except Exception as e :
- # _logger.error(f"Error calculating sequance {record.id}: {str(e)}")
- # print(str(e))
- # return { 'error': str(e) }
-
-
- # @api.depends('estimated_ready_ship_date', 'state')
- # def _compute_countdown_hours(self):
- # for record in self:
- # if record.state in ('cancel', 'done') or not record.estimated_ready_ship_date:
- # # Gunakan nilai yang sangat besar sebagai placeholder
- # record.countdown_hours = 999999
- # else:
- # delta = record.estimated_ready_ship_date - waktu.now()
- # record.countdown_hours = delta.total_seconds() / 3600
-
- # @api.depends('estimated_ready_ship_date', 'state')
- # def _compute_countdown_ready_to_ship(self):
- # for record in self:
- # if record.state in ('cancel', 'done'):
- # record.countdown_ready_to_ship = False
- # else:
- # if record.estimated_ready_ship_date:
- # delta = record.estimated_ready_ship_date - waktu.now()
- # days = delta.days
- # hours, remainder = divmod(delta.seconds, 3600)
- # record.countdown_ready_to_ship = f"{days} days, {hours} hours"
- # record.countdown_hours = delta.total_seconds() / 3600
- # else:
- # record.countdown_ready_to_ship = False
def _compute_lalamove_image_html(self):
for record in self:
@@ -1182,6 +1131,8 @@ class StockPicking(models.Model):
self.ensure_one()
order = self.env['sale.order'].search([('name', '=', self.sale_id.name)], limit=1)
+
+ sale_order_delay = self.env['sale.order.delay'].search([('so_number', '=', order.name)], limit=1)
response = {
'delivery_order': {
@@ -1197,13 +1148,24 @@ class StockPicking(models.Model):
'delivery_status': None,
'eta': self.generate_eta_delivery(),
'is_biteship': True if self.biteship_id else False,
- 'manifests': self.get_manifests()
+ 'manifests': self.get_manifests(),
+ 'is_delay': True if sale_order_delay and sale_order_delay.status == 'delayed' else False
}
if self.biteship_id :
histori = self.get_manifest_biteship()
- eta_start = order.date_order + timedelta(days=order.estimated_arrival_days_start)
- eta_end = order.date_order + timedelta(days=order.estimated_arrival_days)
+ day_start = order.estomated_arrival_days_start
+ day_end = order.estomated_arrival_days
+ if sale_order_delay:
+ if sale_order_delay.status == 'delayed':
+ day_start = day_start + sale_order_delay.days_delayed
+ day_end = day_end + sale_order_delay.days_delayed
+ elif sale_order_delay.status == 'early':
+ day_start = day_start - sale_order_delay.days_delayed
+ day_end = day_end - sale_order_delay.days_delayed
+
+ eta_start = order.date_order + timedelta(days=day_start)
+ eta_end = order.date_order + timedelta(days=day_end)
formatted_eta = f"{eta_start.strftime('%d %b')} - {eta_end.strftime('%d %b %Y')}"
response['eta'] = formatted_eta
response['manifests'] = histori.get("manifests", [])
@@ -1297,18 +1259,31 @@ class StockPicking(models.Model):
current_date = datetime.datetime.now()
prepare_days = 3
start_date = self.driver_departure_date or self.create_date
+
+
+ add_day_start = 0
+ add_day_end = 0
+ sale_order_delay = self.env['sale.order.delay'].search([('so_number', '=', self.sale_id.name)], limit=1)
+ if sale_order_delay:
+ if sale_order_delay.status == 'delayed':
+ add_day_start = sale_order_delay.days_delayed
+ add_day_end = sale_order_delay.days_delayed
+ elif sale_order_delay.status == 'early':
+ add_day_start = -abs(sale_order_delay.days_delayed)
+ add_day_end = -abs(sale_order_delay.days_delayed)
ead = self.sale_id.estimated_arrival_days or 0
if not self.driver_departure_date:
ead += prepare_days
ead_datetime = datetime.timedelta(days=ead)
- fastest_eta = start_date + ead_datetime
+ fastest_eta = start_date + ead_datetime + datetime.timedelta(days=add_day_start)
+
if not self.driver_departure_date and fastest_eta < current_date:
fastest_eta = current_date + ead_datetime
longest_days = 3
- longest_eta = fastest_eta + datetime.timedelta(days=longest_days)
+ longest_eta = fastest_eta + datetime.timedelta(days=longest_days + add_day_end)
format_time = '%d %b %Y'
format_time_fastest = '%d %b' if fastest_eta.year == longest_eta.year else format_time