import config from "./config/config"; import logging from "./config/logging"; import * as Xcron from "node-cron"; import { getOrder, updateCashback, uploadCashback } from "./lib_cashback"; import { download, upload, getDataNatInfo, insertNatInfo, getMember, uploadV2, downloadV2, generate, getDate, updateLastMemberDownloaded, updateStatusGatewayLastUploadMember, updateStatusUploadMember, updateStatusLastInfoDownloaded, } from "./lib_member"; import { uploadPayment } from "./lib_payment"; import { retur } from "./lib_retur"; import axios from "axios"; export const NAME_SPACE = "Point Member Gateway"; const VERSION = "1.0"; let isRunning: boolean = false; logging.info(NAME_SPACE, "Starting " + VERSION); const on_init = async () => { logging.info( NAME_SPACE, "-------------------- ON INT START --------------------" ); await one_result_job(); await cashback(); await payment(); await returJob(); logging.info( NAME_SPACE, "-------------------- ON INIT END --------------------" ); }; on_init(); async function one_result_job() { if (isRunning) { logging.info(NAME_SPACE, "Still Running"); return; } isRunning = true; try { logging.info(NAME_SPACE, "Starting Job Member" + VERSION); // UPLOAD logging.info(NAME_SPACE, "Start Get Member"); var mb = await getMember(); let member = []; if (mb["status"] != "OK") { logging.error(NAME_SPACE, "\t Error", mb); } else { if (mb["data"].length > 0) { member = mb["data"]; } logging.info(NAME_SPACE, "\t Success, ditemuka : " + mb["data"].length); } //Sleep logging.info(NAME_SPACE, "\t wait 1s"); await delay(1000); if (member.length > 0) { // console.log("memberNat.length"); // let dateNow = "2025-01-25 12:49:24"; let dateNow = getDate(); var usglum = await updateStatusGatewayLastUploadMember(dateNow); if (usglum["status"] != "OK") { logging.error(NAME_SPACE, "\t Error", usglum); } else { logging.info( NAME_SPACE, "Last status upload member gateway " + dateNow ); } logging.info(NAME_SPACE, "Start Upload Member To National"); for (let i = 0; i < member.length; i++) { const e = member[i]; logging.info( NAME_SPACE, `\t\ Upload Member ${i + 1} of ${member.length}` ); logging.info(NAME_SPACE, "\t\tStart Upload " + e["MemberNumber"]); var dn = await uploadV2(e); // logging.error(NAME_SPACE, "\t\t response", dn); if (dn["status"] != "OK") { logging.error(NAME_SPACE, "\t\t Error", dn); let dateNow = e["MemberLastUpdated"]; var usglum2 = await updateStatusGatewayLastUploadMember(dateNow); if (usglum2["status"] != "OK") { logging.error(NAME_SPACE, "\t\t Error", usglum2); } else { logging.info( NAME_SPACE, "\t\t Last status upload member gateway " + dateNow ); } } else { logging.info(NAME_SPACE, "\t\t Success", dn["data"]); var usum = await updateStatusUploadMember(e); if (usum["status"] != "OK") { logging.error(NAME_SPACE, "\t\t Error", usum); } else { logging.info(NAME_SPACE, "\t\t success ", usum["data"]); } } logging.info(NAME_SPACE, "\t\t wait 1s"); await delay(1000); } logging.info(NAME_SPACE, "End Upload Member To National"); } else { logging.info(NAME_SPACE, "Tidak ada data upload"); } //DOWNLOAD logging.info(NAME_SPACE, "Start Download Member National"); var mbNat = await downloadV2(); let memberNat = []; if (mbNat["status"] != "OK") { logging.error(NAME_SPACE, "\t Error", mbNat); } else { if (mbNat["data"].length > 0) { memberNat = mbNat["data"]; } logging.info( NAME_SPACE, "\t Success, Ditemukan : " + mbNat["data"].length ); } //Sleep logging.info(NAME_SPACE, "\t wait 1s"); await delay(1000); if (memberNat.length > 0) { // console.log("memberNat.length"); // let dateNow = "2025-01-25 12:49:24"; let dateNow = getDate(); var ulmd = await updateLastMemberDownloaded(dateNow); if (ulmd["status"] != "OK") { logging.error(NAME_SPACE, "Error", ulmd); } else { logging.info(NAME_SPACE, "Last status download gateway " + dateNow); } logging.info(NAME_SPACE, "Start Generate Member National"); for (let i = 0; i < memberNat.length; i++) { const e = memberNat[i]; logging.info( NAME_SPACE, `\t\tGenerate Member ${i + 1} of ${memberNat.length} ` ); logging.info(NAME_SPACE, "\t\tStart generate " + e["MemberNumber"]); var dn = await generate(e); if (dn["status"] != "OK") { logging.error(NAME_SPACE, "\t\t Error", dn); var ulmd2 = await updateLastMemberDownloaded(e["MemberLastUpdated"]); if (ulmd2["status"] != "OK") { logging.error(NAME_SPACE, "\t\t Error", ulmd2); } else { logging.info( NAME_SPACE, "\t\t Last status download gateway" + e["MemberLastUpdated"] ); } } else { logging.info(NAME_SPACE, "\t\t Success", dn); } logging.info(NAME_SPACE, "\t\t wait 1s"); await delay(1000); } logging.info(NAME_SPACE, "End Generate Member National"); } else { logging.info(NAME_SPACE, "Tidak ada generate Member National"); } logging.info(NAME_SPACE, "Start Get Info Member National"); var inf = await getDataNatInfo(); let infoList = []; if (inf["status"] != "OK") { logging.error(NAME_SPACE, "\t Error", inf); } else { infoList = inf["records"]; logging.info(NAME_SPACE, "\t Success, total data", inf["total"]); } if (infoList.length > 0) { let dateNow = getDate(); var uslid = await updateStatusLastInfoDownloaded(dateNow); if (uslid["status"] != "OK") { logging.error(NAME_SPACE, "\t Error", uslid); } else { logging.info( NAME_SPACE, "\t Last status download info gateway " + dateNow ); } logging.info(NAME_SPACE, "\t Start Insert info"); for (let i = 0; i < infoList.length; i++) { const e = infoList[i]; logging.info( NAME_SPACE, `\t\t Insert info ${i + 1} of ${infoList.length}` ); logging.info(NAME_SPACE, "\t\t Start Insert info ", e["member_nik"]); // {"member_nik":"0123459547894563","member_point":"20000","member_visit":"2"} var insert = await insertNatInfo( e["member_nik"], e["member_visit"], e["member_point"] ); if (insert["status"] != "OK") { logging.error(NAME_SPACE, "\t\t Error", insert); // let dateNow = getDate(); var usli2 = await updateStatusLastInfoDownloaded( e["Tx_inLastUpdated"] ); if (usli2["status"] != "OK") { logging.error(NAME_SPACE, "\t\t Error", usli2); } else { logging.info( NAME_SPACE, "\t\t Last status download info gateway " + dateNow ); } } else { logging.info(NAME_SPACE, "\t\t Success insert/update data", insert); } logging.info(NAME_SPACE, "\t\t wait 1s"); await delay(1000); } logging.info(NAME_SPACE, "\t End Insert info"); } else { logging.info(NAME_SPACE, "\t Tidak ada data info"); } logging.info(NAME_SPACE, "End Job Member"); isRunning = false; } catch (e) { isRunning = false; if (e instanceof Error) { logging.error(NAME_SPACE, e.message); } else { logging.error(NAME_SPACE, "Unknown"); } } } async function cashback() { if (isRunning) { logging.info(NAME_SPACE, "Still Running"); return; } isRunning = true; try { logging.info(NAME_SPACE, "Starting Job Cashback" + VERSION); // UPLOAD logging.info(NAME_SPACE, "Start Get Data"); var respOrder = await getOrder(); if (respOrder["status"] != "OK") { logging.error(NAME_SPACE, "\t Error", respOrder); } else { logging.info( NAME_SPACE, "\t Success get order ", respOrder["data"].length ); } logging.info(NAME_SPACE, "\t wait 1s"); await delay(1000); let listOrder = respOrder["data"]; // console.log(listOrder); if (listOrder.length > 0) { logging.info(NAME_SPACE, "Start update cashback"); for (let i = 0; i < listOrder.length; i++) { const e = listOrder[i]; logging.info( NAME_SPACE, `\t update cashback ${i + 1} of ${listOrder.length}` ); logging.info( NAME_SPACE, "\t Start update cashback " + e["T_OrderHeaderLabNumber"] ); var respInsert = await updateCashback(e["T_OrderHeaderID"]); if (respInsert["status"] != "OK") { logging.error(NAME_SPACE, "\t Error update cashback", respInsert); } else { logging.info( NAME_SPACE, "\t Success update cashback", respInsert["status"] ); } logging.info( NAME_SPACE, "End update cashback " + e["T_OrderHeaderLabNumber"] ); logging.info(NAME_SPACE, "\t wait 1s"); await delay(1000); } logging.info(NAME_SPACE, "End update cashback"); } else { logging.info(NAME_SPACE, "Tidak ada update cashback"); } logging.info(NAME_SPACE, "\t wait 1s"); await delay(1000); logging.info(NAME_SPACE, "Start upload cashback point"); var ucp = await uploadCashback(); // console.log(ucp); if (ucp["status"] != "OK") { logging.error(NAME_SPACE, "\t Error", ucp); } else { logging.info(NAME_SPACE, "\t Success", ucp); } logging.info(NAME_SPACE, "END upload cashback point"); logging.info(NAME_SPACE, "End Job Cashback"); isRunning = false; } catch (e) { isRunning = false; if (e instanceof Error) { logging.error(NAME_SPACE, e.message); } else { logging.error(NAME_SPACE, "Unknown"); } } } async function payment() { if (isRunning) { logging.info(NAME_SPACE, "Still Running"); return; } isRunning = true; try { logging.info(NAME_SPACE, "Starting Job Payment" + VERSION); // UPLOAD logging.info(NAME_SPACE, "Start Upload Payment"); var respOrder = await uploadPayment(); if (respOrder["status"] != "OK") { logging.error(NAME_SPACE, "\t Error", respOrder); } else { logging.info(NAME_SPACE, "\t Success upload payment ", respOrder); } logging.info(NAME_SPACE, "\t wait 1s"); logging.info(NAME_SPACE, "End Job Payment"); isRunning = false; } catch (e) { isRunning = false; if (e instanceof Error) { logging.error(NAME_SPACE, e.message); } else { logging.error(NAME_SPACE, "Unknown"); } } } async function returJob() { if (isRunning) { logging.info(NAME_SPACE, "Still Running"); return; } isRunning = true; try { logging.info(NAME_SPACE, "Starting Job Retur" + VERSION); // UPLOAD logging.info(NAME_SPACE, "Start Upload Retur"); var respOrder = await retur(); if (respOrder["status"] != "OK") { logging.error(NAME_SPACE, "\t Error", respOrder); } else { logging.info(NAME_SPACE, "\t Success retur ", respOrder); } logging.info(NAME_SPACE, "\t wait 1s"); logging.info(NAME_SPACE, "End Job Retur"); isRunning = false; } catch (e) { isRunning = false; if (e instanceof Error) { logging.error(NAME_SPACE, e.message); } else { logging.error(NAME_SPACE, "Unknown"); } } } // console.log(config); for (const sched of config.schedule) { Xcron.schedule( sched, async () => { logging.info( NAME_SPACE, " -------------------- ON INIT SCHEDULE --------------------" ); await one_result_job(); await cashback(); await payment(); await returJob(); logging.info( NAME_SPACE, "-------------------- END SCHEDULE--------------------" ); }, { timezone: "Asia/Jakarta", } ); } // ------------- function async function delay(ms: number) { return new Promise((resolve) => setTimeout(resolve, ms)); }