from .. import controller from odoo import http from odoo.http import request class StockPicking(controller.Controller): prefix = '/api/v1/' PREFIX_PARTNER = prefix + 'partner//' @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), ('origin', 'ilike', 'SO%')] 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 '' }, 'delivered': picking.waybill_id.delivered or picking.driver_arrival_date != False, '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//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())