/*
 * VL_CROSSCHK.pgc - vl 모듈 서비스 VL_CROSSCHK (one service = one file).
 * 기능: 교차검증(매입+가맹점+승인 동시 존재, RC 비트합).
 * 기존 인라인 vl_svr.pgc에서 분리; caller의 XA 브랜치에서 실행(EXEC SQL CONNECT 없음).
 * vl_svr가 tpsvrinit에서 이 서비스를 tpadvertise 한다.
 */
#include "VL_CROSSCHK.h"

void VL_CROSSCHK(TPSVCINFO *p)
{
    UBFH *b = (UBFH *)p->data;
    long rc = 0;
    EXEC SQL BEGIN DECLARE SECTION;
    long h_pid, h_pcnt, h_mcnt, h_acnt;
    EXEC SQL END DECLARE SECTION;
    h_pid = getl(b, T_PURCHASE_ID);
    EXEC SQL SELECT count(*) INTO :h_pcnt FROM purchase WHERE purchase_id = :h_pid;
    if (sqlca.sqlcode < 0) FAIL(b);
    EXEC SQL SELECT count(*) INTO :h_mcnt FROM purchase p
        JOIN merchant m ON m.merchant_id = p.merchant_id WHERE p.purchase_id = :h_pid;
    if (sqlca.sqlcode < 0) FAIL(b);
    EXEC SQL SELECT count(*) INTO :h_acnt FROM approval WHERE purchase_id = :h_pid;
    if (sqlca.sqlcode < 0) FAIL(b);
    if (h_pcnt == 0) rc |= 1;            /* 매입 없음 */
    if (h_mcnt == 0) rc |= 2;            /* 가맹점 참조 깨짐 */
    if (h_acnt == 0) rc |= 4;            /* 승인 없음 */
    setl(b, T_RC, rc);
    OK(b);
}
