# -*- coding: utf-8 -*- # Copyright 2024-2025 Nexa Systems Inc. # License OPL-1 (Odoo Proprietary License v1.0) from odoo import models, fields, api, _ from odoo.exceptions import UserError from markupsafe import Markup import logging _logger = logging.getLogger(__name__) class AssessmentCompletedWizard(models.TransientModel): _name = 'fusion_claims.assessment.completed.wizard' _description = 'Assessment Completed Wizard' sale_order_id = fields.Many2one( 'sale.order', string='Sale Order', required=True, readonly=True, ) is_override = fields.Boolean( string='Scheduling Override', compute='_compute_is_override', store=False, ) assessment_start_date = fields.Date( string='Assessment Start Date', required=True, help='Date the assessment was conducted', ) completion_date = fields.Date( string='Assessment Completion Date', required=True, default=fields.Date.context_today, ) notes = fields.Text( string='Notes', help='Notes from the assessment', ) override_reason = fields.Text( string='Override Reason', help='Mandatory when skipping the scheduling step. Explain why the assessment was completed without scheduling through the system.', ) notify_authorizer = fields.Boolean( string='Notify Authorizer', default=True, help='Send email to the authorizer about assessment completion', ) @api.depends('sale_order_id') def _compute_is_override(self): for rec in self: rec.is_override = ( rec.sale_order_id and rec.sale_order_id.x_fc_adp_application_status == 'quotation' ) @api.model def default_get(self, fields_list): res = super().default_get(fields_list) active_id = self._context.get('active_id') if active_id: order = self.env['sale.order'].browse(active_id) res['sale_order_id'] = order.id if order.x_fc_assessment_start_date: res['assessment_start_date'] = order.x_fc_assessment_start_date else: res['assessment_start_date'] = fields.Date.context_today(self) return res def action_complete(self): """Mark assessment as completed.""" self.ensure_one() order = self.sale_order_id current_status = order.x_fc_adp_application_status is_override = current_status == 'quotation' if current_status not in ('quotation', 'assessment_scheduled'): raise UserError( _("Can only complete assessment from 'Quotation' or 'Assessment Scheduled' status.") ) if is_override and not (self.override_reason or '').strip(): raise UserError( _("Override Reason is mandatory when skipping the assessment scheduling step. " "Please explain why this assessment was completed without being scheduled through the system.") ) if self.completion_date < self.assessment_start_date: raise UserError( _("Completion date (%s) cannot be before assessment start date (%s).") % (self.completion_date, self.assessment_start_date) ) write_vals = { 'x_fc_adp_application_status': 'assessment_completed', 'x_fc_assessment_end_date': self.completion_date, } if is_override or not order.x_fc_assessment_start_date: write_vals['x_fc_assessment_start_date'] = self.assessment_start_date order.with_context(skip_status_validation=True).write(write_vals) if is_override: override_html = Markup( '
Override by: %s
' 'Reason: %s
' 'Assessment Date: %s to %s
' '%s' 'Notes: %s
') % self.notes if self.notes else Markup(''), ) order.message_post( body=override_html, message_type='notification', subtype_xmlid='mail.mt_note', ) else: notes_html = ( Markup('Notes: %s
') % self.notes ) if self.notes else Markup('') order.message_post( body=Markup( 'Completion Date: %s
' '%s' '