acquire-core-x/db/schema.d/25-py.sql
forge-bot bec83c721e Phase 2b: 11개 모듈 전량 실동작 (333 서비스, 전서버 부팅)
- 10개 모듈 추가/확장(au py rc st lg cl mm vl mg cm), 각 30 서비스 = 330 + tmsrv
- build.sh 자동발견으로 11 모듈서버 + dbio 라이브러리 23 + 배치 22 빌드
- schema.d 11파일 → 75 테이블, 모듈별 disjoint
- 부팅 리소스 규명: fs.mqueue.queues_max=8192(330큐>256), NDRX_MSGSIZEMAX 16000·
  MSGMAX 50(큐당 5.6MB→0.8MB), msgqueue ulimit 2GB → 전 12서버 runok
- 검증: xadmin psc 333 AVAIL, 매입체인 XA 커밋, prepared_xacts=0

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-19 09:58:39 +00:00

110 lines
4.8 KiB
SQL

-- py 모듈 (지급) 스키마 - 지급 원장 / 지급계좌 / 지급파일 / 예약 / 조정 / 집계
-- Loaded into PostgreSQL on first boot (docker-entrypoint-initdb.d). Prefix 25.
-- ---------------------------------------------------------------------------
-- 지급 원장 (payout)
-- status: R=요청, H=보류, A=승인, J=반려, F=파일편성, P=지급완료,
-- C=취소, V=역분개, X=마감
-- ---------------------------------------------------------------------------
CREATE SEQUENCE IF NOT EXISTS py_payout_seq;
CREATE TABLE IF NOT EXISTS py_payout (
payout_id BIGINT PRIMARY KEY,
merchant_id TEXT NOT NULL DEFAULT '',
account_no TEXT NOT NULL DEFAULT '',
amount BIGINT NOT NULL,
fee BIGINT NOT NULL DEFAULT 0,
net BIGINT NOT NULL,
status TEXT NOT NULL,
channel TEXT NOT NULL DEFAULT 'STD', -- STD/SPLIT/BULK/ADVANCE
file_id BIGINT NOT NULL DEFAULT 0,
retry_count INTEGER NOT NULL DEFAULT 0,
reject_reason TEXT NOT NULL DEFAULT '',
biz_date DATE NOT NULL,
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
-- ---------------------------------------------------------------------------
-- 지급계좌 (py_account)
-- ---------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS py_account (
account_no TEXT PRIMARY KEY,
merchant_id TEXT NOT NULL DEFAULT '',
bank_code TEXT NOT NULL DEFAULT '',
holder TEXT NOT NULL DEFAULT '',
balance BIGINT NOT NULL DEFAULT 0,
status TEXT NOT NULL DEFAULT 'ACTIVE',
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
-- ---------------------------------------------------------------------------
-- 지급 파일 (py_file) - status: G=생성, C=확정
-- ---------------------------------------------------------------------------
CREATE SEQUENCE IF NOT EXISTS py_file_seq;
CREATE TABLE IF NOT EXISTS py_file (
file_id BIGINT PRIMARY KEY,
biz_date DATE NOT NULL,
file_name TEXT NOT NULL,
record_count BIGINT NOT NULL DEFAULT 0,
total_amount BIGINT NOT NULL DEFAULT 0,
status TEXT NOT NULL DEFAULT 'G',
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
confirmed_at TIMESTAMPTZ
);
-- ---------------------------------------------------------------------------
-- 지급 예약 (py_schedule) - status: S=예약, D=실행
-- ---------------------------------------------------------------------------
CREATE SEQUENCE IF NOT EXISTS py_schedule_seq;
CREATE TABLE IF NOT EXISTS py_schedule (
schedule_id BIGINT PRIMARY KEY,
payout_id BIGINT NOT NULL,
run_date DATE NOT NULL,
status TEXT NOT NULL DEFAULT 'S',
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
-- ---------------------------------------------------------------------------
-- 지급 조정 (py_adjust)
-- ---------------------------------------------------------------------------
CREATE SEQUENCE IF NOT EXISTS py_adjust_seq;
CREATE TABLE IF NOT EXISTS py_adjust (
adj_id BIGINT PRIMARY KEY,
payout_id BIGINT NOT NULL,
delta BIGINT NOT NULL,
reason TEXT NOT NULL DEFAULT '',
biz_date DATE NOT NULL,
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
-- ---------------------------------------------------------------------------
-- 지급 원장 상세 (py_ledger) - 이체/연계 원장
-- ---------------------------------------------------------------------------
CREATE SEQUENCE IF NOT EXISTS py_ledger_seq;
CREATE TABLE IF NOT EXISTS py_ledger (
ledger_id BIGINT PRIMARY KEY,
payout_id BIGINT NOT NULL,
entry_type TEXT NOT NULL,
amount BIGINT NOT NULL,
biz_date DATE NOT NULL,
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
-- ---------------------------------------------------------------------------
-- 가맹점 일별 지급 집계 (py_summary) - 배치/서비스가 채움
-- ---------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS py_summary (
merchant_id TEXT NOT NULL,
biz_date DATE NOT NULL,
payout_count BIGINT NOT NULL DEFAULT 0,
payout_amount BIGINT NOT NULL DEFAULT 0,
updated_at TIMESTAMPTZ NOT NULL DEFAULT now(),
PRIMARY KEY (merchant_id, biz_date)
);
-- Seed payout accounts so PAY_REMIT/PAY_ACCTCHK have counterparties.
INSERT INTO py_account (account_no, merchant_id, bank_code, holder, balance, status) VALUES
('110-1234-567890', 'M0001', '020', '클라로 커피', 500000000, 'ACTIVE'),
('333-9876-543210', 'M0002', '088', '포지 마트', 500000000, 'ACTIVE'),
('456-0000-111222', 'M0003', '004', '클라로 면세점', 900000000, 'ACTIVE')
ON CONFLICT (account_no) DO NOTHING;