Files
Odoo-Modules/fusion_claims/wizard/sale_advance_payment_inv.py
2026-02-22 01:22:18 -05:00

126 lines
4.8 KiB
Python

# -*- coding: utf-8 -*-
# Copyright 2024-2025 Nexa Systems Inc.
# License OPL-1 (Odoo Proprietary License v1.0)
# Part of the Fusion Claim Assistant product family.
from odoo import models, fields, api, _
from odoo.exceptions import UserError
class SaleAdvancePaymentInv(models.TransientModel):
_inherit = 'sale.advance.payment.inv'
# Add new invoice type options for ADP
advance_payment_method = fields.Selection(
selection_add=[
('adp_client', 'ADP Client Invoice (25%)'),
('adp_portion', 'ADP Invoice (75%/100%)'),
],
ondelete={
'adp_client': 'set default',
'adp_portion': 'set default',
}
)
def _is_adp_sale_order(self):
"""Check if the current sale order(s) are ADP sales."""
sale_orders = self.env['sale.order'].browse(self._context.get('active_ids', []))
for order in sale_orders:
if hasattr(order, '_is_adp_sale') and order._is_adp_sale():
return True
return False
def _get_adp_client_type(self):
"""Get client type from the first ADP sale order."""
sale_orders = self.env['sale.order'].browse(self._context.get('active_ids', []))
for order in sale_orders:
if hasattr(order, '_get_client_type'):
return order._get_client_type()
return 'REG'
def create_invoices(self):
"""Override to handle ADP split invoices."""
if self.advance_payment_method == 'adp_client':
return self._create_adp_client_invoice()
elif self.advance_payment_method == 'adp_portion':
return self._create_adp_portion_invoice()
return super().create_invoices()
def _create_adp_client_invoice(self):
"""Create 25% client invoice for REG clients."""
sale_orders = self.env['sale.order'].browse(self._context.get('active_ids', []))
invoices = self.env['account.move']
for order in sale_orders:
if not hasattr(order, '_is_adp_sale') or not order._is_adp_sale():
raise UserError(_("Order %s is not an ADP sale. Cannot create ADP client invoice.") % order.name)
client_type = order._get_client_type() if hasattr(order, '_get_client_type') else 'REG'
if client_type != 'REG':
raise UserError(_(
"Order %s has client type '%s'. Only REG clients have a 25%% client portion. "
"Use 'ADP Invoice (75%%/100%%)' for this order."
) % (order.name, client_type))
invoice = order._create_adp_split_invoice(invoice_type='client')
if invoice:
invoices |= invoice
if not invoices:
raise UserError(_("No invoices were created. Check if the orders have a client portion."))
# Return action to view created invoices
if len(invoices) == 1:
return {
'name': _('Client Invoice (25%)'),
'type': 'ir.actions.act_window',
'res_model': 'account.move',
'res_id': invoices.id,
'view_mode': 'form',
'target': 'current',
}
return {
'name': _('Client Invoices (25%)'),
'type': 'ir.actions.act_window',
'res_model': 'account.move',
'domain': [('id', 'in', invoices.ids)],
'view_mode': 'list,form',
'target': 'current',
}
def _create_adp_portion_invoice(self):
"""Create 75%/100% ADP invoice."""
sale_orders = self.env['sale.order'].browse(self._context.get('active_ids', []))
invoices = self.env['account.move']
for order in sale_orders:
if not hasattr(order, '_is_adp_sale') or not order._is_adp_sale():
raise UserError(_("Order %s is not an ADP sale. Cannot create ADP invoice.") % order.name)
invoice = order._create_adp_split_invoice(invoice_type='adp')
if invoice:
invoices |= invoice
if not invoices:
raise UserError(_("No invoices were created."))
# Return action to view created invoices
if len(invoices) == 1:
return {
'name': _('ADP Invoice'),
'type': 'ir.actions.act_window',
'res_model': 'account.move',
'res_id': invoices.id,
'view_mode': 'form',
'target': 'current',
}
return {
'name': _('ADP Invoices'),
'type': 'ir.actions.act_window',
'res_model': 'account.move',
'domain': [('id', 'in', invoices.ids)],
'view_mode': 'list,form',
'target': 'current',
}