fusion.billing.reconciliation gains the compute: _compute_reconciliation (flat + charge overage vs external, status match/delta at a tolerance) and _reconcile_rows (resolve shadow sub -> flat + charge, upsert one row per service/partner/period, per-row isolated). The wizard gains a read-only _read_reconciliation_rows (NexaCloud usage cpu_hours*3600 + invoice-item subtotals per YYYY-MM) and a "Run Reconciliation" button. 2a amended to stamp x_fc_nexacloud_plan_id on shadow subs so reconciliation can find the charge. Read-only on NexaCloud; writes only reconciliation rows (shadow guarantees intact). 8 new tests, full suite green on odoo-trial.
48 lines
2.4 KiB
XML
48 lines
2.4 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
|
<odoo>
|
|
<record id="view_fusion_billing_import_wizard_form" model="ir.ui.view">
|
|
<field name="name">fusion.billing.import.wizard.form</field>
|
|
<field name="model">fusion.billing.import.wizard</field>
|
|
<field name="arch" type="xml">
|
|
<form string="Import from NexaCloud">
|
|
<div class="alert alert-danger" role="alert" invisible="failed_count == 0">
|
|
<strong>Import completed with errors: </strong>
|
|
<field name="failed_count" class="oe_inline" readonly="1"/> row(s) failed — see Result below.
|
|
</div>
|
|
<div class="alert alert-warning" role="alert" invisible="skipped_count == 0">
|
|
<field name="skipped_count" class="oe_inline" readonly="1"/> row(s) skipped (unresolved customer/plan) — see Result below.
|
|
</div>
|
|
<group>
|
|
<field name="dry_run"/>
|
|
</group>
|
|
<group string="Result" invisible="not result_summary">
|
|
<field name="result_summary" nolabel="1" widget="text"/>
|
|
</group>
|
|
<footer>
|
|
<button name="action_test_connection" type="object"
|
|
string="Test Connection" class="btn-secondary"/>
|
|
<button name="action_run_import" type="object" string="Run Import"
|
|
class="btn-primary"/>
|
|
<button name="action_run_reconciliation" type="object"
|
|
string="Run Reconciliation" class="btn-secondary"/>
|
|
<button string="Close" class="btn-secondary" special="cancel"/>
|
|
</footer>
|
|
</form>
|
|
</field>
|
|
</record>
|
|
|
|
<record id="action_fusion_billing_import_wizard" model="ir.actions.act_window">
|
|
<field name="name">Import from NexaCloud</field>
|
|
<field name="res_model">fusion.billing.import.wizard</field>
|
|
<field name="view_mode">form</field>
|
|
<field name="target">new</field>
|
|
</record>
|
|
|
|
<menuitem id="menu_fusion_billing_root" name="Fusion Billing"
|
|
parent="account.menu_finance" sequence="90"/>
|
|
<menuitem id="menu_fusion_billing_import" name="Import from NexaCloud"
|
|
parent="menu_fusion_billing_root"
|
|
action="action_fusion_billing_import_wizard" sequence="10"
|
|
groups="base.group_system"/>
|
|
</odoo>
|