diff options
| author | IT Fixcomart <it@fixcomart.co.id> | 2023-09-01 06:33:29 +0000 |
|---|---|---|
| committer | IT Fixcomart <it@fixcomart.co.id> | 2023-09-01 06:33:29 +0000 |
| commit | 532336ef618e2e4b57092180e8d3ecf3c3b82bf2 (patch) | |
| tree | 0376b42769d70df260d0f411a98514a8b1d3f995 /indoteknik_custom/models | |
| parent | 41e76bb5b668473c8086ba82ea8f405315b8e5ae (diff) | |
| parent | 3757621d0b0232603a3d578b27b845054cae5982 (diff) | |
Merged in change/feature/stock-picking (pull request #122)
Change/feature/stock picking
Diffstat (limited to 'indoteknik_custom/models')
| -rwxr-xr-x | indoteknik_custom/models/sale_order.py | 1 | ||||
| -rw-r--r-- | indoteknik_custom/models/stock_picking.py | 101 |
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}' |
