const sqlite3 = require("sqlite3").verbose(); var sqliteFunc = require("../util/db_sqlite.js"); var oracleModel = require("./oracleModel.js"); const oracledb = require("oracledb"); const path = require("path"); const fs = require("fs"); async function insertRefTable(db, dataUnitCabang) { try { var runQuery = "insert into refTable(mesin,tipe,rangka,warna,kode,tahun,state) VALUES "; for (var i = 0; i < dataUnitCabang.length; i++) { if (i == dataUnitCabang.length - 1) { runQuery = runQuery.concat(`('${dataUnitCabang[i]["MESIN"]}','${dataUnitCabang[i]["TIPE"]}','${dataUnitCabang[i]["RANGKA"]}','${dataUnitCabang[i]["WARNA"]}', '${dataUnitCabang[i]["KODE"]}','${dataUnitCabang[i]["TAHUN"]}','${dataUnitCabang[i]["STATE"]}')`); } else { runQuery = runQuery.concat(`('${dataUnitCabang[i]["MESIN"]}','${dataUnitCabang[i]["TIPE"]}','${dataUnitCabang[i]["RANGKA"]}','${dataUnitCabang[i]["WARNA"]}', '${dataUnitCabang[i]["KODE"]}','${dataUnitCabang[i]["TAHUN"]}','${dataUnitCabang[i]["STATE"]}'), `); } } var insertTable = await sqliteFunc.runQuery(db, runQuery); if (insertTable["STATUS"] == 0) throw insertTable["DATA"]; } catch (e) { throw e; } } async function insertJenisFoto(db, jenisFoto) { try { var valBlobTable = ""; for (var i = 0; i < jenisFoto.length; i++) { if (i == jenisFoto.length - 1) { valBlobTable = valBlobTable.concat( `('${jenisFoto[i]["NO_URUT"]}','${jenisFoto[i]["JENIS"]}')` ); } else { valBlobTable = valBlobTable.concat( `('${jenisFoto[i]["NO_URUT"]}','${jenisFoto[i]["JENIS"]}'),` ); } } var insertJenisBlobQuery = ` Insert Into jenisBlobTable Values ${valBlobTable} `; var insertBlobQuery = await sqliteFunc.runQuery( db, insertJenisBlobQuery ); if (insertBlobQuery["STATUS"] == 0) throw insertBlobQuery["DATA"]; } catch (e) { throw e; } } async function insertUnitDetPic(db, dataUnitPic) { try { var valDetPic = ""; for (var i = 0; i < dataUnitPic.length; i++) { if (i == dataUnitPic.length - 1) { valDetPic = valDetPic.concat(`('${dataUnitPic[i]["MESIN"]}','${dataUnitPic[i]["NO_URUT"]}', null,'${dataUnitPic[i]["JENIS"]}',null,null)`); } else { valDetPic = valDetPic.concat(`('${dataUnitPic[i]["MESIN"]}','${dataUnitPic[i]["NO_URUT"]}', null,'${dataUnitPic[i]["JENIS"]}',null,null),`); } } var insertJenisBlobQuery = ` Insert Into blobTable(MESIN,NO_URUT,BLOB_FILE,JENIS,LATITUDE,LONGITUDE) Values ${valDetPic}; `; var insertBlobQuery = await sqliteFunc.runQuery( db, insertJenisBlobQuery ); if (insertBlobQuery["STATUS"] == 0) throw insertBlobQuery["DATA"]; } catch (e) { throw e; } } async function getValueTableByName(db, name) { var query = ` select VALUE from valueTable where name = '${name}' LIMIT 1 `; var selectInsertTable = await sqliteFunc.selectQuery(db, query); if (selectInsertTable["STATUS"] == 0) throw Error(selectInsertTable["DATA"]); var data = selectInsertTable["DATA"]; var value = data[0]["VALUE"]; return value; } async function getInsertedData(db) { try { var query = ` select MESIN, TIMESTAMP from refTable where flag_insert = 'TRUE' `; var selectTimestampInsert = await sqliteFunc.selectQuery(db, query); if (selectTimestampInsert["STATUS"] == 0) throw selectTimestampInsert["DATA"]; return selectTimestampInsert["DATA"]; } catch (e) { throw e; } } async function getInsertedPic(db) { try { var query = ` select BLOB_FILE, jenis, latitude, LONGITUDE, MESIN, NO_URUT from blobTable where blob_file IS NOT NULL `; var selectBlobTable = await sqliteFunc.selectQuery(db, query); if (selectBlobTable["STATUS"] == 0) throw selectBlobTable["DATA"]; return selectBlobTable["DATA"]; } catch (e) { throw e; } } async function unpackAndInsert(dbPath = null, company, cabangId) { let db; try { //var dbPath = path.join(__dirname , `../public/sqlite/upload/uploadDB.db`); if (!dbPath || !fs.existsSync(dbPath)) throw "Database Not Exist. Kirim Ulang Data"; db = new sqlite3.Database( dbPath, sqlite3.OPEN_READWRITE | sqlite3.OPEN_CREATE ); var stockTakingUnitId = await getValueTableByName( db, "STOCK_TAKING_UNIT_ID" ); var insertedData = await getInsertedData(db); var insertedPic = await getInsertedPic(db); var stockTakingData = { company: company, cabangId: cabangId, stockTakingUnitId: stockTakingUnitId, }; var result = await oracleModel.insertStockUnitData( stockTakingData, insertedData, insertedPic ); if (db.open) { return new Promise(function (resolve, reject) { db.close(function (data) { fs.unlinkSync(dbPath); resolve({ STATUS: 1, DATA: result }); }); }); } else { fs.unlinkSync(dbPath); return { STATUS: 1, DATA: result }; } } catch (e) { console.log(e); if (db && db.open) { return new Promise(function (resolve, reject) { db.close(function (data) { resolve({ STATUS: 0, DATA: e.message || e }); }); }); // db.close(function(data){ // return {"STATUS" : 0 ,"DATA" : e}; // }) } else { return { STATUS: 0, DATA: e }; } } } // var dbPath = path.join(__dirname , `../public/sqlite/testaplod3.db`); // unpackAndInsert(dbPath,'TBS','02'); async function CreateDataCollection(company = "", cabangId = "") { var dbPath; let db; try { var checkStockTaking = await oracleModel.getActiveStockTakingByCabang( company, cabangId ); var oracleData; if (checkStockTaking == undefined) { oracleData = await oracleModel.prepareStockCollection( company, cabangId ); } else { let state = checkStockTaking["STATE"]; if (state == "Submitted") { throw "Gagal dalam mengambil data, mohon menunggu review data yang disubmit sebelumnya."; } oracleData = await oracleModel.getActiveStockCollection( company, cabangId, checkStockTaking["STOCK_TAKING_UNIT_ID"] ); } var stockTakingUnitId = oracleData["stockTakingUnitId"]; var dataUnitCabang = oracleData["dataUnitCabang"]; var dataUnitPic = oracleData["dataUnitPic"]; var jenisFoto = oracleData["jenisFoto"]; var dirPath = path.join( __dirname, `../public/sqlite/db/${company}/${cabangId}` ); var resultDirPath = fs.mkdirSync(dirPath, { recursive: true }); var d = new Date(); var n = d.getTime(); var dbName = `${n}.db`; dbPath = path.join(dirPath, dbName); db = new sqlite3.Database( dbPath, sqlite3.OPEN_READWRITE | sqlite3.OPEN_CREATE ); // Create Table Reference var refTableQuery = `CREATE TABLE refTable( ID INTEGER PRIMARY KEY AUTOINCREMENT, MESIN TEXT, TIPE TEXT, RANGKA TEXT, WARNA TEXT, KODE TEXT, TAHUN TEXT, STATE TEXT, TIMESTAMP TEXT DEFAULT NULL, FLAG_INSERT TEXT DEFAULT 'FALSE' )`; var createRefTable = await sqliteFunc.runQuery(db, refTableQuery); if (createRefTable["STATUS"] == 0) throw createRefTable; // var insertTableQuery = `CREATE TABLE insertTable( // ID INTEGER PRIMARY KEY AUTOINCREMENT, // MESIN TEXT, // TIMESTAMP TEXT // )`; // var createInsertTable = await sqliteFunc.runQuery(db,insertTableQuery); // if(createInsertTable["STATUS"] == 0) throw createInsertTable; var insertTableBlob = `CREATE TABLE blobTable( BLOB_ID INTEGER PRIMARY KEY AUTOINCREMENT, MESIN TEXT, NO_URUT TEXT, BLOB_FILE BLOB, JENIS TEXT, LATITUDE TEXT, LONGITUDE TEXT )`; var createBlobTable = await sqliteFunc.runQuery(db, insertTableBlob); if (createBlobTable["STATUS"] == 0) throw createInsertTable; var valueTableQuery = ` CREATE TABLE valueTable( NAME TEXT, VALUE TEXT ) `; var createValueTable = await sqliteFunc.runQuery(db, valueTableQuery); if (createValueTable["STATUS"] == 0) throw createValueTable; var queryValueTableInsert = `insert into valueTable(name,value) VALUES ('STOCK_TAKING_UNIT_ID',${stockTakingUnitId})`; var insertValueTableInsert = await sqliteFunc.runQuery( db, queryValueTableInsert ); if (insertValueTableInsert["STATUS"] == 0) throw insertValueTableInsert; var jenisBlobQuery = ` CREATE TABLE jenisBlobTable( NO_URUT TEXT, VALUE TEXT ) `; var createJenisBlobTable = await sqliteFunc.runQuery( db, jenisBlobQuery ); if (createJenisBlobTable["STATUS"] == 0) throw createJenisBlobTable; //----------- JENIS FOTO---------------------------------------------- await insertJenisFoto(db, jenisFoto); if (dataUnitCabang.length > 0) { //----------- REF TABLE---------------------------------------------- await insertRefTable(db, dataUnitCabang); //----------- UNIT DET PIC---------------------------------------------- await insertUnitDetPic(db, dataUnitPic); } if (db.open) { return new Promise(function (resolve, reject) { db.close(function (data) { resolve({ STATUS: 1, DATA: dbPath }); }); }); // db.close(function(data){ // return {"STATUS" : 1, "DATA" : dbPath}; // }) } else { return { STATUS: 1, DATA: dbPath }; } } catch (e) { if (db) { if (db.open) { return new Promise(function (resolve, reject) { db.close(function (data) { fs.unlinkSync(dbPath); resolve({ STATUS: 0, DATA: e }); }); }); // db.close(function(data){ // fs.unlinkSync(dbPath); // return {"STATUS" : 0 , "DATA": e}; // }); } } else { if (dbPath) { fs.unlinkSync(dbPath); } console.log(e); return { STATUS: 0, DATA: e }; } } } //CreateDataCollection("TBS",'02'); module.exports = { CreateDataCollection: CreateDataCollection, unpackAndInsert: unpackAndInsert, };