summaryrefslogtreecommitdiff
path: root/indoteknik_custom/models
diff options
context:
space:
mode:
authorIT Fixcomart <it@fixcomart.co.id>2023-09-01 06:33:29 +0000
committerIT Fixcomart <it@fixcomart.co.id>2023-09-01 06:33:29 +0000
commit532336ef618e2e4b57092180e8d3ecf3c3b82bf2 (patch)
tree0376b42769d70df260d0f411a98514a8b1d3f995 /indoteknik_custom/models
parent41e76bb5b668473c8086ba82ea8f405315b8e5ae (diff)
parent3757621d0b0232603a3d578b27b845054cae5982 (diff)
Merged in change/feature/stock-picking (pull request #122)
Change/feature/stock picking
Diffstat (limited to 'indoteknik_custom/models')
-rwxr-xr-xindoteknik_custom/models/sale_order.py1
-rw-r--r--indoteknik_custom/models/stock_picking.py101
2 files changed, 102 insertions, 0 deletions
diff --git a/indoteknik_custom/models/sale_order.py b/indoteknik_custom/models/sale_order.py
index a0bc54b8..65132fda 100755
--- a/indoteknik_custom/models/sale_order.py
+++ b/indoteknik_custom/models/sale_order.py
@@ -76,6 +76,7 @@ class SaleOrder(models.Model):
voucher_id = fields.Many2one(comodel_name='voucher', string='Voucher')
amount_voucher_disc = fields.Float(string='Voucher Discount')
source_id = fields.Many2one('utm.source', 'Source', domain="[('id', 'in', [32, 59, 60, 61])]")
+ estimated_arrival_days = fields.Integer('Estimated Arrival Days', default=0)
def _compute_purchase_total(self):
for order in self:
diff --git a/indoteknik_custom/models/stock_picking.py b/indoteknik_custom/models/stock_picking.py
index 1ffb9aef..8e8c1e79 100644
--- a/indoteknik_custom/models/stock_picking.py
+++ b/indoteknik_custom/models/stock_picking.py
@@ -2,6 +2,7 @@ from odoo import fields, models, api, _
from odoo.exceptions import AccessError, UserError, ValidationError
from odoo.tools.float_utils import float_is_zero
from itertools import groupby
+import pytz, datetime
class StockPicking(models.Model):
@@ -354,3 +355,103 @@ class StockPicking(models.Model):
picking.delivery_status = "Diterima Ekspedisi"
else:
picking.delivery_status = "Diterima Konsumen"
+
+ def create_manifest_data(self, description, object):
+ datetime_str = ''
+ if isinstance(object, datetime.datetime):
+ jakarta_timezone = pytz.timezone('Asia/Jakarta')
+ datetime_str = object.replace(tzinfo=pytz.utc).astimezone(jakarta_timezone).strftime('%Y-%m-%d %H:%M:%S')
+ return {
+ 'description': description,
+ 'datetime': datetime_str
+ }
+
+ def get_manifests(self):
+ if self.waybill_id and len(self.waybill_id.manifest_ids) > 0:
+ return [self.create_manifest_data(x.description, x.datetime) for x in self.waybill_id.manifest_ids]
+
+ status_mapping = {
+ 'pickup': {
+ 'arrival': 'Sudah diambil',
+ 'departure': 'Siap diambil',
+ 'prepare': 'Sedang disiapkan'
+ },
+ 'delivery': {
+ 'arrival': 'Sudah sampai',
+ 'departure': 'Sedang dikirim',
+ 'prepare': 'Menunggu pickup',
+ }
+ }
+
+ status_key = 'delivery'
+ if self.carrier_id.id == 32:
+ status_key = 'pickup'
+
+ manifest_datas = []
+ departure_date = self.driver_departure_date
+ arrival_date = self.driver_arrival_date
+ status = status_mapping.get(status_key)
+
+ if not status:
+ return manifest_datas
+
+ if arrival_date:
+ manifest_datas.append(self.create_manifest_data(status['arrival'], arrival_date))
+ if departure_date:
+ manifest_datas.append(self.create_manifest_data(status['departure'], departure_date))
+ manifest_datas.append(self.create_manifest_data(status['prepare'], self.create_date))
+
+ return manifest_datas
+
+ def get_tracking_detail(self):
+ self.ensure_one()
+
+ response = {
+ 'delivery_order': {
+ 'name': self.name,
+ 'carrier': self.carrier_id.name or '',
+ 'receiver_name': '',
+ 'receiver_city': ''
+ },
+ 'delivered': False,
+ 'waybill_number': self.delivery_tracking_no or '',
+ 'delivery_status': None,
+ 'eta': self.generate_eta_delivery(),
+ 'manifests': self.get_manifests()
+ }
+
+ if not self.waybill_id or len(self.waybill_id.manifest_ids) == 0:
+ response['delivered'] = self.driver_arrival_date != False
+ return response
+
+ response['delivery_order']['receiver_name'] = self.waybill_id.receiver_name
+ response['delivery_order']['receiver_city'] = self.waybill_id.receiver_city
+ response['delivery_status'] = self.waybill_id._get_history('delivery_status')
+ response['delivered'] = self.waybill_id.delivered
+
+ return response
+
+ def generate_eta_delivery(self):
+ current_date = datetime.datetime.now()
+ prepare_days = 3
+ start_date = self.driver_departure_date or self.create_date
+
+ 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
+ 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)
+
+ format_time = '%d %b %Y'
+ format_time_fastest = '%d %b' if fastest_eta.year == longest_eta.year else format_time
+
+ formatted_fastest_eta = fastest_eta.strftime(format_time_fastest)
+ formatted_longest_eta = longest_eta.strftime(format_time)
+
+ return f'{formatted_fastest_eta} - {formatted_longest_eta}'