feat(nexa_coa_setup): convert chart of accounts to 4-digit codes

Renumbered all 128 Nexa accounts from 6-digit (l10n_ca style) to clean
4-digit codes for readability:

  1000-1999  Assets
    1120  Due From Shareholder
    1210  HST/GST ITC Receivable
    1510-1750  Capital assets + accumulated depreciation
  2000-2999  Liabilities
    2110  HST/GST Collected
    2510  Due To Shareholder
  3000-3999  Equity
    3010  Common Shares
    3510  Retained Earnings — Current
  4000-4999  Revenue
    4010-4050  Recurring (SaaS, Hosting, Support, ...)
    4110-4160  Project work
    4210-4230  Hourly services
    4310-4320  Reseller
  5000-5999  COGS
    5010-5120  Infrastructure & APIs
    5210-5250  Project direct costs
    5310-5320  Resold goods
  6000-6999  Operating expenses
    6010-6092  Personnel (T4)
    6110-6120  Contract labour
    6210-6960  Office/Tech/Marketing/Professional/Insurance/Travel/Training/Banking
  7000+  Other (bad debt, donations, FX, depreciation)

Applied to prod via scripts/convert_to_4digit.py (now committed). XML
codes updated in 01_account_account.xml; XMLIDs preserved so existing
ir.model.data rows on prod stay valid.

Hook constants updated:
- _TAX_REPARTITION_REMAP targets: 118100 -> 1210, 213100 -> 2110, etc.
- _LEGACY_RENAMES new_name strings: 're-class to NNNN' guidance updated
  to 4-digit targets.

Verified -u on prod completes cleanly + all 4 test invoices still post:
  ON     -> 4010 SaaS, total 113.00
  US     -> 4010 SaaS, total 100.00 (zero-rated)
  QC     -> 4010 SaaS, total 114.98
  Westin -> 4210 Consulting, total 169.50

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
gsinghpal
2026-05-12 20:09:01 -04:00
parent 749c0335fa
commit 86e89ca419
3 changed files with 317 additions and 146 deletions

View File

@@ -14,99 +14,99 @@
these accounts were at codes 119100/119900 — codes updated in-place via
scripts/fix_gl_codes.py without rewriting ir.model.data. -->
<record id="acct_119100" model="account.account">
<field name="code">115200</field>
<field name="code">1120</field>
<field name="name">Due From Shareholder — Gurpreet</field>
<field name="account_type">asset_current</field>
<field name="reconcile" eval="True"/>
</record>
<record id="acct_119900" model="account.account">
<field name="code">115900</field>
<field name="code">1130</field>
<field name="name">Due From Associated Corporations</field>
<field name="account_type">asset_current</field>
<field name="reconcile" eval="True"/>
</record>
<record id="acct_118100" model="account.account">
<field name="code">118100</field>
<field name="code">1210</field>
<field name="name">HST/GST Input Tax Credit (ITC) Receivable</field>
<field name="account_type">asset_current</field>
</record>
<record id="acct_118200" model="account.account">
<field name="code">118200</field>
<field name="code">1220</field>
<field name="name">HST/GST Instalments Paid</field>
<field name="account_type">asset_current</field>
</record>
<record id="acct_118300" model="account.account">
<field name="code">118300</field>
<field name="code">1230</field>
<field name="name">QST Input Tax Refund Receivable</field>
<field name="account_type">asset_current</field>
</record>
<record id="acct_151100" model="account.account">
<field name="code">151100</field>
<field name="code">1510</field>
<field name="name">Computer Hardware &amp; Equipment (CCA Class 50)</field>
<field name="account_type">asset_fixed</field>
</record>
<record id="acct_151200" model="account.account">
<field name="code">151200</field>
<field name="code">1520</field>
<field name="name">Office Furniture &amp; Equipment (CCA Class 8)</field>
<field name="account_type">asset_fixed</field>
</record>
<record id="acct_151300" model="account.account">
<field name="code">151300</field>
<field name="code">1530</field>
<field name="name">Vehicles (CCA Class 10/10.1)</field>
<field name="account_type">asset_fixed</field>
</record>
<record id="acct_151400" model="account.account">
<field name="code">151400</field>
<field name="code">1540</field>
<field name="name">Leasehold Improvements (CCA Class 13)</field>
<field name="account_type">asset_fixed</field>
</record>
<record id="acct_151500" model="account.account">
<field name="code">151500</field>
<field name="code">1550</field>
<field name="name">Acquired Software &amp; Intangibles (CCA Class 14.1)</field>
<field name="account_type">asset_fixed</field>
</record>
<record id="acct_151600" model="account.account">
<field name="code">151600</field>
<field name="code">1560</field>
<field name="name">Tools &amp; Small Equipment &lt;$500 (CCA Class 12)</field>
<field name="account_type">asset_fixed</field>
</record>
<record id="acct_154100" model="account.account">
<field name="code">154100</field>
<field name="code">1710</field>
<field name="name">Acc. Depreciation — Computer Hardware</field>
<field name="account_type">asset_fixed</field>
</record>
<record id="acct_154200" model="account.account">
<field name="code">154200</field>
<field name="code">1720</field>
<field name="name">Acc. Depreciation — Office Furniture</field>
<field name="account_type">asset_fixed</field>
</record>
<record id="acct_154300" model="account.account">
<field name="code">154300</field>
<field name="code">1730</field>
<field name="name">Acc. Depreciation — Vehicles</field>
<field name="account_type">asset_fixed</field>
</record>
<record id="acct_154400" model="account.account">
<field name="code">154400</field>
<field name="code">1740</field>
<field name="name">Acc. Depreciation — Leasehold Improvements</field>
<field name="account_type">asset_fixed</field>
</record>
<record id="acct_154500" model="account.account">
<field name="code">154500</field>
<field name="code">1750</field>
<field name="name">Acc. Depreciation — Acquired Software</field>
<field name="account_type">asset_fixed</field>
</record>
@@ -116,75 +116,75 @@
<!-- ============================================================ -->
<record id="acct_213100" model="account.account">
<field name="code">213100</field>
<field name="code">2110</field>
<field name="name">HST/GST Collected on Sales</field>
<field name="account_type">liability_current</field>
</record>
<record id="acct_213500" model="account.account">
<field name="code">213500</field>
<field name="code">2120</field>
<field name="name">QST Collected on Sales</field>
<field name="account_type">liability_current</field>
</record>
<record id="acct_214100" model="account.account">
<field name="code">214100</field>
<field name="code">2130</field>
<field name="name">Net HST/GST Payable</field>
<field name="account_type">liability_current</field>
</record>
<record id="acct_215100" model="account.account">
<field name="code">215100</field>
<field name="code">2210</field>
<field name="name">Source Deductions Payable — Federal Tax</field>
<field name="account_type">liability_current</field>
</record>
<record id="acct_215200" model="account.account">
<field name="code">215200</field>
<field name="code">2220</field>
<field name="name">Source Deductions Payable — CPP</field>
<field name="account_type">liability_current</field>
</record>
<record id="acct_215300" model="account.account">
<field name="code">215300</field>
<field name="code">2230</field>
<field name="name">Source Deductions Payable — EI</field>
<field name="account_type">liability_current</field>
</record>
<record id="acct_216100" model="account.account">
<field name="code">216100</field>
<field name="code">2310</field>
<field name="name">Corporate Income Tax — Federal Payable</field>
<field name="account_type">liability_current</field>
</record>
<record id="acct_216200" model="account.account">
<field name="code">216200</field>
<field name="code">2320</field>
<field name="name">Corporate Income Tax — Provincial Payable</field>
<field name="account_type">liability_current</field>
</record>
<record id="acct_216300" model="account.account">
<field name="code">216300</field>
<field name="code">2330</field>
<field name="name">Corporate Tax Instalments Paid</field>
<field name="account_type">asset_current</field>
</record>
<record id="acct_221100" model="account.account">
<field name="code">221100</field>
<field name="code">2510</field>
<field name="name">Due To Shareholder — Gurpreet (short-term)</field>
<field name="account_type">liability_current</field>
<field name="reconcile" eval="True"/>
</record>
<record id="acct_221200" model="account.account">
<field name="code">221200</field>
<field name="code">2520</field>
<field name="name">Shareholder Loan — Gurpreet (long-term)</field>
<field name="account_type">liability_non_current</field>
<field name="reconcile" eval="True"/>
</record>
<record id="acct_222900" model="account.account">
<field name="code">222900</field>
<field name="code">2590</field>
<field name="name">Due To Associated Corporations</field>
<field name="account_type">liability_current</field>
<field name="reconcile" eval="True"/>
@@ -195,37 +195,37 @@
<!-- ============================================================ -->
<record id="acct_311100" model="account.account">
<field name="code">311100</field>
<field name="code">3010</field>
<field name="name">Share Capital — Common Shares</field>
<field name="account_type">equity</field>
</record>
<record id="acct_311200" model="account.account">
<field name="code">311200</field>
<field name="code">3020</field>
<field name="name">Share Capital — Preferred Shares</field>
<field name="account_type">equity</field>
</record>
<record id="acct_311300" model="account.account">
<field name="code">311300</field>
<field name="code">3030</field>
<field name="name">Contributed Surplus</field>
<field name="account_type">equity</field>
</record>
<record id="acct_321100" model="account.account">
<field name="code">321100</field>
<field name="code">3510</field>
<field name="name">Retained Earnings — Current Year</field>
<field name="account_type">equity</field>
</record>
<record id="acct_321200" model="account.account">
<field name="code">321200</field>
<field name="code">3520</field>
<field name="name">Retained Earnings — Prior Years</field>
<field name="account_type">equity</field>
</record>
<record id="acct_321900" model="account.account">
<field name="code">321900</field>
<field name="code">3590</field>
<field name="name">Dividends Declared</field>
<field name="account_type">equity</field>
</record>
@@ -235,115 +235,115 @@
<!-- ============================================================ -->
<record id="acct_411100" model="account.account">
<field name="code">411100</field>
<field name="code">4010</field>
<field name="name">SaaS Subscription Revenue</field>
<field name="account_type">income</field>
</record>
<record id="acct_411200" model="account.account">
<field name="code">411200</field>
<field name="code">4020</field>
<field name="name">Hosting &amp; Infrastructure Revenue</field>
<field name="account_type">income</field>
</record>
<record id="acct_411300" model="account.account">
<field name="code">411300</field>
<field name="code">4030</field>
<field name="name">Support &amp; Maintenance Contracts Revenue</field>
<field name="account_type">income</field>
</record>
<record id="acct_411400" model="account.account">
<field name="code">411400</field>
<field name="code">4040</field>
<field name="name">Domain/SSL/Renewal Pass-through Revenue</field>
<field name="account_type">income</field>
</record>
<record id="acct_411500" model="account.account">
<field name="code">411500</field>
<field name="code">4050</field>
<field name="name">Setup / Onboarding Fees Revenue</field>
<field name="account_type">income</field>
</record>
<record id="acct_412100" model="account.account">
<field name="code">412100</field>
<field name="code">4110</field>
<field name="name">Custom Software Development Revenue</field>
<field name="account_type">income</field>
</record>
<record id="acct_412200" model="account.account">
<field name="code">412200</field>
<field name="code">4120</field>
<field name="name">Custom Web Application Development Revenue</field>
<field name="account_type">income</field>
</record>
<record id="acct_412300" model="account.account">
<field name="code">412300</field>
<field name="code">4130</field>
<field name="name">Custom Website Development Revenue</field>
<field name="account_type">income</field>
</record>
<record id="acct_412400" model="account.account">
<field name="code">412400</field>
<field name="code">4140</field>
<field name="name">ERP Implementation &amp; Customization Revenue</field>
<field name="account_type">income</field>
</record>
<record id="acct_412500" model="account.account">
<field name="code">412500</field>
<field name="code">4150</field>
<field name="name">Mobile App Development Revenue</field>
<field name="account_type">income</field>
</record>
<record id="acct_412600" model="account.account">
<field name="code">412600</field>
<field name="code">4160</field>
<field name="name">Business App / Integration Revenue</field>
<field name="account_type">income</field>
</record>
<record id="acct_413100" model="account.account">
<field name="code">413100</field>
<field name="code">4210</field>
<field name="name">Consulting &amp; Advisory Revenue</field>
<field name="account_type">income</field>
</record>
<record id="acct_413200" model="account.account">
<field name="code">413200</field>
<field name="code">4220</field>
<field name="name">Training &amp; Workshops Revenue</field>
<field name="account_type">income</field>
</record>
<record id="acct_413300" model="account.account">
<field name="code">413300</field>
<field name="code">4230</field>
<field name="name">Technical Support — Per-incident / Hourly Revenue</field>
<field name="account_type">income</field>
</record>
<record id="acct_414100" model="account.account">
<field name="code">414100</field>
<field name="code">4310</field>
<field name="name">Third-party Software Resale Revenue</field>
<field name="account_type">income</field>
</record>
<record id="acct_414200" model="account.account">
<field name="code">414200</field>
<field name="code">4320</field>
<field name="name">Hardware Resale Revenue</field>
<field name="account_type">income</field>
</record>
<record id="acct_419100" model="account.account">
<field name="code">419100</field>
<field name="code">4910</field>
<field name="name">Sales Discounts</field>
<field name="account_type">income</field>
</record>
<record id="acct_419200" model="account.account">
<field name="code">419200</field>
<field name="code">4920</field>
<field name="name">Sales Returns &amp; Refunds</field>
<field name="account_type">income</field>
</record>
<record id="acct_419300" model="account.account">
<field name="code">419300</field>
<field name="code">4930</field>
<field name="name">Bad Debt Recovery</field>
<field name="account_type">income_other</field>
</record>
@@ -357,103 +357,103 @@
Cloud Infrastructure now claims the clean 511100 code. XMLID
acct_511105 preserved from initial install. -->
<record id="acct_511105" model="account.account">
<field name="code">511100</field>
<field name="code">5010</field>
<field name="name">Cloud Infrastructure (AWS, Hetzner, OVH, DigitalOcean, Linode)</field>
<field name="account_type">expense_direct_cost</field>
</record>
<record id="acct_511110" model="account.account">
<field name="code">511110</field>
<field name="code">5020</field>
<field name="name">CDN &amp; Edge Services (Cloudflare, Fastly)</field>
<field name="account_type">expense_direct_cost</field>
</record>
<record id="acct_511120" model="account.account">
<field name="code">511120</field>
<field name="code">5030</field>
<field name="name">Backup &amp; Storage Services</field>
<field name="account_type">expense_direct_cost</field>
</record>
<record id="acct_511130" model="account.account">
<field name="code">511130</field>
<field name="code">5040</field>
<field name="name">Database &amp; Backend Services (Supabase, hosted Postgres, Redis)</field>
<field name="account_type">expense_direct_cost</field>
</record>
<record id="acct_511140" model="account.account">
<field name="code">511140</field>
<field name="code">5050</field>
<field name="name">Monitoring &amp; Observability (customer-facing only)</field>
<field name="account_type">expense_direct_cost</field>
</record>
<record id="acct_511150" model="account.account">
<field name="code">511150</field>
<field name="code">5060</field>
<field name="name">SSL Certificates &amp; Domains (wholesale for resale)</field>
<field name="account_type">expense_direct_cost</field>
</record>
<record id="acct_511160" model="account.account">
<field name="code">511160</field>
<field name="code">5070</field>
<field name="name">DNS &amp; Email Hosting (wholesale for resale)</field>
<field name="account_type">expense_direct_cost</field>
</record>
<record id="acct_511200" model="account.account">
<field name="code">511200</field>
<field name="code">5110</field>
<field name="name">Third-party API Costs (Twilio, SendGrid, OpenAI)</field>
<field name="account_type">expense_direct_cost</field>
</record>
<record id="acct_511210" model="account.account">
<field name="code">511210</field>
<field name="code">5120</field>
<field name="name">Per-customer Licensing &amp; Royalties</field>
<field name="account_type">expense_direct_cost</field>
</record>
<record id="acct_512100" model="account.account">
<field name="code">512100</field>
<field name="code">5210</field>
<field name="name">Subcontracted Labour — Canadian (T4A) — SR&amp;ED-eligible</field>
<field name="account_type">expense_direct_cost</field>
</record>
<record id="acct_512110" model="account.account">
<field name="code">512110</field>
<field name="code">5220</field>
<field name="name">Subcontracted Labour — Foreign — NOT SR&amp;ED-eligible</field>
<field name="account_type">expense_direct_cost</field>
</record>
<record id="acct_512200" model="account.account">
<field name="code">512200</field>
<field name="code">5230</field>
<field name="name">Project-specific Software &amp; Licenses</field>
<field name="account_type">expense_direct_cost</field>
</record>
<record id="acct_512300" model="account.account">
<field name="code">512300</field>
<field name="code">5240</field>
<field name="name">Project Travel &amp; Onsite (rebilled)</field>
<field name="account_type">expense_direct_cost</field>
</record>
<record id="acct_512400" model="account.account">
<field name="code">512400</field>
<field name="code">5250</field>
<field name="name">Project Hardware (passed through)</field>
<field name="account_type">expense_direct_cost</field>
</record>
<record id="acct_513100" model="account.account">
<field name="code">513100</field>
<field name="code">5310</field>
<field name="name">Cost of Software Resold</field>
<field name="account_type">expense_direct_cost</field>
</record>
<record id="acct_513200" model="account.account">
<field name="code">513200</field>
<field name="code">5320</field>
<field name="name">Cost of Hardware Resold</field>
<field name="account_type">expense_direct_cost</field>
</record>
<record id="acct_519100" model="account.account">
<field name="code">519100</field>
<field name="code">5910</field>
<field name="name">COGS Adjustments / Write-offs</field>
<field name="account_type">expense_direct_cost</field>
</record>
@@ -463,349 +463,349 @@
<!-- ============================================================ -->
<record id="acct_611100" model="account.account">
<field name="code">611100</field>
<field name="code">6010</field>
<field name="name">Salaries &amp; Wages — Development (SR&amp;ED-eligible)</field>
<field name="account_type">expense</field>
</record>
<record id="acct_611200" model="account.account">
<field name="code">611200</field>
<field name="code">6020</field>
<field name="name">Salaries &amp; Wages — Sales &amp; Marketing</field>
<field name="account_type">expense</field>
</record>
<record id="acct_611300" model="account.account">
<field name="code">611300</field>
<field name="code">6030</field>
<field name="name">Salaries &amp; Wages — Admin &amp; Operations</field>
<field name="account_type">expense</field>
</record>
<record id="acct_611400" model="account.account">
<field name="code">611400</field>
<field name="code">6040</field>
<field name="name">Salary — Shareholder/Officer (Gurpreet)</field>
<field name="account_type">expense</field>
</record>
<record id="acct_611500" model="account.account">
<field name="code">611500</field>
<field name="code">6050</field>
<field name="name">Employer CPP / QPP Contributions</field>
<field name="account_type">expense</field>
</record>
<record id="acct_611600" model="account.account">
<field name="code">611600</field>
<field name="code">6060</field>
<field name="name">Employer EI Premiums</field>
<field name="account_type">expense</field>
</record>
<record id="acct_611700" model="account.account">
<field name="code">611700</field>
<field name="code">6070</field>
<field name="name">Employer Health Tax (EHT/QHST)</field>
<field name="account_type">expense</field>
</record>
<record id="acct_611800" model="account.account">
<field name="code">611800</field>
<field name="code">6080</field>
<field name="name">WCB / WSIB Premiums</field>
<field name="account_type">expense</field>
</record>
<record id="acct_611900" model="account.account">
<field name="code">611900</field>
<field name="code">6090</field>
<field name="name">Employee Benefits (health, dental, group)</field>
<field name="account_type">expense</field>
</record>
<record id="acct_611950" model="account.account">
<field name="code">611950</field>
<field name="code">6091</field>
<field name="name">Bonuses &amp; Incentives</field>
<field name="account_type">expense</field>
</record>
<record id="acct_611960" model="account.account">
<field name="code">611960</field>
<field name="code">6092</field>
<field name="name">Vacation Pay Accrual</field>
<field name="account_type">expense</field>
</record>
<record id="acct_612100" model="account.account">
<field name="code">612100</field>
<field name="code">6110</field>
<field name="name">Contract Labour — Canadian (admin/marketing/freelance)</field>
<field name="account_type">expense</field>
</record>
<record id="acct_612200" model="account.account">
<field name="code">612200</field>
<field name="code">6120</field>
<field name="name">Contract Labour — Foreign</field>
<field name="account_type">expense</field>
</record>
<record id="acct_621100" model="account.account">
<field name="code">621100</field>
<field name="code">6210</field>
<field name="name">Rent — Commercial Office</field>
<field name="account_type">expense</field>
</record>
<record id="acct_621200" model="account.account">
<field name="code">621200</field>
<field name="code">6220</field>
<field name="name">Home Office — Business Portion</field>
<field name="account_type">expense</field>
</record>
<record id="acct_621300" model="account.account">
<field name="code">621300</field>
<field name="code">6230</field>
<field name="name">Utilities — Commercial</field>
<field name="account_type">expense</field>
</record>
<record id="acct_621400" model="account.account">
<field name="code">621400</field>
<field name="code">6240</field>
<field name="name">Internet &amp; Phone — Business</field>
<field name="account_type">expense</field>
</record>
<record id="acct_621500" model="account.account">
<field name="code">621500</field>
<field name="code">6250</field>
<field name="name">Office Supplies &amp; Consumables</field>
<field name="account_type">expense</field>
</record>
<record id="acct_621600" model="account.account">
<field name="code">621600</field>
<field name="code">6260</field>
<field name="name">Cleaning &amp; Maintenance</field>
<field name="account_type">expense</field>
</record>
<record id="acct_621700" model="account.account">
<field name="code">621700</field>
<field name="code">6270</field>
<field name="name">Office Snacks &amp; Refreshments</field>
<field name="account_type">expense</field>
</record>
<record id="acct_631100" model="account.account">
<field name="code">631100</field>
<field name="code">6310</field>
<field name="name">Software — Productivity (M365, Slack, Notion, Linear, GitHub)</field>
<field name="account_type">expense</field>
</record>
<record id="acct_631200" model="account.account">
<field name="code">631200</field>
<field name="code">6320</field>
<field name="name">Software — Development Tools (Cursor, Figma, IDEs)</field>
<field name="account_type">expense</field>
</record>
<record id="acct_631300" model="account.account">
<field name="code">631300</field>
<field name="code">6330</field>
<field name="name">Software — Internal Infrastructure</field>
<field name="account_type">expense</field>
</record>
<record id="acct_631400" model="account.account">
<field name="code">631400</field>
<field name="code">6340</field>
<field name="name">Software — Security &amp; IT</field>
<field name="account_type">expense</field>
</record>
<record id="acct_631500" model="account.account">
<field name="code">631500</field>
<field name="code">6350</field>
<field name="name">Software — Sales &amp; Marketing</field>
<field name="account_type">expense</field>
</record>
<record id="acct_641100" model="account.account">
<field name="code">641100</field>
<field name="code">6410</field>
<field name="name">Advertising — Digital Ads</field>
<field name="account_type">expense</field>
</record>
<record id="acct_641200" model="account.account">
<field name="code">641200</field>
<field name="code">6420</field>
<field name="name">Advertising — Content / SEO</field>
<field name="account_type">expense</field>
</record>
<record id="acct_641300" model="account.account">
<field name="code">641300</field>
<field name="code">6430</field>
<field name="name">Trade Shows &amp; Conferences</field>
<field name="account_type">expense</field>
</record>
<record id="acct_641400" model="account.account">
<field name="code">641400</field>
<field name="code">6440</field>
<field name="name">Promotional Items / Branded Swag</field>
<field name="account_type">expense</field>
</record>
<record id="acct_641500" model="account.account">
<field name="code">641500</field>
<field name="code">6450</field>
<field name="name">Website — Own (nexasystems.ca)</field>
<field name="account_type">expense</field>
</record>
<record id="acct_651100" model="account.account">
<field name="code">651100</field>
<field name="code">6510</field>
<field name="name">Legal Fees — General</field>
<field name="account_type">expense</field>
</record>
<record id="acct_651200" model="account.account">
<field name="code">651200</field>
<field name="code">6520</field>
<field name="name">Accounting &amp; Bookkeeping</field>
<field name="account_type">expense</field>
</record>
<record id="acct_651300" model="account.account">
<field name="code">651300</field>
<field name="code">6530</field>
<field name="name">Tax Preparation (T2, T1, GST/HST)</field>
<field name="account_type">expense</field>
</record>
<record id="acct_651400" model="account.account">
<field name="code">651400</field>
<field name="code">6540</field>
<field name="name">Business Consulting</field>
<field name="account_type">expense</field>
</record>
<record id="acct_661100" model="account.account">
<field name="code">661100</field>
<field name="code">6610</field>
<field name="name">Insurance — Commercial General Liability</field>
<field name="account_type">expense</field>
</record>
<record id="acct_661200" model="account.account">
<field name="code">661200</field>
<field name="code">6620</field>
<field name="name">Insurance — Professional Liability / E&amp;O</field>
<field name="account_type">expense</field>
</record>
<record id="acct_661300" model="account.account">
<field name="code">661300</field>
<field name="code">6630</field>
<field name="name">Insurance — Cyber Liability</field>
<field name="account_type">expense</field>
</record>
<record id="acct_661400" model="account.account">
<field name="code">661400</field>
<field name="code">6640</field>
<field name="name">Insurance — Property</field>
<field name="account_type">expense</field>
</record>
<record id="acct_661500" model="account.account">
<field name="code">661500</field>
<field name="code">6650</field>
<field name="name">Insurance — Directors &amp; Officers</field>
<field name="account_type">expense</field>
</record>
<record id="acct_671100" model="account.account">
<field name="code">671100</field>
<field name="code">6710</field>
<field name="name">Travel — Flights, Hotels, Ground Transport</field>
<field name="account_type">expense</field>
</record>
<record id="acct_671200" model="account.account">
<field name="code">671200</field>
<field name="code">6720</field>
<field name="name">Meals &amp; Entertainment — 50% Deductible</field>
<field name="account_type">expense</field>
</record>
<record id="acct_671300" model="account.account">
<field name="code">671300</field>
<field name="code">6730</field>
<field name="name">Vehicle — Operating (gas, insurance, repairs, parking)</field>
<field name="account_type">expense</field>
</record>
<record id="acct_671400" model="account.account">
<field name="code">671400</field>
<field name="code">6740</field>
<field name="name">Mileage Reimbursement — Personal Vehicle</field>
<field name="account_type">expense</field>
</record>
<record id="acct_681100" model="account.account">
<field name="code">681100</field>
<field name="code">6810</field>
<field name="name">Conferences &amp; Seminars (registration)</field>
<field name="account_type">expense</field>
</record>
<record id="acct_681200" model="account.account">
<field name="code">681200</field>
<field name="code">6820</field>
<field name="name">Courses &amp; Certifications</field>
<field name="account_type">expense</field>
</record>
<record id="acct_681300" model="account.account">
<field name="code">681300</field>
<field name="code">6830</field>
<field name="name">Books &amp; Publications</field>
<field name="account_type">expense</field>
</record>
<record id="acct_681400" model="account.account">
<field name="code">681400</field>
<field name="code">6840</field>
<field name="name">Professional Memberships &amp; Dues</field>
<field name="account_type">expense</field>
</record>
<record id="acct_691100" model="account.account">
<field name="code">691100</field>
<field name="code">6910</field>
<field name="name">Bank Service Charges</field>
<field name="account_type">expense</field>
</record>
<record id="acct_691200" model="account.account">
<field name="code">691200</field>
<field name="code">6920</field>
<field name="name">Merchant Processing Fees (Stripe, PayPal, Square)</field>
<field name="account_type">expense</field>
</record>
<record id="acct_691300" model="account.account">
<field name="code">691300</field>
<field name="code">6930</field>
<field name="name">Wire Transfer &amp; FX Fees</field>
<field name="account_type">expense</field>
</record>
<record id="acct_691400" model="account.account">
<field name="code">691400</field>
<field name="code">6940</field>
<field name="name">Interest Expense — Bank Loans / LOC</field>
<field name="account_type">expense</field>
</record>
<record id="acct_691500" model="account.account">
<field name="code">691500</field>
<field name="code">6950</field>
<field name="name">Interest Expense — Credit Cards</field>
<field name="account_type">expense</field>
</record>
<record id="acct_691600" model="account.account">
<field name="code">691600</field>
<field name="code">6960</field>
<field name="name">Late Payment Penalties — Non-deductible</field>
<field name="account_type">expense</field>
</record>
<record id="acct_699100" model="account.account">
<field name="code">699100</field>
<field name="code">7010</field>
<field name="name">Bad Debt Expense</field>
<field name="account_type">expense</field>
</record>
<record id="acct_699200" model="account.account">
<field name="code">699200</field>
<field name="code">7020</field>
<field name="name">Donations &amp; Sponsorships (deductible)</field>
<field name="account_type">expense</field>
</record>
<record id="acct_699300" model="account.account">
<field name="code">699300</field>
<field name="code">7030</field>
<field name="name">Penalties &amp; Fines — Non-deductible</field>
<field name="account_type">expense</field>
</record>
<record id="acct_699400" model="account.account">
<field name="code">699400</field>
<field name="code">7040</field>
<field name="name">Realized FX Losses</field>
<field name="account_type">expense</field>
</record>
<record id="acct_699500" model="account.account">
<field name="code">699500</field>
<field name="code">7050</field>
<field name="name">Depreciation / CCA Expense</field>
<field name="account_type">expense</field>
</record>

View File

@@ -232,18 +232,18 @@ def _delete_unused_accounts(env):
# at the new accounts, so when an invoice creates tax journal items they hit
# 118100 (ITC) and 213100 (HST collected) instead of the archived legacy ones.
_TAX_REPARTITION_REMAP = {
# ITC / receivable side
"118100.OLD": "118100",
"118200.OLD": "118300", # PST/QST receivable → QST refund receivable
"118300.OLD": "118100",
"118400": "118100", # 14% HST receivable
"118500": "118100", # 15% HST receivable
# Payable / collected side
"231000": "213100", # GST to pay
"232000": "213500", # PST/QST to pay
"233000": "213100", # HST 13% to pay
"234000": "213100", # HST 14% to pay
"235000": "213100", # HST 15% to pay
# ITC / receivable side → Nexa 1210 HST/GST ITC Receivable (or 1230 QST refund)
"118100.OLD": "1210",
"118200.OLD": "1230",
"118300.OLD": "1210",
"118400": "1210",
"118500": "1210",
# Payable / collected side → Nexa 2110 HST/GST Collected (or 2120 QST collected)
"231000": "2110",
"232000": "2120",
"233000": "2110",
"234000": "2110",
"235000": "2110",
}
@@ -483,20 +483,20 @@ def _archive_unused_l10n_ca_accounts(env):
# accountant-driven reconciliation.
_LEGACY_RENAMES = [
# (code, new_name, archive_after)
("1400", "(LEGACY) Transferred to Gurpreet — re-class to 221100", True),
("1505", "(LEGACY) Sent to India — re-class to 612200", True),
("1400", "(LEGACY) Transferred to Gurpreet — re-class to 2510", True),
("1505", "(LEGACY) Sent to India — re-class to 6120", True),
("1580", "(LEGACY) Transferred to Westin — Westin is now a partner", True),
("1590", "(LEGACY) Transferred to Divine — Divine is now a partner", True),
("1600", "(LEGACY) Transferred to Manpreet — non-related; archive", True),
("1500", "(LEGACY) Food & Entertainment — re-class to 671200", True),
("1501", "(LEGACY) Office Expenses — re-class to 621500", True),
("411000", "(LEGACY) Inside Sales — re-class to 412xxx specific lines", True),
("1500", "(LEGACY) Food & Entertainment — re-class to 6720", True),
("1501", "(LEGACY) Office Expenses — re-class to 6250", True),
("411000", "(LEGACY) Inside Sales — re-class to 4xxx specific lines", True),
("412000", "(LEGACY) Harmonized Provinces Sales — handled by tax codes", True),
("413000", "(LEGACY) Non-Harmonized Provinces Sales — handled by tax", True),
("414000", "(LEGACY) International Sales — handled by Zero-rated Export", True),
("12000", "(LEGACY) Abdul & Future Mobility — use partner subledger", True),
("12001", "(LEGACY) MSI Account — use partner subledger", True),
("110010", "(LEGACY) Bank Fee — re-class to 691100", True),
("110010", "(LEGACY) Bank Fee — re-class to 6910", True),
]

View File

@@ -0,0 +1,171 @@
"""Map current Nexa CoA codes (6-digit) to a clean 4-digit scheme.
Run on prod via odoo-shell. Updates account_account.code in place."""
# (current_code, new_code, expected_name_substring_for_safety)
CODE_MAP = [
# 1xxx ASSETS
("115200", "1120", "Due From Shareholder"),
("115900", "1130", "Due From Associated Corporations"),
("118100", "1210", "Input Tax Credit"),
("118200", "1220", "Instalments Paid"),
("118300", "1230", "QST Input Tax Refund"),
("151100", "1510", "Computer Hardware"),
("151200", "1520", "Office Furniture"),
("151300", "1530", "Vehicles"),
("151400", "1540", "Leasehold Improvements"),
("151500", "1550", "Acquired Software"),
("151600", "1560", "Tools"),
("154100", "1710", "Acc. Depreciation — Computer"),
("154200", "1720", "Acc. Depreciation — Office"),
("154300", "1730", "Acc. Depreciation — Vehicles"),
("154400", "1740", "Acc. Depreciation — Leasehold"),
("154500", "1750", "Acc. Depreciation — Acquired"),
# 2xxx LIABILITIES
("213100", "2110", "HST/GST Collected"),
("213500", "2120", "QST Collected"),
("214100", "2130", "Net HST/GST Payable"),
("215100", "2210", "Source Deductions Payable — Federal"),
("215200", "2220", "Source Deductions Payable — CPP"),
("215300", "2230", "Source Deductions Payable — EI"),
("216100", "2310", "Federal Payable"),
("216200", "2320", "Provincial Payable"),
("216300", "2330", "Tax Instalments Paid"),
("221100", "2510", "Due To Shareholder"),
("221200", "2520", "Shareholder Loan"),
("222900", "2590", "Due To Associated Corporations"),
# 3xxx EQUITY
("311100", "3010", "Common Shares"),
("311200", "3020", "Preferred Shares"),
("311300", "3030", "Contributed Surplus"),
("321100", "3510", "Retained Earnings — Current"),
("321200", "3520", "Retained Earnings — Prior"),
("321900", "3590", "Dividends Declared"),
# 4xxx REVENUE
("411100", "4010", "SaaS Subscription"),
("411200", "4020", "Hosting"),
("411300", "4030", "Support"),
("411400", "4040", "Domain/SSL"),
("411500", "4050", "Setup"),
("412100", "4110", "Custom Software Development"),
("412200", "4120", "Custom Web Application"),
("412300", "4130", "Custom Website"),
("412400", "4140", "ERP Implementation"),
("412500", "4150", "Mobile App"),
("412600", "4160", "Business App"),
("413100", "4210", "Consulting"),
("413200", "4220", "Training"),
("413300", "4230", "Technical Support — Per-incident"),
("414100", "4310", "Third-party Software Resale"),
("414200", "4320", "Hardware Resale"),
("419100", "4910", "Sales Discounts"),
("419200", "4920", "Sales Returns"),
("419300", "4930", "Bad Debt Recovery"),
# 5xxx COGS
("511100", "5010", "Cloud Infrastructure"),
("511110", "5020", "CDN"),
("511120", "5030", "Backup"),
("511130", "5040", "Database"),
("511140", "5050", "Monitoring"),
("511150", "5060", "SSL"),
("511160", "5070", "DNS"),
("511200", "5110", "Third-party API"),
("511210", "5120", "Per-customer Licensing"),
("512100", "5210", "Subcontracted Labour — Canadian"),
("512110", "5220", "Subcontracted Labour — Foreign"),
("512200", "5230", "Project-specific Software"),
("512300", "5240", "Project Travel"),
("512400", "5250", "Project Hardware"),
("513100", "5310", "Cost of Software Resold"),
("513200", "5320", "Cost of Hardware Resold"),
("519100", "5910", "COGS Adjustments"),
# 6xxx OPERATING EXPENSES
("611100", "6010", "Salaries & Wages — Development"),
("611200", "6020", "Salaries & Wages — Sales"),
("611300", "6030", "Salaries & Wages — Admin"),
("611400", "6040", "Salary — Shareholder"),
("611500", "6050", "Employer CPP"),
("611600", "6060", "Employer EI"),
("611700", "6070", "Employer Health Tax"),
("611800", "6080", "WCB"),
("611900", "6090", "Employee Benefits"),
("611950", "6091", "Bonuses"),
("611960", "6092", "Vacation Pay"),
("612100", "6110", "Contract Labour — Canadian"),
("612200", "6120", "Contract Labour — Foreign"),
("621100", "6210", "Rent"),
("621200", "6220", "Home Office"),
("621300", "6230", "Utilities"),
("621400", "6240", "Internet"),
("621500", "6250", "Office Supplies"),
("621600", "6260", "Cleaning"),
("621700", "6270", "Office Snacks"),
("631100", "6310", "Software — Productivity"),
("631200", "6320", "Software — Development Tools"),
("631300", "6330", "Software — Internal Infrastructure"),
("631400", "6340", "Software — Security"),
("631500", "6350", "Software — Sales"),
("641100", "6410", "Advertising — Digital"),
("641200", "6420", "Advertising — Content"),
("641300", "6430", "Trade Shows"),
("641400", "6440", "Promotional"),
("641500", "6450", "Website — Own"),
("651100", "6510", "Legal Fees"),
("651200", "6520", "Accounting"),
("651300", "6530", "Tax Preparation"),
("651400", "6540", "Business Consulting"),
("661100", "6610", "Insurance — Commercial General"),
("661200", "6620", "Insurance — Professional Liability"),
("661300", "6630", "Insurance — Cyber"),
("661400", "6640", "Insurance — Property"),
("661500", "6650", "Insurance — Directors"),
("671100", "6710", "Travel"),
("671200", "6720", "Meals"),
("671300", "6730", "Vehicle — Operating"),
("671400", "6740", "Mileage"),
("681100", "6810", "Conferences"),
("681200", "6820", "Courses"),
("681300", "6830", "Books"),
("681400", "6840", "Professional Memberships"),
("691100", "6910", "Bank Service Charges"),
("691200", "6920", "Merchant Processing"),
("691300", "6930", "Wire Transfer"),
("691400", "6940", "Interest Expense — Bank"),
("691500", "6950", "Interest Expense — Credit Cards"),
("691600", "6960", "Late Payment Penalties"),
# 7xxx OTHER (was 699xxx)
("699100", "7010", "Bad Debt Expense"),
("699200", "7020", "Donations"),
("699300", "7030", "Penalties & Fines"),
("699400", "7040", "Realized FX Losses"),
("699500", "7050", "Depreciation"),
]
ok = 0
skipped = 0
missing = 0
for old_code, new_code, expected_name_part in CODE_MAP:
acc = env['account.account'].search([('code', '=', old_code)], limit=1)
if not acc:
print(f"MISS {old_code}{new_code}: not found")
missing += 1
continue
if expected_name_part.lower() not in (acc.name or '').lower():
print(f"SKIP {old_code}{new_code}: name '{acc.name}' doesn't contain '{expected_name_part}'")
skipped += 1
continue
# Check target code is free
conflict = env['account.account'].with_context(active_test=False).search([('code', '=', new_code)], limit=1)
if conflict:
print(f"SKIP {old_code}{new_code}: target occupied by {conflict.name}")
skipped += 1
continue
acc.code = new_code
ok += 1
print(f">>> Renumbered {ok}, skipped {skipped}, missing {missing} of {len(CODE_MAP)}")
env.cr.commit()