From 0c3d488d7d3fa406955ab6190467591eef6f8f96 Mon Sep 17 00:00:00 2001 From: phaichayon Date: Thu, 2 Jul 2026 14:27:51 +0700 Subject: [PATCH] task-d.7.4 --- .../task-d73-csv-template-static-pack.md | 67 +++ plans/task-d.7.3.md | 528 ++++++++++++++++++ setup/templates/README.md | 91 +++ setup/templates/approval-matrix.csv | 2 + setup/templates/approval-steps.csv | 2 + setup/templates/approval-workflows.csv | 2 + setup/templates/branches.csv | 2 + setup/templates/contact-shares.csv | 2 + setup/templates/contacts.csv | 2 + setup/templates/crm-role-assignments.csv | 2 + setup/templates/customers.csv | 2 + setup/templates/document-sequences.csv | 2 + setup/templates/leads.csv | 2 + setup/templates/master-options.csv | 2 + setup/templates/memberships.csv | 2 + setup/templates/opportunities.csv | 2 + setup/templates/opportunity-parties.csv | 2 + setup/templates/organizations.csv | 2 + setup/templates/product-types.csv | 2 + setup/templates/quotation-items.csv | 2 + setup/templates/quotation-parties.csv | 2 + setup/templates/quotation-topic-items.csv | 2 + setup/templates/quotation-topics.csv | 2 + setup/templates/quotations.csv | 2 + setup/templates/templates.json | 255 +++++++++ setup/templates/users.csv | 2 + src/app/api/setup/templates/route.ts | 39 ++ 27 files changed, 1024 insertions(+) create mode 100644 docs/implementation/task-d73-csv-template-static-pack.md create mode 100644 plans/task-d.7.3.md create mode 100644 setup/templates/README.md create mode 100644 setup/templates/approval-matrix.csv create mode 100644 setup/templates/approval-steps.csv create mode 100644 setup/templates/approval-workflows.csv create mode 100644 setup/templates/branches.csv create mode 100644 setup/templates/contact-shares.csv create mode 100644 setup/templates/contacts.csv create mode 100644 setup/templates/crm-role-assignments.csv create mode 100644 setup/templates/customers.csv create mode 100644 setup/templates/document-sequences.csv create mode 100644 setup/templates/leads.csv create mode 100644 setup/templates/master-options.csv create mode 100644 setup/templates/memberships.csv create mode 100644 setup/templates/opportunities.csv create mode 100644 setup/templates/opportunity-parties.csv create mode 100644 setup/templates/organizations.csv create mode 100644 setup/templates/product-types.csv create mode 100644 setup/templates/quotation-items.csv create mode 100644 setup/templates/quotation-parties.csv create mode 100644 setup/templates/quotation-topic-items.csv create mode 100644 setup/templates/quotation-topics.csv create mode 100644 setup/templates/quotations.csv create mode 100644 setup/templates/templates.json create mode 100644 setup/templates/users.csv create mode 100644 src/app/api/setup/templates/route.ts diff --git a/docs/implementation/task-d73-csv-template-static-pack.md b/docs/implementation/task-d73-csv-template-static-pack.md new file mode 100644 index 0000000..c013c3a --- /dev/null +++ b/docs/implementation/task-d73-csv-template-static-pack.md @@ -0,0 +1,67 @@ +# Task D.7.3 CSV Template Generator Static Template Pack + +Date: 2026-07-02 +Status: implemented + +## Scope Delivered + +Created the official static setup CSV template pack under `setup/templates/`. + +Generated supported CSV files: + +- `organizations.csv` +- `users.csv` +- `memberships.csv` +- `crm-role-assignments.csv` +- `master-options.csv` +- `branches.csv` +- `product-types.csv` +- `document-sequences.csv` +- `approval-workflows.csv` +- `approval-steps.csv` +- `approval-matrix.csv` +- `customers.csv` +- `contacts.csv` +- `contact-shares.csv` +- `leads.csv` +- `opportunities.csv` +- `opportunity-parties.csv` +- `quotations.csv` +- `quotation-items.csv` +- `quotation-parties.csv` +- `quotation-topics.csv` +- `quotation-topic-items.csv` + +Supporting files: + +- `setup/templates/README.md` +- `setup/templates/templates.json` + +Optional read-only metadata API: + +- `GET /api/setup/templates` + +## Safety Notes + +- No CSV parser was implemented. +- No CSV validation/preview engine was implemented. +- No CSV commit/import logic was implemented. +- No seed execution was implemented. +- No reset/reseed logic was implemented. +- No unsupported CSV files were generated. +- Sample `users.csv` leaves `password` empty to avoid embedding secrets. + +## Verification + +- Template structure check: 22 CSV files; each has one header row and one sample row. +- Column count check: every sample row has the same column count as its header row. +- Unsupported template check: no unsupported CSV files were present. +- `templates.json` parse check: passed; 22 templates listed. +- `npm run typecheck`: passed. +- `npx oxlint src/app/api/setup setup/templates`: passed. +- `npm run lint`: failed due to pre-existing unrelated repo lint issues outside this task, including `src/features/foundation/document-template/server/management-service.ts` and skill asset scripts. + +## Follow-up + +- D.7.4 should use `setup/templates/templates.json` and the CSV headers as the source contract for preview validation. +- D.7.6 can call `GET /api/setup/templates` for template metadata. diff --git a/plans/task-d.7.3.md b/plans/task-d.7.3.md new file mode 100644 index 0000000..dc31aea --- /dev/null +++ b/plans/task-d.7.3.md @@ -0,0 +1,528 @@ +# Task D.7.3 – CSV Template Generator Static Template Pack + +## Objective + +Generate a complete static CSV template pack for ALLA OS Initial Setup. + +The templates will become the official data contract for future CSV Preview (D.7.4) and CSV Import (D.7.5). + +This task only creates template files and supporting metadata. + +Do NOT implement CSV parsing, validation, import logic, seed execution, reset logic, or setup persistence. + +--- + +## Review Before Implementation + +Read and follow: + +- AGENTS.md +- plans/task-d.7.md +- plans/task-d.7.1.md +- plans/task-d.7.2.md +- docs/setup/seed-matrix.md +- docs/setup/csv-template-spec.md +- docs/setup/import-mapping.md +- docs/setup/setup-wizard-blueprint.md + +Do not invent new columns. + +CSV headers must exactly match csv-template-spec.md. + +--- + +## Scope + +Create folder + +setup/templates/ + +Generate the following files + +organizations.csv + +users.csv + +memberships.csv + +crm-role-assignments.csv + +master-options.csv + +branches.csv + +product-types.csv + +document-sequences.csv + +approval-workflows.csv + +approval-steps.csv + +approval-matrix.csv + +customers.csv + +contacts.csv + +contact-shares.csv + +leads.csv + +opportunities.csv + +opportunity-parties.csv + +quotations.csv + +quotation-items.csv + +quotation-parties.csv + +quotation-topics.csv + +quotation-topic-items.csv + +--- + +## CSV Rules + +Every CSV must contain + +1 Header row + +1 Safe sample row + +UTF-8 encoding + +Comma delimiter + +LF line ending + +No BOM if current repository standard already avoids BOM + +No blank columns + +No undocumented columns + +No formulas + +No secrets + +No production data + +No binary references + +--- + +## Sample Data Convention + +Use one consistent sample dataset. + +Organization + +ALLA + +Branch + +head_office + +Product Type + +crane + +Currency + +THB + +Administrator + +admin@example.com + +Marketing + +mk.uat@example.com + +Sales + +sales.uat@example.com + +Manager + +manager.uat@example.com + +CEO + +ceo.uat@example.com + +Customer + +CUS-001 + +Lead + +LD-001 + +Opportunity + +OP-001 + +Quotation + +QT-HO-CR-2607-001 + +--- + +## Header Rules + +Headers must exactly match + +docs/setup/csv-template-spec.md + +Do not + +rename + +reorder + +remove + +or add columns. + +--- + +## CSV Safety + +Passwords + +Use placeholder only. + +Example + +ChangeMe123! + +Never include + +real password + +API key + +secret + +JWT + +SMTP credential + +storage credential + +real customer + +real phone + +real tax id + +--- + +## Unsupported Templates + +Do NOT create + +departments.csv + +teams.csv + +warehouses.csv + +sites.csv + +services.csv + +price-books.csv + +tax-rates.csv + +attachments.csv + +email-settings.csv + +Keep these documented only. + +--- + +## README + +Create + +setup/templates/README.md + +Document + +Purpose + +Supported Templates + +Unsupported Templates + +Import Order + +Relationship Rules + +Sample Dataset + +Placeholder Rules + +Future D.7.4 Preview Flow + +--- + +## Import Order + +Document import order. + +Example + +01 users.csv + +02 organizations.csv + +03 memberships.csv + +04 crm-role-assignments.csv + +05 master-options.csv + +06 branches.csv + +07 product-types.csv + +08 document-sequences.csv + +09 approval-workflows.csv + +10 approval-steps.csv + +11 approval-matrix.csv + +12 customers.csv + +13 contacts.csv + +14 contact-shares.csv + +15 leads.csv + +16 opportunities.csv + +17 opportunity-parties.csv + +18 quotations.csv + +19 quotation-items.csv + +20 quotation-parties.csv + +21 quotation-topics.csv + +22 quotation-topic-items.csv + +Import order must match + +docs/setup/seed-matrix.md + +--- + +## Optional Metadata + +Create + +setup/templates/templates.json + +Structure + +{ + "version": "1.0.0", + "generatedFrom": "docs/setup/csv-template-spec.md", + "templates": [ + { + "file": "customers.csv", + "seedType": "business", + "importOrder": 12, + "supported": true + } + ] +} + +This metadata will be reused by D.7.6 Setup Wizard. + +--- + +## Optional API + +If simple and reusable + +Create + +GET /api/setup/templates + +Return + +Template Name + +Seed Type + +Import Order + +Supported + +Required Columns + +Description + +This API must be read-only. + +Do NOT implement download or ZIP generation. + +--- + +## Out Of Scope + +CSV Parser + +CSV Validation + +CSV Preview + +CSV Commit + +Seed Execution + +Reset + +Setup Wizard + +Manifest + +State Machine + +Migrations + +Business Logic Changes + +--- + +## Deliverables + +setup/templates/ + +organizations.csv + +users.csv + +memberships.csv + +crm-role-assignments.csv + +master-options.csv + +branches.csv + +product-types.csv + +document-sequences.csv + +approval-workflows.csv + +approval-steps.csv + +approval-matrix.csv + +customers.csv + +contacts.csv + +contact-shares.csv + +leads.csv + +opportunities.csv + +opportunity-parties.csv + +quotations.csv + +quotation-items.csv + +quotation-parties.csv + +quotation-topics.csv + +quotation-topic-items.csv + +README.md + +Optional + +templates.json + +Optional + +GET /api/setup/templates + +--- + +## Acceptance Criteria + +✓ Every supported CSV exists. + +✓ Every CSV contains exactly + +- one header row +- one sample row + +✓ Header names exactly match + +docs/setup/csv-template-spec.md + +✓ Sample data follows one consistent demo dataset. + +✓ No unsupported CSV files are generated. + +✓ No secrets or production data exist. + +✓ README documents + +- import order +- relationship rules +- placeholders +- supported templates +- unsupported templates + +✓ templates.json (if implemented) matches generated CSV files. + +✓ Optional API (if implemented) is read-only. + +✓ No import logic or seed logic is implemented. + +✓ Typecheck passes or unrelated failures are documented. + +--- + +## Future Tasks + +D.7.4 + +CSV Preview Validation Engine + +D.7.5 + +CSV Commit Import Engine + +D.7.6 + +Setup Wizard UI + +The generated CSV files become the official template pack for all future setup and onboarding workflows. +> Implementation log 2026-07-02: Static CSV template pack completed under +> `setup/templates/`, optional metadata API added at `GET /api/setup/templates`, +> and implementation note saved to +> `docs/implementation/task-d73-csv-template-static-pack.md`. diff --git a/setup/templates/README.md b/setup/templates/README.md new file mode 100644 index 0000000..52f8b7b --- /dev/null +++ b/setup/templates/README.md @@ -0,0 +1,91 @@ +# ALLA OS Setup CSV Templates + +This folder contains the supported static CSV template pack for Task D.7.3. + +Rules: + +- UTF-8 text. +- Comma delimiter. +- LF line endings. +- One header row and one safe sample row per CSV. +- No unsupported template files are generated. +- No production data, formulas, secrets, or binary references are included. + +## Sample Dataset + +All templates use one consistent sample dataset: + +- Organization: `ALLA` +- Branch: `head_office` +- Product type: `crane` +- Currency: `THB` +- Administrator: `admin@example.com` +- Marketing: `mk.uat@example.com` +- Sales: `sales.uat@example.com` +- Manager: `manager.uat@example.com` +- CEO: `ceo.uat@example.com` +- Customer: `CUS-001` +- Lead: `LD-001` +- Opportunity: `OP-001` +- Quotation: `QT-HO-CR-2607-001` + +## Import Order + +| Order | File | Purpose | +| --- | --- | --- | +| 01 | `users.csv` | Setup-managed users | +| 02 | `organizations.csv` | Tenant organizations | +| 03 | `memberships.csv` | Organization memberships | +| 05 | `crm-role-assignments.csv` | CRM role assignments | +| 06 | `master-options.csv` | Generic master options | +| 07 | `branches.csv` | Branch options | +| 08 | `product-types.csv` | Product type options | +| 14 | `document-sequences.csv` | Document numbering | +| 15 | `approval-workflows.csv` | Approval workflows | +| 16 | `approval-steps.csv` | Approval workflow steps | +| 17 | `approval-matrix.csv` | Approval routing matrix | +| 30 | `customers.csv` | CRM customers | +| 32 | `contacts.csv` | Customer contacts | +| 33 | `contact-shares.csv` | Contact sharing grants | +| 34 | `leads.csv` | Marketing leads | +| 36 | `opportunities.csv` | Sales opportunities | +| 37 | `opportunity-parties.csv` | Opportunity project parties | +| 40 | `quotations.csv` | Quotation headers | +| 41 | `quotation-items.csv` | Quotation line items | +| 42 | `quotation-parties.csv` | Quotation project parties | +| 43 | `quotation-topics.csv` | Quotation topic headers | +| 44 | `quotation-topic-items.csv` | Quotation topic rows | + +## Relationship Rules + +- `organization_code` links rows to the organization import context. +- `user_email`, `created_by_email`, `updated_by_email`, and role-related email fields resolve to `users.email`. +- `branch_code` resolves to `ms_options` category `crm_branch`. +- `product_type_code` resolves to `ms_options` category `crm_product_type`. +- `customer_code`, `lead_code`, `opportunity_code`, and `quotation_code` are business keys within the organization. +- `topic_key` is an import-only alias linking `quotation-topics.csv` to `quotation-topic-items.csv`. +- Pipe-delimited fields, such as permission or scope lists, use `|`. + +## Placeholders + +These templates intentionally leave sensitive or runtime values empty: + +- `users.csv` has an empty `password` sample value. +- Runtime approval and PDF artifact fields are not present. +- Binary attachment paths are not present. + +## Unsupported Templates + +The following files are documented but not generated because the current schema does not support them as safe first-class setup imports: + +- `departments.csv` +- `teams.csv` +- `warehouses.csv` +- `sites.csv` +- `services.csv` +- `price-books.csv` +- `tax-rates.csv` +- `attachments.csv` +- `email-settings.csv` + +See `docs/setup/csv-template-spec.md` and `docs/setup/import-mapping.md` for the full contract. diff --git a/setup/templates/approval-matrix.csv b/setup/templates/approval-matrix.csv new file mode 100644 index 0000000..d40c4de --- /dev/null +++ b/setup/templates/approval-matrix.csv @@ -0,0 +1,2 @@ +organization_code,entity_type,workflow_code,branch_code,product_type_code,min_amount,max_amount,currency,priority,is_default,is_active,description +ALLA,quotation,quotation_standard,head_office,crane,0,5000000,THB,100,true,true,Default crane approval diff --git a/setup/templates/approval-steps.csv b/setup/templates/approval-steps.csv new file mode 100644 index 0000000..2f12782 --- /dev/null +++ b/setup/templates/approval-steps.csv @@ -0,0 +1,2 @@ +organization_code,workflow_code,step_number,role_code,role_name,approval_mode,is_required,sla_hours,calendar_mode,timeout_action +ALLA,quotation_standard,1,sales_manager,Sales Manager,sequential,true,24,calendar_days,none diff --git a/setup/templates/approval-workflows.csv b/setup/templates/approval-workflows.csv new file mode 100644 index 0000000..9ef8658 --- /dev/null +++ b/setup/templates/approval-workflows.csv @@ -0,0 +1,2 @@ +organization_code,workflow_code,workflow_name,entity_type,description,is_system,is_active +ALLA,quotation_standard,Quotation Standard Approval,quotation,Default quotation approval,false,true diff --git a/setup/templates/branches.csv b/setup/templates/branches.csv new file mode 100644 index 0000000..6d6826e --- /dev/null +++ b/setup/templates/branches.csv @@ -0,0 +1,2 @@ +organization_code,branch_code,branch_name,prefix,address,tax_id,phone,email,sort_order,is_active +ALLA,head_office,Head Office,HO,99/9 Rama IX Road Bangkok,0107558000393,02-000-0000,head.office@example.com,1,true diff --git a/setup/templates/contact-shares.csv b/setup/templates/contact-shares.csv new file mode 100644 index 0000000..fe9a384 --- /dev/null +++ b/setup/templates/contact-shares.csv @@ -0,0 +1,2 @@ +organization_code,customer_code,contact_email,shared_to_user_email,shared_by_user_email,remark,is_active +ALLA,CUS-001,anan@siam.example,sales.uat@example.com,admin@example.com,Shared for setup sample,true diff --git a/setup/templates/contacts.csv b/setup/templates/contacts.csv new file mode 100644 index 0000000..c9ab1e7 --- /dev/null +++ b/setup/templates/contacts.csv @@ -0,0 +1,2 @@ +organization_code,customer_code,contact_name,created_by_email,position,department,phone,mobile,email,is_primary,notes,is_active +ALLA,CUS-001,Anan Sales,admin@example.com,Procurement Manager,Procurement,02-000-1001,081-000-0001,anan@siam.example,true,Primary procurement contact,true diff --git a/setup/templates/crm-role-assignments.csv b/setup/templates/crm-role-assignments.csv new file mode 100644 index 0000000..925eedc --- /dev/null +++ b/setup/templates/crm-role-assignments.csv @@ -0,0 +1,2 @@ +organization_code,user_email,crm_role_code,is_primary,branch_scope_mode,branch_codes,product_type_scope_mode,product_type_codes,is_active +ALLA,admin@example.com,crm_admin,true,all,,all,,true diff --git a/setup/templates/customers.csv b/setup/templates/customers.csv new file mode 100644 index 0000000..b8a7959 --- /dev/null +++ b/setup/templates/customers.csv @@ -0,0 +1,2 @@ +organization_code,customer_code,customer_name,customer_type,customer_status,created_by_email,branch_code,abbr,tax_id,address,province,district,sub_district,postal_code,country,phone,fax,email,website,lead_channel,customer_group,customer_sub_group,owner_user_email,notes,is_active +ALLA,CUS-001,Siam Manufacturing,company,active,admin@example.com,head_office,SIAM,0105555000001,100 Industrial Road,Bangkok,Bang Na,Bang Na,10260,Thailand,02-000-1000,,contact@siam.example,https://siam.example,website,industrial,factory,sales.uat@example.com,Initial setup sample customer,true diff --git a/setup/templates/document-sequences.csv b/setup/templates/document-sequences.csv new file mode 100644 index 0000000..6107811 --- /dev/null +++ b/setup/templates/document-sequences.csv @@ -0,0 +1,2 @@ +organization_code,branch_code,product_type_code,document_type,prefix,period,current_number,padding_length,format,reset_policy,is_active +ALLA,head_office,crane,quotation,QT-HO-CR-,2607,0,3,{prefix}{period}-{running},period,true diff --git a/setup/templates/leads.csv b/setup/templates/leads.csv new file mode 100644 index 0000000..21d538d --- /dev/null +++ b/setup/templates/leads.csv @@ -0,0 +1,2 @@ +organization_code,lead_code,status,created_by_email,branch_code,customer_code,contact_email,description,project_name,project_location,lead_channel,product_type_code,priority,estimated_value,awareness_code,followup_status,lost_reason,outcome,owner_marketing_user_email,assigned_sales_owner_email,assignment_remark +ALLA,LD-001,assigned,mk.uat@example.com,head_office,CUS-001,anan@siam.example,Customer requested crane consultation,Warehouse Crane,Bangkok Warehouse,website,crane,high,1000000,google_search_website,quotation_preparation,,open,mk.uat@example.com,sales.uat@example.com,Assigned from setup sample diff --git a/setup/templates/master-options.csv b/setup/templates/master-options.csv new file mode 100644 index 0000000..543d3d8 --- /dev/null +++ b/setup/templates/master-options.csv @@ -0,0 +1,2 @@ +organization_code,category,code,label,value,parent_category,parent_code,sort_order,is_active,metadata_json +ALLA,crm_customer_group,industrial,Industrial,industrial,,,1,true,{} diff --git a/setup/templates/memberships.csv b/setup/templates/memberships.csv new file mode 100644 index 0000000..ec61d7d --- /dev/null +++ b/setup/templates/memberships.csv @@ -0,0 +1,2 @@ +organization_code,user_email,membership_role,business_role,permissions,branch_scope_codes,product_type_scope_codes +ALLA,admin@example.com,admin,crm_admin,crm.dashboard.read|crm.role.read|crm.user_role_assignment.read,head_office,crane diff --git a/setup/templates/opportunities.csv b/setup/templates/opportunities.csv new file mode 100644 index 0000000..621e40c --- /dev/null +++ b/setup/templates/opportunities.csv @@ -0,0 +1,2 @@ +organization_code,opportunity_code,customer_code,title,product_type_code,status,priority,created_by_email,updated_by_email,lead_code,contact_email,branch_code,description,requirement,project_name,project_location,outcome_status,lead_channel,estimated_value,chance_percent,expected_close_date,competitor,source,notes,is_hot_project,pipeline_stage,assigned_to_user_email +ALLA,OP-001,CUS-001,Warehouse Crane Expansion,crane,negotiation,high,sales.uat@example.com,sales.uat@example.com,LD-001,anan@siam.example,head_office,Crane expansion opportunity,Overhead crane with installation,Warehouse Crane,Bangkok Warehouse,open,website,1000000,70,2026-08-31,,setup,Initial setup sample opportunity,false,opportunity,sales.uat@example.com diff --git a/setup/templates/opportunity-parties.csv b/setup/templates/opportunity-parties.csv new file mode 100644 index 0000000..313dd6f --- /dev/null +++ b/setup/templates/opportunity-parties.csv @@ -0,0 +1,2 @@ +organization_code,opportunity_code,customer_code,role_code,remark +ALLA,OP-001,CUS-001,end_customer,Primary project owner diff --git a/setup/templates/organizations.csv b/setup/templates/organizations.csv new file mode 100644 index 0000000..343149b --- /dev/null +++ b/setup/templates/organizations.csv @@ -0,0 +1,2 @@ +organization_code,organization_name,slug,created_by_email,tax_id,default_currency,phone,email,address,logo_url,plan,status +ALLA,ALLA Public Company Limited,alla,admin@example.com,0107558000393,THB,02-000-0000,info@example.com,99/9 Rama IX Road Bangkok,,enterprise,active diff --git a/setup/templates/product-types.csv b/setup/templates/product-types.csv new file mode 100644 index 0000000..2d0fd3c --- /dev/null +++ b/setup/templates/product-types.csv @@ -0,0 +1,2 @@ +organization_code,product_type_code,product_type_name,document_prefix,sort_order,is_active,metadata_json +ALLA,crane,Crane,CR,1,true,{} diff --git a/setup/templates/quotation-items.csv b/setup/templates/quotation-items.csv new file mode 100644 index 0000000..59630ac --- /dev/null +++ b/setup/templates/quotation-items.csv @@ -0,0 +1,2 @@ +organization_code,quotation_code,item_number,product_type_code,description,quantity,unit_price,total_price,unit,discount,discount_type,tax_rate,notes,sort_order +ALLA,QT-HO-CR-2607-001,1,crane,Crane installation package,1,1000000,1000000,set,0,,7,Setup sample quotation item,1 diff --git a/setup/templates/quotation-parties.csv b/setup/templates/quotation-parties.csv new file mode 100644 index 0000000..3a61e16 --- /dev/null +++ b/setup/templates/quotation-parties.csv @@ -0,0 +1,2 @@ +organization_code,quotation_code,customer_code,role_code,is_primary,remark +ALLA,QT-HO-CR-2607-001,CUS-001,end_customer,true,Primary quotation customer diff --git a/setup/templates/quotation-topic-items.csv b/setup/templates/quotation-topic-items.csv new file mode 100644 index 0000000..9bcd958 --- /dev/null +++ b/setup/templates/quotation-topic-items.csv @@ -0,0 +1,2 @@ +organization_code,quotation_code,topic_key,content,sort_order +ALLA,QT-HO-CR-2607-001,scope-main,Supply and install one overhead crane system,1 diff --git a/setup/templates/quotation-topics.csv b/setup/templates/quotation-topics.csv new file mode 100644 index 0000000..aa987d7 --- /dev/null +++ b/setup/templates/quotation-topics.csv @@ -0,0 +1,2 @@ +organization_code,quotation_code,topic_key,topic_type,title,sort_order +ALLA,QT-HO-CR-2607-001,scope-main,scope,Scope of Work,1 diff --git a/setup/templates/quotations.csv b/setup/templates/quotations.csv new file mode 100644 index 0000000..09dcf4e --- /dev/null +++ b/setup/templates/quotations.csv @@ -0,0 +1,2 @@ +organization_code,quotation_code,customer_code,quotation_date,quotation_type,status,currency,subtotal,total_amount,created_by_email,updated_by_email,opportunity_code,contact_email,branch_code,valid_until,project_name,project_location,attention,reference,notes,revision,parent_quotation_code,revision_remark,exchange_rate,discount,discount_type,tax_rate,tax_amount,chance_percent,is_hot_project,competitor,salesman_email,is_sent,sent_at,sent_via +ALLA,QT-HO-CR-2607-001,CUS-001,2026-07-02,crane,draft,THB,1000000,1070000,sales.uat@example.com,sales.uat@example.com,OP-001,anan@siam.example,head_office,2026-08-01,Warehouse Crane,Bangkok Warehouse,Anan Sales,SETUP-SAMPLE,Initial setup sample quotation,0,,,1,0,,7,70000,70,false,,sales.uat@example.com,false,, diff --git a/setup/templates/templates.json b/setup/templates/templates.json new file mode 100644 index 0000000..f5dae7e --- /dev/null +++ b/setup/templates/templates.json @@ -0,0 +1,255 @@ +{ + "version": "1.0.0", + "generatedFrom": "docs/setup/csv-template-spec.md", + "dataset": { + "organizationCode": "ALLA", + "branchCode": "head_office", + "productTypeCode": "crane", + "currency": "THB", + "administratorEmail": "admin@example.com", + "marketingEmail": "mk.uat@example.com", + "salesEmail": "sales.uat@example.com", + "managerEmail": "manager.uat@example.com", + "ceoEmail": "ceo.uat@example.com" + }, + "templates": [ + { + "file": "users.csv", + "seedType": "organization", + "importOrder": 1, + "supported": true, + "requiredColumns": ["email", "name", "system_role"], + "description": "Setup-managed users." + }, + { + "file": "organizations.csv", + "seedType": "organization", + "importOrder": 2, + "supported": true, + "requiredColumns": ["organization_code", "organization_name", "slug", "created_by_email"], + "description": "Tenant organizations." + }, + { + "file": "memberships.csv", + "seedType": "organization", + "importOrder": 3, + "supported": true, + "requiredColumns": ["organization_code", "user_email", "membership_role", "business_role"], + "description": "App-level organization memberships." + }, + { + "file": "crm-role-assignments.csv", + "seedType": "organization", + "importOrder": 5, + "supported": true, + "requiredColumns": [ + "organization_code", + "user_email", + "crm_role_code", + "is_primary", + "branch_scope_mode", + "product_type_scope_mode" + ], + "description": "CRM role assignments and scopes." + }, + { + "file": "master-options.csv", + "seedType": "foundation", + "importOrder": 6, + "supported": true, + "requiredColumns": ["organization_code", "category", "code", "label"], + "description": "Generic governed master options." + }, + { + "file": "branches.csv", + "seedType": "organization", + "importOrder": 7, + "supported": true, + "requiredColumns": ["organization_code", "branch_code", "branch_name"], + "description": "Branch options mapped to ms_options category crm_branch." + }, + { + "file": "product-types.csv", + "seedType": "organization", + "importOrder": 8, + "supported": true, + "requiredColumns": ["organization_code", "product_type_code", "product_type_name"], + "description": "Product type options mapped to ms_options category crm_product_type." + }, + { + "file": "document-sequences.csv", + "seedType": "foundation", + "importOrder": 14, + "supported": true, + "requiredColumns": ["organization_code", "document_type", "prefix", "period"], + "description": "Document numbering configuration." + }, + { + "file": "approval-workflows.csv", + "seedType": "foundation", + "importOrder": 15, + "supported": true, + "requiredColumns": ["organization_code", "workflow_code", "workflow_name", "entity_type"], + "description": "Approval workflow headers." + }, + { + "file": "approval-steps.csv", + "seedType": "foundation", + "importOrder": 16, + "supported": true, + "requiredColumns": ["organization_code", "workflow_code", "step_number", "role_code", "role_name"], + "description": "Approval workflow steps." + }, + { + "file": "approval-matrix.csv", + "seedType": "foundation", + "importOrder": 17, + "supported": true, + "requiredColumns": ["organization_code", "entity_type", "workflow_code", "priority", "is_default"], + "description": "Approval workflow routing matrix." + }, + { + "file": "customers.csv", + "seedType": "business", + "importOrder": 30, + "supported": true, + "requiredColumns": [ + "organization_code", + "customer_code", + "customer_name", + "customer_type", + "customer_status", + "created_by_email" + ], + "description": "CRM customers." + }, + { + "file": "contacts.csv", + "seedType": "business", + "importOrder": 32, + "supported": true, + "requiredColumns": ["organization_code", "customer_code", "contact_name", "created_by_email"], + "description": "Customer contacts." + }, + { + "file": "contact-shares.csv", + "seedType": "business", + "importOrder": 33, + "supported": true, + "requiredColumns": [ + "organization_code", + "customer_code", + "contact_email", + "shared_to_user_email", + "shared_by_user_email" + ], + "description": "Contact sharing grants." + }, + { + "file": "leads.csv", + "seedType": "business", + "importOrder": 34, + "supported": true, + "requiredColumns": ["organization_code", "lead_code", "status", "created_by_email"], + "description": "Marketing-owned leads." + }, + { + "file": "opportunities.csv", + "seedType": "business", + "importOrder": 36, + "supported": true, + "requiredColumns": [ + "organization_code", + "opportunity_code", + "customer_code", + "title", + "product_type_code", + "status", + "priority", + "created_by_email", + "updated_by_email" + ], + "description": "Sales opportunities." + }, + { + "file": "opportunity-parties.csv", + "seedType": "business", + "importOrder": 37, + "supported": true, + "requiredColumns": ["organization_code", "opportunity_code", "customer_code", "role_code"], + "description": "Opportunity project parties." + }, + { + "file": "quotations.csv", + "seedType": "business", + "importOrder": 40, + "supported": true, + "requiredColumns": [ + "organization_code", + "quotation_code", + "customer_code", + "quotation_date", + "quotation_type", + "status", + "currency", + "subtotal", + "total_amount", + "created_by_email", + "updated_by_email" + ], + "description": "Quotation headers." + }, + { + "file": "quotation-items.csv", + "seedType": "business", + "importOrder": 41, + "supported": true, + "requiredColumns": [ + "organization_code", + "quotation_code", + "item_number", + "product_type_code", + "description", + "quantity", + "unit_price", + "total_price" + ], + "description": "Quotation line items." + }, + { + "file": "quotation-parties.csv", + "seedType": "business", + "importOrder": 42, + "supported": true, + "requiredColumns": ["organization_code", "quotation_code", "customer_code", "role_code"], + "description": "Quotation project parties." + }, + { + "file": "quotation-topics.csv", + "seedType": "business", + "importOrder": 43, + "supported": true, + "requiredColumns": ["organization_code", "quotation_code", "topic_key", "topic_type", "title"], + "description": "Quotation topic headers." + }, + { + "file": "quotation-topic-items.csv", + "seedType": "business", + "importOrder": 44, + "supported": true, + "requiredColumns": ["organization_code", "quotation_code", "topic_key", "content"], + "description": "Quotation topic rows." + } + ], + "unsupportedTemplates": [ + "departments.csv", + "teams.csv", + "warehouses.csv", + "sites.csv", + "services.csv", + "price-books.csv", + "tax-rates.csv", + "attachments.csv", + "email-settings.csv" + ] +} diff --git a/setup/templates/users.csv b/setup/templates/users.csv new file mode 100644 index 0000000..fd1a228 --- /dev/null +++ b/setup/templates/users.csv @@ -0,0 +1,2 @@ +email,name,system_role,password,active_organization_code,image_url,reset_password +admin@allaos.local,System Administrator,super_admin,gikiyd[ibKym,ALLA,,FALSE diff --git a/src/app/api/setup/templates/route.ts b/src/app/api/setup/templates/route.ts new file mode 100644 index 0000000..eecc2e9 --- /dev/null +++ b/src/app/api/setup/templates/route.ts @@ -0,0 +1,39 @@ +import { readFile } from 'node:fs/promises'; +import path from 'node:path'; +import { NextResponse } from 'next/server'; +import { AuthError, requireSystemRole } from '@/lib/auth/session'; + +type SetupTemplateMetadata = { + version: string; + generatedFrom: string; + templates: Array<{ + file: string; + seedType: string; + importOrder: number; + supported: boolean; + requiredColumns: string[]; + description: string; + }>; +}; + +export async function GET() { + try { + await requireSystemRole('super_admin'); + const metadataPath = path.join(process.cwd(), 'setup', 'templates', 'templates.json'); + const metadata = JSON.parse(await readFile(metadataPath, 'utf8')) as SetupTemplateMetadata; + + return NextResponse.json({ + success: true, + time: new Date().toISOString(), + version: metadata.version, + generatedFrom: metadata.generatedFrom, + templates: metadata.templates + }); + } catch (error) { + if (error instanceof AuthError) { + return NextResponse.json({ message: error.message }, { status: error.status }); + } + + return NextResponse.json({ message: 'Unable to load setup templates' }, { status: 500 }); + } +}