b17d7b063d
G11 수주 결재상신(905d5c09)과 동일 패턴을 견적관리에 확장. target_type='CONTRACT_ESTIMATE',
target_objid=estimate_template.objid(최신 차수), formId='1162' (수주 1161과 별도 양식).
- 백엔드: salesEstimateService.startEstimateApproval + POST /sales/estimate/:id/amaranth-approval
- 견적 list SQL: LEFT JOIN amaranth_approval(CONTRACT_ESTIMATE) + APPR_STATUS 4단계 한글 라벨 + approval_required='N' fallback (wace contractMgmt.xml:513~522 1:1)
- 프론트: 견적관리 placeholder 토스트 → handleAmaranthApproval 핸들러 + sky-600 Send 버튼 (수주 페이지와 통일)
- docker-compose 3개: AMARANTH_OUT_PROCESS_CODE_CONTRACT_ESTIMATE + AMARANTH_FORM_ID_CONTRACT_ESTIMATE=1162 추가
- 가드: 행 미선택 / est_objid 없음(견적서 미작성) / inProcess+complete / notRequired+approval_required='N'
- 사전판정(checkApprovalRequired)은 G4 영역으로 분리 — 이번 PR은 단순 SSO 흐름만
검증: BEGIN/ROLLBACK으로 26C-0712(est_objid=-452406811) 4단계 상태(create→inProcess→complete→reject)
+ amaranth row 삭제 시 approval_required='N' fallback 모두 한글 라벨 정상. 문서 08-estimate-approval-verify.md.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
95 lines
3.4 KiB
YAML
95 lines
3.4 KiB
YAML
version: "3.8"
|
|
|
|
services:
|
|
# Node.js 백엔드
|
|
backend:
|
|
build:
|
|
context: ../../backend-node
|
|
dockerfile: ../docker/deploy/backend.Dockerfile
|
|
container_name: pms-backend-prod
|
|
restart: always
|
|
environment:
|
|
NODE_ENV: production
|
|
PORT: "3001"
|
|
HOST: 0.0.0.0
|
|
DATABASE_URL: ${DATABASE_URL}
|
|
JWT_SECRET: ${JWT_SECRET}
|
|
JWT_EXPIRES_IN: ${JWT_EXPIRES_IN:-24h}
|
|
CORS_ORIGIN: ${CORS_ORIGIN:-https://v1.vexplor.com,https://api.vexplor.com}
|
|
CORS_CREDENTIALS: "true"
|
|
LOG_LEVEL: info
|
|
ENCRYPTION_KEY: ${ENCRYPTION_KEY}
|
|
KMA_API_KEY: ${KMA_API_KEY}
|
|
ITS_API_KEY: ${ITS_API_KEY}
|
|
EXPRESSWAY_API_KEY: ${EXPRESSWAY_API_KEY:-}
|
|
SMART_FACTORY_API_KEY_COMPANY_10: ${SMART_FACTORY_API_KEY_COMPANY_10:-}
|
|
SMART_FACTORY_API_KEY_COMPANY_9: ${SMART_FACTORY_API_KEY_COMPANY_9:-}
|
|
# SMTP (견적서/발주서 등 메일 발송)
|
|
SMTP_HOST: ${SMTP_HOST:-erp.rps-korea.com}
|
|
SMTP_PORT: ${SMTP_PORT:-25}
|
|
SMTP_TLS: ${SMTP_TLS:-false}
|
|
SMTP_SEND_SWITCH: ${SMTP_SEND_SWITCH:-Y}
|
|
SMTP_USER_ERP: ${SMTP_USER_ERP:-}
|
|
SMTP_PW_ERP: ${SMTP_PW_ERP:-}
|
|
SMTP_USER_SALES: ${SMTP_USER_SALES:-}
|
|
SMTP_PW_SALES: ${SMTP_PW_SALES:-}
|
|
SMTP_USER_PURCHASE: ${SMTP_USER_PURCHASE:-}
|
|
SMTP_PW_PURCHASE: ${SMTP_PW_PURCHASE:-}
|
|
# Amaranth 전자결재 (수주/견적 등) — wace Constants.AMARANTH_OUT_PROCESS_CODE='RPSPLM_00001' 1:1
|
|
AMARANTH_OUT_PROCESS_CODE: ${AMARANTH_OUT_PROCESS_CODE:-RPSPLM_00001}
|
|
AMARANTH_OUT_PROCESS_CODE_CONTRACT_ORDER: ${AMARANTH_OUT_PROCESS_CODE_CONTRACT_ORDER:-}
|
|
AMARANTH_OUT_PROCESS_CODE_CONTRACT_ESTIMATE: ${AMARANTH_OUT_PROCESS_CODE_CONTRACT_ESTIMATE:-}
|
|
AMARANTH_FORM_ID_CONTRACT_ORDER: ${AMARANTH_FORM_ID_CONTRACT_ORDER:-1161}
|
|
AMARANTH_FORM_ID_CONTRACT_ESTIMATE: ${AMARANTH_FORM_ID_CONTRACT_ESTIMATE:-1162}
|
|
AMARANTH_COMP_SEQ: ${AMARANTH_COMP_SEQ:-1000}
|
|
volumes:
|
|
- backend_uploads:/app/uploads
|
|
- backend_data:/app/data
|
|
labels:
|
|
- traefik.enable=true
|
|
- traefik.http.routers.backend.rule=Host(`api.vexplor.com`)
|
|
- traefik.http.routers.backend.entrypoints=websecure,web
|
|
- traefik.http.routers.backend.tls=true
|
|
- traefik.http.routers.backend.tls.certresolver=le
|
|
- traefik.http.services.backend.loadbalancer.server.port=3001
|
|
|
|
# Next.js 프론트엔드
|
|
frontend:
|
|
build:
|
|
context: ../../frontend
|
|
dockerfile: ../docker/deploy/frontend.Dockerfile
|
|
args:
|
|
- NEXT_PUBLIC_API_URL=https://api.vexplor.com/api
|
|
- SERVER_API_URL=http://backend:3001
|
|
container_name: pms-frontend-prod
|
|
restart: always
|
|
environment:
|
|
NODE_ENV: production
|
|
NEXT_PUBLIC_API_URL: https://api.vexplor.com/api
|
|
SERVER_API_URL: "http://backend:3001"
|
|
NEXT_TELEMETRY_DISABLED: "1"
|
|
PORT: "3000"
|
|
HOSTNAME: 0.0.0.0
|
|
volumes:
|
|
- frontend_data:/app/data
|
|
labels:
|
|
- traefik.enable=true
|
|
- traefik.http.routers.frontend.rule=Host(`v1.vexplor.com`)
|
|
- traefik.http.routers.frontend.entrypoints=websecure,web
|
|
- traefik.http.routers.frontend.tls=true
|
|
- traefik.http.routers.frontend.tls.certresolver=le
|
|
- traefik.http.services.frontend.loadbalancer.server.port=3000
|
|
|
|
volumes:
|
|
backend_uploads:
|
|
driver: local
|
|
backend_data:
|
|
driver: local
|
|
frontend_data:
|
|
driver: local
|
|
|
|
networks:
|
|
default:
|
|
name: toktork_server_default
|
|
external: true
|