/*
 * lg_pendsweep_batch.pgc - lg 미결전표 일괄 정리 배치 (XA).
 *
 * 기준일 이전에 작성(D)된 채 방치된 미결전표를 일괄 X(취소) 처리하고 소속
 * 라인을 closed 로 전환한다. 두 UPDATE 의 처리 건수를 대조해 보고한다.
 * 모두 ONE global XA transaction 에서 수행.
 * Usage: lg_pendsweep_batch [CUTOFF-DATE]
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <atmi.h>
#include "lg_dbio.h"
#include "lg_pendsweep_batch.h"

int main(int argc, char **argv)
{
    lg_pendsweep_rec_t rec;

    EXEC SQL BEGIN DECLARE SECTION;
    char h_cutoff[16];
    EXEC SQL END DECLARE SECTION;

    memset(&rec, 0, sizeof(rec));
    strncpy(rec.cutoff, (argc > 1) ? argv[1] : "2026-07-01", sizeof(rec.cutoff)-1);
    strncpy(h_cutoff, rec.cutoff, sizeof(h_cutoff)-1); h_cutoff[sizeof(h_cutoff)-1] = 0;

    if (tpinit(NULL) < 0) { fprintf(stderr, "tpinit FAIL: %s\n", tpstrerror(tperrno)); return 1; }
    if (tpopen() < 0)     { fprintf(stderr, "tpopen FAIL: %s\n", tpstrerror(tperrno)); return 1; }
    if (tpbegin(60, 0) < 0) { fprintf(stderr, "tpbegin FAIL: %s\n", tpstrerror(tperrno)); return 1; }

    /* 라인을 먼저 closed 처리 (전표 상태 갱신 전에 대상 식별) */
    EXEC SQL UPDATE lg_ledger_line SET status = 'closed'
        WHERE status = 'posted'
          AND voucher_id IN (SELECT voucher_id FROM lg_voucher
                             WHERE status = 'D' AND biz_date < :h_cutoff);
    if (sqlca.sqlcode < 0) { fprintf(stderr, "LINE UPD FAIL [%d] %s\n", sqlca.sqlcode, sqlca.sqlerrm.sqlerrmc); tpabort(0); return 1; }
    rec.closed_lines = sqlca.sqlerrd[2];

    EXEC SQL UPDATE lg_voucher
        SET status = 'X', memo = memo || ' [미결 일괄정리]', updated_at = now()
        WHERE status = 'D' AND biz_date < :h_cutoff;
    if (sqlca.sqlcode < 0) { fprintf(stderr, "VCH UPD FAIL [%d] %s\n", sqlca.sqlcode, sqlca.sqlerrm.sqlerrmc); tpabort(0); return 1; }
    rec.swept_vouchers = sqlca.sqlerrd[2];

    if (tpcommit(0) < 0) { fprintf(stderr, "tpcommit FAIL: %s\n", tpstrerror(tperrno)); tpabort(0); return 1; }
    printf(">>> lg_pendsweep_batch COMMIT: %s 이전 미결 %ld전표 / %ld라인 정리\n",
           rec.cutoff, rec.swept_vouchers, rec.closed_lines);

    tpclose(); tpterm();
    return 0;
}
