var oracleModel = require("../model/oracle.js"); var sqlServer = require("../util/db_sqlserver.js"); var sql = require("mssql"); var util = require("../util/util.js"); var log = require("../util/log.js"); var cron = require("cron"); var getQueryJob = cron.job("* * * * * *"); var startMorning = cron.job("* * * * * *"); var endMorning = cron.job("* * * * * *"); var startNight = cron.job("* * * * * *"); var endNight = cron.job("* * * * * *"); var checkStartJob = cron.job("* * * * * *"); var collectionInsertJob = cron.job("* * * * * *"); var oracleInsertJob = cron.job("* * * * * *"); var moment = require("moment"); function scheduleData() { var configjs = util.getConfig(); startMorning.stop(); endMorning.stop(); startNight.stop(); endNight.stop(); //startMorning.stop(); var startMorningTime = configjs.config_time.start_morning; startMorning = cron.job( `00 ${startMorningTime.substr(3, 2)} ${startMorningTime.substr( 0, 2 )} * * *`, function () { var process = util.getProcess(); process.is_running = "FALSE"; util.saveProcess(process); getQueryJob.stop(); collectionInsertJob.stop(); oracleInsertJob.stop(); util.infoNotif( "Waktu Good Morning", "Job akan dimatikan untuk sementara" ); }, null, true ); var endMorningTime = configjs.config_time.end_morning; endMorning = cron.job( `00 ${endMorningTime.substr(3, 2)} ${endMorningTime.substr(0, 2)} * * *`, function () { var process = util.getProcess(); if (process.is_running != "TRUE") { process.is_running = "TRUE"; process.processing.process_getQuery = "TRUE"; process.processing.process_insertToCollection = "TRUE"; process.processing.process_insertToOracle = "TRUE"; util.saveConfig(configjs); getQueryJob.start(); collectionInsertJob.start(); oracleInsertJob.start(); util.infoNotif("Good Morning Berakhir", "Job akan kembali dihidupkan"); } }, null, true ); var startNightTime = configjs.config_time.start_night; startNight = cron.job( `00 ${startNightTime.substr(3, 2)} ${startNightTime.substr(0, 2)} * * *`, function () { var process = util.getProcess(); process.is_running = "FALSE"; util.saveProcess(process); getQueryJob.stop(); collectionInsertJob.stop(); oracleInsertJob.stop(); util.infoNotif("Waktu Good Bye", "Job akan dimatikan untuk sementara"); }, null, true ); var endNightTime = configjs.config_time.end_night; endMorning = cron.job( `00 ${endNightTime.substr(3, 2)} ${endNightTime.substr(0, 2)} * * *`, function () { var process = util.getProcess(); if (process.is_running != "TRUE") { process.is_running = "TRUE"; process.auto_start = "TRUE"; process.processing.process_getQuery = "TRUE"; process.processing.process_insertToCollection = "TRUE"; process.processing.process_insertToOracle = "TRUE"; util.saveProcess(process); getQueryJob.start(); collectionInsertJob.start(); oracleInsertJob.start(); util.infoNotif("Good Bye Berakhir", "Job akan kembali dihidupkan"); } }, null, true ); } module.exports.stopAllJob = async function stopAllJob() { startMorning.stop(); endMorning.stop(); startNight.stop(); endNight.stop(); getQueryJob.stop(); collectionInsertJob.stop(); checkStartJob.stop(); oracleInsertJob.stop(); return; }; module.exports.checkJobIsRunning = function checkJobIsRunning() { var dataReturn = { getQuery: getQueryJob.running, collectionInsert: collectionInsertJob.running, oracleInsert: oracleInsertJob.running, }; return dataReturn; }; module.exports.checkStart = function checkStart() { checkStartJob.stop(); var self = this; checkStartJob = cron.job("0 */5 * * * *", async function () { log.createLogStart(2, "Check Start"); var process = util.getProcess(); if (process.is_running == "TRUE") { if (!getQueryJob.running) { self.getQuery(); log.createLogStart(2, "Running Get Query"); process.processing.process_getQuery = "TRUE"; } if (!collectionInsertJob.running) { self.insertToCollection(); log.createLogStart(2, "Running Collection Insert"); process.processing.process_insertToCollection = "TRUE"; } if (!oracleInsertJob.running) { self.insertToOracle(); log.createLogStart(2, "Running Insert To Oracle"); process.processing.process_insertToOracle = "TRUE"; } util.saveProcess(process); } }); checkStartJob.start(); return; }; module.exports.startAllServices = async function startAllServices() { var process = util.getProcess(); process.is_running = "TRUE"; process.processing.process_getQuery = "TRUE"; process.processing.process_insertToCollection = "TRUE"; process.processing.process_insertToOracle = "TRUE"; util.saveProcess(process); await this.checkStart(); await this.getQuery(); await this.insertToCollection(); await this.insertToOracle(); return; }; module.exports.getQuery = async function getQuery() { var process = util.getProcess(); process.processing.process_getQuery = "TRUE"; util.saveProcess(process); var sqlCollection = await sqlServer.connectCollection(); var requestLastDateAvailability = sqlCollection.request(); var queryLastDateAvailability = `SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'UPLOAD_DATA_DB_TAB' AND COLUMN_NAME='LAST_DATE' IF @@ROWCOUNT=0 ALTER TABLE dbo.UPLOAD_DATA_DB_TAB ADD LAST_DATE datetime`; var resultLastDateAvailability = await requestLastDateAvailability.query( queryLastDateAvailability ); if (configjs.firstrun == "TRUE") { var date6 = moment() .startOf("day") .add(6, "hours") .format("YYYY-MM-DD HH:mm:ss.SSS"); var reqUpdateLastDate6 = sqlCollection.request(); var queryUpdateLastDate6 = `update dbo.UPLOAD_DATA_DB_TAB SET LAST_DATE = Cast('${date6}' as datetime)`; var resultUpdateLastDate6 = await reqUpdateLastDate6.query( queryUpdateLastDate6 ); configjs = util.getConfig(); configjs.firstrun = "FALSE"; util.saveConfig(configjs); } getQueryJob.stop(); scheduleData(); getQueryJob = cron.job( `15 */${parseInt(configjs.interval.getquery_interval)} * * * *`, async function () { if (util.getProcess().processing.process_getQuery == "TRUE") { process = util.getProcess(); process.processing.process_getQuery = "FALSE"; util.saveProcess(process); try { var oracleSelect = await oracleModel.oracleQueryUploadData(); if (oracleSelect["STATUS"] == 0) { getQueryJob.stop(); } else { var data = oracleSelect["DATA"]; const requestDelOldDetail = sqlCollection.request(); var queryDelOldDetail = `delete from dbo.UPLOAD_DATA_DB_DET_TAB`; var resultDelOldDetail = await requestDelOldDetail.query( queryDelOldDetail ); await sqlCollection; for (var z = 0; z < data.length; z++) { try { const request = sqlCollection.request(); request.input("COMPANY", data[z].COMPANY); request.input("ID", data[z].ID); request.input("ENABLED", data[z].ENABLED); request.input("TEST_MODE", data[z].TEST_MODE); request.input("AUTO_MODE", data[z].AUTO_MODE); var queryInsertUploadData; if (data[z].LAST_DATE != null) { var lastDate = data[z].LAST_DATE; request.input("LAST_DATE", lastDate); queryInsertUploadData = ` UPDATE UPLOAD_DATA_DB_TAB SET COMPANY = @COMPANY, ENABLED = @ENABLED, TEST_MODE = @TEST_MODE, AUTO_MODE = @AUTO_MODE, LAST_DATE = @LAST_DATE WHERE ID = @ID IF @@ROWCOUNT=0 INSERT INTO UPLOAD_DATA_DB_TAB(COMPANY,ID,ENABLED,TEST_MODE,AUTO_MODE,LAST_DATE) values (@COMPANY,@ID,@ENABLED,@TEST_MODE,@AUTO_MODE,@LAST_DATE);`; var resultUpdateLastDate = await oracleModel.oracleUpdateLastDate( data[z].ID ); } else { queryInsertUploadData = ` UPDATE UPLOAD_DATA_DB_TAB SET COMPANY = @COMPANY, ENABLED = @ENABLED, TEST_MODE = @TEST_MODE, AUTO_MODE = @AUTO_MODE WHERE ID = @ID IF @@ROWCOUNT=0 INSERT INTO UPLOAD_DATA_DB_TAB(COMPANY,ID,ENABLED,TEST_MODE,AUTO_MODE) values (@COMPANY,@ID,@ENABLED,@TEST_MODE,@AUTO_MODE);`; } //Insert to Table const result = await request.query(queryInsertUploadData); var oracleSelectDetail = await oracleModel.oracleQueryUploadDataDet( data[z].ID ); if (oracleSelectDetail["STATUS"] == 0) { throwNotif( "Database Oracle Error", oracleSelectDetail["DATA"] ); process = util.getProcess(); process.processing.process_getQuery = "TRUE"; util.saveProcess(process); } else { try { var dataDetail = oracleSelectDetail["DATA"]; for (var i = 0; i < dataDetail.length; i++) { const requestDet = sqlCollection.request(); requestDet.input("COMPANY", dataDetail[i]["COMPANY"]); requestDet.input("ID", dataDetail[i]["ID"]); requestDet.input("NO", sql.Int, dataDetail[i]["NO"]); requestDet.input( "NO_ORDER", sql.Int, dataDetail[i]["NO_ORDER"] ); requestDet.input( "SOURCE_QUERY", dataDetail[i]["SOURCE_QUERY"] ); requestDet.input( "DESC_PACKAGE", dataDetail[i]["DESC_PACKAGE"] ); requestDet.input("ENABLED", dataDetail[i]["ENABLED"]); requestDet.input( "DEST_PACKAGE_TYPE", dataDetail[i]["DEST_PACKAGE_TYPE"] ); var queryInsertUploadDataDetail = ` UPDATE UPLOAD_DATA_DB_DET_TAB SET COMPANY = @COMPANY, NO_ORDER = @NO_ORDER, SOURCE_QUERY = @SOURCE_QUERY ,DESC_PACKAGE = @DESC_PACKAGE,ENABLED = @ENABLED, DEST_PACKAGE_TYPE = @DEST_PACKAGE_TYPE WHERE ID = @ID AND NO = @NO IF @@ROWCOUNT=0 INSERT INTO UPLOAD_DATA_DB_DET_TAB(COMPANY,ID,NO,NO_ORDER,SOURCE_QUERY,DESC_PACKAGE,ENABLED,DEST_PACKAGE_TYPE) values (@COMPANY,@ID,@NO,@NO_ORDER,@SOURCE_QUERY,@DESC_PACKAGE,@ENABLED,@DEST_PACKAGE_TYPE);`; const resultDetail = await requestDet.query( queryInsertUploadDataDetail ); } } catch (e) { process = util.getProcess(); process.processing.process_getQuery = "TRUE"; util.saveProcess(process); getQueryJob.stop(); } } } catch (e) { process = util.getProcess(); process.processing.process_getQuery = "TRUE"; util.saveProcess(process); getQueryJob.stop(); } } process = util.getProcess(); process.processing.process_getQuery = "TRUE"; util.saveProcess(process); var now = moment().format("YYYY-MM-DD HH:mm:ss.SSS"); console.log("1: " + now); } } catch (e) { getQueryJob.stop(); console.log(e.message); } } }, null, true, null, null, true ); getQueryJob.start(); return; }; module.exports.insertToCollection = async function insertToCollection() { var sqlDpack = await sqlServer.connectDPACK(); var sqlCollection = await sqlServer.connectCollection(); var configjs = util.getConfig(); var process = util.getProcess(); process.processing.process_insertToCollection = "TRUE"; util.saveProcess(process); var rowInserted = 0; var errorLog = 0; collectionInsertJob.stop(); collectionInsertJob = cron.job( `45 */${parseInt(configjs.interval.collection_interval)} * * * *`, async function () { try { if (util.getProcess().processing.process_insertToCollection == "TRUE") { process = util.getProcess(); process.processing.process_insertToCollection = "FALSE"; util.saveProcess(process); await sqlDpack; await sqlCollection; var requestSelectParentCollection = sqlCollection.request(); var querySelectParentCollection = `select ID,LAST_DATE from dbo.UPLOAD_DATA_DB_TAB`; var resultSelectParentCollection = await requestSelectParentCollection.query( querySelectParentCollection ); var resultID = resultSelectParentCollection.recordset; for (var z = 0; z < resultID.length; z++) { var requestSelectDetailCollection = sqlCollection.request(); var querySelectDetailCollection = `select source_query from dbo.UPLOAD_DATA_DB_DET_TAB where ID = '${resultID[z].ID}'`; var resultSelectDetailCollection = await requestSelectDetailCollection.query( querySelectDetailCollection ); var resultSourceQuery = resultSelectDetailCollection.recordset; if (process.processing.process_getQuery != "FALSE") { var currentTime = moment().format("YYYY-MM-DD HH:mm:ss.SSS"); var requestUpdateLastDate = sqlCollection.request(); var queryUpdateLastDate = `update dbo.UPLOAD_DATA_DB_TAB set LAST_DATE = Cast('${currentTime}' as datetime) where ID = '${resultID[z].ID}'`; var resultUpdateLastDate = requestUpdateLastDate.query( queryUpdateLastDate ); } for (var k = 0; k < resultSourceQuery.length; k++) { var sourceQuery = await util.regexQuery( resultSourceQuery[k].source_query, resultID[z].LAST_DATE ); try { var requestQuery = sqlDpack.request(); var result = await requestQuery.query(sourceQuery); var arrayColumn = result.recordset.columns; var columnLength = Object.keys(arrayColumn).length; var resultRow = result.recordset; for (var i = 0; i < resultRow.length; i++) { var processingRow = resultRow[i]; var varInsert = ""; var varBind = ""; var string = 1; var int = 1; var date = 1; var count = 0; var requestInsertCollection = sqlCollection.request(); for (key in arrayColumn) { count += 1; var checktype; checktype = await sqlServer.checkDataType( arrayColumn[key].type ); if (count == 1) { requestInsertCollection.input( "collection_name", processingRow[key] ); varInsert += `collection_name,flag_deleted`; varBind += `@collection_name,'FALSE'`; } else { if (checktype == 0) { varInsert += `s${string}`; varBind += `@s${string}`; requestInsertCollection.input( `s${string}`, sql.VarChar, processingRow[key] ); string += 1; } else if (checktype == 1) { varInsert += `n${int}`; varBind += `@n${int}`; requestInsertCollection.input( `n${int}`, sql.Int, processingRow[key] ); int += 1; } else { varInsert += `d${date}`; varBind += `@d${date}`; requestInsertCollection.input( `d${date}`, sql.DateTime, processingRow[key] ); date += 1; } } if (count != columnLength) { varInsert += `,`; varBind += `,`; } } var queryInsertCollection = `insert into TEMP_DATA_TAB(${varInsert}) values(${varBind})`; var resultInsertCollection = await requestInsertCollection.query( queryInsertCollection ); rowInserted += resultInsertCollection.rowsAffected[0]; if (isNaN(resultInsertCollection.rowsAffected[0])) { errorLog = 1; } } } catch (e) { var process = util.getProcess(); process.processing.process_insertToCollection = "TRUE"; util.saveProcess(process); collectionInsertJob.stop(); } } if (errorLog == 1) { var currentTime = moment().format("YYYY-MM-DD HH:mm:ss.SSS"); var requestUpdateLastDate = sqlCollection.request(); var queryUpdateLastDate = `update dbo.UPLOAD_DATA_DB_TAB set LAST_DATE = ${resultID[z].LAST_DATE} where ID = '${resultID[z].ID}'`; var resultUpdateLastDate = requestUpdateLastDate.query( queryUpdateLastDate ); var process = util.getProcess(); process.processing.process_insertToCollection = "TRUE"; util.saveProcess(process); errorLog = 0; } } var now = moment().format("YYYY-MM-DD HH:mm:ss.SSS"); var process = util.getProcess(); process.processing.process_insertToCollection = "TRUE"; util.saveProcess(process); console.log("2 : " + now); console.log("ROW INSERTED : " + rowInserted); rowInserted = 0; } } catch (e) { log.createLog(0, e.message); var process = util.getProcess(); process.processing.process_insertToCollection = "TRUE"; util.saveProcess(process); } } ); collectionInsertJob.start(); return; }; module.exports.insertToOracle = async function insertToOracle() { var sqlCollection = await sqlServer.connectCollection(); var configjs = util.getConfig(); var process = util.getProcess(); process.processing.process_insertToOracle = "TRUE"; util.saveProcess(process); oracleInsertJob.stop(); oracleInsertJob = cron.job( `30 */${parseInt(configjs.interval.oracle_interval)} * * * *`, async function () { if (util.getProcess().processing.process_insertToOracle == "TRUE") { var process = util.getProcess(); process.processing.process_insertToOracle = "FALSE"; util.saveProcess(process); await sqlCollection; try { var requestSelectTempCollection = sqlCollection.request(); var querySelectTempCollection = `SELECT TOP 100000 COLLECTION_NAME, S1, S2, S4, S3, S5, S6, S7, S8, S9, S10, S11, S12, S13, S14, S15, S19, S18, S17, S16, S20, S21, S22, S23, S24, S25, S26, S27, S28, S29, S30, S31, S32, S33, S34, S35, S36, S37, S38, S39, S40, S41, S42, S43, S44, S45, S46, S47, S48, S50, S49, N1, N2, N3, N4, N5, N6, N7, N8, N9, N10, N11, N12, N13, N14, N15, N16, N17, N18, N19, N20, N21, N22, N23, N24, N25, N26, N27, N28, N29, N30, N31, N32, N33, N34, N35, N36, N37, N38, N39, N40, N41, N42, N43, N44, N45, N46, N47, N48, N49, N50, D1, D2, D3, D4, D5, D6, D7, D8, D9, D10, D11, D12, D13, D14, D15, D16, D17, D18, D19, D20, D21, D22, D23, D24, D25, D26, D27, D28, D29, D30,SEQ_ID FROM dbo.TEMP_DATA_TAB WHERE FLAG_DELETED = 'FALSE'`; var resultSelectTempCollection = await requestSelectTempCollection.query( querySelectTempCollection ); var resultRow = resultSelectTempCollection.recordset; if (resultSelectTempCollection.recordset.length != 0) { var data = await oracleModel.oracleInsertCollection( resultSelectTempCollection.recordset ); } process = util.getProcess(); process.processing.process_insertToOracle = "TRUE"; util.saveProcess(process); var now = moment().format("YYYY-MM-DD HH:mm:ss.SSS"); } catch (e) { console.log(e.message); process = util.getProcess(); process.processing.process_insertToOracle = "TRUE"; util.saveProcess(process); oracleInsertJob.stop(); } } } ); oracleInsertJob.start(); return; //} };