From 9621740d255829ad0cdaf16480490affe7077ffd Mon Sep 17 00:00:00 2001 From: Riky Perdana Date: Tue, 28 Jul 2020 11:03:01 +0700 Subject: [PATCH] first commit --- .gitignore | 2 + README.md | 0 fkrtl.js | 175 ++++++++ index.js | 16 + kamar.js | 146 +++++++ kodepoli.js | 161 ++++++++ package-lock.json | 990 +++++++++++++++++++++++++++++++++++++++++++++ package.json | 28 ++ public/app.js | 186 +++++++++ public/autoForm.js | 208 ++++++++++ public/index.html | 18 + tindakan.js | 2 + 12 files changed, 1932 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 fkrtl.js create mode 100644 index.js create mode 100644 kamar.js create mode 100644 kodepoli.js create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 public/app.js create mode 100644 public/autoForm.js create mode 100644 public/index.html create mode 100644 tindakan.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..552f221 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +node_modules/ +*.log diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 diff --git a/fkrtl.js b/fkrtl.js new file mode 100644 index 0000000..8c0a52e --- /dev/null +++ b/fkrtl.js @@ -0,0 +1,175 @@ + +var +mongoDB = require("mongodb"), +_ = require('lodash'), +moment = require('moment'), +lastToken = '', +cekToken = token => token === lastToken, +kodepoli = require('./kodepoli')['kodepoli'], +tindakan = require('./tindakan')['tindakan'], +refpoli = ['INT', 'ANA', 'OBG', 'BED', 'GIG'], +withThis = (obj, cb) => cb(obj), + +startOfTheDay = timestamp => +moment( + moment(timestamp).format('YYYY-MM-DD') +), + +randomId = () => + [1, 1].map(() => + Math.random().toString(36).slice(2) + ).join(''), + +dbCall = action => mongoDB.MongoClient.connect( + process.env.atlas, + {useNewUrlParser: true, useUnifiedTopology: true}, + (err, client) => [action(client.db(process.env.dbname))] +), + +response = obj => ({ + response: obj, metadata: {message: 'Ok', code: 200} +}), + +errorResponder = (cb, text) => cb.send(response({ + error: text || 'data atau token tidak valid, perbaiki' +})), + +validityCheck = array => array.filter(i => !i[0]).map(i => i[1]), + +jadwalOperasi = (pasien, rawat, item) => +({ + kodebooking: item.idtindakan.substring(0, 8), + tanggaloperasi: moment(item.jadwal).format('YYYY-MM-DD'), + jenistindakan: tindakan.find( + v => v._id === item.idtindakan + ).nama, + kodepoli: refpoli[rawat.klinik-1], + namapoli: kodepoli[refpoli[rawat.klinik-1]], + terlaksana: 0, + nopeserta: pasien.identitas.bpjs, + lastupdate: +moment() +}), + +fkrtl = (req, res) => ({ + getToken: () => withThis(validityCheck([ + [req.body.username === process.env.username, 'username salah'], + [req.body.password === process.env.password, 'password salah'] + ]), errors => !errors.length ? withThis( + randomId(), token => [ + lastToken = token, + res.send(response({token: token})) + ] + ) : errorResponder(res, errors.join())), + + getNoAntrean: () => withThis(validityCheck([ + [cekToken(req.headers['x-token']), 'token salah'], + [req.body.nomorkartu, 'nomor kartu salah'], + [+moment(req.body.tanggalperiksa) > startOfTheDay(+moment()), 'tanggal periksa harus pada hari lain'], + [+moment(req.body.tanggalperiksa).day(), 'hanya hari kerja saja'], + [kodepoli[req.body.kodepoli], 'kode poli salah'], + [[1, 2].includes(req.body.jenisreferensi), 'jenis referensi salah'], + [[1, 2].includes(req.body.jenisrequest), 'jenis request salah'] + ]), errors => !errors.length ? withThis( + randomId(), kodebooking => + dbCall(db => + db.collection('queue').find({ + nomorkartu: req.body.nomorkartu, + tanggalperiksa: req.body.tanggalperiksa + }).toArray((err, arr) => arr.length === 0 ? dbCall( + db => db.collection('queue').countDocuments({ + tanggalperiksa: req.body.tanggalperiksa + }) + .then(number => db.collection('queue').insertOne({ + _id: kodebooking, + no_antrian: 'R'+(number+1), + nomorkartu: req.body.nomorkartu,// 0000000000000123 + nik: req.body.nik, // 1471071611890001 + notelp: req.body.notelp, // 08117696000 + tanggalperiksa: req.body.tanggalperiksa, // "2019-12-11" + kodepoli: req.body.kodepoli, // "001", panduan ada di gSheets + nomorreferensi: req.body.nomorreferensi, // "0001R0040116A000001" + jenisreferensi: req.body.jenisreferensi, // 1, {1: rujukan, 2: kontrol} + jenisrequest: req.body.jenisrequest, // 2, {1: pendaftaran, 2: poli} + polieksekutif: req.body.polieksekutif, // 2, {1: eksekutif, 2: reguler} + timestamp: Date.now() + }, (fail, ok) => res.send(response({ + nomorantrean: 'R'+(number+1), kodebooking, + jenisantrean: +req.body.jenisrequest, + estimasidilayani: +moment(req.body.tanggalperiksa), + namapoli: kodepoli[req.body.kodepoli], + namadokter: '' + })))) + ) : errorResponder(res, 'sudah booking pada hari tersebut') + ) + ) + ) : errorResponder(res, errors.join())), + + getRekapAntrean: () => + withThis(validityCheck([ + [cekToken(req.headers['x-token']), 'token salah'], + [kodepoli[req.body.kodepoli], 'kode poli salah'], + [+moment(req.body.tanggalperiksa), 'tanggal periksa salah'] + ]), errors => !errors.length ? withThis([ + {timestamp: {$gt: startOfTheDay( + +moment(req.body.tanggalperiksa) + )}}, + {kodepoli: req.body.kodepoli} + ], conds => dbCall( + db => db.collection('queue').countDocuments({$and: conds}) + .then(totalantrean => db.collection('queue').countDocuments( + {$and: conds.concat([{done: true}])} + ).then(jumlahterlayani => res.send(response({ + namapoli: kodepoli[req.body.kodepoli], + totalantrean, jumlahterlayani, + lastupdate: !moment() + })))) + )) : errorResponder(res, errors.join())), + + getKodeBookingOperasi: () => + withThis(validityCheck([ + [cekToken(req.headers['x-token']), 'token salah'], + [req.body.nopeserta, 'nomor peserta kosong'] + ]), errors => !errors.length ? dbCall( + db => db.collection('patients') + .findOne({'identitas.bpjs': req.body.nopeserta}) + .then(i => res.send(response({list: + _.flattenDeep(([]).concat( + i.rawatJalan || [], + i.emergency || [] + ).map( + j => j.soapDokter && j.soapDokter.tindakan && + j.soapDokter.tindakan.map( + k => k.jadwal && jadwalOperasi(i, j, k) + ) + )).filter(l => l) + }))) + ) : errorResponder(res, errors.join())), + + getJadwalOperasi: () => + withThis(validityCheck([ + [cekToken(req.headers['x-token']), 'token salah'], + [ + +moment(req.body.tanggalawal) < +moment(req.body.tanggalakhir), + 'tanggal awal harus lebih kecil dari tanggal akhir' + ] + ]), errors => !errors.length ? dbCall( + db => db.collection('patients').find({}).toArray() + .then(array => res.send(response({list: + _.flattenDeep(array.map(i => ([]).concat( + i.rawatJalan || [], + i.emergency || [], + ).map( + j => j.soapDokter && j.soapDokter.tindakan && + j.soapDokter.tindakan.map(k => + k.jadwal && [ + k.jadwal > +moment(req.body.tanggalawal), + k.jadwal < +moment(req.body.tanggalakhir) + ].every(Boolean) && + jadwalOperasi(i, j, k) + ).filter(l => l) + ).filter(l => l))) + }))) + ) : errorResponder(res, errors.join())) + +}[req.params.api]()) + +exports.fkrtl = fkrtl \ No newline at end of file diff --git a/index.js b/index.js new file mode 100644 index 0000000..20583f1 --- /dev/null +++ b/index.js @@ -0,0 +1,16 @@ +var express = require('express'), +bodyParser = require('body-parser'), +fkrtl = require('./fkrtl')['fkrtl'], +kamar = require('./kamar')['kamar'], + +app = express() +.use((req, res, next) => [ + req.headers['content-type'] = 'application/json', + next() +]) +.use(bodyParser.json()) +.post('/fkrtl/:api', fkrtl) +.post('/kamar/:api', kamar) +.use(express.static('public')) + +var server = require('http').Server(app).listen(3000) \ No newline at end of file diff --git a/kamar.js b/kamar.js new file mode 100644 index 0000000..46194de --- /dev/null +++ b/kamar.js @@ -0,0 +1,146 @@ +var mongoDB = require("mongodb"), +_ = require('lodash'), +CronJob = require('cron').CronJob, +CryptoJS = require('crypto-js'), +fetch = require('node-fetch'), +withThis = (obj, cb) => cb(obj), +base_url = process.env.stage === 'production' ? + process.env.base_url_prod + : process.env.base_url_dev, + +timestamp = () => + Math.floor(Date.now()/1000).toString(), + +encrypt = (data, secret) => + CryptoJS.enc.Base64.stringify( + CryptoJS.HmacSHA256(data, secret) + ), + +signature = () => encrypt( + [process.env.cons_id, '&', timestamp()].join(''), + process.env.secret_key +), + +dbCall = action => mongoDB.MongoClient.connect( + process.env.atlas, + {useNewUrlParser: true, useUnifiedTopology: true}, + (err, client) => err ? console.log(err) + : action(client.db(process.env.dbname)) +), + +beds = { + vip: {tarif: 350, kamar: {tulip: 1, bougenvil: 1, sakura: 1}}, + kl3: {tarif: 200, kamar: {kenanga: 2, cempaka: 2, claudia: 2, ferbia: 2, yasmin: 2, edelwise: 2}}, + kl2: {tarif: 150, kamar: {seroja: 4, mawar: 2, dahlia: 2, lili: 2, zahara: 2, matahari: 4}}, + kl1: {tarif: 100, kamar: {anggrek: 4, teratai: 8, kertas: 4, melati: 4}} +}, + +headers = () => ({ + 'Content-Type': 'application/json', + 'X-cons-id': process.env.cons_id, + 'X-timestamp': timestamp(), + 'X-signature': signature() +}), + +autoUpdateKamar = (new CronJob( + '0 0 */3 * * *', // per 3 jam + () => dbCall(db => + db.collection('patients').find({ + rawatInap: {$elemMatch: { + keluar: {$exists: false} + }} + }).toArray().then(res => + withThis( + { + used: _.flattenDeep(res.map( + i => i.rawatInap + .filter(j => !j.keluar) + .map(j => j.bed) + )).filter(Boolean) + .reduce((res, inc) => _.assign(res, { + [inc.kamar]: (res[inc.kamar] || 0) + 1 + }), {}), + bedList: _.flattenDepth( + _.map(beds, (a, b) => + _.map(a, c => _.map(c, (d, e) => + ({kelas: b, kamar: e, kapasitas: c[e]}) + )) + ) + , 2) + }, + ({used, bedList}) => + bedList.reduce((res, inc) => + [ + ...res, + _.includes(_.keys(used), inc.kamar) ? { + kodekelas: inc.kelas, + koderuang: inc.kamar, + namaruang: _.startCase(inc.kamar), + kapasitas: inc.kapasitas, + tersedia: (inc.kapasitas - used[inc.kamar]) + } : {} + ] + , []).filter(i => _.keys(i).length) + .map(i => + fetch( + [base_url, 'bed/update/', process.env.kode_ppk].join(''), + { + method: 'post', + body: JSON.stringify(i), + headers: headers() + } + ) + .then(res => res.json()) + .then(res => res && console.log(res)) + .catch(console.log)) + ) + ) + ) +)).start(), + +kamar = (req, res) => ({ + referensi_kelas: () => + fetch(base_url+'ref/kelas/') + .then(data => data.json()) + .then(data => data && res.send(data)), + update_ketersediaan: () => + fetch( + [base_url, 'bed/update/', process.env.kode_ppk].join(''), + { + method: 'post', + body: JSON.stringify(req.body), + headers: headers() + } + ) + .then(data => data.json()) + .then(data => data && res.send(data)), + ketersediaan_kamar: () => + fetch( + [base_url, 'bed/read/', process.env.kode_ppk, '/1/100'].join(''), + {headers: headers()} + ) + .then(data => data.json()) + .then(data => data && res.send(data)), + ruangan_baru: () => + fetch( + [base_url, 'bed/create/', process.env.kode_ppk].join(''), + { + method: 'post', headers: headers(), + body: JSON.stringify(req.body) + } + ) + .then(data => data.json()) + .then(data => data && res.send(data)), + hapus_ruangan: () => + fetch( + [base_url, 'bed/delete/', process.env.kode_ppk].join(''), + { + method: 'post', headers: headers(), + body: JSON.stringify(req.body) + } + ) + .then(res => res.json()) + .then(data => data && res.send(data)), +})[req.params.api]() + +exports.kamar = kamar \ No newline at end of file diff --git a/kodepoli.js b/kodepoli.js new file mode 100644 index 0000000..266b7b7 --- /dev/null +++ b/kodepoli.js @@ -0,0 +1,161 @@ +var kodepoli = { +'004':'ALERGI-IMMUNOLOGI KLINIK', +'005':'GASTROENTEROLOGI-HEPATOLOGI', +'006':'GERIATRI', +'007':'GINJAL-HIPERTENSI', +'008':'HEMATOLOGI - ONKOLOGI MEDIK', +'009':'HEPATOLOGI', +'010':'ENDOKRIN-METABOLIK-DIABETES', +'011':'PSIKOSOMATIK', +'012':'PULMONOLOGI', +'013':'REUMATOLOGI', +'014':'PENYAKIT TROPIK-INFEKSI', +'015':'KARDIOVASKULAR', +'017':'BEDAH ONKOLOGI', +'018':'BEDAH DIGESTIF', +'020':'FETOMATERNAL', +'021':'ONKOLOGI GINEKOLOGI', +'022':'UROGINEKOLOGI REKONTRUSKI', +'023':'OBSTETRI GINEKOLOGI SOSIAL', +'024':'ENDOKRINOLOGI', +'025':'FERTILITAS', +'027':'ANAK ALERGI IMUNOLOGI', +'028':'ANAK ENDOKRINOLOGI', +'029':'ANAK GASTRO-HEPATOLOGI', +'030':'ANAK HEMATOLOGI ONKOLOGI', +'031':'ANAK INFEKSI & PEDIATRI TROPIS', +'032':'ANAK KARDIOLOGI', +'033':'ANAK NEFROLOGI', +'034':'ANAK NEUROLOGI', +'036':'PEDIATRI GAWAT DARURAT', +'037':'PENCITRAAN ANAK', +'038':'PERINATOLOGI', +'039':'RESPIROLOGI ANAK', +'040':'TUMBUH KEMBANG PED. SOSIAL', +'041':'KESEHATAN REMAJA', +'043':'INTENSIVE CARE/ICU', +'044':'ANESTESI KARDIOVASKULER', +'045':'MANAJEMEN NYERI', +'047':'NEUROANESTESI', +'048':'ANESTESI PEDIATRI', +'049':'ANESTESI OBSTETRI', +'051':'Radiologi Thoraks', +'052':'Radiologi Muskuloskeletal', +'053':'Radiologi Tr Urinariusgenitalia', +'054':'Radiologi Tr Digestivus', +'055':'Neuroradiologi', +'056':'Pencitraan Payudara/womans imaging', +'057':'Radiologi intervensional kardiovaskular', +'058':'Pencitraan kepala leher', +'059':'Radiologi pediatrik', +'060':'Kedokteran nuklir', +'067':'OTOLOGI', +'068':'NEUROTOLOGI', +'069':'RINOLOGI', +'070':'LARINGO-FARINGOLOGI', +'071':'ONKOLOGI KEPALA LEHER', +'072':'PLASTIK REKONSTRUKSI', +'073':'BRONKOESOFAGOLOGI', +'074':'ALERGI IMUNOLOGI', +'075':'THT KOMUNITAS', +'078':'NEUROTRAUMA', +'079':'NEUROINFEKSI', +'080':'NEUROINFEKSI DAN IMUNOLOGI', +'081':'EPILEPSI', +'082':'NEUROFISIOLOGI KLINIS', +'083':'NEUROMUSKULAR, SARAF PERIFER', +'086':'NEURO-INTENSIF', +'095':'INFEKSI', +'096':'ONKOLOGI TORAKS', +'097':'ASMA DAN PPOK', +'099':'FAAL PARU KLINIK', +'100':'PARU KERJA DAN LINGKUNGAN', +'101':'IMUNOLOGIK KLINIK', +'104':'BURN (LUKA BAKAR)', +'105':'MICRO SURGERY', +'106':'KRANIOFASIAL (KKF)', +'107':'HAND (BEDAH TANGAN)', +'108':'GENITALIA EKSTERNA', +'109':'REKONTRUKSI DAN ESTETIK', +'132':'Bedah Vaskuler', +'133':'Kornea dan Bedah Refraktif', +'134':'Infeksi dan Immunologi', +'135':'Vitreo - Retina', +'136':'Strabismus', +'137':'Neuro Oftalmologi', +'138':'Glaukoma', +'139':'Pediatrik Oftalmologi', +'140':'Refraksi', +'141':'Rekonstruksi', +'142':'Onkologi Mata', +'143':'Dermatologi Infeksi Tropik', +'144':'Dermatologi Pediatrik', +'146':'Infeksi Menular Seksual', +'147':'Dermato - Alergo - Imunologi', +'148':'Dermatologi Geriatrik', +'149':'Tumor dan Bedah Kulit', +'150':'Dermatopatologi', +'151':'Trauma dan Rekonstruksi', +'152':'Tulang Belakang', +'153':'Tumor Tulang', +'154':'Pediatrik', +'156':'Hand and Microsurgery', +'157':'Rekonstruksi Dewasa/Hip and Knee', +'158':'Bio Orthopedic', +'160':'Neuropsikiatri dan Psikometri', +'162':'Psikiatri Anak dan Remaja', +'163':'Psikiatri Geriatri', +'165':'Consultation-Liaison Psychiatri', +'168':'Radioterapi', +'169':'Radiologi Onkologi', +'170':'Bedah Kepala Leher', +'ANA':'ANAK', +'AND':'ANDROLOGI', +'ANT':'ANASTESI', +'BDA':'BEDAH ANAK', +'BDM':'GIGI BEDAH MULUT', +'BDP':'BEDAH PLASTIK', +'BED':'BEDAH', +'BSY':'BEDAH SARAF', +'BTK':'BTKV (BEDAH THORAX KARDIOVASKU', +'FMK':'FARMAKOLOGI KLINIK', +'GIG':'GIGI', +'GIZ':'GIZI KLINIK', +'GND':'GIGI ENDODONSI', +'GOR':'GIGI ORTHODONTI', +'GPR':'GIGI PERIODONTI', +'GRD':'GIGI RADIOLOGI', +'HDL':'HEMODIALISA', +'HIV':'B20', +'IGD':'INSTALASI GAWAT DARURAT', +'INT':'PENYAKIT DALAM', +'IRM':'REHABILITASI MEDIK', +'JAN':'JANTUNG DAN PEMBULUH DARAH', +'JIW':'JIWA', +'KDK':'KEDOKTERAN KELAUTAN', +'KDN':'KEDOKTERAN NUKLIR', +'KDO':'KEDOKTERAN OKUPASI', +'KDP':'KEDOKTERAN PENERBANGAN', +'KEM':'SARANA KEMOTERAPI', +'KLT':'KULIT KELAMIN', +'KON':'GIGI PEDODONTIS', +'KOR':'KEDOKTERAAN OLAHRAGA', +'MAT':'MATA', +'MKB':'MIKROBIOLOGI KLINIK', +'OBG':'OBGYN', +'ORT':'ORTHOPEDI', +'PAA':'PATOLOGI ANATOMI', +'PAK':'PATOLOGI KLINIK', +'PAR':'PARU', +'PNM':'GIGI PENYAKIT MULUT', +'PRM':'PARASITOLOGI UMUM', +'PTD':'GIGI PROSTHODONTI', +'RAT':'SARANA RADIOTERAPI', +'RDN':'RADIOLOGI ONKOLOGI', +'RDO':'RADIOLOGI', +'RDT':'RADIOTERAPI', +'SAR':'SARAF', +'THT':'THT-KL', +'URO':'UROLOGI', +} +exports.kodepoli = kodepoli \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..2e6c376 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,990 @@ +{ + "name": "webservice-fkrtl-bpjs", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "accepts": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", + "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", + "requires": { + "mime-types": "~2.1.18", + "negotiator": "0.6.1" + } + }, + "after": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", + "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=" + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "arraybuffer.slice": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", + "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==" + }, + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" + }, + "backo2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=" + }, + "base64-arraybuffer": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", + "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=" + }, + "base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==" + }, + "better-assert": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", + "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", + "requires": { + "callsite": "1.0.0" + } + }, + "bl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.0.tgz", + "integrity": "sha512-wbgvOpqopSr7uq6fJrLH8EsvYMJf9gzfo2jCsL2eTy75qXPukA4pCgHamOQkZtY5vmfVtjB+P3LNlMHW5CEZXA==", + "requires": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, + "blob": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", + "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==" + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "dependencies": { + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, + "mime-db": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" + }, + "mime-types": { + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "requires": { + "mime-db": "1.44.0" + } + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + } + } + }, + "bson": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.4.tgz", + "integrity": "sha512-S/yKGU1syOMzO86+dGpg2qGoDL0zvzcb262G+gqEy6TgP6rt6z6qxSFX/8X6vLC91P7G7C3nLs0+bvDzmvBA3Q==" + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + }, + "callsite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=" + }, + "component-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", + "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=" + }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" + }, + "component-inherit": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", + "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=" + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "requires": { + "safe-buffer": "5.1.2" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "cron": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/cron/-/cron-1.8.2.tgz", + "integrity": "sha512-Gk2c4y6xKEO8FSAUTklqtfSr7oTq0CiPQeLBG5Fl0qoXpZyMcj1SG59YL+hqq04bu6/IuEA7lMkYDAplQNKkyg==", + "requires": { + "moment-timezone": "^0.5.x" + } + }, + "crypto-js": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.3.0.tgz", + "integrity": "sha512-DIT51nX0dCfKltpRiXV+/TVZq+Qq2NgF4644+K7Ttnla7zEzqc+kjJyiB96BHNyUTBxyjzRcZYpUdZa+QAqi6Q==" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "denque": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/denque/-/denque-1.4.1.tgz", + "integrity": "sha512-OfzPuSZKGcgr96rf1oODnfjqBFmr1DVoc/TrItj3Ohe0Ah1C5WX5Baquw/9U9KovnQ88EqmJbD66rKYUQYN1tQ==" + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "engine.io": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.4.0.tgz", + "integrity": "sha512-XCyYVWzcHnK5cMz7G4VTu2W7zJS7SM1QkcelghyIk/FmobWBtXE7fwhBusEKvCSqc3bMh8fNFMlUkCKTFRxH2w==", + "requires": { + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "0.3.1", + "debug": "~4.1.0", + "engine.io-parser": "~2.2.0", + "ws": "^7.1.2" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "engine.io-client": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.4.0.tgz", + "integrity": "sha512-a4J5QO2k99CM2a0b12IznnyQndoEvtA4UAldhGzKqnHf42I3Qs2W5SPnDvatZRcMaNZs4IevVicBPayxYt6FwA==", + "requires": { + "component-emitter": "1.2.1", + "component-inherit": "0.0.3", + "debug": "~4.1.0", + "engine.io-parser": "~2.2.0", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "ws": "~6.1.0", + "xmlhttprequest-ssl": "~1.5.4", + "yeast": "0.1.2" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "ws": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.4.tgz", + "integrity": "sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA==", + "requires": { + "async-limiter": "~1.0.0" + } + } + } + }, + "engine.io-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.0.tgz", + "integrity": "sha512-6I3qD9iUxotsC5HEMuuGsKA0cXerGz+4uGcXQEkfBidgKf0amsjrrtwcbwK/nzpZBxclXlV7gGl9dgWvu4LF6w==", + "requires": { + "after": "0.8.2", + "arraybuffer.slice": "~0.0.7", + "base64-arraybuffer": "0.1.5", + "blob": "0.0.5", + "has-binary2": "~1.0.2" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" + }, + "mime-db": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" + }, + "mime-types": { + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "requires": { + "mime-db": "1.44.0" + } + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + } + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "has-binary2": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", + "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", + "requires": { + "isarray": "2.0.1" + } + }, + "has-cors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", + "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=" + }, + "http-errors": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", + "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + } + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + }, + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=" + }, + "lodash": { + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" + }, + "media-typer": { + "version": "0.3.0", + "resolved": "http://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", + "optional": true + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.37.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", + "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==" + }, + "mime-types": { + "version": "2.1.21", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", + "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", + "requires": { + "mime-db": "~1.37.0" + } + }, + "moment": { + "version": "2.27.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.27.0.tgz", + "integrity": "sha512-al0MUK7cpIcglMv3YF13qSgdAIqxHTO7brRtaz3DlSULbqfazqkc5kEjNrLDOM7fsjshoFIihnU8snrP7zUvhQ==" + }, + "moment-timezone": { + "version": "0.5.31", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.31.tgz", + "integrity": "sha512-+GgHNg8xRhMXfEbv81iDtrVeTcWt0kWmTEY1XQK14dICTXnWJnT0dxdlPspwqF3keKMVPXwayEsk1DI0AA/jdA==", + "requires": { + "moment": ">= 2.9.0" + } + }, + "mongodb": { + "version": "3.5.9", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.5.9.tgz", + "integrity": "sha512-vXHBY1CsGYcEPoVWhwgxIBeWqP3dSu9RuRDsoLRPTITrcrgm1f0Ubu1xqF9ozMwv53agmEiZm0YGo+7WL3Nbug==", + "requires": { + "bl": "^2.2.0", + "bson": "^1.1.4", + "denque": "^1.4.1", + "require_optional": "^1.0.1", + "safe-buffer": "^5.1.2", + "saslprep": "^1.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "negotiator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" + }, + "node-fetch": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", + "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" + }, + "object-component": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", + "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "parseqs": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", + "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", + "requires": { + "better-assert": "~1.0.0" + } + }, + "parseuri": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", + "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", + "requires": { + "better-assert": "~1.0.0" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "proxy-addr": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", + "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.1" + } + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "dependencies": { + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + } + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + } + } + }, + "require_optional": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", + "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==", + "requires": { + "resolve-from": "^2.0.0", + "semver": "^5.1.0" + } + }, + "resolve-from": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", + "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=" + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "saslprep": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", + "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", + "optional": true, + "requires": { + "sparse-bitfield": "^3.0.3" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + } + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "socket.io": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.3.0.tgz", + "integrity": "sha512-2A892lrj0GcgR/9Qk81EaY2gYhCBxurV0PfmmESO6p27QPrUK1J3zdns+5QPqvUYK2q657nSj0guoIil9+7eFg==", + "requires": { + "debug": "~4.1.0", + "engine.io": "~3.4.0", + "has-binary2": "~1.0.2", + "socket.io-adapter": "~1.1.0", + "socket.io-client": "2.3.0", + "socket.io-parser": "~3.4.0" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "socket.io-adapter": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz", + "integrity": "sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs=" + }, + "socket.io-client": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.3.0.tgz", + "integrity": "sha512-cEQQf24gET3rfhxZ2jJ5xzAOo/xhZwK+mOqtGRg5IowZsMgwvHwnf/mCRapAAkadhM26y+iydgwsXGObBB5ZdA==", + "requires": { + "backo2": "1.0.2", + "base64-arraybuffer": "0.1.5", + "component-bind": "1.0.0", + "component-emitter": "1.2.1", + "debug": "~4.1.0", + "engine.io-client": "~3.4.0", + "has-binary2": "~1.0.2", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "object-component": "0.0.3", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "socket.io-parser": "~3.3.0", + "to-array": "0.1.4" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "socket.io-parser": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.0.tgz", + "integrity": "sha512-hczmV6bDgdaEbVqhAeVMM/jfUfzuEZHsQg6eOmLgJht6G3mPKMxYm75w2+qhAQZ+4X+1+ATZ+QFKeOZD5riHng==", + "requires": { + "component-emitter": "1.2.1", + "debug": "~3.1.0", + "isarray": "2.0.1" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + } + } + }, + "socket.io-parser": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.4.0.tgz", + "integrity": "sha512-/G/VOI+3DBp0+DJKW4KesGnQkQPFmUCbA/oO2QGT6CWxU7hLGWqU3tyuzeSK/dqcyeHsQg1vTe9jiZI8GU9SCQ==", + "requires": { + "component-emitter": "1.2.1", + "debug": "~4.1.0", + "isarray": "2.0.1" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=", + "optional": true, + "requires": { + "memory-pager": "^1.0.2" + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "to-array": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", + "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=" + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "dependencies": { + "mime-db": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" + }, + "mime-types": { + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "requires": { + "mime-db": "1.44.0" + } + } + } + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "ws": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.1.2.tgz", + "integrity": "sha512-gftXq3XI81cJCgkUiAVixA0raD9IVmXqsylCrjRygw4+UOOGzPoxnQ6r/CnVL9i+mDncJo94tSkyrtuuQVBmrg==", + "requires": { + "async-limiter": "^1.0.0" + } + }, + "xmlhttprequest-ssl": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", + "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=" + }, + "yeast": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", + "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..1abe8f9 --- /dev/null +++ b/package.json @@ -0,0 +1,28 @@ +{ + "name": "webservice-fkrtl-bpjs", + "version": "1.0.0", + "description": "Webservice untuk FKRTL Medicare Sorek", + "main": "app.js", + "scripts": { + "test": "", + "start": "node index.js" + }, + "author": "rikyperdana", + "license": "MIT", + "dependencies": { + "express": "^4.17.1", + "socket.io": "^2.3.0", + "mongodb": "^3.5.9", + "body-parser": "^1.19.0", + "moment": "^2.27.0", + "lodash": "^4.17.19", + "cron": "^1.8.2", + "crypto-js": "^3.3.0", + "node-fetch": "^2.6.0" + }, + "devDependencies": {}, + "keywords": [ + "node", + "express" + ] +} diff --git a/public/app.js b/public/app.js new file mode 100644 index 0000000..2e7519d --- /dev/null +++ b/public/app.js @@ -0,0 +1,186 @@ +/*global _ m*/ + +var state = {}, +menus = ['referensi_kelas', 'update_ketersediaan', 'ruangan_baru', 'ketersediaan_kamar', 'hapus_ruangan', 'panduan'], +fieldsRuangan = ['namakelas', 'kodekelas', 'koderuang', 'namaruang', 'kapasitas', 'tersedia'], + +poster = (url, obj, cb) => fetch(url, { + method: 'POST', body: JSON.stringify(obj), + headers: {'Content-Type': 'application/json'} +}).then(res => res.json()).then(cb), + +comp = { + 'referensi_kelas': function(){return m('.content', + {oncreate: () => poster( + '/kamar/referensi_kelas', {}, + res => [ + state.referensi_kelas = res.response.list, + m.redraw() + ] + )}, + m('h3', 'Referensi Kelas'), + m('table', + m('thead', m('tr', m('th', 'Nama Kelas'), m('th', 'Kode Kelas'))), + m('tbody', state.referensi_kelas && state.referensi_kelas.map(function(i){ + return m('tr', m('td', i.namakelas), m('td', i.kodekelas)) + })) + ) + )}, + + 'update_ketersediaan': function(){return m('.content', + m('h3', 'Update Ketersediaan Kamar'), + m('form', + {onsubmit: function(e){ + e.preventDefault() + poster( + '/kamar/update_ketersediaan', + _.filter(e.target, function(i){return i.name}) + .map(function(field){return _.fromPairs([[field.name, field.value]])}) + .reduce(function(res, inc){return _.merge(res, inc)}, {}), + res => res && alert(_.get(res, 'metadata.message')) + ) + }}, + ['kodekelas', 'namaruang', 'koderuang', 'kapasitas', 'tersedia'] + .map(function(field){return m('.field', + m('.label', _.startCase(field)), + m('.control', m('input.input', { + type: 'text', name: field, + value: _.get(state, ['update_doc', field]) + })) + )}), + m('.field', m('.control', + m('input.button.is-warning', {type: 'submit', value: 'Update'}) + )) + ) + )}, + + 'ruangan_baru': function(){return m('.content', + m('h3', 'Ruangan Baru'), + m('form', + {onsubmit: function(e){ + e.preventDefault(); + poster( + '/kamar/ruangan_baru', + _.filter(e.target, function(i){return i.name}) + .map(function(field){return _.fromPairs([[field.name, field.value]])}) + .reduce(function(res, inc){return _.merge(res, inc)}, {}), + res => res && alert(_.get(res, 'metadata.message')) + ) + // google.script.run + // .withSuccessHandler(function(res){ + // alert(_.get(res, 'metadata.message')) + // }) + // .bpjsCall(_.merge(creds(), { + // method: 'post', + // url: [base_url, 'bed/create/', kode_ppk].join(''), + // payload: JSON.stringify( + // _.filter(e.target, function(i){return i.name}) + // .map(function(field){return _.fromPairs([[field.name, field.value]])}) + // .reduce(function(res, inc){return _.merge(res, inc)}, {}) + // ) + // })) + }}, + fieldsRuangan.map(function(field){return m('.field', + m('.label', _.startCase(field)), + m('.control', m('input.input', {type: 'text', name: field})) + )}), + m('.field', m('.control', + m('input.button.is-info', {type: 'submit', value: 'Tambahkan'}) + )) + ) + )}, + + 'ketersediaan_kamar': function(){return m('.content', + m('h3', 'Ketersediaan Kamar'), + m('table', + {onupdate: function(){ + poster( + '/kamar/ketersediaan_kamar', + {}, res => res && [ + state.ketersediaan_kamar = res.response.list, + m.redraw() + ] + ) + + // google.script.run + // .withSuccessHandler(function(res){if(res){ + // state.ketersediaan_kamar = res.response.list; + // m.redraw() + // }}) + // .bpjsCall(_.merge(creds(), { + // method: 'get', + // url: [base_url, 'bed/read/', kode_ppk, '/1/100'].join('') + // })) + }}, + m('thead', m('tr', fieldsRuangan.map(function(i){return m('th', _.startCase(i))}))), + m('tbody', state.ketersediaan_kamar && state.ketersediaan_kamar.map(function(kamar){ + return m('tr', + {ondblclick: function(e){_.assign(state, { + route: 'update_ketersediaan', + update_doc: kamar + })}}, + fieldsRuangan.map(function(field){ + return m('td', kamar[field]) + }) + ) + })) + ) + )}, + + 'hapus_ruangan': function(){return m('.content', + m('h3', 'Hapus Ruangan'), + m('form', + {onsubmit: function(e){ + e.preventDefault(); + fetch( + '/kamar/hapus_ruangan', + { + kodekelas: e.target[0].value, + koderuang: e.target[1].value + }, + res => res && alert(_.get(res, 'metadata.message')) + ) + }}, + ['kodekelas', 'koderuang'].map(function(i){return m('.field', + m('.label', _.startCase(i)), + m('.control', m('input.input', {type: 'text', name: i})) + )}), + m('.field', m('.control', + m('input.button.is-danger', {type: 'submit', value: 'Hapus'}) + )) + ) + )}, + 'navbar': function(){return m('nav.navbar.is-primary', + {role: 'navigation', 'aria-label': 'main navigation'}, + m('.navbar-brand', + m('a.navbar-item', 'BPJS Bridge'), + m('a.navbar-burger.burger', + {role: 'button', 'aria-label': 'menu', 'aria-expanded': 'false', 'data-target': 'navbarBasicExample'}, + _.range(3).map(function(i){return m('span', {'aria-hidden': true})}) + ) + ), + m('.navbar-menu', {id: 'navbarBasicExample'}, + m('.navbar-start', menus.map(function(i){ + return m('a.navbar-item', {onclick: function(){state.route = i}}, _.startCase(i)) + })), + m('.navbar-end') + ), + )}, + 'panduan': function(){return m('.content', + m('h3', 'Panduan Penggunaan Aplicare'), + m('h4', 'Referensi Kelas'), + m('p', 'Berisi referensi kode kelas yang dapat digunakan user untuk membuat ruangan baru atau mengupdate yang sudah ada. Kesalahan dalam penggunaan kode dapat berakibat fatal. Jika masih ragu, silahkan konsultasi kepada pihak BPJS terdekat.'), + m('h4', 'Update Ketersediaan'), + m('p', 'Form yang dapat digunakan untuk memperbaharui data ruangan yang sudah tersedia pada sistem (cek menu Ketersediaan Kamar). Pembaharuan dilakukan minimal 1x sehari untuk menjaga aktualitas. Double-klik pada baris kamar yang akan diupdate.'), + m('h4', 'Ruangan Baru'), + m('p', 'Form yang dapat digunakan untuk menambah ruangan baru yang ada di Faskes. Nama Kelas dan Kode Kelas harus sesuai referensi, Kode Ruang dan Nama Ruang boleh ditentukan sendiri dengan syarat harus konsisten.'), + m('h4', 'Ketersediaan Kamar'), + m('p', 'Adalah daftar nama ruangan berikut rinciannya sesuai dengan yang terekam pada server BPJS.'), + m('h4', 'Hapus Ruangan'), + m('p', 'Adalah form untuk menghapus ruangan tertentu. Pastikan sebelum mengambil keputusan.') + )} +}; + +m.mount(document.body, {view: function(){return m('div', + comp.navbar(), m('.container', m('br'), comp[state.route || 'referensi_kelas']()) +)}}) \ No newline at end of file diff --git a/public/autoForm.js b/public/autoForm.js new file mode 100644 index 0000000..18338c5 --- /dev/null +++ b/public/autoForm.js @@ -0,0 +1,208 @@ +var m, _, afState = {arrLen: {}, form: {}} + +function autoForm(opts){return {view: function(){ + function normal(name){return name.replace(/\d/g, '$')} + function ors(array){return array.filter(Boolean)[0]} + function dateValue(timestamp, hour){ + var date = new Date(timestamp), + dateStamp = [date.getFullYear(), date.getMonth()+1, date.getDate()].join('-'), + zeros = function(num){return num < 10 ? '0'+num : num}, + hourStamp = 'T'+zeros(date.getHours())+':'+zeros(date.getMinutes()) + return !hour ? dateStamp : dateStamp+hourStamp + } + + function linearize(obj){ + function recurse(doc){ + var value = doc[_.keys(doc)[0]] + return typeof(value) === 'object' ? _.map(value, function(val, key){ + return recurse({[_.keys(doc)[0]+'.'+key]: val}) + }) : doc + } + return _.fromPairs( + _.flattenDeep(recurse({doc: obj})) + .map(function(i){return [_.keys(i)[0].substr(4), _.values(i)[0]]}) + ) + } + + afState.form[opts.id] = opts.doc ? linearize(opts.doc) : afState.form[opts.id] + + var attr = { + form: { + id: opts.id, + onchange: function(e){ + e.redraw = false + afState.form[opts.id] = afState.form[opts.id] || {} + afState.form[opts.id][e.target.name] = e.target.value + }, + onsubmit: function(e){ + e.preventDefault() + afState.form[opts.id] = opts.autoReset && null + var submit = () => opts.action( + _.filter(e.target, function(i){return i.name && i.value}) + .map(function(obj){ + var type = opts.schema[normal(obj.name)].type + return _.reduceRight( + obj.name.split('.'), + function(res, inc){return {[inc]: res}}, + obj.value && [ // value conversion + ((type === String) && obj.value), + ((type === Number) && +(obj.value)), + ((type === Date) && (new Date(obj.value)).getTime()) + ].filter(function(i){return !!i})[0] + ) + }).reduce(function(res, inc){ + function recursive(inc){return ors([ + typeof(inc) === 'object' && ors([ + +_.keys(inc)[0]+1 && + _.range(+_.keys(inc)[0]+1).map(function(i){ + return i === +_.keys(inc)[0] ? + recursive(_.values(inc)[0]) : undefined + }), + {[_.keys(inc)[0]]: recursive(_.values(inc)[0])} + ]), inc + ])} + return _.merge(res, recursive(inc)) + }, {}) + ) + !opts.confirmMessage ? submit() : confirm(opts.confirmMessage) && submit() + } + }, + arrLen: function(name, type){return {onclick: function(){ + afState.arrLen[name] = afState.arrLen[name] || 0 + afState.arrLen[name] += ({inc: 1, dec: -1})[type] + }}}, + label: function(name, schema){return m('label.label', + m('span', schema.label || _.startCase(name)), + m('span', m('b.has-text-danger', !schema.optional && ' *')) + )} + } + + function inputTypes(name, schema){return { + hidden: function(){return m('input.input', { + type: 'hidden', name: !schema.exclude ? name : '', + value: schema.autoValue && + schema.autoValue(name, afState.form[opts.id], opts) + })}, + readonly: function(){return m('.field', + attr.label(name, schema), + m('input.input', { + readonly: true, name: !schema.exclude ? name : '', + value: schema.autoValue(name, afState.form[opts.id], opts) + }) + )}, + "datetime-local": function(){return m('.field', + attr.label(name, schema), + m('.control', m('input.input', { + type: 'datetime-local', + name: !schema.exclude ? name: '', + required: !schema.optional, + value: dateValue(_.get(afState.form, [opts.id, name]), true), + })) + )}, + textarea: function(){return m('.field', + attr.label(name, schema), + m('textarea.textarea', { + name: !schema.exclude ? name : '', + required: !schema.optional, + value: _.get(afState.form, [opts.id, name]), + placeholder: _.get(schema, 'autoform.placeholder'), + rows: _.get(schema, 'autoform.rows') || 6, + }) + )}, + password: function(){return m('.field', + attr.label(name, schema), m('input.input', { + name: !schema.exclude ? name : '', + required: !schema.optional, type: 'password', + placeholder: _.get(schema, 'autoform.placeholder') + }) + )}, + select: function(){return m('.field.is-expanded', + attr.label(name, schema), + m('.select.is-fullwidth', m('select', + { + name: !schema.exclude ? name : '', + required: !schema.optional, + value: _.get(afState.form, [opts.id, name]) + }, + m('option', {value: ''}, '-'), + schema.autoform.options(name, afState.form[opts.id]) + .map(function(i){return m('option', { + value: i.value, + selected: !!_.get(afState.form, [opts.id, name]) + }, i.label)}) + )), + m('p.help', _.get(schema, 'autoform.help')) + )}, + standard: function(){return ors([ + schema.type === Object && m('.box', + attr.label(name, schema), + _.map(opts.schema, function(val, key){ + return _.merge(val, {name: key}) + }).filter(function(i){ + function getLen(str){return _.size(_.split(str, '.'))}; + return _.every([ + _.includes(i.name, normal(name)+'.'), + getLen(name)+1 === getLen(i.name) + ]) + }).map(function(i){ + var childSchema = opts.schema[normal(i.name)]; + return inputTypes( + name+'.'+_.last(i.name.split('.')), childSchema + )[_.get(childSchema, 'autoform.type') || 'standard']() + }), + m('p.help', _.get(schema, 'autoform.help')) + ), + + schema.type === Array && m('.box', + attr.label(name, schema), + m('tags', + m('.tag.is-success', attr.arrLen(name, 'inc'), 'Add+'), + m('.tag.is-warning', attr.arrLen(name, 'dec'), 'Rem-'), + m('.tag', afState.arrLen[name]), + ), + _.range(afState.arrLen[name]).map(function(i){ + var childSchema = opts.schema[normal(name)+'.$'] + return inputTypes(name+'.'+i, childSchema) + [_.get(childSchema, 'autoform.type') || 'standard']() + }), + m('p.help', _.get(schema, 'autoform.help')) + ), + + m('.field', + attr.label(name, schema), + m('.control', m('input.input', { + step: 'any', name: !schema.exclude ? name : '', + placeholder: _.get(schema, 'autoform.placeholder'), + value: ors([ + schema.autoValue && + schema.autoValue(name, afState.form[opts.id], opts), + schema.type === Date && + dateValue(_.get(afState.form, [opts.id, name])), + _.get(afState.form, [opts.id, name]) + ]), + required: !schema.optional, pattern: schema.regExp, + min: schema.minMax && schema.minMax(name, afState.form[opts.id])[0], + max: schema.minMax && schema.minMax(name, afState.form[opts.id])[1], + onchange: schema.autoRedraw && function(){}, + type: _.get( + [[Date, 'date'], [String, 'text'], [Number, 'number']] + .filter(function(i){return i[0] === schema.type})[0], '1' + ), + })), + m('p.help', _.get(schema, 'autoform.help')) + ) + ])}, + }} + + return m('form', attr.form, + _.map(opts.schema, function(val, key){ + return !_.includes(key, '.') && inputTypes(key, val)[ + _.get(val, 'autoform.type') || 'standard' + ]() + }), + m('.row', m('button.button', + _.assign({type: 'submit', class: 'is-info'}, opts.submit), + (opts.submit && opts.submit.value) || 'Submit' + )) + ) +}}} \ No newline at end of file diff --git a/public/index.html b/public/index.html new file mode 100644 index 0000000..2cbdf6b --- /dev/null +++ b/public/index.html @@ -0,0 +1,18 @@ + + + + + + + + + + + BPJS Bridge + + +

Loading...

+ + + + \ No newline at end of file diff --git a/tindakan.js b/tindakan.js new file mode 100644 index 0000000..7890980 --- /dev/null +++ b/tindakan.js @@ -0,0 +1,2 @@ +var tindakan = [{"_id":"03k0wsz0ps9be3ltrbzafpn","nama":"Alveolektomy 3-4 kwadran - Kecil"},{"_id":"03l0z9t73ushntpngbxsphb","nama":"Partus Fisiologis - Bidan"},{"_id":"04kjxz3r7qqwidwg83d33la","nama":"Orbita AP"},{"_id":"04lk9g5e764scuauaxsm1tb","nama":"Polip Ekstraksi dengan Biopsi"},{"_id":"0g6yt3t7rq2w2kzcb1mtdd2","nama":"Pengambilan cairan lambung"},{"_id":"0hmowith25w7tqjgzab2xk","nama":"Buka Jahitan"},{"_id":"0i33dy1dzdlqfhrp7y5i3oa","nama":"Clysma"},{"_id":"0kz6q8xtgrdfq3kr5ds2wp","nama":"Kontrol Orthodontic Removable"},{"_id":"0l30wtdrkkjdmx3rmr5vawm","nama":"Clavicula AP"},{"_id":"0l5jqksoukwkpvteidduq1","nama":"Mantoux test"},{"_id":"0oo7sr6nxxdauktbisdqa9","nama":"Ektraksi k-wire"},{"_id":"0skyrzj7m07adycqnv29onn","nama":"Cholecystografi"},{"_id":"0uvhwi7obsy6zz9b9x16hn","nama":"bracket Removal post treatment 1 Rahang"},{"_id":"0w8zc53elhscv8plwp44o6a","nama":"Injeksi kenacort/ganglion"},{"_id":"0wtlc50p03n4qo3le2guwk","nama":"Barium Enema/Calon in Loop"},{"_id":"0ww1r83lybsnt0kt8qm7nkm","nama":"Cervical Oblique"},{"_id":"115nujxsc86ek7mlfjtjmh","nama":"Konsultasi Kerja"},{"_id":"13q6s6z6iz0ic02pisttvq","nama":"Grinding"},{"_id":"15oy84ty1x3r5ksxmfn24","nama":"Sendi dengan Perbandingan"},{"_id":"15po3xl2n1y4ibs4uxxync","nama":"Kawat Rusak/butir"},{"_id":"1b9ubzxt4scp1y4sn4nnfj","nama":"tindakan uterus bimanual"},{"_id":"1ctythnzo48h2t1pv12kuev","nama":"Urin Lengkap"},{"_id":"1gjfbg0j6k9wz4gn6mkg3","nama":"Pencabutan gigi tanpa komplikasi - Kecil"},{"_id":"1ia5plskuep8m4i27ezdq","nama":"Nekrotomi Besar"},{"_id":"1mqnfeyben7sw4o8kw66ym","nama":"Retikulosit"},{"_id":"1my1ljh34igjgc9ql2p4b","nama":"Pemasangan balon cateter"},{"_id":"1n7l4mxs4fztmn2lz51ma","nama":"Feses rutin"},{"_id":"1nfl1k8ewf3o3fj6jkaepa","nama":"Fiksasi sed. Fraktur Rahang - Besar"},{"_id":"1otewc2pg6dqo9cjtc01co","nama":"Aspirasi Tiroid"},{"_id":"1plwt0fy0ax882z3xvjv","nama":"Pemakaian Infant Warmer"},{"_id":"1qu92050mx1tbkcv9ku8d","nama":"Widal"},{"_id":"1thvtjihtfrwm6u07hq9cs","nama":"Insisi abses septum"},{"_id":"217d63jln6jmybsb3sdk58","nama":"Protein total / TP"},{"_id":"218qo7j9zxpk6pw3owjtu","nama":"Pemasangan crimpable hook"},{"_id":"21lsgwyys0bn6yc4y0ecd","nama":"Ganti drain kista - Besar"},{"_id":"25rmqxm3424gl9tc8tighc","nama":"Auto Refraktometer / Refraksi"},{"_id":"2cn4hrcr0oldwjtm6giuzb","nama":"Clalceneus AP/L"},{"_id":"2cpvbt9l04k04iklj28ej2p","nama":"Ekstraksi Kalisium Ocalat"},{"_id":"2gzsadnijmbs1r89rern9r","nama":"Hbs Ag"},{"_id":"2ivoz8mrhetk5y0m4yguv","nama":"Ambil Darah Astrup"},{"_id":"2j041mcpry6vabjtvmxj8","nama":"Triglycerida ( TG )"},{"_id":"2odq3u7wndxq8tb7o9xd4h","nama":"Corpus Alienum Konjungtiva"},{"_id":"2odwq8tk0b2aet8if52u7","nama":"Acne Vulgaris - Mikrodermabrasi"},{"_id":"2p403hk0pxj47ibreq79bb","nama":"Pengambilan Sample Darah"},{"_id":"2q7wbj6tqo49e2v53896tq","nama":"Pungsi Pleura/ Mini WSD"},{"_id":"2ret5d7h1l62wjbrqg39n8","nama":"Protein Urine"},{"_id":"2zchmomxblhy769dow3wb7","nama":"Melakukan wash out pada bayi meteorismus"},{"_id":"30gecgtlmxjak33li5y9mn","nama":"Scapula AP"},{"_id":"338y5teibmjyp0igf9vgwn","nama":"Extirpasi Mucocele - Kecil"},{"_id":"35ti24p3gtqfqq5x0zxhsq","nama":"Pemasangan infus Anak"},{"_id":"3619ye4fniegii99vt7qdh","nama":"Aplikasi CTG"},{"_id":"37rvckue3bh3h72pwnu4vp","nama":"Ekspresi Curretage"},{"_id":"38e9wh0fakfiyns86x214","nama":"Alveolektomy per regio - Besar"},{"_id":"3bb0eq8ec8bdl28kqo0xbt","nama":"Open bur"},{"_id":"3br0yojdn4nb4jid9jdbg","nama":"Fistulografi"},{"_id":"3fdshexws4t53aiskl6z0p","nama":"Partus Fisiologis - Dokter Spesialis"},{"_id":"3jihrbbz2tpa56oiceqlqq","nama":"Supra Pubic Pungsi (SPP)"},{"_id":"3l124rs32ev3acbj4hd65f","nama":"Resusitasi Bayi"},{"_id":"3oppdxyemkvw3v8zb5xq1","nama":"Pencabutan gigi tanpa komplikasi - Besar"},{"_id":"3pgghhsqlth23xsm9yk36h","nama":"Opthalmoscopy Indirect"},{"_id":"3qhhwue7b3diphbwcwzq3","nama":"Extirpasi Epulis - Kecil"},{"_id":"3s90ymru17rqk42haxv8s","nama":"Lumbo Sacral Lateral"},{"_id":"3u5kxlln0evletct765r","nama":"Injeksi Haemoroid"},{"_id":"3v3idlrk7chgya5cjbjm58","nama":"Injeksi Intra Artikuler"},{"_id":"3v5yequm4tncw74k3xhmc6","nama":"Mikcroalbumin Urine"},{"_id":"3zbzwz5mod2pfo1qj8mhff","nama":"Pendampingan Pasien"},{"_id":"41rbxavtgvbzuh9564w0c","nama":"Pencabutan dengan komplikasi"},{"_id":"47m81c89rovs28nr1pab8","nama":"Bracket Removal post treatment 2 Rahang"},{"_id":"47ol9ejy66jdwotmq7drlh","nama":"Pemeriksaan Intelegensi"},{"_id":"4d406ulyhos7ueshntx7t9","nama":"Injeksi kenacort/ganglion"},{"_id":"4nah4b6zy3uazhufi5d5d9","nama":"Striae - Chemical Peeling"},{"_id":"4sllrt55fme5218da2fc9i","nama":"Eosinofil Count"},{"_id":"4t8h49xilzovq4zvp7vg6k","nama":"IVP"},{"_id":"4w618ljhc3ihsmiydlqdzb","nama":"Laringoscopy fiber optik"},{"_id":"52h0ylcctd4ljd3gitymr","nama":"Prick Test"},{"_id":"54wjqh38zvoz3rhp7y0mr7","nama":"USG Thorax"},{"_id":"55fdhdnjbgkgsxonxa1lcu","nama":"GDS - gula darah sewaktu"},{"_id":"55jj6xfdbgd2llt1ifye9m","nama":"Lactat"},{"_id":"573jw8dppwwlq4cxgkpljd","nama":"Pasang Skin Traksi"},{"_id":"57uei5f26ldi4eb8qxin2l","nama":"CK-CKMB (Dengan menggunakan Alat/Mesin)"},{"_id":"5860scjl56foiv0xvwbuok","nama":"Buka Rubber - Kecil"},{"_id":"596j97tk4toy81w5w86438","nama":"Parasentese telinga"},{"_id":"5bnoegdvqtlg8oc7j9gqd","nama":"Aspirasi Sumsum Tulang"},{"_id":"5iovlhkje7e79zu68lh4e4","nama":"Pungsi Pericard / Pleura"},{"_id":"5oqpu8gopyk2yamuxcw9i4","nama":"Bilirubin total ( BT )"},{"_id":"5pfmf4ugz8kszlvnaf8oo8","nama":"Ligasi Varises Esofagus dengan Biopsi"},{"_id":"5tibdh42dcohvx6d1j5ywb","nama":"Orthodontic Fixed RA + RB"},{"_id":"5tihfu0gxtxybj1guibt3f","nama":"Sel LE"},{"_id":"5wof3njm8k3mg8ca72e3pp","nama":"Perawatan Luka bakar Luka Bakar 10% - 20%"},{"_id":"6687hsyj9wqexkpvq4pcyq","nama":"Darah Lengkap"},{"_id":"6adcpoeujk20lwk78dra62f","nama":"Sondage Canaliculi Lakrimalis"},{"_id":"6bsshyjzhr64k331cpdhx6","nama":"Ganti Balut ( S )"},{"_id":"6gwn3hywja4044wx718g33p","nama":"Injeksi Steroid"},{"_id":"6iq7d7cgusxq74b67qw0b","nama":"Alveolektomy 3-4 kwadran - Besar"},{"_id":"6jeyh2o5i57fudxyhyjpxd","nama":"Biopsi Serviks terarah"},{"_id":"6kfnw0htmx49ebiispke2","nama":"Ekstraksi Serumen"},{"_id":"6rywrl8z5n6tyb2yvxy9ep","nama":"USG Abdomen"},{"_id":"6wsnmi1vsf2mq20z96sk7o","nama":"Hecting - Kecil"},{"_id":"6x2pg5g1baiepnv53nwk39","nama":"Ligasi Umbilical External"},{"_id":"6zl02g588jn3ict3bmqw","nama":"Buka Obturator - Besar"},{"_id":"71kbqyxbl37ppu6l0gyfn8","nama":"Troponin I"},{"_id":"76m8u6hoffrtk2ptk9ua","nama":"Bracket Hilang / butir"},{"_id":"76w7g5osmjb8wumktia54k","nama":"Aspirasi Cairan Lambung"},{"_id":"7cc4hqk218uz16kmgphrbr","nama":"Pasang Anting Tindik Telinga"},{"_id":"7dxyfptmy4x9lkqpfeot2q","nama":"CVP"},{"_id":"7m7i1kgl8gtq5sm6gqktz","nama":"Debrideman Ulkus"},{"_id":"7oelze8yz4h9dmrbrgoago","nama":"Devitalisasi Pulpa"},{"_id":"7ppnal3tf27xj1zh4nwx0k","nama":"ICT TB"},{"_id":"7s3zxgacn4vpzov7gep2s7","nama":"Hecting 2-5 jahitan - Besar"},{"_id":"7t9fkepv2m4p76fvtzlwhk","nama":"Injeksi Steroid"},{"_id":"7ud13smz9okkhmg8hls7j","nama":"Eksplorasi luka"},{"_id":"7up1vle2tseylpsdve5u4"},{"_id":"7wd9zjd6nz4t7agxmn8amb","nama":"BMP"},{"_id":"86v97ghe77lxq2auj470g","nama":"Shoulder Joint AP/L"},{"_id":"8726myv84lmnx3uh9kq7uq","nama":"Angkat jahitan di Kornea"},{"_id":"8979lb74ecwyij1zop53q","nama":"Punksi Bula"},{"_id":"8iqo4w6t7v9bsbnafjn2lv","nama":"Thorax AP"},{"_id":"8izhv3crp25zbd8jhz8kd","nama":"Thoraco lumbal Lateral"},{"_id":"8n1ae4rt27p661n69a67im"},{"_id":"8qpg9hbmyltecp89bvf04v","nama":"Konsultasi Pribadi"},{"_id":"8qw8twqkkzhy6614ec8yu","nama":"Striae - Mikrodermabrasi"},{"_id":"8r2z0gq9yzq9uxnryerty","nama":"Anti HAV"},{"_id":"8teg6h0y3ww8ifj3q6k4tc","nama":"Pemasangan Kateter Two Way no.6"},{"_id":"8w8ztl7xn1x7grvw5hjp0x","nama":"Odentectomy - Besar"},{"_id":"8yaszsxq47j5bczpgjwbv5","nama":"Lumbo Sacral AP"},{"_id":"8zp15z5rvlqzj68i039lok","nama":"Injeksi toxoid anti tetanus"},{"_id":"95e3sukyma9hnupgbqrm1a","nama":"Pencabutan Gigi Susu - Dengan ChlorEthyl"},{"_id":"960k8je919th3lky9ccok","nama":"Bracket lepas / butir"},{"_id":"962tyknt6l9t73jwvug4lm","nama":"BMP"},{"_id":"96l55nlxthqzw4xpx2wma","nama":"Kuretase jaringan granulasi telinga"},{"_id":"9c2nzbsuetz5kx0aa73un","nama":"Pengangkatan benda asing"},{"_id":"9frdedaixlvsl9917ovpm","nama":"Analisa cairatn pelura/ascites"},{"_id":"9fv269haswgqsqizmwnlmc","nama":"Scorstein"},{"_id":"9ipq6q311vrhq9t5j2sdes","nama":"Golongan Darah A B O Rh"},{"_id":"9l1xcxf2gb9s8rbc54cusp","nama":"Odontectomy"},{"_id":"9lef5prwiuc2ax2f0l8j9p","nama":"Cephalometri"},{"_id":"9mrvork7tgb80ac3c2emnn","nama":"Ringan - Induksi Akselerasi dengan Oksitosin"},{"_id":"9nhi5tfd6vg6bhj06uutq9","nama":"Pemasangan NGT"},{"_id":"9nrxjpxody47secltjrstf","nama":"Perawatan Luka Bakar 41% - 50%"},{"_id":"9r309pp6te4n386l19j0u","nama":"Abdomen 3 Posisi"},{"_id":"9unspd9dh4g4u6p2t49s8h","nama":"Pungsi"},{"_id":"9v9sjx72qu7xunk8rhlpvk","nama":"Sekunder hecting"},{"_id":"9z8s1x6afwpz3q9tfoqua","nama":"Membersihkan Luka"},{"_id":"9zyye84tb7lal4lq1rt9nv","nama":"Tubex Test"},{"_id":"a0gpczfbnkvluh6psstkd","nama":"LDL cholesterol"},{"_id":"a3g7iyd0lgwzmetbbstxw","nama":"Necrotomi luka kecil kedalaman 2-5 cm luas 10 cm"},{"_id":"a6ujkz2qay8ascx3kaeeis","nama":"Rontgen Gigi Periapical"},{"_id":"a7fq3a509v4ab7fooleyvq","nama":"Pedis AP/L"},{"_id":"a98mebjdundirrc5gcj61f","nama":"Pemasangan Ransel Verban Besar"},{"_id":"a9n21edjoi89j5fcqo5au4","nama":"Hbs Ag (Dengan menggunakan Alat/Mesin)"},{"_id":"acigtp2aw96kaatptr067m","nama":"Rumple Leede"},{"_id":"aeenc5izl7akh1t39j8y8","nama":"Pelvic AP"},{"_id":"agtmx6uz06i292er399845","nama":"Pemakaian incubator"},{"_id":"agxqypl97e794iuldr7zm8","nama":"Asam urat (urie acid / AU )"},{"_id":"aju7pvkmwlf0lyobc6o9plg","nama":"Nasal Lateral"},{"_id":"anjat9qx5irevwfifpl2z5","nama":"Acne Vulgaris - Subcission"},{"_id":"apb8wxevbconljna53zza","nama":"ChlorEthyl Spray"},{"_id":"b1ipnrlpw3cld8ulx42ki","nama":"Pengambilan sample darah"},{"_id":"b1zk841s0wi8pdhimffas","nama":"Biopsi Kulit"},{"_id":"b38162yx95u6h8qo3oxg8","nama":"Schuller Lateral"},{"_id":"b58d1z1fkijlz46n41ab3","nama":"Spirometri"},{"_id":"b5f3al81i9rwfncf7h7lh","nama":"Urethrocystografi"},{"_id":"b60c3tkk6gnpjy1sm51cgf","nama":"Ekstirpasi"},{"_id":"b83bok5mljg3uvy5qhaqv9","nama":"TSH (Dengan menggunakan Alat/Mesin)"},{"_id":"baq35tn73aclmdi780fbm","nama":"Dilatasi phymosis"},{"_id":"bfcu07e0fywwurgz3dvsn","nama":"Ganti Verban"},{"_id":"bhen7uw8harvui4rvelcb","nama":"Extraksi Benda Asing"},{"_id":"bhglhp3zsapf4ztdpz66hd","nama":"Bedah Listrik - Ringan"},{"_id":"bitgu5i1q4mbxn4wy4ddbg","nama":"Pencabutan Gigi Susu - Dengan Anestesi Infiltrasi"},{"_id":"box6ieob7ocpjhouhmnna","nama":"Kontrol BedSide Monitor"},{"_id":"btb27rbdpbwkqztmuuz2g","nama":"Reposisi dislokasi tertutup yg baru terjadi tanpa gips misalnya dislokasi rahang"},{"_id":"buaymr2cx5po9fc2x4emb","nama":"Barium Floow Through"},{"_id":"bvg2ifryp1zbp1pcmcht","nama":"Rithossynthesisi"},{"_id":"bxzvexs97mqnrfsvfsw5w","nama":"CEA"},{"_id":"bz0xtasom6njb48yacutw","nama":"Fiksasi sed. Fraktur Rahang - Kecil"},{"_id":"c26wme9ldoisqz1xal6cp","nama":"Supra Pubic Puncture (SPP)"},{"_id":"c3pvj1094of7ciqucn6ie","nama":"D-Dimer"},{"_id":"c4fq56j0jjcy1ufk4uot6","nama":"LDH"},{"_id":"c6bt36cr5zw9iebp90b3ln","nama":"GDP - gula darah Puasa"},{"_id":"c799i611eqf1kmyt50ajyn","nama":"Kemoterapi"},{"_id":"c9l7lzfygvguap7hp4b9i","nama":"Kuretasi"},{"_id":"c9nlvsn3csq5cecuscne7w","nama":"Katerisasi ( pakai alat)"},{"_id":"ca50kfsjxyps2g65noi8vh","nama":"2JPP (2 jam setelah makan )"},{"_id":"cakgv82nftiwxy4kpq1s","nama":"Buka Archbar - Besar"},{"_id":"cb8lb0j3uvi7vxlexde8j3","nama":"TCD"},{"_id":"ce4stqk6hdki6xbbu437cr","nama":"Buka /pasang Slab gips Besar"},{"_id":"cfk3u2jjz7sj30b9mrmbx","nama":"PT"},{"_id":"cgx6qs48axqgpm0c29nerd","nama":"Mandibula AP"},{"_id":"ch3z89t1rebwdicyyvcyit","nama":"OMD"},{"_id":"cjf4uxxbwrkmodjtsc889m","nama":"Paps Smear"},{"_id":"cku8u88o7jvnmrtkxj0roo","nama":"Insisi Abses Lesi Simpel"},{"_id":"cmys0l9p8joyk84c2t53u","nama":"Pemasangan Kateter Urin"},{"_id":"cnhodlzenxqxcnpv0uqsm","nama":"Tindakan Diagnosis non bedah dengan Narkose"},{"_id":"co7ahzli6oi8vmcyxhucnf","nama":"Endoskopi"},{"_id":"co7q1s1svudrojb2fzxff","nama":"Epilasi"},{"_id":"cqbc81sogfw15ttaazy5bj","nama":"Angkat Jahitan di Kelopak Mata"},{"_id":"cqi5nnbzfvsnsvyd3qzq3o","nama":"HIV (Rapid Test)"},{"_id":"cqvg4mab81n9f6cfm16q1n","nama":"Elbow joint AP/L"},{"_id":"crhpijmlwmotf9it775won","nama":"Incisi Abses - Kecil"},{"_id":"cxsy53jkekizyj8uxlh3d8","nama":"HDL cholesterol"},{"_id":"czg7hw1i5xpyxyo3tvkoar","nama":"Acne Vulgaris - Perawatan Komedo/Milia"},{"_id":"d0si7w8pkplbrw0bcal8kp","nama":"USG abdomen"},{"_id":"d3tm91ktqug5984zr51fk7","nama":"Orbita Lateral"},{"_id":"d46kctdk23yjt4mh42od","nama":"Gips reposis utk kelainan equino varus"},{"_id":"da2b6dbv21fkswcvixufk","nama":"Hawley Retainer 1 Rahang"},{"_id":"datf3pdru1vgsxjwxbftdo","nama":"Laryngoscopy langsung ( pakai xylocain spray)"},{"_id":"dd81gee3erqf7cmjxlj9hr","nama":"Thorax Lateral"},{"_id":"dh0zd1j9h3jdc3uvip19i","nama":"Pemasangan Oksigen Canule"},{"_id":"dki5l1jfq7e7zvh0fi74tl","nama":"Wrist Joint AP/L"},{"_id":"do3t869z7dv3d49jg3a69","nama":"Extirpasi Mucocele - Besar"},{"_id":"drlfefaqu3f6yojlqbd8wq","nama":"Kontrol Orthodontic Fixed"},{"_id":"ds68vz61qdq1stj6n503df","nama":"Rotation - Besar"},{"_id":"dsxx5seg5erjy0f5umjfo","nama":"Ektraksi kuku"},{"_id":"dtkob6bc5nv9kgsabavctl","nama":"Caldwell"},{"_id":"dw4aduymuisjebl95v0zp","nama":"Scorhstain"},{"_id":"e0oqvle5bdaxjuiezxchu"},{"_id":"e12cqkfk4jjr6hpkuds5oq","nama":"Rheumatoid Factor (RF)"},{"_id":"e3bodn6xtbem96qwsvp2r","nama":"Rotation - Kecil"},{"_id":"edlszg5svrvkx09bim87qf","nama":"Hecting - Besar"},{"_id":"ef72j2tixdeowq399fnvm","nama":"Retinometri"},{"_id":"eghpwzyayzq71wfs5wocw2","nama":"ASTO"},{"_id":"eglqz2wcahp4pk508uc9n","nama":"Ekstraksi Litiasis"},{"_id":"eiikh2hs20bc85f7grgw6o","nama":"Urine 24 Jam (Protein)"},{"_id":"em76oyeipx8mj0uvx68fz8","nama":"Biopsi vaginal"},{"_id":"et6smh52sa34rz5ia860i","nama":"Pencabutan IUD non Komplikasi"},{"_id":"eyailieoq75wz68nw945em"},{"_id":"f57mfpr2dgezhcscoiygrn","nama":"BNO AP (Polos)"},{"_id":"f8ye0uikx2tj9ofwg0mgo7","nama":"Ekstraksi benda asing ditelinga atau hidung"},{"_id":"fb50bo5xv4b27hpb3cmiec","nama":"Biopsi"},{"_id":"fcd4m99vxkbauvu0cawnu7","nama":"Eksterpasi Tumor vagina/vulva (dikerjakan di ok)"},{"_id":"fe4awso4uhiag8xdatoh8","nama":"Pewarnaan BTA 3 X"},{"_id":"ffw5br5ad3hlzcpkxieuxe","nama":"T3 (Dengan menggunakan Alat/Mesin)"},{"_id":"fgcwr5adaaq31pewz1v39z","nama":"DBR"},{"_id":"fiziqj6a0fqsmjiug3u0j","nama":"Hbe IGM (Dengan menggunakan Alat/Mesin)"},{"_id":"fkgh47721iqq55qk9wc1yq","nama":"Anti HCV(Dengan menggunakan Alat/Mesin)"},{"_id":"fomt358i80a1ov4rf5hcz3","nama":"Cervical Lateral"},{"_id":"fqrym2mf3fbsn2nz7us5e","nama":"Trombin Time"},{"_id":"frqv5fqrquv8661rx6hc","nama":"Vena Seksi"},{"_id":"fudphs6za25rc39ltyxws","nama":"HSG"},{"_id":"fv2ohhxfua4yv5gky3kze9","nama":"Nasofaringoskopy + Biopsi"},{"_id":"fvddhgilxt7jgpxl6ow18r","nama":"Injeksi Sendi"},{"_id":"fxg2plnao851msbu1dsop","nama":"Tes Alergi: Prick Test (uji tusuk)"},{"_id":"fxkhj3ylsnbsmhmrgdrf3p","nama":"Sinus Paranasal 3 Posisi"},{"_id":"fzoyf5mumrf95h4hhk8a9q","nama":"Penambalan Composite - Kecil"},{"_id":"g3o5ncb7tmus9909ucj5x","nama":"Troponin T"},{"_id":"g3z3htyld89euy39vlo66","nama":"Anti HIV"},{"_id":"g6fylyf6sj5utal4x7bsy","nama":"Berat - Ekstraksi Total bokong/kaki"},{"_id":"g6rdrq66b56kl36tg7qmzl","nama":"Pungsi Asites"},{"_id":"g9g2ic9d62dkxxkyxchunl","nama":"Sedang - Manual Aid Sungsang"},{"_id":"g9jukco46f6jdg76e2f5q","nama":"Infus Pump / hari"},{"_id":"gdacrljw8wvgjdgex4m1k","nama":"Pengambilan Swab Vagina"},{"_id":"gf0lo4uov2upqsftbze8j","nama":"Lumbo Sacral Oblique"},{"_id":"ght08heu5h7pnyn3y9o5o","nama":"Swab Vaginal"},{"_id":"gjatb5kcgoqlhxhjo41jto","nama":"Mammografi Kanan/Kiri"},{"_id":"gjbcn9qrkmkd3dyhkimau","nama":"Cholesterol Total"},{"_id":"gjfnh08vauodcm78u91w9","nama":"Buka/ pasang Slab gips"},{"_id":"gjp4acuz3so3857ivyrhq6","nama":"Pungsi cairan trans abdominal"},{"_id":"gl4knyagtvo9eoj0y7awiw","nama":"Nasal AP"},{"_id":"go7c9jjzeq7xxji1pz3dq","nama":"Tes Amin"},{"_id":"goy2bq7r4zk4tcor1eyrsd","nama":"T4 (Dengan menggunakan Alat/Mesin)"},{"_id":"gscimnuv148qgg1enh6fjh","nama":"Appendikogram"},{"_id":"gwgsfr5ykxgtt52efuk2zc","nama":"Konsultasi Keluarga"},{"_id":"h0fjh859dug2206vz98gt1","nama":"Pengobatan epistaksis"},{"_id":"h0igcdgb7y9yti8cobtb","nama":"Ransel Verban"},{"_id":"h34kuilj0sflj1cin2h3ee","nama":"Ganti drain abses - Besar"},{"_id":"h80btr1nn4odb5afl431d","nama":"Indirek Opthalmoskopi"},{"_id":"ha18cri39kbjb5wzf5glk9","nama":"Band Lepas /butir"},{"_id":"hoqlhpc6id5r6fn1ahesd","nama":"Pemasangan ransel perban"},{"_id":"i2vljsdyjrj8i6wvoc0xsy","nama":"Transfer Pasien dari luar (non ORTHODONTIST)"},{"_id":"i5pmf1kb94sfc8uokbshi","nama":"Pewarnaan Jamur (KOH)"},{"_id":"i5zrayefz10m91555skfu","nama":"Sedang - Manual Plasenta tanpa Anestesi"},{"_id":"i6jjqo913vgbluzfv2y0a","nama":"Pulpa Capping"},{"_id":"i7ht3yu7l9nhs2frv49im","nama":"Pemasangan Laminaria"},{"_id":"iex7l1ihp6q1w3pi3599lw","nama":"Acne Vulgaris - Chemical Peeling"},{"_id":"igdufqn2ags6gcosklvw4m","nama":"LED"},{"_id":"ipl9tb3oijam38tk4aanl","nama":"Suction"},{"_id":"iqb0yfkq7mcvocfj46ywcm","nama":"Fibrinogen"},{"_id":"iqm6nzbq17xwh7zkttnmg","nama":"Audiogram + Tympanigrafi"},{"_id":"irffez9xqcruxehuf7elvf","nama":"Necrotomi"},{"_id":"iu3dmycoo8ojcsm5e6emtc","nama":"SGPT"},{"_id":"iutnrgx9hp85eclg097yo","nama":"Pemakaian Blood Warmer"},{"_id":"iwllvk5dkwo2wfwe462tuk","nama":"Buka mulut (Trismus) - Besar"},{"_id":"iyjdz8rbrmmcz6dshq5yen","nama":"Pungsi pleura"},{"_id":"izkxo6dr90bsi1fo9xehsk","nama":"Mantoux Test"},{"_id":"j07dmj0dp4evsxg8u4xdlf","nama":"Pemasangan Kateter Two WayUrin No.18"},{"_id":"j2bkdxyg7ii12oo49x6smmb","nama":"Pengembilan Benda Asing dengan Biopsi"},{"_id":"j2x25p9736fq892apv8rhr","nama":"Biopsi Sum-Sum Tulang"},{"_id":"ja1ws7ge9u9pxnaqv8r7q","nama":"Retinometri"},{"_id":"jasas40omwsy0zmvzxbmmb","nama":"Pemasangan KB Implan"},{"_id":"jbd8nocoe4fdt0gh329y6e","nama":"Waktu Perdarahan (BT)"},{"_id":"jccnfx27wjm8y2nii5n60i","nama":"Pemberian rectal supp"},{"_id":"jcywr9f6kxeye2agd2ye7","nama":"Kontrol pasien drg lain"},{"_id":"jh3z3kw8hxctjha21pu8","nama":"Cuci luka kecil"},{"_id":"ji9z0g0bvvsx8vdo0q0s1t","nama":"Anel Canaliculi Lacrimalis"},{"_id":"jiotm1b3bzl0lky7xm74p3","nama":"Comedo Extraksi"},{"_id":"jkxn5fbvrq4d23c06903q","nama":"Creatinin"},{"_id":"jl39yzlxgzf0txxsyn9ign","nama":"TMJ"},{"_id":"jle29ptsp202x0udr0dwm","nama":"Perawatan Luka bakar kurang dari 10 % tanpa komplikasi (Per-H/T)"},{"_id":"jn41cj6h1zeiyncdo3ef","nama":"ICT Malaria"},{"_id":"k18v2ozcfoa1cjycnc5k","nama":"Sedang - Kompresi Bimanual"},{"_id":"k426wu8vxgaw4ztx13yu97","nama":"Ganti drain kista - Kecil"},{"_id":"k6q6ul7lfyq0r7aajphn","nama":"Calsium Total"},{"_id":"kcv91pk4hr9ugg3grktxvs","nama":"Schorstein"},{"_id":"kgqeqlmguclnuiyt66st6","nama":"Insisi abses mastoid"},{"_id":"kih2s9a6t4di3gstrc25ol","nama":"Inhalasi ( Nebulizer)"},{"_id":"kipa3qf3z62wb106x6ocp","nama":"Reposisi Mandibula - Kecil"},{"_id":"klb33g9pe8i4gwrn8fv6ix","nama":"Esofagografi"},{"_id":"kpooqiq0rz2tywjyf0edq","nama":"Foto Fundus"},{"_id":"kqc7bm1t5nrmequz7uej5s","nama":"screw ekspansi 1 rahang"},{"_id":"kqmpz70go44908ro4552l","nama":"Gamma GT"},{"_id":"ksp6vm3cgloxn5bcgc21ik","nama":"Pengisian Saluran Akar - Besar"},{"_id":"kv9q53fqvkkx6xx799rcge","nama":"Pemasangan NGT"},{"_id":"l403c7rrkjs51aieqzof","nama":"Schuller AP"},{"_id":"l5z3rse19xb6yebp64onzq","nama":"Biopsi Kelenjer Getah Bening"},{"_id":"l8hgs4nqg0okb13q8f5li","nama":"Atresia Ani/Knee Chest"},{"_id":"lh7g5ap7css1ej1m0u8l0i","nama":"Waktu Pembekuan (CT)"},{"_id":"ljb6bp4pbmq2o1suapj0ai","nama":"Sklerosing Kista Tiroid"},{"_id":"lkazteg481931ilmhxp7","nama":"Alveolektomy per regio - Kecil"},{"_id":"lksm54j3xfd14jc3kk80co","nama":"CRP"},{"_id":"ll53ocutf4c1ova7dn62lrh","nama":"Buka Archbar - Kecil"},{"_id":"lqv6m8jjomdvz38tapvd9m","nama":"MDT"},{"_id":"luabhxyu3c2fth5u3x00p","nama":"Biopsi Hati / Ginjal"},{"_id":"m6uakfnr6c1sdefr27vaqh","nama":"Anti - HBs Rapid Test"},{"_id":"m82kl121klf663rd6ji1n","nama":"Trepanasi"},{"_id":"m9fdc2tn8lp5918fk28pbu","nama":"Penambalan Amalgam - Kecil"},{"_id":"mhe34wqu3tge5zvg7ht05","nama":"RPG"},{"_id":"moansjeodkco9vmgitww6","nama":"Pemasangan Kateter Urin"},{"_id":"mqszvc9ijkneiqsxli0ekc","nama":"Pungsi Asites"},{"_id":"mrw2j1yhucf7vtkoklukkt","nama":"Syiring Pump / hari"},{"_id":"mw4ced5hg2aqz6j5kf3b8f","nama":"Anuskopi"},{"_id":"myxr086q1qgmhjdv66626","nama":"Pemberian Rectal Suppositoria"},{"_id":"n28wmlvc6ep29nmck21y9","nama":"Buka Rubber - Besar"},{"_id":"n92wel9yxbf7l85wyo9qg","nama":"Perawatan luka kecil kedalaman 2-5 cm luas ±10 cm"},{"_id":"n9yl6zmz61rwnyniwhf2","nama":"USG Linear (Mamae/Thyroid/Scrotum/Eketrmitas/Skeletal)"},{"_id":"ni1dhfm47ht41lvuocpa6t","nama":"Odentectomy - Kecil"},{"_id":"ni8w3pfd7iqcvlgli0hd0e","nama":"Pungsi cairan trans abdominal"},{"_id":"nl1tihdnkstb89w65vc1rt","nama":"Ganti Perban"},{"_id":"nlmwiznceg8vzombumthjn","nama":"Total ig E (Dengan menggunakan Alat/Mesin)"},{"_id":"nob8cdgfke6txci1h0ji5","nama":"Buka mulut (Trismus) - Kecil"},{"_id":"notlzyoueh2rinacuezwd","nama":"SGOT"},{"_id":"nq5cozzvdzrqjhwrr7w3fq","nama":"Cystografi"},{"_id":"ntggob5wibdvrou0gcytwr","nama":"Mandibula Lateral"},{"_id":"o1cva2tbfggs4nhg6s4wm","nama":"Pungsi Limbal"},{"_id":"o1xg2e95jrizpi8r5eq83","nama":"Schadel Lateral"},{"_id":"o29jb60elg0hg019fry066","nama":"Alveolectomy per regio"},{"_id":"o2ywyfiyxcm6x6v593d5zs","nama":"Myelografi"},{"_id":"o3dl8lohjhklizih0313o","nama":"Sedang - Persalinan Spontan Gemelli"},{"_id":"o67e7encr8e4vnxope1kb","nama":"Streak Retinoskopi"},{"_id":"o7st6x6sidhq0htngjaepq","nama":"USG Doplar (Carotis/Scrotum/Mamae/Thyroid)"},{"_id":"oblghgyp17b9jryscvq09","nama":"Malaria Preparat tebal/tipis"},{"_id":"obstko8t5qblpvwdmnzhv","nama":"Pencabutan drain post operasi"},{"_id":"ocjn27xseirl8sd7826t5k","nama":"Schadel AP"},{"_id":"ofmx93r357lcy7scd922qu","nama":"Insisi Abses"},{"_id":"ofvsh6op558f80l0a06m6","nama":"USG Transvaginal"},{"_id":"ohrdr1kabucmt0z68ay06n","nama":"Hb A1C"},{"_id":"oiqhzk5yadzcovpwttrf","nama":"Pemasangan IUD non Komplikasi"},{"_id":"omlm3wy22mqnoc4o164bi","nama":"Insisi Abses Lesi Multiple"},{"_id":"on57rg3x128acq3xqf2lt6","nama":"GDS ( Stik )"},{"_id":"oplr2d3rpsbonowe18cmm","nama":"Pemasangan lingual button"},{"_id":"or13yulvh1fo7ndkrxq78","nama":"Debridement luka kecil"},{"_id":"orns7osqrsnm4a1ykd1dsr","nama":"Penyemprotan dengan kloretil sekali datang"},{"_id":"oti29hjqjap1u71x4am","nama":"Bedah Listrik - Berat"},{"_id":"otnyvim7ejhlwgj8la9ys","nama":"Cervical AP"},{"_id":"ow90s2d9eup1gi9bfjhe8","nama":"Anti Dengue NS1"},{"_id":"oxjhuhaijuib7cczfexw9v","nama":"Water's (Sinus Pranasal/SPN)"},{"_id":"oy22f1nzhlimistv9kjwqk","nama":"Thorax Lordotic"},{"_id":"p1htshy89b7wqkvfeggwsl","nama":"Humerus AP/L"},{"_id":"p9q481zh4ajdwj9d353o","nama":"Injeksi Intralesi dengan Kenacort A"},{"_id":"pde8yh2wfa8uzveceug4al","nama":"Spirometri"},{"_id":"pe3j7noe0i85g28zdj71","nama":"Penyuntikan interdelmal dengan triamsinolon astenoid keloid sekali datang"},{"_id":"pizjqqvuv5i5vlvqdtvtzv","nama":"Extirpasi Epulis - Besar"},{"_id":"pj2k3tpqdtc76tgiuy6be","nama":"Inspeculo"},{"_id":"pjlx41f2y6w1h9chjq6ei","nama":"Maxila Lateral"},{"_id":"pncqsw0cdt21rw04qpnxs","nama":"Bedah Listrik - Sedang"},{"_id":"pon8bsgze9tfj1ddmsg58","nama":"HIV (Dengan menggunakan Alat/Mesin)"},{"_id":"ppyk5yxu3mawmnerzoq2b","nama":"Berat - Ekstraksi Vakum"},{"_id":"pqn4j3i1iuuef5m7xtnz","nama":"aff hecting"},{"_id":"pszrrtusnqku5q1oo5ikv","nama":"Spooling bola Mata pada Trauma"},{"_id":"ptrk4aertbtm296b0ws18","nama":"Pungsi Subdural"},{"_id":"pwfvf7y5qae309vmzczmyy","nama":"H Pillory (Dengan menggunakan Alat/Mesin)"},{"_id":"pxevedbqxmcdwqr3f2a6s","nama":"Penambalan Composite - Besar"},{"_id":"q3g0if55ruc8zx8hx1eh","nama":"Thoraco lumbal Oblique"},{"_id":"q4mzsc4oosl5e4a3qtp5mp","nama":"Biopsi"},{"_id":"q94rka0jo5oo4m40fi8ywn","nama":"Operculectomy per regio / open window - Kecil"},{"_id":"q9vvrao69zjwkwhzkkq22","nama":"Hecting 2-5 jahitan - Kecil"},{"_id":"qd8lohu4n7p4wnm7hjtsti","nama":"Retinoscopy"},{"_id":"qhwfczjjrck0r0gwcftgo9c","nama":"Ringan - Spontan Bracht"},{"_id":"ql7obv92cdy6huve0dkvm","nama":"Pencabutan biasa"},{"_id":"qoc9mu1vjacaub1t4vr4si","nama":"APTT"},{"_id":"qrs3k0daikomm7s0g7br4","nama":"Ankle Joint AP/L"},{"_id":"qv0z26kulnbf2e7uclwb6b","nama":"Labula Plasti"},{"_id":"rdykve01ibswitsgtqzal","nama":"Elektrolit (Na K Cl)"},{"_id":"rkospn9ijlx4yydsytwhe","nama":"Gonioskopi"},{"_id":"rm0sfyhuhyet2qqts2nhm","nama":"Incisi Abses - Besar"},{"_id":"rn7eyxs0r3w6576rznq7o","nama":"Pemberian Rectal Suppositoria"},{"_id":"rocms8mee7cmzj6xrcgot","nama":"Busi ureta/rektal"},{"_id":"rq6bgj9tlqmlt04eve4r","nama":"Insisi dan kuret pada Perichodritis (dengan gips)"},{"_id":"rsqn696vhrisvxh52yb01d","nama":"Aspirasi Abses Hati / Limpa / Ginjal"},{"_id":"rvzglfs2u9mdjsd90qgldf","nama":"Band Rusak/ butir"},{"_id":"rw0p38pk34sveq0sltne5p","nama":"Vasektomi"},{"_id":"rwgpp8qp8dg1njxtwzr455","nama":"Maxila AP"},{"_id":"rym1m5lilq0gigbz3h4xxt","nama":"Tes Asam Asetat"},{"_id":"s254emxvn4ewdst5p1hwx"},{"_id":"s37qtkn107pgdgxb67nzk","nama":"Ganti jahitan - Besar"},{"_id":"s48np3utuqxf35x5l6kpj","nama":"GAS DARAH"},{"_id":"samlwnfcr1zmsiqmrf5zj","nama":"Tes kalori"},{"_id":"sbxygfpbz5qjq1r76prz4j","nama":"Kaustik"},{"_id":"sd0bn2uma6oxisy5s50vc","nama":"Cetak RA + RB"},{"_id":"sds5wc0ulhqdz3ib1329kp","nama":"Injeksi sendi intra / peri artikuler"},{"_id":"seyrl4b4vrhyb0kl49s07t","nama":"Colonoscopy"},{"_id":"skymizocgy8ob55r805us","nama":"Ambil Darah Astrup"},{"_id":"sraqa1z4qqc90uumkm45h","nama":"Bilirubin direct ( BD ) dan Bilirubin indirect ( BI )"},{"_id":"sts06avpxy3yt5p47qmrm","nama":"Pewarnaan gram"},{"_id":"sxhropo67w8ijjgjq271a","nama":"Resusitasi Dewasa"},{"_id":"sz43sx0vl2psq0yqla01","nama":"Orthodontic Removable RA + RB"},{"_id":"t53bb69zcdi8rmujdgzxhb","nama":"Alkali Fosfotase"},{"_id":"t82o04gwzxqsbnghuh3s","nama":"Protein Urine 24 Jam"},{"_id":"t9b9hxcu7mtmi92serafvm","nama":"Ganti Archwire per rahang"},{"_id":"tg99c64hd2boy5h96k2mls","nama":"Pembersihan Karang Gigi - 2 Rahang"},{"_id":"thxbwc6plycnho1b3yint","nama":"Open Hecting"},{"_id":"ti9828kapcpl76qpr779jn","nama":"Pencabutan KB Implan"},{"_id":"tjim3hd4p1d5mqslytq1j7","nama":"Mastoid"},{"_id":"trxlr47vzssxnf3p07hnb","nama":"Psikoterapi Tingkah Laku"},{"_id":"tsyzjxrbv8iseqeawj32jm","nama":"Anterbachi AP/L"},{"_id":"twicgsaprhf8sqexd32pr","nama":"Ganti jahitan - Kecil"},{"_id":"tyrb7ztp4olc9oice1485","nama":"Operasi Kosmetik ( S )"},{"_id":"tz4jisz73ec1j4r4w3axxeh","nama":"Pemeriksaan Kepribadian"},{"_id":"u5zqj5uekwvvlsl18hlha","nama":"Tindakan Pemberian Injeksi"},{"_id":"u8fkvcfvjcduq9fvzbofc","nama":"Pengambilan darah vena"},{"_id":"ui2g0r79kqenbrdk0iwb","nama":"Psikoterapi Emosi"},{"_id":"uith1m3lwssywnj8bskd0b","nama":"Biopsi Jaringan Halus"},{"_id":"ukddhmaf6jlmtiyminsfir","nama":"Ganti verban - Kecil"},{"_id":"unbf5p4sazqabjcjahhf","nama":"Penambalan Glassionomer - Kecil"},{"_id":"uqw1k9ck7dkmr8yi41p4d","nama":"Endoscopy hidung Telinga Tenggorok"},{"_id":"usm9v0q3tde4qtdvnt7h","nama":"Tonometri Amplanasi"},{"_id":"uuee609b9jonn47fc5yc","nama":"Uretrogafi"},{"_id":"uy29tzz2859ddp5qy3786","nama":"Imunisasi (1X)"},{"_id":"uymizznqnimhcesylovbj","nama":"Pungsi Aspirasi Perichodritis (tanpa gips)"},{"_id":"uz3ncdtijmdr1iplxudzu","nama":"Incisi Abses Extra Oral - Besar"},{"_id":"v28q5g0aj3i269f40ttset","nama":"Penambalan Glassionomer - Besar"},{"_id":"v3anb1t885rgl3eofxrn65","nama":"Pemberian Rectal Suppositoria"},{"_id":"v3gnogvwpcmeo3m1v5zsb","nama":"Panoramic Gigi"},{"_id":"v4mt0p0eohew8x81yv3dpg","nama":"USG Kepala"},{"_id":"v68hz8qszfo2c7l74s001u","nama":"Pelvic Lateral"},{"_id":"v6ndysvvf6m41p2sob9ibi","nama":"Pencabutan gigi dengan komplikasi - Besar"},{"_id":"v8xgyegdz5l07uickr7d","nama":"Ureum"},{"_id":"vaom7tzfruoj2ofyk4kaw9","nama":"EEG"},{"_id":"vc0v43co4f4fvy5atlub9","nama":"Insisi Abses"},{"_id":"vq3754o7fsqcomcy531uo","nama":"Pemasangan Infus Dewasa"},{"_id":"vvdyg53a4q8zjkrmr7j6","nama":"Pengambilan kerokan kulit"},{"_id":"vxdovcu79rcax5qp2lk3sv","nama":"Operculectomy per regio / open window - Besar"},{"_id":"vykfejeol6m5q0syh78rr9","nama":"Penambalan Amalgam - Besar"},{"_id":"vzrlvnxp5841l6z5lh4ro","nama":"Insisi Abses"},{"_id":"w1gkhpof3c4v9cthoptd7","nama":"IGM Salmonella"},{"_id":"w4wo08xztke7ye8sg8cbu5","nama":"USG Mata"},{"_id":"w65wdexpuoaceuweqi0u6r","nama":"Cruris AP/L"},{"_id":"w8o5a5qmg2uqkclga4jbg","nama":"Pemasangan OGT ( NGT )"},{"_id":"wikacbr81wdx9nj2k7wo3r","nama":"Incisi Abses Extra Oral - Kecil"},{"_id":"wjld46x1accrnvyc75nkp","nama":"Insisi abses paritonsil"},{"_id":"wl9xja3ud6qxnljaeebqv","nama":"Anti HAV IGM (Dengan menggunakan Alat/Mesin)"},{"_id":"wni2zgofkictssy93l3vwe","nama":"Test kehamilan"},{"_id":"wnn9pdugtymwdkdkuq1y","nama":"Pemasangan Bedside Monitor untuk Rawat Inap per Hari"},{"_id":"wodmmf4i0ff47v9daf7evm","nama":"Pemasangan SB Tube"},{"_id":"wpdg3zw55nibssvncw6g6","nama":"Treadmill"},{"_id":"wqawkmx7d4jubzcit88n","nama":"Intubasi Trakeal"},{"_id":"wywq1zn7by93g99q6abng","nama":"Buka Obturator - Kecil"},{"_id":"x0syvqe4f38t9hzk8l0yon","nama":"NS-1"},{"_id":"x0u83j9k0f9cvw9aq3r7mo","nama":"Imunisasi"},{"_id":"x7zzh9v9lcro08vqu7o4q","nama":"Spoling dari suction cerumen telinga"},{"_id":"x9syabsxvyeett37yvkp","nama":"Orthodontic Removable RA/RB"},{"_id":"xb3cuhgxdbue9ccr1xa3r","nama":"Anti Dengue IgG/IgM"},{"_id":"xc0eik1dbua3r7gtexu3jn","nama":"Pelvic Oblique"},{"_id":"xdidps9gjzncxm1u5ull","nama":"Pungsi Cairan Sendi"},{"_id":"xdik7mbcn454kj6fef9m6","nama":"Sirkumsisi"},{"_id":"xdxak0q724ahbesqb8tnzo","nama":"Thoraco lumbal AP"},{"_id":"xhgpq26asxbtpxhn3mi4zj","nama":"Protein Bence Jones"},{"_id":"xplauqh6vy7re2vk4bozt","nama":"Pembersihan Karang Gigi - 1 Rahang"},{"_id":"xqkxb5811o9eagdaf3prlr","nama":"Test Anel"},{"_id":"xrxr13npdjdbfiuavh97w","nama":"Resusitasi"},{"_id":"xti1ejx1nn952pma4q858","nama":"Perawatan Luka bakar Luka Bakar 21% - 50%"},{"_id":"xvrdz0lr6jm0elp0qhm45id","nama":"Intubsi lambung"},{"_id":"xvu12cpvpseb57hdzwvtcg","nama":"Tranfusi darah"},{"_id":"y0qezzs5l7tocmlmcm9jr","nama":"Kultur"},{"_id":"y7f6g2wq9lxloeueryj3l","nama":"Kompres Terbuka"},{"_id":"y9udb7ulljfgrcymjxw5dp","nama":"FT4 (Dengan menggunakan Alat/Mesin)"},{"_id":"yd75jzpuq1myr1cv117jw","nama":"Pengisian Saluran Akar - Kecil"},{"_id":"yg1gijapqesmtwx08y9gxi","nama":"Ganti verban - Besar"},{"_id":"yjiqhxuj5ypvu720mr8l1","nama":"Pencabutan gigi dengan komplikasi - Kecil"},{"_id":"yk3kvslbcgq53xs5ioga","nama":"Manus AP/L"},{"_id":"yqz2me033punetshjkw1","nama":"Pemasangan Kateter Urin"},{"_id":"yrg5zp7649n5dp6bj6gom","nama":"Pemasangan NGT"},{"_id":"yrk7iv3trth57xzxv36pb8","nama":"Albumin / Globulin"},{"_id":"yrqr42tcgffhbyrlvoxhe","nama":"Analisa cairan sendi"},{"_id":"ys1png0yh2m7i1onrdx","nama":"Tonometri"},{"_id":"yveeb77tjvr7i8my9c7ps","nama":"Kamprimetri"},{"_id":"ywqvlet386fr7shf8m8ya","nama":"Ektraksi benda asing di Kornea"},{"_id":"yz7tlsk57qnk8r5opraw6","nama":"BMP"},{"_id":"z1zdjgxp2zpzte9h2w5qkc","nama":"Ganti drain abses - Kecil"},{"_id":"z4gxdogjka0wak4ydxylrn","nama":"Operculectomy"},{"_id":"z53hsyuvt5eax8o052bd3","nama":"Femur AP/L"},{"_id":"z5t7cua4577efq1skvqgr","nama":"Hecting"},{"_id":"z6r4gb4h3kfhq4bls0es0v","nama":"Ektraksi Benda asing dirongga mulut"},{"_id":"z7tanryew1b18z4w41tdu9","nama":"Genu AP/L"},{"_id":"z84bytw0w4g80mhmsm7dlq","nama":"Pemakaian Monitor di ruangan"},{"_id":"zdr36gcm4rwxc2cpp7rj","nama":"Reposisi Mandibula - Besar"},{"_id":"zekl0uy3229tovs2pte0p","nama":"Narkoba 3 Parameter"},{"_id":"zk166bhgsgjoxdn8ou6gv","nama":"pengambilan crosmet"},{"_id":"zr0fldbeif91zbxz9fd99k","nama":"Orthodontic Fixed RA/RB"},{"_id":"ztcncv8yowokoovzul2aql","nama":"Aspirasi tyroid"}] +exports.tindakan = tindakan