summaryrefslogtreecommitdiff
path: root/indoteknik_api/controllers/api_v1/stock_picking.py
blob: 5e919b31caadede1fed20c1d48909b417b3c8588 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
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': [],
            'status': [],
            '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()

        pending_domain = [('driver_departure_date', '=', False), ('driver_arrival_date', '=', False)]
        shipment_domain = [('driver_departure_date', '!=', False), ('driver_arrival_date', '=', False)]
        completed_domain = [('driver_departure_date', '!=', False), ('driver_arrival_date', '!=', False)]

        picking_model = request.env['stock.picking']
        domain = [
            ('partner_id', 'in', child_ids), 
            ('sale_id', '!=', False), 
            ('origin', 'ilike', 'SO%'), 
            ('state', '!=', 'cancel')
        ]
        
        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)
            ]

        default_domain = domain.copy()
        
        if params['status'] == 'pending':
            domain += pending_domain
        elif params['status'] == 'shipment':
            domain += shipment_domain
        elif params['status'] == 'completed':
            domain += completed_domain

        stock_pickings = picking_model.search(domain, offset=offset, limit=limit, order='create_date desc')
        res_pickings = []
        for picking in stock_pickings:
            manifests = picking.get_manifests()
            
            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,
                'status': picking.shipping_status,
                'carrier_name': picking.carrier_id.name or '',
                'last_manifest': next(iter(manifests), None)
            })

        return self.response({
            'summary': {
                'pending_count': picking_model.search_count(default_domain + pending_domain),
                'shipment_count': picking_model.search_count(default_domain + shipment_domain),
                'completed_count': picking_model.search_count(default_domain + completed_domain)
            },
            'picking_total': picking_model.search_count(domain),
            '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())