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:
@@ -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 & 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 & 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 & 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 & Small Equipment <$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 & 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 & 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 & 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 & 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 & 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 & 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 & 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 & 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 & 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 & 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 & 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 & 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 & 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&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&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 & 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 & 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 & Wages — Development (SR&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 & Wages — Sales & 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 & Wages — Admin & 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 & 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 & 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 & 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 & 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 & 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 & 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 & 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 & 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 & 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&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 & 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 & 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 & 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 & 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 & 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 & 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 & 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 & 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 & 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>
|
||||
|
||||
@@ -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),
|
||||
]
|
||||
|
||||
|
||||
|
||||
171
nexa_coa_setup/scripts/convert_to_4digit.py
Normal file
171
nexa_coa_setup/scripts/convert_to_4digit.py
Normal 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()
|
||||
Reference in New Issue
Block a user