summaryrefslogtreecommitdiff
path: root/indoteknik_custom/models/shipment_group.py
blob: 5f5f2d7981ed70769e0e3219641025b708188d52 (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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
from odoo import models, api, fields
from odoo.exceptions import AccessError, UserError, ValidationError
from datetime import timedelta, date
import logging
from markupsafe import escape as html_escape

_logger = logging.getLogger(__name__)

class ShipmentGroup(models.Model):
    _name = "shipment.group"
    _description = "Shipment Group"
    _inherit = ['mail.thread']
    _rec_name = 'number'

    number = fields.Char(string='Document No', index=True, copy=False, readonly=True, tracking=True)
    shipment_line = fields.One2many('shipment.group.line', 'shipment_id', string='Shipment Group Lines', auto_join=True)
    partner_id = fields.Many2one('res.partner', string='Customer')
    carrier_id = fields.Many2one('delivery.carrier', string='Ekspedisi')
    total_colly_line = fields.Float(string='Total Colly', compute='_compute_total_colly_line')
    is_multi_partner = fields.Boolean(string='Is Multi Partner', compute='_compute_is_multi_partner')
    partner_ids = fields.Many2many('res.partner', string='Customers', compute='_compute_partner_ids')
    driver = fields.Text(string='Driver')

    @api.depends('shipment_line.partner_id')
    def _compute_partner_ids(self):
        for rec in self:
            rec.partner_ids = rec.shipment_line.mapped('partner_id').ids

    @api.depends('shipment_line.partner_id')
    def _compute_is_multi_partner(self):
        for rec in self:
            partners = rec.shipment_line.mapped('partner_id')
            rec.is_multi_partner = len(partners) > 1
    
    def sync_api_shipping(self):
        for rec in self.shipment_line:
            picking_names = [lines.picking_id.name for lines in self.shipment_line]
            if rec.shipment_id.carrier_id.id == 173:
                rec.picking_id.action_get_kgx_pod(
                    shipment=f"{self.number}"
                )
            elif rec.shipment_id.carrier_id.id == 151:
                rec.picking_id.track_envio_shipment(shipment=f"{self.number}")

    @api.depends('shipment_line.total_colly')
    def _compute_total_colly_line(self):
        for rec in self:
            rec.total_colly_line = sum(rec.shipment_line.mapped('total_colly'))

    @api.model
    def create(self, vals):
        vals['number'] = self.env['ir.sequence'].next_by_code('shipment.group') or '0'
        result = super(ShipmentGroup, self).create(vals)
        if result.shipment_line and result.shipment_line[0].partner_id:
            result.partner_id = result.shipment_line[0].partner_id.id
        return result
    
class ShipmentGroupLine(models.Model):
    _name = 'shipment.group.line'
    _description = 'Shipment Group Line'
    _order = 'shipment_id, id'

    shipment_id = fields.Many2one('shipment.group', string='Shipment Ref', required=True, ondelete='cascade', index=True, copy=False)
    partner_id = fields.Many2one('res.partner', string='Customer')
    picking_id = fields.Many2one('stock.picking', string='Picking')
    sale_id = fields.Many2one('sale.order', string='Sale Order')
    state = fields.Char(string='Status', readonly=True, compute='_compute_state')
    shipping_paid_by = fields.Selection([
        ('indoteknik', 'Indoteknik'),
        ('customer', 'Customer')
    ], string='Shipping Paid by', copy=False)
    total_colly = fields.Float(string='Total Colly')
    carrier_id = fields.Many2one('delivery.carrier', string='Ekspedisi')

    @api.constrains('picking_id')
    def _check_picking_id(self):
        for rec in self:
            if not rec.picking_id:
                continue
                
            duplicates = self.env['shipment.group.line'].search([
                ('picking_id', '=', rec.picking_id.id),
                ('id', '!=', rec.id)
            ])
            
            if duplicates:
                shipment_numbers = duplicates.mapped('shipment_id.number')
                raise UserError(
                    f"Picking {rec.picking_id.name} sudah discan dalam shipment group berikut: {', '.join(shipment_numbers)}! "
                    "Satu picking hanya boleh dimasukkan dalam satu shipment group."
                )

    @api.depends('picking_id.state')
    def _compute_state(self):
        for rec in self:
            if rec.picking_id:
                if rec.picking_id.state == 'assigned':
                    rec.state = 'Ready'
                elif rec.picking_id.state == 'done':
                    rec.state = 'Done'
                elif rec.picking_id.state == 'cancel':
                    rec.state = 'Cancelled'
                elif rec.picking_id.state == 'confirmed':
                    rec.state = 'Waiting'
                elif rec.picking_id.state == 'waiting':
                    rec.state = 'Waiting Another Operation'
                else:
                    rec.state = 'draft'
            else:
                rec.state = 'draft'

    @api.onchange('picking_id')
    def onchange_picking_id(self):
        if self.picking_id:
            picking = self.picking_id

            if self.shipment_id.carrier_id and self.shipment_id.carrier_id != picking.carrier_id:
                raise UserError('carrier must be same as shipment group')

            if picking.total_mapping_koli == 0:
                raise UserError(f'Picking {picking.name} tidak memiliki mapping koli')

            self.partner_id = picking.partner_id
            self.shipping_paid_by = picking.sale_id.shipping_paid_by
            self.carrier_id = picking.carrier_id.id
            self.total_colly = picking.total_mapping_koli

            if not self.shipment_id.carrier_id:
                self.shipment_id.carrier_id = picking.carrier_id

            self.sale_id = picking.sale_id

            if self.shipment_id:
                self.shipment_id._compute_is_multi_partner()

    @api.model
    def create(self, vals):
        record = super(ShipmentGroupLine, self).create(vals)
        if record.picking_id:
            record.onchange_picking_id()
        return record

    def write(self, vals):
        res = super(ShipmentGroupLine, self).write(vals)
        if 'picking_id' in vals:
            self.onchange_picking_id()
        return res