235 lines
6.6 KiB
SQL
235 lines
6.6 KiB
SQL
-- Seed data provides one complete end-to-end example for the frontend:
|
|
-- a checklist template, lookup values, image policy, export profile, and a few
|
|
-- app-level settings. The goal is not exhaustive coverage but a realistic shape
|
|
-- that exercises the dynamic form renderer and admin configuration flow.
|
|
|
|
USE check_list;
|
|
|
|
-- Register the template shell first so later version rows can reference it.
|
|
INSERT INTO templates (code, name, description)
|
|
VALUES (
|
|
'incoming-inspection',
|
|
'Incoming Inspection Checklist',
|
|
'PoC template for supplier or incoming goods quality inspection.'
|
|
)
|
|
ON DUPLICATE KEY UPDATE
|
|
name = VALUES(name),
|
|
description = VALUES(description);
|
|
|
|
SET @template_id = (SELECT id FROM templates WHERE code = 'incoming-inspection');
|
|
|
|
-- The JSON payload below is intentionally close to the frontend contract. That
|
|
-- makes it easy to inspect how the browser creates fields, validation hints, and
|
|
-- attachment requirements without another transformation layer in the backend.
|
|
INSERT INTO template_versions (
|
|
template_id,
|
|
version_number,
|
|
status,
|
|
definition_json,
|
|
published_at
|
|
)
|
|
VALUES (
|
|
@template_id,
|
|
1,
|
|
'active',
|
|
'{
|
|
"templateId": "incoming-inspection",
|
|
"templateName": "Incoming Inspection Checklist",
|
|
"version": 1,
|
|
"reportNumberPattern": "QC-{yyyy}-{seq:4}",
|
|
"exportProfileCode": "default-report-export",
|
|
"imageRuleCode": "standard-mobile-images",
|
|
"sections": [
|
|
{
|
|
"id": "header",
|
|
"title": "Report Header",
|
|
"type": "group",
|
|
"fields": [
|
|
{
|
|
"id": "reportNumber",
|
|
"label": "Report Number",
|
|
"type": "text",
|
|
"required": true,
|
|
"readOnly": false
|
|
},
|
|
{
|
|
"id": "inspectionDate",
|
|
"label": "Inspection Date",
|
|
"type": "date",
|
|
"required": true
|
|
},
|
|
{
|
|
"id": "supplierName",
|
|
"label": "Supplier",
|
|
"type": "text",
|
|
"required": true
|
|
},
|
|
{
|
|
"id": "batchNumber",
|
|
"label": "Batch Number",
|
|
"type": "text",
|
|
"required": false
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "check-items",
|
|
"title": "Inspection Items",
|
|
"type": "group",
|
|
"fields": [
|
|
{
|
|
"id": "packagingCondition",
|
|
"label": "Packaging Condition",
|
|
"type": "lookup",
|
|
"lookupCode": "pass-fail",
|
|
"required": true
|
|
},
|
|
{
|
|
"id": "labelCheck",
|
|
"label": "Label Verification",
|
|
"type": "lookup",
|
|
"lookupCode": "pass-fail",
|
|
"required": true
|
|
},
|
|
{
|
|
"id": "quantityVerified",
|
|
"label": "Quantity Verified",
|
|
"type": "number",
|
|
"required": true,
|
|
"validation": {
|
|
"min": 0
|
|
}
|
|
},
|
|
{
|
|
"id": "damageFound",
|
|
"label": "Visible Damage Found",
|
|
"type": "checkbox",
|
|
"required": false,
|
|
"defaultValue": false
|
|
},
|
|
{
|
|
"id": "damagePhoto",
|
|
"label": "Damage Photo",
|
|
"type": "attachment",
|
|
"requiredWhen": {
|
|
"field": "damageFound",
|
|
"equals": true
|
|
},
|
|
"maxAttachments": 3
|
|
},
|
|
{
|
|
"id": "inspectorComment",
|
|
"label": "Inspector Comment",
|
|
"type": "comment",
|
|
"required": false,
|
|
"maxLength": 1000
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}',
|
|
NOW()
|
|
)
|
|
ON DUPLICATE KEY UPDATE
|
|
status = VALUES(status),
|
|
definition_json = VALUES(definition_json),
|
|
published_at = VALUES(published_at);
|
|
|
|
-- Lookups are seeded separately because multiple templates may eventually reuse
|
|
-- the same option sets, such as pass/fail or standardized status lists.
|
|
INSERT INTO lookup_sets (code, name)
|
|
VALUES
|
|
('pass-fail', 'Pass/Fail'),
|
|
('draft-status', 'Draft Status')
|
|
ON DUPLICATE KEY UPDATE
|
|
name = VALUES(name);
|
|
|
|
SET @pass_fail_id = (SELECT id FROM lookup_sets WHERE code = 'pass-fail');
|
|
SET @draft_status_id = (SELECT id FROM lookup_sets WHERE code = 'draft-status');
|
|
|
|
INSERT INTO lookup_values (lookup_set_id, value, label, sort_order, is_default)
|
|
VALUES
|
|
(@pass_fail_id, 'pass', 'Pass', 1, 1),
|
|
(@pass_fail_id, 'fail', 'Fail', 2, 0),
|
|
(@draft_status_id, 'draft', 'Draft', 1, 1),
|
|
(@draft_status_id, 'in_progress', 'In Progress', 2, 0),
|
|
(@draft_status_id, 'ready_for_export', 'Ready for Export', 3, 0),
|
|
(@draft_status_id, 'exported', 'Exported', 4, 0),
|
|
(@draft_status_id, 'archived', 'Archived', 5, 0)
|
|
ON DUPLICATE KEY UPDATE
|
|
label = VALUES(label),
|
|
sort_order = VALUES(sort_order),
|
|
is_default = VALUES(is_default);
|
|
|
|
-- The image rule row is the configuration edited by the administrator UI.
|
|
INSERT INTO image_rules (
|
|
code,
|
|
name,
|
|
allowed_mime_types_json,
|
|
max_file_size_bytes,
|
|
max_width_px,
|
|
max_height_px,
|
|
jpeg_quality,
|
|
oversize_behavior,
|
|
max_attachments_per_field,
|
|
is_active
|
|
)
|
|
VALUES (
|
|
'standard-mobile-images',
|
|
'Standard Mobile Image Policy',
|
|
'["image/jpeg", "image/png", "image/webp"]',
|
|
5242880,
|
|
1920,
|
|
1920,
|
|
82,
|
|
'auto_optimize',
|
|
5,
|
|
1
|
|
)
|
|
ON DUPLICATE KEY UPDATE
|
|
name = VALUES(name),
|
|
allowed_mime_types_json = VALUES(allowed_mime_types_json),
|
|
max_file_size_bytes = VALUES(max_file_size_bytes),
|
|
max_width_px = VALUES(max_width_px),
|
|
max_height_px = VALUES(max_height_px),
|
|
jpeg_quality = VALUES(jpeg_quality),
|
|
oversize_behavior = VALUES(oversize_behavior),
|
|
max_attachments_per_field = VALUES(max_attachments_per_field),
|
|
is_active = VALUES(is_active);
|
|
|
|
-- Export profile settings are placeholders for the later XLSX/ZIP phase.
|
|
INSERT INTO export_profiles (
|
|
code,
|
|
name,
|
|
zip_image_dir,
|
|
excel_sheet_name,
|
|
include_template_version,
|
|
include_export_timestamp,
|
|
is_active
|
|
)
|
|
VALUES (
|
|
'default-report-export',
|
|
'Default Report Export',
|
|
'images',
|
|
'Checklist',
|
|
1,
|
|
1,
|
|
1
|
|
)
|
|
ON DUPLICATE KEY UPDATE
|
|
name = VALUES(name),
|
|
zip_image_dir = VALUES(zip_image_dir),
|
|
excel_sheet_name = VALUES(excel_sheet_name),
|
|
include_template_version = VALUES(include_template_version),
|
|
include_export_timestamp = VALUES(include_export_timestamp),
|
|
is_active = VALUES(is_active);
|
|
|
|
-- App config values fine-tune the client without changing code.
|
|
INSERT INTO app_config (config_key, config_value_json)
|
|
VALUES
|
|
('autosave', '{"enabled": true, "intervalSeconds": 20}'),
|
|
('offlineCache', '{"templateTtlHours": 24, "refreshOnStartup": true}'),
|
|
('reportStatuses', '["draft", "in_progress", "ready_for_export", "exported", "archived"]')
|
|
ON DUPLICATE KEY UPDATE
|
|
config_value_json = VALUES(config_value_json);
|