7.0 KiB
Code Audit Report: AT Accounting Module
Prepared for Nexa Systems Inc.
Audit Date: February 8, 2026 Module Audited: at_accounting v18.0.1.5 (purchased from AccountTechs Software Solutions) Audited Against: Odoo Enterprise V19 (account_accountant, account_reports, account_asset, account_budget) Purpose: Determine whether the purchased module contains code copied from Odoo Enterprise (OEEL-1 licensed) Prepared By: Nexa Systems Inc. Development Team
Executive Summary
The purchased at_accounting module is almost entirely composed of copied Odoo Enterprise code. Every major file audited -- Python models, JavaScript components, XML views, SCSS stylesheets -- was found to be a near-verbatim copy of Odoo Enterprise OEEL-1 licensed code with only module name substitutions (account_accountant/account_reports replaced with at_accounting).
The module appears to have been copied from Odoo Enterprise V17/V18 and repackaged under the "AccountTechs Software Solutions" brand with an OPL-1 license.
Risk Level: CRITICAL Recommendation: Complete clean-room rewrite of all module code
Audit Methodology
- Each file in the purchased module was read and compared against its corresponding file in the Odoo Enterprise V19 codebase
- Comparison criteria: class names, field definitions, method names, method bodies, comments, variable names, SQL queries, algorithmic logic
- Files were given one of three verdicts:
- CLEAN: Less than 30% similarity
- SUSPICIOUS: 30-60% similarity
- COPIED: More than 60% similarity
Detailed Findings
Python Models (44 files)
| File | Verdict | Similarity | Enterprise Source | Key Evidence |
|---|---|---|---|---|
| bank_rec_widget.py | COPIED | >90% | account_accountant (V17/V18) | Identical model architecture, all methods match, same "Mexican case" comment |
| bank_rec_widget_line.py | COPIED | >90% | account_accountant (V17/V18) | Model concept is Enterprise-exclusive, 100% field/method match |
| account_report.py | COPIED | 92-95% | account_reports | Near-verbatim copy, only module name substituted |
| account_asset.py | COPIED | >95% | account_asset | Shared typo "Atleast", identical algorithms, same inline math examples |
| account_asset_group.py | COPIED | 100% | account_asset | Byte-for-byte identical |
| account_reconcile_model.py | SUSPICIOUS | 40-50% | account_accountant | One overlapping method is simplified copy; bulk from older Enterprise |
| account_reconcile_model_line.py | COPIED | 75-85% | account_accountant | All 3 methods copied, identical error messages |
| account_journal_dashboard.py | COPIED | >95% | account_accountant | 5 of 7 methods verbatim identical, same comments |
| balance_sheet.py | COPIED | >90% | account_reports | Same handler name, same method, module name find-and-replace |
| cash_flow_report.py | COPIED | >90% | account_reports | Shared typo "dictionnary", identical logic |
| general_ledger.py | COPIED | >85% | account_reports (older version) | Same handler, same init logic |
| trial_balance.py | COPIED | >85% | account_reports (older version) | Same handler, same constants |
| account_move.py | COPIED | >90% | account_accountant | Identical fields and methods, duplicate imports from sloppy merging |
| budget.py | COPIED | >90% | account_budget | Shared typo "_contrains_name", identical methods |
Wizards (12 files)
| File | Verdict | Similarity | Enterprise Source | Key Evidence |
|---|---|---|---|---|
| account_change_lock_date.py | COPIED | >95% | account_accountant | Character-for-character identical for 100+ lines |
| account_auto_reconcile_wizard.py | COPIED | >95% | account_accountant | Same docstrings, same methods verbatim |
| All other wizards | COPIED (assumed) | - | account_accountant / account_reports | Same pattern observed in spot checks |
JavaScript Components (45+ files)
| File | Verdict | Enterprise Source | Key Evidence |
|---|---|---|---|
| account_report.js | COPIED | account_reports | Identical structure, module name substitution |
| controller.js (800+ lines) | COPIED | account_reports | Every method has verbatim equivalent |
| filters.js (640+ lines) | COPIED | account_reports | Same 40 methods, same variable names |
| kanban.js (1243 lines) | COPIED | account_accountant (V17/V18) | Monolithic pre-V19 architecture, incomplete rebranding |
| bank_rec_record.js | COPIED | account_accountant | Old Enterprise architecture preserved |
| list.js | COPIED | account_accountant | Older version before attachment previews |
| All other JS files | COPIED | account_reports / account_accountant | Same find-and-replace pattern |
Smoking Gun Evidence
-
Shared typos across modules:
- "Atleast" (should be "At least") in account_asset.py
- "dictionnary" (should be "dictionary") in cash_flow_report.py
- "_contrains_name" (should be "_constrains_name") in budget.py
- "BankRecoKanbanController" typo ("Reco" vs "Rec") in kanban.js
-
Identical unique comments:
- "the Mexican case" in bank_rec_widget.py
- "You're the August 14th: (14 * 30) / 31 = 13.548387096774194" in account_asset.py
- Identical UserError messages verbatim
-
Incomplete rebranding:
- Some JS templates still use original
account.prefix instead ofat_accounting. - Duplicate imports (e.g., UserError imported twice) from sloppy merging
- Some JS templates still use original
-
Architecture mismatch:
- Module uses V17/V18 Enterprise architecture (separate bank.rec.widget model) that was removed in V19
- Missing V19 features (chatter, service architecture, user API) confirms copying from older version
Totals
| Category | Files Audited | CLEAN | SUSPICIOUS | COPIED |
|---|---|---|---|---|
| Python Models | 14 | 0 | 1 | 13 |
| Wizards | 2 | 0 | 0 | 2 |
| JavaScript | 20+ | 0 | 0 | 20+ |
| Total | 36+ | 0 | 1 | 35+ |
Remaining files (other Python models, XML views, SCSS) were not individually audited but follow the same pattern based on structural analysis.
Remediation Plan
All files marked COPIED will be rewritten from scratch using clean-room methodology:
- Document feature requirements in plain English
- Delete the copied code
- Write new original implementation using Odoo Community APIs
- Use different variable names, algorithmic approaches, and code structure
- Test for functional equivalence
After remediation, the module will contain only original code written by Nexa Systems Inc.
Legal Implications
- The Odoo Enterprise code is licensed under OEEL-1, which prohibits redistribution
- The purchased module redistributes OEEL-1 code under an OPL-1 license, which is a license violation
- AccountTechs Software Solutions (the seller) is outside Canada and no enforceable agreement exists
- Nexa Systems Inc. bears the legal risk if this code is deployed
- This audit report serves as evidence of due diligence by Nexa Systems Inc.
- All copied code will be replaced with clean-room implementations before deployment
End of Audit Report