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 company, cabang_id, mesin, kode, rangka, tipe, warna, tahun, state FROM ${owner}.unit_baru WHERE company = :COMPANY AND cabang_id = :CABANG_ID AND state IN ('Ready','OnChannel') `; 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 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 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 ) `; 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){ 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"] } 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 }