Bring all areas to 60%: modules, reporting, i18n, views, data

Business modules deepened:
- sale: tag_ids, invoice/delivery counts with computes
- stock: _action_confirm/_action_done on stock.move, quant update stub
- purchase: done state added
- hr: parent_id, address_home_id, no_of_recruitment
- project: user_id, date_start, kanban_state on tasks

Reporting framework (0% → 60%):
- ir.actions.report model registered
- /report/html/<name>/<ids> endpoint serves styled HTML reports
- Report-to-model mapping for invoice, sale, stock, purchase

i18n framework (0% → 60%):
- ir.translation model with src/value/lang/type fields
- handleTranslations loads from DB, returns per-module structure
- 140 German translations seeded (UI terms across all modules)
- res_lang seeded with en_US + de_DE

Views/UI improved:
- Stored form views: sale.order (with editable O2M lines), account.move
  (with Post/Cancel buttons), res.partner (with title)
- Stored list views: purchase.order, hr.employee, project.project

Demo data expanded:
- 5 products (templates + variants with codes)
- 3 HR departments, 3 employees
- 2 projects

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Marc
2026-04-02 20:11:45 +02:00
parent eb92a2e239
commit 03fd58a852
13 changed files with 944 additions and 31 deletions

View File

@@ -57,7 +57,12 @@ func initHREmployee() {
orm.Many2one("company_id", "res.company", orm.FieldOpts{
String: "Company", Required: true, Index: true,
}),
orm.Many2one("parent_id", "hr.employee", orm.FieldOpts{String: "Manager", Index: true}),
orm.Many2one("address_id", "res.partner", orm.FieldOpts{String: "Work Address"}),
orm.Many2one("address_home_id", "res.partner", orm.FieldOpts{
String: "Private Address", Groups: "hr.group_hr_user",
}),
orm.Char("identification_id", orm.FieldOpts{String: "Identification No", Groups: "hr.group_hr_user"}),
orm.Char("work_email", orm.FieldOpts{String: "Work Email"}),
orm.Char("work_phone", orm.FieldOpts{String: "Work Phone"}),
orm.Char("mobile_phone", orm.FieldOpts{String: "Work Mobile"}),
@@ -145,6 +150,7 @@ func initHRJob() {
String: "Company", Required: true, Index: true,
}),
orm.Integer("expected_employees", orm.FieldOpts{String: "Expected New Employees", Default: 1}),
orm.Integer("no_of_recruitment", orm.FieldOpts{String: "Expected in Recruitment"}),
orm.Integer("no_of_hired_employee", orm.FieldOpts{String: "Hired Employees"}),
orm.Selection("state", []orm.SelectionItem{
{Value: "recruit", Label: "Recruitment in Progress"},