Odoo becomes the accounting SoR by ingesting NexaCloud's real Stripe invoices (read-only via the existing DSN) into native account.move customer invoices: per-service-family income accounts, tax derived to match the source invoice.tax, Stripe payments reconciled via account.payment.register (invoice shows paid), idempotent on x_fc_nexacloud_invoice_id, draft-first with bulk-post + a daily cron (inactive). Plus a prune helper for the now-obsolete metered shadow data. 73 tests green on odoo-trial. Account codes use dots (Odoo 19 rejects '-').
45 lines
2.0 KiB
XML
45 lines
2.0 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
|
<odoo>
|
|
<record id="view_fc_invoice_ledger_wizard_form" model="ir.ui.view">
|
|
<field name="name">fusion.billing.invoice.ledger.wizard.form</field>
|
|
<field name="model">fusion.billing.invoice.ledger.wizard</field>
|
|
<field name="arch" type="xml">
|
|
<form string="Ingest NexaCloud Invoices">
|
|
<group>
|
|
<field name="dry_run"/>
|
|
<field name="auto_post"/>
|
|
</group>
|
|
<group string="Result" invisible="not result_summary">
|
|
<field name="result_summary" nolabel="1" widget="text"/>
|
|
</group>
|
|
<footer>
|
|
<button name="action_run" type="object" string="Run" class="btn-primary"/>
|
|
<button string="Close" class="btn-secondary" special="cancel"/>
|
|
</footer>
|
|
</form>
|
|
</field>
|
|
</record>
|
|
|
|
<record id="action_fc_invoice_ledger_wizard" model="ir.actions.act_window">
|
|
<field name="name">Ingest NexaCloud Invoices</field>
|
|
<field name="res_model">fusion.billing.invoice.ledger.wizard</field>
|
|
<field name="view_mode">form</field>
|
|
<field name="target">new</field>
|
|
</record>
|
|
|
|
<menuitem id="menu_fc_invoice_ledger" name="Ingest NexaCloud Invoices"
|
|
parent="menu_fusion_billing_root"
|
|
action="action_fc_invoice_ledger_wizard" sequence="20"
|
|
groups="base.group_system"/>
|
|
|
|
<record id="cron_fc_invoice_ledger" model="ir.cron">
|
|
<field name="name">Fusion Billing: Ingest NexaCloud invoices (daily)</field>
|
|
<field name="model_id" ref="model_fusion_billing_invoice_ledger_wizard"/>
|
|
<field name="state">code</field>
|
|
<field name="code">model.create({'dry_run': False, 'auto_post': True})._cron_ingest_recent()</field>
|
|
<field name="interval_number">1</field>
|
|
<field name="interval_type">days</field>
|
|
<field name="active">False</field>
|
|
</record>
|
|
</odoo>
|