# -*- coding: utf-8 -*- # Copyright 2026 Nexa Systems Inc. # License OPL-1 from odoo import fields, models class FusionBillingReconciliation(models.Model): """Dual-run shadow-mode comparison: Odoo-computed vs the app's actual billing. During phased cutover (NexaCloud first), Odoo computes invoices while the app keeps charging. This row records the per-customer, per-period delta so we only flip once deltas are within tolerance. See spec §10. """ _name = "fusion.billing.reconciliation" _description = "Fusion Billing — Dual-Run Reconciliation" _order = "period desc, service_id" service_id = fields.Many2one( "fusion.billing.service", required=True, ondelete="cascade", index=True, ) partner_id = fields.Many2one("res.partner", required=True, ondelete="cascade", index=True) period = fields.Char(required=True, help="Billing period label, e.g. 2026-05.") odoo_amount = fields.Monetary() external_amount = fields.Monetary(string="App-actual Amount") delta = fields.Monetary(help="odoo_amount - external_amount.") currency_id = fields.Many2one( "res.currency", required=True, default=lambda self: self.env.company.currency_id, ) status = fields.Selection( [ ("match", "Within tolerance"), ("delta", "Delta — investigate"), ("resolved", "Resolved"), ], default="delta", required=True, index=True, ) note = fields.Text()