from odoo import models, fields, api, _ from odoo.exceptions import UserError from pytz import timezone from datetime import datetime class LogbookSJ(models.TransientModel): _name = 'logbook.sj' name = fields.Char(string='Name', default='Logbook SJ') logbook_sj_line = fields.One2many( comodel_name='logbook.sj.line', inverse_name='logbook_sj_id', string='Logbook SJ Line' ) def create_logbook_sj(self): logbook_line = self.logbook_sj_line current_time = datetime.utcnow() report_logbook_ids = [] parameters_header = { 'date': current_time, 'created_by': self.env.user.id, } report_logbook = self.env['report.logbook.sj'].create([parameters_header]) seq=1 for line in logbook_line: picking = self.env['stock.picking'].search([('picking_code', '=', line.name)], limit=1) if not picking: picking = self.env['stock.picking'].search([('out_code', '=', line.name)], limit=1) stock = picking parent_id = stock.partner_id.parent_id.id parent_id = parent_id if parent_id else stock.partner_id.id data = { 'picking_id': stock.id, 'sale_id': stock.sale_id.id, 'name': stock.name, 'driver_id': stock.driver_id.id, 'departure_date': stock.driver_departure_date, 'arrival_date': stock.driver_arrival_date, 'carrier_id': stock.carrier_id.id, 'tracking_no': stock.delivery_tracking_no, 'partner_id': parent_id, 'report_logbook_sj_id': report_logbook.id, 'note': line.note, 'line_num': seq } self.env['report.logbook.sj.line'].create([data]) seq += 1 report_logbook_ids.append(report_logbook.id) line.unlink() self.unlink() return { 'name': _('Report Logbook SJ'), 'view_mode': 'tree,form', 'res_model': 'report.logbook.sj', 'target': 'current', 'type': 'ir.actions.act_window', 'domain': [('id', 'in', report_logbook_ids)], } class LogbookSJLine(models.TransientModel): _name = 'logbook.sj.line' name = fields.Char(string='SJ 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') logbook_sj_id = fields.Many2one('logbook.sj', string='Logbook SJ') partner_id = fields.Many2one('res.partner', string='Customer') picking_id = fields.Many2one('res.partner', string='Customer') note = fields.Char(string='Note') @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 self.picking_id = picking.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