# Pipeline: ERP Node.js → Spring Boot Full Migration

## config
- max_retries: 5
- parallel: true
- timeout: 15m
- design_first: false
- model: sonnet
- max_concurrent: 3

## tasks

# ============================================================
# Infrastructure (task-1 ~ task-5)
# ============================================================

### task-1: Spring Boot Project Init [backend]
- depends: none
- done_when: ./gradlew bootJar success
- files: backend-spring/build.gradle, backend-spring/settings.gradle, backend-spring/src/main/resources/application.yml, backend-spring/src/main/java/com/erp/ErpApplication.java
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- verify: cd backend-spring && ./gradlew bootJar 2>&1 | tail -20
- context: |
 Spring Boot 3.3.x + Gradle (Groovy DSL) + Java 21
 Dependencies: spring-boot-starter-web, mybatis-spring-boot-starter (3.0.x),
 spring-boot-starter-security, postgresql, lombok, jjwt
 MyBatis Config: mybatis.mapper-locations=classpath:mapper/*.xml
 mybatis.configuration.map-underscore-to-camel-case=true
 application.yml:
 - DB: postgresql://postgres:ph0909!!@39.117.244.52:11132/plm
 - Port: 8081, Timezone: Asia/Seoul
 - HikariCP: min 2, max 10, timeout 30s

### task-2: BigDecimal Utility [backend]
- depends: task-1
- done_when: DecimalUtils all unit tests pass
- files: backend-spring/src/main/java/com/erp/util/DecimalUtils.java, backend-spring/src/test/java/com/erp/util/DecimalUtilsTest.java
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- verify: cd backend-spring && ./gradlew test --tests "*DecimalUtils*" 2>&1 | tail -20
- context: |
 parse(String), multiply(String,String), addTax(String,String),
 divide(String,String,int scale), sum(List<String>)
 float/double FORBIDDEN. new BigDecimal("string") enforced.
 Test: parse(null)→ZERO, multiply("100","0.1")→10.0000, 0.1+0.2=0.3

### task-3: Common Response Format + Error Handler [backend]
- depends: task-1
- done_when: ApiResponse + GlobalExceptionHandler build pass
- files: backend-spring/src/main/java/com/erp/dto/ApiResponse.java, backend-spring/src/main/java/com/erp/config/GlobalExceptionHandler.java
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- context: |
 Identical to Node response format: { success, data, message }
 ApiResponse.success(data), ApiResponse.error(message)
 GlobalExceptionHandler: @ControllerAdvice, 500/404 Processing

### task-4: Security + JWT Filter [backend]
- depends: task-1
- done_when: SecurityConfig + JwtTokenProvider + JwtAuthenticationFilter build pass
- files: backend-spring/src/main/java/com/erp/config/SecurityConfig.java, backend-spring/src/main/java/com/erp/config/JwtTokenProvider.java, backend-spring/src/main/java/com/erp/filter/JwtAuthenticationFilter.java
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- ref_files: backend-node/src/middleware/authMiddleware.ts, backend-node/src/utils/jwtUtils.ts
- context: |
 JWT secret: ilshin-plm-super-secret-jwt-key-2024
 expiresIn: 24h, refreshExpiresIn: 7d
 payload: { userId, companyCode, role }
 JwtAuthenticationFilter → injects companyCode as RequestAttribute
 /api/auth/login, /api/auth/refresh → permitAll, rest authenticated

### task-5: Common Layer (CommonMapper + CommonService) [backend]
- depends: task-1
- done_when: CommonMapper + CommonService build pass
- files: backend-spring/src/main/java/com/erp/mapper/CommonMapper.java, backend-spring/src/main/resources/mapper/CommonMapper.xml, backend-spring/src/main/java/com/erp/service/CommonService.java
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- context: |
 Common layer managing shared queries/logic in one place.
 CommonMapper.xml: Shared SQL fragments (company_code Filter, Pagination, Dynamic WHERE)
 - <sql id="companyCodeFilter">: company_code filter fragment
 - <sql id="pagination">: OFFSET/LIMIT fragment
 - selectCommonCode: Common code lookup (code_group, code_value)
 - selectByTableDynamic: Dynamic table generic query
 CommonService.java: Shared business logic
 - getCompanyCodeFilter(companyCode): company_code branching util
 - applyPagination(params): Pagination param normalization
 All other Mapper XMLs reuse via <include refid="CommonMapper.companyCodeFilter"/>

### task-6: Auth Login/Refresh API [backend]
- depends: task-3, task-4, task-5
- done_when: /api/auth/login JWT issuance success
- files: backend-spring/src/main/java/com/erp/controller/AuthController.java, backend-spring/src/main/java/com/erp/service/AuthService.java, backend-spring/src/main/java/com/erp/mapper/AuthMapper.java, backend-spring/src/main/resources/mapper/AuthMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $API_POST(/api/auth/login, {"userId":"wace","password":"qlalfqjsgh11"}) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/authRoutes.ts, backend-node/src/controllers/authController.ts, backend-node/src/services/authService.ts
- context: |
 Login: userId + password → JWT (accessToken + refreshToken)
 Refresh: refreshToken → new accessToken
 bcrypt (Spring Security PasswordEncoder), DB: user_info table (MyBatis Mapper + XML)
 Response: { success: true, data: { accessToken, refreshToken, user } }

# ============================================================
# Auth/Admin (task-7 ~ task-13)
# ============================================================

### task-7: Admin Management API [backend]
- depends: task-5
- files: backend-spring/src/main/java/com/erp/controller/AdminController.java, backend-spring/src/main/java/com/erp/service/AdminService.java, backend-spring/src/main/java/com/erp/mapper/AdminMapper.java, backend-spring/src/main/resources/mapper/AdminMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/admin/users) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/adminRoutes.ts, backend-node/src/controllers/adminController.ts, backend-node/src/services/adminService.ts
- context: |
 Admin user CRUD. company_code filter required. Super Admin branching.

### task-8: Role Management API [backend]
- depends: task-5
- files: backend-spring/src/main/java/com/erp/controller/RoleController.java, backend-spring/src/main/java/com/erp/service/RoleService.java, backend-spring/src/main/java/com/erp/mapper/RoleMapper.java, backend-spring/src/main/resources/mapper/RoleMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/role/list) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/roleRoutes.ts, backend-node/src/controllers/roleController.ts

### task-9: Department Management API [backend]
- depends: task-5
- files: backend-spring/src/main/java/com/erp/controller/DepartmentController.java, backend-spring/src/main/java/com/erp/service/DepartmentService.java, backend-spring/src/main/java/com/erp/mapper/DepartmentMapper.java, backend-spring/src/main/resources/mapper/DepartmentMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/department/list) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/departmentRoutes.ts, backend-node/src/controllers/departmentController.ts

### task-10: Company Management API [backend]
- depends: task-5
- files: backend-spring/src/main/java/com/erp/controller/CompanyManagementController.java, backend-spring/src/main/java/com/erp/service/CompanyManagementService.java, backend-spring/src/main/java/com/erp/mapper/CompanyManagementMapper.java, backend-spring/src/main/resources/mapper/CompanyManagementMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/company-management/list) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/companyManagementRoutes.ts, backend-node/src/controllers/companyManagementController.ts

### task-11: System Notice API [backend]
- depends: task-5
- files: backend-spring/src/main/java/com/erp/controller/SystemNoticeController.java, backend-spring/src/main/java/com/erp/service/SystemNoticeService.java, backend-spring/src/main/java/com/erp/mapper/SystemNoticeMapper.java, backend-spring/src/main/resources/mapper/SystemNoticeMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/system-notice/list) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/systemNoticeRoutes.ts, backend-node/src/controllers/systemNoticeController.ts

### task-12: Audit Log API [backend]
- depends: task-5
- files: backend-spring/src/main/java/com/erp/controller/AuditLogController.java, backend-spring/src/main/java/com/erp/service/AuditLogService.java, backend-spring/src/main/java/com/erp/mapper/AuditLogMapper.java, backend-spring/src/main/resources/mapper/AuditLogMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/audit-log/list) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/auditLogRoutes.ts, backend-node/src/controllers/auditLogController.ts, backend-node/src/services/auditLogService.ts

### task-13: Approval API [backend]
- depends: task-5
- files: backend-spring/src/main/java/com/erp/controller/ApprovalController.java, backend-spring/src/main/java/com/erp/service/ApprovalService.java, backend-spring/src/main/java/com/erp/mapper/ApprovalMapper.java, backend-spring/src/main/resources/mapper/ApprovalMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/approval/list) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/approvalRoutes.ts, backend-node/src/controllers/approvalController.ts

# ============================================================
# Table/Entity Management
# ============================================================

### task-14: Table Management API [backend]
- depends: task-5
- files: backend-spring/src/main/java/com/erp/controller/TableManagementController.java, backend-spring/src/main/java/com/erp/service/TableManagementService.java, backend-spring/src/main/java/com/erp/mapper/TableManagementMapper.java, backend-spring/src/main/resources/mapper/TableManagementMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/table-management/tables) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/tableManagementRoutes.ts, backend-node/src/controllers/tableManagementController.ts

### task-15: Entity Join API [backend]
- depends: task-5
- files: backend-spring/src/main/java/com/erp/controller/EntityJoinController.java, backend-spring/src/main/java/com/erp/service/EntityJoinService.java, backend-spring/src/main/java/com/erp/mapper/EntityJoinMapper.java, backend-spring/src/main/resources/mapper/EntityJoinMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/entity-join/list) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/entityJoinRoutes.ts, backend-node/src/controllers/entityJoinController.ts, backend-node/src/services/entityJoinService.ts

### task-16: Entity Reference API [backend]
- depends: task-5
- files: backend-spring/src/main/java/com/erp/controller/EntityReferenceController.java, backend-spring/src/main/java/com/erp/service/EntityReferenceService.java, backend-spring/src/main/java/com/erp/mapper/EntityReferenceMapper.java, backend-spring/src/main/resources/mapper/EntityReferenceMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/entity-reference/list) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/entityReferenceRoutes.ts, backend-node/src/controllers/entityReferenceController.ts

### task-17: Entity Search API [backend]
- depends: task-5
- files: backend-spring/src/main/java/com/erp/controller/EntitySearchController.java, backend-spring/src/main/java/com/erp/service/EntitySearchService.java, backend-spring/src/main/java/com/erp/mapper/EntitySearchMapper.java, backend-spring/src/main/resources/mapper/EntitySearchMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/entity-search/list) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/entitySearchRoutes.ts, backend-node/src/controllers/entitySearchController.ts

### task-18: DDL Management API [backend]
- depends: task-5
- files: backend-spring/src/main/java/com/erp/controller/DdlController.java, backend-spring/src/main/java/com/erp/service/DdlService.java, backend-spring/src/main/java/com/erp/mapper/DdlMapper.java, backend-spring/src/main/resources/mapper/DdlMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/ddl/list) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/ddlRoutes.ts, backend-node/src/controllers/ddlController.ts

### task-19: Table History API [backend]
- depends: task-5
- files: backend-spring/src/main/java/com/erp/controller/TableHistoryController.java, backend-spring/src/main/java/com/erp/service/TableHistoryService.java, backend-spring/src/main/java/com/erp/mapper/TableHistoryMapper.java, backend-spring/src/main/resources/mapper/TableHistoryMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/table-history/list) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/tableHistoryRoutes.ts

### task-20: Table Category Value API [backend]
- depends: task-5
- files: backend-spring/src/main/java/com/erp/controller/TableCategoryValueController.java, backend-spring/src/main/java/com/erp/service/TableCategoryValueService.java, backend-spring/src/main/java/com/erp/mapper/TableCategoryValueMapper.java, backend-spring/src/main/resources/mapper/TableCategoryValueMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/table-category-value/list) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/tableCategoryValueRoutes.ts

### task-21: DB Type Category API [backend]
- depends: task-5
- files: backend-spring/src/main/java/com/erp/controller/DbTypeCategoryController.java, backend-spring/src/main/java/com/erp/service/DbTypeCategoryService.java, backend-spring/src/main/java/com/erp/mapper/DbTypeCategoryMapper.java, backend-spring/src/main/resources/mapper/DbTypeCategoryMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/db-type-category/list) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/dbTypeCategoryRoutes.ts

# ============================================================
# Screen/Layout
# ============================================================

### task-22: Screen Management API [backend]
- depends: task-5
- files: backend-spring/src/main/java/com/erp/controller/ScreenManagementController.java, backend-spring/src/main/java/com/erp/service/ScreenManagementService.java, backend-spring/src/main/java/com/erp/mapper/ScreenManagementMapper.java, backend-spring/src/main/resources/mapper/ScreenManagementMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/screen-management/list) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/screenManagementRoutes.ts, backend-node/src/controllers/screenManagementController.ts

### task-23: Screen Standard API [backend]
- depends: task-5
- files: backend-spring/src/main/java/com/erp/controller/ScreenStandardController.java, backend-spring/src/main/java/com/erp/service/ScreenStandardService.java, backend-spring/src/main/java/com/erp/mapper/ScreenStandardMapper.java, backend-spring/src/main/resources/mapper/ScreenStandardMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/screen-standard/list) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/screenStandardRoutes.ts

### task-24: Screen File API [backend]
- depends: task-5
- files: backend-spring/src/main/java/com/erp/controller/ScreenFileController.java, backend-spring/src/main/java/com/erp/service/ScreenFileService.java, backend-spring/src/main/java/com/erp/mapper/ScreenFileMapper.java, backend-spring/src/main/resources/mapper/ScreenFileMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/screen-file/list) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/screenFileRoutes.ts

### task-25: Screen Group API [backend]
- depends: task-5
- files: backend-spring/src/main/java/com/erp/controller/ScreenGroupController.java, backend-spring/src/main/java/com/erp/service/ScreenGroupService.java, backend-spring/src/main/java/com/erp/mapper/ScreenGroupMapper.java, backend-spring/src/main/resources/mapper/ScreenGroupMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/screen-group/list) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/screenGroupRoutes.ts

### task-26: Screen Embedding API [backend]
- depends: task-5
- files: backend-spring/src/main/java/com/erp/controller/ScreenEmbeddingController.java, backend-spring/src/main/java/com/erp/service/ScreenEmbeddingService.java, backend-spring/src/main/java/com/erp/mapper/ScreenEmbeddingMapper.java, backend-spring/src/main/resources/mapper/ScreenEmbeddingMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/screen-embedding/list) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/screenEmbeddingRoutes.ts

### task-27: Layout API [backend]
- depends: task-5
- files: backend-spring/src/main/java/com/erp/controller/LayoutController.java, backend-spring/src/main/java/com/erp/service/LayoutService.java, backend-spring/src/main/java/com/erp/mapper/LayoutMapper.java, backend-spring/src/main/resources/mapper/LayoutMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/layout/list) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/layoutRoutes.ts, backend-node/src/controllers/layoutController.ts

### task-28: Web Type Standard API [backend]
- depends: task-5
- files: backend-spring/src/main/java/com/erp/controller/WebTypeStandardController.java, backend-spring/src/main/java/com/erp/service/WebTypeStandardService.java, backend-spring/src/main/java/com/erp/mapper/WebTypeStandardMapper.java, backend-spring/src/main/resources/mapper/WebTypeStandardMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/web-type-standard/list) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/webTypeStandardRoutes.ts

# ============================================================
# Dataflow/Flow
# ============================================================

### task-29: Dataflow API [backend]
- depends: task-5
- files: backend-spring/src/main/java/com/erp/controller/DataflowController.java, backend-spring/src/main/java/com/erp/service/DataflowService.java, backend-spring/src/main/java/com/erp/mapper/DataflowMapper.java, backend-spring/src/main/resources/mapper/DataflowMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/dataflow/list) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/dataflowRoutes.ts, backend-node/src/controllers/dataflowController.ts, backend-node/src/services/dataflowService.ts

### task-30: Dataflow Diagram API [backend]
- depends: task-5
- files: backend-spring/src/main/java/com/erp/controller/DataflowDiagramController.java, backend-spring/src/main/java/com/erp/service/DataflowDiagramService.java, backend-spring/src/main/java/com/erp/mapper/DataflowDiagramMapper.java, backend-spring/src/main/resources/mapper/DataflowDiagramMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/dataflow-diagram/list) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/dataflowDiagramRoutes.ts, backend-node/src/controllers/dataflowDiagramController.ts, backend-node/src/services/dataflowDiagramService.ts

### task-31: Dataflow Execution API [backend]
- depends: task-5
- files: backend-spring/src/main/java/com/erp/controller/DataflowExecutionController.java, backend-spring/src/main/java/com/erp/service/DataflowExecutionService.java, backend-spring/src/main/java/com/erp/mapper/DataflowExecutionMapper.java, backend-spring/src/main/resources/mapper/DataflowExecutionMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/dataflow-execution/list) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/dataflowExecutionRoutes.ts, backend-node/src/controllers/dataflowExecutionController.ts

### task-32: Flow API [backend]
- depends: task-5
- files: backend-spring/src/main/java/com/erp/controller/FlowController.java, backend-spring/src/main/java/com/erp/service/FlowService.java, backend-spring/src/main/java/com/erp/mapper/FlowMapper.java, backend-spring/src/main/resources/mapper/FlowMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/flow/list) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/flowRoutes.ts, backend-node/src/controllers/flowController.ts

### task-33: Flow External DB Connection API [backend]
- depends: task-5
- files: backend-spring/src/main/java/com/erp/controller/FlowExternalDbConnectionController.java, backend-spring/src/main/java/com/erp/service/FlowExternalDbConnectionService.java, backend-spring/src/main/java/com/erp/mapper/FlowExternalDbConnectionMapper.java, backend-spring/src/main/resources/mapper/FlowExternalDbConnectionMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/flow-external-db-connection/list) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/flowExternalDbConnectionRoutes.ts

### task-34: Button Dataflow API [backend]
- depends: task-5
- files: backend-spring/src/main/java/com/erp/controller/ButtonDataflowController.java, backend-spring/src/main/java/com/erp/service/ButtonDataflowService.java, backend-spring/src/main/java/com/erp/mapper/ButtonDataflowMapper.java, backend-spring/src/main/resources/mapper/ButtonDataflowMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/button-dataflow/list) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/buttonDataflowRoutes.ts, backend-node/src/controllers/buttonDataflowController.ts

### task-35: Test Button Dataflow API [backend]
- depends: task-5
- files: backend-spring/src/main/java/com/erp/controller/TestButtonDataflowController.java, backend-spring/src/main/java/com/erp/service/TestButtonDataflowService.java, backend-spring/src/main/java/com/erp/mapper/TestButtonDataflowMapper.java, backend-spring/src/main/resources/mapper/TestButtonDataflowMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/test-button-dataflow/list) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/testButtonDataflowRoutes.ts

### task-36: Node Flow API [backend]
- depends: task-5
- files: backend-spring/src/main/java/com/erp/controller/NodeFlowController.java, backend-spring/src/main/java/com/erp/service/NodeFlowService.java, backend-spring/src/main/java/com/erp/mapper/NodeFlowMapper.java, backend-spring/src/main/resources/mapper/NodeFlowMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/dataflow/node-flows) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/dataflow/node-flows.ts, backend-node/src/services/nodeFlowExecutionService.ts
- context: |
 Node-based dataflow CRUD + Execute API.
 Endpoints: GET / (List), GET /:flowId (Detail), POST / (Create),
 PUT / (Modification), DELETE /:flowId (Deletion),
 GET /:flowId/source-table (source table extraction), POST /:flowId/execute (Execute).
 flow_data JSON, includes topology summary extraction logic.

### task-37: Node External Connection API [backend]
- depends: task-5
- files: backend-spring/src/main/java/com/erp/controller/NodeExternalConnectionController.java, backend-spring/src/main/java/com/erp/service/NodeExternalConnectionService.java, backend-spring/src/main/java/com/erp/mapper/NodeExternalConnectionMapper.java, backend-spring/src/main/resources/mapper/NodeExternalConnectionMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/dataflow/node-external-connections/tested) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/dataflow/node-external-connections.ts, backend-node/src/services/externalDbConnectionService.ts
- context: |
 External DB connection for node flows API.
 Endpoints: GET /tested (tested connection List),
 GET /:id/tables (external DB table List),
 GET /:id/tables/:tableName/columns (external DB table column List).
 Connection test in chunks (3 parallel) with 3s timeout.

# ============================================================
# Common Code/Config (task-38 ~ task-44)
# ============================================================

### task-38: Common Code API [backend]
- depends: task-5
- files: backend-spring/src/main/java/com/erp/controller/CommonCodeController.java, backend-spring/src/main/java/com/erp/service/CommonCodeService.java, backend-spring/src/main/java/com/erp/mapper/CommonCodeMapper.java, backend-spring/src/main/resources/mapper/CommonCodeMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/common-code/list) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/commonCodeRoutes.ts, backend-node/src/controllers/commonCodeController.ts, backend-node/src/services/commonCodeService.ts

### task-39: Multilang i18n API [backend]
- depends: task-5
- files: backend-spring/src/main/java/com/erp/controller/MultilangController.java, backend-spring/src/main/java/com/erp/service/MultilangService.java, backend-spring/src/main/java/com/erp/mapper/MultilangMapper.java, backend-spring/src/main/resources/mapper/MultilangMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/multilang/list) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/multilangRoutes.ts

### task-40: Component Standard API [backend]
- depends: task-5
- files: backend-spring/src/main/java/com/erp/controller/ComponentStandardController.java, backend-spring/src/main/java/com/erp/service/ComponentStandardService.java, backend-spring/src/main/java/com/erp/mapper/ComponentStandardMapper.java, backend-spring/src/main/resources/mapper/ComponentStandardMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/component-standard/list) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/componentStandardRoutes.ts, backend-node/src/services/componentStandardService.ts

### task-41: Template Standard API [backend]
- depends: task-5
- files: backend-spring/src/main/java/com/erp/controller/TemplateStandardController.java, backend-spring/src/main/java/com/erp/service/TemplateStandardService.java, backend-spring/src/main/java/com/erp/mapper/TemplateStandardMapper.java, backend-spring/src/main/resources/mapper/TemplateStandardMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/template-standard/list) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/templateStandardRoutes.ts

### task-42: Button Action Standard API [backend]
- depends: task-5
- files: backend-spring/src/main/java/com/erp/controller/ButtonActionStandardController.java, backend-spring/src/main/java/com/erp/service/ButtonActionStandardService.java, backend-spring/src/main/java/com/erp/mapper/ButtonActionStandardMapper.java, backend-spring/src/main/resources/mapper/ButtonActionStandardMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/button-action-standard/list) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/buttonActionStandardRoutes.ts, backend-node/src/controllers/buttonActionStandardController.ts

### task-43: Dynamic Form API [backend]
- depends: task-5
- files: backend-spring/src/main/java/com/erp/controller/DynamicFormController.java, backend-spring/src/main/java/com/erp/service/DynamicFormService.java, backend-spring/src/main/java/com/erp/mapper/DynamicFormMapper.java, backend-spring/src/main/resources/mapper/DynamicFormMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/dynamic-form/list) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/dynamicFormRoutes.ts, backend-node/src/services/dynamicFormService.ts

### task-44: Category Tree API [backend]
- depends: task-5
- files: backend-spring/src/main/java/com/erp/controller/CategoryTreeController.java, backend-spring/src/main/java/com/erp/service/CategoryTreeService.java, backend-spring/src/main/java/com/erp/mapper/CategoryTreeMapper.java, backend-spring/src/main/resources/mapper/CategoryTreeMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/category-tree/list) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/categoryTreeRoutes.ts, backend-node/src/services/categoryTreeService.ts

# ============================================================
# Finance/Tax — BigDecimal Core (task-45 ~ task-51)
# ============================================================

### task-45: Tax Invoice Tax Invoice API [backend]
- depends: task-2, task-5
- files: backend-spring/src/main/java/com/erp/controller/TaxInvoiceController.java, backend-spring/src/main/java/com/erp/service/TaxInvoiceService.java, backend-spring/src/main/java/com/erp/mapper/TaxInvoiceMapper.java, backend-spring/src/main/resources/mapper/TaxInvoiceMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/tax-invoice/list) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/taxInvoiceRoutes.ts, backend-node/src/controllers/taxInvoiceController.ts, backend-node/src/services/taxInvoiceService.ts
- context: |
 Tax Invoice = BigDecimal most critical domain.
 Supply amount, tax, total all BigDecimal Required.
 DecimalUtils.parse()via DB string conversion.
 tax = supplyAmount * taxRate (scale 4, HALF_UP).

### task-46: BOM Management API [backend]
- depends: task-2, task-5
- files: backend-spring/src/main/java/com/erp/controller/BomController.java, backend-spring/src/main/java/com/erp/service/BomService.java, backend-spring/src/main/java/com/erp/mapper/BomMapper.java, backend-spring/src/main/resources/mapper/BomMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/bom/list) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/bomRoutes.ts, backend-node/src/controllers/bomController.ts, backend-node/src/services/bomService.ts
- context: |
 BOM part qty * unit price → total = BigDecimal.
 Recursive sub-part cost aggregation. Preventing cumulative decimal errors is key.

### task-47: Production ProductionPlan API [backend]
- depends: task-2, task-5
- files: backend-spring/src/main/java/com/erp/controller/ProductionController.java, backend-spring/src/main/java/com/erp/service/ProductionService.java, backend-spring/src/main/java/com/erp/mapper/ProductionMapper.java, backend-spring/src/main/resources/mapper/ProductionMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/production/plans) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/productionRoutes.ts, backend-node/src/controllers/productionController.ts
- context: |
 qty, unit price, amount fields all BigDecimal.

### task-48: Sales Report Sales Report API [backend]
- depends: task-2, task-5
- files: backend-spring/src/main/java/com/erp/controller/SalesReportController.java, backend-spring/src/main/java/com/erp/service/SalesReportService.java, backend-spring/src/main/java/com/erp/mapper/SalesReportMapper.java, backend-spring/src/main/resources/mapper/SalesReportMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/sales-report/summary) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/salesReportRoutes.ts, backend-node/src/controllers/salesReportController.ts
- context: |
 Sales total, avg unit price aggregate ops BigDecimal.

### task-49: Analytics Report API [backend]
- depends: task-2, task-5
- files: backend-spring/src/main/java/com/erp/controller/AnalyticsReportController.java, backend-spring/src/main/java/com/erp/service/AnalyticsReportService.java, backend-spring/src/main/java/com/erp/mapper/AnalyticsReportMapper.java, backend-spring/src/main/resources/mapper/AnalyticsReportMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/report/production/summary) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/analyticsReportRoutes.ts, backend-node/src/controllers/analyticsReportController.ts

### task-50: Delivery Delivery API [backend]
- depends: task-2, task-5
- files: backend-spring/src/main/java/com/erp/controller/DeliveryController.java, backend-spring/src/main/java/com/erp/service/DeliveryService.java, backend-spring/src/main/java/com/erp/mapper/DeliveryMapper.java, backend-spring/src/main/resources/mapper/DeliveryMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/delivery/list) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/deliveryRoutes.ts, backend-node/src/controllers/deliveryController.ts, backend-node/src/services/deliveryService.ts

### task-51: Packaging Packaging API [backend]
- depends: task-2, task-5
- files: backend-spring/src/main/java/com/erp/controller/PackagingController.java, backend-spring/src/main/java/com/erp/service/PackagingService.java, backend-spring/src/main/java/com/erp/mapper/PackagingMapper.java, backend-spring/src/main/resources/mapper/PackagingMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/packaging/list) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/packagingRoutes.ts

# ============================================================
# external Connection (task-52 ~ task-57)
# ============================================================

### task-52: External DB Connection API [backend]
- depends: task-5
- files: backend-spring/src/main/java/com/erp/controller/ExternalDbConnectionController.java, backend-spring/src/main/java/com/erp/service/ExternalDbConnectionService.java, backend-spring/src/main/java/com/erp/mapper/ExternalDbConnectionMapper.java, backend-spring/src/main/resources/mapper/ExternalDbConnectionMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/external-db-connection/list) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/externalDbConnectionRoutes.ts, backend-node/src/services/externalDbConnectionService.ts

### task-53: External REST API Connection API [backend]
- depends: task-5
- files: backend-spring/src/main/java/com/erp/controller/ExternalRestApiConnectionController.java, backend-spring/src/main/java/com/erp/service/ExternalRestApiConnectionService.java, backend-spring/src/main/java/com/erp/mapper/ExternalRestApiConnectionMapper.java, backend-spring/src/main/resources/mapper/ExternalRestApiConnectionMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/external-rest-api-connection/list) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/externalRestApiConnectionRoutes.ts, backend-node/src/services/externalRestApiConnectionService.ts

### task-54: External Call API [backend]
- depends: task-5
- files: backend-spring/src/main/java/com/erp/controller/ExternalCallController.java, backend-spring/src/main/java/com/erp/service/ExternalCallService.java, backend-spring/src/main/java/com/erp/mapper/ExternalCallMapper.java, backend-spring/src/main/resources/mapper/ExternalCallMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/external-call/list) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/externalCallRoutes.ts, backend-node/src/services/externalCallService.ts

### task-55: External Call Config API [backend]
- depends: task-5
- files: backend-spring/src/main/java/com/erp/controller/ExternalCallConfigController.java, backend-spring/src/main/java/com/erp/service/ExternalCallConfigService.java, backend-spring/src/main/java/com/erp/mapper/ExternalCallConfigMapper.java, backend-spring/src/main/resources/mapper/ExternalCallConfigMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/external-call-config/list) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/externalCallConfigRoutes.ts, backend-node/src/services/externalCallConfigService.ts

### task-56: Multi Connection API [backend]
- depends: task-5
- files: backend-spring/src/main/java/com/erp/controller/MultiConnectionController.java, backend-spring/src/main/java/com/erp/service/MultiConnectionService.java, backend-spring/src/main/java/com/erp/mapper/MultiConnectionMapper.java, backend-spring/src/main/resources/mapper/MultiConnectionMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/multi-connection/list) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/multiConnectionRoutes.ts

### task-57: OpenAPI Proxy API [backend]
- depends: task-5
- files: backend-spring/src/main/java/com/erp/controller/OpenApiProxyController.java, backend-spring/src/main/java/com/erp/service/OpenApiProxyService.java, backend-spring/src/main/java/com/erp/mapper/OpenApiProxyMapper.java, backend-spring/src/main/resources/mapper/OpenApiProxyMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/open-api-proxy/list) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/openApiProxyRoutes.ts

# ============================================================
# Batch/Schedule (task-58 ~ task-64)
# ============================================================

### task-58: Batch API [backend]
- depends: task-5
- files: backend-spring/src/main/java/com/erp/controller/BatchController.java, backend-spring/src/main/java/com/erp/service/BatchService.java, backend-spring/src/main/java/com/erp/mapper/BatchMapper.java, backend-spring/src/main/resources/mapper/BatchMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/batch/list) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/batchRoutes.ts, backend-node/src/controllers/batchController.ts, backend-node/src/services/batchService.ts

### task-59: Batch Management API [backend]
- depends: task-5
- files: backend-spring/src/main/java/com/erp/controller/BatchManagementController.java, backend-spring/src/main/java/com/erp/service/BatchManagementService.java, backend-spring/src/main/java/com/erp/mapper/BatchManagementMapper.java, backend-spring/src/main/resources/mapper/BatchManagementMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/batch-management/list) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/batchManagementRoutes.ts, backend-node/src/controllers/batchManagementController.ts, backend-node/src/services/batchManagementService.ts

### task-60: Batch Execution Log API [backend]
- depends: task-5
- files: backend-spring/src/main/java/com/erp/controller/BatchExecutionLogController.java, backend-spring/src/main/java/com/erp/service/BatchExecutionLogService.java, backend-spring/src/main/java/com/erp/mapper/BatchExecutionLogMapper.java, backend-spring/src/main/resources/mapper/BatchExecutionLogMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/batch-execution-log/list) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/batchExecutionLogRoutes.ts, backend-node/src/controllers/batchExecutionLogController.ts, backend-node/src/services/batchExecutionLogService.ts

### task-61: Schedule API [backend]
- depends: task-5
- files: backend-spring/src/main/java/com/erp/controller/ScheduleController.java, backend-spring/src/main/java/com/erp/service/ScheduleService.java, backend-spring/src/main/java/com/erp/mapper/ScheduleMapper.java, backend-spring/src/main/resources/mapper/ScheduleMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/schedule/list) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/scheduleRoutes.ts

### task-62: Numbering Rule Numbering API [backend]
- depends: task-5
- files: backend-spring/src/main/java/com/erp/controller/NumberingRuleController.java, backend-spring/src/main/java/com/erp/service/NumberingRuleService.java, backend-spring/src/main/java/com/erp/mapper/NumberingRuleMapper.java, backend-spring/src/main/resources/mapper/NumberingRuleMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/numbering-rule/list) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/numberingRuleRoutes.ts

### task-63: Process Work Standard API [backend]
- depends: task-5
- files: backend-spring/src/main/java/com/erp/controller/ProcessWorkStandardController.java, backend-spring/src/main/java/com/erp/service/ProcessWorkStandardService.java, backend-spring/src/main/java/com/erp/mapper/ProcessWorkStandardMapper.java, backend-spring/src/main/resources/mapper/ProcessWorkStandardMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/process-work-standard/list) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/processWorkStandardRoutes.ts

### task-64: Code Merge API [backend]
- depends: task-5
- files: backend-spring/src/main/java/com/erp/controller/CodeMergeController.java, backend-spring/src/main/java/com/erp/service/CodeMergeService.java, backend-spring/src/main/java/com/erp/mapper/CodeMergeMapper.java, backend-spring/src/main/resources/mapper/CodeMergeMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/code-merge/list) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/codeMergeRoutes.ts

# ============================================================
# Mail (task-65 ~ task-69)
# ============================================================

### task-65: Mail Account File API [backend]
- depends: task-5
- files: backend-spring/src/main/java/com/erp/controller/MailAccountFileController.java, backend-spring/src/main/java/com/erp/service/MailAccountFileService.java, backend-spring/src/main/java/com/erp/mapper/MailAccountFileMapper.java, backend-spring/src/main/resources/mapper/MailAccountFileMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/mail-account-file/list) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/mailAccountFileRoutes.ts, backend-node/src/controllers/mailAccountFileController.ts

### task-66: Mail Receive Basic API [backend]
- depends: task-5
- files: backend-spring/src/main/java/com/erp/controller/MailReceiveBasicController.java, backend-spring/src/main/java/com/erp/service/MailReceiveBasicService.java, backend-spring/src/main/java/com/erp/mapper/MailReceiveBasicMapper.java, backend-spring/src/main/resources/mapper/MailReceiveBasicMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/mail-receive-basic/list) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/mailReceiveBasicRoutes.ts

### task-67: Mail Send Simple API [backend]
- depends: task-5
- files: backend-spring/src/main/java/com/erp/controller/MailSendSimpleController.java, backend-spring/src/main/java/com/erp/service/MailSendSimpleService.java, backend-spring/src/main/java/com/erp/mapper/MailSendSimpleMapper.java, backend-spring/src/main/resources/mapper/MailSendSimpleMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/mail-send-simple/list) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/mailSendSimpleRoutes.ts

### task-68: Mail Sent History API [backend]
- depends: task-5
- files: backend-spring/src/main/java/com/erp/controller/MailSentHistoryController.java, backend-spring/src/main/java/com/erp/service/MailSentHistoryService.java, backend-spring/src/main/java/com/erp/mapper/MailSentHistoryMapper.java, backend-spring/src/main/resources/mapper/MailSentHistoryMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/mail-sent-history/list) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/mailSentHistoryRoutes.ts

### task-69: Mail Template File API [backend]
- depends: task-5
- files: backend-spring/src/main/java/com/erp/controller/MailTemplateFileController.java, backend-spring/src/main/java/com/erp/service/MailTemplateFileService.java, backend-spring/src/main/java/com/erp/mapper/MailTemplateFileMapper.java, backend-spring/src/main/resources/mapper/MailTemplateFileMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/mail-template-file/list) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/mailTemplateFileRoutes.ts

# ============================================================
# Chain/Cascading (task-70 ~ task-75)
# ============================================================

### task-70: Cascading Relation API [backend]
- depends: task-5
- files: backend-spring/src/main/java/com/erp/controller/CascadingRelationController.java, backend-spring/src/main/java/com/erp/service/CascadingRelationService.java, backend-spring/src/main/java/com/erp/mapper/CascadingRelationMapper.java, backend-spring/src/main/resources/mapper/CascadingRelationMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/cascading-relation/list) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/cascadingRelationRoutes.ts

### task-71: Cascading Auto Fill API [backend]
- depends: task-5
- files: backend-spring/src/main/java/com/erp/controller/CascadingAutoFillController.java, backend-spring/src/main/java/com/erp/service/CascadingAutoFillService.java, backend-spring/src/main/java/com/erp/mapper/CascadingAutoFillMapper.java, backend-spring/src/main/resources/mapper/CascadingAutoFillMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/cascading-auto-fill/list) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/cascadingAutoFillRoutes.ts

### task-72: Cascading Condition API [backend]
- depends: task-5
- files: backend-spring/src/main/java/com/erp/controller/CascadingConditionController.java, backend-spring/src/main/java/com/erp/service/CascadingConditionService.java, backend-spring/src/main/java/com/erp/mapper/CascadingConditionMapper.java, backend-spring/src/main/resources/mapper/CascadingConditionMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/cascading-condition/list) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/cascadingConditionRoutes.ts

### task-73: Cascading Mutual Exclusion API [backend]
- depends: task-5
- files: backend-spring/src/main/java/com/erp/controller/CascadingMutualExclusionController.java, backend-spring/src/main/java/com/erp/service/CascadingMutualExclusionService.java, backend-spring/src/main/java/com/erp/mapper/CascadingMutualExclusionMapper.java, backend-spring/src/main/resources/mapper/CascadingMutualExclusionMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/cascading-mutual-exclusion/list) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/cascadingMutualExclusionRoutes.ts

### task-74: Cascading Hierarchy API [backend]
- depends: task-5
- files: backend-spring/src/main/java/com/erp/controller/CascadingHierarchyController.java, backend-spring/src/main/java/com/erp/service/CascadingHierarchyService.java, backend-spring/src/main/java/com/erp/mapper/CascadingHierarchyMapper.java, backend-spring/src/main/resources/mapper/CascadingHierarchyMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/cascading-hierarchy/list) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/cascadingHierarchyRoutes.ts

### task-75: Category Value Cascading API [backend]
- depends: task-5
- files: backend-spring/src/main/java/com/erp/controller/CategoryValueCascadingController.java, backend-spring/src/main/java/com/erp/service/CategoryValueCascadingService.java, backend-spring/src/main/java/com/erp/mapper/CategoryValueCascadingMapper.java, backend-spring/src/main/resources/mapper/CategoryValueCascadingMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/category-value-cascading/list) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/categoryValueCascadingRoutes.ts

# ============================================================
# Logistics/Vehicle (task-76 ~ task-83)
# ============================================================

### task-76: Shipping Plan API [backend]
- depends: task-2, task-5
- files: backend-spring/src/main/java/com/erp/controller/ShippingPlanController.java, backend-spring/src/main/java/com/erp/service/ShippingPlanService.java, backend-spring/src/main/java/com/erp/mapper/ShippingPlanMapper.java, backend-spring/src/main/resources/mapper/ShippingPlanMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/shipping-plan/list) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/shippingPlanRoutes.ts

### task-77: Shipping Order API [backend]
- depends: task-2, task-5
- files: backend-spring/src/main/java/com/erp/controller/ShippingOrderController.java, backend-spring/src/main/java/com/erp/service/ShippingOrderService.java, backend-spring/src/main/java/com/erp/mapper/ShippingOrderMapper.java, backend-spring/src/main/resources/mapper/ShippingOrderMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/shipping-order/list) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/shippingOrderRoutes.ts

### task-78: Booking API [backend]
- depends: task-5
- files: backend-spring/src/main/java/com/erp/controller/BookingController.java, backend-spring/src/main/java/com/erp/service/BookingService.java, backend-spring/src/main/java/com/erp/mapper/BookingMapper.java, backend-spring/src/main/resources/mapper/BookingMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/booking/list) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/bookingRoutes.ts, backend-node/src/services/bookingService.ts

### task-79: Driver API [backend]
- depends: task-5
- files: backend-spring/src/main/java/com/erp/controller/DriverController.java, backend-spring/src/main/java/com/erp/service/DriverService.java, backend-spring/src/main/java/com/erp/mapper/DriverMapper.java, backend-spring/src/main/resources/mapper/DriverMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/driver/list) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/driverRoutes.ts, backend-node/src/controllers/driverController.ts

### task-80: Vehicle API [backend]
- depends: task-5
- files: backend-spring/src/main/java/com/erp/controller/VehicleController.java, backend-spring/src/main/java/com/erp/service/VehicleService.java, backend-spring/src/main/java/com/erp/mapper/VehicleMapper.java, backend-spring/src/main/resources/mapper/VehicleMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/vehicle/list) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/vehicleRoutes.ts

### task-81: Vehicle Trip API [backend]
- depends: task-5
- files: backend-spring/src/main/java/com/erp/controller/VehicleTripController.java, backend-spring/src/main/java/com/erp/service/VehicleTripService.java, backend-spring/src/main/java/com/erp/mapper/VehicleTripMapper.java, backend-spring/src/main/resources/mapper/VehicleTripMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/vehicle-trip/list) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/vehicleTripRoutes.ts

### task-82: Yard Layout API [backend]
- depends: task-5
- files: backend-spring/src/main/java/com/erp/controller/YardLayoutController.java, backend-spring/src/main/java/com/erp/service/YardLayoutService.java, backend-spring/src/main/java/com/erp/mapper/YardLayoutMapper.java, backend-spring/src/main/resources/mapper/YardLayoutMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/yard-layout/list) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/yardLayoutRoutes.ts, backend-node/src/controllers/YardLayoutController.ts, backend-node/src/services/YardLayoutService.ts

### task-83: Digital Twin API [backend]
- depends: task-5
- files: backend-spring/src/main/java/com/erp/controller/DigitalTwinController.java, backend-spring/src/main/java/com/erp/service/DigitalTwinService.java, backend-spring/src/main/java/com/erp/mapper/DigitalTwinMapper.java, backend-spring/src/main/resources/mapper/DigitalTwinMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/digital-twin/list) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/digitalTwinRoutes.ts

# ============================================================
# Report/Dashboard (task-84 ~ task-90)
# ============================================================

### task-84: Dashboard API [backend]
- depends: task-5
- files: backend-spring/src/main/java/com/erp/controller/DashboardController.java, backend-spring/src/main/java/com/erp/service/DashboardService.java, backend-spring/src/main/java/com/erp/mapper/DashboardMapper.java, backend-spring/src/main/resources/mapper/DashboardMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/dashboard/list) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/dashboardRoutes.ts, backend-node/src/controllers/DashboardController.ts, backend-node/src/services/DashboardService.ts

### task-85: Report API [backend]
- depends: task-5
- files: backend-spring/src/main/java/com/erp/controller/ReportController.java, backend-spring/src/main/java/com/erp/service/ReportService.java, backend-spring/src/main/java/com/erp/mapper/ReportMapper.java, backend-spring/src/main/resources/mapper/ReportMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/report/list) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/reportRoutes.ts

### task-86: Barcode Label API [backend]
- depends: task-5
- files: backend-spring/src/main/java/com/erp/controller/BarcodeLabelController.java, backend-spring/src/main/java/com/erp/service/BarcodeLabelService.java, backend-spring/src/main/java/com/erp/mapper/BarcodeLabelMapper.java, backend-spring/src/main/resources/mapper/BarcodeLabelMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/barcode-label/list) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/barcodeLabelRoutes.ts, backend-node/src/controllers/barcodeLabelController.ts, backend-node/src/services/barcodeLabelService.ts

### task-87: Map Data API [backend]
- depends: task-5
- files: backend-spring/src/main/java/com/erp/controller/MapDataController.java, backend-spring/src/main/java/com/erp/service/MapDataService.java, backend-spring/src/main/java/com/erp/mapper/MapDataMapper.java, backend-spring/src/main/resources/mapper/MapDataMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/map-data/list) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/mapDataRoutes.ts

### task-88: Excel Mapping API [backend]
- depends: task-5
- files: backend-spring/src/main/java/com/erp/controller/ExcelMappingController.java, backend-spring/src/main/java/com/erp/service/ExcelMappingService.java, backend-spring/src/main/java/com/erp/mapper/ExcelMappingMapper.java, backend-spring/src/main/resources/mapper/ExcelMappingMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/excel-mapping/list) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/excelMappingRoutes.ts, backend-node/src/services/excelMappingService.ts

### task-89: Risk Alert API [backend]
- depends: task-5
- files: backend-spring/src/main/java/com/erp/controller/RiskAlertController.java, backend-spring/src/main/java/com/erp/service/RiskAlertService.java, backend-spring/src/main/java/com/erp/mapper/RiskAlertMapper.java, backend-spring/src/main/resources/mapper/RiskAlertMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/risk-alert/list) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/riskAlertRoutes.ts

### task-90: Todo API [backend]
- depends: task-5
- files: backend-spring/src/main/java/com/erp/controller/TodoController.java, backend-spring/src/main/java/com/erp/service/TodoService.java, backend-spring/src/main/java/com/erp/mapper/TodoMapper.java, backend-spring/src/main/resources/mapper/TodoMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/todo/list) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/todoRoutes.ts

# ============================================================
# Data Generic CRUD (task-91 ~ task-92) — split: dataRoutes 1270 lines + dataService 1540 lines
# ============================================================

### task-91: Data Generic CRUD — Basic Query/Registration [backend]
- depends: task-5
- files: backend-spring/src/main/java/com/erp/controller/DataController.java, backend-spring/src/main/java/com/erp/service/DataService.java, backend-spring/src/main/java/com/erp/mapper/DataMapper.java, backend-spring/src/main/resources/mapper/DataMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/data/test_table) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/dataRoutes.ts, backend-node/src/services/dataService.ts
- context: |
    Low-code Generic CRUD basic features. dataRoutes.ts(1270 lines) + dataService.ts(1540 lines) split 1/2.
    Endpoints:
    - GET /api/data/{tableName} (table data query, paging/filter/sort)
    - GET /api/data/{tableName}/columns (column meta query)
    - GET /api/data/{tableName}/{id} (single record detail)
    - POST /api/data/{tableName} (single INSERT)
    - PUT /api/data/{tableName}/{id} (single UPDATE)
    - DELETE /api/data/{tableName}/{id} (single DELETE)
    - GET /api/data/join (join query)
    DataService: getTableData, getTableColumns, getRecordDetail, createRecord, updateRecord, deleteRecord, getJoinedData.
    Dynamic table name → SQL injection prevention via whitelist required.

### task-92: Data Generic CRUD — Advanced (Bulk/Excel/Transaction) [backend]
- depends: task-91
- files: backend-spring/src/main/java/com/erp/controller/DataAdvancedController.java, backend-spring/src/main/java/com/erp/service/DataAdvancedService.java, backend-spring/src/main/java/com/erp/mapper/DataAdvancedMapper.java, backend-spring/src/main/resources/mapper/DataAdvancedMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_POST(/api/data/upsert-grouped, {"groups":[]}) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/dataRoutes.ts, backend-node/src/services/dataService.ts
- context: |
    Low-code Generic CRUD advanced features. dataRoutes.ts + dataService.ts split 2/2.
    Endpoints:
    - POST /api/data/upsert-grouped (grouped upsert — multi-table transaction)
    - POST /api/data/{tableName}/delete (conditional bulk delete)
    - POST /api/data/{tableName}/delete-group (grouped bulk delete)
    - GET /api/data/multi-table/auto-detect (multi-table auto-detect)
    - POST /api/data/multi-table/upload (multi-table Excel upload)
    - GET /api/data/master-detail/relation/:screenId (master-detail relation query)
    - POST /api/data/master-detail/download (master-detail Excel download)
    - POST /api/data/master-detail/upload (master-detail Excel upload)
    - POST /api/data/master-detail/upload-simple (simple Excel upload)
    DataAdvancedService: upsertGroupedRecords, deleteGroupRecords, master-detail/multi-table Excel processing.
    @Transactional required. Injects task-91's DataService for basic CRUD delegation.

# ============================================================
# Other Backend (task-93 ~ task-99)
# ============================================================

### task-93: POP Action API [backend]
- depends: task-5
- files: backend-spring/src/main/java/com/erp/controller/PopActionController.java, backend-spring/src/main/java/com/erp/service/PopActionService.java, backend-spring/src/main/java/com/erp/mapper/PopActionMapper.java, backend-spring/src/main/resources/mapper/PopActionMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/pop-action/list) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/popActionRoutes.ts

### task-94: POP Production API [backend]
- depends: task-2, task-5
- files: backend-spring/src/main/java/com/erp/controller/PopProductionController.java, backend-spring/src/main/java/com/erp/service/PopProductionService.java, backend-spring/src/main/java/com/erp/mapper/PopProductionMapper.java, backend-spring/src/main/resources/mapper/PopProductionMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/pop-production/list) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/popProductionRoutes.ts

### task-95: Work History API [backend]
- depends: task-5
- files: backend-spring/src/main/java/com/erp/controller/WorkHistoryController.java, backend-spring/src/main/java/com/erp/service/WorkHistoryService.java, backend-spring/src/main/java/com/erp/mapper/WorkHistoryMapper.java, backend-spring/src/main/resources/mapper/WorkHistoryMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/work-history/list) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/workHistoryRoutes.ts

### task-96: Mold Mold Management API [backend]
- depends: task-5
- files: backend-spring/src/main/java/com/erp/controller/MoldController.java, backend-spring/src/main/java/com/erp/service/MoldService.java, backend-spring/src/main/java/com/erp/mapper/MoldMapper.java, backend-spring/src/main/resources/mapper/MoldMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/mold/list) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/moldRoutes.ts

### task-97: Design Design Management API [backend]
- depends: task-5
- files: backend-spring/src/main/java/com/erp/controller/DesignController.java, backend-spring/src/main/java/com/erp/service/DesignService.java, backend-spring/src/main/java/com/erp/mapper/DesignMapper.java, backend-spring/src/main/resources/mapper/DesignMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/design/list) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/designRoutes.ts, backend-node/src/controllers/designController.ts

### task-98: Collection Collection Management API [backend]
- depends: task-5
- files: backend-spring/src/main/java/com/erp/controller/CollectionController.java, backend-spring/src/main/java/com/erp/service/CollectionService.java, backend-spring/src/main/java/com/erp/mapper/CollectionMapper.java, backend-spring/src/main/resources/mapper/CollectionMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/collection/list) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/collectionRoutes.ts, backend-node/src/services/collectionService.ts

### task-99: AI Assistant Proxy API [backend]
- depends: task-5
- files: backend-spring/src/main/java/com/erp/controller/AiAssistantProxyController.java, backend-spring/src/main/java/com/erp/service/AiAssistantProxyService.java, backend-spring/src/main/java/com/erp/mapper/AiAssistantProxyMapper.java, backend-spring/src/main/resources/mapper/AiAssistantProxyMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/ai-assistant/status) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/aiAssistantProxy.ts

### task-100: File Upload/Download API [backend]
- depends: task-5
- files: backend-spring/src/main/java/com/erp/controller/FileController.java, backend-spring/src/main/java/com/erp/service/FileService.java, backend-spring/src/main/java/com/erp/mapper/FileMapper.java, backend-spring/src/main/resources/mapper/FileMapper.xml
- test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20
- api_test: $LOGIN && $API_GET(/api/file/list) && $EXPECT_SUCCESS
- ref_files: backend-node/src/routes/fileRoutes.ts, backend-node/src/controllers/fileController.ts
- context: |
    Existing multer → Spring Multipart conversion.
    File upload/download/delete CRUD.

# ============================================================
# Frontend API Integration (task-101 ~ task-102)
# ============================================================

### task-101: Frontend API Client baseURL Change [frontend]
# NOTE: task-100 = last backend task. Executes after all APIs complete.
- depends: task-100
- files: frontend/lib/api/client.ts
- test: cd frontend && npx tsc --noEmit --pretty 2>&1 | head -50
- browser_test: |
 "http://localhost:9771 Access → Login (wace / qlalfqjsgh11) → Dashboard Load check → Left menu displays correctly"
- context: |
    Change API baseURL to Spring Boot server (8081).
    Env var NEXT_PUBLIC_API_URL or client.ts baseURL modification.
    Minimal frontend code change. URL patterns and response format are identical, only baseURL needs to change.

### task-102: Frontend Integration E2E Verification [frontend]
# NOTE: Depends on task-101 (last FE task). Executes after all complete.
- depends: task-101
- files: frontend/lib/api/client.ts
- browser_test: |
    "http://localhost:9771 access (backend: Spring Boot 8081)
    → Login (wace / qlalfqjsgh11) → Dashboard load check
    → BOM Management menu → list display check
    → Tax Invoice menu → list display check → amount field decimal check
    → Production Plan menu → list display check
    → Sales Report → total amount check"
- context: |
 Spring Boot server 8081 running state, Frontend integration final check.
 Finance-related screens, BigDecimal precision visual check.
