# -*- coding: utf-8 -*- """ Ready for Delivery Wizard Wizard to assign delivery technicians and mark order as Ready for Delivery. """ from odoo import models, fields, api, _ from odoo.exceptions import UserError from markupsafe import Markup import logging _logger = logging.getLogger(__name__) class ReadyForDeliveryWizard(models.TransientModel): _name = 'fusion.ready.for.delivery.wizard' _description = 'Ready for Delivery Wizard' sale_order_id = fields.Many2one( 'sale.order', string='Sale Order', required=True, readonly=True, ) partner_id = fields.Many2one( 'res.partner', string='Client', related='sale_order_id.partner_id', readonly=True, ) claim_number = fields.Char( string='Claim Number', related='sale_order_id.x_fc_claim_number', readonly=True, ) is_early_delivery = fields.Boolean( string='Early Delivery', related='sale_order_id.x_fc_early_delivery', readonly=True, help='This delivery is before ADP approval', ) current_status = fields.Selection( related='sale_order_id.x_fc_adp_application_status', string='Current Status', readonly=True, ) # Technician Assignment technician_ids = fields.Many2many( 'res.users', 'ready_delivery_wizard_technician_rel', 'wizard_id', 'user_id', string='Delivery Technicians', required=True, help='Select one or more field technicians for this delivery', ) # Scheduling scheduled_datetime = fields.Datetime( string='Scheduled Delivery Date/Time', help='Optional: When is the delivery scheduled?', ) # Delivery Address delivery_address = fields.Text( string='Delivery Address', compute='_compute_delivery_address', readonly=True, ) # Notes notes = fields.Text( string='Delivery Notes', help='Any special instructions for the delivery technicians', ) @api.depends('sale_order_id') def _compute_delivery_address(self): """Compute delivery address from partner shipping address.""" for wizard in self: order = wizard.sale_order_id if order and order.partner_shipping_id: addr = order.partner_shipping_id parts = [addr.street, addr.street2, addr.city, addr.state_id.name if addr.state_id else '', addr.zip] wizard.delivery_address = ', '.join([p for p in parts if p]) elif order and order.partner_id: addr = order.partner_id parts = [addr.street, addr.street2, addr.city, addr.state_id.name if addr.state_id else '', addr.zip] wizard.delivery_address = ', '.join([p for p in parts if p]) else: wizard.delivery_address = '' def action_confirm(self): """Confirm and mark as Ready for Delivery.""" self.ensure_one() order = self.sale_order_id if not self.technician_ids: raise UserError(_("Please select at least one delivery technician.")) # Get technician names for chatter message technician_names = ', '.join(self.technician_ids.mapped('name')) user_name = self.env.user.name # Update the sale order order.with_context(skip_status_validation=True).write({ 'x_fc_adp_application_status': 'ready_delivery', 'x_fc_delivery_technician_ids': [(6, 0, self.technician_ids.ids)], 'x_fc_ready_for_delivery_date': fields.Datetime.now(), 'x_fc_scheduled_delivery_datetime': self.scheduled_datetime, }) # Build chatter message scheduled_str = '' if self.scheduled_datetime: scheduled_str = f'
Delivery Notes: {self.notes}
' early_badge = '' if self.is_early_delivery: early_badge = ' Early Delivery' chatter_body = Markup(f'''