from odoo import models, fields, api from odoo.exceptions import UserError from pytz import timezone from datetime import datetime class DeliveryOrder(models.TransientModel): _name = 'delivery.order' name = fields.Char(string='Name', default='Delivery Order') delivery_order_line_ids = fields.One2many( comodel_name='delivery.order.line', inverse_name='delivery_order_id', string='Delivery Order Line' ) @api.model def create(self, vals): current_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S') if len(vals['delivery_order_line_ids']) < 1: raise UserError('Delivery Order harus di-isi sebelum melanjutkan') for delivery_order_line in vals['delivery_order_line_ids']: picking = False if delivery_order_line[2]['name']: picking = self.env['stock.picking'].search([('picking_code', '=', delivery_order_line[2]['name'])], limit=1) if not picking: picking = self.env['stock.picking'].search([('out_code', '=', delivery_order_line[2]['name'])], limit=1) if picking: line_tracking_no = delivery_order_line[2]['tracking_no'] if not picking.driver_id: picking.driver_id = self.env.uid picking.delivery_tracking_no = line_tracking_no if picking.driver_departure_date: picking.sj_return_date = datetime.utcnow() delivery_type = self.env['delivery.order.line'].get_delivery_type(picking.driver_departure_date, picking.driver_arrival_date) if delivery_type == 'departure': picking.driver_departure_date = current_time elif delivery_type == 'arrival': sale_order = False if picking.origin: sale_order = self.env['sale.order'].search([('name', '=', picking.origin)], limit=1) if sale_order.carrier_id: if not line_tracking_no and not (sale_order.carrier_id.id == 1 or sale_order.carrier_id.name == 'INDOTEKNIK DELIVERY' or sale_order.carrier_id.name == 'PICKUP MUARA BARU' or sale_order.carrier_id.name == 'PICKUP LTC'): raise UserError('Pengiriman selain Indoteknik Delivery & Pickup, nomor tracking harus diisi') return super(DeliveryOrder, self).create(vals) def save_delivery(self): self.ensure_one() return { 'type': 'ir.actions.client', 'tag': 'display_notification', 'params': { 'title': 'Notification', 'message': 'Delivery Order berhasil disimpan', 'next': {'type': 'ir.actions.act_window_close'}, } } class DeliveryOrderLine(models.TransientModel): _name = 'delivery.order.line' name = fields.Char(string='DO Number') driver_id = fields.Many2one(comodel_name='res.users', string='Driver') departure_date = fields.Char(string='Departure Date') arrival_date = fields.Char(string='Arrival Date') carrier_id = fields.Many2one('delivery.carrier', string='Shipping Method') tracking_no = fields.Char(string='Tracking No') delivery_order_id = fields.Many2one('delivery.order', string='Delivery Order') partner_id = fields.Many2one('res.partner', string='Customer') @api.onchange('name') def onchange_name(self): current_time = datetime.now(timezone('Asia/Jakarta')).strftime('%Y-%m-%d %H:%M:%S') if self.name: if len(self.name) == 13: self.name = self.name[:-1] picking = self.env['stock.picking'].search([('picking_code', '=', self.name)], limit=1) if not picking: picking = self.env['stock.picking'].search([('out_code', '=', self.name)], limit=1) if picking: if picking.driver_id: self.driver_id = picking.driver_id else: self.driver_id = self.env.uid sale_order = False if picking.origin: sale_order = self.env['sale.order'].search([('name', '=', picking.origin)], limit=1) if sale_order.carrier_id: self.carrier_id = sale_order.carrier_id self.tracking_no = picking.delivery_tracking_no self.partner_id = picking.partner_id delivery_type = self.get_delivery_type(picking.driver_departure_date, picking.driver_arrival_date) if delivery_type != 'departure': if picking.driver_departure_date: self.departure_date = picking.driver_departure_date.astimezone(timezone('Asia/Jakarta')).strftime('%Y-%m-%d %H:%M:%S') if delivery_type == 'departure': self.departure_date = current_time elif delivery_type == 'arrival': self.arrival_date = current_time else: if picking.driver_arrival_date: self.arrival_date = picking.driver_arrival_date.astimezone(timezone('Asia/Jakarta')).strftime('%Y-%m-%d %H:%M:%S') else: raise UserError('Nomor DO tidak ditemukan') def get_delivery_type(self, driver_departure_date, driver_arrival_date): delivery_type = 'departure' if driver_departure_date: delivery_type = 'arrival' if driver_arrival_date: delivery_type = False return delivery_type