diff options
| author | Rafi Zadanly <zadanlyr@gmail.com> | 2023-08-22 15:56:45 +0700 |
|---|---|---|
| committer | Rafi Zadanly <zadanlyr@gmail.com> | 2023-08-22 15:56:45 +0700 |
| commit | 8d45e6557063f708e824b2700331c67168dde6c9 (patch) | |
| tree | 763a837cbba5aa90ebdd329be06dc1c657ec68da | |
| parent | 40b3ae941bce5c822d7297c8ccfc1c752409e21c (diff) | |
Add get stock picking and get stock picking detail tracking API
| -rw-r--r-- | indoteknik_api/controllers/api_v1/__init__.py | 3 | ||||
| -rw-r--r-- | indoteknik_api/controllers/api_v1/stock_picking.py | 77 | ||||
| -rw-r--r-- | indoteknik_custom/models/stock_picking.py | 59 |
3 files changed, 138 insertions, 1 deletions
diff --git a/indoteknik_api/controllers/api_v1/__init__.py b/indoteknik_api/controllers/api_v1/__init__.py index 65bcf926..36fcbd53 100644 --- a/indoteknik_api/controllers/api_v1/__init__.py +++ b/indoteknik_api/controllers/api_v1/__init__.py @@ -25,4 +25,5 @@ from . import content from . import midtrans from . import wati from . import courier -from . import voucher
\ No newline at end of file +from . import voucher +from . import stock_picking
\ No newline at end of file diff --git a/indoteknik_api/controllers/api_v1/stock_picking.py b/indoteknik_api/controllers/api_v1/stock_picking.py new file mode 100644 index 00000000..0ffce16b --- /dev/null +++ b/indoteknik_api/controllers/api_v1/stock_picking.py @@ -0,0 +1,77 @@ +from .. import controller +from odoo import http +from odoo.http import request + + +class StockPicking(controller.Controller): + prefix = '/api/v1/' + PREFIX_PARTNER = prefix + 'partner/<partner_id>/' + + @http.route(PREFIX_PARTNER + 'stock-picking', auth='public', method=['GET', 'OPTIONS']) + @controller.Controller.must_authorized(private=True, private_key='partner_id') + def get_partner_stock_picking(self, **kw): + get_params = self.get_request_params(kw, { + 'partner_id': ['number'], + 'q': [], + 'limit': ['default:0', 'number'], + 'offset': ['default:0', 'number'] + }) + + if not get_params['valid']: + return self.response(code=400, description=get_params) + + params = get_params['value'] + partner_id = params['partner_id'] + limit = params['limit'] + offset = params['offset'] + + child_ids = request.env['res.partner'].browse(partner_id).get_child_ids() + + picking_model = request.env['stock.picking'] + default_domain = [('partner_id', 'in', child_ids), ('sale_id', '!=', False)] + + domain = default_domain + if params['q']: + query_like = '%' + params['q'].replace(' ', '%') + '%' + domain += ['|', '|', ('name', 'ilike', query_like), ('sale_id.client_order_ref', 'ilike', query_like), ('delivery_tracking_no', 'ilike', query_like)] + + stock_pickings = picking_model.search(domain, offset=offset, limit=limit) + res_pickings = [] + for picking in stock_pickings: + res_pickings.append({ + 'id': picking.id, + 'name': picking.name, + 'date': self.time_to_str(picking.create_date, '%d/%m/%Y'), + 'tracking_number': picking.delivery_tracking_no or '', + 'sale_order': { + 'id': picking.sale_id.id, + 'name': picking.sale_id.name, + 'client_order_ref': picking.sale_id.client_order_ref or '' + }, + 'carrier_name': picking.carrier_id.name or '' + }) + + pending_count = picking_model.search_count(default_domain + [('driver_departure_date', '=', False), ('driver_arrival_date', '=', False)]) + shipment_count = picking_model.search_count(default_domain + [('driver_departure_date', '!=', False), ('driver_arrival_date', '=', False)]) + completed_count = picking_model.search_count(default_domain + [('driver_departure_date', '!=', False), ('driver_arrival_date', '!=', False)]) + + return self.response({ + 'summary': { + 'pending_count': pending_count, + 'shipment_count': shipment_count, + 'completed_count': completed_count + }, + 'pickings': res_pickings + }) + + @http.route(PREFIX_PARTNER + 'stock-picking/<id>/tracking', auth='public', method=['GET', 'OPTIONS']) + @controller.Controller.must_authorized(private=True, private_key='partner_id') + def get_partner_stock_picking_detail_tracking(self, **kw): + id = int(kw.get('id', 0)) + picking_model = request.env['stock.picking'] + + picking = picking_model.browse(id) + if not picking: + return self.response(None) + + return self.response(picking.get_tracking_detail()) diff --git a/indoteknik_custom/models/stock_picking.py b/indoteknik_custom/models/stock_picking.py index 4d1df7ee..f9b077ba 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): @@ -351,3 +352,61 @@ 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): + manifest_datas = [] + + departure_date = self.driver_departure_date + arrival_date = self.driver_arrival_date + + if self.carrier_id.id == 32: # Pickup Bandengan + manifest_datas.append(self.create_manifest_data('Sedang disiapkan', self.create_date)) + if departure_date: + manifest_datas.append(self.create_manifest_data('Siap diambil', departure_date)) + if arrival_date: + manifest_datas.append(self.create_manifest_data('Sudah diambil', arrival_date)) + else: + manifest_datas.append(self.create_manifest_data('Menunggu pickup', self.create_date)) + if departure_date: + manifest_datas.append(self.create_manifest_data('Sedang dikirim', departure_date)) + if arrival_date: + manifest_datas.append(self.create_manifest_data('Sudah sampai', arrival_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 + } + + if not self.waybill_id or len(self.waybill_id.manifest_ids) == 0: + response['delivered'] = self.driver_arrival_date != False + response['manifests'] = self.get_manifests() + 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['manifests'] = [self.create_manifest_data(x.description, x.datetime) for x in self.waybill_id.manifest_ids] + + return response |
