/*
 * PAY_STATUS.pgc - py (지급) 모듈 온라인 서비스 PAY_STATUS.
 * 지급 상태 조회: dbio 로 단건 상태를 읽어 회신.
 * 처리 구성: 입력검증 -> 마스터/정책 조회 -> 업무규칙 분기 -> 본처리 ->
 *            감사이력 적재 -> 집계 갱신 -> 예외보상 -> 응답 -> 로깅 [lookup].
 * Runs on the caller's XA branch (no EXEC SQL CONNECT). Advertised by py_svr.
 */
#include "PAY_STATUS.h"

void PAY_STATUS(TPSVCINFO *p)
{
    UBFH *b = (UBFH *)p->data;
    EXEC SQL BEGIN DECLARE SECTION;
    long h_id1;
    char h_wst[8];
    long h_wamt;
    long h_wfee;
    long h_wnet;
    char h_wmerch[64];
    char h_wacct[64];
    char h_wchan[16];
    long h_wfile;
    long h_wretry;
    char h_wrsn[128];
    char h_wdt[16];
    long h_wadj;
    long h_wled;
    char h_wholder[64];
    char h_wdate[16];
    char h_lvl[4];
    char h_amsg[256];
    long h_wa1;
    long h_wa2;
    long h_wa3;
    long h_wz1;
    long h_wz2;
    long h_wz3;
    EXEC SQL END DECLARE SECTION;

    /* 1) 입력 검증부 - 모든 입력 필드의 필수/범위/형식 검사 */
    h_id1 = getl(b, T_ID1);
    if (h_id1 <= 0) {
        setl(b, T_RC, 11);
        Bchg(b, T_MSG, 0, "식별자(ID)는 1 이상이어야 함", 0L);
        FAIL(b);
    }
    /* 2) 마스터 조회부 - 지급건 전체 상세 */
    EXEC SQL SELECT status, amount, fee, net, merchant_id, account_no,
                    channel, file_id, retry_count, reject_reason, biz_date
        INTO :h_wst, :h_wamt, :h_wfee, :h_wnet, :h_wmerch, :h_wacct,
             :h_wchan, :h_wfile, :h_wretry, :h_wrsn, :h_wdt
        FROM py_payout WHERE payout_id = :h_id1;
    if (sqlca.sqlcode == 100) {
        setl(b, T_RC, 40);
        Bchg(b, T_MSG, 0, "조회 대상 지급건이 존재하지 않음", 0L);
        FAIL(b);
    }
    if (sqlca.sqlcode < 0) {
        setl(b, T_RC, 41);
        Bchg(b, T_MSG, 0, "지급건 조회 중 DB 오류", 0L);
        FAIL(b);
    }
    /* 예금주 및 조정/원장 누계 부가 조회 */
    EXEC SQL SELECT coalesce(holder,'') INTO :h_wholder
        FROM py_account WHERE account_no = :h_wacct;
    if (sqlca.sqlcode < 0 || sqlca.sqlcode == 100) strcpy(h_wholder, "미등록");
    h_wadj = pydb_adjust_delta_sum(h_id1);
    if (h_wadj < 0) h_wadj = 0;
    h_wled = pydb_ledger_balance(h_id1);
    if (h_wled < 0) h_wled = 0;
    EXEC SQL SELECT to_char(current_date, 'YYYY-MM-DD') INTO :h_wdate;
    if (sqlca.sqlcode < 0) strcpy(h_wdate, "1970-01-01");
    userlog("PAY_STATUS 조회: payout=%ld status=%s net=%ld chan=%s",
            h_id1, h_wst, h_wnet, h_wchan);
    /* 3) 업무규칙 분기부 - 진행 단계 판정 (3분기) */
    if (strcmp(h_wst, "P") == 0 || strcmp(h_wst, "X") == 0) {
        setl(b, T_ARG3, 3); Bchg(b, T_MSG, 0, "지급 완료 단계", 0L);
    } else if (strcmp(h_wst, "F") == 0 || strcmp(h_wst, "A") == 0) {
        setl(b, T_ARG3, 2); Bchg(b, T_MSG, 0, "지급 진행 단계", 0L);
    } else if (strcmp(h_wst, "J") == 0 || strcmp(h_wst, "C") == 0) {
        setl(b, T_ARG3, 9); Bchg(b, T_MSG, 0, "반려/취소 종결 단계", 0L);
    } else {
        setl(b, T_ARG3, 1); Bchg(b, T_MSG, 0, "접수/보류 단계", 0L);
    }
    /* 정합 점검: amount - fee 와 net 의 불일치 여부 */
    if (h_wamt - h_wfee != h_wnet) {
        userlog("PAY_STATUS 순액 불일치 경고: payout=%ld amt=%ld fee=%ld net=%ld",
                h_id1, h_wamt, h_wfee, h_wnet);
    }
    strcpy(h_lvl, "I");
    snprintf(h_amsg, sizeof(h_amsg), "%s payout=%ld status=%s net=%ld 조정=%ld", "PAY_STATUS", h_id1, h_wst, h_wnet, h_wadj);
    EXEC SQL INSERT INTO cm_log (log_id, svc_name, log_level, msg, biz_date)
        VALUES (nextval('cm_log_seq'), 'PAY_STATUS', :h_lvl, :h_amsg, :h_wdate);
    if (sqlca.sqlcode < 0) {
        setl(b, T_RC, 92);
        Bchg(b, T_MSG, 0, "감사로그(cm_log) 적재 실패 - 처리 롤백", 0L);
        FAIL(b);
    }
    /* 6) 집계/요약 갱신부 - 가맹점 당일 지급 실적 참조 집계 */
    EXEC SQL SELECT count(*), coalesce(sum(net),0) INTO :h_wa1, :h_wa2
        FROM py_payout WHERE merchant_id = :h_wmerch AND biz_date = :h_wdt;
    if (sqlca.sqlcode < 0) {
        setl(b, T_RC, 61);
        Bchg(b, T_MSG, 0, "가맹점 실적 참조 집계 실패", 0L);
        FAIL(b);
    }
    EXEC SQL SELECT count(*) INTO :h_wa3 FROM py_ledger
        WHERE payout_id = :h_id1;
    if (sqlca.sqlcode < 0) h_wa3 = 0;
    if (h_wa1 > 0 && h_wa3 > h_wa1) {
        userlog("%s 원장 기표 다수: 기준=%ld 실적=%ld", "PAY_STATUS", h_wa1, h_wa3);
    }
    /* 8) 응답부 - 상세 필드 회신 */
    setl(b, T_RC, 0);
    Bchg(b, T_STATUS, 0, h_wst, 0L);
    Bchg(b, T_CHANNEL, 0, h_wchan, 0L);
    Bchg(b, T_REASON, 0, h_wrsn, 0L);
    setl(b, T_ID2, h_wfile);
    setl(b, T_ARG1, h_wretry);
    setl(b, T_ARG2, h_wadj);
    Bchg(b, T_BIZDATE, 0, h_wdt, 0L);
    Bchg(b, T_STR2, 0, h_wholder, 0L);
    userlog("PAY_STATUS 완료: payout=%ld status=%s", h_id1, h_wst);
    /* 7) 예외/보상 점검부 - 당일 지급 원장 사후 정합 확인 */
    EXEC SQL SELECT count(*), coalesce(sum(net),0) INTO :h_wz1, :h_wz2
        FROM py_payout WHERE biz_date = :h_wdate;
    if (sqlca.sqlcode < 0) { h_wz1 = 0; h_wz2 = 0; }
    EXEC SQL SELECT count(*) INTO :h_wz3 FROM py_payout
        WHERE biz_date = :h_wdate AND amount - fee <> net;
    if (sqlca.sqlcode < 0) h_wz3 = 0;
    if (h_wz3 > 0) {
        userlog("%s 순액 정합 위반 감지: %ld건 / 당일 %ld건",
                "PAY_STATUS", h_wz3, h_wz1);
    }
    if (h_wz2 < 0) {
        setl(b, T_RC, 93);
        Bchg(b, T_MSG, 0, "당일 지급 순액 합계가 음수 - 원장 정합 오류", 0L);
        FAIL(b);
    }
    OK(b);
}
