var oracleFunc = require("../util/db_oracle.js"); const oracledb = require("oracledb"); const fs = require("fs"); var moment = require("moment"); var owner = "TBS"; async function getDataCabangByUser(company, user) { let conn; try { conn = await oracleFunc.getConnection(); var query = ` SELECT NAMA_CABANG AS DISPLAY_VALUE, CABANG_ID AS RETURN_VALUE FROM ${owner}.CABANG WHERE COMPANY = :COMPANY AND ${owner}.User_Per_Cabang_API.Is_User_Available(company, cabang_id, :USERNAME) = 1 ORDER BY NAMA_CABANG `; var params = { COMPANY: company, USERNAME: user }; console.log(params); var result = await oracleFunc.getQueryData(conn, query, params); await oracleFunc.doRelease(conn); return { STATUS: 1, DATA: result }; } catch (e) { await oracleFunc.doRelease(conn); return { STATUS: 0, DATA: e }; } } async function getDataUser(user = "", pass = "") { let conn; try { conn = await oracleFunc.getConnection(); var checkView2 = ` select ${owner}.UTILS_API.Is_View_Available('STOCK_TAKING_UNIT_MOB_APP', :USERNAME) LOGIN_STATUS from dual `; var paramView = { USERNAME: user }; var resultView = await oracleFunc.getQueryData( conn, checkView2, paramView ); if (resultView[0]["LOGIN_STATUS"] == "FALSE") throw "Username or password incorrect !"; var checkQuery = ` select ${owner}.Mobile_APP_Utils_API.Sales_Mobile_Auth(:USERNAME, :PASSWORD) data from dual `; var params = { USERNAME: user, PASSWORD: pass }; var result = await oracleFunc.getQueryData(conn, checkQuery, params); var dataUser = JSON.parse(result[0]["DATA"]); if (dataUser["status"] == "ERR") throw dataUser["info"]; await oracleFunc.doRelease(conn); return { STATUS: 1, DATA: { COMPANY: dataUser["company"], USER: dataUser["login_db_user"], }, }; } catch (e) { await oracleFunc.doRelease(conn); return { STATUS: 0, DATA: e }; } } async function getDataCabang(company = "%", cabangId = "%") { var query = `select company, cabang_id, nama_cabang, latitude, longitude from ${owner}.cabang where company like :COMPANY and cabang_id like :CABANG_ID`; var params = { COMPANY: company, CABANG_ID: cabangId }; var result = await oracleFunc.getData(query, params); return result; } async function getStateStockTaking(company, stockTakingId) { let conn; try { conn = await oracleFunc.getConnection(); var query = ` select ${owner}.Stock_Taking_Unit_API.Get_Status_Stock_Taking( company_ => :COMPANY, stock_taking_unit_id_ => :STOCK_TAKING_UNIT_ID) state from dual `; var params = { COMPANY: company, STOCK_TAKING_UNIT_ID: stockTakingId }; var result = await oracleFunc.getQueryData(conn, query, params); await oracleFunc.doRelease(conn); return { STATUS: 1, DATA: result[0] }; } catch (e) { await oracleFunc.doRelease(conn); return { STATUS: 0, DATA: e }; } } async function getActiveStockTakingByCabang(company, cabangId) { let conn; try { conn = await oracleFunc.getConnection(); var query = ` SELECT * FROM ( SELECT stock_taking_unit_id, state from ${owner}.stock_taking_unit where company = :COMPANY and cabang_id = :CABANG_ID and state IN ('Open','Submitted') order by tgl_start desc ) WHERE rownum = 1 `; var paramsQuery = { COMPANY: company, CABANG_ID: cabangId }; var result = await oracleFunc.getQueryData(conn, query, paramsQuery); var a = result[0]; await oracleFunc.doRelease(conn); return a; } catch (e) { await oracleFunc.doRelease(conn); throw e; } } async function getDataUnit(conn, company, cabangId) { var query = `SELECT u.company, u.cabang_id, u.mesin, u.kode, u.rangka, u.tipe, u.warna, u.tahun, u.state, c.channel_name channel FROM ${owner}.unit_baru u left join ${owner}.CHANNEL c on u.channel_id = c.channel_id WHERE u.company = :COMPANY AND u.cabang_id = :CABANG_ID AND u.state IN ('OnTheWay','Ready','OnChannel','InRepair') ORDER BY u.tipe `; var params = { COMPANY: company, CABANG_ID: cabangId }; var result = await oracleFunc.getQueryData(conn, query, params); return result; } async function submitStockTaking(company, stockTakingId) { let conn; try { conn = await oracleFunc.getConnection(); var query = ` BEGIN ${owner}.STOCK_TAKING_UNIT_API.Call_Submit( company_ => :COMPANY, stock_taking_unit_id_ => :STOCK_TAKING_UNIT_ID); END; `; var params = { COMPANY: company, STOCK_TAKING_UNIT_ID: stockTakingId }; console.log(params); await oracleFunc.runQueryData(conn, query, params); await oracleFunc.doCommit(conn); await oracleFunc.doRelease(conn); return { STATUS: 1, DATA: "Stock Taking Submit Completed " }; } catch (e) { await oracleFunc.doRelease(conn); return { STATUS: 0, DATA: e }; } } async function prepareStockCollection(company = "", cabangId = "") { let conn; try { conn = await oracleFunc.getConnection(); var queryStockUnit = ` BEGIN ${owner}.Stock_Taking_Unit_API.Create_Update_Record( company_ => :COMPANY, stock_taking_unit_id_ => :STOCK_TAKING_UNIT_ID, tgl_stock_taking_ => TO_DATE(:TGL_STOCK_TAKING,'DD-MM-YYYY'), tgl_start_ => TO_DATE(:TGL_START,'DD-MM-YYYY HH24:MI:SS'), tgl_selesai_ => TO_DATE(:TGL_SELESAI,'DD-MM-YYYY HH24:MI:SS'), cabang_id_ => :CABANG_ID); END;`; var paramStockUnit = { COMPANY: company, STOCK_TAKING_UNIT_ID: { dir: oracledb.BIND_OUT }, TGL_STOCK_TAKING: moment().format("DD-MM-YYYY"), TGL_START: moment().format("DD-MM-YYYY HH:mm:ss"), TGL_SELESAI: null, CABANG_ID: cabangId, }; var resultStockUnit = await oracleFunc.runQueryData( conn, queryStockUnit, paramStockUnit ); var stockTakingUnitId = resultStockUnit["outBinds"]["STOCK_TAKING_UNIT_ID"]; var jenisFoto = [ { NO_URUT: 1, JENIS: "NOMOR RANGKA" }, { NO_URUT: 2, JENIS: "TAMPAK SAMPING" }, ]; var paramsUnitDet = []; var paramsUnitDetPic = []; var dataUnitCabang = await getDataUnit(conn, company, cabangId); for (var i = 0; i < dataUnitCabang.length; i++) { var temp = { COMPANY: company, STOCK_TAKING_ID: stockTakingUnitId, MESIN: dataUnitCabang[i]["MESIN"], FLAG_REJECT: "FALSE", KETERANGAN: null, }; paramsUnitDet.push(temp); for (var j = 0; j < jenisFoto.length; j++) { var tempPic = { COMPANY: company, STOCK_TAKING_ID: stockTakingUnitId, MESIN: dataUnitCabang[i]["MESIN"], NO_URUT: jenisFoto[j]["NO_URUT"], JENIS: jenisFoto[j]["JENIS"], LATITUDE: null, LONGITUDE: null, LOB_ID: null, }; paramsUnitDetPic.push(tempPic); } } var queryStockUnitDet = ` BEGIN ${owner}.STOCK_TAKING_UNIT_DET_API.Create_Update_Record( company_ => :COMPANY, stock_taking_unit_id_ => :STOCK_TAKING_ID, mesin_ => :MESIN, flag_reject_ => :FLAG_REJECT, keterangan_ => :KETERANGAN); END; `; await oracleFunc.runQueryMany(conn, queryStockUnitDet, paramsUnitDet); var queryStockUnitPic = ` BEGIN ${owner}.STOCK_TAKING_UNIT_DET_PIC_API.Create_Update_Record( company_ => :COMPANY, stock_taking_unit_id_ => :STOCK_TAKING_ID, mesin_ => :MESIN, no_urut_ => :NO_URUT, jenis_ => :JENIS, latitude_ => :LATITUDE, longitude_ => :LONGITUDE, lob_id_ => :LOB_ID ); END; `; await oracleFunc.runQueryMany( conn, queryStockUnitPic, paramsUnitDetPic ); await oracleFunc.doCommit(conn); await oracleFunc.doRelease(conn); return { stockTakingUnitId: stockTakingUnitId, dataUnitCabang: dataUnitCabang, dataUnitPic: paramsUnitDetPic, jenisFoto: jenisFoto, }; } catch (e) { oracleFunc.doRollBack(conn); throw e; } } async function getActiveStockCollection( company = "", cabangId = "", stockTakingUnitId = "" ) { let conn; try { conn = await oracleFunc.getConnection(); var queryDataUnit = ` select a.company, a.stock_taking_unit_id, a.mesin, b.kode, b.rangka, b.tipe, b.warna, b.tahun, b.state, c.channel_name channel from ${owner}.stock_taking_unit_det a LEFT JOIN ${owner}.unit_baru b ON a.company = b.company and a.mesin = b.mesin and b.cabang_id = :CABANG_ID left join ${owner}.CHANNEL c on b.channel_id = c.channel_id where a.company = :COMPANY and a.stock_taking_unit_id = :STOCK_TAKING_UNIT_ID and a.mesin NOT IN (select mesin from ${owner}.stock_taking_unit_det_pic c where c.COMPANY = :COMPANY AND c.stock_taking_unit_id = :STOCK_TAKING_UNIT_ID AND lob_id IS NOT NULL ) ORDER by tipe `; var paramsDataUnit = { COMPANY: company, CABANG_ID: cabangId, STOCK_TAKING_UNIT_ID: stockTakingUnitId, }; var dataUnit = await oracleFunc.getQueryData( conn, queryDataUnit, paramsDataUnit ); var queryDataUnitPic = ` SELECT Company, stock_taking_unit_id, mesin, no_urut, jenis, latitude, longitude, lob_id from ${owner}.stock_taking_unit_det_pic where company = :COMPANY and stock_taking_unit_id = :STOCK_TAKING_UNIT_ID and lob_id IS NULL `; var paramsDataUnitPic = { COMPANY: company, STOCK_TAKING_UNIT_ID: stockTakingUnitId, }; var dataUnitPic = await oracleFunc.getQueryData( conn, queryDataUnitPic, paramsDataUnitPic ); var jenisFoto = [ { NO_URUT: 1, JENIS: "NOMOR RANGKA" }, { NO_URUT: 2, JENIS: "TAMPAK SAMPING" }, ]; await oracleFunc.doRelease(conn); return { stockTakingUnitId: stockTakingUnitId, dataUnitCabang: dataUnit, dataUnitPic: dataUnitPic, jenisFoto: jenisFoto, }; } catch (e) { await oracleFunc.doRelease(conn); throw e; } } async function insertStockUnitData(stockTakingData, dataUnit, dataFoto,userId) { let conn; try { conn = await oracleFunc.getConnection(); var queryUpdateTglSelesai = ` BEGIN ${owner}.STOCK_TAKING_UNIT_API.Update_Tgl_Selesai( company_ => :COMPANY, stock_taking_unit_id_ => :STOCK_TAKING_UNIT_ID, tgl_selesai_ => TO_DATE(:TGL_SELESAI,'DD-MM-YYYY HH24:MI:SS')); END; `; var paramsUpdateTglSelesai = { COMPANY: stockTakingData["company"], STOCK_TAKING_UNIT_ID: stockTakingData["stockTakingUnitId"], TGL_SELESAI: moment().format("DD-MM-YYYY HH:mm:ss"), }; await oracleFunc.runQueryData( conn, queryUpdateTglSelesai, paramsUpdateTglSelesai ); if (dataUnit.length > 0) { var queryUpdateKeteranganDet = ` BEGIN ${owner}.STOCK_TAKING_UNIT_DET_API.Update_Keterangan( company_ => :COMPANY, stock_taking_unit_id_ => :STOCK_TAKING_UNIT_ID, mesin_ => :MESIN, keterangan_ => :KETERANGAN); END; `; var paramsUpdateKeteranganDet = []; for (var i = 0; i < dataUnit.length; i++) { var temp = { COMPANY: stockTakingData["company"], STOCK_TAKING_UNIT_ID: stockTakingData["stockTakingUnitId"], MESIN: dataUnit[i]["MESIN"], KETERANGAN: `${dataUnit[i]["TIMESTAMP"]}${(userId!= null || userId=='')?' by '+ userId:''}`, }; paramsUpdateKeteranganDet.push(temp); } await oracleFunc.runQueryMany( conn, queryUpdateKeteranganDet, paramsUpdateKeteranganDet ); } if (dataFoto.length > 0) { var queryStockUnitPic = ` BEGIN ${owner}.STOCK_TAKING_UNIT_UTILS_API.Create_Stock_Taking_Blob( company_ => :COMPANY, stock_taking_unit_id_ => :STOCK_TAKING_ID, mesin_ => :MESIN, no_urut_ => :NO_URUT, jenis_ => :JENIS, latitude_ => :LATITUDE, longitude_ => :LONGITUDE, blob_file_ => :BLOB_FILE ); END; `; var paramsUnitDetPic = []; for (var j = 0; j < dataFoto.length; j++) { var temp = { COMPANY: stockTakingData["company"], STOCK_TAKING_ID: stockTakingData["stockTakingUnitId"], MESIN: dataFoto[j]["MESIN"], NO_URUT: dataFoto[j]["NO_URUT"], JENIS: dataFoto[j]["JENIS"], LATITUDE: dataFoto[j]["LATITUDE"], LONGITUDE: dataFoto[j]["LONGITUDE"], BLOB_FILE: dataFoto[j]["BLOB_FILE"], }; paramsUnitDetPic.push(temp); } await oracleFunc.runQueryMany( conn, queryStockUnitPic, paramsUnitDetPic ); } await oracleFunc.doCommit(conn); await oracleFunc.doRelease(conn); return "Data has been processed"; } catch (e) { oracleFunc.doRollBack(conn); throw e; } } module.exports = { getDataCabang: getDataCabang, getDataUnit: getDataUnit, getDataUser: getDataUser, prepareStockCollection: prepareStockCollection, insertStockUnitData: insertStockUnitData, getActiveStockTakingByCabang: getActiveStockTakingByCabang, getActiveStockCollection: getActiveStockCollection, getDataCabangByUser: getDataCabangByUser, submitStockTaking: submitStockTaking, getStateStockTaking: getStateStockTaking, };