task-d.7.4
This commit is contained in:
67
docs/implementation/task-d73-csv-template-static-pack.md
Normal file
67
docs/implementation/task-d73-csv-template-static-pack.md
Normal file
@@ -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.
|
||||
528
plans/task-d.7.3.md
Normal file
528
plans/task-d.7.3.md
Normal file
@@ -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`.
|
||||
91
setup/templates/README.md
Normal file
91
setup/templates/README.md
Normal file
@@ -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.
|
||||
2
setup/templates/approval-matrix.csv
Normal file
2
setup/templates/approval-matrix.csv
Normal file
@@ -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
|
||||
|
2
setup/templates/approval-steps.csv
Normal file
2
setup/templates/approval-steps.csv
Normal file
@@ -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
|
||||
|
2
setup/templates/approval-workflows.csv
Normal file
2
setup/templates/approval-workflows.csv
Normal file
@@ -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
|
||||
|
2
setup/templates/branches.csv
Normal file
2
setup/templates/branches.csv
Normal file
@@ -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
|
||||
|
2
setup/templates/contact-shares.csv
Normal file
2
setup/templates/contact-shares.csv
Normal file
@@ -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
|
||||
|
2
setup/templates/contacts.csv
Normal file
2
setup/templates/contacts.csv
Normal file
@@ -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
|
||||
|
2
setup/templates/crm-role-assignments.csv
Normal file
2
setup/templates/crm-role-assignments.csv
Normal file
@@ -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
|
||||
|
2
setup/templates/customers.csv
Normal file
2
setup/templates/customers.csv
Normal file
@@ -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
|
||||
|
2
setup/templates/document-sequences.csv
Normal file
2
setup/templates/document-sequences.csv
Normal file
@@ -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
|
||||
|
2
setup/templates/leads.csv
Normal file
2
setup/templates/leads.csv
Normal file
@@ -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
|
||||
|
2
setup/templates/master-options.csv
Normal file
2
setup/templates/master-options.csv
Normal file
@@ -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,{}
|
||||
|
2
setup/templates/memberships.csv
Normal file
2
setup/templates/memberships.csv
Normal file
@@ -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
|
||||
|
2
setup/templates/opportunities.csv
Normal file
2
setup/templates/opportunities.csv
Normal file
@@ -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
|
||||
|
2
setup/templates/opportunity-parties.csv
Normal file
2
setup/templates/opportunity-parties.csv
Normal file
@@ -0,0 +1,2 @@
|
||||
organization_code,opportunity_code,customer_code,role_code,remark
|
||||
ALLA,OP-001,CUS-001,end_customer,Primary project owner
|
||||
|
2
setup/templates/organizations.csv
Normal file
2
setup/templates/organizations.csv
Normal file
@@ -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
|
||||
|
2
setup/templates/product-types.csv
Normal file
2
setup/templates/product-types.csv
Normal file
@@ -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,{}
|
||||
|
2
setup/templates/quotation-items.csv
Normal file
2
setup/templates/quotation-items.csv
Normal file
@@ -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
|
||||
|
2
setup/templates/quotation-parties.csv
Normal file
2
setup/templates/quotation-parties.csv
Normal file
@@ -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
|
||||
|
2
setup/templates/quotation-topic-items.csv
Normal file
2
setup/templates/quotation-topic-items.csv
Normal file
@@ -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
|
||||
|
2
setup/templates/quotation-topics.csv
Normal file
2
setup/templates/quotation-topics.csv
Normal file
@@ -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
|
||||
|
2
setup/templates/quotations.csv
Normal file
2
setup/templates/quotations.csv
Normal file
@@ -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,,
|
||||
|
255
setup/templates/templates.json
Normal file
255
setup/templates/templates.json
Normal file
@@ -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"
|
||||
]
|
||||
}
|
||||
2
setup/templates/users.csv
Normal file
2
setup/templates/users.csv
Normal file
@@ -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
|
||||
|
39
src/app/api/setup/templates/route.ts
Normal file
39
src/app/api/setup/templates/route.ts
Normal file
@@ -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 });
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user