feat: P12(#2) 지급대상건 구성·수정 — 정산월 지급대상 배치 구성/확정 (PL 자율진행)
incar 지급대상건구성/수정/조회 대응. 기존 settle_master 건별 confirm/hold 위에 정산월 단위 지급대상 배치를 구성→포함/제외 편집→확정하는 워크플로우 레이어 추가 (AccountingClose DRAFT/마감 패턴 준용, settle_master 상태는 미변경=결합 최소화). - DB(V115): payment_batch(배치 마스터, status DRAFT/FINALIZED/CANCELLED, total_count/ total_payable) + payment_batch_item(건, settle_id FK, payable 스냅샷, included/exclude_reason, UNIQUE(batch_id,settle_id)) + 메뉴 PAYMENT_TARGET(GRP_SETTLE) + 권한 READ/CREATE/UPDATE/ EXECUTE + 공통코드 PAYMENT_BATCH_STATUS. - core: PaymentBatch/Item VO/Resp/SaveReq/SearchParam/Enum + Mapper. insertFromSettleMaster (INSERT-SELECT 자동채움: settle_month·payable>0·status!=PAID) + recalcTotals + updateInclude. - api: PaymentBatchService create(자동채움+집계)/list/detail/updateItem(DRAFT만,재집계)/ finalize(포함0건 거부)/cancel/export. Controller /api/payment-batches. - frontend: PaymentTarget 화면(배치 목록 + 구성 모달 + 상세 Drawer items 포함/제외 토글 + 합계 + 확정/취소/엑셀) + api 모듈 + App 라우트. export 권한 READ로 정렬. 검증: build+test SUCCESSFUL, Flyway V115(schema v115). 라이브 e2e: 202603 create→39건 자동채움(합 15,438,386.9) → 1건 제외 → 38건 재집계(정확히 −35,079) → finalize → 확정후 수정 400 차단 → cancel. 테스트 배치 정리. 스펙 docs/DOMAIN_GAP_P12. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,112 @@
|
||||
-- V115: 지급대상건 구성·수정 (P12 §2)
|
||||
-- payment_batch / payment_batch_item 테이블
|
||||
-- 메뉴 PAYMENT_TARGET (GRP_SETTLE 하위, sort_order 120)
|
||||
-- 권한 READ/CREATE/UPDATE/EXECUTE + 역할부여 (V113 패턴 동일)
|
||||
-- 공통코드 PAYMENT_BATCH_STATUS (V96/V111 패턴, ON CONFLICT DO NOTHING 멱등)
|
||||
|
||||
-- ============================================================
|
||||
-- 1. payment_batch (지급대상 배치)
|
||||
-- ============================================================
|
||||
|
||||
CREATE TABLE payment_batch (
|
||||
batch_id BIGSERIAL PRIMARY KEY,
|
||||
settle_month CHAR(6) NOT NULL,
|
||||
batch_name VARCHAR(100) NOT NULL,
|
||||
status VARCHAR(20) NOT NULL DEFAULT 'DRAFT',
|
||||
total_count INT NOT NULL DEFAULT 0,
|
||||
total_payable NUMERIC(15,2) NOT NULL DEFAULT 0,
|
||||
created_at TIMESTAMP NOT NULL DEFAULT now(),
|
||||
created_by BIGINT,
|
||||
finalized_at TIMESTAMP,
|
||||
finalized_by BIGINT,
|
||||
updated_at TIMESTAMP,
|
||||
CONSTRAINT chk_payment_batch_status CHECK (status IN ('DRAFT', 'FINALIZED', 'CANCELLED'))
|
||||
);
|
||||
|
||||
CREATE INDEX idx_payment_batch_month_status ON payment_batch (settle_month, status);
|
||||
|
||||
-- ============================================================
|
||||
-- 2. payment_batch_item (지급대상건)
|
||||
-- ============================================================
|
||||
|
||||
CREATE TABLE payment_batch_item (
|
||||
item_id BIGSERIAL PRIMARY KEY,
|
||||
batch_id BIGINT NOT NULL REFERENCES payment_batch(batch_id),
|
||||
settle_id BIGINT NOT NULL REFERENCES settle_master(settle_id),
|
||||
agent_id BIGINT NOT NULL REFERENCES agent(agent_id),
|
||||
payable_amount NUMERIC(15,2) NOT NULL,
|
||||
included BOOLEAN NOT NULL DEFAULT true,
|
||||
exclude_reason VARCHAR(300),
|
||||
created_at TIMESTAMP NOT NULL DEFAULT now(),
|
||||
CONSTRAINT uq_payment_batch_item UNIQUE (batch_id, settle_id)
|
||||
);
|
||||
|
||||
CREATE INDEX idx_payment_batch_item_batch ON payment_batch_item (batch_id);
|
||||
|
||||
-- ============================================================
|
||||
-- 3. 메뉴 INSERT: PAYMENT_TARGET (GRP_SETTLE 하위 PAGE)
|
||||
-- ============================================================
|
||||
|
||||
INSERT INTO menu (parent_menu_id, menu_code, menu_name, menu_type, menu_path, component_path, menu_level, sort_order)
|
||||
SELECT p.menu_id, x.code, x.name, 'PAGE', x.path, x.cmpt, 2, x.sort
|
||||
FROM menu p
|
||||
JOIN (VALUES
|
||||
('PAYMENT_TARGET', '지급대상관리', '/settle/payment-target', 'settle/PaymentTarget', 120)
|
||||
) AS x(code, name, path, cmpt, sort)
|
||||
ON p.menu_code = 'GRP_SETTLE'
|
||||
WHERE NOT EXISTS (SELECT 1 FROM menu WHERE menu_code = x.code);
|
||||
|
||||
-- ============================================================
|
||||
-- 4. 메뉴 권한 항목 등록 (READ / CREATE / UPDATE / EXECUTE)
|
||||
-- ============================================================
|
||||
|
||||
INSERT INTO menu_permission (menu_id, perm_code, perm_name, sort_order)
|
||||
SELECT m.menu_id, p.code, p.name, p.sort
|
||||
FROM menu m
|
||||
CROSS JOIN (VALUES
|
||||
('READ', '조회', 10),
|
||||
('CREATE', '등록', 20),
|
||||
('UPDATE', '수정', 30),
|
||||
('EXECUTE', '확정', 40)
|
||||
) AS p(code, name, sort)
|
||||
WHERE m.menu_code = 'PAYMENT_TARGET'
|
||||
ON CONFLICT (menu_id, perm_code) DO NOTHING;
|
||||
|
||||
-- ============================================================
|
||||
-- 5. 역할별 권한 부여
|
||||
-- ============================================================
|
||||
|
||||
-- SUPER_ADMIN / ADMIN — 전체 권한 (READ / CREATE / UPDATE / EXECUTE)
|
||||
INSERT INTO role_menu_permission (role_id, menu_id, perm_code, is_granted)
|
||||
SELECT r.role_id, mp.menu_id, mp.perm_code, 'Y'
|
||||
FROM role r
|
||||
CROSS JOIN menu_permission mp
|
||||
JOIN menu m ON m.menu_id = mp.menu_id
|
||||
WHERE r.role_code IN ('SUPER_ADMIN', 'ADMIN')
|
||||
AND m.menu_code = 'PAYMENT_TARGET'
|
||||
ON CONFLICT (role_id, menu_id, perm_code) DO NOTHING;
|
||||
|
||||
-- MANAGER — READ 만
|
||||
INSERT INTO role_menu_permission (role_id, menu_id, perm_code, is_granted)
|
||||
SELECT r.role_id, mp.menu_id, mp.perm_code, 'Y'
|
||||
FROM role r
|
||||
CROSS JOIN menu_permission mp
|
||||
JOIN menu m ON m.menu_id = mp.menu_id
|
||||
WHERE r.role_code = 'MANAGER'
|
||||
AND mp.perm_code = 'READ'
|
||||
AND m.menu_code = 'PAYMENT_TARGET'
|
||||
ON CONFLICT (role_id, menu_id, perm_code) DO NOTHING;
|
||||
|
||||
-- ============================================================
|
||||
-- 6. 공통코드: PAYMENT_BATCH_STATUS
|
||||
-- ============================================================
|
||||
|
||||
INSERT INTO common_code_group (group_code, group_name, description, is_system, sort_order) VALUES
|
||||
('PAYMENT_BATCH_STATUS', '지급배치상태', 'DRAFT=작성중/FINALIZED=확정/CANCELLED=취소', 'Y', 450)
|
||||
ON CONFLICT (group_code) DO NOTHING;
|
||||
|
||||
INSERT INTO common_code (group_code, code, code_name, sort_order) VALUES
|
||||
('PAYMENT_BATCH_STATUS', 'DRAFT', '작성중', 10),
|
||||
('PAYMENT_BATCH_STATUS', 'FINALIZED', '확정', 20),
|
||||
('PAYMENT_BATCH_STATUS', 'CANCELLED', '취소', 30)
|
||||
ON CONFLICT (group_code, code) DO NOTHING;
|
||||
Reference in New Issue
Block a user