diff --git a/development/app.js b/development/app.js index c853457..e7249e3 100644 --- a/development/app.js +++ b/development/app.js @@ -209,7 +209,7 @@ io().on('connect', socket => [ m('.content', m('a.help', { href: 'https://github.com/rikyperdana/simrs', target: '_blank' - }, 'Versi 1.9.3')) + }, 'Versi 2.0.6')) ) )}), // setiap kali data berubah, beritahu server untuk update seluruh klien yg sedang terkoneksi diff --git a/development/doms.js b/development/doms.js index b9a87ef..18c9d63 100644 --- a/development/doms.js +++ b/development/doms.js @@ -43,7 +43,7 @@ makeReport = (name, action, selections) => m('.box', ) ), -defaultStyle = objDB => 11001001001 ? // dbConnector? +defaultStyle = objDB => 1001100111110111110101101 ? // dbConnector? ((+localStorage[false || 'license'] || 0) > _.now()) ? objDB : withThis( {decoration: _.camelCase(_.initial(['line', 'through', 'database']).join(' '))}, ({decoration}) => _.merge({defaultStyle: {decoration}}, objDB) diff --git a/development/pdf.js b/development/pdf.js index d9c9e23..6972d7f 100644 --- a/development/pdf.js +++ b/development/pdf.js @@ -188,8 +188,7 @@ makePdf = { ]}} ] ].filter(Boolean) : '' - ].filter(Boolean)})) - .download('soap_'+identitas.no_mr), + ]})).download('soap_'+identitas.no_mr), resep: (drugs, no_mr) => pdfMake.createPdf(defaultStyle({content: [ diff --git a/development/profile.js b/development/profile.js index ca57a22..c324fd1 100644 --- a/development/profile.js +++ b/development/profile.js @@ -74,10 +74,11 @@ _.assign(comp, { {onclick: () => [ state.modalLicense = m('.box', m('h3', 'Unlock Lisensi Enterprise'), + m('p.help', 'Untuk menghilangkan semua garis batas pada pdf'), m(autoForm({ id: 'updateLicense', schema: {key: {type: String, autoform: { - help: 'Dapatkan dari developer' + placeholder: 'Dapatkan dari developer' }}}, action: ({key}) => key.length === 15 && [ withThis(['license', key.split(' ').reverse().join(''), localStorage], diff --git a/development/queue.js b/development/queue.js index fb9a3bf..9f1705a 100644 --- a/development/queue.js +++ b/development/queue.js @@ -3,11 +3,22 @@ _.assign(comp, { queue: () => m('.content', m('table.is-fullwidth', m('tr', - {oncreate: () => db.queue.toArray( - array => localStorage.setItem('regQueue', array.filter( - i => i.timestamp > startOfTheDay(+moment()) - ).length) - )}, + {onupdate: () => [ + db.queue.toArray( + array => localStorage.setItem('regQueue', array.filter( + i => i.timestamp > startOfTheDay(+moment()) + ).length) + ), + db.patients.toArray(array => localStorage.setItem( + 'clinicQueue', JSON.stringify( + array.flatMap(i => (i.rawatJalan || []).map(j => + (startOfTheDay(j.tanggal) === startOfTheDay(_.now())) && + [j.klinik, Boolean(j.soapDokter)] + ).filter(Boolean)) + .filter(i => i.length) + ) + )) + ]}, m('th', m('h1', 'Antrian Pendaftaran')), m('th', m('h1', 'R'+(localStorage.regQueue || 0))) )), @@ -28,10 +39,18 @@ _.assign(comp, { ), Array(3).map(i => m('br')), // TODO: antrian poliklinik belum ada angkanya - m('h1', 'Antrian Poliklinik'), m('table.is-fullwidth.is-striped', + m('thead', m('tr'), [ + 'Antrian Poliklinik', 'Urutan', 'Panjang' + ].map(i => m('td', m('h1', i)))), selects('klinik')().map(i => m('tr', - m('td', m('h2', i.label)) + [ + i.label, + JSON.parse(localStorage.clinicQueue || '[]') + .filter(j => ands([j[0] === i.value, j[1]])).length, + JSON.parse(localStorage.clinicQueue || '[]') + .filter(j => j[0] === i.value).length + ].map(i => m('td', m('h1', i))) )) ) ) diff --git a/production/bundled.min.js b/production/bundled.min.js index 7703017..00ea925 100644 --- a/production/bundled.min.js +++ b/production/bundled.min.js @@ -1 +1 @@ -var m,_,afState={arrLen:{},form:{}};function autoForm(a){return{view:function(){function t(a){return a.replace(/\d/g,"$")}function e(a){return a.find(Boolean)}function n(a,t){var e=new Date(a),n=function(a){return a<10?"0"+a:""+a},o=[e.getFullYear(),n(e.getMonth()+1),n(e.getDate())].join("-"),i="T"+n(e.getHours())+":"+n(e.getMinutes());return t?o+i:o}var o;afState.form[a.id]=a.doc?(o=a.doc,_.fromPairs(_.flattenDeep(function a(t){var e=t[_.keys(t)[0]];return"object"==typeof e?_.map(e,(function(e,n){return a({[_.keys(t)[0]+"."+n]:e})})):t}({doc:o})).map((function(a){return[_.keys(a)[0].substr(4),_.values(a)[0]]})))):afState.form[a.id];var i={form:{id:a.id,oncreate:a.oncreate,onchange:function(t){t.redraw=!1,afState.form[a.id]=afState.form[a.id]||{},afState.form[a.id][t.target.name]=t.target.value},onsubmit:function(n){n.preventDefault(),afState.form[a.id]=a.autoReset&&null;var o=()=>a.action(_.filter(n.target,(function(a){return a.name&&a.value})).map((function(e){var n=a.schema[t(e.name)].type;return _.reduceRight(e.name.split("."),(function(a,t){return{[t]:a}}),e.value&&[n===String&&e.value,n===Number&&+e.value,n===Date&&new Date(e.value).getTime()].filter((function(a){return!!a}))[0])})).reduce((function(a,t){return _.merge(a,function a(t){return e(["object"==typeof t&&e([+_.keys(t)[0]+1&&_.range(+_.keys(t)[0]+1).map((function(e){return e===+_.keys(t)[0]?a(_.values(t)[0]):void 0})),{[_.keys(t)[0]]:a(_.values(t)[0])}]),t])}(t))}),{}));a.confirmMessage?confirm(a.confirmMessage)&&o():o()}},arrLen:function(a,t){return{onclick:function(){afState.arrLen[a]=_.get(afState.arrLen,a)||0;var e=afState.arrLen[a]>0?-1:0;afState.arrLen[a]+={inc:1,dec:e}[t]}}},label:function(a,t){return m("label.label",m("span",t.label||_.startCase(a.split(".").map(a=>+a+1?+a+1:a).join("."))),m("span",m("b.has-text-danger",!t.optional&&" *")))}};return m("form",i.form,_.map(a.schema,(function(o,r){return!_.includes(r,".")&&function o(r,s){return{hidden:function(){return m("input.input",{type:"hidden",name:s.exclude?"":r,value:s.autoValue&&s.autoValue(r,afState.form[a.id],a)})},readonly:function(){return m(".field",i.label(r,s),m("input.input",{readonly:!0,name:s.exclude?"":r,value:s.autoValue(r,afState.form[a.id],a)}))},"datetime-local":function(){return m(".field",i.label(r,s),m(".control",m("input.input",{type:"datetime-local",name:s.exclude?"":r,required:!s.optional,value:n(_.get(afState.form,[a.id,r]),!0)})))},textarea:function(){return m(".field",i.label(r,s),m("textarea.textarea",{name:s.exclude?"":r,required:!s.optional,value:_.get(afState.form,[a.id,r]),placeholder:_.get(s,"autoform.placeholder"),rows:_.get(s,"autoform.rows")||6}))},password:function(){return m(".field",i.label(r,s),m("input.input",{name:s.exclude?"":r,required:!s.optional,type:"password",placeholder:_.get(s,"autoform.placeholder")}))},select:function(){return m(".field.is-expanded",i.label(r,s),m(".select.is-fullwidth",m("select",{name:s.exclude?"":r,required:!s.optional,value:_.get(afState.form,[a.id,r]),onchange:s.autoRedraw&&function(){}},m("option",{value:""},"-"),s.autoform.options(r,afState.form[a.id]).map((function(t){return m("option",{value:t.value,selected:!!_.get(afState.form,[a.id,r])},t.label)})))),m("p.help",_.get(s,"autoform.help")))},standard:function(){return e([s.type===Object&&m(".box",i.label(r,s),_.map(a.schema,(function(a,t){return _.merge(a,{name:t})})).filter((function(a){function e(a){return _.size(_.split(a,"."))}return _.every([_.includes(a.name,t(r)+"."),e(r)+1===e(a.name)])})).map((function(e){var n=a.schema[t(e.name)];return o(r+"."+_.last(e.name.split(".")),n)[_.get(n,"autoform.type")||"standard"]()})),m("p.help",_.get(s,"autoform.help"))),s.type===Array&&m(".box",i.label(r,s),!s.fixed&&m(".tags",m(".tag.is-success",i.arrLen(r,"inc"),"Add+"),m(".tag.is-warning",i.arrLen(r,"dec"),"Rem-"),m(".tag",afState.arrLen[r])),_.range(_.get(a.doc,r)&&a.doc[r].length,afState.arrLen[r]).map((function(e){var n=a.schema[t(r)+".$"];return o(r+"."+e,n)[_.get(n,"autoform.type")||"standard"]()})),m("p.help",_.get(s,"autoform.help"))),m(".field",i.label(r,s),m(".control",m("input.input",{step:"any",name:s.exclude?"":r,placeholder:_.get(s,"autoform.placeholder"),value:e([s.autoValue&&s.autoValue(r,afState.form[a.id],a),s.type===Date&&n(_.get(afState.form,[a.id,r])),_.get(afState.form,[a.id,r])]),required:!s.optional,pattern:s.regExp,min:s.minMax&&s.minMax(r,afState.form[a.id])[0],max:s.minMax&&s.minMax(r,afState.form[a.id])[1],onchange:s.autoRedraw&&function(){},type:_.get([[Date,"date"],[String,"text"],[Number,"number"]].filter((function(a){return a[0]===s.type}))[0],"1")})),m("p.help",_.get(s,"autoform.help")))])}}}(r,o)[_.get(o,"autoform.type")||"standard"]()})),m(".row",m("button.button",_.assign({type:"submit",class:"is-info"},a.submit),a.submit&&a.submit.value||"Submit")))}}}var withThis=(a,t)=>t(a),ors=a=>a.find(Boolean),ands=a=>a.reduce((a,t)=>a&&t,!0)&&a[a.length-1],randomId=()=>[1,1].map(()=>Math.random().toString(36).slice(2)).join(""),hari=(a,t)=>a&&moment(a).format("Do MMMM YYYY"+(t?", hh:mm":"")),daysDifference=(a,t)=>Math.round((t-a)/864e5),startOfTheDay=a=>+moment(moment(a).format("YYYY-MM-DD")),tomorrow=a=>a+864e5,rupiah=a=>"Rp "+numeral(a||0).format("0,0"),dbCall=(a,t)=>io().emit("dbCall",a,t),insertBoth=(a,t,e)=>withThis(_.merge(t,{_id:randomId(),updated:_.now()}),n=>dbCall({method:"insertOne",collection:a,document:n},o=>o&&[e&&e(o),db[a].put(n),io().emit("datachange",a,t)])),updateBoth=(a,t,e,n)=>withThis(_.merge(e,{_id:t,updated:_.now()}),o=>dbCall({method:"updateOne",collection:a,document:o,_id:t},t=>t&&[n&&n(t),db[a].put(o),io().emit("datachange",a,e)])),deleteBoth=(a,t,e)=>dbCall({method:"deleteOne",collection:a,_id:t},n=>n&&[e&&e(n),db[a].delete(t)]),tarifInap=(a,t,e)=>1e3*(daysDifference(t-a)||1)*+e,tarifIGD=45e3,tarifKartu=8e3,collNames=["patients","goods","references","users","queue"],state={route:"dashboard"},comp={},menus={registration:{full:"Pendaftaran",icon:"address-book",children:{icd:{full:"Kodifikasi",icon:"code"},queue:{full:"Antrian",icon:"stream"}}},emergency:{full:"IGD",icon:"heartbeat"},outpatient:{full:"Rawat Jalan",icon:"walking"},inpatient:{full:"Rawat Inap",icon:"bed",children:{beds:{full:"Daftar Kamar",icon:"bed"},surgery:{full:"Antrian Bedah",icon:"procedures"},gizi:{full:"Gizi",icon:"utensils"}}},cashier:{full:"Kasir",icon:"cash-register"},storage:{full:"Storage",icon:"cubes",children:{transfer:{full:"Amprah",icon:"exchange-alt"}}},pharmacy:{full:"Apotik",icon:"pills"},laboratory:{full:"Laboratorium",icon:"flask"},radiology:{full:"Radiologi",icon:"radiation"},management:{full:"Manajemen",icon:"users",children:{users:{full:"Pengguna",icon:"users"},references:{full:"Referensi",icon:"file-contract"}}},gizi:{full:"Gizi",icon:"utensils"},cssd:{full:"Laundry",icon:"tshirt"}},db=new Dexie("simrs"),getDifference=a=>db[a].toArray(t=>dbCall({method:"getDifference",collection:a,clientColl:t.map(a=>_.pick(a,["_id","updated"]))},t=>t&&[db[a].bulkPut(t),state.lastSync=+moment(),state.loading=!1,m.redraw()])),getDifferences=()=>collNames.map(a=>getDifference(a));db.version(1).stores(collNames.reduce((a,t)=>_.merge(a,{[t]:"_id"}),{}));var tds=a=>a.map(a=>m("td",a)),paginate=(a,t,e)=>a.slice(_.get(state,["pagination",t])*e,_.get(state,["pagination",t])*e+e),makeIconLabel=(a,t)=>[m("span.icon",m("i.fas.fa-"+a)),m("span",t)],makeModal=a=>m(".modal",{class:state[a]&&"is-active"},m(".modal-background"),m(".modal-content",state[a]),m(".modal-close.is-large",{onclick:()=>[state[a]=null,m.redraw()]})),makeReport=(a,t,e)=>m(".box",m("h4","Unduh Laporan "+a),m("form.field-body",{onsubmit:t},m(".field",m(".control.is-expanded",m("input.input",{type:"date",name:"start"}))),m(".field",m(".control.is-expanded",m("input.input",{type:"date",name:"end"}))),e&&m(".field",m(".control.is-expanded",m(".select.is-fullwidth",m("select",e.map(a=>m("option",{value:a.value},a.label)))))),m("input.button.is-primary",{type:"submit",value:"Unduh"}))),defaultStyle=a=>(+localStorage.license||0)>_.now()?a:withThis({decoration:_.camelCase(_.initial(["line","through","database"]).join(" "))},({decoration:t})=>_.merge({defaultStyle:{decoration:t}},a)),makeRincianSoapPerawat=a=>a&&[m("tr",m("th","Anamnesa Perawat"),m("td",a.anamnesa)),withThis(_.get(a,"fisik.tekanan_darah"),a=>m("tr",m("th","Tekanan Darah"),m("td",a.systolic+"/"+a.diastolic))),["nadi","suhu","pernapasan","tinggi","berat","lila"].map(t=>_.get(a.fisik,t)&&m("tr",m("th",_.startCase(t)),m("td",a.fisik[t]))),a.tracer&&m("tr",m("th","File Tracer"),m("td",a.tracer))],makeRincianSoapDokter=a=>a&&[m("tr",m("th","Anamnesa Dokter"),m("td",a.anamnesa)),_.map(a.diagnosa,(a,t)=>m("tr",m("th","Diagnosa "+(t+1)),m("td",a.text+" / ICD X: "+(a.code||"?")))),(a.tindakan||[]).map(a=>a&&m("tr",m("th",_.get(lookReferences(a.idtindakan),"nama")),m("td",rupiah(_.get(lookReferences(a.idtindakan),"harga"))))),(a.obat||[]).map(a=>a&&m("tr",m("th",_.get(lookGoods(a.idbarang),"nama")),m("td",a.harga))),a.planning&&m("tr",m("th","Planning"),m("td",a.planning)),a.keluar&&m("tr",m("th","Pilihan keluar"),m("td",look("keluar",a.keluar))),a.rujuk&&m("tr",m("th","Konsul ke poli lain"),m("td",look("klinik",a.rujuk))),a.tracer&&m("tr",m("th","File Tracer"),m("td",a.tracer)),(a.radio||[]).map((a,t)=>m("tr",m("th","Cek radiologi "+(t+1)),m("td",{"data-tooltip":a.diagnosa},lookReferences(a.idradio).nama),a.diagnosa&&m("td",m(".button.is-info",{"data-tooltip":"Cetak lembar hasil diagnosa radiologi",onclick:()=>makePdf.radio(state.onePatient.identitas,a)},makeIconLabel("print",""))))),(a.labor||[]).map((a,t)=>m("tr",m("th","Cek labor "+(t+1)),m("td",{"data-tooltip":a.diagnosa},lookReferences(a.idlabor).nama),m("td",a.hasil)))];_.assign(comp,{pagination:(a,t)=>(state.pagination=state.pagination||{[a]:_.get(state.pagination,a)||0},m("nav.pagination",m(".pagination-list",_.range(t).map(t=>m("div",m("a.pagination-link",{class:t===state.pagination[a]&&"is-current",onclick:()=>[state.pagination[a]=t,m.redraw()]},t+1))))))});var selects=a=>_.reduce({alias:["tn","ny","nn","an","by"],kelamin:["laki-laki","perempuan"],agama:["islam","katolik","protestan","budha","hindu","konghuchu"],nikah:["nikah","belum_nikah","janda","duda"],pendidikan:["sd","smp","sma","diploma","s1","s2","s3","tidak_sekolah"],darah:["a","b","ab","o"],pekerjaan:["pns","swasta","wiraswasta","tni","polri","pensiunan","lainnya"],cara_bayar:["umum","bpjs","asuransi"],kodepoli:["int","ana","obg","bed","gig"],klinik:["penyakit_dalam","anak","obgyn","bedah","gigi","umum"],tarif_klinik:[95,95,95,95,95,45],rujukan:["datang_sendiri","rs_lain","puskesmas","faskes_lainnya"],keluar:["pulang","konsultasikan_ke_poli_lain","inap"],jenis_barang:["Obat","BHP","Logistik"],satuan:["botol","vial","ampul","pcs","sachet","tube","supp","tablet","minidose","pot","turbuhaler","kaplet","kapsul","bag","pen","rectal","flash","cream","nebu","galon","lembar","roll","liter","cup","pasang","bungkus","box","syringe"],boolean:["ya","tidak"],konfirmasi:["proses","tolak"],peranan:["petugas","perawat","dokter","admin"],bidang:["pendaftaran","kasir","farmasi","apotik","manajemen","rawat_jalan","rawat_inap","laboratorium","radiologi","gizi"],keaktifan:["aktif","non-aktif"],pengarsipan:["Rumah Sakit","Pribadi"]},(a,t,e)=>_.merge(a,{[e]:()=>_.map(t,(a,t)=>({label:_.startCase(a),value:t+1}))}),{})[a],look=(a,t)=>_.get(selects(a)().filter((a,e)=>e+1===t)[0],"label")||"-",lookGoods=a=>a&&state.goodsList.filter(t=>t._id===a)[0],lookReferences=a=>a&&state.references.filter(t=>t._id===a)[0],lookUser=a=>a&&_.get(state.userList.find(t=>t._id===a),"nama")||"-",schemas={identitas:{no_antrian:{type:String,optional:!0,exclude:!0},no_mr:{type:Number,label:"No. MR",autoform:{help:"random dari sistem and boleh diubah"},autoValue:(a,t,e)=>"updatePatient"===e.id?_.get(state,"onePatient.identitas.no_mr"):Math.floor(1e6*Math.random())},alias:{type:Number,optional:!0,autoform:{type:"select",options:selects("alias")}},nama_lengkap:{type:String,autoform:{placeholder:"minimal 4 huruf"}},ktp:{type:Number,label:"No. KTP",optional:!0},bpjs:{type:Number,label:"No. Peserta BPJS",optional:!0},tanggal_lahir:{type:Date},tempat_lahir:{type:String},kelamin:{type:Number,label:"Jenis Kelamin",autoform:{type:"select",options:selects("kelamin")}},agama:{type:Number,optional:!0,autoform:{type:"select",options:selects("agama")}},nikah:{type:Number,label:"Status Nikah",optional:!0,autoform:{type:"select",options:selects("nikah")}},pendidikan:{type:Number,label:"Pendidikan Terakhir",optional:!0,autoform:{type:"select",options:selects("pendidikan")}},darah:{type:Number,label:"Golongan Darah",optional:!0,autoform:{type:"select",options:selects("darah")}},pekerjaan:{type:Number,label:"Pekerjaan sekarang",optional:!0,autoform:{type:"select",options:selects("pekerjaan")}},tempat_tinggal:{type:String,optional:!0,label:"Alamat tempat tinggal"},kontak:{type:Number,optional:!0,label:"No. Handphone"},keluarga:{type:Object},"keluarga.ayah":{type:String,optional:!0,label:"Nama Ayah"},"keluarga.ibu":{type:String,optional:!0,label:"Nama Ibu"},"keluarga.pasangan":{type:String,optional:!0,label:"Nama Suami/Istri"},petugas:{type:String,autoform:{type:"hidden"},autoValue:()=>_.get(state.login,"_id")},tanggal_input:{type:Number,autoform:{type:"hidden"},autoValue:()=>_.now()}},rawatJalan:{idrawat:{type:String,autoform:{type:"hidden"},autoValue:()=>randomId()},tanggal:{type:Number,autoform:{type:"hidden"},autoValue:()=>_.now()},no_antrian:{type:String,optional:!0,exclude:!0},cara_bayar:{type:Number,autoform:{type:"select",options:selects("cara_bayar")}},no_sep:{type:String,optional:!0,autoform:{placeholder:"isikan bila cara bayar bpjs"}},klinik:{type:Number,autoform:{type:"select",options:selects("klinik")}},rujukan:{type:Number,autoform:{type:"select",options:selects("rujukan")}},sumber_rujukan:{type:String,optional:!0},penaggungjawab:{type:String,optional:!0}},soapPerawat:{anamnesa:{type:String,autoform:{type:"textarea"}},fisik:{type:Object},"fisik.tekanan_darah":{type:Object},"fisik.tekanan_darah.systolic":{type:Number,optional:!0},"fisik.tekanan_darah.diastolic":{type:Number,optional:!0},"fisik.nadi":{type:Number,optional:!0},"fisik.suhu":{type:Number,optional:!0},"fisik.pernapasan":{type:Number,optional:!0},"fisik.tinggi":{type:Number,optional:!0},"fisik.berat":{type:Number,optional:!0},"fisik.lila":{type:Number,optional:!0},tracer:{type:String,optional:!0,label:"File Tracer"},perawat:{type:String,autoform:{type:"hidden"},autoValue:()=>_.get(state.login,"_id")}},soapDokter:{anamnesa:{type:String,autoform:{type:"textarea"}},diagnosa:{type:Array},"diagnosa.$":{type:Object},"diagnosa.$.text":{type:String},tindakan:{type:Array,optional:!0},"tindakan.$":{type:Object},"tindakan.$.idtindakan":{type:String,autoform:{type:"select",options:(a,t)=>_.sortBy(state.daftarTindakan.map(a=>({value:a._id,label:a.nama})),["label"])}},"tindakan.$.jadwal":{type:Date,optional:!0,autoform:{type:"datetime-local",help:"Hanya untuk penjadwalan kedepan"}},bhp:{type:Array,optional:!0,label:"Barang habis pakai"},"bhp.$":{type:Object},"bhp.$.idbarang":{type:String,label:"Nama Barang",autoform:{type:"select",options:()=>state.bhpList.map(a=>({value:a._id,label:a.nama}))}},"bhp.$.jumlah":{type:Number},obat:{type:Array,optional:!0},"obat.$":{type:Object},"obat.$.idbarang":{type:String,label:"Nama Obat",autoform:{type:"select",options:()=>state.drugList.map(a=>({value:a._id,label:a.nama}))}},"obat.$.jumlah":{type:Number},"obat.$.puyer":{type:Number,optional:!0,autoform:{help:"kode unik puyer"}},"obat.$.aturan":{type:Object,optional:!0},"obat.$.aturan.kali":{type:Number},"obat.$.aturan.dosis":{type:String},radio:{type:Array,optional:!0,label:"Radiologi"},"radio.$":{type:Object},"radio.$.grup":{type:String,optional:!0,autoform:{help:"Saring berdasarkan kategori",type:"select",options:()=>_.uniq(state.references.filter(a=>"radiologi"===a[0]).map(a=>a[1])).map(a=>({value:a,label:_.startCase(a)}))}},"radio.$.idradio":{type:String,autoRedraw:!0,autoform:{type:"select",options:(a,t)=>_.sortBy(state.references.filter(e=>ands(["radiologi"===e[0],withThis(_.initial(a.split(".")).join(".")+".grup",a=>!_.get(t,a)||t[a]===e[1])])).map(a=>({value:a._id,label:a.nama})),"label")}},"radio.$.catatan":{type:String,optional:!0},labor:{type:Array,optional:!0,label:"Laboratorium"},"labor.$":{type:Object},"labor.$.grup":{type:String,optional:!0,autoform:{help:"Saring berdasarkan kategori",type:"select",options:()=>_.uniq(state.references.filter(a=>"laboratorium"===a[0]).map(a=>a[1])).map(a=>({value:a,label:_.startCase(a)}))}},"labor.$.idlabor":{type:String,autoRedraw:!0,autoform:{type:"select",options:(a,t)=>_.sortBy(state.references.filter(e=>ands(["laboratorium"===e[0],withThis(_.initial(a.split(".")).join(".")+".grup",a=>!_.get(t,a)||t[a]===e[1])])).map(a=>({value:a._id,label:a.nama})),"label")}},planning:{type:String,optional:!0,autoform:{type:"textarea"}},keluar:{type:Number,autoform:{type:"select",options:selects("keluar")}},rujuk:{type:Number,optional:!0,label:"Konsultasikan ke",autoform:{type:"select",help:"Hanya diisi bila pilihan keluar adalah Konsultasikan ke Poliklinik lain",options:selects("klinik")}},tracer:{type:String,optional:!0,label:"File Tracer"},spm:{type:Number,autoform:{type:"hidden"},autoValue:()=>_.now()-state.spm},dokter:{type:String,autoform:{type:"hidden"},autoValue:()=>_.get(state.login,"_id")},tanggal:{type:String,autoform:{type:"hidden"},autoValue:()=>_.now()}},account:{nama:{type:String,label:"Nama lengkap"},username:{type:String},password:{type:String,autoform:{type:"password"}},peranan:{type:Number,autoform:{type:"select",options:selects("peranan")}},bidang:{type:Number,optional:!0,autoform:{type:"select",options:selects("bidang")}},poliklinik:{type:Number,optional:!0,autoform:{type:"select",options:selects("klinik"),help:"hanya diisi bila pilihan bidang Rawat Jalan"}},keaktifan:{type:Number,autoform:{type:"select",options:selects("keaktifan")}}},barang:{nama:{type:String},jenis:{type:Number,autoform:{type:"select",options:selects("jenis_barang")}},kandungan:{type:String},satuan:{type:Number,autoform:{type:"select",options:selects("satuan")}},stok_minimum:{type:Object},"stok_minimum.gudang":{type:Number},"stok_minimum.apotik":{type:Number},kriteria:{type:Object},"kriteria.antibiotik":{type:Number,autoform:{type:"select",options:selects("boolean")}},"kriteria.narkotika":{type:Number,autoform:{type:"select",options:selects("boolean")}},"kriteria.psikotropika":{type:Number,autoform:{type:"select",options:selects("boolean")}},"kriteria.fornas":{type:Number,autoform:{type:"select",options:selects("boolean")}},kode_rak:{type:String,optional:!0},petugas:{type:String,autoform:{type:"hidden"},autoValue:()=>_.get(state.login,"_id")}},batch:{idbatch:{type:String,autoform:{type:"hidden"},autoValue:()=>randomId()},no_batch:{type:String},merek:{type:String},masuk:{type:Date},kadaluarsa:{type:Date},stok:{type:Object},"stok.gudang":{type:Number,autoform:{help:"Berdasarkan unit terkecil"}},harga:{type:Object},"harga.beli":{type:Number},"harga.jual":{type:Number},sumber:{type:Object},"sumber.supplier":{type:String},"sumber.anggaran":{type:String,optional:!0},"sumber.no_spk":{type:String,optional:!0},"sumber.tanggal_spk":{type:Date,optional:!0},petugas:{type:String,autoform:{type:"hidden"},autoValue:()=>_.get(state.login,"_id")}},amprah:{idamprah:{type:String,autoform:{type:"hidden"},autoValue:()=>randomId()},ruangan:{type:Number,autoform:{type:"hidden"},autoValue:()=>ors([_.get(state.login,"bidang"),_.get(state.login,"poliklinik")])},peminta:{type:String,autoform:{type:"hidden"},autoValue:()=>_.get(state.login,"_id")},diminta:{type:Number,label:"Jumlah diminta",minMax:()=>[1,_.get(state,"oneBatch.stok.gudang")]},tanggal_minta:{type:Number,autoform:{type:"hidden"},autoValue:()=>_.now()}},responAmprah:{diserah:{type:Number,label:"Jumlah diserahkan",minMax:()=>[1,_.get(state,"oneAmprah.digudang")]},penyerah:{type:String,autoform:{type:"hidden"},autoValue:()=>_.get(state.login,"_id")},tanggal_serah:{type:Number,autoform:{type:"hidden"},autoValue:()=>_.now()}},login:{username:{type:String},password:{type:String,autoform:{type:"password"}}},beds:{kelas:{type:String,autoform:{type:"select",options:()=>_.keys(beds).map(a=>({value:a,label:_.upperCase(a)}))}},kamar:{type:String,autoform:{type:"select",options:()=>_.flatten(_.values(beds).map(a=>_.keys(a.kamar))).map(a=>({value:a,label:_.startCase(a)}))}},nomor:{type:Number}},overcharge:{charges:{type:Array,optional:!0},"charges.$":{type:Object},"charges.$.item":{type:String,label:"Nama item"},"charges.$.harga":{type:Number}},confirmRadiology:{konfirmasi:{type:Number,autoform:{type:"select",options:selects("konfirmasi")}},tanggal:{type:Number,autoform:{type:"hidden"},autoValue:()=>_.now()}},responRadiology:{kode_berkas:{type:String},diagnosa:{type:String,autoform:{type:"textarea",rows:10}},pengarsipan:{type:Number,autoform:{type:"select",options:selects("pengarsipan")}},petugas:{type:String,autoform:{type:"hidden"},autoValue:()=>_.get(state.login,"_id")}},responLaboratory:{labor:{type:Array,fixed:!0},"labor.$":{type:Object},"labor.$.idlabor":{type:String,autoform:{type:"hidden"},autoValue:(a,t)=>t[a]},"labor.$.item_labor":{type:String,autoform:{type:"readonly"},exclude:!0,autoValue:(a,t)=>lookReferences(t[_.initial(a.split(".")).join(".")+".idlabor"]).nama},"labor.$.tanggal":{type:Number,autoform:{type:"hidden"},autoValue:()=>_.now()}},gizi:{konsumsi:{type:String,label:"Konsumsi gizi untuk pasien",optional:!0,autoform:{type:"textarea"}}}},kop={text:"RUMAH SAKIT MEDICARE\nJL. Dt. Laksamana No. 1, Pangkalan Kuras, Pelalawan, Provinsi Riau.\n\n",alignment:"center",bold:!0},makePdf={card:a=>pdfMake.createPdf(defaultStyle({content:["Nama: "+a.nama_lengkap,"No. MR: "+a.no_mr],pageSize:"B8",pageMargins:[110,50,0,0],pageOrientation:"landscape"})).download("kartu_peserta_"+a.no_mr),consent:a=>pdfMake.createPdf(defaultStyle({content:[kop,{text:"Data Umum Pasien\n",alignment:"center"},{columns:[["No. MR","Nama Lengkap","Tempat & Tanggal Lahir","Nama Ibu","Alamat","Kontak"],[a.no_mr,a.nama_lengkap,(a.tempat_lahir||"")+", "+hari(a.tanggal_lahir),_.get(a.keluarga,"ibu")||"",a.tempat_tinggal||"",a.kontak||""].map(a=>": "+a)]},{text:"\nPersetujuan Umum General Consent\n",alignment:"center"},{table:{body:[["S","TS",{text:"Keterangan",alignment:"center"}],["","","Saya akan mentaati peraturan yang berlaku di RS Medicare."],["","","Saya memberi kuasa kepada dokter dan semua tenaga kesehatan untuk melakukan pemeriksaan / pengobatan / tindakan yang diperlukan dalam upaya kesembuhan saya / pasien tersebut diatas."],["","","Saya memberi kuasa kepada dokter dan semua tenaga kesehatan yang ikut merawat saya untuk memberikan keterangan medis saya kepada yang bertanggungjawab atas biaya perawatan saya."],["","","Saya memberi kuasa kepada RS Medicare untuk menginformasikan identitas sosial saya kepada keluarga / rekan / masyarakat."],["","","Saya mengatakan bahwa informasi hasil pemeriksaan / rekam medis saya dapat digunakan untuk pendidikan / penelitian demi kemajuan ilmu kesehatan."]]}},"\nPetunjuk :\nS: Setuju\nTS: Tidak Setuju",{alignment:"justify",columns:[{text:"\n\n\n\n__________________\n"+state.login.nama,alignment:"center"},{text:"Pangkalan Kuras, "+hari(_.now())+"\n\n\n\n__________________\nPasien",alignment:"center"}]}]})).download("general_consent_"+a.no_mr),bayar_pendaftaran:(a,t,e)=>pdfMake.createPdf(defaultStyle({content:[kop,{columns:[["Tanggal","No. MR","Nama Pasien","Tarif","Petugas"],[hari(_.now()),a.identitas.no_mr,a.identitas.nama_lengkap,"Total: "+rupiah(_.sum([e>1?0:tarifKartu,1e3*+look("tarif_klinik",t.klinik)])),state.login.nama].map(a=>": "+a)]}]})).download("bayar_pendaftaran_"+a.identitas.no_mr),bayar_konsultasi:(a,t,e)=>pdfMake.createPdf(defaultStyle({content:[kop,{columns:[["No. MR","Nama Pasien","Jenis Kelamin","Tanggal Lahir","Umur","Layanan"],[a.identitas.no_mr,_.startCase(a.identitas.nama_lengkap),look("kelamin",a.identitas.kelamin)||"-",hari(a.identitas.tanggal_lahir),moment().diff(a.identitas.tanggal_lahir,"years")+" tahun",ors([t.observasi&&"Rawat Inap",t.klinik&&look("klinik",t.klinik).label,"Emergency"])]]},{text:"\n\nRincian Pembayaran",alignment:"center"},{table:{widths:["*","auto"],body:_.concat([["Uraian","Harga"]],[...e].map(a=>[a.item,rupiah(a.harga)]))}},"\nTotal Biaya "+rupiah(_.sum(e.map(a=>a.harga))),{text:"\nP. Kuras, "+hari(_.now())+"\n\n\n\n\nPetugas",alignment:"right"}]})).download("bayar_konsultasi_"+a.identitas.no_mr),soap:(a,t)=>pdfMake.createPdf(defaultStyle({content:[kop,{table:{widths:["auto","*","auto"],body:[["Nama: "+a.nama_lengkap,"Tanggal lahir: "+hari(a.tanggal_lahir),"No. MR: "+a.no_mr],["Kelamin: "+look("kelamin",a.kelamin),"Tanggal kunjungan: "+hari(ors([t.tanggal,t.tanggal_masuk,_.get(t,"soapDokter.tanggal")])),"Gol. Darah: "+look("darah",a.darah)],["Klinik: "+look("klinik",t.klinik),"Tanggal cetak: "+hari(_.now()),"Cara bayar: "+look("cara_bayar",t.cara_bayar)],["Perawat: "+(lookUser(_.get(t,"soapPerawat.perawat"))||"-"),"Dokter: "+(lookUser(_.get(t,"soapDokter.dokter"))||"-"),""]]}},t.soapPerawat?[{text:"\nSOAP Perawat",alignment:"center",bold:!0},{table:{widths:["*","*","*"],body:[["Tinggi/Berat: "+(_.get(t,"soapPerawat.fisik.tinggi")||"-")+"/"+(_.get(t,"soapPerawat.fisik.berat")||"-"),"Suhu: "+(_.get(t,"soapPerawat.fisik.suhu")||"-")+" C","LILA: "+(_.get(t,"soapPerawat.fisik.lila")||"-")],["Pernapasan: "+(_.get(t,"soapPerawat.fisik.pernapasan")||"-"),"Nadi: "+(_.get(t,"soapPerawat.fisik.nadi")||"-"),"Tekanan darah: "+_.join(_.values(_.get(t,"soapPerawat.fisik.tekanan_darah")||"-"),"/")]]}},"\n",{table:{widths:["auto","*"],body:[["Anamnesa perawat",_.get(t,"soapPerawat.anamnesa")||"-"],["Rujukan: "+look("rujukan",_.get(t,"soapPerawat.rujukan")),"Sumber: "+(_.get(t,"soapPerawat.sumber_rujukan")||"-")]]}}]:"",t.soapDokter?[{text:"\nSOAP Dokter",alignment:"center",bold:!0},{table:{widths:["auto","*"],body:[["Anamnesa dokter",_.get(t,"soapDokter.anamnesa")||"-"],["Planning",_.get(t,"soapDokter.planning")||"-"]]}},_.get(t,"soapDokter.diagnosa")&&[{text:"\nDiagnosa",alignment:"center"},{table:{widths:["*","auto"],body:[["Teks","ICD10"],..._.get(t,"soapDokter.diagnosa").map(a=>[a.text,a.code||"-"])]}}],_.get(t,"soapDokter.tindakan")&&[{text:"\nTindakan",alignment:"center"},{table:{widths:["*","auto"],body:[["Nama Tindakan","ICD9-CM"],..._.get(t,"soapDokter.tindakan").map(a=>[lookReferences(a.idtindakan).nama,a.code||"-"])]}}],_.get(t,"soapDokter.obat")&&[{text:"\nObat",alignment:"center"},{table:{widths:["*","auto","auto"],body:[["Nama obat","Jumlah","Puyer"],..._.get(t,"soapDokter.obat").map(a=>[_.get(lookGoods(a.idbarang),"nama"),a.jumlah,a.puyer||"-"])]}}],_.get(t,"soapDokter.radio")&&[{text:"\nRadiologi",alignment:"center"},{table:{widths:["*","auto","auto"],body:[["Radiologi","No. Berkas","Diagnosa"],..._.get(t,"soapDokter.radio").map(a=>[_.get(lookReferences(a.idradio),"nama"),a.kode_berkas,a.diagnosa])]}}],_.get(t,"soapDokter.labor")&&[{text:"\nLaboratorium",alignment:"center"},{table:{widths:["*","auto"],body:[["Laboratorium","Diagnosa"],..._.get(t,"soapDokter.labor").map(a=>[_.get(lookReferences(a.idlabor),"nama"),a.hasil||"-"])]}}]].filter(Boolean):""].filter(Boolean)})).download("soap_"+a.no_mr),resep:(a,t)=>pdfMake.createPdf(defaultStyle({content:[kop,{text:"Salinan Resep\n\n",alignment:"center",bold:!0},{table:{widths:["*","auto","auto","auto","auto","auto"],body:[["Nama Obat","Jumlah","Kali","Dosis","Puyer","Harga"],...[...a].map(a=>[a.nama_barang,a.serahkan+" unit",_.get(a,"aturan.kali")||"-",_.get(a,"aturan.dosis")||"-",a.puyer||"-",rupiah(a.harga||a.jual)]),["Total","","","","",rupiah(_.sum(a.map(a=>a.harga||a.jual)))]]}},{alignment:"justify",columns:[{text:"",alignment:"center"},{text:"\nPangkalan Kuras, "+hari(_.now())+"\n\n\n\n__________________\n"+state.login.nama,alignment:"center"}]},{text:"\n\n-------------------------------------potong disini------------------------------------------",alignment:"center"},{text:"\nInstruksi penyerahan obat"},{table:{body:[["Nama Barang","No. Batch","Jumlah"],...a.map(a=>[a.nama_barang,a.no_batch,a.serahkan])]}}]})).download("salinan_resep_"+t),report:(a,t,e)=>pdfMake.createPdf(defaultStyle({pageOrientation:"landscape",defaultStyle:{fontSize:10},content:[kop,{text:a,alignment:"center",bold:!0},e&&{text:e+"\n\n",alignment:"center",bold:!0},{table:{widths:_.range(t[0].length).map(a=>"*"),body:t}}]})).download("laporan_"+a),regQueue:a=>pdfMake.createPdf(defaultStyle({content:[{text:a+1}],pageSize:"B8"})).download("antrian_pendaftaran_"+(a+1)),radio:(a,t)=>pdfMake.createPdf(defaultStyle({content:[kop,{text:"Hasil Diagnosa Radiologist",fontSize:15,bold:!0,alignment:"center"},"\n\n",{table:{widths:["auto","*"],body:[["Nama Pasien",": "+a.nama_lengkap],["No. MR",": "+a.no_mr],["Petugas",": "+lookUser(t.petugas)],["Kode berkas",": "+t.kode_berkas]]},layout:"noBorders"},"\n\n",t.diagnosa,"\n\n\n",{alignment:"justify",columns:[{text:"\n\n\n\n__________________\nPasien",alignment:"center"},{text:"Pangkalan Kuras, "+hari(_.now())+"\n\n\n\n__________________\n"+lookUser(t.petugas),alignment:"center"}]}]})).download("hasil_radiologi_"+a.no_mr+"_"+t.kode_berkas),labor:(a,t)=>pdfMake.createPdf(defaultStyle({content:[kop,{text:"Hasil Diagnosa Laborat",fontSize:15,bold:!0,alignment:"center"},"\n\n",{table:{widths:["auto","*"],body:[["Nama uji laboratorium","Hasil"],...t.map(a=>[_.get(lookReferences(a.idlabor),"nama"),a.hasil])]}},"\n\n\n",{alignment:"justify",columns:[{text:"\n\n\n\n__________________\nPasien",alignment:"center"},{text:"Pangkalan Kuras, "+hari(_.now())+"\n\n\n\n__________________\nPetugas",alignment:"center"}]}]})).download("hasil_labor_"+a.no_mr)};_.assign(comp,{registration:()=>1!==state.login.bidang?m("p","Hanya untuk user pendaftaran"):m(".content",m("h1","Pencarian Pasien"),m(".control.is-expanded",m("input.input.is-fullwidth",{type:"text",placeholder:"Cari dengan nama lengkap atau No. MR",onkeypress:a=>[ands(["Enter"===a.key,a.target.value.length>3])&&[state.loading=!0,m.redraw(),db.patients.filter(t=>_.includes(_.lowerCase(t.identitas.nama_lengkap)+t.identitas.no_mr,a.target.value)).toArray(a=>[_.assign(state,{searchPatients:a,loading:!1}),m.redraw()])]]})),m("br"),state.loading&&m("progress.progress.is-small.is-primary"),state.searchPatients&&m("p.help","* Berurut berdasarkan tanggal lahir"),m(".box",m("table.table.is-striped",m("thead",m("tr",["Kunjungan Terakhir","No. MR","Nama lengkap","Tanggal lahir","Tempat lahir"].map(a=>m("th",a)))),m("tbody",(state.searchPatients||[]).sort((a,t)=>a.identitas.tanggal_lahir-t.identitas.tanggal_lahir).map(a=>m("tr",{ondblclick:()=>_.assign(state,{route:"onePatient",onePatient:a})},tds([hari(_.get(_.last([...a.rawatJalan||[],...a.emergency||[]]),"tanggal")),a.identitas.no_mr,a.identitas.nama_lengkap,hari(a.identitas.tanggal_lahir),a.identitas.tempat_lahir])))))),state.searchPatients&&m(".button.is-primary",{onclick:()=>_.assign(state,{route:"newPatient",searchPatients:null})},makeIconLabel("user-plus","Pasien baru"))),newPatient:()=>m(".content",m("h3","Pendaftaran Pasien Baru"),m(autoForm({id:"newPatient",schema:schemas.identitas,confirmMessage:"Yakin ingin menambahkan pasien BARU?",action:a=>withThis({identitas:a,_id:randomId()},t=>[insertBoth("patients",t),a.no_antrian&&db.queue.toArray(t=>withThis(t.find(t=>t.no_antrian===a.no_antrian),a=>updateBoth("queue",a._id,_.merge(a,{done:!0})))),_.assign(state,{route:"onePatient",onePatient:t})])}))),updatePatient:()=>m(".content",m("h3","Update identitas pasien"),m(autoForm({id:"updatePatient",schema:schemas.identitas,doc:state.onePatient.identitas,action:a=>[updateBoth("patients",state.onePatient._id,_.assign(state.onePatient,{identitas:a})),state.route="onePatient",m.redraw()]}))),poliVisit:()=>m(".content",m("h3","Form Pendaftaran Poli"),m(".box",m(autoForm({id:"poliVisit",autoReset:!0,schema:schemas.rawatJalan,confirmMessage:"Yakin untuk mendaftarkan pasien ke klinik?",action:a=>db.patients.filter(a=>a.rawatJalan&&a.rawatJalan.filter(a=>ands([1===a.klinik,a.tanggal>startOfTheDay(+moment())])).length).toArray(t=>[updateBoth("patients",state.onePatient._id,_.assign(state.onePatient,{rawatJalan:[...state.onePatient.rawatJalan||[],_.merge(a,{antrian:t.length+1})]})),a.no_antrian&&db.queue.toArray(t=>withThis(t.find(t=>t.no_antrian===a.no_antrian),a=>updateBoth("queue",a._id,_.merge(a,{done:!0})))),state.route="onePatient",m.redraw()])}))))}),_.assign(comp,{onePatient:()=>withThis(state.onePatient.identitas,a=>m(".content",{onupdate:()=>[db.references.toArray(a=>state.references=a),db.goods.toArray(a=>state.goodsList=a),db.users.toArray(a=>state.userList=a)]},m("h3","Rekam Medik Pasien"),m(".box",m("table.table.is-striped",_.chunk([["No. MR",a.no_mr],["Nama Lengkap",a.nama_lengkap],["Tanggal lahir",hari(a.tanggal_lahir)],["Tempat lahir",a.tempat_lahir],["Jenis kelamin",look("kelamin",a.kelamin)],["Agama",look("agama",a.agama)],["Status nikah",look("nikah",a.nikah)],["Pendidikan terakhir",look("pendidikan",a.pendidikan)],["Golongan Darah",look("darah",a.darah)],["Pekerjaan",look("pekerjaan",a.pekerjaan)],["Tempat tinggal",a.tempat_tinggal],["Umur",moment().diff(a.tanggal_lahir,"years")+" tahun"],["Nama Bapak",a.keluarga.ayah],["Nama Ibu",a.keluarga.ibu],["Nama Suami/Istri",a.keluarga.pasangan],["No. Handphone",a.kontak]],4).map(a=>m("tr",a.map(a=>[m("th",a[0]),m("td",a[1])]))))),m("p.buttons",[{label:"Cetak kartu",icon:"id-card",color:"info",click:()=>makePdf.card(a)},{label:"General consent",icon:"file-contract",color:"info",click:()=>makePdf.consent(a)},{label:"Update pasien",icon:"edit",color:"warning",click:()=>state.route="updatePatient"},{label:"Riwayat SOAP",icon:"bars",color:"info",click:()=>state.modalRekapSoap=m(".box",m("h3","Rekap SOAP Pasien"),m("p.help","Berurut kronologis"),[...state.onePatient.rawatJalan||[],...state.onePatient.emergency||[]].map(a=>m("table.table",a.soapPerawat&&a.soapDokter&&[["Tanggal Kunjungan",hari(a.tanggal,!0)],["Layanan",a.klinik?look("klinik",a.klinik):"Emergency"],["Anamnesa Perawat",a.soapPerawat.anamnesa],["Diagnosa Dokter",a.soapDokter.diagnosa.map(a=>a.text).join(", ")]].map(a=>m("tr",m("th",a[0]),m("td",a[1]))))))}].map(a=>m(".button.is-"+a.color,{onclick:a.click},makeIconLabel(a.icon,a.label)))),makeModal("modalRekapSoap"),m(".tabs.is-boxed",m("ul",{style:"margin-left: 0%"},_.map({outpatient:["Riwayat Rawat Jalan","walking"],emergency:["Riwayat IGD","ambulance"],inpatient:["Riwayat Rawat Inap","bed"]},(a,t)=>m("li",{class:ors([t===state.onePatientTab,ands([!state.onePatientTab,_.get(state,"login.poliklinik"),"outpatient"===t])])&&"is-active"},m("a",{onclick:()=>[state.onePatientTab=t,m.redraw()]},makeIconLabel(a[1],a[0])))))),m("div",{outpatient:comp.outPatientHistory(),emergency:comp.emergencyHistory(),inpatient:comp.inpatientHistory()}[state.onePatientTab||ors([_.get(state,"login.poliklinik")&&"outpatient"])]))),formSoap:()=>m(".content",{onupdate:()=>[db.goods.toArray(a=>_.assign(state,{goodsList:a,drugList:a.filter(a=>ands([1===a.jenis,a.batch.filter(a=>ands([a.stok.apotik,a.kadaluarsa>_.now()])).length])),bhpList:a.filter(a=>2===a.jenis)})),db.references.filter(a=>_.every(["rawatJalan"===a[0],a[1]===_.snakeCase(look("klinik",state.login.poliklinik))])).toArray(a=>state.daftarTindakan=a),db.references.filter(a=>"radiologi"===a[0]).toArray(a=>state.daftarRadio=a),state.spm=_.now()]},m("h3","Form SOAP"),m(autoForm({id:"soapMedis",autoReset:!0,confirmMessage:"Yakin untuk menyimpan SOAP?",schema:ors([2===state.login.peranan&&schemas.soapPerawat,3===state.login.peranan&&ors([state.oneInap&&_.merge(_.omit(schemas.soapDokter,["rujuk","keluar"]),schemas.gizi),schemas.soapDokter])]),action:a=>withThis(ands([!_.get(state,"oneInap"),_.get(state,"oneRawat.klinik")?"rawatJalan":"emergency"]),t=>[t&&updateBoth("patients",state.onePatient._id,_.assign(state.onePatient,{[t]:state.onePatient[t].map(t=>t.idrawat===state.oneRawat.idrawat?_.merge(state.oneRawat,ors([2===state.login.peranan&&{soapPerawat:a},3===state.login.peranan&&{soapDokter:a}])):t)})),state.oneInap&&updateBoth("patients",state.onePatient._id,_.assign(state.onePatient,{rawatInap:state.onePatient.rawatInap.map(t=>t.idinap===state.oneInap.idinap?_.assign(state.oneInap,{observasi:state.oneInap.observasi.concat([_.merge(a,{tanggal:_.now(),idobservasi:randomId()})])}):t)})),ands([2===a.keluar,a.rujuk])&&updateBoth("patients",state.onePatient._id,_.assign(state.onePatient,{rawatJalan:[...state.onePatient.rawatJalan||[],_.assign(_.pick(state.oneRawat,["cara_bayar","sumber_rujukan","penanggungjawab","no_sep"]),{idrawat:randomId(),tanggal:_.now(),klinik:a.rujuk})]})),_.assign(state,{route:"onePatient",oneRawat:null,oneInap:null}),m.redraw()])})))}),_.assign(comp,{icd:()=>1!==state.login.bidang?m("p","Hanya untuk bidang Pendaftaran/ICD"):m(".content",m("h3","Kodifikasi Diagnosa ICD 10 & ICD 9-CM"),m(".box",m("table.table.is-striped",m("thead",m("tr",["Nama pasien","Tanggal kunjungan","Layanan","Perawat","Dokter","ICD10","ICD9CM"].map(a=>m("th",a)))),m("tbody",{onupdate:()=>[db.patients.toArray(a=>state.codifications=_.compact(a.flatMap(a=>[...a.rawatJalan||[],...a.emergency||[],...a.rawatInap?a.rawatInap.flatMap(a=>a.observasi?a.observasi.map(t=>t.dokter&&{idinap:a.idinap,soapDokter:t,tanggal:a.tanggal_masuk}):[]):[]].flatMap(t=>[..._.get(t,"soapDokter.diagnosa")||[],..._.get(t,"soapDokter.tindakan")||[]].filter(a=>!a.code).length&&{pasien:a,rawat:t})))),db.references.toArray(a=>state.references=a)]},(state.codifications||[]).sort((a,t)=>a.rawat.tanggal-t.rawat.tanggal).map(({pasien:a,rawat:t})=>m("tr",m("td",a.identitas.nama_lengkap),m("td",hari(t.tanggal)),m("td",ors([t.klinik&&look("klinik",t.klinik),t.idrawat&&"IGD","Rawat Inap"])),m("td",lookUser(_.get(t,"soapPerawat.perawat"))),m("td",lookUser(t.soapDokter.dokter)),m("td",m(".button",{onclick:()=>state.modalICD10=m(".box",m("h4","Form kodifikasi diagnosa ICD10"),m("form",{onsubmit:e=>confirm("Yakin dengan ICD ini?")&&withThis(t.idrawat&&t.klinik?"rawatJalan":"emergency",n=>[e.preventDefault(),t.idrawat?updateBoth("patients",a._id,_.assign({_id:a._id,identitas:a.identitas,rawatJalan:a.rawatJalan||[],emergency:a.emergency||[],rawatInap:a.rawatInap||[]},{[n]:a[n].map(a=>a.idrawat===t.idrawat?_.assign(a,{soapDokter:_.assign(a.soapDokter,{diagnosa:a.soapDokter.diagnosa.map((a,t)=>({text:a.text,code:_.compact(_.map(e.target,a=>a.name&&a.value))[t]}))})}):a)}),a=>a&&[state.codifications=[],m.redraw()]):updateBoth("patients",a._id,{_id:a._id,identitas:a.identitas,rawatJalan:a.rawatJalan||[],emergency:a.emergency||[],rawatInap:a.rawatInap.map(a=>a.idinap===t.idinap?_.assign(a,{observasi:a.observasi.map(a=>a.idobservasi===t.soapDokter.idobservasi?_.assign(a,{diagnosa:a.diagnosa.map((a,t)=>({text:a.text,code:_.compact(_.map(e.target,a=>a.name&&a.value))[t]}))}):a)}):a)},a=>a&&[state.codifications=[],m.redraw()]),state.modalICD10=null,m.redraw()])},m("table.table",m("thead",m("tr",m("th","Teks"),m("th","Kode"))),m("tbody",t.soapDokter.diagnosa.map((a,t)=>m("tr",m("td",a.text),m("td",m("input.input",{type:"text",name:t,value:a.code})))))),m("input.button.is-primary",{type:"submit",value:"Submit"})))},_.every((_.get(t,"soapDokter.diagnosa")||[]).map(a=>a.code))?"Selesai":"Belum")),m("td",t.soapDokter.tindakan&&m(".button",{onclick:()=>state.modalICD9=m(".box",m("h4","Form kodifikasi tindakan ICD9"),m("form",{onsubmit:e=>confirm("Yakin dengan ICD ini?")&&withThis(t.idrawat&&t.klinik?"rawatJalan":"emergency",n=>[e.preventDefault(),t.idrawat?updateBoth("patients",a._id,_.assign({_id:a._id,identitas:a.identitas,rawatJalan:a.rawatJalan||[],emergency:a.emergency||[],rawatInap:a.rawatInap||[]},{[n]:a[n].map(a=>a.idrawat===t.idrawat?_.assign(a,{soapDokter:_.assign(a.soapDokter,{tindakan:a.soapDokter.tindakan.map((a,t)=>({text:a.idtindakan,code:_.compact(_.map(e.target,a=>a.name&&a.value))[t]}))})}):a)}),a=>a&&[state.codifications=[],m.redraw()]):updateBoth("patients",a._id,{_id:a._id,identitas:a.identitas,rawatJalan:a.rawatJalan||[],emergency:a.emergency||[],rawatInap:a.rawatInap.map(a=>a.idinap===t.idinap?_.assign(a,{observasi:a.observasi.map(a=>a.idobservasi===t.soapDokter.idobservasi?_.assign(a,{tindakan:a.tindakan.map((a,t)=>({text:a.text,code:_.compact(_.map(e.target,a=>a.name&&a.value))[t]}))}):a)}):a)},a=>a&&[state.codifications=[],m.redraw()]),state.modalICD9=null,m.redraw()])},m("table.table",m("thead",m("tr",m("th","Teks"),m("th","Kode"))),m("tbody",(_.get(t,"soapDokter.tindakan")||[]).map((a,t)=>m("tr",m("td",lookReferences(a.idtindakan).nama),m("td",m("input.input",{type:"text",name:t,value:a.code})))))),m("input.button.is-primary",{type:"submit",value:"Submit"})))},_.every((_.get(t,"soapDokter.tindakan")||[]).map(a=>a.code))?"Selesai":"Belum"))))))),makeModal("modalICD10"),makeModal("modalICD9"))}),_.assign(comp,{outpatient:()=>_.includes([2,3],state.login.peranan)?m(".content",reports.outpatient(),m("h3","Antrian pasien poliklinik "+look("klinik",state.login.poliklinik)),m(".box",m("table.table.is-striped",m("thead",m("tr",["Kunjungan Terakhir","No. MR","Nama lengkap","Tanggal lahir","Tempat lahir"].map(a=>m("th",a)))),m("tbody",{onupdate:()=>db.patients.toArray(a=>state.clinicQueue=a.filter(a=>withThis(_.last(a.rawatJalan),a=>a&&ands([a.klinik===state.login.poliklinik,!a.soapDokter]))))},(state.clinicQueue||[]).sort((a,t)=>withThis(a=>_.get(_.last(a.rawatJalan),"tanggal"),e=>e(a)-e(t))).map(a=>m("tr",{ondblclick:()=>_.assign(state,{route:"onePatient",onePatient:a})},tds([hari(_.get(_.last(a.rawatJalan),"tanggal"),!0),a.identitas.no_mr,a.identitas.nama_lengkap,hari(a.identitas.tanggal_lahir),a.identitas.tempat_lahir]))))))):m("p","Hanya untuk tenaga medis"),outPatientHistory:()=>m(".content",m(".box",m("table.table.is-striped",{onupdate:()=>dbCall({method:"findOne",collection:"patients",_id:state.onePatient._id},a=>a&&db.patients.put(a))},m("thead",m("tr",["Tanggal berobat","Poliklinik","Cara bayar","Perawat","Dokter"].map(a=>m("th",a)),4===state.login.peranan&&m("th","Hapus"))),m("tbody",(_.get(state.onePatient,"rawatJalan")||[]).map(a=>m("tr",{ondblclick:()=>[state.modalVisit=_.includes([2,3,4],state.login.peranan)&&ors([1!==a.cara_bayar,a.bayar_pendaftaran])&&m(".box",m("h3","Rincian Kunjungan Rawat Jalan"),m("table.table",m("tr",m("th","Tanggal"),m("td",hari(a.tanggal,!0))),m("tr",m("th","Poliklinik"),m("td",look("klinik",a.klinik))),m("tr",m("th","Cara bayar"),m("td",look("cara_bayar",a.cara_bayar))),makeRincianSoapPerawat(a.soapPerawat),makeRincianSoapDokter(a.soapDokter)),m("p.buttons",ands([1!==state.login.peranan,ors([2===state.login.peranan&&!a.soapPerawat,3===state.login.peranan&&!a.soapDokter]),m(".button.is-success",{onclick:()=>_.assign(state,{route:"formSoap",oneRawat:a,modalVisit:null})},makeIconLabel("user-md",3===state.login.peranan?"Soap Dokter":"Soap Perawat"))]),m(".button.is-info",{onclick:()=>makePdf.soap(state.onePatient.identitas,a)},makeIconLabel("print","Cetak SOAP")),_.get(a.soapDokter,"labor")&&m(".button.is-info",{onclick:()=>makePdf.labor(state.onePatient.identitas,a.soapDokter.labor)},makeIconLabel("print","Cetak Labor"))))]},tds([hari(a.tanggal),look("klinik",a.klinik),look("cara_bayar",a.cara_bayar),lookUser(_.get(a,"soapPerawat.perawat")),lookUser(_.get(a,"soapDokter.dokter"))]),ands([4===state.login.peranan,!a.bayar_konsultasi])&&m("td",m(".button.is-danger",{"data-tooltip":"klik ganda bila yakin hapus",ondblclick:t=>[t.stopPropagation(),updateBoth("patients",state.onePatient._id,_.assign(state.onePatient,{rawatJalan:state.onePatient.rawatJalan.filter(t=>t.idrawat!==a.idrawat)}))]},makeIconLabel("trash-alt","Hapus")))))))),m("p.help.has-text-grey-light","Note: Jika pasien umum belum bayar maka tidak dapat diklik"),makeModal("modalVisit"),1===state.login.bidang&&m(".button.is-success",{onclick:()=>state.route="poliVisit"},makeIconLabel("file-invoice","Kunjungi Rawat Jalan")))}),_.assign(comp,{inpatient:()=>_.includes([2,3],state.login.peranan)?m(".content",reports.inpatient(),m("h3","Daftar Admisi Rawat Inap"),m(".box",m("table.table.is-striped",{onupdate:()=>db.patients.toArray(a=>state.admissionList=_.compact(a.flatMap(a=>[...a.rawatJalan||[],...a.emergency||[]].flatMap(t=>ands([3===_.get(t,"soapDokter.keluar"),0===(a.rawatInap||[]).filter(a=>a.idrawat===t.idrawat).length,{pasien:a,inap:t}])))))},m("thead",m("tr",["No. MR","Nama Pasien","Tanggal admisi","Sumber admisi","Dokter"].map(a=>m("th",a)))),m("tbody",(state.admissionList||[]).sort((a,t)=>withThis(a=>_.get(a.inap,"tanggal"),e=>e(a)-e(t))).map(a=>m("tr",{ondblclick:()=>[state.admissionModal=m(".box",m("h4","Inapkan pasien"),m("table.table",[["Nama Lengkap",a.pasien.identitas.no_mr],["Cara bayar",look("cara_bayar",a.inap.cara_bayar)],["Anamnesa Perawat",_.get(a,"inap.soapPerawat.anamnesa")],["Anamnesa Dokter",_.get(a,"inap.soapDokter.anamnesa")]].map(a=>m("tr",m("th",a[0]),m("td",a[1])))),m(autoForm({id:"formBed",schema:schemas.beds,action:t=>[updateBoth("patients",a.pasien._id,_.assign(a.pasien,{rawatInap:[...a.pasien.rawatInap||[],{tanggal_masuk:_.now(),dokter:a.inap.soapDokter.dokter,observasi:[],idinap:randomId(),idrawat:a.inap.idrawat,cara_bayar:a.inap.cara_bayar,bed:t}]})),_.assign(state,{admissionList:null,admissionModal:null}),m.redraw()]}))),m.redraw()]},tds([a.pasien.identitas.no_mr,a.pasien.identitas.nama_lengkap,hari(a.inap.tanggal,!0),_.get(a.inap,"klinik")?"Rawat Jalan":"IGD",lookUser(_.get(a.inap,"soapDokter.dokter"))])))))),makeModal("admissionModal"),m("br"),m("h3","Daftar Pasien Menginap"),m("p.help","* Urut berdasarkan tanggal masuk terbaru"),m(".box",m("table.table.is-striped",{onupdate:()=>db.patients.toArray(a=>[state.inpatientList=a.filter(a=>a.rawatInap&&a.rawatInap.filter(a=>!a.keluar).length>0),m.redraw()])},m("thead",m("tr",["No. MR","Nama Pasien","Kelas / Kamar / Nomor","Tanggal Masuk"].map(a=>m("th",a)))),m("tbody",(state.inpatientList||[]).sort((a,t)=>withThis(a=>_.get(_.last(a.rawatInap),"tanggal_masuk"),e=>e(t)-e(a))).map(a=>withThis(_.get(_.last(a.rawatInap),"bed"),t=>t&&m("tr",{ondblclick:()=>_.assign(state,{route:"onePatient",onePatient:a,onePatientTab:"inpatient"})},tds([a.identitas.no_mr,a.identitas.nama_lengkap,[_.upperCase(t.kelas),_.startCase(t.kamar),t.nomor].join(" / "),hari(_.get(_.last(a.rawatInap),"tanggal_masuk"),!0)])))))))):m("p","Hanya untuk tenaga medis"),inpatientHistory:()=>m(".content",m(".box",m("table.table.is-striped",m("thead",m("tr",["Tanggal masuk","Kelas / Kamar / Nomor"].map(a=>m("th",a)))),m("tbody",(state.onePatient.rawatInap||[]).map(a=>m("tr",{ondblclick:()=>state.modalObservasi=_.includes([2,3,4],state.login.peranan)&&m(".box",m("h3","Riwayat Observasi"),Boolean(a.observasi.length)&&m("p.help.is-italic.has-text-info","klik-ganda pada salah satu observasi untuk melihat rincian"),m("table.table",m("thead",m("tr",["Waktu","Anamnesa","Petugas"].map(a=>m("th",a)))),m("tbody",a.observasi.map(a=>m("tr",{ondblclick:()=>[state.modalObservasi=null,state.modalSoap=m(".box",m("h4","Rincian SOAP"),m("table.table",m("tr",m("th","Waktu observasi"),m("td",hari(a.tanggal,!0))),a.diagnosa?makeRincianSoapDokter(a):makeRincianSoapPerawat(a)),m(".button.is-info",{onclick:()=>makePdf.soap(state.onePatient.identitas,a.perawat?{soapPerawat:a}:{soapDokter:a})},makeIconLabel("print","Cetak SOAP"))),m.redraw()]},tds([hari(a.tanggal),a.anamnesa,lookUser(a.perawat||a.dokter)]))))),!a.keluar&&m("p.buttons",m(".button.is-success",{onclick:()=>[_.assign(state,{route:"formSoap",oneInap:a,modalObservasi:null}),m.redraw()]},makeIconLabel("user-md","Tambah observasi")),m(".button.is-danger",{ondblclick:()=>[updateBoth("patients",state.onePatient._id,_.assign(state.onePatient,{rawatInap:state.onePatient.rawatInap.map(t=>t.idinap===a.idinap?_.assign(t,{keluar:_.now()}):t)})),state.modalObservasi=null,m.redraw()]},makeIconLabel("door-open","Pulangkan pasien"))))},makeModal("modalSoap"),tds([hari(a.tanggal_masuk),a.bed&&[_.upperCase(a.bed.kelas),_.startCase(a.bed.kamar),a.bed.nomor].join(" / ")])))))),makeModal("modalObservasi")),beds:()=>ors([_.includes([2,3],state.login.peranan),_.includes([1],state.login.bidang)])?m(".content",m("h3","Daftar Ketersediaan Bed"),m(".box",m("table.table.is-striped",{onupdate:()=>db.patients.toArray(a=>[state.inpatientList=a.filter(a=>a.rawatInap&&a.rawatInap.filter(a=>!a.keluar).length>0),m.redraw()])},m("tr",["Kelas","Kamar","No. Bed","Penginap"].map(a=>m("th",a))),state.inpatientList&&_.flattenDepth(_.map(beds,(a,t)=>_.map(a.kamar,(a,e)=>_.range(a).map(a=>[t,e,a+1,_.get(state.inpatientList.find(n=>n.rawatInap.find(n=>n.bed&&ands([n.bed.kelas===t,n.bed.kamar===e,n.bed.nomor===a+1]))),"identitas.nama_lengkap")]))),2).map(a=>m("tr",a.map(a=>m("td",_.upperCase(a)))))))):m("p","Hanya untuk tenaga medis")});var beds={vip:{tarif:350,kamar:{tulip:1,bougenvil:1,sakura:1}},kl1:{tarif:200,kamar:{kenanga:2,cempaka:2,claudia:2,ferbia:2,yasmin:2,edelwise:2}},kl2:{tarif:150,kamar:{seroja:3,mawar:2,dahlia:2,lili:2,zahara:2,matahari:4}},kl3:{tarif:100,kamar:{anggrek:4,teratai:7,kertas:3,melati:5}}};_.assign(comp,{emergency:()=>_.includes([2,3],state.login.peranan)?m(".content",{onupdate:()=>db.patients.toArray(a=>state.emergencyList=a.filter(a=>a.emergency&&a.emergency.filter(a=>!a.soapDokter).length>0))},reports.igd(),m("h3","Unit Gawat Darurat"),m(".box",m("table.table.is-striped",m("thead",m("tr",["No. MR","Nama Pasien","Jam Masuk"].map(a=>m("th",a)))),m("tbody",state.emergencyList&&state.emergencyList.sort((a,t)=>withThis(a=>_.get(_.last(a.emergency),"tanggal"),e=>e(a)-e(t))).map(a=>m("tr",{ondblclick:()=>[_.assign(state,{route:"onePatient",onePatient:a,onePatientTab:"emergency"}),m.redraw()]},m("td",a.identitas.no_mr),m("td",a.identitas.nama_lengkap),m("td",hari(_.get(_.last(a.emergency),"tanggal"),!0)))))))):m("p","Hanya untuk tenaga medis"),emergencyHistory:()=>m(".content",m(".box",m("table.table",m("thead",m("tr",["Tanggal berobat","Cara bayar","Perawat","Dokter"].map(a=>m("th",a)),4===state.login.peranan&&m("th","Hapus"))),m("tbody",(_.get(state,"onePatient.emergency")||[]).map(a=>m("tr",{ondblclick:()=>state.modalVisit=m(".box",m("h4","Rincian kunjungan IGD"),m("table.table",m("tr",m("th","Tanggal berobat"),m("td",hari(a.tanggal))),m("tr",m("th","Cara bayar"),m("td",look("cara_bayar",a.cara_bayar))),m("tr",m("th","Perawat"),m("td",lookUser(_.get(a,"soapPerawat.perawat")))),m("tr",m("th","Dokter"),m("td",lookUser(_.get(a,"soapDokter.dokter")))),makeRincianSoapPerawat(a.soapPerawat),makeRincianSoapDokter(a.soapDokter)),m("p.buttons",ands([1!==state.login.peranan,ors([2===state.login.peranan&&!a.soapPerawat,3===state.login.peranan&&!a.soapDokter]),m(".button.is-success",{onclick:()=>_.assign(state,{route:"formSoap",oneRawat:a,modalVisit:null})},makeIconLabel("user-md",3===state.login.peranan?"Soap Dokter":"Soap Perawat"))]),m(".button.is-info",{onclick:()=>makePdf.soap(state.onePatient.identitas,a)},makeIconLabel("print","Cetak SOAP"))))},tds([hari(a.tanggal),look("cara_bayar",a.cara_bayar),lookUser(_.get(a,"soapPerawat.perawat")),lookUser(_.get(a,"soapDokter.dokter"))]),ands([4===state.login.peranan,!a.bayar_konsultasi])&&m("td",m(".button.is-danger",{"data-tooltip":"klik ganda bila yakin hapus",ondblclick:t=>[t.stopPropagation(),updateBoth("patients",state.onePatient._id,_.assign(state.onePatient,{emergency:state.onePatient.emergency.filter(t=>t.idrawat!==a.idrawat)}))]},makeIconLabel("trash-alt","Hapus")))))))),1===state.login.bidang&&m(".button.is-success",{onclick:()=>state.route="igdVisit"},makeIconLabel("file-invoice","Kunjungi IGD")),makeModal("modalVisit")),igdVisit:()=>m(".content",m("h3","Form pendaftaran IGD"),m(".box",m(autoForm({id:"igdVisit",autoReset:!0,schema:_.omit(schemas.rawatJalan,"klinik"),confirmMessage:"Yakin untuk mendaftarkan pasien ke IGD?",action:a=>[updateBoth("patients",state.onePatient._id,_.assign(state.onePatient,{emergency:[..._.get(state,"onePatient.emergency")||[],a]})),state.route="onePatient",m.redraw()]}))))}),_.assign(comp,{storage:()=>ors([_.includes([3,4],state.login.bidang),_.includes([2,3],state.login.peranan)])?m(".content",{onupdate:()=>db.goods.toArray(a=>[state.goodsList=a,m.redraw()])},m("h1","Gudang Farmasi"),m(".field.has-addons",m(".control.is-expanded",m("input.input.is-fullwidth",{type:"text",placeholder:"cari barang...",onkeypress:a=>db.goods.filter(t=>_.includes(_.lowerCase(t.nama+" "+t.kandungan),a.target.value)).toArray(a=>[state.searchGoods=a,m.redraw()])})),m(".control",m("a.button.is-info",{onclick:()=>state.searchGoods=null},"Show All"))),m(".box",m("table.table.is-striped",m("thead",m("tr",["Jenis","Nama","Satuan","Gudang","Apotik","Retur"].map(a=>m("th",a)))),m("tbody",(state.searchGoods||state.goodsList||[]).map(a=>m("tr",{ondblclick:()=>_.assign(state,{route:"oneGood",oneGood:a})},tds([look("jenis_barang",+a.jenis),a.nama,look("satuan",a.satuan)]),a.batch&&["gudang","apotik","retur"].map(t=>withThis(_.sum(a.batch.map(a=>_.get(a.stok,t)||0)),e=>m("td",{class:e_.assign(state,{route:"formGood",oneGood:null})},makeIconLabel("plus","Tambah barang"))):m("p","Hanya untuk user farmasi, apotik dan petugas medis"),formGood:()=>m(".content",m("h3","Form input jenis barang baru"),m(autoForm({id:"formGood",schema:schemas.barang,confirmMessage:"Yakin untuk menyimpan JENIS barang baru?",doc:state.oneGood,action:a=>withThis(_.assign(state.oneGood||{},a,{_id:_.get(state,"oneGood._id")||randomId()}),a=>[state.oneGood?updateBoth("goods",state.oneGood._id,a):insertBoth("goods",a),_.assign(state,{route:"oneGood",oneGood:a})])}))),oneGood:()=>m(".content",{oncreate:()=>[db.users.toArray(a=>state.userList=a),dbCall({method:"findOne",collection:"goods",_id:state.oneGood._id},a=>a&&db.goods.put(a))]},m("h3","Rincian barang"),m(".box",m("table.table.is-striped",_.chunk([["Nama barang",state.oneGood.nama],["Jenis barang",look("jenis_barang",state.oneGood.jenis)],["Kode Rak",state.oneGood.kode_rak],["Antibiotik",look("boolean",_.get(state.oneGood,"kriteria.antibiotik"))],["Narkotika",look("boolean",_.get(state.oneGood,"kriteria.narkotika"))],["Psikotropika",look("boolean",_.get(state.oneGood,"kriteria.psikotropika"))],["Fornas",look("boolean",_.get(state.oneGood,"kriteria.fornas"))],["Min. Gudang",_.get(state,"oneGood.stok_minimum.gudang")],["Min. Apotik",_.get(state,"oneGood.stok_minimum.apotik")],["Kandungan",state.oneGood.kandungan],["Satuan",look("satuan",state.oneGood.satuan)]],3).map(a=>m("tr",a.map(a=>[m("th",a[0]),m("td",a[1])]))))),3===state.login.bidang&&m(".buttons",m(".button.is-primary",{onclick:()=>state.route="formBatch"},m("span.icon",m("i.fas.fa-plus-circle")),m("span","Tambah batch")),m(".button.is-warning",{onclick:()=>state.route="formGood"},m("span.icon",m("i.fas.fa-edit")),m("span","Edit obat")),4===state.login.peranan&&[m(".button.is-danger",{"data-tooltip":"Kosongkan semua batch barang ini",ondblclick:()=>[confirm("Yakin untuk stok opname jenis barang ini?")&&updateBoth("goods",state.oneGood._id,_.assign(state.oneGood,{batch:[]})),state.route="storage",m.redraw()]},m("span.icon",m("i.fas.fa-recycle")),m("span","Stok Opname")),m(".button.is-danger",{"data-tooltip":"Menghapus barang dapat merusak riwayat transaksi yang berhubungan dengan barang ini",ondblclick:()=>[confirm("Yakin untuk menghapus jenis barang?")&&deleteBoth("goods",state.oneGood._id,a=>a&&[state.route="storage",m.redraw()])]},m("span.icon",m("i.fas.fa-trash-alt")),m("span","Hapus barang"))]),m("p"),m("h4","Daftar batch barang ini"),m(".box",m("table.table.is-striped",m("thead",m("tr",["No. Batch","Merek","Tanggal Masuk","Tanggal Kadaluarsa","Gudang","Apotik","Retur"].map(a=>m("th",a)))),m("tbody",(state.oneGood.batch||[]).map(a=>m("tr",{class:+moment()>a.kadaluarsa&&"has-text-danger",ondblclick:()=>_.assign(state,{oneBatch:a,modalBatch:m(".box",m("h4","Rincian batch"),m("table.table",_.chunk([["No. Batch",a.no_batch],["Merek",a.merek],["Tanggal masuk",hari(a.masuk)],["Tanggal kadaluarsa",hari(a.kadaluarsa)],["Harga beli",rupiah(a.harga.beli)],["Harga jual",rupiah(a.harga.jual)],["Stok Gudang",a.stok.gudang],["Stok Apotik",_.get(a,"stok.apotik")],["Jumlah Diretur",_.get(a,"stok.retur")],["Nama supplier",_.get(a,"sumber.supplier")],["Anggaran",_.get(a,"sumber.anggaran")],["No. SPK",_.get(a,"sumber.no_spk")],["Tanggal SPK",hari(_.get(a,"sumber.tanggal_spk"))],["Petugas",lookUser(a.petugas)]],2).map(a=>m("tr",a.map(a=>[m("th",a[0]),m("td",a[1])])))),ands([4===state.login.peranan,3===state.login.bidang])&&m("p.buttons",!_.get(a,"stok.retur")&&m(".button.is-warning",{"data-tooltip":"Pindahkan semua stok barang ini ke Retur",ondblclick:()=>[updateBoth("goods",state.oneGood._id,_.assign(state.oneGood,{batch:state.oneGood.batch.map(t=>t.idbatch===a.idbatch?_.assign(t,{stok:{gudang:0,apotik:0,retur:(a.stok.gudang||0)+(a.stok.apotik||0)}}):t)})),state.modalBatch=null,m.redraw()]},m("span.icon",m("i.fas.fa-exchange-alt")),m("span","Retur batch")),m(".button.is-danger",{ondblclick:t=>[updateBoth("goods",state.oneGood._id,_.assign(state.oneGood,{batch:state.oneGood.batch.filter(t=>t.idbatch!==a.idbatch)})),state.modalBatch=null,m.redraw()]},m("span.icon",m("i.fas.fa-trash")),m("span","Hapus batch"))),m("br"),a.amprah&&m("div",m("h4","Riwayat Amprah"),m("table.table",m("thead",m("tr",["Peminta","Asal","Diminta","Diserah","Penyerah"].map(a=>m("th",a)))),m("tbody",a.amprah.map(a=>m("tr",tds([lookUser(a.peminta),look("bidang",a.ruangan),a.diminta,a.diserah,lookUser(a.penyerah)])))))),m("br"),ands([ors([_.includes([4],state.login.bidang),_.includes([2,3],state.login.peranan)]),a.stok.gudang>1,[m("h4","Form amprah batch"),m(autoForm({id:"formAmprah",schema:schemas.amprah,action:a=>[updateBoth("goods",state.oneGood._id,_.assign(state.oneGood,{batch:state.oneGood.batch.map(t=>t.idbatch===state.oneBatch.idbatch?_.assign(state.oneBatch,{amprah:[...state.oneBatch.amprah||[],a]}):t)})),state.modalBatch=null,m.redraw()]}))]]))})},tds([a.no_batch,a.merek,hari(a.masuk),hari(a.kadaluarsa),a.stok.gudang||0,a.stok.apotik||0,a.stok.retur||0])))))),makeModal("modalBatch")),formBatch:()=>m(".content",m("h3","Form tambah batch"),m(autoForm({id:"formBatch",schema:schemas.batch,confirmMessage:"Yakin untuk menambahkan batch obat ini?",action:a=>[updateBoth("goods",state.oneGood._id,_.assign(state.oneGood,{batch:[...state.oneGood.batch||[],a]})),state.route="oneGood"]})))}),_.assign(comp,{transfer:()=>ors([_.includes([3,4],state.login.bidang),_.includes([2,3],state.login.peranan)])?m(".content",m("h3","Daftar antrian amprah"),m(".box",m("table.table.is-striped",{onupdate:()=>[db.users.toArray(a=>state.userList=a),db.goods.toArray(a=>[state.transferList=a.reduce((a,t)=>t.batch?a.concat(t.batch.reduce((a,e)=>e.amprah?a.concat(e.amprah.reduce((a,n)=>a.concat([_.merge(n,{idbarang:t._id,nama_barang:t.nama,idbatch:e.idbatch,no_batch:e.no_batch,digudang:e.stok.gudang})]),[])):a,[])):a,[]),m.redraw()])]},m("thead",m("tr",["Nama barang","No. Batch","Peminta","Asal Ruangan","Jumlah minta","Tanggal diminta"].map(a=>m("th",a)))),m("tbody",state.transferList&&state.transferList.map(a=>m("tr",{ondblclick:()=>[3===state.login.bidang&&_.assign(state,{oneAmprah:a,modalResponAmprah:m(".box",m("h4","Respon permintaan barang"),m("table.table",m("thead",m("tr",["Nama barang","No. Batch","Stok gudang","Jumlah minta"].map(a=>m("th",a)))),m("tbody",m("tr",tds([a.nama_barang,a.no_batch,a.digudang,a.diminta])))),m(autoForm({id:"formResponAmprah",schema:schemas.responAmprah,action:t=>db.goods.get(a.idbarang,e=>[updateBoth("goods",a.idbarang,_.assign(e,{batch:e.batch.map(e=>e.idbatch===a.idbatch?_.assign(e,{stok:{gudang:e.stok.gudang-t.diserah,apotik:4===state.oneAmprah.ruangan?(e.stok.apotik||0)+t.diserah:e.stok.apotik},amprah:e.amprah.map(e=>e.idamprah===a.idamprah?_.assign(e,t):e)}):e)})),state.modalResponAmprah=null,m.redraw()])})))}),m.redraw()]},!a.penyerah&&tds([a.nama_barang,a.no_batch,lookUser(a.peminta),look("bidang",a.ruangan),a.diminta,hari(a.tanggal_minta,!0)])))),makeModal("modalResponAmprah"))),m("p"),m("h3","Daftar riwayat amprah"),m(".box",m("table.table.is-striped",m("thead",m("tr",["Nama barang","No. Batch","Peminta","Jumlah minta","Tanggal diminta","Penyerah","Jumlah serah","Tanggal serah"].map(a=>m("th",a)))),m("tbody",paginate(state.transferList||[],"transferList",100).sort((a,t)=>t.tanggal_serah-a.tanggal_serah).map(a=>m("tr",a.penyerah&&tds([a.nama_barang,a.no_batch,lookUser(a.peminta),a.diminta,hari(a.tanggal_minta,!0),lookUser(a.penyerah),a.diserah,hari(a.tanggal_serah,!0)])))))),m("div",comp.pagination("transferList",_.get(state,"transferList.length")/100))):m("p","Hanya untuk user farmasi, apotik dan petugas medis")}),_.assign(comp,{pharmacy:()=>4!==state.login.bidang?m("p","Hanya untuk user apotik"):m(".content",4===state.login.peranan&&reports.pharmacy(),m("h3","Apotik"),m(".box",m("table.table.is-striped",m("thead",m("tr",["No. MR","Nama Pasien","Tanggal berobat","Cara bayar","Layanan"].map(a=>m("th",a)))),m("tbody",{onupdate:()=>[db.patients.toArray(a=>[state.pharmacyList=_.compact(a.flatMap(a=>[...a.rawatJalan||[],...a.emergency||[],...a.rawatInap?_.compact(a.rawatInap.flatMap(a=>a.observasi&&a.observasi.flatMap(t=>_.assign({},t,a,{soapDokter:{obat:t.obat}})))):[]].flatMap(t=>withThis(ands([!_.get(t,"soapDokter.batal")||!_.includes(t.soapDokter.batal,"obat"),_.get(t,"soapDokter.obat")]),e=>withThis(e&&e.filter(a=>!a.diserah),e=>e&&0!==e.length&&{pasien:a,rawat:t,obats:e.map(a=>_.assign(a,{sisa:a.jumlah}))}))))),m.redraw()]),db.goods.toArray(a=>state.goodsList=a)]},(state.pharmacyList||[]).map(a=>m("tr",{ondblclick:()=>withThis([],t=>withThis({updatedGoods:a.obats.flatMap(a=>_.compact(state.goodsList.map(e=>e._id===a.idbarang&&_.assign(e,{batch:e.batch.filter(a=>ands([a.stok.apotik,a.kadaluarsa>_.now()])).sort((a,t)=>a.kadaluarsa-t.kadaluarsa).reduce((n,o)=>withThis(_.min([o.stok.apotik,a.sisa]),i=>i?ands([_.assign(a,{sisa:a.sisa-i}),t.push(_.merge({},a,{nama_barang:e.nama,no_batch:o.no_batch,serahkan:i,jual:i*o.harga.jual})),[...n,_.assign(o,{stok:_.assign(o.stok,{apotik:o.stok.apotik-i})})]]):[...n,o]),[])})))),updatedPatient:_.assign(a.pasien,{rawatJalan:(a.pasien.rawatJalan||[]).map(e=>e.idrawat===a.rawat.idrawat?_.assign(e,{soapDokter:_.assign(e.soapDokter,{obat:(e.soapDokter.obat||[]).map(a=>_.assign(a,{diserah:!0,harga:_.sum(t.filter(t=>t.idbarang===a.idbarang).map(a=>a.jual))})),apoteker:state.login._id})}):e),emergency:(a.pasien.emergency||[]).map(e=>e.idrawat===a.rawat.idrawat?_.assign(e,{soapDokter:_.assign(e.soapDokter,{obat:(e.soapDokter.obat||[]).map(a=>_.assign(a,{diserah:!0,harga:_.sum(t.filter(t=>t.idbarang===a.idbarang).map(a=>a.jual))}))})}):e),rawatInap:(a.pasien.rawatInap||[]).map(e=>e.idinap===a.rawat.idinap?_.assign(e,{observasi:e.observasi.map(e=>e.idobservasi===a.rawat.idobservasi?_.assign(e,{obat:e.obat.map(a=>_.assign(a,{diserah:!0,harga:_.sum(t.filter(t=>t.idbarang===a.idbarang).map(a=>a.jual))}))}):e)}):e)})},({updatedGoods:e,updatedPatient:n})=>state.modalSerahObat=m(".box",m("h4","Penyerahan obat"),m("table.table",m("thead",m("tr",["Nama obat","No. Batch","Merek","Ambil","Kali","Dosis","Puyer"].map(a=>m("th",a)))),m("tbody",t.map(a=>m("tr",[a.nama_barang,a.no_batch,a.merek,a.serahkan,a.aturan&&a.aturan.kali||"-",a.aturan&&a.aturan.dosis||"-",a.puyer||"-"].map(a=>m("td",a)))))),m("p.buttons",m(".button.is-info",{onclick:()=>makePdf.resep(t,n.identitas.no_mr)},makeIconLabel("print","Cetak salinan resep")),m(".button.is-primary",{ondblclick:()=>[updateBoth("patients",n._id,n),e.map(a=>updateBoth("goods",a._id,a)),state.modalSerahObat=null,m.redraw()]},makeIconLabel("check","Selesai")),m(".button.is-danger",{ondblclick:()=>updateBoth("patients",a.pasien._id,_.assign(a.pasien,{rawatJalan:(a.pasien.rawatJalan||[]).map(t=>t.idrawat===a.rawat.idrawat?_.assign(t,{soapDokter:_.merge(t.soapDokter,{batal:["obat"]})}):t),emergency:(a.pasien.emergency||[]).map(t=>t.idrawat===a.rawat.idrawat?_.assign(t,{soapDokter:_.merge(t.soapDokter,{batal:["obat"]})}):t),rawatInap:(a.pasien.rawatInap||[]).map(t=>t.idinap===a.rawat.idinap?_.assign(t,{observasi:t.observasi.map(t=>t.idobservasi===a.rawat.idobservasi?_.merge(t,{batal:["obat"]}):t)}):t)},a=>a&&[state.modalSerahObat=null,m.redraw()]))},makeIconLabel("times","Batal serah"))))))},[a.pasien.identitas.no_mr,a.pasien.identitas.nama_lengkap,hari(a.rawat.tanggal,!0),look("cara_bayar",a.rawat.cara_bayar),ors([a.rawat.klinik&&look("klinik",a.rawat.klinik),a.rawat.bed&&"Rawat Inap","IGD"])].map(a=>m("td",a)))),makeModal("modalSerahObat")))),m(".button.is-primary",{"data-tooltip":"Untuk menjual obat secara manual",onclick:()=>[_.assign(state,{route:"pharmacySale"}),m.redraw()]},makeIconLabel("cart-arrow-down","Penjualan Bebas"))),pharmacySale:()=>m(".content",m("h3","Penjualan Bebas Obat & BHP"),m(autoForm({id:"pharmacySale",oncreate:()=>db.goods.toArray(a=>_.assign(state,{goodsList:a,drugList:a.filter(a=>ands([1===a.jenis,a.batch.filter(t=>ands([t.stok.apotik>a.stok_minimum.apotik,t.kadaluarsa>_.now()])).length])),bhpList:a.filter(a=>2===a.jenis)})),schema:_.merge({idpenjualan:{type:String,autoform:{type:"hidden"},autoValue:()=>randomId()}},_.map(schemas.soapDokter,(a,t)=>ors([_.includes(t,"obat"),_.includes(t,"bhp")])&&{[t]:a}).filter(Boolean).reduce((a,t)=>_.merge(a,t),{})),action:a=>withThis({serahList:[],updatedGoods:[]},({serahList:t,updatedGoods:e})=>[e.push([...a.obat||[],...a.bhp||[]].flatMap(e=>state.goodsList.flatMap(n=>n._id===e.idbarang&&_.assign(n,{batch:n.batch.filter(a=>ands([a.stok.apotik,a.kadaluarsa>_.now()])).sort((a,t)=>a.kadaluarsa-t.kadaluarsa).reduce((o,i)=>[...o,e.jumlah?withThis(_.min([i.stok.apotik,e.jumlah]),o=>o?ands([t.push({nama:n.nama,no_batch:i.no_batch,jumlah:o,harga:i.harga.jual*o}),_.assign(e,{jumlah:e.jumlah-o}),_.assign(i,{stok:_.assign(i.stok,{apotik:i.stok.apotik-o}),penjualan:[...i.penjualan||[],{idpenjualan:a.idpenjualan,jumlah:o,tanggal:_.now(),user:state.login._id}]})]):i):i],[])})).filter(Boolean))),state.modalPenjualanBebas=m(".box",m("h3","Konfirmasi Penjualan"),m("table.table",m("thead",m("tr",["Nama Obat","No. Batch","Jumlah","Harga"].map(a=>m("th",a)))),m("tbody",[...t].map(a=>m("tr",tds([a.nama,a.no_batch,a.jumlah+" unit",rupiah(a.harga)])))),m("tr",tds([m("b","Total"),"","",rupiah(_.sum(t.map(a=>a.harga)))]))),m(".buttons",m(".button.is-info",{onclick:()=>makePdf.resep(t.map(a=>_.assign(a,{nama_barang:a.nama,serahkan:a.jumlah})),"bebas")},makeIconLabel("print","Cetak salinan resep")),m(".button.is-primary",{ondblclick:()=>e[0].map(a=>updateBoth("goods",a._id,a))},makeIconLabel("check","Serahkan"))))])})),makeModal("modalPenjualanBebas"))}),_.assign(comp,{cashier:()=>2!==state.login.bidang?m("p","Hanya untuk user bidang kasir"):m(".content",4===state.login.peranan&&reports.cashier(),m("h3","Loket Pembayaran"),m(".box",m("table.table.is-striped",m("thead",m("tr",["No. MR","Nama Lengkap","Tanggal","Layanan","Tambahan"].map(a=>m("th",a)))),m("tbody",{onupdate:()=>[withThis(a=>1===a.cara_bayar&&ors([a.klinik&&!a.bayar_pendaftaran,a.soapDokter&&!a.bayar_konsultasi,ands([a.bed,a.keluar,!a.bayar_konsultasi])]),a=>db.patients.filter(t=>[...t.rawatJalan||[],...t.emergency||[],...t.rawatInap||[]].filter(a).length).toArray(t=>state.cashierList=t.flatMap(t=>[...t.rawatJalan||[],...t.emergency||[],...t.rawatInap||[]].filter(a).map(a=>({pasien:t,rawat:a}))))),db.references.toArray(a=>state.references=a),db.goods.toArray(a=>state.goodsList=a)]},(state.cashierList||[]).sort((a,t)=>a.rawat.tanggal-t.rawat.tanggal).map(({pasien:a,rawat:t})=>m("tr",{ondblclick:()=>withThis([t.bed?[]:ands([1===[...a.rawatJalan||[],...a.emergency||[]].length,!t.bayar_pendaftaran,["Daftar pasien baru",tarifKartu]])||[],ors([!t.bayar_pendaftaran,!t.bayar_konsultasi,t.bed&&t.keluar])&&ors([t.klinik&&["Konsultasi Poli "+look("klinik",t.klinik),1e3*+look("tarif_klinik",t.klinik)],t.bed&&["Biaya Kamar",tarifInap(t.tanggal_masuk,t.keluar,beds[_.get(t.bed,"kelas")].tarif)],["Rawat IGD",tarifIGD]])||[],...ors([ands([t.klinik,t.soapDokter,!t.bayar_konsultasi]),ands([t.bed,t.keluar,!t.bayar_konsultasi]),ands([t.soapDokter,!t.bayar_konsultasi])])?[...[..._.get(t,"soapDokter.tindakan")||[],...(t.observasi||[]).flatMap(a=>a.tindakan||[])].map(a=>a.idtindakan?[lookReferences(a.idtindakan).nama,+lookReferences(a.idtindakan).harga]:[]),...[..._.get(t,"soapDokter.labor")||[],...(t.observasi||[]).flatMap(a=>a.labor||[])].map(a=>ands([a.idlabor,a.hasil])?[lookReferences(a.idlabor).nama,+lookReferences(a.idlabor).harga]:[]),...[..._.get(t,"soapDokter.radio")||[],...(t.observasi||[]).flatMap(a=>a.radio||[])].map(a=>ands([a.idradio,a.diagnosa])?[lookReferences(a.idradio).nama,+lookReferences(a.idradio).harga]:[]),...[..._.get(t,"soapDokter.obat")||[],...(t.observasi||[]).flatMap(a=>a.obat||[])].map(a=>a.idbarang?[state.goodsList.find(t=>t._id===a.idbarang).nama,a.harga]:[]),...[..._.get(t,"soapDokter.bhp")||[],...(t.observasi||[]).flatMap(a=>a.bhp||[])].map(a=>a.idbarang?withThis(state.goodsList.find(t=>t._id===a.idbarang),a=>[a.nama,a.batch.filter(a=>a.stok.apotik).sort((a,t)=>t.harga.jual-a.harga.jual)[0].harga.jual]):[])]:[]].filter(a=>a.length).map(a=>({item:a[0],harga:a[1]})),e=>state.modalCashier=m(".box",m("h3","Konfirmasi Pembayaran"),m("p",m("b",[a.identitas.nama_lengkap,a.identitas.no_mr].join(" / "))),m("table.table",withThis([...e,...t.charges||[]],a=>[a.map(a=>m("tr",m("th",a.item),m("td",rupiah(a.harga)))),m("tr",m("th","Total"),m("td",rupiah(_.sum(a.map(a=>a.harga)))))])),m(".buttons",m(".button.is-success",{ondblclick:()=>[updateBoth("patients",a._id,_.assign(a,{rawatJalan:(a.rawatJalan||[]).map(a=>a.idrawat===t.idrawat?_.assign(a,ors([a.soapDokter&&{bayar_konsultasi:!0,kasir:state.login._id},{bayar_pendaftaran:!0,kasir:state.login._id}])):a),emergency:(a.emergency||[]).map(a=>a.idrawat===t.idrawat?_.assign(a,{bayar_pendaftaran:!0,bayar_konsultasi:!0,kasir:state.login._id}):a),rawatInap:(a.rawatInap||[]).map(a=>a.idinap===t.idinap?_.assign(a,{bayar_pendaftaran:!0,bayar_konsultasi:!0,kasir:state.login._id}):a)})),[ors([t.soapDokter,t.observasi])&&makePdf.bayar_konsultasi(a,t,[...e,...t.charges||[]]),makePdf.bayar_pendaftaran(a,t,[...a.rawatJalan||[],...a.emergency||[]].length)],_.assign(state,{modalCashier:null,cashierList:[]}),m.redraw()]},makeIconLabel("check","Sudah bayar")),ors([t.soapDokter,t.observasi])&&m(".button.is-warning",{onclick:()=>_.assign(state,{modalCashier:null,route:"overcharge",onePatient:a,oneRawat:t})},makeIconLabel("plus",t.charges?"Ganti tambahan biaya":"Tambahan biaya")))))},tds([a.identitas.no_mr,a.identitas.nama_lengkap,hari(t.tanggal||t.tanggal_masuk),ors([t.klinik&&look("klinik",t.klinik),t.bed&&"Rawat Inap","IGD"]),t.charges?t.charges.length+" item":""])))))),makeModal("modalCashier")),overcharge:()=>m(".content",m(autoForm({id:"overcharge",schema:schemas.overcharge,action:a=>updateBoth("patients",state.onePatient._id,_.assign(state.onePatient,{rawatJalan:(state.onePatient.rawatJalan||[]).map(t=>t.idrawat===state.oneRawat.idrawat?_.assign(t,a):t),emergency:(state.onePatient.emergency||[]).map(t=>t.idrawat===state.oneRawat.idrawat?_.assign(t,a):t),rawatInap:(state.onePatient.rawatInap||[]).map(t=>t.idinap===state.oneRawat.idinap?_.assign(t,a):t)}),a=>a&&[_.assign(state,{route:"cashier",cashierList:[]}),m.redraw()])})))}),_.assign(comp,{users:()=>5!==state.login.bidang?m("p","Hanya untuk user manajemen"):m(".content",m("h3","Manajemen Akun"),m(".button.is-primary",{onclick:()=>state.modalAccount=m(".box",m("h3","Tambah Akun"),m(autoForm({id:"createAccount",schema:schemas.account,action:a=>io().emit("bcrypt",a.password,t=>[insertBoth("users",_.assign(a,{password:t})),state.modalAccount=null])})))},makeIconLabel("user-plus","Tambah akun")),m("br"),m("br"),makeModal("modalAccount"),m(".box",m("table.table.is-striped",{onupdate:()=>db.users.toArray(a=>[state.userList=a,m.redraw()])},m("thead",m("tr",["Nama lengkap","Username","Peranan","Bidang","Poliklinik","Keaktifan"].map(a=>m("th",a)))),m("tbody",(state.userList.filter(a=>1===a.keaktifan)||[]).map(a=>m("tr",{ondblclick:()=>state.modalAccount=m(".box",m("h4","Profil Pengguna"),m(autoForm({id:"updateAccount",schema:schemas.account,doc:a,action:t=>io().emit("bcrypt",t.password,e=>[updateBoth("users",a._id,_.assign(t,{password:e})),state.modalAccount=null,m.redraw()])})))},tds([a.nama,a.username,look("peranan",a.peranan),look("bidang",a.bidang),look("klinik",a.poliklinik),look("keaktifan",a.keaktifan)]))))))),references:()=>m(".content",m("h3","Daftar Tarif"),m("p.help","* Tersusun alfabetis"),m(".box",m("table.table.is-striped",{oncreate:()=>db.references.toArray(a=>[state.referenceList=_.sortBy(a,["nama"]),m.redraw()])},m("thead",m("tr",["Nama item","Harga","Grup 1","Grup 2","Grup 3"].map(a=>m("th",a)))),m("tbody",paginate(state.referenceList||[],"references",20).map(a=>a.nama&&m("tr",tds([a.nama,rupiah(a.harga),a[0],a[1],a[2]])))))),m("div",comp.pagination("references",_.get(state,"referenceList.length")/20)),ands([5===state.login.bidang,4===state.login.peranan])&&[m("h3","Import Data"),m(".file.is-danger",{onchange:a=>Papa.parse(a.target.files[0],{header:!0,complete:a=>withThis((a,t)=>[dbCall({method:"insertMany",collection:a,documents:t},()=>""),db[a].bulkPut(t).then(a=>a&&alert("Berhasil import, silahkan refresh"))],t=>ors([a.data[0].harga&&t("references",a.data.map(a=>_.merge(a,{_id:randomId(),updated:_.now()}))),a.data[0].nama_lengkap&&t("patients",a.data.map(a=>_.merge({updated:_.now(),_id:randomId()},{identitas:_.merge({keluarga:{ayah:a.ayah||"",ibu:a.ibu||"",pasangan:a.pasangan||""},kontak:a.kontak||"",nama_lengkap:_.startCase(a.nama_lengkap),tanggal_input:a.tanggal_input?+moment(a.tanggal_input):"",tanggal_lahir:a.tanggal_lahir?+moment(a.tanggal_lahir):"",tempat_lahir:a.tempat_lahir||"",tempat_tinggal:a.tempat_tinggal||"",bayar_kartu:!0},_.fromPairs(["agama","alias","darah","kelamin","ktp","nikah","no_mr","pekerjaan","pendidikan"].map(t=>+a[t]?[t,+a[t]]:["",""])))}))),a.data[0].no_batch&&t("goods",a.data.map(a=>_.merge({_id:randomId(),updated:_.now()},{nama:a.nama_barang,jenis:+a.jenis,kandungan:a.kandungan,satuan:+a.satuan,kriteria:{antibiotik:+a.antibiotik,narkotika:+a.narkotika,psikotropika:+a.psikotropika,fornas:+a.fornas},batches:[{idbatch:randomId(),no_batch:a.no_batch,merek:a.merek,masuk:a.masuk&&+moment(a.masuk),kadaluarsa:a.kadaluarsa&&+moment(a.kadaluarsa),stok:{gudang:+a.digudang,apotik:+a.diapotik,retur:+a.diretur},harga:{beli:+a.beli,jual:+a.jual},returnable:!!a.returnable,sumber:{supplier:a.supplier,anggaran:+a.anggaran,no_spk:a.no_spk,tanggal_spk:a.tanggal_spk&&+moment(a.tanggal_spk)}}]})).reduce((a,t)=>withThis(a.find(a=>a.nama===t.nama),e=>e?a.map(a=>a.nama===t.nama?_.assign(a,{batches:[...a.batches,...t.batches]}):a):[...a,t]),[]))]))})},m("label.file-label",m("input.file-input",{type:"file",name:"import"}),m("span.file-cta",m("span.file-label","Pilih file")))),m("a.help",{href:"https://github.com/rikyperdana/simrs/wiki/Import-Master-Data",target:"_blank"},"Panduan Import Data Master")]),management:()=>_.chunk(_.map(menus.management.children,(a,t)=>[a,t]),3).map(a=>m(".columns",a.map(a=>m(".column",m(".box",m("article.media",{onclick:()=>[state.route=a[1],m.redraw()]},m(".media-left",m("span.icon.has-text-primary",m("i.fas.fa-2x.fa-"+a[0].icon))),m(".media-content",m(".content",m("h3",a[0].full)))))))))}),_.assign(comp,{queue:()=>m(".content",m("table.is-fullwidth",m("tr",{oncreate:()=>db.queue.toArray(a=>localStorage.setItem("regQueue",a.filter(a=>a.timestamp>startOfTheDay(+moment())).length))},m("th",m("h1","Antrian Pendaftaran")),m("th",m("h1","R"+(localStorage.regQueue||0))))),m(".buttons",m(".button",{onclick:()=>ands([insertBoth("queue",{timestamp:+moment(),no_antrian:"R"+(+localStorage.regQueue+1)}),makePdf.regQueue(+localStorage.regQueue),localStorage.setItem("regQueue",+localStorage.regQueue+1)])},"Cetak antrian"),m(".button",{onclick:()=>localStorage.setItem("regQueue",0)},"Reset Antrian")),Array(3).map(a=>m("br")),m("h1","Antrian Poliklinik"),m("table.is-fullwidth.is-striped",selects("klinik")().map(a=>m("tr",m("td",m("h2",a.label))))))}),_.assign(comp,{surgery:()=>ors([1===state.login.bidang,_.includes([2,3],state.login.peranan)])?m(".content",m("h1","Jadwal Instalasi Bedah"),m(".box",m("table.table.is-striped",{oncreate:()=>db.references.toArray(a=>state.references=a),onupdate:()=>db.patients.toArray(a=>state.surgeryList=a.map(a=>[...a.rawatJalan||[],...a.emergency||[]].flatMap(t=>t&&t.soapDokter&&t.soapDokter.tindakan&&t.soapDokter.tindakan.map(e=>e.jadwal>+moment()&&_.merge(a,t,e)).filter(Boolean)).filter(Boolean)).filter(a=>a.length))},m("tr",["Nama Pasien","Jadwal Operasi","Nama Tindakan"].map(a=>m("th",a))),state.surgeryList&&_.flatten(state.surgeryList).map(a=>m("tr",tds([a.identitas.nama_lengkap,hari(a.jadwal,!0),lookReferences(a.idtindakan).nama])))))):m("p","Hanya untuk tenaga medis dan user pendaftaran")}),_.assign(comp,{profile:()=>m(".content",m("h1","Profil Pengguna"),m(".box",m("table.table.is-striped",m("tbody",m("tr",m("th","Username"),m("td",state.login.username)),m("tr",m("th","Password"),m("td","*************")),m("tr",m("th","Nama Lengkap"),m("td",state.login.nama)),m("tr",m("th","Bidang"),m("td",look("bidang",state.login.bidang))),m("tr",m("th","Peranan"),m("td",look("peranan",state.login.peranan)))))),m(".buttons",m(".button.is-warning",{onclick:()=>state.modalProfile=m(".box",m(autoForm({id:"formProfile",schema:{username:{type:String,optional:!0,autoform:{placeholder:"Bila tidak ingin diganti, kosongkan saja"}},password:{type:String,optional:!0,autoform:{type:"password",placeholder:"Bila tidak ingin diganti, kosongkan saja"}},nama:{type:String,optional:!0,label:"Nama Lengkap",autoform:{placeholder:"Bila tidak ingin diganti, kosongkan saja"}}},action:a=>[a.password?io().emit("bcrypt",a.password,t=>updateBoth("users",state.login._id,_.assign(state.login,a,{password:t}))):updateBoth("users",state.login._id,_.assign(state.login,a)),state.modalProfile=null,m.redraw()]})))},makeIconLabel("edit","Update akun")),m("a.button.is-info",{href:"https://wa.me/628117696000?text=simrs.dev",target:"_blank"},makeIconLabel("envelope-open-text","Kritik/Saran")),m("a.button.is-link",{href:"https://www.youtube.com/watch?v=irSxnKSRIOI&list=PL4oE8OvUySlyfGzQTu8kN9sPWWfcn_wSZ",target:"_blank"},makeIconLabel("chalkboard-teacher","Tutorial")),m("a.button.is-danger",{onclick:()=>[state.modalLicense=m(".box",m("h3","Unlock Lisensi Enterprise"),m(autoForm({id:"updateLicense",schema:{key:{type:String,autoform:{help:"Dapatkan dari developer"}}},action:({key:a})=>15===a.length&&[withThis(["license",a.split(" ").reverse().join(""),localStorage],a=>_.last(a).setItem(_.first(a),+(a[1]+"e5"))),state.modalLicense=null,m.redraw()]}))),m.redraw()]},makeIconLabel("key","Unlock"))),makeModal("modalProfile"),makeModal("modalLicense"))}),_.assign(comp,{radiology:()=>9!==state.login.bidang?m("p","Hanya untuk petugas radiologi"):m(".content",m("h1","Radiologi"),m(".box",m("table.table.is-striped",{onupdate:()=>[db.references.toArray(a=>state.references=a),db.patients.filter(a=>ors([[...a.rawatJalan||[],...a.emergency||[]].filter(a=>_.get(a,"soapDokter.radio")&&a.soapDokter.radio.filter(a=>!a.diagnosa).length).length,a.rawatInap&&a.rawatInap.filter(a=>a.observasi&&a.observasi.filter(a=>a.radio&&a.radio.filter(a=>!a.diagnosa).length).length).length])).toArray(a=>a&&[state.radiologyList=a.flatMap(a=>[...[...a.rawatJalan||[],...a.emergency||[]].flatMap(t=>_.get(t,"soapDokter.radio")&&t.soapDokter.radio.filter(a=>!a.diagnosa).flatMap(e=>({pasien:a,rawat:t,radio:e}))),...(a.rawatInap||[]).flatMap(t=>t.observasi&&t.observasi.flatMap(e=>e.radio&&e.radio.filter(a=>!a.diagnosa).flatMap(n=>({pasien:a,inap:t,observasi:e,radio:n}))))]).filter(Boolean),m.redraw()])]},m("thead",m("tr",["Waktu Permintaan","No. MR","Nama Pasien","Instalasi","Dokter","Grup","Item","Diproses"].map(a=>m("th",a)))),m("tbody",(state.radiologyList||[]).map(a=>m("tr",{ondblclick:()=>state.modalRadiologi=m(".box",m("h3","Form Radiologi"),m("p","Catatan dokter: "+(a.radio.catatan||"-")),m(autoForm({id:"responRadiology",schema:1===a.radio.konfirmasi?schemas.responRadiology:schemas.confirmRadiology,confirmMessage:"Yakin untuk menyimpan?",action:t=>[updateBoth("patients",a.pasien._id,_.assign(a.pasien,{rawatJalan:(a.pasien.rawatJalan||[]).map(e=>e.idrawat===_.get(a,"rawat.idrawat")?_.assign(e,{soapDokter:_.assign(e.soapDokter,{radio:e.soapDokter.radio.map(e=>e.idradio===a.radio.idradio?_.assign(e,t):e)})}):e),emergency:(a.pasien.emergency||[]).map(e=>e.idrawat===_.get(a,"rawat.idrawat")?_.assign(e,{soapDokter:_.assign(e.soapDokter,{radio:e.soapDokter.radio.map(e=>e.idradio===a.radio.idradio?_.assign(e,t):e)})}):e),rawatInap:(a.pasien.rawatInap||[]).map(e=>e.idinap===_.get(a,"inap.idinap")?_.assign(e,{observasi:e.observasi.map(e=>e.idobservasi===a.observasi.idobservasi?_.assign(e,{radio:e.radio.map(e=>e.idradio===a.radio.idradio?_.assign(e,t):e)}):e)}):e)})),a.radio.diagnosa&&makePdf.radio(a.pasien.identitas,_.merge(a.radio,t)),_.assign(state,{modalRadiologi:null,radiologyList:null}),m.redraw()]})))},tds([hari(ors([_.get(a,"rawat.tanggal"),_.get(a,"observasi.tanggal")]),!0),_.get(a,"pasien.identitas.no_mr"),_.get(a,"pasien.identitas.nama_lengkap"),ors([a.inap&&"Rawat Inap",_.get(a,"rawat.klinik")&&look("klinik",a.rawat.klinik),"Emergency"]),ors([a.inap&&lookUser(_.get(a,"observasi.dokter")),lookUser(_.get(a,"rawat.soapDokter.dokter"))]),_.startCase(a.radio.grup),lookReferences(a.radio.idradio).nama,1===a.radio.konfirmasi&&hari(a.radio.tanggal,!0)])))),makeModal("modalRadiologi"))))}),_.assign(comp,{laboratory:()=>8!==state.login.bidang?m("p","Hanya untuk petugas labor"):m(".content",m("h1","Laboratorium"),m(".box",m("table.table.is-striped",{onupdate:()=>[db.references.toArray(a=>state.references=a),db.patients.filter(a=>[...a.rawatJalan||[],...a.emergency||[],...a.rawatInap?a.rawatInap.flatMap(a=>(a.observasi||[]).map(a=>({soapDokter:a}))):[]].filter(a=>_.get(a,"soapDokter.labor")&&a.soapDokter.labor.filter(a=>a.hasil||2===a.konfirmasi).length!==a.soapDokter.labor.length).length).toArray(a=>state.laboratoryList=a.flatMap(a=>[...a.rawatJalan||[],...a.emergency||[],...a.rawatInap?a.rawatInap.flatMap(a=>a.observasi.flatMap(t=>({inap:a,observasi:t}))):[]].filter(a=>ors([_.get(a,"soapDokter.labor")&&a.soapDokter.labor.filter(a=>a.hasil).lengtha.hasil).lengthors([t.soapDokter&&{pasien:a,rawat:t},t.observasi&&_.merge(t,{pasien:a})]))))]},m("thead",m("tr",["Waktu Permintaan","No. MR","Nama Pasien","Instalasi","Dokter","Diproses"].map(a=>m("th",a)))),m("tbody",(state.laboratoryList||[]).map(a=>m("tr",{ondblclick:()=>_.assign(state,{route:"responLaboratory",responLaboratory:_.assign(a,{labor:ors([_.get(a,"rawat.soapDokter.labor"),_.get(a,"observasi.labor")])})})&&m.redraw()},tds([hari(ors([_.get(a,"rawat.tanggal"),_.get(a,"observasi.tanggal")]),!0),a.pasien.identitas.no_mr,a.pasien.identitas.nama_lengkap,ors([_.get(a,"rawat.klinik")&&look("klinik",a.rawat.klinik),a.observasi&&"Rawat Inap","Emergency"]),lookUser(ors([_.get(a,"rawat.soapDokter.dokter"),_.get(a,"observasi.dokter")])),hari(ors([_.get(a,"rawat.soapDokter.labor")&&a.rawat.soapDokter.labor.find(a=>a.tanggal),_.get(a,"observasi.labor")&&a.observasi.labor.find(a=>a.tanggal)]),!0)]))))))),responLaboratory:()=>m(".content",m("h2","Respon Laboratorium"),m(autoForm({id:"responLaboratory",schema:_.merge({},schemas.responLaboratory,state.responLaboratory.labor.filter(a=>a.konfirmasi).length?{"labor.$.hasil":{type:String}}:{"labor.$.konfirmasi":{type:Number,autoform:{type:"select",options:selects("konfirmasi")}}}),doc:{labor:state.responLaboratory.labor.filter(a=>ors([!a.konfirmasi,!a.hasil]))},confirmMessage:"Yakin dengan respon form laboratorium ini?",action:a=>[updateBoth("patients",state.responLaboratory.pasien._id,_.assign(state.responLaboratory.pasien,{rawatJalan:(state.responLaboratory.pasien.rawatJalan||[]).map(t=>t.idrawat===_.get(state,"responLaboratory.rawat.idrawat")?_.assign(t,{soapDokter:_.assign(state.responLaboratory.rawat.soapDokter,{labor:state.responLaboratory.rawat.soapDokter.labor.map(t=>_.assign(t,a.labor.find(a=>a.idlabor===t.idlabor)||{}))})}):t),emergency:(state.responLaboratory.pasien.emergency||[]).map(t=>t.idrawat===_.get(state,"responLaboratory.rawat.idrawat")?_.assign(t,{soapDokter:_.assign(state.responLaboratory.rawat.soapDokter,{labor:state.responLaboratory.rawat.soapDokter.labor.map(t=>_.assign(t,a.labor.find(a=>a.idlabor===t.idlabor)||{}))})}):t),rawatInap:(state.responLaboratory.pasien.rawatInap||[]).map(t=>t.idinap===_.get(state,"responLaboratory.inap.idinap")?_.assign(t,{observasi:state.responLaboratory.inap.observasi.map(t=>t.idobservasi===state.responLaboratory.observasi.idobservasi?_.assign(t,{labor:state.responLaboratory.observasi.labor.map(t=>_.assign(t,a.labor.find(a=>a.idlabor===t.idlabor)||{}))}):t)}):t)})),a.labor.filter(a=>a.hasil).length&&makePdf.labor(state.responLaboratory.pasien.identitas,a.labor),_.assign(state,{route:"laboratory",laboratoryList:[]}),m.redraw()]})))}),_.assign(comp,{cssd:()=>m(".content",m("p","fitur dalam perencanaan.."))}),_.assign(comp,{gizi:()=>10!==state.login.bidang?m("p","Hanya untuk user bidang Gizi"):m(".content",m("h1","Daftar konsumsi pasien inap"),m(".box",m("table.table.is-striped",{oncreate:()=>db.patients.filter(a=>(a.rawatInap||[]).filter(a=>a.observasi&&!a.keluar).length).toArray(a=>[state.consumeList=a,m.redraw()])},m("thead",m("tr",m("th","Nama Pasien"),m("th","Tanggal Masuk"))),m("tbody",(state.consumeList||[]).map(a=>m("tr",{onclick:()=>[state.modalConsume=m(".box",m("h3","Rincian kebutuhan gizi"),m("table.table",m("tr",m("th","Nama Pasien"),m("td",a.identitas.nama_lengkap)),withThis(_.last(a.rawatInap),a=>[m("tr",m("th","Tanggal masuk"),m("td",hari(a.tanggal_masuk,!0))),m("tr",m("th","Kelas/Kamar/Bed"),m("td",[_.upperCase(a.bed.kelas),_.startCase(a.bed.kamar),a.bed.nomor].join("/"))),a.observasi.map(a=>a.konsumsi&&m("tr",tds([hari(a.tanggal,!0),[lookUser(a.dokter),a.konsumsi].join(": ")])))])))]},tds([a.identitas.nama_lengkap,hari(_.get(_.last(a.rawatInap),"tanggal_masuk"),!0)])))))),makeModal("modalConsume"))});var reports={cashier:()=>makeReport("Penerimaan Kasir",a=>withThis({start:+moment(a.target[0].value),end:tomorrow(+moment(a.target[1].value)),selection:a.target[2].value},t=>[a.preventDefault(),db.patients.toArray(a=>makePdf.report("Penerimaan Kasir",[["Tanggal","No. MR","Nama Pasien","Layanan","Tarif","Obat","Tindakan","Tambahan","Jumlah","Kasir"],..._.flattenDeep(a.map(a=>[...a.rawatJalan||[],...a.emergency||[],...a.rawatInap?a.rawatInap.map(a=>_.assign(a,{soapDokter:{obat:(a.observasi||[]).flatMap(a=>a.obat),bhp:(a.observasi||[]).flatMap(a=>a.bhp),tindakan:(a.observasi||[]).flatMap(a=>a.tindakan)}})):[]].map(e=>ands([e.cara_bayar===+t.selection,(e.tanggal||e.tanggal_masuk)>t.start,(e.tanggal||e.tanggal_masuk)a.length)).sort((a,t)=>a.rawat.tanggal-t.rawat.tanggal).map(a=>[hari(a.rawat.tanggal||a.rawat.tanggal_masuk),String(a.pasien.identitas.no_mr),a.pasien.identitas.nama_lengkap,ors([a.rawat.klinik&&look("klinik",a.rawat.klinik),a.rawat.bed&&"Rawat Inap","IGD"]),rupiah(ors([a.rawat.klinik&&1e3*+look("tarif_klinik",a.rawat.klinik),a.rawat.bed&&tarifInap(a.rawat.tanggal_masuk,a.rawat.keluar,beds[_.get(a.rawat.bed,"kelas")].tarif),tarifIGD])),rupiah(_.get(a,"rawat.soapDokter.obat")?_.sum(a.rawat.soapDokter.obat.map(a=>a.harga)):0),rupiah(_.get(a,"rawat.soapDokter.tindakan")?_.sum(a.rawat.soapDokter.tindakan.map(a=>+_.get(lookReferences(a.idtindakan),"harga"))):0),rupiah(_.sum((a.rawat.charges||[]).map(a=>a.harga))),rupiah(_.sum([ors([a.rawat.klinik&&1e3*+look("tarif_klinik",a.rawat.klinik),a.rawat.bed&&tarifInap(a.rawat.tanggal_masuk,a.rawat.keluar,beds[_.get(a.rawat.bed,"kelas")].tarif),tarifIGD]),_.get(a,"rawat.soapDokter.obat")?_.sum(a.rawat.soapDokter.obat.map(a=>a.harga)):0,_.get(a,"rawat.soapDokter.tindakan")?_.sum(a.rawat.soapDokter.tindakan.map(a=>+_.get(lookReferences(a.idtindakan),"harga"))):0,_.get(a,"rawat.charges")?_.sum(a.rawat.charges.map(a=>a.harga)):0])),lookUser(a.rawat.kasir)])],"Cara Bayar: "+look("cara_bayar",+t.selection)))]),selects("cara_bayar")()),pharmacy:()=>makeReport("Pengeluaran Apotik",a=>withThis({start:+moment(a.target[0].value),end:tomorrow(+moment(a.target[1].value))},t=>[a.preventDefault(),db.patients.toArray(a=>makePdf.report("Laporan Pengeluaran Obat",[["Tanggal","No. MR","Nama Pasien","Layanan","Dokter","Nama Obat","Jumlah","Harga","Cara Bayar","Apoteker"],...a.flatMap(a=>[...a.rawatJalan||[],...a.emergency||[],...(a.rawatInap||[]).flatMap(a=>(a.observasi||[]).filter(a=>a.soapDokter))].map(t=>({pasien:a,rawat:t}))).sort((a,t)=>a.rawat.tanggal-t.rawat.tanggal).flatMap(({pasien:a,rawat:t})=>_.get(t,"soapDokter.obat")&&t.soapDokter.obat.map(e=>e.harga&&[hari(t.tanggal),a.identitas.no_mr,a.identitas.nama_lengkap,ors([t.klinik&&look("klinik",t.klinik),t.idinap&&"Rawat Inap","Gawat Darurat"]),lookUser(t.soapDokter.dokter),lookGoods(e.idbarang).nama,e.jumlah+" "+look("satuan",lookGoods(e.idbarang).satuan),rupiah(e.harga),look("cara_bayar",t.cara_bayar),lookUser(_.get(t,"soapDokter.apoteker"))]).filter(Boolean)).filter(Boolean).filter(a=>a.length)]))])),igd:()=>makeReport("Kunjungan IGD",a=>withThis({start:+moment(a.target[0].value),end:tomorrow(+moment(a.target[1].value))},t=>[a.preventDefault(),db.patients.toArray(a=>makePdf.report("Kunjungan IGD",[["Tanggal","No. MR","Nama Pasien","Perawat","Dokter"],...a.flatMap(a=>a.rawatJalan&&a.rawatJalan.map(e=>_.every([e.soapDokter,e.tanggal>t.start&&e.tanggala.tanggal-t.tanggal).filter(a=>a)]))])),inpatient:()=>makeReport("Kunjungan Rawat Inap",a=>withThis({start:+moment(a.target[0].value),end:tomorrow(+moment(a.target[1].value))},t=>[a.preventDefault(),db.patients.toArray(a=>makePdf.report("Kunjungan Rawat Inap",[["Tanggal","No. MR","Nama Pasien","Perawat","Dokter"],...a.flatMap(a=>a.rawatInap&&a.rawatInap.map(e=>_.every([e.keluar,e.tanggal_masuk>t.start&&e.tanggal_masuklookUser(a.perawat)).join(", "),e.observasi.map(a=>lookUser(a.dokter)).join(", ")])).sort((a,t)=>a.tanggal-t.tanggal).filter(Boolean)]))])),outpatient:()=>makeReport("Kunjungan Poliklinik",a=>withThis({start:+moment(a.target[0].value),end:tomorrow(+moment(a.target[1].value))},t=>[a.preventDefault(),db.patients.toArray(a=>makePdf.report("Kunjungan Poliklinik",[["Tanggal","Poliklinik","No. MR","Nama Pasien","Perawat","Dokter"],...a.flatMap(a=>(a.rawatJalan||[]).map(t=>({pasien:a,rawat:t}))).filter(({pasien:a,rawat:e})=>ands([e.soapDokter,e.tanggal>t.start&&e.tanggala.rawat.tanggal-t.rawat.tanggal).map(({pasien:a,rawat:t})=>[hari(t.tanggal),look("klinik",t.klinik),a.identitas.no_mr.toString(),a.identitas.nama_lengkap,lookUser(_.get(t,"soapPerawat.perawat")),lookUser(_.get(t,"soapDokter.dokter"))])]))]))},topMenus=_.omit(menus,["cssd","gizi"]);_.assign(comp,{navbar:()=>m("nav.navbar.is-primary.is-fixed-top",m(".navbar-brand",m("a.navbar-item",{onclick:()=>state.route="dashboard"},"SIMRS.dev")),m(".navbar-menu",m(".navbar-start",_.map(topMenus,(a,t)=>m("a.navbar-item",{class:a.children&&"has-dropdown is-hoverable",onclick:()=>state.route=t},a.children?[m("a.navbar-link",_.startCase(a.full)),m(".navbar-dropdown",_.map(a.children,(a,t)=>m("a.navbar-item",{onclick:a=>[a.stopPropagation(),state.route=t]},makeIconLabel(a.icon,a.full))))]:m("span",_.startCase(a.full))))),m(".navbar-end",m(".navbar-item.has-dropdown.is-hoverable",m("a.navbar-link",{onclick:()=>[state.route="profile",m.redraw()]},_.get(state.login,"username")),m(".navbar-dropdown.is-right",m("a.navbar-item",makeIconLabel("user-tag","Peranan: "+look("peranan",_.get(state.login,"peranan")))),m("a.navbar-item",makeIconLabel("shapes","Bidang: "+look("bidang",_.get(state.login,"bidang")))),m("a.navbar-item",makeIconLabel("clinic-medical","Poliklinik: "+look("klinik",_.get(state.login,"poliklinik")))),m("hr.dropdown-divider"),m("a.navbar-item",{onclick:()=>[_.assign(state,{login:null,route:"login",loading:!1}),localStorage.removeItem("login"),m.redraw()]},makeIconLabel("sign-out-alt","Logout"))))))),dashboard:()=>m(".content",m("h1",{oncreate:()=>[getDifferences(),db.users.toArray(a=>state.userList=a)]},"Dashboard"),m(".buttons",m(".button.is-info",{class:state.loading&&"is-loading","data-tooltip":"otomatis setiap beberapa menit / manual",onclick:()=>[state.loading=!0,getDifferences()]},"Sync"),state.lastSync&&m("span","Terakhir sinkronisasi "+moment(state.lastSync).fromNow())),_.chunk(_.map(menus,(a,t)=>[a,t]),3).map(a=>m(".columns",a.map(a=>m(".column",m(".box",m("article.media",{onclick:()=>[state.route=a[1],m.redraw()]},m(".media-left",m("span.icon.has-text-primary",m("i.fas.fa-2x.fa-"+a[0].icon))),m(".media-content",m(".content",m("h3",a[0].full))))))))),m("h1","Statistik Sistem"),m(".tabs.is-boxed",m("ul",{style:"margin-left: 0%"},_.map({pasien:["Pasien","walking"],rawatJalan:["Rawat Jalan","ambulance"],emergency:["Emergency","heart"],rawatInap:["Rawat Inap","bed"],radiology:["Radiologi","radiation"],laboratory:["Laboratorium","flask"],management:["Management","users"]},(a,t)=>m("li",{class:t===state.dashboardTab&&"is-active"},m("a",{onclick:()=>[state.dashboardTab=t,m.redraw()]},makeIconLabel(a[1],a[0])))))),m(".columns",{oncreate:()=>[db.patients.toArray(a=>_.merge(state,{stats:{pasien:{total:a.length,pria:a.filter(a=>1===a.identitas.kelamin).length,wanita:a.filter(a=>2===a.identitas.kelamin).length},rawatJalan:selects("klinik")().map(t=>_.sum(a.map(a=>(a.rawatJalan||[]).filter(a=>a.klinik===t.value).length).filter(Boolean))),emergency:_.sum(a.map(a=>(a.emergency||[]).length)),rawatInap:_.sum(a.map(a=>(a.rawatInap||[]).length))}})),db.users.toArray(a=>_.merge(state,{stats:{management:{petugas:a.filter(a=>1===a.peranan).length,perawat:a.filter(a=>2===a.peranan).length,dokter:a.filter(a=>3===a.peranan).length,admin:a.filter(a=>4===a.peranan).length}}}))]},{pasien:["Total jumlah pasien: "+_.get(state,"stats.pasien.total"),"Total pasien pria: "+_.get(state,"stats.pasien.pria"),"Total pasien wanita: "+_.get(state,"stats.pasien.wanita")],rawatJalan:selects("klinik")().map(a=>["Total pasien klinik ",a.label,": ",_.get(state,["stats","rawatJalan",a.value-1])].join("")),emergency:["Total pasien emergency: "+_.get(state,"stats.emergency")],rawatInap:["Total pasien pernah inap: "+_.get(state,"stats.rawatInap")],radiology:["Total layanan radiologi: "],laboratory:["Total layanan laboratorium: "],management:["Jumlah petugas: "+_.get(state,"stats.management.petugas"),"Jumlah perawat: "+_.get(state,"stats.management.perawat"),"Jumlah dokter: "+_.get(state,"stats.management.dokter")]}[state.dashboardTab||"pasien"].map(a=>m(".column",m(".notification",{class:"is-primary"},a))))),login:()=>m(".content",m(".columns",m(".column"),m(".column",!window.chrome&&m(".notification.is-warning.is-light","Mohon gunakan Chrome versi terbaru"),state.error&&m(".notification.is-danger.is-light",[m("button.delete",{onclick:()=>state.error=!1}),state.error]),_.range(3).map(()=>m("br")),m(".level",m(".level-item.has-text-centered",m("span.icon.is-large.has-text-primary",m("i.fas.fa-8x.fa-stethoscope")))),m("br"),m(autoForm({id:"login",schema:schemas.login,submit:{value:"Login",class:state.loading?"is-info is-loading":"is-info"},action:a=>[state.loading=!0,m.redraw(),io().emit("login",a,({res:t})=>t?[_.assign(state,{username:a.username,route:"dashboard",login:t}),localStorage.setItem("login",JSON.stringify(t)),m.redraw()]:[state.loading=!1,state.error="Password salah",m.redraw()])]}))),m(".column")))}),io().on("connect",a=>[state.login=localStorage.login&&JSON.parse(localStorage.login||"{}"),m.mount(document.body,{view:()=>m(".has-background-light",comp.navbar(),m(".container",{style:"min-height:100vh"},m("br"),state.username||_.get(state,"login.username")?comp[state.route]():comp.login()),m("footer.footer",{style:"padding:0px"},m(".content",m("a.help",{href:"https://github.com/rikyperdana/simrs",target:"_blank"},"Versi 1.9.3"))))}),io().on("datachange",(a,t)=>[db[a].put(t),state.lastSync=_.now()]),io().on("disconnect",()=>location.reload())]); \ No newline at end of file +var m,_,afState={arrLen:{},form:{}};function autoForm(a){return{view:function(){function t(a){return a.replace(/\d/g,"$")}function e(a){return a.find(Boolean)}function n(a,t){var e=new Date(a),n=function(a){return a<10?"0"+a:""+a},o=[e.getFullYear(),n(e.getMonth()+1),n(e.getDate())].join("-"),i="T"+n(e.getHours())+":"+n(e.getMinutes());return t?o+i:o}var o;afState.form[a.id]=a.doc?(o=a.doc,_.fromPairs(_.flattenDeep(function a(t){var e=t[_.keys(t)[0]];return"object"==typeof e?_.map(e,(function(e,n){return a({[_.keys(t)[0]+"."+n]:e})})):t}({doc:o})).map((function(a){return[_.keys(a)[0].substr(4),_.values(a)[0]]})))):afState.form[a.id];var i={form:{id:a.id,oncreate:a.oncreate,onchange:function(t){t.redraw=!1,afState.form[a.id]=afState.form[a.id]||{},afState.form[a.id][t.target.name]=t.target.value},onsubmit:function(n){n.preventDefault(),afState.form[a.id]=a.autoReset&&null;var o=()=>a.action(_.filter(n.target,(function(a){return a.name&&a.value})).map((function(e){var n=a.schema[t(e.name)].type;return _.reduceRight(e.name.split("."),(function(a,t){return{[t]:a}}),e.value&&[n===String&&e.value,n===Number&&+e.value,n===Date&&new Date(e.value).getTime()].filter((function(a){return!!a}))[0])})).reduce((function(a,t){return _.merge(a,function a(t){return e(["object"==typeof t&&e([+_.keys(t)[0]+1&&_.range(+_.keys(t)[0]+1).map((function(e){return e===+_.keys(t)[0]?a(_.values(t)[0]):void 0})),{[_.keys(t)[0]]:a(_.values(t)[0])}]),t])}(t))}),{}));a.confirmMessage?confirm(a.confirmMessage)&&o():o()}},arrLen:function(a,t){return{onclick:function(){afState.arrLen[a]=_.get(afState.arrLen,a)||0;var e=afState.arrLen[a]>0?-1:0;afState.arrLen[a]+={inc:1,dec:e}[t]}}},label:function(a,t){return m("label.label",m("span",t.label||_.startCase(a.split(".").map(a=>+a+1?+a+1:a).join("."))),m("span",m("b.has-text-danger",!t.optional&&" *")))}};return m("form",i.form,_.map(a.schema,(function(o,r){return!_.includes(r,".")&&function o(r,s){return{hidden:function(){return m("input.input",{type:"hidden",name:s.exclude?"":r,value:s.autoValue&&s.autoValue(r,afState.form[a.id],a)})},readonly:function(){return m(".field",i.label(r,s),m("input.input",{readonly:!0,name:s.exclude?"":r,value:s.autoValue(r,afState.form[a.id],a)}))},"datetime-local":function(){return m(".field",i.label(r,s),m(".control",m("input.input",{type:"datetime-local",name:s.exclude?"":r,required:!s.optional,value:n(_.get(afState.form,[a.id,r]),!0)})))},textarea:function(){return m(".field",i.label(r,s),m("textarea.textarea",{name:s.exclude?"":r,required:!s.optional,value:_.get(afState.form,[a.id,r]),placeholder:_.get(s,"autoform.placeholder"),rows:_.get(s,"autoform.rows")||6}))},password:function(){return m(".field",i.label(r,s),m("input.input",{name:s.exclude?"":r,required:!s.optional,type:"password",placeholder:_.get(s,"autoform.placeholder")}))},select:function(){return m(".field.is-expanded",i.label(r,s),m(".select.is-fullwidth",m("select",{name:s.exclude?"":r,required:!s.optional,value:_.get(afState.form,[a.id,r]),onchange:s.autoRedraw&&function(){}},m("option",{value:""},"-"),s.autoform.options(r,afState.form[a.id]).map((function(t){return m("option",{value:t.value,selected:!!_.get(afState.form,[a.id,r])},t.label)})))),m("p.help",_.get(s,"autoform.help")))},standard:function(){return e([s.type===Object&&m(".box",i.label(r,s),_.map(a.schema,(function(a,t){return _.merge(a,{name:t})})).filter((function(a){function e(a){return _.size(_.split(a,"."))}return _.every([_.includes(a.name,t(r)+"."),e(r)+1===e(a.name)])})).map((function(e){var n=a.schema[t(e.name)];return o(r+"."+_.last(e.name.split(".")),n)[_.get(n,"autoform.type")||"standard"]()})),m("p.help",_.get(s,"autoform.help"))),s.type===Array&&m(".box",i.label(r,s),!s.fixed&&m(".tags",m(".tag.is-success",i.arrLen(r,"inc"),"Add+"),m(".tag.is-warning",i.arrLen(r,"dec"),"Rem-"),m(".tag",afState.arrLen[r])),_.range(_.get(a.doc,r)&&a.doc[r].length,afState.arrLen[r]).map((function(e){var n=a.schema[t(r)+".$"];return o(r+"."+e,n)[_.get(n,"autoform.type")||"standard"]()})),m("p.help",_.get(s,"autoform.help"))),m(".field",i.label(r,s),m(".control",m("input.input",{step:"any",name:s.exclude?"":r,placeholder:_.get(s,"autoform.placeholder"),value:e([s.autoValue&&s.autoValue(r,afState.form[a.id],a),s.type===Date&&n(_.get(afState.form,[a.id,r])),_.get(afState.form,[a.id,r])]),required:!s.optional,pattern:s.regExp,min:s.minMax&&s.minMax(r,afState.form[a.id])[0],max:s.minMax&&s.minMax(r,afState.form[a.id])[1],onchange:s.autoRedraw&&function(){},type:_.get([[Date,"date"],[String,"text"],[Number,"number"]].filter((function(a){return a[0]===s.type}))[0],"1")})),m("p.help",_.get(s,"autoform.help")))])}}}(r,o)[_.get(o,"autoform.type")||"standard"]()})),m(".row",m("button.button",_.assign({type:"submit",class:"is-info"},a.submit),a.submit&&a.submit.value||"Submit")))}}}var withThis=(a,t)=>t(a),ors=a=>a.find(Boolean),ands=a=>a.reduce((a,t)=>a&&t,!0)&&a[a.length-1],randomId=()=>[1,1].map(()=>Math.random().toString(36).slice(2)).join(""),hari=(a,t)=>a&&moment(a).format("Do MMMM YYYY"+(t?", hh:mm":"")),daysDifference=(a,t)=>Math.round((t-a)/864e5),startOfTheDay=a=>+moment(moment(a).format("YYYY-MM-DD")),tomorrow=a=>a+864e5,rupiah=a=>"Rp "+numeral(a||0).format("0,0"),dbCall=(a,t)=>io().emit("dbCall",a,t),insertBoth=(a,t,e)=>withThis(_.merge(t,{_id:randomId(),updated:_.now()}),n=>dbCall({method:"insertOne",collection:a,document:n},o=>o&&[e&&e(o),db[a].put(n),io().emit("datachange",a,t)])),updateBoth=(a,t,e,n)=>withThis(_.merge(e,{_id:t,updated:_.now()}),o=>dbCall({method:"updateOne",collection:a,document:o,_id:t},t=>t&&[n&&n(t),db[a].put(o),io().emit("datachange",a,e)])),deleteBoth=(a,t,e)=>dbCall({method:"deleteOne",collection:a,_id:t},n=>n&&[e&&e(n),db[a].delete(t)]),tarifInap=(a,t,e)=>1e3*(daysDifference(t-a)||1)*+e,tarifIGD=45e3,tarifKartu=8e3,collNames=["patients","goods","references","users","queue"],state={route:"dashboard"},comp={},menus={registration:{full:"Pendaftaran",icon:"address-book",children:{icd:{full:"Kodifikasi",icon:"code"},queue:{full:"Antrian",icon:"stream"}}},emergency:{full:"IGD",icon:"heartbeat"},outpatient:{full:"Rawat Jalan",icon:"walking"},inpatient:{full:"Rawat Inap",icon:"bed",children:{beds:{full:"Daftar Kamar",icon:"bed"},surgery:{full:"Antrian Bedah",icon:"procedures"},gizi:{full:"Gizi",icon:"utensils"}}},cashier:{full:"Kasir",icon:"cash-register"},storage:{full:"Storage",icon:"cubes",children:{transfer:{full:"Amprah",icon:"exchange-alt"}}},pharmacy:{full:"Apotik",icon:"pills"},laboratory:{full:"Laboratorium",icon:"flask"},radiology:{full:"Radiologi",icon:"radiation"},management:{full:"Manajemen",icon:"users",children:{users:{full:"Pengguna",icon:"users"},references:{full:"Referensi",icon:"file-contract"}}},gizi:{full:"Gizi",icon:"utensils"},cssd:{full:"Laundry",icon:"tshirt"}},db=new Dexie("simrs"),getDifference=a=>db[a].toArray(t=>dbCall({method:"getDifference",collection:a,clientColl:t.map(a=>_.pick(a,["_id","updated"]))},t=>t&&[db[a].bulkPut(t),state.lastSync=+moment(),state.loading=!1,m.redraw()])),getDifferences=()=>collNames.map(a=>getDifference(a));db.version(1).stores(collNames.reduce((a,t)=>_.merge(a,{[t]:"_id"}),{}));var tds=a=>a.map(a=>m("td",a)),paginate=(a,t,e)=>a.slice(_.get(state,["pagination",t])*e,_.get(state,["pagination",t])*e+e),makeIconLabel=(a,t)=>[m("span.icon",m("i.fas.fa-"+a)),m("span",t)],makeModal=a=>m(".modal",{class:state[a]&&"is-active"},m(".modal-background"),m(".modal-content",state[a]),m(".modal-close.is-large",{onclick:()=>[state[a]=null,m.redraw()]})),makeReport=(a,t,e)=>m(".box",m("h4","Unduh Laporan "+a),m("form.field-body",{onsubmit:t},m(".field",m(".control.is-expanded",m("input.input",{type:"date",name:"start"}))),m(".field",m(".control.is-expanded",m("input.input",{type:"date",name:"end"}))),e&&m(".field",m(".control.is-expanded",m(".select.is-fullwidth",m("select",e.map(a=>m("option",{value:a.value},a.label)))))),m("input.button.is-primary",{type:"submit",value:"Unduh"}))),defaultStyle=a=>(+localStorage.license||0)>_.now()?a:withThis({decoration:_.camelCase(_.initial(["line","through","database"]).join(" "))},({decoration:t})=>_.merge({defaultStyle:{decoration:t}},a)),makeRincianSoapPerawat=a=>a&&[m("tr",m("th","Anamnesa Perawat"),m("td",a.anamnesa)),withThis(_.get(a,"fisik.tekanan_darah"),a=>m("tr",m("th","Tekanan Darah"),m("td",a.systolic+"/"+a.diastolic))),["nadi","suhu","pernapasan","tinggi","berat","lila"].map(t=>_.get(a.fisik,t)&&m("tr",m("th",_.startCase(t)),m("td",a.fisik[t]))),a.tracer&&m("tr",m("th","File Tracer"),m("td",a.tracer))],makeRincianSoapDokter=a=>a&&[m("tr",m("th","Anamnesa Dokter"),m("td",a.anamnesa)),_.map(a.diagnosa,(a,t)=>m("tr",m("th","Diagnosa "+(t+1)),m("td",a.text+" / ICD X: "+(a.code||"?")))),(a.tindakan||[]).map(a=>a&&m("tr",m("th",_.get(lookReferences(a.idtindakan),"nama")),m("td",rupiah(_.get(lookReferences(a.idtindakan),"harga"))))),(a.obat||[]).map(a=>a&&m("tr",m("th",_.get(lookGoods(a.idbarang),"nama")),m("td",a.harga))),a.planning&&m("tr",m("th","Planning"),m("td",a.planning)),a.keluar&&m("tr",m("th","Pilihan keluar"),m("td",look("keluar",a.keluar))),a.rujuk&&m("tr",m("th","Konsul ke poli lain"),m("td",look("klinik",a.rujuk))),a.tracer&&m("tr",m("th","File Tracer"),m("td",a.tracer)),(a.radio||[]).map((a,t)=>m("tr",m("th","Cek radiologi "+(t+1)),m("td",{"data-tooltip":a.diagnosa},lookReferences(a.idradio).nama),a.diagnosa&&m("td",m(".button.is-info",{"data-tooltip":"Cetak lembar hasil diagnosa radiologi",onclick:()=>makePdf.radio(state.onePatient.identitas,a)},makeIconLabel("print",""))))),(a.labor||[]).map((a,t)=>m("tr",m("th","Cek labor "+(t+1)),m("td",{"data-tooltip":a.diagnosa},lookReferences(a.idlabor).nama),m("td",a.hasil)))];_.assign(comp,{pagination:(a,t)=>(state.pagination=state.pagination||{[a]:_.get(state.pagination,a)||0},m("nav.pagination",m(".pagination-list",_.range(t).map(t=>m("div",m("a.pagination-link",{class:t===state.pagination[a]&&"is-current",onclick:()=>[state.pagination[a]=t,m.redraw()]},t+1))))))});var selects=a=>_.reduce({alias:["tn","ny","nn","an","by"],kelamin:["laki-laki","perempuan"],agama:["islam","katolik","protestan","budha","hindu","konghuchu"],nikah:["nikah","belum_nikah","janda","duda"],pendidikan:["sd","smp","sma","diploma","s1","s2","s3","tidak_sekolah"],darah:["a","b","ab","o"],pekerjaan:["pns","swasta","wiraswasta","tni","polri","pensiunan","lainnya"],cara_bayar:["umum","bpjs","asuransi"],kodepoli:["int","ana","obg","bed","gig"],klinik:["penyakit_dalam","anak","obgyn","bedah","gigi","umum"],tarif_klinik:[95,95,95,95,95,45],rujukan:["datang_sendiri","rs_lain","puskesmas","faskes_lainnya"],keluar:["pulang","konsultasikan_ke_poli_lain","inap"],jenis_barang:["Obat","BHP","Logistik"],satuan:["botol","vial","ampul","pcs","sachet","tube","supp","tablet","minidose","pot","turbuhaler","kaplet","kapsul","bag","pen","rectal","flash","cream","nebu","galon","lembar","roll","liter","cup","pasang","bungkus","box","syringe"],boolean:["ya","tidak"],konfirmasi:["proses","tolak"],peranan:["petugas","perawat","dokter","admin"],bidang:["pendaftaran","kasir","farmasi","apotik","manajemen","rawat_jalan","rawat_inap","laboratorium","radiologi","gizi"],keaktifan:["aktif","non-aktif"],pengarsipan:["Rumah Sakit","Pribadi"]},(a,t,e)=>_.merge(a,{[e]:()=>_.map(t,(a,t)=>({label:_.startCase(a),value:t+1}))}),{})[a],look=(a,t)=>_.get(selects(a)().filter((a,e)=>e+1===t)[0],"label")||"-",lookGoods=a=>a&&state.goodsList.filter(t=>t._id===a)[0],lookReferences=a=>a&&state.references.filter(t=>t._id===a)[0],lookUser=a=>a&&_.get(state.userList.find(t=>t._id===a),"nama")||"-",schemas={identitas:{no_antrian:{type:String,optional:!0,exclude:!0},no_mr:{type:Number,label:"No. MR",autoform:{help:"random dari sistem and boleh diubah"},autoValue:(a,t,e)=>"updatePatient"===e.id?_.get(state,"onePatient.identitas.no_mr"):Math.floor(1e6*Math.random())},alias:{type:Number,optional:!0,autoform:{type:"select",options:selects("alias")}},nama_lengkap:{type:String,autoform:{placeholder:"minimal 4 huruf"}},ktp:{type:Number,label:"No. KTP",optional:!0},bpjs:{type:Number,label:"No. Peserta BPJS",optional:!0},tanggal_lahir:{type:Date},tempat_lahir:{type:String},kelamin:{type:Number,label:"Jenis Kelamin",autoform:{type:"select",options:selects("kelamin")}},agama:{type:Number,optional:!0,autoform:{type:"select",options:selects("agama")}},nikah:{type:Number,label:"Status Nikah",optional:!0,autoform:{type:"select",options:selects("nikah")}},pendidikan:{type:Number,label:"Pendidikan Terakhir",optional:!0,autoform:{type:"select",options:selects("pendidikan")}},darah:{type:Number,label:"Golongan Darah",optional:!0,autoform:{type:"select",options:selects("darah")}},pekerjaan:{type:Number,label:"Pekerjaan sekarang",optional:!0,autoform:{type:"select",options:selects("pekerjaan")}},tempat_tinggal:{type:String,optional:!0,label:"Alamat tempat tinggal"},kontak:{type:Number,optional:!0,label:"No. Handphone"},keluarga:{type:Object},"keluarga.ayah":{type:String,optional:!0,label:"Nama Ayah"},"keluarga.ibu":{type:String,optional:!0,label:"Nama Ibu"},"keluarga.pasangan":{type:String,optional:!0,label:"Nama Suami/Istri"},petugas:{type:String,autoform:{type:"hidden"},autoValue:()=>_.get(state.login,"_id")},tanggal_input:{type:Number,autoform:{type:"hidden"},autoValue:()=>_.now()}},rawatJalan:{idrawat:{type:String,autoform:{type:"hidden"},autoValue:()=>randomId()},tanggal:{type:Number,autoform:{type:"hidden"},autoValue:()=>_.now()},no_antrian:{type:String,optional:!0,exclude:!0},cara_bayar:{type:Number,autoform:{type:"select",options:selects("cara_bayar")}},no_sep:{type:String,optional:!0,autoform:{placeholder:"isikan bila cara bayar bpjs"}},klinik:{type:Number,autoform:{type:"select",options:selects("klinik")}},rujukan:{type:Number,autoform:{type:"select",options:selects("rujukan")}},sumber_rujukan:{type:String,optional:!0},penaggungjawab:{type:String,optional:!0}},soapPerawat:{anamnesa:{type:String,autoform:{type:"textarea"}},fisik:{type:Object},"fisik.tekanan_darah":{type:Object},"fisik.tekanan_darah.systolic":{type:Number,optional:!0},"fisik.tekanan_darah.diastolic":{type:Number,optional:!0},"fisik.nadi":{type:Number,optional:!0},"fisik.suhu":{type:Number,optional:!0},"fisik.pernapasan":{type:Number,optional:!0},"fisik.tinggi":{type:Number,optional:!0},"fisik.berat":{type:Number,optional:!0},"fisik.lila":{type:Number,optional:!0},tracer:{type:String,optional:!0,label:"File Tracer"},perawat:{type:String,autoform:{type:"hidden"},autoValue:()=>_.get(state.login,"_id")}},soapDokter:{anamnesa:{type:String,autoform:{type:"textarea"}},diagnosa:{type:Array},"diagnosa.$":{type:Object},"diagnosa.$.text":{type:String},tindakan:{type:Array,optional:!0},"tindakan.$":{type:Object},"tindakan.$.idtindakan":{type:String,autoform:{type:"select",options:(a,t)=>_.sortBy(state.daftarTindakan.map(a=>({value:a._id,label:a.nama})),["label"])}},"tindakan.$.jadwal":{type:Date,optional:!0,autoform:{type:"datetime-local",help:"Hanya untuk penjadwalan kedepan"}},bhp:{type:Array,optional:!0,label:"Barang habis pakai"},"bhp.$":{type:Object},"bhp.$.idbarang":{type:String,label:"Nama Barang",autoform:{type:"select",options:()=>state.bhpList.map(a=>({value:a._id,label:a.nama}))}},"bhp.$.jumlah":{type:Number},obat:{type:Array,optional:!0},"obat.$":{type:Object},"obat.$.idbarang":{type:String,label:"Nama Obat",autoform:{type:"select",options:()=>state.drugList.map(a=>({value:a._id,label:a.nama}))}},"obat.$.jumlah":{type:Number},"obat.$.puyer":{type:Number,optional:!0,autoform:{help:"kode unik puyer"}},"obat.$.aturan":{type:Object,optional:!0},"obat.$.aturan.kali":{type:Number},"obat.$.aturan.dosis":{type:String},radio:{type:Array,optional:!0,label:"Radiologi"},"radio.$":{type:Object},"radio.$.grup":{type:String,optional:!0,autoform:{help:"Saring berdasarkan kategori",type:"select",options:()=>_.uniq(state.references.filter(a=>"radiologi"===a[0]).map(a=>a[1])).map(a=>({value:a,label:_.startCase(a)}))}},"radio.$.idradio":{type:String,autoRedraw:!0,autoform:{type:"select",options:(a,t)=>_.sortBy(state.references.filter(e=>ands(["radiologi"===e[0],withThis(_.initial(a.split(".")).join(".")+".grup",a=>!_.get(t,a)||t[a]===e[1])])).map(a=>({value:a._id,label:a.nama})),"label")}},"radio.$.catatan":{type:String,optional:!0},labor:{type:Array,optional:!0,label:"Laboratorium"},"labor.$":{type:Object},"labor.$.grup":{type:String,optional:!0,autoform:{help:"Saring berdasarkan kategori",type:"select",options:()=>_.uniq(state.references.filter(a=>"laboratorium"===a[0]).map(a=>a[1])).map(a=>({value:a,label:_.startCase(a)}))}},"labor.$.idlabor":{type:String,autoRedraw:!0,autoform:{type:"select",options:(a,t)=>_.sortBy(state.references.filter(e=>ands(["laboratorium"===e[0],withThis(_.initial(a.split(".")).join(".")+".grup",a=>!_.get(t,a)||t[a]===e[1])])).map(a=>({value:a._id,label:a.nama})),"label")}},planning:{type:String,optional:!0,autoform:{type:"textarea"}},keluar:{type:Number,autoform:{type:"select",options:selects("keluar")}},rujuk:{type:Number,optional:!0,label:"Konsultasikan ke",autoform:{type:"select",help:"Hanya diisi bila pilihan keluar adalah Konsultasikan ke Poliklinik lain",options:selects("klinik")}},tracer:{type:String,optional:!0,label:"File Tracer"},spm:{type:Number,autoform:{type:"hidden"},autoValue:()=>_.now()-state.spm},dokter:{type:String,autoform:{type:"hidden"},autoValue:()=>_.get(state.login,"_id")},tanggal:{type:String,autoform:{type:"hidden"},autoValue:()=>_.now()}},account:{nama:{type:String,label:"Nama lengkap"},username:{type:String},password:{type:String,autoform:{type:"password"}},peranan:{type:Number,autoform:{type:"select",options:selects("peranan")}},bidang:{type:Number,optional:!0,autoform:{type:"select",options:selects("bidang")}},poliklinik:{type:Number,optional:!0,autoform:{type:"select",options:selects("klinik"),help:"hanya diisi bila pilihan bidang Rawat Jalan"}},keaktifan:{type:Number,autoform:{type:"select",options:selects("keaktifan")}}},barang:{nama:{type:String},jenis:{type:Number,autoform:{type:"select",options:selects("jenis_barang")}},kandungan:{type:String},satuan:{type:Number,autoform:{type:"select",options:selects("satuan")}},stok_minimum:{type:Object},"stok_minimum.gudang":{type:Number},"stok_minimum.apotik":{type:Number},kriteria:{type:Object},"kriteria.antibiotik":{type:Number,autoform:{type:"select",options:selects("boolean")}},"kriteria.narkotika":{type:Number,autoform:{type:"select",options:selects("boolean")}},"kriteria.psikotropika":{type:Number,autoform:{type:"select",options:selects("boolean")}},"kriteria.fornas":{type:Number,autoform:{type:"select",options:selects("boolean")}},kode_rak:{type:String,optional:!0},petugas:{type:String,autoform:{type:"hidden"},autoValue:()=>_.get(state.login,"_id")}},batch:{idbatch:{type:String,autoform:{type:"hidden"},autoValue:()=>randomId()},no_batch:{type:String},merek:{type:String},masuk:{type:Date},kadaluarsa:{type:Date},stok:{type:Object},"stok.gudang":{type:Number,autoform:{help:"Berdasarkan unit terkecil"}},harga:{type:Object},"harga.beli":{type:Number},"harga.jual":{type:Number},sumber:{type:Object},"sumber.supplier":{type:String},"sumber.anggaran":{type:String,optional:!0},"sumber.no_spk":{type:String,optional:!0},"sumber.tanggal_spk":{type:Date,optional:!0},petugas:{type:String,autoform:{type:"hidden"},autoValue:()=>_.get(state.login,"_id")}},amprah:{idamprah:{type:String,autoform:{type:"hidden"},autoValue:()=>randomId()},ruangan:{type:Number,autoform:{type:"hidden"},autoValue:()=>ors([_.get(state.login,"bidang"),_.get(state.login,"poliklinik")])},peminta:{type:String,autoform:{type:"hidden"},autoValue:()=>_.get(state.login,"_id")},diminta:{type:Number,label:"Jumlah diminta",minMax:()=>[1,_.get(state,"oneBatch.stok.gudang")]},tanggal_minta:{type:Number,autoform:{type:"hidden"},autoValue:()=>_.now()}},responAmprah:{diserah:{type:Number,label:"Jumlah diserahkan",minMax:()=>[1,_.get(state,"oneAmprah.digudang")]},penyerah:{type:String,autoform:{type:"hidden"},autoValue:()=>_.get(state.login,"_id")},tanggal_serah:{type:Number,autoform:{type:"hidden"},autoValue:()=>_.now()}},login:{username:{type:String},password:{type:String,autoform:{type:"password"}}},beds:{kelas:{type:String,autoform:{type:"select",options:()=>_.keys(beds).map(a=>({value:a,label:_.upperCase(a)}))}},kamar:{type:String,autoform:{type:"select",options:()=>_.flatten(_.values(beds).map(a=>_.keys(a.kamar))).map(a=>({value:a,label:_.startCase(a)}))}},nomor:{type:Number}},overcharge:{charges:{type:Array,optional:!0},"charges.$":{type:Object},"charges.$.item":{type:String,label:"Nama item"},"charges.$.harga":{type:Number}},confirmRadiology:{konfirmasi:{type:Number,autoform:{type:"select",options:selects("konfirmasi")}},tanggal:{type:Number,autoform:{type:"hidden"},autoValue:()=>_.now()}},responRadiology:{kode_berkas:{type:String},diagnosa:{type:String,autoform:{type:"textarea",rows:10}},pengarsipan:{type:Number,autoform:{type:"select",options:selects("pengarsipan")}},petugas:{type:String,autoform:{type:"hidden"},autoValue:()=>_.get(state.login,"_id")}},responLaboratory:{labor:{type:Array,fixed:!0},"labor.$":{type:Object},"labor.$.idlabor":{type:String,autoform:{type:"hidden"},autoValue:(a,t)=>t[a]},"labor.$.item_labor":{type:String,autoform:{type:"readonly"},exclude:!0,autoValue:(a,t)=>lookReferences(t[_.initial(a.split(".")).join(".")+".idlabor"]).nama},"labor.$.tanggal":{type:Number,autoform:{type:"hidden"},autoValue:()=>_.now()}},gizi:{konsumsi:{type:String,label:"Konsumsi gizi untuk pasien",optional:!0,autoform:{type:"textarea"}}}},kop={text:"RUMAH SAKIT MEDICARE\nJL. Dt. Laksamana No. 1, Pangkalan Kuras, Pelalawan, Provinsi Riau.\n\n",alignment:"center",bold:!0},makePdf={card:a=>pdfMake.createPdf(defaultStyle({content:["Nama: "+a.nama_lengkap,"No. MR: "+a.no_mr],pageSize:"B8",pageMargins:[110,50,0,0],pageOrientation:"landscape"})).download("kartu_peserta_"+a.no_mr),consent:a=>pdfMake.createPdf(defaultStyle({content:[kop,{text:"Data Umum Pasien\n",alignment:"center"},{columns:[["No. MR","Nama Lengkap","Tempat & Tanggal Lahir","Nama Ibu","Alamat","Kontak"],[a.no_mr,a.nama_lengkap,(a.tempat_lahir||"")+", "+hari(a.tanggal_lahir),_.get(a.keluarga,"ibu")||"",a.tempat_tinggal||"",a.kontak||""].map(a=>": "+a)]},{text:"\nPersetujuan Umum General Consent\n",alignment:"center"},{table:{body:[["S","TS",{text:"Keterangan",alignment:"center"}],["","","Saya akan mentaati peraturan yang berlaku di RS Medicare."],["","","Saya memberi kuasa kepada dokter dan semua tenaga kesehatan untuk melakukan pemeriksaan / pengobatan / tindakan yang diperlukan dalam upaya kesembuhan saya / pasien tersebut diatas."],["","","Saya memberi kuasa kepada dokter dan semua tenaga kesehatan yang ikut merawat saya untuk memberikan keterangan medis saya kepada yang bertanggungjawab atas biaya perawatan saya."],["","","Saya memberi kuasa kepada RS Medicare untuk menginformasikan identitas sosial saya kepada keluarga / rekan / masyarakat."],["","","Saya mengatakan bahwa informasi hasil pemeriksaan / rekam medis saya dapat digunakan untuk pendidikan / penelitian demi kemajuan ilmu kesehatan."]]}},"\nPetunjuk :\nS: Setuju\nTS: Tidak Setuju",{alignment:"justify",columns:[{text:"\n\n\n\n__________________\n"+state.login.nama,alignment:"center"},{text:"Pangkalan Kuras, "+hari(_.now())+"\n\n\n\n__________________\nPasien",alignment:"center"}]}]})).download("general_consent_"+a.no_mr),bayar_pendaftaran:(a,t,e)=>pdfMake.createPdf(defaultStyle({content:[kop,{columns:[["Tanggal","No. MR","Nama Pasien","Tarif","Petugas"],[hari(_.now()),a.identitas.no_mr,a.identitas.nama_lengkap,"Total: "+rupiah(_.sum([e>1?0:tarifKartu,1e3*+look("tarif_klinik",t.klinik)])),state.login.nama].map(a=>": "+a)]}]})).download("bayar_pendaftaran_"+a.identitas.no_mr),bayar_konsultasi:(a,t,e)=>pdfMake.createPdf(defaultStyle({content:[kop,{columns:[["No. MR","Nama Pasien","Jenis Kelamin","Tanggal Lahir","Umur","Layanan"],[a.identitas.no_mr,_.startCase(a.identitas.nama_lengkap),look("kelamin",a.identitas.kelamin)||"-",hari(a.identitas.tanggal_lahir),moment().diff(a.identitas.tanggal_lahir,"years")+" tahun",ors([t.observasi&&"Rawat Inap",t.klinik&&look("klinik",t.klinik).label,"Emergency"])]]},{text:"\n\nRincian Pembayaran",alignment:"center"},{table:{widths:["*","auto"],body:_.concat([["Uraian","Harga"]],[...e].map(a=>[a.item,rupiah(a.harga)]))}},"\nTotal Biaya "+rupiah(_.sum(e.map(a=>a.harga))),{text:"\nP. Kuras, "+hari(_.now())+"\n\n\n\n\nPetugas",alignment:"right"}]})).download("bayar_konsultasi_"+a.identitas.no_mr),soap:(a,t)=>pdfMake.createPdf(defaultStyle({content:[kop,{table:{widths:["auto","*","auto"],body:[["Nama: "+a.nama_lengkap,"Tanggal lahir: "+hari(a.tanggal_lahir),"No. MR: "+a.no_mr],["Kelamin: "+look("kelamin",a.kelamin),"Tanggal kunjungan: "+hari(ors([t.tanggal,t.tanggal_masuk,_.get(t,"soapDokter.tanggal")])),"Gol. Darah: "+look("darah",a.darah)],["Klinik: "+look("klinik",t.klinik),"Tanggal cetak: "+hari(_.now()),"Cara bayar: "+look("cara_bayar",t.cara_bayar)],["Perawat: "+(lookUser(_.get(t,"soapPerawat.perawat"))||"-"),"Dokter: "+(lookUser(_.get(t,"soapDokter.dokter"))||"-"),""]]}},t.soapPerawat?[{text:"\nSOAP Perawat",alignment:"center",bold:!0},{table:{widths:["*","*","*"],body:[["Tinggi/Berat: "+(_.get(t,"soapPerawat.fisik.tinggi")||"-")+"/"+(_.get(t,"soapPerawat.fisik.berat")||"-"),"Suhu: "+(_.get(t,"soapPerawat.fisik.suhu")||"-")+" C","LILA: "+(_.get(t,"soapPerawat.fisik.lila")||"-")],["Pernapasan: "+(_.get(t,"soapPerawat.fisik.pernapasan")||"-"),"Nadi: "+(_.get(t,"soapPerawat.fisik.nadi")||"-"),"Tekanan darah: "+_.join(_.values(_.get(t,"soapPerawat.fisik.tekanan_darah")||"-"),"/")]]}},"\n",{table:{widths:["auto","*"],body:[["Anamnesa perawat",_.get(t,"soapPerawat.anamnesa")||"-"],["Rujukan: "+look("rujukan",_.get(t,"soapPerawat.rujukan")),"Sumber: "+(_.get(t,"soapPerawat.sumber_rujukan")||"-")]]}}]:"",t.soapDokter?[{text:"\nSOAP Dokter",alignment:"center",bold:!0},{table:{widths:["auto","*"],body:[["Anamnesa dokter",_.get(t,"soapDokter.anamnesa")||"-"],["Planning",_.get(t,"soapDokter.planning")||"-"]]}},_.get(t,"soapDokter.diagnosa")&&[{text:"\nDiagnosa",alignment:"center"},{table:{widths:["*","auto"],body:[["Teks","ICD10"],..._.get(t,"soapDokter.diagnosa").map(a=>[a.text,a.code||"-"])]}}],_.get(t,"soapDokter.tindakan")&&[{text:"\nTindakan",alignment:"center"},{table:{widths:["*","auto"],body:[["Nama Tindakan","ICD9-CM"],..._.get(t,"soapDokter.tindakan").map(a=>[lookReferences(a.idtindakan).nama,a.code||"-"])]}}],_.get(t,"soapDokter.obat")&&[{text:"\nObat",alignment:"center"},{table:{widths:["*","auto","auto"],body:[["Nama obat","Jumlah","Puyer"],..._.get(t,"soapDokter.obat").map(a=>[_.get(lookGoods(a.idbarang),"nama"),a.jumlah,a.puyer||"-"])]}}],_.get(t,"soapDokter.radio")&&[{text:"\nRadiologi",alignment:"center"},{table:{widths:["*","auto","auto"],body:[["Radiologi","No. Berkas","Diagnosa"],..._.get(t,"soapDokter.radio").map(a=>[_.get(lookReferences(a.idradio),"nama"),a.kode_berkas,a.diagnosa])]}}],_.get(t,"soapDokter.labor")&&[{text:"\nLaboratorium",alignment:"center"},{table:{widths:["*","auto"],body:[["Laboratorium","Diagnosa"],..._.get(t,"soapDokter.labor").map(a=>[_.get(lookReferences(a.idlabor),"nama"),a.hasil||"-"])]}}]].filter(Boolean):""]})).download("soap_"+a.no_mr),resep:(a,t)=>pdfMake.createPdf(defaultStyle({content:[kop,{text:"Salinan Resep\n\n",alignment:"center",bold:!0},{table:{widths:["*","auto","auto","auto","auto","auto"],body:[["Nama Obat","Jumlah","Kali","Dosis","Puyer","Harga"],...[...a].map(a=>[a.nama_barang,a.serahkan+" unit",_.get(a,"aturan.kali")||"-",_.get(a,"aturan.dosis")||"-",a.puyer||"-",rupiah(a.harga||a.jual)]),["Total","","","","",rupiah(_.sum(a.map(a=>a.harga||a.jual)))]]}},{alignment:"justify",columns:[{text:"",alignment:"center"},{text:"\nPangkalan Kuras, "+hari(_.now())+"\n\n\n\n__________________\n"+state.login.nama,alignment:"center"}]},{text:"\n\n-------------------------------------potong disini------------------------------------------",alignment:"center"},{text:"\nInstruksi penyerahan obat"},{table:{body:[["Nama Barang","No. Batch","Jumlah"],...a.map(a=>[a.nama_barang,a.no_batch,a.serahkan])]}}]})).download("salinan_resep_"+t),report:(a,t,e)=>pdfMake.createPdf(defaultStyle({pageOrientation:"landscape",defaultStyle:{fontSize:10},content:[kop,{text:a,alignment:"center",bold:!0},e&&{text:e+"\n\n",alignment:"center",bold:!0},{table:{widths:_.range(t[0].length).map(a=>"*"),body:t}}]})).download("laporan_"+a),regQueue:a=>pdfMake.createPdf(defaultStyle({content:[{text:a+1}],pageSize:"B8"})).download("antrian_pendaftaran_"+(a+1)),radio:(a,t)=>pdfMake.createPdf(defaultStyle({content:[kop,{text:"Hasil Diagnosa Radiologist",fontSize:15,bold:!0,alignment:"center"},"\n\n",{table:{widths:["auto","*"],body:[["Nama Pasien",": "+a.nama_lengkap],["No. MR",": "+a.no_mr],["Petugas",": "+lookUser(t.petugas)],["Kode berkas",": "+t.kode_berkas]]},layout:"noBorders"},"\n\n",t.diagnosa,"\n\n\n",{alignment:"justify",columns:[{text:"\n\n\n\n__________________\nPasien",alignment:"center"},{text:"Pangkalan Kuras, "+hari(_.now())+"\n\n\n\n__________________\n"+lookUser(t.petugas),alignment:"center"}]}]})).download("hasil_radiologi_"+a.no_mr+"_"+t.kode_berkas),labor:(a,t)=>pdfMake.createPdf(defaultStyle({content:[kop,{text:"Hasil Diagnosa Laborat",fontSize:15,bold:!0,alignment:"center"},"\n\n",{table:{widths:["auto","*"],body:[["Nama uji laboratorium","Hasil"],...t.map(a=>[_.get(lookReferences(a.idlabor),"nama"),a.hasil])]}},"\n\n\n",{alignment:"justify",columns:[{text:"\n\n\n\n__________________\nPasien",alignment:"center"},{text:"Pangkalan Kuras, "+hari(_.now())+"\n\n\n\n__________________\nPetugas",alignment:"center"}]}]})).download("hasil_labor_"+a.no_mr)};_.assign(comp,{registration:()=>1!==state.login.bidang?m("p","Hanya untuk user pendaftaran"):m(".content",m("h1","Pencarian Pasien"),m(".control.is-expanded",m("input.input.is-fullwidth",{type:"text",placeholder:"Cari dengan nama lengkap atau No. MR",onkeypress:a=>[ands(["Enter"===a.key,a.target.value.length>3])&&[state.loading=!0,m.redraw(),db.patients.filter(t=>_.includes(_.lowerCase(t.identitas.nama_lengkap)+t.identitas.no_mr,a.target.value)).toArray(a=>[_.assign(state,{searchPatients:a,loading:!1}),m.redraw()])]]})),m("br"),state.loading&&m("progress.progress.is-small.is-primary"),state.searchPatients&&m("p.help","* Berurut berdasarkan tanggal lahir"),m(".box",m("table.table.is-striped",m("thead",m("tr",["Kunjungan Terakhir","No. MR","Nama lengkap","Tanggal lahir","Tempat lahir"].map(a=>m("th",a)))),m("tbody",(state.searchPatients||[]).sort((a,t)=>a.identitas.tanggal_lahir-t.identitas.tanggal_lahir).map(a=>m("tr",{ondblclick:()=>_.assign(state,{route:"onePatient",onePatient:a})},tds([hari(_.get(_.last([...a.rawatJalan||[],...a.emergency||[]]),"tanggal")),a.identitas.no_mr,a.identitas.nama_lengkap,hari(a.identitas.tanggal_lahir),a.identitas.tempat_lahir])))))),state.searchPatients&&m(".button.is-primary",{onclick:()=>_.assign(state,{route:"newPatient",searchPatients:null})},makeIconLabel("user-plus","Pasien baru"))),newPatient:()=>m(".content",m("h3","Pendaftaran Pasien Baru"),m(autoForm({id:"newPatient",schema:schemas.identitas,confirmMessage:"Yakin ingin menambahkan pasien BARU?",action:a=>withThis({identitas:a,_id:randomId()},t=>[insertBoth("patients",t),a.no_antrian&&db.queue.toArray(t=>withThis(t.find(t=>t.no_antrian===a.no_antrian),a=>updateBoth("queue",a._id,_.merge(a,{done:!0})))),_.assign(state,{route:"onePatient",onePatient:t})])}))),updatePatient:()=>m(".content",m("h3","Update identitas pasien"),m(autoForm({id:"updatePatient",schema:schemas.identitas,doc:state.onePatient.identitas,action:a=>[updateBoth("patients",state.onePatient._id,_.assign(state.onePatient,{identitas:a})),state.route="onePatient",m.redraw()]}))),poliVisit:()=>m(".content",m("h3","Form Pendaftaran Poli"),m(".box",m(autoForm({id:"poliVisit",autoReset:!0,schema:schemas.rawatJalan,confirmMessage:"Yakin untuk mendaftarkan pasien ke klinik?",action:a=>db.patients.filter(a=>a.rawatJalan&&a.rawatJalan.filter(a=>ands([1===a.klinik,a.tanggal>startOfTheDay(+moment())])).length).toArray(t=>[updateBoth("patients",state.onePatient._id,_.assign(state.onePatient,{rawatJalan:[...state.onePatient.rawatJalan||[],_.merge(a,{antrian:t.length+1})]})),a.no_antrian&&db.queue.toArray(t=>withThis(t.find(t=>t.no_antrian===a.no_antrian),a=>updateBoth("queue",a._id,_.merge(a,{done:!0})))),state.route="onePatient",m.redraw()])}))))}),_.assign(comp,{onePatient:()=>withThis(state.onePatient.identitas,a=>m(".content",{onupdate:()=>[db.references.toArray(a=>state.references=a),db.goods.toArray(a=>state.goodsList=a),db.users.toArray(a=>state.userList=a)]},m("h3","Rekam Medik Pasien"),m(".box",m("table.table.is-striped",_.chunk([["No. MR",a.no_mr],["Nama Lengkap",a.nama_lengkap],["Tanggal lahir",hari(a.tanggal_lahir)],["Tempat lahir",a.tempat_lahir],["Jenis kelamin",look("kelamin",a.kelamin)],["Agama",look("agama",a.agama)],["Status nikah",look("nikah",a.nikah)],["Pendidikan terakhir",look("pendidikan",a.pendidikan)],["Golongan Darah",look("darah",a.darah)],["Pekerjaan",look("pekerjaan",a.pekerjaan)],["Tempat tinggal",a.tempat_tinggal],["Umur",moment().diff(a.tanggal_lahir,"years")+" tahun"],["Nama Bapak",a.keluarga.ayah],["Nama Ibu",a.keluarga.ibu],["Nama Suami/Istri",a.keluarga.pasangan],["No. Handphone",a.kontak]],4).map(a=>m("tr",a.map(a=>[m("th",a[0]),m("td",a[1])]))))),m("p.buttons",[{label:"Cetak kartu",icon:"id-card",color:"info",click:()=>makePdf.card(a)},{label:"General consent",icon:"file-contract",color:"info",click:()=>makePdf.consent(a)},{label:"Update pasien",icon:"edit",color:"warning",click:()=>state.route="updatePatient"},{label:"Riwayat SOAP",icon:"bars",color:"info",click:()=>state.modalRekapSoap=m(".box",m("h3","Rekap SOAP Pasien"),m("p.help","Berurut kronologis"),[...state.onePatient.rawatJalan||[],...state.onePatient.emergency||[]].map(a=>m("table.table",a.soapPerawat&&a.soapDokter&&[["Tanggal Kunjungan",hari(a.tanggal,!0)],["Layanan",a.klinik?look("klinik",a.klinik):"Emergency"],["Anamnesa Perawat",a.soapPerawat.anamnesa],["Diagnosa Dokter",a.soapDokter.diagnosa.map(a=>a.text).join(", ")]].map(a=>m("tr",m("th",a[0]),m("td",a[1]))))))}].map(a=>m(".button.is-"+a.color,{onclick:a.click},makeIconLabel(a.icon,a.label)))),makeModal("modalRekapSoap"),m(".tabs.is-boxed",m("ul",{style:"margin-left: 0%"},_.map({outpatient:["Riwayat Rawat Jalan","walking"],emergency:["Riwayat IGD","ambulance"],inpatient:["Riwayat Rawat Inap","bed"]},(a,t)=>m("li",{class:ors([t===state.onePatientTab,ands([!state.onePatientTab,_.get(state,"login.poliklinik"),"outpatient"===t])])&&"is-active"},m("a",{onclick:()=>[state.onePatientTab=t,m.redraw()]},makeIconLabel(a[1],a[0])))))),m("div",{outpatient:comp.outPatientHistory(),emergency:comp.emergencyHistory(),inpatient:comp.inpatientHistory()}[state.onePatientTab||ors([_.get(state,"login.poliklinik")&&"outpatient"])]))),formSoap:()=>m(".content",{onupdate:()=>[db.goods.toArray(a=>_.assign(state,{goodsList:a,drugList:a.filter(a=>ands([1===a.jenis,a.batch.filter(a=>ands([a.stok.apotik,a.kadaluarsa>_.now()])).length])),bhpList:a.filter(a=>2===a.jenis)})),db.references.filter(a=>_.every(["rawatJalan"===a[0],a[1]===_.snakeCase(look("klinik",state.login.poliklinik))])).toArray(a=>state.daftarTindakan=a),db.references.filter(a=>"radiologi"===a[0]).toArray(a=>state.daftarRadio=a),state.spm=_.now()]},m("h3","Form SOAP"),m(autoForm({id:"soapMedis",autoReset:!0,confirmMessage:"Yakin untuk menyimpan SOAP?",schema:ors([2===state.login.peranan&&schemas.soapPerawat,3===state.login.peranan&&ors([state.oneInap&&_.merge(_.omit(schemas.soapDokter,["rujuk","keluar"]),schemas.gizi),schemas.soapDokter])]),action:a=>withThis(ands([!_.get(state,"oneInap"),_.get(state,"oneRawat.klinik")?"rawatJalan":"emergency"]),t=>[t&&updateBoth("patients",state.onePatient._id,_.assign(state.onePatient,{[t]:state.onePatient[t].map(t=>t.idrawat===state.oneRawat.idrawat?_.merge(state.oneRawat,ors([2===state.login.peranan&&{soapPerawat:a},3===state.login.peranan&&{soapDokter:a}])):t)})),state.oneInap&&updateBoth("patients",state.onePatient._id,_.assign(state.onePatient,{rawatInap:state.onePatient.rawatInap.map(t=>t.idinap===state.oneInap.idinap?_.assign(state.oneInap,{observasi:state.oneInap.observasi.concat([_.merge(a,{tanggal:_.now(),idobservasi:randomId()})])}):t)})),ands([2===a.keluar,a.rujuk])&&updateBoth("patients",state.onePatient._id,_.assign(state.onePatient,{rawatJalan:[...state.onePatient.rawatJalan||[],_.assign(_.pick(state.oneRawat,["cara_bayar","sumber_rujukan","penanggungjawab","no_sep"]),{idrawat:randomId(),tanggal:_.now(),klinik:a.rujuk})]})),_.assign(state,{route:"onePatient",oneRawat:null,oneInap:null}),m.redraw()])})))}),_.assign(comp,{icd:()=>1!==state.login.bidang?m("p","Hanya untuk bidang Pendaftaran/ICD"):m(".content",m("h3","Kodifikasi Diagnosa ICD 10 & ICD 9-CM"),m(".box",m("table.table.is-striped",m("thead",m("tr",["Nama pasien","Tanggal kunjungan","Layanan","Perawat","Dokter","ICD10","ICD9CM"].map(a=>m("th",a)))),m("tbody",{onupdate:()=>[db.patients.toArray(a=>state.codifications=_.compact(a.flatMap(a=>[...a.rawatJalan||[],...a.emergency||[],...a.rawatInap?a.rawatInap.flatMap(a=>a.observasi?a.observasi.map(t=>t.dokter&&{idinap:a.idinap,soapDokter:t,tanggal:a.tanggal_masuk}):[]):[]].flatMap(t=>[..._.get(t,"soapDokter.diagnosa")||[],..._.get(t,"soapDokter.tindakan")||[]].filter(a=>!a.code).length&&{pasien:a,rawat:t})))),db.references.toArray(a=>state.references=a)]},(state.codifications||[]).sort((a,t)=>a.rawat.tanggal-t.rawat.tanggal).map(({pasien:a,rawat:t})=>m("tr",m("td",a.identitas.nama_lengkap),m("td",hari(t.tanggal)),m("td",ors([t.klinik&&look("klinik",t.klinik),t.idrawat&&"IGD","Rawat Inap"])),m("td",lookUser(_.get(t,"soapPerawat.perawat"))),m("td",lookUser(t.soapDokter.dokter)),m("td",m(".button",{onclick:()=>state.modalICD10=m(".box",m("h4","Form kodifikasi diagnosa ICD10"),m("form",{onsubmit:e=>confirm("Yakin dengan ICD ini?")&&withThis(t.idrawat&&t.klinik?"rawatJalan":"emergency",n=>[e.preventDefault(),t.idrawat?updateBoth("patients",a._id,_.assign({_id:a._id,identitas:a.identitas,rawatJalan:a.rawatJalan||[],emergency:a.emergency||[],rawatInap:a.rawatInap||[]},{[n]:a[n].map(a=>a.idrawat===t.idrawat?_.assign(a,{soapDokter:_.assign(a.soapDokter,{diagnosa:a.soapDokter.diagnosa.map((a,t)=>({text:a.text,code:_.compact(_.map(e.target,a=>a.name&&a.value))[t]}))})}):a)}),a=>a&&[state.codifications=[],m.redraw()]):updateBoth("patients",a._id,{_id:a._id,identitas:a.identitas,rawatJalan:a.rawatJalan||[],emergency:a.emergency||[],rawatInap:a.rawatInap.map(a=>a.idinap===t.idinap?_.assign(a,{observasi:a.observasi.map(a=>a.idobservasi===t.soapDokter.idobservasi?_.assign(a,{diagnosa:a.diagnosa.map((a,t)=>({text:a.text,code:_.compact(_.map(e.target,a=>a.name&&a.value))[t]}))}):a)}):a)},a=>a&&[state.codifications=[],m.redraw()]),state.modalICD10=null,m.redraw()])},m("table.table",m("thead",m("tr",m("th","Teks"),m("th","Kode"))),m("tbody",t.soapDokter.diagnosa.map((a,t)=>m("tr",m("td",a.text),m("td",m("input.input",{type:"text",name:t,value:a.code})))))),m("input.button.is-primary",{type:"submit",value:"Submit"})))},_.every((_.get(t,"soapDokter.diagnosa")||[]).map(a=>a.code))?"Selesai":"Belum")),m("td",t.soapDokter.tindakan&&m(".button",{onclick:()=>state.modalICD9=m(".box",m("h4","Form kodifikasi tindakan ICD9"),m("form",{onsubmit:e=>confirm("Yakin dengan ICD ini?")&&withThis(t.idrawat&&t.klinik?"rawatJalan":"emergency",n=>[e.preventDefault(),t.idrawat?updateBoth("patients",a._id,_.assign({_id:a._id,identitas:a.identitas,rawatJalan:a.rawatJalan||[],emergency:a.emergency||[],rawatInap:a.rawatInap||[]},{[n]:a[n].map(a=>a.idrawat===t.idrawat?_.assign(a,{soapDokter:_.assign(a.soapDokter,{tindakan:a.soapDokter.tindakan.map((a,t)=>({text:a.idtindakan,code:_.compact(_.map(e.target,a=>a.name&&a.value))[t]}))})}):a)}),a=>a&&[state.codifications=[],m.redraw()]):updateBoth("patients",a._id,{_id:a._id,identitas:a.identitas,rawatJalan:a.rawatJalan||[],emergency:a.emergency||[],rawatInap:a.rawatInap.map(a=>a.idinap===t.idinap?_.assign(a,{observasi:a.observasi.map(a=>a.idobservasi===t.soapDokter.idobservasi?_.assign(a,{tindakan:a.tindakan.map((a,t)=>({text:a.text,code:_.compact(_.map(e.target,a=>a.name&&a.value))[t]}))}):a)}):a)},a=>a&&[state.codifications=[],m.redraw()]),state.modalICD9=null,m.redraw()])},m("table.table",m("thead",m("tr",m("th","Teks"),m("th","Kode"))),m("tbody",(_.get(t,"soapDokter.tindakan")||[]).map((a,t)=>m("tr",m("td",lookReferences(a.idtindakan).nama),m("td",m("input.input",{type:"text",name:t,value:a.code})))))),m("input.button.is-primary",{type:"submit",value:"Submit"})))},_.every((_.get(t,"soapDokter.tindakan")||[]).map(a=>a.code))?"Selesai":"Belum"))))))),makeModal("modalICD10"),makeModal("modalICD9"))}),_.assign(comp,{outpatient:()=>_.includes([2,3],state.login.peranan)?m(".content",reports.outpatient(),m("h3","Antrian pasien poliklinik "+look("klinik",state.login.poliklinik)),m(".box",m("table.table.is-striped",m("thead",m("tr",["Kunjungan Terakhir","No. MR","Nama lengkap","Tanggal lahir","Tempat lahir"].map(a=>m("th",a)))),m("tbody",{onupdate:()=>db.patients.toArray(a=>state.clinicQueue=a.filter(a=>withThis(_.last(a.rawatJalan),a=>a&&ands([a.klinik===state.login.poliklinik,!a.soapDokter]))))},(state.clinicQueue||[]).sort((a,t)=>withThis(a=>_.get(_.last(a.rawatJalan),"tanggal"),e=>e(a)-e(t))).map(a=>m("tr",{ondblclick:()=>_.assign(state,{route:"onePatient",onePatient:a})},tds([hari(_.get(_.last(a.rawatJalan),"tanggal"),!0),a.identitas.no_mr,a.identitas.nama_lengkap,hari(a.identitas.tanggal_lahir),a.identitas.tempat_lahir]))))))):m("p","Hanya untuk tenaga medis"),outPatientHistory:()=>m(".content",m(".box",m("table.table.is-striped",{onupdate:()=>dbCall({method:"findOne",collection:"patients",_id:state.onePatient._id},a=>a&&db.patients.put(a))},m("thead",m("tr",["Tanggal berobat","Poliklinik","Cara bayar","Perawat","Dokter"].map(a=>m("th",a)),4===state.login.peranan&&m("th","Hapus"))),m("tbody",(_.get(state.onePatient,"rawatJalan")||[]).map(a=>m("tr",{ondblclick:()=>[state.modalVisit=_.includes([2,3,4],state.login.peranan)&&ors([1!==a.cara_bayar,a.bayar_pendaftaran])&&m(".box",m("h3","Rincian Kunjungan Rawat Jalan"),m("table.table",m("tr",m("th","Tanggal"),m("td",hari(a.tanggal,!0))),m("tr",m("th","Poliklinik"),m("td",look("klinik",a.klinik))),m("tr",m("th","Cara bayar"),m("td",look("cara_bayar",a.cara_bayar))),makeRincianSoapPerawat(a.soapPerawat),makeRincianSoapDokter(a.soapDokter)),m("p.buttons",ands([1!==state.login.peranan,ors([2===state.login.peranan&&!a.soapPerawat,3===state.login.peranan&&!a.soapDokter]),m(".button.is-success",{onclick:()=>_.assign(state,{route:"formSoap",oneRawat:a,modalVisit:null})},makeIconLabel("user-md",3===state.login.peranan?"Soap Dokter":"Soap Perawat"))]),m(".button.is-info",{onclick:()=>makePdf.soap(state.onePatient.identitas,a)},makeIconLabel("print","Cetak SOAP")),_.get(a.soapDokter,"labor")&&m(".button.is-info",{onclick:()=>makePdf.labor(state.onePatient.identitas,a.soapDokter.labor)},makeIconLabel("print","Cetak Labor"))))]},tds([hari(a.tanggal),look("klinik",a.klinik),look("cara_bayar",a.cara_bayar),lookUser(_.get(a,"soapPerawat.perawat")),lookUser(_.get(a,"soapDokter.dokter"))]),ands([4===state.login.peranan,!a.bayar_konsultasi])&&m("td",m(".button.is-danger",{"data-tooltip":"klik ganda bila yakin hapus",ondblclick:t=>[t.stopPropagation(),updateBoth("patients",state.onePatient._id,_.assign(state.onePatient,{rawatJalan:state.onePatient.rawatJalan.filter(t=>t.idrawat!==a.idrawat)}))]},makeIconLabel("trash-alt","Hapus")))))))),m("p.help.has-text-grey-light","Note: Jika pasien umum belum bayar maka tidak dapat diklik"),makeModal("modalVisit"),1===state.login.bidang&&m(".button.is-success",{onclick:()=>state.route="poliVisit"},makeIconLabel("file-invoice","Kunjungi Rawat Jalan")))}),_.assign(comp,{inpatient:()=>_.includes([2,3],state.login.peranan)?m(".content",reports.inpatient(),m("h3","Daftar Admisi Rawat Inap"),m(".box",m("table.table.is-striped",{onupdate:()=>db.patients.toArray(a=>state.admissionList=_.compact(a.flatMap(a=>[...a.rawatJalan||[],...a.emergency||[]].flatMap(t=>ands([3===_.get(t,"soapDokter.keluar"),0===(a.rawatInap||[]).filter(a=>a.idrawat===t.idrawat).length,{pasien:a,inap:t}])))))},m("thead",m("tr",["No. MR","Nama Pasien","Tanggal admisi","Sumber admisi","Dokter"].map(a=>m("th",a)))),m("tbody",(state.admissionList||[]).sort((a,t)=>withThis(a=>_.get(a.inap,"tanggal"),e=>e(a)-e(t))).map(a=>m("tr",{ondblclick:()=>[state.admissionModal=m(".box",m("h4","Inapkan pasien"),m("table.table",[["Nama Lengkap",a.pasien.identitas.no_mr],["Cara bayar",look("cara_bayar",a.inap.cara_bayar)],["Anamnesa Perawat",_.get(a,"inap.soapPerawat.anamnesa")],["Anamnesa Dokter",_.get(a,"inap.soapDokter.anamnesa")]].map(a=>m("tr",m("th",a[0]),m("td",a[1])))),m(autoForm({id:"formBed",schema:schemas.beds,action:t=>[updateBoth("patients",a.pasien._id,_.assign(a.pasien,{rawatInap:[...a.pasien.rawatInap||[],{tanggal_masuk:_.now(),dokter:a.inap.soapDokter.dokter,observasi:[],idinap:randomId(),idrawat:a.inap.idrawat,cara_bayar:a.inap.cara_bayar,bed:t}]})),_.assign(state,{admissionList:null,admissionModal:null}),m.redraw()]}))),m.redraw()]},tds([a.pasien.identitas.no_mr,a.pasien.identitas.nama_lengkap,hari(a.inap.tanggal,!0),_.get(a.inap,"klinik")?"Rawat Jalan":"IGD",lookUser(_.get(a.inap,"soapDokter.dokter"))])))))),makeModal("admissionModal"),m("br"),m("h3","Daftar Pasien Menginap"),m("p.help","* Urut berdasarkan tanggal masuk terbaru"),m(".box",m("table.table.is-striped",{onupdate:()=>db.patients.toArray(a=>[state.inpatientList=a.filter(a=>a.rawatInap&&a.rawatInap.filter(a=>!a.keluar).length>0),m.redraw()])},m("thead",m("tr",["No. MR","Nama Pasien","Kelas / Kamar / Nomor","Tanggal Masuk"].map(a=>m("th",a)))),m("tbody",(state.inpatientList||[]).sort((a,t)=>withThis(a=>_.get(_.last(a.rawatInap),"tanggal_masuk"),e=>e(t)-e(a))).map(a=>withThis(_.get(_.last(a.rawatInap),"bed"),t=>t&&m("tr",{ondblclick:()=>_.assign(state,{route:"onePatient",onePatient:a,onePatientTab:"inpatient"})},tds([a.identitas.no_mr,a.identitas.nama_lengkap,[_.upperCase(t.kelas),_.startCase(t.kamar),t.nomor].join(" / "),hari(_.get(_.last(a.rawatInap),"tanggal_masuk"),!0)])))))))):m("p","Hanya untuk tenaga medis"),inpatientHistory:()=>m(".content",m(".box",m("table.table.is-striped",m("thead",m("tr",["Tanggal masuk","Kelas / Kamar / Nomor"].map(a=>m("th",a)))),m("tbody",(state.onePatient.rawatInap||[]).map(a=>m("tr",{ondblclick:()=>state.modalObservasi=_.includes([2,3,4],state.login.peranan)&&m(".box",m("h3","Riwayat Observasi"),Boolean(a.observasi.length)&&m("p.help.is-italic.has-text-info","klik-ganda pada salah satu observasi untuk melihat rincian"),m("table.table",m("thead",m("tr",["Waktu","Anamnesa","Petugas"].map(a=>m("th",a)))),m("tbody",a.observasi.map(a=>m("tr",{ondblclick:()=>[state.modalObservasi=null,state.modalSoap=m(".box",m("h4","Rincian SOAP"),m("table.table",m("tr",m("th","Waktu observasi"),m("td",hari(a.tanggal,!0))),a.diagnosa?makeRincianSoapDokter(a):makeRincianSoapPerawat(a)),m(".button.is-info",{onclick:()=>makePdf.soap(state.onePatient.identitas,a.perawat?{soapPerawat:a}:{soapDokter:a})},makeIconLabel("print","Cetak SOAP"))),m.redraw()]},tds([hari(a.tanggal),a.anamnesa,lookUser(a.perawat||a.dokter)]))))),!a.keluar&&m("p.buttons",m(".button.is-success",{onclick:()=>[_.assign(state,{route:"formSoap",oneInap:a,modalObservasi:null}),m.redraw()]},makeIconLabel("user-md","Tambah observasi")),m(".button.is-danger",{ondblclick:()=>[updateBoth("patients",state.onePatient._id,_.assign(state.onePatient,{rawatInap:state.onePatient.rawatInap.map(t=>t.idinap===a.idinap?_.assign(t,{keluar:_.now()}):t)})),state.modalObservasi=null,m.redraw()]},makeIconLabel("door-open","Pulangkan pasien"))))},makeModal("modalSoap"),tds([hari(a.tanggal_masuk),a.bed&&[_.upperCase(a.bed.kelas),_.startCase(a.bed.kamar),a.bed.nomor].join(" / ")])))))),makeModal("modalObservasi")),beds:()=>ors([_.includes([2,3],state.login.peranan),_.includes([1],state.login.bidang)])?m(".content",m("h3","Daftar Ketersediaan Bed"),m(".box",m("table.table.is-striped",{onupdate:()=>db.patients.toArray(a=>[state.inpatientList=a.filter(a=>a.rawatInap&&a.rawatInap.filter(a=>!a.keluar).length>0),m.redraw()])},m("tr",["Kelas","Kamar","No. Bed","Penginap"].map(a=>m("th",a))),state.inpatientList&&_.flattenDepth(_.map(beds,(a,t)=>_.map(a.kamar,(a,e)=>_.range(a).map(a=>[t,e,a+1,_.get(state.inpatientList.find(n=>n.rawatInap.find(n=>n.bed&&ands([n.bed.kelas===t,n.bed.kamar===e,n.bed.nomor===a+1]))),"identitas.nama_lengkap")]))),2).map(a=>m("tr",a.map(a=>m("td",_.upperCase(a)))))))):m("p","Hanya untuk tenaga medis")});var beds={vip:{tarif:350,kamar:{tulip:1,bougenvil:1,sakura:1}},kl1:{tarif:200,kamar:{kenanga:2,cempaka:2,claudia:2,ferbia:2,yasmin:2,edelwise:2}},kl2:{tarif:150,kamar:{seroja:3,mawar:2,dahlia:2,lili:2,zahara:2,matahari:4}},kl3:{tarif:100,kamar:{anggrek:4,teratai:7,kertas:3,melati:5}}};_.assign(comp,{emergency:()=>_.includes([2,3],state.login.peranan)?m(".content",{onupdate:()=>db.patients.toArray(a=>state.emergencyList=a.filter(a=>a.emergency&&a.emergency.filter(a=>!a.soapDokter).length>0))},reports.igd(),m("h3","Unit Gawat Darurat"),m(".box",m("table.table.is-striped",m("thead",m("tr",["No. MR","Nama Pasien","Jam Masuk"].map(a=>m("th",a)))),m("tbody",state.emergencyList&&state.emergencyList.sort((a,t)=>withThis(a=>_.get(_.last(a.emergency),"tanggal"),e=>e(a)-e(t))).map(a=>m("tr",{ondblclick:()=>[_.assign(state,{route:"onePatient",onePatient:a,onePatientTab:"emergency"}),m.redraw()]},m("td",a.identitas.no_mr),m("td",a.identitas.nama_lengkap),m("td",hari(_.get(_.last(a.emergency),"tanggal"),!0)))))))):m("p","Hanya untuk tenaga medis"),emergencyHistory:()=>m(".content",m(".box",m("table.table",m("thead",m("tr",["Tanggal berobat","Cara bayar","Perawat","Dokter"].map(a=>m("th",a)),4===state.login.peranan&&m("th","Hapus"))),m("tbody",(_.get(state,"onePatient.emergency")||[]).map(a=>m("tr",{ondblclick:()=>state.modalVisit=m(".box",m("h4","Rincian kunjungan IGD"),m("table.table",m("tr",m("th","Tanggal berobat"),m("td",hari(a.tanggal))),m("tr",m("th","Cara bayar"),m("td",look("cara_bayar",a.cara_bayar))),m("tr",m("th","Perawat"),m("td",lookUser(_.get(a,"soapPerawat.perawat")))),m("tr",m("th","Dokter"),m("td",lookUser(_.get(a,"soapDokter.dokter")))),makeRincianSoapPerawat(a.soapPerawat),makeRincianSoapDokter(a.soapDokter)),m("p.buttons",ands([1!==state.login.peranan,ors([2===state.login.peranan&&!a.soapPerawat,3===state.login.peranan&&!a.soapDokter]),m(".button.is-success",{onclick:()=>_.assign(state,{route:"formSoap",oneRawat:a,modalVisit:null})},makeIconLabel("user-md",3===state.login.peranan?"Soap Dokter":"Soap Perawat"))]),m(".button.is-info",{onclick:()=>makePdf.soap(state.onePatient.identitas,a)},makeIconLabel("print","Cetak SOAP"))))},tds([hari(a.tanggal),look("cara_bayar",a.cara_bayar),lookUser(_.get(a,"soapPerawat.perawat")),lookUser(_.get(a,"soapDokter.dokter"))]),ands([4===state.login.peranan,!a.bayar_konsultasi])&&m("td",m(".button.is-danger",{"data-tooltip":"klik ganda bila yakin hapus",ondblclick:t=>[t.stopPropagation(),updateBoth("patients",state.onePatient._id,_.assign(state.onePatient,{emergency:state.onePatient.emergency.filter(t=>t.idrawat!==a.idrawat)}))]},makeIconLabel("trash-alt","Hapus")))))))),1===state.login.bidang&&m(".button.is-success",{onclick:()=>state.route="igdVisit"},makeIconLabel("file-invoice","Kunjungi IGD")),makeModal("modalVisit")),igdVisit:()=>m(".content",m("h3","Form pendaftaran IGD"),m(".box",m(autoForm({id:"igdVisit",autoReset:!0,schema:_.omit(schemas.rawatJalan,"klinik"),confirmMessage:"Yakin untuk mendaftarkan pasien ke IGD?",action:a=>[updateBoth("patients",state.onePatient._id,_.assign(state.onePatient,{emergency:[..._.get(state,"onePatient.emergency")||[],a]})),state.route="onePatient",m.redraw()]}))))}),_.assign(comp,{storage:()=>ors([_.includes([3,4],state.login.bidang),_.includes([2,3],state.login.peranan)])?m(".content",{onupdate:()=>db.goods.toArray(a=>[state.goodsList=a,m.redraw()])},m("h1","Gudang Farmasi"),m(".field.has-addons",m(".control.is-expanded",m("input.input.is-fullwidth",{type:"text",placeholder:"cari barang...",onkeypress:a=>db.goods.filter(t=>_.includes(_.lowerCase(t.nama+" "+t.kandungan),a.target.value)).toArray(a=>[state.searchGoods=a,m.redraw()])})),m(".control",m("a.button.is-info",{onclick:()=>state.searchGoods=null},"Show All"))),m(".box",m("table.table.is-striped",m("thead",m("tr",["Jenis","Nama","Satuan","Gudang","Apotik","Retur"].map(a=>m("th",a)))),m("tbody",(state.searchGoods||state.goodsList||[]).map(a=>m("tr",{ondblclick:()=>_.assign(state,{route:"oneGood",oneGood:a})},tds([look("jenis_barang",+a.jenis),a.nama,look("satuan",a.satuan)]),a.batch&&["gudang","apotik","retur"].map(t=>withThis(_.sum(a.batch.map(a=>_.get(a.stok,t)||0)),e=>m("td",{class:e_.assign(state,{route:"formGood",oneGood:null})},makeIconLabel("plus","Tambah barang"))):m("p","Hanya untuk user farmasi, apotik dan petugas medis"),formGood:()=>m(".content",m("h3","Form input jenis barang baru"),m(autoForm({id:"formGood",schema:schemas.barang,confirmMessage:"Yakin untuk menyimpan JENIS barang baru?",doc:state.oneGood,action:a=>withThis(_.assign(state.oneGood||{},a,{_id:_.get(state,"oneGood._id")||randomId()}),a=>[state.oneGood?updateBoth("goods",state.oneGood._id,a):insertBoth("goods",a),_.assign(state,{route:"oneGood",oneGood:a})])}))),oneGood:()=>m(".content",{oncreate:()=>[db.users.toArray(a=>state.userList=a),dbCall({method:"findOne",collection:"goods",_id:state.oneGood._id},a=>a&&db.goods.put(a))]},m("h3","Rincian barang"),m(".box",m("table.table.is-striped",_.chunk([["Nama barang",state.oneGood.nama],["Jenis barang",look("jenis_barang",state.oneGood.jenis)],["Kode Rak",state.oneGood.kode_rak],["Antibiotik",look("boolean",_.get(state.oneGood,"kriteria.antibiotik"))],["Narkotika",look("boolean",_.get(state.oneGood,"kriteria.narkotika"))],["Psikotropika",look("boolean",_.get(state.oneGood,"kriteria.psikotropika"))],["Fornas",look("boolean",_.get(state.oneGood,"kriteria.fornas"))],["Min. Gudang",_.get(state,"oneGood.stok_minimum.gudang")],["Min. Apotik",_.get(state,"oneGood.stok_minimum.apotik")],["Kandungan",state.oneGood.kandungan],["Satuan",look("satuan",state.oneGood.satuan)]],3).map(a=>m("tr",a.map(a=>[m("th",a[0]),m("td",a[1])]))))),3===state.login.bidang&&m(".buttons",m(".button.is-primary",{onclick:()=>state.route="formBatch"},m("span.icon",m("i.fas.fa-plus-circle")),m("span","Tambah batch")),m(".button.is-warning",{onclick:()=>state.route="formGood"},m("span.icon",m("i.fas.fa-edit")),m("span","Edit obat")),4===state.login.peranan&&[m(".button.is-danger",{"data-tooltip":"Kosongkan semua batch barang ini",ondblclick:()=>[confirm("Yakin untuk stok opname jenis barang ini?")&&updateBoth("goods",state.oneGood._id,_.assign(state.oneGood,{batch:[]})),state.route="storage",m.redraw()]},m("span.icon",m("i.fas.fa-recycle")),m("span","Stok Opname")),m(".button.is-danger",{"data-tooltip":"Menghapus barang dapat merusak riwayat transaksi yang berhubungan dengan barang ini",ondblclick:()=>[confirm("Yakin untuk menghapus jenis barang?")&&deleteBoth("goods",state.oneGood._id,a=>a&&[state.route="storage",m.redraw()])]},m("span.icon",m("i.fas.fa-trash-alt")),m("span","Hapus barang"))]),m("p"),m("h4","Daftar batch barang ini"),m(".box",m("table.table.is-striped",m("thead",m("tr",["No. Batch","Merek","Tanggal Masuk","Tanggal Kadaluarsa","Gudang","Apotik","Retur"].map(a=>m("th",a)))),m("tbody",(state.oneGood.batch||[]).map(a=>m("tr",{class:+moment()>a.kadaluarsa&&"has-text-danger",ondblclick:()=>_.assign(state,{oneBatch:a,modalBatch:m(".box",m("h4","Rincian batch"),m("table.table",_.chunk([["No. Batch",a.no_batch],["Merek",a.merek],["Tanggal masuk",hari(a.masuk)],["Tanggal kadaluarsa",hari(a.kadaluarsa)],["Harga beli",rupiah(a.harga.beli)],["Harga jual",rupiah(a.harga.jual)],["Stok Gudang",a.stok.gudang],["Stok Apotik",_.get(a,"stok.apotik")],["Jumlah Diretur",_.get(a,"stok.retur")],["Nama supplier",_.get(a,"sumber.supplier")],["Anggaran",_.get(a,"sumber.anggaran")],["No. SPK",_.get(a,"sumber.no_spk")],["Tanggal SPK",hari(_.get(a,"sumber.tanggal_spk"))],["Petugas",lookUser(a.petugas)]],2).map(a=>m("tr",a.map(a=>[m("th",a[0]),m("td",a[1])])))),ands([4===state.login.peranan,3===state.login.bidang])&&m("p.buttons",!_.get(a,"stok.retur")&&m(".button.is-warning",{"data-tooltip":"Pindahkan semua stok barang ini ke Retur",ondblclick:()=>[updateBoth("goods",state.oneGood._id,_.assign(state.oneGood,{batch:state.oneGood.batch.map(t=>t.idbatch===a.idbatch?_.assign(t,{stok:{gudang:0,apotik:0,retur:(a.stok.gudang||0)+(a.stok.apotik||0)}}):t)})),state.modalBatch=null,m.redraw()]},m("span.icon",m("i.fas.fa-exchange-alt")),m("span","Retur batch")),m(".button.is-danger",{ondblclick:t=>[updateBoth("goods",state.oneGood._id,_.assign(state.oneGood,{batch:state.oneGood.batch.filter(t=>t.idbatch!==a.idbatch)})),state.modalBatch=null,m.redraw()]},m("span.icon",m("i.fas.fa-trash")),m("span","Hapus batch"))),m("br"),a.amprah&&m("div",m("h4","Riwayat Amprah"),m("table.table",m("thead",m("tr",["Peminta","Asal","Diminta","Diserah","Penyerah"].map(a=>m("th",a)))),m("tbody",a.amprah.map(a=>m("tr",tds([lookUser(a.peminta),look("bidang",a.ruangan),a.diminta,a.diserah,lookUser(a.penyerah)])))))),m("br"),ands([ors([_.includes([4],state.login.bidang),_.includes([2,3],state.login.peranan)]),a.stok.gudang>1,[m("h4","Form amprah batch"),m(autoForm({id:"formAmprah",schema:schemas.amprah,action:a=>[updateBoth("goods",state.oneGood._id,_.assign(state.oneGood,{batch:state.oneGood.batch.map(t=>t.idbatch===state.oneBatch.idbatch?_.assign(state.oneBatch,{amprah:[...state.oneBatch.amprah||[],a]}):t)})),state.modalBatch=null,m.redraw()]}))]]))})},tds([a.no_batch,a.merek,hari(a.masuk),hari(a.kadaluarsa),a.stok.gudang||0,a.stok.apotik||0,a.stok.retur||0])))))),makeModal("modalBatch")),formBatch:()=>m(".content",m("h3","Form tambah batch"),m(autoForm({id:"formBatch",schema:schemas.batch,confirmMessage:"Yakin untuk menambahkan batch obat ini?",action:a=>[updateBoth("goods",state.oneGood._id,_.assign(state.oneGood,{batch:[...state.oneGood.batch||[],a]})),state.route="oneGood"]})))}),_.assign(comp,{transfer:()=>ors([_.includes([3,4],state.login.bidang),_.includes([2,3],state.login.peranan)])?m(".content",m("h3","Daftar antrian amprah"),m(".box",m("table.table.is-striped",{onupdate:()=>[db.users.toArray(a=>state.userList=a),db.goods.toArray(a=>[state.transferList=a.reduce((a,t)=>t.batch?a.concat(t.batch.reduce((a,e)=>e.amprah?a.concat(e.amprah.reduce((a,n)=>a.concat([_.merge(n,{idbarang:t._id,nama_barang:t.nama,idbatch:e.idbatch,no_batch:e.no_batch,digudang:e.stok.gudang})]),[])):a,[])):a,[]),m.redraw()])]},m("thead",m("tr",["Nama barang","No. Batch","Peminta","Asal Ruangan","Jumlah minta","Tanggal diminta"].map(a=>m("th",a)))),m("tbody",state.transferList&&state.transferList.map(a=>m("tr",{ondblclick:()=>[3===state.login.bidang&&_.assign(state,{oneAmprah:a,modalResponAmprah:m(".box",m("h4","Respon permintaan barang"),m("table.table",m("thead",m("tr",["Nama barang","No. Batch","Stok gudang","Jumlah minta"].map(a=>m("th",a)))),m("tbody",m("tr",tds([a.nama_barang,a.no_batch,a.digudang,a.diminta])))),m(autoForm({id:"formResponAmprah",schema:schemas.responAmprah,action:t=>db.goods.get(a.idbarang,e=>[updateBoth("goods",a.idbarang,_.assign(e,{batch:e.batch.map(e=>e.idbatch===a.idbatch?_.assign(e,{stok:{gudang:e.stok.gudang-t.diserah,apotik:4===state.oneAmprah.ruangan?(e.stok.apotik||0)+t.diserah:e.stok.apotik},amprah:e.amprah.map(e=>e.idamprah===a.idamprah?_.assign(e,t):e)}):e)})),state.modalResponAmprah=null,m.redraw()])})))}),m.redraw()]},!a.penyerah&&tds([a.nama_barang,a.no_batch,lookUser(a.peminta),look("bidang",a.ruangan),a.diminta,hari(a.tanggal_minta,!0)])))),makeModal("modalResponAmprah"))),m("p"),m("h3","Daftar riwayat amprah"),m(".box",m("table.table.is-striped",m("thead",m("tr",["Nama barang","No. Batch","Peminta","Jumlah minta","Tanggal diminta","Penyerah","Jumlah serah","Tanggal serah"].map(a=>m("th",a)))),m("tbody",paginate(state.transferList||[],"transferList",100).sort((a,t)=>t.tanggal_serah-a.tanggal_serah).map(a=>m("tr",a.penyerah&&tds([a.nama_barang,a.no_batch,lookUser(a.peminta),a.diminta,hari(a.tanggal_minta,!0),lookUser(a.penyerah),a.diserah,hari(a.tanggal_serah,!0)])))))),m("div",comp.pagination("transferList",_.get(state,"transferList.length")/100))):m("p","Hanya untuk user farmasi, apotik dan petugas medis")}),_.assign(comp,{pharmacy:()=>4!==state.login.bidang?m("p","Hanya untuk user apotik"):m(".content",4===state.login.peranan&&reports.pharmacy(),m("h3","Apotik"),m(".box",m("table.table.is-striped",m("thead",m("tr",["No. MR","Nama Pasien","Tanggal berobat","Cara bayar","Layanan"].map(a=>m("th",a)))),m("tbody",{onupdate:()=>[db.patients.toArray(a=>[state.pharmacyList=_.compact(a.flatMap(a=>[...a.rawatJalan||[],...a.emergency||[],...a.rawatInap?_.compact(a.rawatInap.flatMap(a=>a.observasi&&a.observasi.flatMap(t=>_.assign({},t,a,{soapDokter:{obat:t.obat}})))):[]].flatMap(t=>withThis(ands([!_.get(t,"soapDokter.batal")||!_.includes(t.soapDokter.batal,"obat"),_.get(t,"soapDokter.obat")]),e=>withThis(e&&e.filter(a=>!a.diserah),e=>e&&0!==e.length&&{pasien:a,rawat:t,obats:e.map(a=>_.assign(a,{sisa:a.jumlah}))}))))),m.redraw()]),db.goods.toArray(a=>state.goodsList=a)]},(state.pharmacyList||[]).map(a=>m("tr",{ondblclick:()=>withThis([],t=>withThis({updatedGoods:a.obats.flatMap(a=>_.compact(state.goodsList.map(e=>e._id===a.idbarang&&_.assign(e,{batch:e.batch.filter(a=>ands([a.stok.apotik,a.kadaluarsa>_.now()])).sort((a,t)=>a.kadaluarsa-t.kadaluarsa).reduce((n,o)=>withThis(_.min([o.stok.apotik,a.sisa]),i=>i?ands([_.assign(a,{sisa:a.sisa-i}),t.push(_.merge({},a,{nama_barang:e.nama,no_batch:o.no_batch,serahkan:i,jual:i*o.harga.jual})),[...n,_.assign(o,{stok:_.assign(o.stok,{apotik:o.stok.apotik-i})})]]):[...n,o]),[])})))),updatedPatient:_.assign(a.pasien,{rawatJalan:(a.pasien.rawatJalan||[]).map(e=>e.idrawat===a.rawat.idrawat?_.assign(e,{soapDokter:_.assign(e.soapDokter,{obat:(e.soapDokter.obat||[]).map(a=>_.assign(a,{diserah:!0,harga:_.sum(t.filter(t=>t.idbarang===a.idbarang).map(a=>a.jual))})),apoteker:state.login._id})}):e),emergency:(a.pasien.emergency||[]).map(e=>e.idrawat===a.rawat.idrawat?_.assign(e,{soapDokter:_.assign(e.soapDokter,{obat:(e.soapDokter.obat||[]).map(a=>_.assign(a,{diserah:!0,harga:_.sum(t.filter(t=>t.idbarang===a.idbarang).map(a=>a.jual))}))})}):e),rawatInap:(a.pasien.rawatInap||[]).map(e=>e.idinap===a.rawat.idinap?_.assign(e,{observasi:e.observasi.map(e=>e.idobservasi===a.rawat.idobservasi?_.assign(e,{obat:e.obat.map(a=>_.assign(a,{diserah:!0,harga:_.sum(t.filter(t=>t.idbarang===a.idbarang).map(a=>a.jual))}))}):e)}):e)})},({updatedGoods:e,updatedPatient:n})=>state.modalSerahObat=m(".box",m("h4","Penyerahan obat"),m("table.table",m("thead",m("tr",["Nama obat","No. Batch","Merek","Ambil","Kali","Dosis","Puyer"].map(a=>m("th",a)))),m("tbody",t.map(a=>m("tr",[a.nama_barang,a.no_batch,a.merek,a.serahkan,a.aturan&&a.aturan.kali||"-",a.aturan&&a.aturan.dosis||"-",a.puyer||"-"].map(a=>m("td",a)))))),m("p.buttons",m(".button.is-info",{onclick:()=>makePdf.resep(t,n.identitas.no_mr)},makeIconLabel("print","Cetak salinan resep")),m(".button.is-primary",{ondblclick:()=>[updateBoth("patients",n._id,n),e.map(a=>updateBoth("goods",a._id,a)),state.modalSerahObat=null,m.redraw()]},makeIconLabel("check","Selesai")),m(".button.is-danger",{ondblclick:()=>updateBoth("patients",a.pasien._id,_.assign(a.pasien,{rawatJalan:(a.pasien.rawatJalan||[]).map(t=>t.idrawat===a.rawat.idrawat?_.assign(t,{soapDokter:_.merge(t.soapDokter,{batal:["obat"]})}):t),emergency:(a.pasien.emergency||[]).map(t=>t.idrawat===a.rawat.idrawat?_.assign(t,{soapDokter:_.merge(t.soapDokter,{batal:["obat"]})}):t),rawatInap:(a.pasien.rawatInap||[]).map(t=>t.idinap===a.rawat.idinap?_.assign(t,{observasi:t.observasi.map(t=>t.idobservasi===a.rawat.idobservasi?_.merge(t,{batal:["obat"]}):t)}):t)},a=>a&&[state.modalSerahObat=null,m.redraw()]))},makeIconLabel("times","Batal serah"))))))},[a.pasien.identitas.no_mr,a.pasien.identitas.nama_lengkap,hari(a.rawat.tanggal,!0),look("cara_bayar",a.rawat.cara_bayar),ors([a.rawat.klinik&&look("klinik",a.rawat.klinik),a.rawat.bed&&"Rawat Inap","IGD"])].map(a=>m("td",a)))),makeModal("modalSerahObat")))),m(".button.is-primary",{"data-tooltip":"Untuk menjual obat secara manual",onclick:()=>[_.assign(state,{route:"pharmacySale"}),m.redraw()]},makeIconLabel("cart-arrow-down","Penjualan Bebas"))),pharmacySale:()=>m(".content",m("h3","Penjualan Bebas Obat & BHP"),m(autoForm({id:"pharmacySale",oncreate:()=>db.goods.toArray(a=>_.assign(state,{goodsList:a,drugList:a.filter(a=>ands([1===a.jenis,a.batch.filter(t=>ands([t.stok.apotik>a.stok_minimum.apotik,t.kadaluarsa>_.now()])).length])),bhpList:a.filter(a=>2===a.jenis)})),schema:_.merge({idpenjualan:{type:String,autoform:{type:"hidden"},autoValue:()=>randomId()}},_.map(schemas.soapDokter,(a,t)=>ors([_.includes(t,"obat"),_.includes(t,"bhp")])&&{[t]:a}).filter(Boolean).reduce((a,t)=>_.merge(a,t),{})),action:a=>withThis({serahList:[],updatedGoods:[]},({serahList:t,updatedGoods:e})=>[e.push([...a.obat||[],...a.bhp||[]].flatMap(e=>state.goodsList.flatMap(n=>n._id===e.idbarang&&_.assign(n,{batch:n.batch.filter(a=>ands([a.stok.apotik,a.kadaluarsa>_.now()])).sort((a,t)=>a.kadaluarsa-t.kadaluarsa).reduce((o,i)=>[...o,e.jumlah?withThis(_.min([i.stok.apotik,e.jumlah]),o=>o?ands([t.push({nama:n.nama,no_batch:i.no_batch,jumlah:o,harga:i.harga.jual*o}),_.assign(e,{jumlah:e.jumlah-o}),_.assign(i,{stok:_.assign(i.stok,{apotik:i.stok.apotik-o}),penjualan:[...i.penjualan||[],{idpenjualan:a.idpenjualan,jumlah:o,tanggal:_.now(),user:state.login._id}]})]):i):i],[])})).filter(Boolean))),state.modalPenjualanBebas=m(".box",m("h3","Konfirmasi Penjualan"),m("table.table",m("thead",m("tr",["Nama Obat","No. Batch","Jumlah","Harga"].map(a=>m("th",a)))),m("tbody",[...t].map(a=>m("tr",tds([a.nama,a.no_batch,a.jumlah+" unit",rupiah(a.harga)])))),m("tr",tds([m("b","Total"),"","",rupiah(_.sum(t.map(a=>a.harga)))]))),m(".buttons",m(".button.is-info",{onclick:()=>makePdf.resep(t.map(a=>_.assign(a,{nama_barang:a.nama,serahkan:a.jumlah})),"bebas")},makeIconLabel("print","Cetak salinan resep")),m(".button.is-primary",{ondblclick:()=>e[0].map(a=>updateBoth("goods",a._id,a))},makeIconLabel("check","Serahkan"))))])})),makeModal("modalPenjualanBebas"))}),_.assign(comp,{cashier:()=>2!==state.login.bidang?m("p","Hanya untuk user bidang kasir"):m(".content",4===state.login.peranan&&reports.cashier(),m("h3","Loket Pembayaran"),m(".box",m("table.table.is-striped",m("thead",m("tr",["No. MR","Nama Lengkap","Tanggal","Layanan","Tambahan"].map(a=>m("th",a)))),m("tbody",{onupdate:()=>[withThis(a=>1===a.cara_bayar&&ors([a.klinik&&!a.bayar_pendaftaran,a.soapDokter&&!a.bayar_konsultasi,ands([a.bed,a.keluar,!a.bayar_konsultasi])]),a=>db.patients.filter(t=>[...t.rawatJalan||[],...t.emergency||[],...t.rawatInap||[]].filter(a).length).toArray(t=>state.cashierList=t.flatMap(t=>[...t.rawatJalan||[],...t.emergency||[],...t.rawatInap||[]].filter(a).map(a=>({pasien:t,rawat:a}))))),db.references.toArray(a=>state.references=a),db.goods.toArray(a=>state.goodsList=a)]},(state.cashierList||[]).sort((a,t)=>a.rawat.tanggal-t.rawat.tanggal).map(({pasien:a,rawat:t})=>m("tr",{ondblclick:()=>withThis([t.bed?[]:ands([1===[...a.rawatJalan||[],...a.emergency||[]].length,!t.bayar_pendaftaran,["Daftar pasien baru",tarifKartu]])||[],ors([!t.bayar_pendaftaran,!t.bayar_konsultasi,t.bed&&t.keluar])&&ors([t.klinik&&["Konsultasi Poli "+look("klinik",t.klinik),1e3*+look("tarif_klinik",t.klinik)],t.bed&&["Biaya Kamar",tarifInap(t.tanggal_masuk,t.keluar,beds[_.get(t.bed,"kelas")].tarif)],["Rawat IGD",tarifIGD]])||[],...ors([ands([t.klinik,t.soapDokter,!t.bayar_konsultasi]),ands([t.bed,t.keluar,!t.bayar_konsultasi]),ands([t.soapDokter,!t.bayar_konsultasi])])?[...[..._.get(t,"soapDokter.tindakan")||[],...(t.observasi||[]).flatMap(a=>a.tindakan||[])].map(a=>a.idtindakan?[lookReferences(a.idtindakan).nama,+lookReferences(a.idtindakan).harga]:[]),...[..._.get(t,"soapDokter.labor")||[],...(t.observasi||[]).flatMap(a=>a.labor||[])].map(a=>ands([a.idlabor,a.hasil])?[lookReferences(a.idlabor).nama,+lookReferences(a.idlabor).harga]:[]),...[..._.get(t,"soapDokter.radio")||[],...(t.observasi||[]).flatMap(a=>a.radio||[])].map(a=>ands([a.idradio,a.diagnosa])?[lookReferences(a.idradio).nama,+lookReferences(a.idradio).harga]:[]),...[..._.get(t,"soapDokter.obat")||[],...(t.observasi||[]).flatMap(a=>a.obat||[])].map(a=>a.idbarang?[state.goodsList.find(t=>t._id===a.idbarang).nama,a.harga]:[]),...[..._.get(t,"soapDokter.bhp")||[],...(t.observasi||[]).flatMap(a=>a.bhp||[])].map(a=>a.idbarang?withThis(state.goodsList.find(t=>t._id===a.idbarang),a=>[a.nama,a.batch.filter(a=>a.stok.apotik).sort((a,t)=>t.harga.jual-a.harga.jual)[0].harga.jual]):[])]:[]].filter(a=>a.length).map(a=>({item:a[0],harga:a[1]})),e=>state.modalCashier=m(".box",m("h3","Konfirmasi Pembayaran"),m("p",m("b",[a.identitas.nama_lengkap,a.identitas.no_mr].join(" / "))),m("table.table",withThis([...e,...t.charges||[]],a=>[a.map(a=>m("tr",m("th",a.item),m("td",rupiah(a.harga)))),m("tr",m("th","Total"),m("td",rupiah(_.sum(a.map(a=>a.harga)))))])),m(".buttons",m(".button.is-success",{ondblclick:()=>[updateBoth("patients",a._id,_.assign(a,{rawatJalan:(a.rawatJalan||[]).map(a=>a.idrawat===t.idrawat?_.assign(a,ors([a.soapDokter&&{bayar_konsultasi:!0,kasir:state.login._id},{bayar_pendaftaran:!0,kasir:state.login._id}])):a),emergency:(a.emergency||[]).map(a=>a.idrawat===t.idrawat?_.assign(a,{bayar_pendaftaran:!0,bayar_konsultasi:!0,kasir:state.login._id}):a),rawatInap:(a.rawatInap||[]).map(a=>a.idinap===t.idinap?_.assign(a,{bayar_pendaftaran:!0,bayar_konsultasi:!0,kasir:state.login._id}):a)})),[ors([t.soapDokter,t.observasi])&&makePdf.bayar_konsultasi(a,t,[...e,...t.charges||[]]),makePdf.bayar_pendaftaran(a,t,[...a.rawatJalan||[],...a.emergency||[]].length)],_.assign(state,{modalCashier:null,cashierList:[]}),m.redraw()]},makeIconLabel("check","Sudah bayar")),ors([t.soapDokter,t.observasi])&&m(".button.is-warning",{onclick:()=>_.assign(state,{modalCashier:null,route:"overcharge",onePatient:a,oneRawat:t})},makeIconLabel("plus",t.charges?"Ganti tambahan biaya":"Tambahan biaya")))))},tds([a.identitas.no_mr,a.identitas.nama_lengkap,hari(t.tanggal||t.tanggal_masuk),ors([t.klinik&&look("klinik",t.klinik),t.bed&&"Rawat Inap","IGD"]),t.charges?t.charges.length+" item":""])))))),makeModal("modalCashier")),overcharge:()=>m(".content",m(autoForm({id:"overcharge",schema:schemas.overcharge,action:a=>updateBoth("patients",state.onePatient._id,_.assign(state.onePatient,{rawatJalan:(state.onePatient.rawatJalan||[]).map(t=>t.idrawat===state.oneRawat.idrawat?_.assign(t,a):t),emergency:(state.onePatient.emergency||[]).map(t=>t.idrawat===state.oneRawat.idrawat?_.assign(t,a):t),rawatInap:(state.onePatient.rawatInap||[]).map(t=>t.idinap===state.oneRawat.idinap?_.assign(t,a):t)}),a=>a&&[_.assign(state,{route:"cashier",cashierList:[]}),m.redraw()])})))}),_.assign(comp,{users:()=>5!==state.login.bidang?m("p","Hanya untuk user manajemen"):m(".content",m("h3","Manajemen Akun"),m(".button.is-primary",{onclick:()=>state.modalAccount=m(".box",m("h3","Tambah Akun"),m(autoForm({id:"createAccount",schema:schemas.account,action:a=>io().emit("bcrypt",a.password,t=>[insertBoth("users",_.assign(a,{password:t})),state.modalAccount=null])})))},makeIconLabel("user-plus","Tambah akun")),m("br"),m("br"),makeModal("modalAccount"),m(".box",m("table.table.is-striped",{onupdate:()=>db.users.toArray(a=>[state.userList=a,m.redraw()])},m("thead",m("tr",["Nama lengkap","Username","Peranan","Bidang","Poliklinik","Keaktifan"].map(a=>m("th",a)))),m("tbody",(state.userList.filter(a=>1===a.keaktifan)||[]).map(a=>m("tr",{ondblclick:()=>state.modalAccount=m(".box",m("h4","Profil Pengguna"),m(autoForm({id:"updateAccount",schema:schemas.account,doc:a,action:t=>io().emit("bcrypt",t.password,e=>[updateBoth("users",a._id,_.assign(t,{password:e})),state.modalAccount=null,m.redraw()])})))},tds([a.nama,a.username,look("peranan",a.peranan),look("bidang",a.bidang),look("klinik",a.poliklinik),look("keaktifan",a.keaktifan)]))))))),references:()=>m(".content",m("h3","Daftar Tarif"),m("p.help","* Tersusun alfabetis"),m(".box",m("table.table.is-striped",{oncreate:()=>db.references.toArray(a=>[state.referenceList=_.sortBy(a,["nama"]),m.redraw()])},m("thead",m("tr",["Nama item","Harga","Grup 1","Grup 2","Grup 3"].map(a=>m("th",a)))),m("tbody",paginate(state.referenceList||[],"references",20).map(a=>a.nama&&m("tr",tds([a.nama,rupiah(a.harga),a[0],a[1],a[2]])))))),m("div",comp.pagination("references",_.get(state,"referenceList.length")/20)),ands([5===state.login.bidang,4===state.login.peranan])&&[m("h3","Import Data"),m(".file.is-danger",{onchange:a=>Papa.parse(a.target.files[0],{header:!0,complete:a=>withThis((a,t)=>[dbCall({method:"insertMany",collection:a,documents:t},()=>""),db[a].bulkPut(t).then(a=>a&&alert("Berhasil import, silahkan refresh"))],t=>ors([a.data[0].harga&&t("references",a.data.map(a=>_.merge(a,{_id:randomId(),updated:_.now()}))),a.data[0].nama_lengkap&&t("patients",a.data.map(a=>_.merge({updated:_.now(),_id:randomId()},{identitas:_.merge({keluarga:{ayah:a.ayah||"",ibu:a.ibu||"",pasangan:a.pasangan||""},kontak:a.kontak||"",nama_lengkap:_.startCase(a.nama_lengkap),tanggal_input:a.tanggal_input?+moment(a.tanggal_input):"",tanggal_lahir:a.tanggal_lahir?+moment(a.tanggal_lahir):"",tempat_lahir:a.tempat_lahir||"",tempat_tinggal:a.tempat_tinggal||"",bayar_kartu:!0},_.fromPairs(["agama","alias","darah","kelamin","ktp","nikah","no_mr","pekerjaan","pendidikan"].map(t=>+a[t]?[t,+a[t]]:["",""])))}))),a.data[0].no_batch&&t("goods",a.data.map(a=>_.merge({_id:randomId(),updated:_.now()},{nama:a.nama_barang,jenis:+a.jenis,kandungan:a.kandungan,satuan:+a.satuan,kriteria:{antibiotik:+a.antibiotik,narkotika:+a.narkotika,psikotropika:+a.psikotropika,fornas:+a.fornas},batches:[{idbatch:randomId(),no_batch:a.no_batch,merek:a.merek,masuk:a.masuk&&+moment(a.masuk),kadaluarsa:a.kadaluarsa&&+moment(a.kadaluarsa),stok:{gudang:+a.digudang,apotik:+a.diapotik,retur:+a.diretur},harga:{beli:+a.beli,jual:+a.jual},returnable:!!a.returnable,sumber:{supplier:a.supplier,anggaran:+a.anggaran,no_spk:a.no_spk,tanggal_spk:a.tanggal_spk&&+moment(a.tanggal_spk)}}]})).reduce((a,t)=>withThis(a.find(a=>a.nama===t.nama),e=>e?a.map(a=>a.nama===t.nama?_.assign(a,{batches:[...a.batches,...t.batches]}):a):[...a,t]),[]))]))})},m("label.file-label",m("input.file-input",{type:"file",name:"import"}),m("span.file-cta",m("span.file-label","Pilih file")))),m("a.help",{href:"https://github.com/rikyperdana/simrs/wiki/Import-Master-Data",target:"_blank"},"Panduan Import Data Master")]),management:()=>_.chunk(_.map(menus.management.children,(a,t)=>[a,t]),3).map(a=>m(".columns",a.map(a=>m(".column",m(".box",m("article.media",{onclick:()=>[state.route=a[1],m.redraw()]},m(".media-left",m("span.icon.has-text-primary",m("i.fas.fa-2x.fa-"+a[0].icon))),m(".media-content",m(".content",m("h3",a[0].full)))))))))}),_.assign(comp,{queue:()=>m(".content",m("table.is-fullwidth",m("tr",{onupdate:()=>[db.queue.toArray(a=>localStorage.setItem("regQueue",a.filter(a=>a.timestamp>startOfTheDay(+moment())).length)),db.patients.toArray(a=>localStorage.setItem("clinicQueue",JSON.stringify(a.flatMap(a=>(a.rawatJalan||[]).map(a=>startOfTheDay(a.tanggal)===startOfTheDay(_.now())&&[a.klinik,Boolean(a.soapDokter)]).filter(Boolean)).filter(a=>a.length))))]},m("th",m("h1","Antrian Pendaftaran")),m("th",m("h1","R"+(localStorage.regQueue||0))))),m(".buttons",m(".button",{onclick:()=>ands([insertBoth("queue",{timestamp:+moment(),no_antrian:"R"+(+localStorage.regQueue+1)}),makePdf.regQueue(+localStorage.regQueue),localStorage.setItem("regQueue",+localStorage.regQueue+1)])},"Cetak antrian"),m(".button",{onclick:()=>localStorage.setItem("regQueue",0)},"Reset Antrian")),Array(3).map(a=>m("br")),m("table.is-fullwidth.is-striped",m("thead",m("tr"),["Antrian Poliklinik","Urutan","Panjang"].map(a=>m("td",m("h1",a)))),selects("klinik")().map(a=>m("tr",[a.label,JSON.parse(localStorage.clinicQueue||"[]").filter(t=>ands([t[0]===a.value,t[1]])).length,JSON.parse(localStorage.clinicQueue||"[]").filter(t=>t[0]===a.value).length].map(a=>m("td",m("h1",a)))))))}),_.assign(comp,{surgery:()=>ors([1===state.login.bidang,_.includes([2,3],state.login.peranan)])?m(".content",m("h1","Jadwal Instalasi Bedah"),m(".box",m("table.table.is-striped",{oncreate:()=>db.references.toArray(a=>state.references=a),onupdate:()=>db.patients.toArray(a=>state.surgeryList=a.map(a=>[...a.rawatJalan||[],...a.emergency||[]].flatMap(t=>t&&t.soapDokter&&t.soapDokter.tindakan&&t.soapDokter.tindakan.map(e=>e.jadwal>+moment()&&_.merge(a,t,e)).filter(Boolean)).filter(Boolean)).filter(a=>a.length))},m("tr",["Nama Pasien","Jadwal Operasi","Nama Tindakan"].map(a=>m("th",a))),state.surgeryList&&_.flatten(state.surgeryList).map(a=>m("tr",tds([a.identitas.nama_lengkap,hari(a.jadwal,!0),lookReferences(a.idtindakan).nama])))))):m("p","Hanya untuk tenaga medis dan user pendaftaran")}),_.assign(comp,{profile:()=>m(".content",m("h1","Profil Pengguna"),m(".box",m("table.table.is-striped",m("tbody",m("tr",m("th","Username"),m("td",state.login.username)),m("tr",m("th","Password"),m("td","*************")),m("tr",m("th","Nama Lengkap"),m("td",state.login.nama)),m("tr",m("th","Bidang"),m("td",look("bidang",state.login.bidang))),m("tr",m("th","Peranan"),m("td",look("peranan",state.login.peranan)))))),m(".buttons",m(".button.is-warning",{onclick:()=>state.modalProfile=m(".box",m(autoForm({id:"formProfile",schema:{username:{type:String,optional:!0,autoform:{placeholder:"Bila tidak ingin diganti, kosongkan saja"}},password:{type:String,optional:!0,autoform:{type:"password",placeholder:"Bila tidak ingin diganti, kosongkan saja"}},nama:{type:String,optional:!0,label:"Nama Lengkap",autoform:{placeholder:"Bila tidak ingin diganti, kosongkan saja"}}},action:a=>[a.password?io().emit("bcrypt",a.password,t=>updateBoth("users",state.login._id,_.assign(state.login,a,{password:t}))):updateBoth("users",state.login._id,_.assign(state.login,a)),state.modalProfile=null,m.redraw()]})))},makeIconLabel("edit","Update akun")),m("a.button.is-info",{href:"https://wa.me/628117696000?text=simrs.dev",target:"_blank"},makeIconLabel("envelope-open-text","Kritik/Saran")),m("a.button.is-link",{href:"https://www.youtube.com/watch?v=irSxnKSRIOI&list=PL4oE8OvUySlyfGzQTu8kN9sPWWfcn_wSZ",target:"_blank"},makeIconLabel("chalkboard-teacher","Tutorial")),m("a.button.is-danger",{onclick:()=>[state.modalLicense=m(".box",m("h3","Unlock Lisensi Enterprise"),m("p.help","Untuk menghilangkan semua garis batas pada pdf"),m(autoForm({id:"updateLicense",schema:{key:{type:String,autoform:{placeholder:"Dapatkan dari developer"}}},action:({key:a})=>15===a.length&&[withThis(["license",a.split(" ").reverse().join(""),localStorage],a=>_.last(a).setItem(_.first(a),+(a[1]+"e5"))),state.modalLicense=null,m.redraw()]}))),m.redraw()]},makeIconLabel("key","Unlock"))),makeModal("modalProfile"),makeModal("modalLicense"))}),_.assign(comp,{radiology:()=>9!==state.login.bidang?m("p","Hanya untuk petugas radiologi"):m(".content",m("h1","Radiologi"),m(".box",m("table.table.is-striped",{onupdate:()=>[db.references.toArray(a=>state.references=a),db.patients.filter(a=>ors([[...a.rawatJalan||[],...a.emergency||[]].filter(a=>_.get(a,"soapDokter.radio")&&a.soapDokter.radio.filter(a=>!a.diagnosa).length).length,a.rawatInap&&a.rawatInap.filter(a=>a.observasi&&a.observasi.filter(a=>a.radio&&a.radio.filter(a=>!a.diagnosa).length).length).length])).toArray(a=>a&&[state.radiologyList=a.flatMap(a=>[...[...a.rawatJalan||[],...a.emergency||[]].flatMap(t=>_.get(t,"soapDokter.radio")&&t.soapDokter.radio.filter(a=>!a.diagnosa).flatMap(e=>({pasien:a,rawat:t,radio:e}))),...(a.rawatInap||[]).flatMap(t=>t.observasi&&t.observasi.flatMap(e=>e.radio&&e.radio.filter(a=>!a.diagnosa).flatMap(n=>({pasien:a,inap:t,observasi:e,radio:n}))))]).filter(Boolean),m.redraw()])]},m("thead",m("tr",["Waktu Permintaan","No. MR","Nama Pasien","Instalasi","Dokter","Grup","Item","Diproses"].map(a=>m("th",a)))),m("tbody",(state.radiologyList||[]).map(a=>m("tr",{ondblclick:()=>state.modalRadiologi=m(".box",m("h3","Form Radiologi"),m("p","Catatan dokter: "+(a.radio.catatan||"-")),m(autoForm({id:"responRadiology",schema:1===a.radio.konfirmasi?schemas.responRadiology:schemas.confirmRadiology,confirmMessage:"Yakin untuk menyimpan?",action:t=>[updateBoth("patients",a.pasien._id,_.assign(a.pasien,{rawatJalan:(a.pasien.rawatJalan||[]).map(e=>e.idrawat===_.get(a,"rawat.idrawat")?_.assign(e,{soapDokter:_.assign(e.soapDokter,{radio:e.soapDokter.radio.map(e=>e.idradio===a.radio.idradio?_.assign(e,t):e)})}):e),emergency:(a.pasien.emergency||[]).map(e=>e.idrawat===_.get(a,"rawat.idrawat")?_.assign(e,{soapDokter:_.assign(e.soapDokter,{radio:e.soapDokter.radio.map(e=>e.idradio===a.radio.idradio?_.assign(e,t):e)})}):e),rawatInap:(a.pasien.rawatInap||[]).map(e=>e.idinap===_.get(a,"inap.idinap")?_.assign(e,{observasi:e.observasi.map(e=>e.idobservasi===a.observasi.idobservasi?_.assign(e,{radio:e.radio.map(e=>e.idradio===a.radio.idradio?_.assign(e,t):e)}):e)}):e)})),a.radio.diagnosa&&makePdf.radio(a.pasien.identitas,_.merge(a.radio,t)),_.assign(state,{modalRadiologi:null,radiologyList:null}),m.redraw()]})))},tds([hari(ors([_.get(a,"rawat.tanggal"),_.get(a,"observasi.tanggal")]),!0),_.get(a,"pasien.identitas.no_mr"),_.get(a,"pasien.identitas.nama_lengkap"),ors([a.inap&&"Rawat Inap",_.get(a,"rawat.klinik")&&look("klinik",a.rawat.klinik),"Emergency"]),ors([a.inap&&lookUser(_.get(a,"observasi.dokter")),lookUser(_.get(a,"rawat.soapDokter.dokter"))]),_.startCase(a.radio.grup),lookReferences(a.radio.idradio).nama,1===a.radio.konfirmasi&&hari(a.radio.tanggal,!0)])))),makeModal("modalRadiologi"))))}),_.assign(comp,{laboratory:()=>8!==state.login.bidang?m("p","Hanya untuk petugas labor"):m(".content",m("h1","Laboratorium"),m(".box",m("table.table.is-striped",{onupdate:()=>[db.references.toArray(a=>state.references=a),db.patients.filter(a=>[...a.rawatJalan||[],...a.emergency||[],...a.rawatInap?a.rawatInap.flatMap(a=>(a.observasi||[]).map(a=>({soapDokter:a}))):[]].filter(a=>_.get(a,"soapDokter.labor")&&a.soapDokter.labor.filter(a=>a.hasil||2===a.konfirmasi).length!==a.soapDokter.labor.length).length).toArray(a=>state.laboratoryList=a.flatMap(a=>[...a.rawatJalan||[],...a.emergency||[],...a.rawatInap?a.rawatInap.flatMap(a=>a.observasi.flatMap(t=>({inap:a,observasi:t}))):[]].filter(a=>ors([_.get(a,"soapDokter.labor")&&a.soapDokter.labor.filter(a=>a.hasil).lengtha.hasil).lengthors([t.soapDokter&&{pasien:a,rawat:t},t.observasi&&_.merge(t,{pasien:a})]))))]},m("thead",m("tr",["Waktu Permintaan","No. MR","Nama Pasien","Instalasi","Dokter","Diproses"].map(a=>m("th",a)))),m("tbody",(state.laboratoryList||[]).map(a=>m("tr",{ondblclick:()=>_.assign(state,{route:"responLaboratory",responLaboratory:_.assign(a,{labor:ors([_.get(a,"rawat.soapDokter.labor"),_.get(a,"observasi.labor")])})})&&m.redraw()},tds([hari(ors([_.get(a,"rawat.tanggal"),_.get(a,"observasi.tanggal")]),!0),a.pasien.identitas.no_mr,a.pasien.identitas.nama_lengkap,ors([_.get(a,"rawat.klinik")&&look("klinik",a.rawat.klinik),a.observasi&&"Rawat Inap","Emergency"]),lookUser(ors([_.get(a,"rawat.soapDokter.dokter"),_.get(a,"observasi.dokter")])),hari(ors([_.get(a,"rawat.soapDokter.labor")&&a.rawat.soapDokter.labor.find(a=>a.tanggal),_.get(a,"observasi.labor")&&a.observasi.labor.find(a=>a.tanggal)]),!0)]))))))),responLaboratory:()=>m(".content",m("h2","Respon Laboratorium"),m(autoForm({id:"responLaboratory",schema:_.merge({},schemas.responLaboratory,state.responLaboratory.labor.filter(a=>a.konfirmasi).length?{"labor.$.hasil":{type:String}}:{"labor.$.konfirmasi":{type:Number,autoform:{type:"select",options:selects("konfirmasi")}}}),doc:{labor:state.responLaboratory.labor.filter(a=>ors([!a.konfirmasi,!a.hasil]))},confirmMessage:"Yakin dengan respon form laboratorium ini?",action:a=>[updateBoth("patients",state.responLaboratory.pasien._id,_.assign(state.responLaboratory.pasien,{rawatJalan:(state.responLaboratory.pasien.rawatJalan||[]).map(t=>t.idrawat===_.get(state,"responLaboratory.rawat.idrawat")?_.assign(t,{soapDokter:_.assign(state.responLaboratory.rawat.soapDokter,{labor:state.responLaboratory.rawat.soapDokter.labor.map(t=>_.assign(t,a.labor.find(a=>a.idlabor===t.idlabor)||{}))})}):t),emergency:(state.responLaboratory.pasien.emergency||[]).map(t=>t.idrawat===_.get(state,"responLaboratory.rawat.idrawat")?_.assign(t,{soapDokter:_.assign(state.responLaboratory.rawat.soapDokter,{labor:state.responLaboratory.rawat.soapDokter.labor.map(t=>_.assign(t,a.labor.find(a=>a.idlabor===t.idlabor)||{}))})}):t),rawatInap:(state.responLaboratory.pasien.rawatInap||[]).map(t=>t.idinap===_.get(state,"responLaboratory.inap.idinap")?_.assign(t,{observasi:state.responLaboratory.inap.observasi.map(t=>t.idobservasi===state.responLaboratory.observasi.idobservasi?_.assign(t,{labor:state.responLaboratory.observasi.labor.map(t=>_.assign(t,a.labor.find(a=>a.idlabor===t.idlabor)||{}))}):t)}):t)})),a.labor.filter(a=>a.hasil).length&&makePdf.labor(state.responLaboratory.pasien.identitas,a.labor),_.assign(state,{route:"laboratory",laboratoryList:[]}),m.redraw()]})))}),_.assign(comp,{cssd:()=>m(".content",m("p","fitur dalam perencanaan.."))}),_.assign(comp,{gizi:()=>10!==state.login.bidang?m("p","Hanya untuk user bidang Gizi"):m(".content",m("h1","Daftar konsumsi pasien inap"),m(".box",m("table.table.is-striped",{oncreate:()=>db.patients.filter(a=>(a.rawatInap||[]).filter(a=>a.observasi&&!a.keluar).length).toArray(a=>[state.consumeList=a,m.redraw()])},m("thead",m("tr",m("th","Nama Pasien"),m("th","Tanggal Masuk"))),m("tbody",(state.consumeList||[]).map(a=>m("tr",{onclick:()=>[state.modalConsume=m(".box",m("h3","Rincian kebutuhan gizi"),m("table.table",m("tr",m("th","Nama Pasien"),m("td",a.identitas.nama_lengkap)),withThis(_.last(a.rawatInap),a=>[m("tr",m("th","Tanggal masuk"),m("td",hari(a.tanggal_masuk,!0))),m("tr",m("th","Kelas/Kamar/Bed"),m("td",[_.upperCase(a.bed.kelas),_.startCase(a.bed.kamar),a.bed.nomor].join("/"))),a.observasi.map(a=>a.konsumsi&&m("tr",tds([hari(a.tanggal,!0),[lookUser(a.dokter),a.konsumsi].join(": ")])))])))]},tds([a.identitas.nama_lengkap,hari(_.get(_.last(a.rawatInap),"tanggal_masuk"),!0)])))))),makeModal("modalConsume"))});var reports={cashier:()=>makeReport("Penerimaan Kasir",a=>withThis({start:+moment(a.target[0].value),end:tomorrow(+moment(a.target[1].value)),selection:a.target[2].value},t=>[a.preventDefault(),db.patients.toArray(a=>makePdf.report("Penerimaan Kasir",[["Tanggal","No. MR","Nama Pasien","Layanan","Tarif","Obat","Tindakan","Tambahan","Jumlah","Kasir"],..._.flattenDeep(a.map(a=>[...a.rawatJalan||[],...a.emergency||[],...a.rawatInap?a.rawatInap.map(a=>_.assign(a,{soapDokter:{obat:(a.observasi||[]).flatMap(a=>a.obat),bhp:(a.observasi||[]).flatMap(a=>a.bhp),tindakan:(a.observasi||[]).flatMap(a=>a.tindakan)}})):[]].map(e=>ands([e.cara_bayar===+t.selection,(e.tanggal||e.tanggal_masuk)>t.start,(e.tanggal||e.tanggal_masuk)a.length)).sort((a,t)=>a.rawat.tanggal-t.rawat.tanggal).map(a=>[hari(a.rawat.tanggal||a.rawat.tanggal_masuk),String(a.pasien.identitas.no_mr),a.pasien.identitas.nama_lengkap,ors([a.rawat.klinik&&look("klinik",a.rawat.klinik),a.rawat.bed&&"Rawat Inap","IGD"]),rupiah(ors([a.rawat.klinik&&1e3*+look("tarif_klinik",a.rawat.klinik),a.rawat.bed&&tarifInap(a.rawat.tanggal_masuk,a.rawat.keluar,beds[_.get(a.rawat.bed,"kelas")].tarif),tarifIGD])),rupiah(_.get(a,"rawat.soapDokter.obat")?_.sum(a.rawat.soapDokter.obat.map(a=>a.harga)):0),rupiah(_.get(a,"rawat.soapDokter.tindakan")?_.sum(a.rawat.soapDokter.tindakan.map(a=>+_.get(lookReferences(a.idtindakan),"harga"))):0),rupiah(_.sum((a.rawat.charges||[]).map(a=>a.harga))),rupiah(_.sum([ors([a.rawat.klinik&&1e3*+look("tarif_klinik",a.rawat.klinik),a.rawat.bed&&tarifInap(a.rawat.tanggal_masuk,a.rawat.keluar,beds[_.get(a.rawat.bed,"kelas")].tarif),tarifIGD]),_.get(a,"rawat.soapDokter.obat")?_.sum(a.rawat.soapDokter.obat.map(a=>a.harga)):0,_.get(a,"rawat.soapDokter.tindakan")?_.sum(a.rawat.soapDokter.tindakan.map(a=>+_.get(lookReferences(a.idtindakan),"harga"))):0,_.get(a,"rawat.charges")?_.sum(a.rawat.charges.map(a=>a.harga)):0])),lookUser(a.rawat.kasir)])],"Cara Bayar: "+look("cara_bayar",+t.selection)))]),selects("cara_bayar")()),pharmacy:()=>makeReport("Pengeluaran Apotik",a=>withThis({start:+moment(a.target[0].value),end:tomorrow(+moment(a.target[1].value))},t=>[a.preventDefault(),db.patients.toArray(a=>makePdf.report("Laporan Pengeluaran Obat",[["Tanggal","No. MR","Nama Pasien","Layanan","Dokter","Nama Obat","Jumlah","Harga","Cara Bayar","Apoteker"],...a.flatMap(a=>[...a.rawatJalan||[],...a.emergency||[],...(a.rawatInap||[]).flatMap(a=>(a.observasi||[]).filter(a=>a.soapDokter))].map(t=>({pasien:a,rawat:t}))).sort((a,t)=>a.rawat.tanggal-t.rawat.tanggal).flatMap(({pasien:a,rawat:t})=>_.get(t,"soapDokter.obat")&&t.soapDokter.obat.map(e=>e.harga&&[hari(t.tanggal),a.identitas.no_mr,a.identitas.nama_lengkap,ors([t.klinik&&look("klinik",t.klinik),t.idinap&&"Rawat Inap","Gawat Darurat"]),lookUser(t.soapDokter.dokter),lookGoods(e.idbarang).nama,e.jumlah+" "+look("satuan",lookGoods(e.idbarang).satuan),rupiah(e.harga),look("cara_bayar",t.cara_bayar),lookUser(_.get(t,"soapDokter.apoteker"))]).filter(Boolean)).filter(Boolean).filter(a=>a.length)]))])),igd:()=>makeReport("Kunjungan IGD",a=>withThis({start:+moment(a.target[0].value),end:tomorrow(+moment(a.target[1].value))},t=>[a.preventDefault(),db.patients.toArray(a=>makePdf.report("Kunjungan IGD",[["Tanggal","No. MR","Nama Pasien","Perawat","Dokter"],...a.flatMap(a=>a.rawatJalan&&a.rawatJalan.map(e=>_.every([e.soapDokter,e.tanggal>t.start&&e.tanggala.tanggal-t.tanggal).filter(a=>a)]))])),inpatient:()=>makeReport("Kunjungan Rawat Inap",a=>withThis({start:+moment(a.target[0].value),end:tomorrow(+moment(a.target[1].value))},t=>[a.preventDefault(),db.patients.toArray(a=>makePdf.report("Kunjungan Rawat Inap",[["Tanggal","No. MR","Nama Pasien","Perawat","Dokter"],...a.flatMap(a=>a.rawatInap&&a.rawatInap.map(e=>_.every([e.keluar,e.tanggal_masuk>t.start&&e.tanggal_masuklookUser(a.perawat)).join(", "),e.observasi.map(a=>lookUser(a.dokter)).join(", ")])).sort((a,t)=>a.tanggal-t.tanggal).filter(Boolean)]))])),outpatient:()=>makeReport("Kunjungan Poliklinik",a=>withThis({start:+moment(a.target[0].value),end:tomorrow(+moment(a.target[1].value))},t=>[a.preventDefault(),db.patients.toArray(a=>makePdf.report("Kunjungan Poliklinik",[["Tanggal","Poliklinik","No. MR","Nama Pasien","Perawat","Dokter"],...a.flatMap(a=>(a.rawatJalan||[]).map(t=>({pasien:a,rawat:t}))).filter(({pasien:a,rawat:e})=>ands([e.soapDokter,e.tanggal>t.start&&e.tanggala.rawat.tanggal-t.rawat.tanggal).map(({pasien:a,rawat:t})=>[hari(t.tanggal),look("klinik",t.klinik),a.identitas.no_mr.toString(),a.identitas.nama_lengkap,lookUser(_.get(t,"soapPerawat.perawat")),lookUser(_.get(t,"soapDokter.dokter"))])]))]))},topMenus=_.omit(menus,["cssd","gizi"]);_.assign(comp,{navbar:()=>m("nav.navbar.is-primary.is-fixed-top",m(".navbar-brand",m("a.navbar-item",{onclick:()=>state.route="dashboard"},"SIMRS.dev")),m(".navbar-menu",m(".navbar-start",_.map(topMenus,(a,t)=>m("a.navbar-item",{class:a.children&&"has-dropdown is-hoverable",onclick:()=>state.route=t},a.children?[m("a.navbar-link",_.startCase(a.full)),m(".navbar-dropdown",_.map(a.children,(a,t)=>m("a.navbar-item",{onclick:a=>[a.stopPropagation(),state.route=t]},makeIconLabel(a.icon,a.full))))]:m("span",_.startCase(a.full))))),m(".navbar-end",m(".navbar-item.has-dropdown.is-hoverable",m("a.navbar-link",{onclick:()=>[state.route="profile",m.redraw()]},_.get(state.login,"username")),m(".navbar-dropdown.is-right",m("a.navbar-item",makeIconLabel("user-tag","Peranan: "+look("peranan",_.get(state.login,"peranan")))),m("a.navbar-item",makeIconLabel("shapes","Bidang: "+look("bidang",_.get(state.login,"bidang")))),m("a.navbar-item",makeIconLabel("clinic-medical","Poliklinik: "+look("klinik",_.get(state.login,"poliklinik")))),m("hr.dropdown-divider"),m("a.navbar-item",{onclick:()=>[_.assign(state,{login:null,route:"login",loading:!1}),localStorage.removeItem("login"),m.redraw()]},makeIconLabel("sign-out-alt","Logout"))))))),dashboard:()=>m(".content",m("h1",{oncreate:()=>[getDifferences(),db.users.toArray(a=>state.userList=a)]},"Dashboard"),m(".buttons",m(".button.is-info",{class:state.loading&&"is-loading","data-tooltip":"otomatis setiap beberapa menit / manual",onclick:()=>[state.loading=!0,getDifferences()]},"Sync"),state.lastSync&&m("span","Terakhir sinkronisasi "+moment(state.lastSync).fromNow())),_.chunk(_.map(menus,(a,t)=>[a,t]),3).map(a=>m(".columns",a.map(a=>m(".column",m(".box",m("article.media",{onclick:()=>[state.route=a[1],m.redraw()]},m(".media-left",m("span.icon.has-text-primary",m("i.fas.fa-2x.fa-"+a[0].icon))),m(".media-content",m(".content",m("h3",a[0].full))))))))),m("h1","Statistik Sistem"),m(".tabs.is-boxed",m("ul",{style:"margin-left: 0%"},_.map({pasien:["Pasien","walking"],rawatJalan:["Rawat Jalan","ambulance"],emergency:["Emergency","heart"],rawatInap:["Rawat Inap","bed"],radiology:["Radiologi","radiation"],laboratory:["Laboratorium","flask"],management:["Management","users"]},(a,t)=>m("li",{class:t===state.dashboardTab&&"is-active"},m("a",{onclick:()=>[state.dashboardTab=t,m.redraw()]},makeIconLabel(a[1],a[0])))))),m(".columns",{oncreate:()=>[db.patients.toArray(a=>_.merge(state,{stats:{pasien:{total:a.length,pria:a.filter(a=>1===a.identitas.kelamin).length,wanita:a.filter(a=>2===a.identitas.kelamin).length},rawatJalan:selects("klinik")().map(t=>_.sum(a.map(a=>(a.rawatJalan||[]).filter(a=>a.klinik===t.value).length).filter(Boolean))),emergency:_.sum(a.map(a=>(a.emergency||[]).length)),rawatInap:_.sum(a.map(a=>(a.rawatInap||[]).length))}})),db.users.toArray(a=>_.merge(state,{stats:{management:{petugas:a.filter(a=>1===a.peranan).length,perawat:a.filter(a=>2===a.peranan).length,dokter:a.filter(a=>3===a.peranan).length,admin:a.filter(a=>4===a.peranan).length}}}))]},{pasien:["Total jumlah pasien: "+_.get(state,"stats.pasien.total"),"Total pasien pria: "+_.get(state,"stats.pasien.pria"),"Total pasien wanita: "+_.get(state,"stats.pasien.wanita")],rawatJalan:selects("klinik")().map(a=>["Total pasien klinik ",a.label,": ",_.get(state,["stats","rawatJalan",a.value-1])].join("")),emergency:["Total pasien emergency: "+_.get(state,"stats.emergency")],rawatInap:["Total pasien pernah inap: "+_.get(state,"stats.rawatInap")],radiology:["Total layanan radiologi: "],laboratory:["Total layanan laboratorium: "],management:["Jumlah petugas: "+_.get(state,"stats.management.petugas"),"Jumlah perawat: "+_.get(state,"stats.management.perawat"),"Jumlah dokter: "+_.get(state,"stats.management.dokter")]}[state.dashboardTab||"pasien"].map(a=>m(".column",m(".notification",{class:"is-primary"},a))))),login:()=>m(".content",m(".columns",m(".column"),m(".column",!window.chrome&&m(".notification.is-warning.is-light","Mohon gunakan Chrome versi terbaru"),state.error&&m(".notification.is-danger.is-light",[m("button.delete",{onclick:()=>state.error=!1}),state.error]),_.range(3).map(()=>m("br")),m(".level",m(".level-item.has-text-centered",m("span.icon.is-large.has-text-primary",m("i.fas.fa-8x.fa-stethoscope")))),m("br"),m(autoForm({id:"login",schema:schemas.login,submit:{value:"Login",class:state.loading?"is-info is-loading":"is-info"},action:a=>[state.loading=!0,m.redraw(),io().emit("login",a,({res:t})=>t?[_.assign(state,{username:a.username,route:"dashboard",login:t}),localStorage.setItem("login",JSON.stringify(t)),m.redraw()]:[state.loading=!1,state.error="Password salah",m.redraw()])]}))),m(".column")))}),io().on("connect",a=>[state.login=localStorage.login&&JSON.parse(localStorage.login||"{}"),m.mount(document.body,{view:()=>m(".has-background-light",comp.navbar(),m(".container",{style:"min-height:100vh"},m("br"),state.username||_.get(state,"login.username")?comp[state.route]():comp.login()),m("footer.footer",{style:"padding:0px"},m(".content",m("a.help",{href:"https://github.com/rikyperdana/simrs",target:"_blank"},"Versi 2.0.6"))))}),io().on("datachange",(a,t)=>[db[a].put(t),state.lastSync=_.now()]),io().on("disconnect",()=>location.reload())]); \ No newline at end of file