Wave H: Oracle 계보(As-Is) 심기 + 시스템 조망 재편(운영 콘솔)
■ Oracle 계보 — "원본은 Oracle 19c + Pro*C 였다" 현행 코드(ECPG/PostgreSQL)가 Oracle 시스템의 1차 이관본임을 콘크리트하게 보존. - legacy-oracle/proc/*.pc (7본): ACQUIRE/AUTH_APPROVE/ST_MDR/SETTLE/RECONCILE/ CL_DAILY/PAY_FILEGEN. 순수 Oracle Pro*C 방언 — sqlca/oraca, VARCHAR, WHENEVER SQLERROR GOTO, NVL/DECODE/SYSDATE/DUAL/ROWNUM/(+)/CONNECT BY/ .NEXTVAL/TO_DATE, PL/SQL 패키지 호출, COMMIT WORK. 컴파일 대상 아님(As-Is 원본). - legacy-oracle/plsql/*.sql (2본): PKG_SETTLE(정산), PKG_LEDGER(복식부기 기표). VARCHAR2/%TYPE/%ROWTYPE/CURSOR/EXCEPTION/RAISE_APPLICATION_ERROR. - docs/ORACLE_PROVENANCE.md: As-Is(Oracle)→현행(ECPG)→To-Be(Spring Boot) 3단 계보 + Oracle→PostgreSQL 방언 이관 매핑 15종 + "왜 DB는 PostgreSQL인가". - gen_metrics.py: legacy-oracle 실측(원본 9파일 1,827LOC, 방언 12종 히트) → 마이그레이션 난이도 화면에 "④ Oracle 계보" 패널 추가. ■ 시스템 조망 재편 — 실제 매입시스템 운영 콘솔 "마이그레이션 난이도"(Forge 관점 메타)를 시스템 조망에서 분리하고, 시스템 자체의 상태·아키텍처를 보여주는 운영 화면 신설. - 신규 "시스템 현황"(#sys): 헬스 KPI(서버11/서비스1466/미결2PC/당일매입/채널UP/ 큐적체/오류) + 아키텍처 토폴로지(채널·카드망→전문GW→승인·매입→정산·지급→ 원장·마감·대사·검증→마스터·공통 계층도) + 채널상태 + 큐적체 + 처리량·오류율 + 정산사이클(마감·순액정산·클리어링·프레젠트먼트). 전부 실측 조회. - nav 재편: [시스템 조망]=시스템현황·아키텍처토폴로지·정산경제, [전환 분석(Forge)]=마이그레이션난이도. - 토폴로지 모듈박스 렌더 버그(return ASI) 수정. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
2ac4c3c920
commit
e1729d6edc
14 changed files with 2054 additions and 7 deletions
182
legacy-oracle/plsql/PKG_LEDGER.sql
Normal file
182
legacy-oracle/plsql/PKG_LEDGER.sql
Normal file
|
|
@ -0,0 +1,182 @@
|
|||
--==========================================================================
|
||||
-- PKG_LEDGER.sql - 원장 복식부기 기표 패키지 (As-Is 원본, Oracle PL/SQL)
|
||||
----------------------------------------------------------------------------
|
||||
-- 대상 : BC 매입시스템 / 회계 원장 도메인 공용 패키지 PKG_LEDGER
|
||||
-- DBMS : Oracle 19c
|
||||
-- ※ 이 파일은 As-Is 역사 원본이다. pkg_settle 및 ACQUIRE/SETTLE/ST_MDR
|
||||
-- 계열이 호출하는 복식부기(차/대변) 기표 엔진이다. 현행 오픈스택
|
||||
-- 이식본에서는 ledger 단식 INSERT (app/src/st/svc/*, LG_* 서비스) 로
|
||||
-- 단순화되었다. 컴파일 대상 아님(빌드 제외).
|
||||
----------------------------------------------------------------------------
|
||||
-- 변경이력
|
||||
-- 1998.12.05 KIM K.H 최초작성 (전표 헤더/명세 복식부기 기표)
|
||||
-- 2007.06.18 PARK J.S 전표유형->계정 매핑 DECODE 테이블 도입
|
||||
-- 2014.02.27 LEE S.W 전표 역분개 reverse_voucher, 차대 균형검증 강화
|
||||
-- 2019.09.01 CHOI H.W Oracle 11g -> 19c, 예외코드 -20600 대역 정리
|
||||
--==========================================================================
|
||||
|
||||
CREATE OR REPLACE PACKAGE pkg_ledger AS
|
||||
|
||||
-- 차/대변 구분
|
||||
C_DEBIT CONSTANT VARCHAR2(1) := 'D'; -- 차변
|
||||
C_CREDIT CONSTANT VARCHAR2(1) := 'C'; -- 대변
|
||||
|
||||
-- 사용자정의 예외 (-20600 대역)
|
||||
e_unbalanced EXCEPTION;
|
||||
e_bad_type EXCEPTION;
|
||||
e_no_voucher EXCEPTION;
|
||||
PRAGMA EXCEPTION_INIT(e_unbalanced, -20601);
|
||||
PRAGMA EXCEPTION_INIT(e_bad_type, -20602);
|
||||
PRAGMA EXCEPTION_INIT(e_no_voucher, -20603);
|
||||
|
||||
-- 전표유형 -> (차변계정, 대변계정) 매핑
|
||||
PROCEDURE map_accounts(p_type IN VARCHAR2,
|
||||
o_dr_acct OUT VARCHAR2,
|
||||
o_cr_acct OUT VARCHAR2);
|
||||
|
||||
-- 단일 전표 복식부기 기표 (헤더 1 + 명세 2: 차변/대변)
|
||||
PROCEDURE post_voucher(p_pid IN NUMBER,
|
||||
p_type IN VARCHAR2,
|
||||
p_amount IN NUMBER,
|
||||
p_bizdate IN DATE);
|
||||
|
||||
-- 전표 역분개 (차대 반대로 재기표)
|
||||
PROCEDURE reverse_voucher(p_voucher_id IN NUMBER, p_reason IN VARCHAR2);
|
||||
|
||||
-- 전표 차대 균형 검증 (미균형시 예외)
|
||||
FUNCTION is_balanced(p_voucher_id IN NUMBER) RETURN BOOLEAN;
|
||||
|
||||
END pkg_ledger;
|
||||
/
|
||||
|
||||
CREATE OR REPLACE PACKAGE BODY pkg_ledger AS
|
||||
|
||||
----------------------------------------------------------------------
|
||||
-- map_accounts : 전표유형별 차변/대변 계정 결정 (DECODE 매핑)
|
||||
----------------------------------------------------------------------
|
||||
PROCEDURE map_accounts(p_type IN VARCHAR2,
|
||||
o_dr_acct OUT VARCHAR2,
|
||||
o_cr_acct OUT VARCHAR2)
|
||||
IS
|
||||
BEGIN
|
||||
-- 매입채권(1101)/미지급금(2101)/수수료수익(4101)/현금(1001)
|
||||
o_dr_acct := DECODE(p_type,
|
||||
'MDR', '1101', -- 매입채권 / 수수료수익
|
||||
'SETTLE', '1101', -- 매입채권 / 정산미지급
|
||||
'PAYOUT', '2101', -- 정산미지급 / 현금
|
||||
'SETTLE_REV', '2101', -- (역) 정산미지급 / 매입채권
|
||||
NULL);
|
||||
o_cr_acct := DECODE(p_type,
|
||||
'MDR', '4101',
|
||||
'SETTLE', '2101',
|
||||
'PAYOUT', '1001',
|
||||
'SETTLE_REV', '1101',
|
||||
NULL);
|
||||
IF o_dr_acct IS NULL OR o_cr_acct IS NULL THEN
|
||||
RAISE_APPLICATION_ERROR(-20602, '미정의 전표유형 type='||p_type);
|
||||
END IF;
|
||||
END map_accounts;
|
||||
|
||||
----------------------------------------------------------------------
|
||||
-- post_voucher : 복식부기 전표 1건 기표
|
||||
----------------------------------------------------------------------
|
||||
PROCEDURE post_voucher(p_pid IN NUMBER,
|
||||
p_type IN VARCHAR2,
|
||||
p_amount IN NUMBER,
|
||||
p_bizdate IN DATE)
|
||||
IS
|
||||
v_vid ledger_voucher.voucher_id%TYPE;
|
||||
v_dr VARCHAR2(8);
|
||||
v_cr VARCHAR2(8);
|
||||
v_abs NUMBER := ABS(p_amount);
|
||||
v_side VARCHAR2(1);
|
||||
BEGIN
|
||||
map_accounts(p_type, v_dr, v_cr);
|
||||
|
||||
-- 음수 전표(역기표)는 차/대변을 교차
|
||||
IF p_amount < 0 THEN
|
||||
v_side := v_dr; v_dr := v_cr; v_cr := v_side;
|
||||
END IF;
|
||||
|
||||
v_vid := ledger_voucher_seq.NEXTVAL;
|
||||
INSERT INTO ledger_voucher
|
||||
(voucher_id, purchase_id, entry_type, amount, biz_date, status, created_at)
|
||||
VALUES (v_vid, p_pid, p_type, p_amount, p_bizdate, 'N', SYSDATE);
|
||||
|
||||
-- 명세 2행: 차변 / 대변
|
||||
INSERT INTO ledger_entry
|
||||
(entry_id, voucher_id, account_cd, dc_flag, amount, biz_date)
|
||||
VALUES (ledger_entry_seq.NEXTVAL, v_vid, v_dr, C_DEBIT, v_abs, p_bizdate);
|
||||
INSERT INTO ledger_entry
|
||||
(entry_id, voucher_id, account_cd, dc_flag, amount, biz_date)
|
||||
VALUES (ledger_entry_seq.NEXTVAL, v_vid, v_cr, C_CREDIT, v_abs, p_bizdate);
|
||||
|
||||
-- 균형 검증 (방어적)
|
||||
IF NOT is_balanced(v_vid) THEN
|
||||
RAISE_APPLICATION_ERROR(-20601, '전표 차대 불균형 vid='||v_vid);
|
||||
END IF;
|
||||
END post_voucher;
|
||||
|
||||
----------------------------------------------------------------------
|
||||
-- reverse_voucher : 기존 전표를 역분개
|
||||
----------------------------------------------------------------------
|
||||
PROCEDURE reverse_voucher(p_voucher_id IN NUMBER, p_reason IN VARCHAR2)
|
||||
IS
|
||||
r_vou ledger_voucher%ROWTYPE;
|
||||
CURSOR c_ent(cp_vid NUMBER) IS
|
||||
SELECT account_cd, dc_flag, amount
|
||||
FROM ledger_entry
|
||||
WHERE voucher_id = cp_vid;
|
||||
v_newvid ledger_voucher.voucher_id%TYPE;
|
||||
v_flip VARCHAR2(1);
|
||||
BEGIN
|
||||
SELECT * INTO r_vou
|
||||
FROM ledger_voucher
|
||||
WHERE voucher_id = p_voucher_id
|
||||
FOR UPDATE OF status;
|
||||
|
||||
IF r_vou.status = 'R' THEN
|
||||
RAISE_APPLICATION_ERROR(-20603, '이미 역분개 vid='||p_voucher_id);
|
||||
END IF;
|
||||
|
||||
v_newvid := ledger_voucher_seq.NEXTVAL;
|
||||
INSERT INTO ledger_voucher
|
||||
(voucher_id, purchase_id, entry_type, amount, biz_date, status, ref_voucher, created_at)
|
||||
VALUES (v_newvid, r_vou.purchase_id, r_vou.entry_type||'_REV',
|
||||
-r_vou.amount, TRUNC(SYSDATE), 'N', p_voucher_id, SYSDATE);
|
||||
|
||||
-- 원전표 명세를 차대 반대로 복제
|
||||
FOR e IN c_ent(p_voucher_id) LOOP
|
||||
v_flip := DECODE(e.dc_flag, C_DEBIT, C_CREDIT, C_DEBIT);
|
||||
INSERT INTO ledger_entry
|
||||
(entry_id, voucher_id, account_cd, dc_flag, amount, biz_date)
|
||||
VALUES (ledger_entry_seq.NEXTVAL, v_newvid, e.account_cd,
|
||||
v_flip, e.amount, TRUNC(SYSDATE));
|
||||
END LOOP;
|
||||
|
||||
UPDATE ledger_voucher
|
||||
SET status = 'R', reverse_rsn = p_reason, reversed_at = SYSDATE
|
||||
WHERE voucher_id = p_voucher_id;
|
||||
EXCEPTION
|
||||
WHEN NO_DATA_FOUND THEN
|
||||
RAISE_APPLICATION_ERROR(-20603, '전표 없음 vid='||p_voucher_id);
|
||||
END reverse_voucher;
|
||||
|
||||
----------------------------------------------------------------------
|
||||
-- is_balanced : 전표 차변합 = 대변합 여부
|
||||
----------------------------------------------------------------------
|
||||
FUNCTION is_balanced(p_voucher_id IN NUMBER) RETURN BOOLEAN
|
||||
IS
|
||||
v_dr NUMBER := 0;
|
||||
v_cr NUMBER := 0;
|
||||
BEGIN
|
||||
SELECT NVL(SUM(DECODE(dc_flag, C_DEBIT, amount, 0)), 0),
|
||||
NVL(SUM(DECODE(dc_flag, C_CREDIT, amount, 0)), 0)
|
||||
INTO v_dr, v_cr
|
||||
FROM ledger_entry
|
||||
WHERE voucher_id = p_voucher_id;
|
||||
RETURN (v_dr = v_cr AND v_dr > 0);
|
||||
END is_balanced;
|
||||
|
||||
END pkg_ledger;
|
||||
/
|
||||
214
legacy-oracle/plsql/PKG_SETTLE.sql
Normal file
214
legacy-oracle/plsql/PKG_SETTLE.sql
Normal file
|
|
@ -0,0 +1,214 @@
|
|||
--==========================================================================
|
||||
-- PKG_SETTLE.sql - 정산 처리 패키지 (As-Is 원본, Oracle PL/SQL)
|
||||
----------------------------------------------------------------------------
|
||||
-- 대상 : BC 매입시스템 / 정산 도메인 공용 패키지 PKG_SETTLE
|
||||
-- DBMS : Oracle 19c
|
||||
-- ※ 이 파일은 As-Is 역사 원본이다. ACQUIRE.pc 의
|
||||
-- "pkg_settle.acquire_post(:h_pid,:h_merch,:h_amount,:h_fee,:h_net)"
|
||||
-- 호출 대상이며, 현행 오픈스택 이식본에서는 SETTLE/ST_MDR 서비스
|
||||
-- (app/src/st/svc/*) 로 인라인 전개되었다. 컴파일 대상 아님(빌드 제외).
|
||||
----------------------------------------------------------------------------
|
||||
-- 변경이력
|
||||
-- 1998.11.20 KIM K.H 최초작성 (매입시점 정산예정 적재)
|
||||
-- 2005.03.14 PARK J.S 가맹점 일단위 묶음정산 settle_merchant_day 추가
|
||||
-- 2012.09.01 LEE S.W 정산확정/취소 프로시저 분리, 원장연계 pkg_ledger
|
||||
-- 2019.09.01 CHOI H.W Oracle 11g -> 19c, 예외코드 -20500 대역 정리
|
||||
--==========================================================================
|
||||
|
||||
CREATE OR REPLACE PACKAGE pkg_settle AS
|
||||
|
||||
-- 정산 상태 상수
|
||||
C_PENDING CONSTANT VARCHAR2(1) := 'P'; -- 정산예정
|
||||
C_SETTLED CONSTANT VARCHAR2(1) := 'S'; -- 정산확정
|
||||
C_CANCELED CONSTANT VARCHAR2(1) := 'X'; -- 정산취소
|
||||
|
||||
-- 사용자정의 예외 (-20500 대역)
|
||||
e_bad_amount EXCEPTION;
|
||||
e_no_purchase EXCEPTION;
|
||||
e_already_set EXCEPTION;
|
||||
PRAGMA EXCEPTION_INIT(e_bad_amount, -20501);
|
||||
PRAGMA EXCEPTION_INIT(e_no_purchase, -20502);
|
||||
PRAGMA EXCEPTION_INIT(e_already_set, -20503);
|
||||
|
||||
-- ACQUIRE.pc 가 매입확정 직후 호출: 정산예정행 + 원장기표
|
||||
PROCEDURE acquire_post(p_pid IN NUMBER,
|
||||
p_merch IN VARCHAR2,
|
||||
p_amount IN NUMBER,
|
||||
p_fee IN NUMBER,
|
||||
p_net IN NUMBER);
|
||||
|
||||
-- 가맹점 일단위 묶음정산 (커서 집계 -> settlement 확정)
|
||||
PROCEDURE settle_merchant_day(p_merch IN VARCHAR2,
|
||||
p_bizdate IN DATE,
|
||||
o_sid OUT NUMBER,
|
||||
o_net OUT NUMBER);
|
||||
|
||||
-- 정산 확정 (P -> S) : 원장 정산기표 연계
|
||||
PROCEDURE confirm_settlement(p_sid IN NUMBER);
|
||||
|
||||
-- 정산 취소 (S/P -> X) : 역기표
|
||||
PROCEDURE cancel_settlement(p_sid IN NUMBER, p_reason IN VARCHAR2);
|
||||
|
||||
END pkg_settle;
|
||||
/
|
||||
|
||||
CREATE OR REPLACE PACKAGE BODY pkg_settle AS
|
||||
|
||||
----------------------------------------------------------------------
|
||||
-- acquire_post : 매입 1건 정산예정 적재 + MDR/정산 원장기표
|
||||
----------------------------------------------------------------------
|
||||
PROCEDURE acquire_post(p_pid IN NUMBER,
|
||||
p_merch IN VARCHAR2,
|
||||
p_amount IN NUMBER,
|
||||
p_fee IN NUMBER,
|
||||
p_net IN NUMBER)
|
||||
IS
|
||||
v_sid settlement.settlement_id%TYPE;
|
||||
v_bizdate purchase.biz_date%TYPE;
|
||||
v_cnt PLS_INTEGER;
|
||||
BEGIN
|
||||
IF p_amount <= 0 OR p_net < 0 THEN
|
||||
RAISE_APPLICATION_ERROR(-20501,
|
||||
'정산 금액 오류 amount='||p_amount||' net='||p_net);
|
||||
END IF;
|
||||
|
||||
-- 매입행 존재/영업일 확인
|
||||
BEGIN
|
||||
SELECT biz_date INTO v_bizdate
|
||||
FROM purchase
|
||||
WHERE purchase_id = p_pid;
|
||||
EXCEPTION
|
||||
WHEN NO_DATA_FOUND THEN
|
||||
RAISE_APPLICATION_ERROR(-20502,
|
||||
'매입원장 없음 pid='||p_pid);
|
||||
END;
|
||||
|
||||
-- 중복 정산예정 방지
|
||||
SELECT COUNT(*) INTO v_cnt
|
||||
FROM settlement
|
||||
WHERE purchase_id = p_pid
|
||||
AND status <> C_CANCELED;
|
||||
IF v_cnt > 0 THEN
|
||||
RAISE_APPLICATION_ERROR(-20503,
|
||||
'이미 정산예정 존재 pid='||p_pid);
|
||||
END IF;
|
||||
|
||||
v_sid := settlement_seq.NEXTVAL;
|
||||
INSERT INTO settlement
|
||||
(settlement_id, purchase_id, merchant_id,
|
||||
net, fee, biz_date, status, created_at)
|
||||
VALUES (v_sid, p_pid, p_merch,
|
||||
p_net, p_fee, v_bizdate, C_PENDING, SYSDATE);
|
||||
|
||||
-- 매입시점 원장기표 : 수수료(MDR) + 정산부채
|
||||
pkg_ledger.post_voucher(p_pid, 'MDR', p_fee, v_bizdate);
|
||||
pkg_ledger.post_voucher(p_pid, 'SETTLE', p_net, v_bizdate);
|
||||
END acquire_post;
|
||||
|
||||
----------------------------------------------------------------------
|
||||
-- settle_merchant_day : 가맹점 당일 정산예정 묶음 -> 확정
|
||||
----------------------------------------------------------------------
|
||||
PROCEDURE settle_merchant_day(p_merch IN VARCHAR2,
|
||||
p_bizdate IN DATE,
|
||||
o_sid OUT NUMBER,
|
||||
o_net OUT NUMBER)
|
||||
IS
|
||||
CURSOR c_pend IS
|
||||
SELECT s.settlement_id, s.purchase_id, s.net
|
||||
FROM settlement s
|
||||
WHERE s.merchant_id = p_merch
|
||||
AND s.biz_date = p_bizdate
|
||||
AND s.status = C_PENDING
|
||||
FOR UPDATE OF s.status;
|
||||
r_pend c_pend%ROWTYPE;
|
||||
v_sum NUMBER := 0;
|
||||
v_cnt PLS_INTEGER := 0;
|
||||
BEGIN
|
||||
OPEN c_pend;
|
||||
LOOP
|
||||
FETCH c_pend INTO r_pend;
|
||||
EXIT WHEN c_pend%NOTFOUND;
|
||||
v_sum := v_sum + NVL(r_pend.net, 0);
|
||||
v_cnt := v_cnt + 1;
|
||||
UPDATE settlement
|
||||
SET status = C_SETTLED, settled_at = SYSDATE
|
||||
WHERE CURRENT OF c_pend;
|
||||
END LOOP;
|
||||
CLOSE c_pend;
|
||||
|
||||
IF v_cnt = 0 THEN
|
||||
RAISE_APPLICATION_ERROR(-20502,
|
||||
'정산예정 없음 merch='||p_merch||' date='||TO_CHAR(p_bizdate,'YYYYMMDD'));
|
||||
END IF;
|
||||
|
||||
o_sid := settle_batch_seq.NEXTVAL;
|
||||
o_net := v_sum;
|
||||
INSERT INTO settle_batch
|
||||
(batch_id, merchant_id, biz_date, txn_count, net_amount, status, created_at)
|
||||
VALUES (o_sid, p_merch, p_bizdate, v_cnt, v_sum, C_SETTLED, SYSDATE);
|
||||
END settle_merchant_day;
|
||||
|
||||
----------------------------------------------------------------------
|
||||
-- confirm_settlement : 개별 정산예정 확정
|
||||
----------------------------------------------------------------------
|
||||
PROCEDURE confirm_settlement(p_sid IN NUMBER)
|
||||
IS
|
||||
r_set settlement%ROWTYPE;
|
||||
BEGIN
|
||||
SELECT * INTO r_set
|
||||
FROM settlement
|
||||
WHERE settlement_id = p_sid
|
||||
FOR UPDATE OF status;
|
||||
|
||||
IF r_set.status = C_SETTLED THEN
|
||||
RAISE_APPLICATION_ERROR(-20503, '이미 확정 sid='||p_sid);
|
||||
ELSIF r_set.status = C_CANCELED THEN
|
||||
RAISE_APPLICATION_ERROR(-20503, '취소건 확정불가 sid='||p_sid);
|
||||
END IF;
|
||||
|
||||
UPDATE settlement
|
||||
SET status = C_SETTLED, settled_at = SYSDATE
|
||||
WHERE settlement_id = p_sid;
|
||||
|
||||
pkg_ledger.post_voucher(r_set.purchase_id, 'PAYOUT',
|
||||
r_set.net, r_set.biz_date);
|
||||
EXCEPTION
|
||||
WHEN NO_DATA_FOUND THEN
|
||||
RAISE_APPLICATION_ERROR(-20502, '정산건 없음 sid='||p_sid);
|
||||
END confirm_settlement;
|
||||
|
||||
----------------------------------------------------------------------
|
||||
-- cancel_settlement : 정산 취소 + 역기표
|
||||
----------------------------------------------------------------------
|
||||
PROCEDURE cancel_settlement(p_sid IN NUMBER, p_reason IN VARCHAR2)
|
||||
IS
|
||||
v_pid settlement.purchase_id%TYPE;
|
||||
v_net settlement.net%TYPE;
|
||||
v_bd settlement.biz_date%TYPE;
|
||||
v_st settlement.status%TYPE;
|
||||
BEGIN
|
||||
SELECT purchase_id, net, biz_date, status
|
||||
INTO v_pid, v_net, v_bd, v_st
|
||||
FROM settlement
|
||||
WHERE settlement_id = p_sid
|
||||
FOR UPDATE OF status;
|
||||
|
||||
IF v_st = C_CANCELED THEN
|
||||
RAISE_APPLICATION_ERROR(-20503, '이미 취소 sid='||p_sid);
|
||||
END IF;
|
||||
|
||||
UPDATE settlement
|
||||
SET status = C_CANCELED,
|
||||
cancel_rsn = p_reason,
|
||||
canceled_at = SYSDATE
|
||||
WHERE settlement_id = p_sid;
|
||||
|
||||
-- 역기표 (음수 정산)
|
||||
pkg_ledger.post_voucher(v_pid, 'SETTLE_REV', -v_net, v_bd);
|
||||
EXCEPTION
|
||||
WHEN NO_DATA_FOUND THEN
|
||||
RAISE_APPLICATION_ERROR(-20502, '정산건 없음 sid='||p_sid);
|
||||
END cancel_settlement;
|
||||
|
||||
END pkg_settle;
|
||||
/
|
||||
Loading…
Add table
Add a link
Reference in a new issue