Flatten nested repos

This commit is contained in:
sas.fajri
2026-04-27 10:13:31 +07:00
parent 01c2963a43
commit 8347aef8f4
17935 changed files with 5015229 additions and 3 deletions

View File

@@ -0,0 +1,68 @@
<template>
<v-dialog
v-model="dialog"
full-width
>
<v-btn
color="blue"
slot="activator"
dark
block
@click="search"
>
Cari
</v-btn>
<v-card>
<v-card-title
class="headline grey lighten-2 pt-2 pb-2"
primary-title
>
Data Pasien
</v-card-title>
<v-card-text class="pt-2 pb-2">
<patient-search-result></patient-search-result>
</v-card-text>
<v-divider></v-divider>
<v-card-actions>
<v-spacer></v-spacer>
<v-btn
color="primary"
flat
@click="dialog = false"
>
Tutup
</v-btn>
</v-card-actions>
</v-card>
</v-dialog>
</template>
<style scoped>
</style>
<script>
module.exports = {
components : {
'patient-search-result': httpVueLoader('./patientSearchResult.vue')
},
methods : {
search: function() {
this.$store.dispatch('patient/search')
}
},
computed : {
dialog: {
get() {
return this.$store.state.patient.search_dialog_is_active;
},
set(val) {
this.$store.commit('patient/update_search_dialog_is_active',val);
}
}
}
}
</script>

View File

@@ -0,0 +1,211 @@
<template>
<v-dialog v-model="dialog" :overlay="true" max-width="360px">
<v-card>
<v-card-title primary-title class="headline grey lighten-2">
Ambil / Upload Foto
</v-card-title>
<v-card-text>
<v-layout row wrap>
<!-- <v-flex xs12> -->
<v-flex>
<v-card fill-height flat class="photo_box" id="photo_box" elevation="24">
<v-layout align-center justify-center>
<div class="photo_inside" id="photo_inside" v-show="camera"></div>
<div class="photo_inside" id="photo_inside_2" v-show="!camera">
<v-img :src="imageUrl" aspect-ratio="1.34"
class="grey lighten-2 elevation-2"></v-img>
</div>
</v-layout>
</v-card>
<v-btn color="transparent" block @click="switch_camera" v-show="camera">Ubah Kamera</v-btn>
<v-btn color="success" block @click="snap_photo" v-show="camera">Ambil Foto</v-btn>
<v-btn color="orange" dark block @click="camera = true" v-show="!camera">Gunakan Kamera</v-btn>
<v-divider>xxxx</v-divider>
<v-flex xs12 class="text-xs-center">
atau
</v-flex>
<v-flex xs12 class="text-xs-center text-sm-center text-md-center text-lg-center">
<v-text-field label="Pilih Gambar" hide-details @click='pickFile' v-model='imageName'
prepend-icon='attach_file' class="mt-2"></v-text-field>
<input type="file" style="display: none" ref="image" accept="image/*"
@change="onFilePicked">
</v-flex>
<v-flex xs12>
<v-btn color="success" block @click="upload" :disabled="camera"
:dark="!camera">Simpan</v-btn>
</v-flex>
</v-flex>
</v-layout>
</v-card-text>
<v-divider></v-divider>
<v-card-actions>
<v-spacer></v-spacer>
<v-btn color="primary" flat @click="dialog = false">
Tutup
</v-btn>
</v-card-actions>
</v-card>
</v-dialog>
</template>
<style>
.photo_box {
overflow: hidden;
min-height: 240px;
min-width: 320px;
}
.photo_inside {
/* position: absolute;
top: 0;
left: 0; */
width: 100%;
height: 100%;
overflow: hidden;
}
#photo_inside_2 {
min-height: 240px;
min-width: 320px;
}
</style>
<script>
module.exports = {
data() {
return {
title: "Image Upload",
imageName: '',
imageUrl: '',
imageFile: '',
camera: true,
swithCamera: false
}
},
computed: {
dialog: {
get() { return this.$store.state.photo.dialog_photo },
set(v) { this.$store.commit('photo/update_dialog_photo', v) }
}
},
methods: {
snap_photo() {
var str = this.$store
Webcam.snap(function (data_uri) {
// document.getElementById('photo_result').innerHTML = '<img src="'+data_uri+'"/>';
// console.log(data_uri)
str.commit('photo/update_photo_64', data_uri)
str.dispatch('photo/upload')
})
delete str
},
pickFile() {
this.$refs.image.click()
},
onFilePicked(e) {
this.camera = false
console.log(this.camera)
const files = e.target.files
if (files[0] !== undefined) {
this.imageName = files[0].name
if (this.imageName.lastIndexOf('.') <= 0) {
return
}
const fr = new FileReader()
fr.readAsDataURL(files[0])
fr.addEventListener('load', () => {
this.imageUrl = fr.result
this.imageFile = files[0] // this is an image file that can be sent to server...
})
} else {
this.imageName = ''
this.imageFile = ''
this.imageUrl = ''
}
},
upload() {
this.$store.commit('photo/update_photo_64', this.imageUrl)
this.$store.dispatch('photo/upload')
},
switch_camera() {
this.swithCamera = !this.swithCamera
Webcam.reset();
Webcam.set({
width: 320,
height: 240,
image_format: 'jpeg',
jpeg_quality: 90,
dest_width: 640,
dest_height: 480,
constraints: {
facingMode: this.swithCamera ? "user" : "environment"
}
});
Webcam.attach('#photo_inside');
}
},
watch: {
dialog(n, o) {
if (n === true) {
this.camera = true;
Webcam.set({
width: 320,
height: 240,
image_format: 'jpeg',
jpeg_quality: 90,
dest_width: 640,
dest_height: 480,
constraints: {
facingMode: "environment" // Request rear camera
}
});
Webcam.attach('#photo_inside');
} else {
Webcam.reset();
}
},
camera(n, o) {
if (n === true) {
this.imageName = '';
this.imageFile = '';
this.imageUrl = '';
Webcam.set({
width: 320,
height: 240,
image_format: 'jpeg',
jpeg_quality: 90,
dest_width: 640,
dest_height: 480,
constraints: {
facingMode: "environment" // Request rear camera
}
});
Webcam.attach('#photo_inside');
} else {
Webcam.reset();
}
}
}
}
</script>

View File

@@ -0,0 +1,69 @@
<template>
<v-dialog
v-model="dialog"
width="1000px"
>
<v-card>
<v-card-title
class="headline grey lighten-2 pt-2 pb-2"
primary-title
>
Laporan
</v-card-title>
<v-card-text class="pt-2 pb-2">
<v-layout>
<v-flex xs12>
<object :data="rpt_url"
width="100%" height="512px"></object>
</v-flex>
</v-layout>
</v-card-text>
<v-divider></v-divider>
<v-card-actions>
<v-spacer></v-spacer>
<v-btn
color="primary"
@click="dialog = false"
flat
>
Tutup
</v-btn>
</v-card-actions>
</v-card>
</v-dialog>
</template>
<style scoped>
</style>
<script>
module.exports = {
components : {
},
methods : {
},
computed : {
dialog: {
get() {
return this.$store.state.order.print_dialog_is_active;
},
set(val) {
this.$store.commit('order/update_print_dialog_is_active', val);
}
},
rpt_url () {
return this.$store.state.order.rpt_url
}
}
}
</script>

View File

@@ -0,0 +1,49 @@
<template>
<v-flex class="pl-2">
<v-layout row>
<v-checkbox @change="checkedChange()"
:color="value.checked ? 'success' : 'warning' "
v-model="value.checked" hide-details class="shrink">
</v-checkbox>
<v-text-field
class="grow"
:label="value.label"
:placeholder="value.placeholder"
:background-color="value.checked ? 'success' : value.note == '' ? 'error' : 'warning' "
outline
:error-messages="value.is_error? value.error_message : ''"
:error="value.is_error"
v-model="value.note"
@input="noteChange()"
></v-text-field>
</v-layout>
</v-flex>
</template>
<script>
module.exports = {
props : ['value'],
methods : {
noteChange(note) {
if (! this.value.checked ) {
this.value.is_error = this.value.note.trim() == ""
} else {
this.value.is_error = false
this.value.note = ""
}
this.$emit("input", this.value )
},
checkedChange() {
if (this.value.checked) {
this.value.note = "";
this.value.is_error = false;
} else {
this.value.is_error = (this.value.note.trim() == "" )
}
this.$emit("input", this.value)
}
},
computed : {
}
}
</script>

View File

@@ -0,0 +1,106 @@
<template>
<v-dialog v-model="dialog" width="500" persistent>
<v-card>
<v-card-title class="headline grey lighten-2 pt-2 pb-2" primary-title>
Pendaftaran Berhasil
</v-card-title>
<v-card-text class="pt-2 pb-2">
<h6 class="display-1 text-center">
No Reg <span class="blue--text">{{ text_labno }}</span>
</h6>
</v-card-text>
<v-divider></v-divider>
<v-card-actions>
<v-spacer></v-spacer>
<v-btn color="info" flat @click="printQrcode"> Print Qrcode </v-btn>
<v-btn color="success" flat @click="printBarcode">
Print Barcode
</v-btn>
<v-btn color="primary" flat @click="finish"> Tutup </v-btn>
</v-card-actions>
</v-card>
</v-dialog>
</template>
<style scoped></style>
<script>
module.exports = {
components: {},
methods: {
tuing: function () {
alert("x");
},
finish: function () {
console.log("aye2");
this.dialog = false;
this.$store.commit("order/update_tab_enable", [0, false]);
this.$store.commit("order/update_tab_enable", [1, false]);
//this.$store.commit('change_tab', '03')
this.$store.dispatch("payment/reset", {
order_id: this.$store.state.payment.order_id,
time_start: this.$store.state.order.show_time,
url: this.xurl,
});
// var mcuid = this.$store.state.order.mcuid
// location.replace("/one-ui/test/vuex/one-mcu-offline-preregister-app-cponev2/?mcuid=" + mcuid)
},
printBarcode() {
one_print_barcode_formulir(this.text_labid);
this.$store.dispatch("order/getbarcode", {
id: this.text_labid,
no_lab: this.text_labno,
name: this.text_labname,
register_date: this.text_labdate,
});
},
printQrcode() {
let inp = {};
inp.id = this.text_labid;
inp.no_lab = this.text_labno;
inp.name = this.text_labname;
inp.register_date = this.text_labdate;
one_print_qrcode(inp);
// console.log("Input prm")
// console.log(inp)
console.log("print barcode new");
console.log(inp);
one_print_qrcode_patient(inp);
// this.$store.dispatch("order/getbarcode", {
// id: this.text_labid,
// no_lab: this.text_labno,
// name: this.text_labname,
// register_date: this.text_labdate,
// });
},
},
computed: {
dialog: {
get() {
return this.$store.state.order.finish_dialog_is_active;
},
set(val) {
this.$store.commit("order/update_finish_dialog_is_active", val);
},
},
text_labno() {
return this.$store.state.order.current_order.noreg;
},
text_labid() {
return this.$store.state.order.current_order.id;
},
text_labname() {
return this.$store.state.order.current_order.name;
},
text_labdate() {
return this.$store.state.order.current_order.register_date;
},
xurl() {
return this.$store.state.order.current_order.url;
},
},
};
</script>

View File

@@ -0,0 +1,251 @@
<template>
<v-layout column pb-2>
<v-card class="pa-1 mb-0" >
<v-layout align-center row>
<v-flex xs12>
<v-card tile class="pa-2" flat color="#64b2cd">
<h5 style="color:#fff" class="subtitle-1 font-weight-bold">KEL. PELANGGAN DAN AGREEMENT</h5>
</v-card>
</v-flex>
</v-layout>
<v-layout row>
<v-flex pt-1 pl-2 pr-1 xs6>
<v-autocomplete
label="Kel. Pelanggan"
v-model="selected_company"
:items="companies"
style="font-size:12px;"
:search-input.sync="search"
:readonly="isHavingTest"
auto-select-first
no-filter
hide-details
return-object
:clearable="! isHavingTest"
item-text="M_CompanyName"
:loading="is_loading"
no-data-text="Pilih Company"
>
<template
slot="item"
slot-scope="{ item }"
>
<v-list-tile-content>
<v-list-tile-title v-text="item.M_CompanyName"></v-list-tile-title>
<v-list-tile-sub-title v-text="getMou(item)"></v-list-tile-sub-title>
</v-list-tile-content>
</template>
</v-autocomplete>
</v-flex>
<v-flex pt-1 pl-1 pr-2 xs6>
<v-select
v-model="selected_mou"
:items="company_mou"
:readonly="isHavingTest"
style="font-size:12px;"
auto-select-first
item-text = "M_MouName"
return-object
label="Agreement"
hide-details
class="mb-1"
>
<template
slot="item"
slot-scope="{ item }"
>
<v-list-tile-content>
<v-list-tile-title v-text="item.M_MouName"></v-list-tile-title>
<v-list-tile-sub-title v-text="getMouDate(item)"></v-list-tile-sub-title>
</v-list-tile-content>
</template>
</v-select>
</v-flex>
</v-layout>
<v-layout v-if="selected_mou_note.length > 0" mt-1 pt-1 pl-2 pr-2 style="border:1px dashed #64b2cd" row>
<v-flex xs12>
<p class="mb-1"><kbd style="background:#ec4d4d">Catatan :</kbd></p>
<p v-for="(note, n) in selected_mou_note" v-bind:key="n" class="mb-1 caption">{{ note }}</p>
</v-flex>
</v-layout>
<v-layout v-if="show_doctor_alert" mt-1 pt-1 pl-2 pr-2 row>
<v-flex xs12>
<p style="background:#ee7777;color:#fff" class="caption pl-2 pr-2 pt-1 pb-1 mb-1">Dokter belum dipilih, jangan lupa ya</p>
</v-flex>
</v-layout>
</v-card>
</v-layout>
</template>
<style scoped>
</style>
<script>
module.exports = {
computed: {
show_doctor_alert(){
return this.$store.state.doctor.show_doctor_alert
},
search:{
get(){
return this.$store.state.company.search
},
set(val) {
if (val == null) return
this.$store.commit('company/update_search',val)
}
},
isHavingTest() {
return this.$store.state.px.selected_test.length > 0 ||
this.$store.state.px.selected_panel.length > 0
},
selected_mou: {
get() {
return this.$store.state.company.selected_mou
},
set(val) {
this.$store.commit("company/update_selected_mou", val)
let dlv = this.$store.state.delivery.checked_id
let cmou = val
//alert(val.M_MouID)
this.$store.dispatch('delivery/search_deliveries',{type:'mou',id:val.M_MouID})
// Search Test
this.$store.dispatch('px/search')
var doctor = this.$store.state.doctor.selected_doctor
var company = this.$store.state.company.selected_company
var alias_doctor = this.$store.state.doctor.doctor_alias
var doctorname = ['','']
if(!_.isEmpty(doctor))
doctorname = doctor.M_DoctorName.split(']')
// Auto CHECKED
if(doctorname[1].trim() === '-' && company.M_CompanyName !== 'PASIEN MANDIRI'){
this.$store.commit("company/update_show_alias_doctor",true)
}
else{
this.$store.commit("company/update_show_alias_doctor",false)
}
if(doctor.M_DoctorName){
if(doctorname[1].trim() === '-' && alias_doctor === '' && company.M_CompanyName !== 'PASIEN MANDIRI'){
this.$store.commit('doctor/update_show_doctor_alert', true)
}
else{
this.$store.commit('doctor/update_show_doctor_alert', false)
}
}
else{
this.$store.commit('doctor/update_show_doctor_alert', true)
}
}
},
selected_company: {
get() {
return this.$store.state.company.selected_company
},
set(val) {
this.$store.commit("company/update_selected_company", val)
for (let i in val.mou)
if (val.mou[i].M_MouIsDefault == 'Y'){
this.$store.commit('company/update_selected_mou', val.mou[i])
this.$store.dispatch('delivery/search_deliveries',{type:'mou',id:val.mou[i].M_MouID})
console.log("mulai cari px")
this.$store.dispatch('px/search')
}
var doctor = this.$store.state.doctor.selected_doctor
var doctorname = ['','']
if(!_.isEmpty(doctor))
doctorname = doctor.M_DoctorName.split(']')
var alias_doctor = this.$store.state.doctor.doctor_alias
if(doctorname[1].trim() === '-' && val.M_CompanyName !== 'PASIEN MANDIRI'){
this.$store.commit("company/update_show_alias_doctor",true)
}
else{
this.$store.commit("company/update_show_alias_doctor",false)
this.$store.commit('doctor/update_doctor_alias','')
this.$store.commit('doctor/update_doctor_alias_address','')
}
if(doctor.M_DoctorName){
if(doctorname[1].trim() === '-' && alias_doctor === '' && val.M_CompanyName !== 'PASIEN MANDIRI'){
this.$store.commit('doctor/update_show_doctor_alert', true)
}
else{
this.$store.commit('doctor/update_show_doctor_alert', false)
this.$store.commit('doctor/update_doctor_alias','')
this.$store.commit('doctor/update_doctor_alias_address','')
}
}
else{
this.$store.commit('doctor/update_show_doctor_alert', true)
}
}
},
company_mou() {
if (! this.$store.state.company.selected_company) return []
if (! this.$store.state.company.selected_company.mou) return []
return this.$store.state.company.selected_company.mou
},
companies() {
return this.$store.state.company.companies
},
is_loading() {
return this.$store.state.company.search_status == 1
},
selected_mou_note() {
let x = this.selected_mou
if (!x)
return []
if (!x.M_MouNote)
return []
return x.M_MouNote.split(/\n/)
}
},
methods: {
getMouDate(item) {
return item.M_MouStartDate + ' s/d ' + item.M_MouEndDate
},
getMou(item) {
if (!item) return ''
if (!item.mou) return ''
let s_mou = ''
item.mou.forEach( function(mou,idx) {
if (s_mou!='') s_mou += ', '
s_mou += mou.M_MouName
});
return s_mou
},
thr_search: _.debounce( function () {
this.$store.dispatch("company/search")
}, 700)
},
watch: {
search(val,old) {
if (this.$store.state.order.is_from_clinic)
return
if (val == null || typeof val == 'undefined') val = ""
if (val == old ) return
if (this.$store.state.company.search_status == 1 ) return
this.$store.commit("company/update_search",val)
this.thr_search()
}
},
data: function() {
return {
// search : ''
}
},
mounted () {
// this.$store.dispatch('company/search_default')
}
}
</script>

View File

@@ -0,0 +1,224 @@
<template>
<v-layout column pb-2>
<v-card class="pa-1 mb-0" >
<v-layout align-center row>
<v-flex xs12>
<v-card tile class="pa-2" flat color="#64b2cd">
<h5 style="color:#fff" class="subtitle-1 font-weight-bold">KEL. PELANGGAN DAN AGREEMENT</h5>
</v-card>
</v-flex>
</v-layout>
<v-layout row>
<v-flex pt-1 pl-2 pr-1 xs6>
<v-autocomplete
label="Kel. Pelanggan"
v-model="selected_company"
:items="companies"
style="font-size:12px;"
:search-input.sync="search"
:readonly="isHavingTest"
auto-select-first
no-filter
hide-details
return-object
:clearable="! isHavingTest"
item-text="M_CompanyName"
:loading="is_loading"
no-data-text="Pilih Company"
>
<template
slot="item"
slot-scope="{ item }"
>
<v-list-tile-content>
<v-list-tile-title v-text="item.M_CompanyName"></v-list-tile-title>
<v-list-tile-sub-title v-text="getMou(item)"></v-list-tile-sub-title>
</v-list-tile-content>
</template>
</v-autocomplete>
</v-flex>
<v-flex pt-1 pl-1 pr-2 xs6>
<v-select
v-model="selected_mou"
:items="company_mou"
:readonly="isHavingTest"
style="font-size:12px;"
auto-select-first
item-text = "M_MouName"
return-object
label="Agreement"
hide-details
class="mb-1"
>
<template
slot="item"
slot-scope="{ item }"
>
<v-list-tile-content>
<v-list-tile-title v-text="item.M_MouName"></v-list-tile-title>
<v-list-tile-sub-title v-text="getMouDate(item)"></v-list-tile-sub-title>
</v-list-tile-content>
</template>
</v-select>
</v-flex>
</v-layout>
<v-layout v-if="selected_mou_note.length > 0" mt-1 pt-1 pl-2 pr-2 style="border:1px dashed #64b2cd" row>
<v-flex xs12>
<p class="mb-1"><kbd style="background:#ec4d4d">Catatan :</kbd></p>
<p v-for="(note, n) in selected_mou_note" v-bind:key="n" class="mb-1 caption">{{ note }}</p>
</v-flex>
</v-layout>
<v-layout v-if="show_doctor_alert" mt-1 pt-1 pl-2 pr-2 row>
<v-flex xs12>
<p style="background:#ee7777;color:#fff" class="caption pl-2 pr-2 pt-1 pb-1 mb-1">Dokter belum dipilih, jangan lupa ya</p>
</v-flex>
</v-layout>
</v-card>
</v-layout>
</template>
<style scoped>
</style>
<script>
module.exports = {
computed: {
show_doctor_alert(){
return this.$store.state.doctor.show_doctor_alert
},
search:{
get(){
return this.$store.state.company.search
},
set(val) {
if (val == null) return
this.$store.commit('company/update_search',val)
}
},
isHavingTest() {
return this.$store.state.px.selected_test.length > 0 ||
this.$store.state.px.selected_panel.length > 0
},
selected_mou: {
get() {
return this.$store.state.company.selected_mou
},
set(val) {
this.$store.commit("company/update_selected_mou", val)
var doctor = this.$store.state.doctor.selected_doctor
var company = this.$store.state.company.selected_company
var alias_doctor = this.$store.state.doctor.doctor_alias
if(doctor){
if(doctor.M_DoctorName.trim() === '-' && alias_doctor === '' && company.M_CompanyName !== 'PASIEN MANDIRI'){
this.$store.commit('doctor/update_show_doctor_alert', true)
}
else{
this.$store.commit('doctor/update_show_doctor_alert', false)
}
}
else{
this.$store.commit('doctor/update_show_doctor_alert', true)
}
// Auto CHECKED
let dlv = this.$store.state.delivery.checked_id
let cmou = val
this.$store.dispatch('delivery/search_deliveries',{type:'mou',id:val.M_MouID})
// Search Test
this.$store.dispatch('px/search')
}
},
selected_company: {
get() {
return this.$store.state.company.selected_company
},
set(val) {
this.$store.commit("company/update_selected_company", val)
for (let i in val.mou)
if (val.mou[i].M_MouIsDefault == 'Y'){
this.$store.commit('company/update_selected_mou', val.mou[i])
this.$store.dispatch('delivery/search_deliveries',{type:'mou',id:val.mou[i].M_MouID})
console.log("mulai cari px")
this.$store.dispatch('px/search')
}
var doctor = this.$store.state.doctor.selected_doctor
var alias_doctor = this.$store.state.doctor.doctor_alias
if(doctor){
if(doctor.M_DoctorName.trim() === '-' && alias_doctor === '' && val.M_CompanyName !== 'PASIEN MANDIRI'){
this.$store.commit('doctor/update_show_doctor_alert', true)
}
else{
this.$store.commit('doctor/update_show_doctor_alert', false)
}
}
else{
this.$store.commit('doctor/update_show_doctor_alert', true)
}
}
},
company_mou() {
if (! this.$store.state.company.selected_company) return []
if (! this.$store.state.company.selected_company.mou) return []
return this.$store.state.company.selected_company.mou
},
companies() {
return this.$store.state.company.companies
},
is_loading() {
return this.$store.state.company.search_status == 1
},
selected_mou_note() {
let x = this.selected_mou
if (!x)
return []
if (!x.M_MouNote)
return []
return x.M_MouNote.split(/\n/)
}
},
methods: {
getMouDate(item) {
return item.M_MouStartDate + ' s/d ' + item.M_MouEndDate
},
getMou(item) {
if (!item) return ''
if (!item.mou) return ''
let s_mou = ''
item.mou.forEach( function(mou,idx) {
if (s_mou!='') s_mou += ', '
s_mou += mou.M_MouName
});
return s_mou
},
thr_search: _.debounce( function () {
this.$store.dispatch("company/search")
}, 700)
},
watch: {
search(val,old) {
if (this.$store.state.order.is_from_clinic)
return
if (val == null || typeof val == 'undefined') val = ""
if (val == old ) return
if (this.$store.state.company.search_status == 1 ) return
this.$store.commit("company/update_search",val)
this.thr_search()
}
},
data: function() {
return {
// search : ''
}
},
mounted () {
this.$store.dispatch('company/search_default')
}
}
</script>

View File

@@ -0,0 +1,15 @@
<template>
<v-layout column>
<one-fo-registration-patient-order></one-fo-registration-patient-order>
</v-layout>
</template>
<style scoped>
</style>
<script>
module.exports = {
components : {
'one-fo-registration-patient-order' : httpVueLoader('./oneFoRegistrationPatientOrder.vue')
}
}
</script>

View File

@@ -0,0 +1,361 @@
<template>
<v-dialog
v-model="dialog"
persistent
width="800px"
>
<v-card>
<v-card-text>
<v-layout row wrap>
<v-flex xs6 pr-2>
<v-layout row wrap>
<v-flex xs12 pl-1 pr-1>
<v-text-field
label="NAMA LENGKAP"
v-model="name"
:error="!rules.required"
:rules="[rules.required]"
@update:error="error_trigger('name', $event)"
></v-text-field>
</v-flex>
<v-flex xs6 pl-1 pr-1>
<v-text-field
label="Prefix 1"
v-model="prefix1"
></v-text-field>
</v-flex>
<v-flex xs6 pl-1 pr-1>
<v-text-field
label="Prefix 2"
v-model="prefix2"
></v-text-field>
</v-flex>
</v-layout>
<v-layout row wrap>
<v-flex xs4 pl-1 pr-1>
<v-text-field
label="Sufix 1"
v-model="sufix1"
></v-text-field>
</v-flex>
<v-flex xs4 pl-1 pr-1>
<v-text-field
label="Sufix 2"
v-model="sufix2"
></v-text-field>
</v-flex>
<v-flex xs4 pl-1 pr-1>
<v-text-field
label="Sufix 3"
v-model="sufix3"
></v-text-field>
</v-flex>
</v-layout>
<v-layout row wrap>
<v-flex xs6 pl-1 pr-1>
<v-select
:items="sexs"
item-text="M_SexName"
item-value="M_SexID"
return-object
v-model="selected_sex"
label="Jenis Kelamin"
:error="!rules.required"
:rules="[rules.required]"
@update:error="error_trigger('selected_sex', $event)"
></v-select>
</v-flex>
<v-flex xs6>
&nbsp;
</v-flex>
<v-flex xs12 pl-1 pr-1>
<v-text-field
label="No HP"
v-model="hp"
:error="!rules.required"
:rules="[rules.required]"
@update:error="error_trigger('hp', $event)"
></v-text-field>
</v-flex>
<v-flex xs12 pl-1 pr-1>
<v-text-field
label="Catatan"
v-model="note"
></v-text-field>
</v-flex>
</v-layout>
</v-flex>
<v-flex xs6 pl-2>
<v-layout row wrap>
<v-flex xs12>
<v-textarea label="Alamat lengkap" v-model="address"
:error="!rules.required"
:rules="[rules.required]"
@update:error="error_trigger('address', $event)"></v-textarea>
</v-flex>
<v-flex xs12>
<v-autocomplete
:items="provinces"
item-text="M_ProvinceName"
item-value="M_ProvinceID"
return-object
v-model="selected_province"
label="Propinsi"
autocomplete
></v-autocomplete>
</v-flex>
<v-flex xs12>
<v-autocomplete
:items="cities"
item-text="M_CityName"
item-value="M_CityID"
return-object
v-model="selected_city"
label="Kota"
autocomplete
></v-autocomplete>
</v-flex>
<v-flex xs12>
<v-autocomplete
:items="districts"
item-text="M_DistrictName"
item-value="M_DictrictID"
return-object
v-model="selected_district"
label="Kecamatan"
autocomplete
></v-autocomplete>
</v-flex>
<v-flex xs12>
<v-autocomplete
:items="villages"
item-text="M_KelurahanName"
item-value="M_KelurahanID"
return-object
v-model="selected_village"
label="Kelurahan"
autocomplete
:error="!rules.required"
:rules="[rules.required]"
@update:error="error_trigger('selected_village', $event)"
></v-autocomplete>
</v-flex>
</v-layout>
</v-flex>
</v-layout>
</v-card-text>
<v-card-actions>
<v-btn color="primary" flat @click="dialog=!dialog">Tutup</v-btn>
<v-spacer></v-spacer>
<v-btn color="primary" @click="save" :disabled="!btn_save_enabled" >Simpan</v-btn>
</v-card-actions>
</v-card>
</v-dialog>
</template>
<script>
module.exports = {
data () {
return {
errors : {
name : true,
hp : true,
sufix1 : false,
sufix2 : false,
sufix3 : false,
prefix1 : false,
prefix2 : false,
selected_sex : true,
address : false,
selected_village : false
},
rules : {
required : value => { return !!value || "Harus diisi !" },
// hp : value => { this.errors.name = !value; return !!value || "Harus diisi !" },
// selected_sex : value => { this.errors.name = !value; return !!value || "Harus diisi !" },
// address : value => { this.errors.name = !value; return !!value || "Harus diisi !" },
// selected_village : value => { this.errors.name = !value; return !!value || "Harus diisi !" }
}
}
},
computed : {
dialog : {
get () { return this.$store.state.doctor_new.dialog_new },
set (v) { this.$store.commit('doctor_new/update_dialog_new') }
},
sexs () {
return this.$store.state.doctor_new.sexs
},
selected_sex : {
get () { return this.$store.state.doctor_new.selected_sex },
set (v) { this.$store.commit('doctor_new/update_selected_sex', v) }
},
provinces () {
return this.$store.state.doctor_new.provinces
},
selected_province : {
get () { return this.$store.state.doctor_new.selected_province },
set (v) {
this.$store.commit('doctor_new/update_selected_province', v)
// this.$store.dispatch('doctor_new/search_city')
}
},
cities () {
return this.$store.state.doctor_new.cities
},
selected_city : {
get () { return this.$store.state.doctor_new.selected_city },
set (v) {
this.$store.commit('doctor_new/update_selected_city', v)
// this.$store.dispatch('doctor_new/search_district')
}
},
districts () {
return this.$store.state.doctor_new.districts
},
selected_district : {
get () { return this.$store.state.doctor_new.selected_district },
set (v) {
this.$store.commit('doctor_new/update_selected_district', v)
// this.$store.dispatch('doctor_new/search_village')
}
},
villages () {
return this.$store.state.doctor_new.villages
},
selected_village : {
get () { return this.$store.state.doctor_new.selected_village },
set (v) { this.$store.commit('doctor_new/update_selected_village', v) }
},
name : {
get () { return this.$store.state.doctor_new.param_name },
set (v) { this.$store.commit('doctor_new/update_param', {param:'name',val:v}) }
},
prefix1 : {
get () { return this.$store.state.doctor_new.param_prefix1 },
set (v) { this.$store.commit('doctor_new/update_param', {param:'prefix1',val:v}) }
},
prefix2 : {
get () { return this.$store.state.doctor_new.param_prefix2 },
set (v) { this.$store.commit('doctor_new/update_param', {param:'prefix2',val:v}) }
},
sufix1 : {
get () { return this.$store.state.doctor_new.param_sufix1 },
set (v) { this.$store.commit('doctor_new/update_param', {param:'sufix1',val:v}) }
},
sufix2 : {
get () { return this.$store.state.doctor_new.param_sufix2 },
set (v) { this.$store.commit('doctor_new/update_param', {param:'sufix2',val:v}) }
},
sufix3 : {
get () { return this.$store.state.doctor_new.param_sufix3 },
set (v) { this.$store.commit('doctor_new/update_param', {param:'sufix3',val:v}) }
},
hp : {
get () { return this.$store.state.doctor_new.param_hp },
set (v) { this.$store.commit('doctor_new/update_param', {param:'hp',val:v}) }
},
note : {
get () { return this.$store.state.doctor_new.param_note },
set (v) { this.$store.commit('doctor_new/update_param', {param:'note',val:v}) }
},
address : {
get () { return this.$store.state.doctor_new.param_address },
set (v) { this.$store.commit('doctor_new/update_param', {param:'address',val:v}) }
},
btn_save_enabled () {
if (this.errors.name || this.errors.hp || this.errors.selected_sex || this.errors.address ||
this.errors.selected_village)
return false
return true
}
},
methods : {
save () {
this.$store.commit('update_dialog_loading', true)
this.$store.dispatch('doctor_new/save')
},
error_trigger(x, e) {
this.errors[x] = e
}
},
mounted () {
this.$store.dispatch('doctor_new/search_sex')
},
watch : {
dialog(val, old) {
if (val && !old) {
this.$store.dispatch('doctor_new/search_province')
this.name = ""
this.hp = ""
this.sufix1 = ""
this.sufix2 = ""
this.sufix3 = ""
this.prefix1 = ""
this.prefix2 = ""
this.selected_sex = null
this.address = ""
}
},
selected_province(val, old) {
if (val != old)
this.$store.dispatch('doctor_new/search_city')
},
selected_city(val, old) {
if (val != old)
this.$store.dispatch('doctor_new/search_district')
},
selected_district(val, old) {
if (val != old)
this.$store.dispatch('doctor_new/search_village')
}
}
}
</script>

View File

@@ -0,0 +1,25 @@
<template>
<div class="text-center ma-2">
<v-snackbar
v-model="snackbar"
>
{{ text }}
<v-btn
color="red"
text
@click="snackbar = false"
>
Tutup
</v-btn>
</v-snackbar>
</div>
</template>
<script>
module.exports = {
data: () => ({
snackbar: false,
text: 'Ups ! Nampaknya anda harus login kembali',
}),
}
</script>

View File

@@ -0,0 +1,17 @@
<template>
<v-dialog
v-model="dialog"
max-width="500px"
transition="dialog-transition"
>
<v-card>
<v-card-text>
</v-card-text>
<v-card-actions>
</v-card-actions>
</v-card>
</v-dialog>
</template>

View File

@@ -0,0 +1,440 @@
<template>
<v-layout column pb-2>
<v-card >
<v-layout row>
<v-flex md6>
<v-layout row pl-2>
<v-flex md5>
<div class="font-weight-bold text-fajrihm">No Reg</div>
</v-flex>
<v-flex md7>
<div class="font-weight-regular text-fajrihm text-md-right">{{ order_no }}</div>
</v-flex>
</v-layout>
<v-layout row pl-2>
<v-flex md5>
<div class="font-weight-bold text-fajrihm">Tangal Periksa</div>
</v-flex>
<v-flex md7>
<div class="font-weight-regular text-fajrihm text-md-right">{{ order_date }}</div>
</v-flex>
</v-layout>
</v-flex>
<v-flex md6>
<v-layout row pl-2>
<v-flex md5>
<div class="font-weight-bold text-fajrihm">PID</div>
</v-flex>
<v-flex md7>
<div class="font-weight-regular text-fajrihm text-md-right">{{ patient_mr }}</div>
</v-flex>
</v-layout>
<v-layout row pl-2>
<v-flex md5>
<div class="font-weight-bold text-fajrihm">Nama Pasien</div>
</v-flex>
<v-flex md7>
<div class="font-weight-regular text-fajrihm text-md-right">{{ patient_name }}</div>
</v-flex>
</v-layout>
</v-flex>
</v-layout>
<v-layout row>
<v-flex md6>
<v-layout row pl-2>
<v-flex md5>
<div class="font-weight-bold text-fajrihm">Kel. Pelanggan</div>
</v-flex>
<v-flex md7>
<div class="font-weight-regular text-fajrihm text-md-right">{{ order_company }}</div>
</v-flex>
</v-layout>
</v-flex>
<v-flex md6>
<v-layout row pl-2>
<v-flex md5>
<div class="font-weight-bold text-fajrihm">Agreement</div>
</v-flex>
<v-flex md7>
<div class="font-weight-regular text-fajrihm text-md-right">{{ order_mou }}</div>
</v-flex>
</v-layout>
</v-flex>
</v-layout>
<v-layout row mb-2>
<v-flex md6>
<v-layout row pl-2>
<v-flex md5>
<div class="font-weight-bold text-fajrihm">Pengirim</div>
</v-flex>
<v-flex md7>
<div class="font-weight-regular text-fajrihm text-md-right">{{ doctor_sender }}</div>
</v-flex>
</v-layout>
</v-flex>
<v-flex md6>
<v-layout row pl-2>
<v-flex md5>
<div class="font-weight-bold text-fajrihm">Alamat Pengirim</div>
</v-flex>
<v-flex md7>
<div class="font-weight-regular text-fajrihm text-md-right">{{ doctor_sender_address }}</div>
</v-flex>
</v-layout>
</v-flex>
</v-layout>
<v-layout style="border-top:1px dashed rgb(221,221,221)" row mt-1 mb-1></v-layout>
<v-layout row mb-2 wrap>
<v-flex v-for="(dlv, n) in order_delivery" xs6 v-bind:key="n">
<v-layout row wrap pl-2>
<v-flex xs4 class="label-delivery font-weight-bold">
{{ dlv.delivery_name }}
</v-flex>
<v-flex xs8 class="text-delivery text-xs-right">
<p class="mb-1">{{ dlv.description }}</p>
<p class="mb-1 mono red--text caption">catatan : <span v-if="dlv.note === ''">-</span> <span v-if="dlv.note !== ''">{{ dlv.note }}</span></p>
</v-flex>
</v-layout>
</v-flex>
</v-layout>
<v-layout style="border-top:1px dashed rgb(221,221,221)" row mt-1 mb-1></v-layout>
<v-layout row pa-2>
<v-flex xs12>
<table>
<tr style="background:#ffeaa5">
<th style="width:42%;font-weight:bold;font-size:12px;" class="text-md-center pt-2 pb-2">PEMERIKSAAN</th>
<th style="width:12%;font-weight:bold;font-size:12px;" class="text-md-center pt-2 pb-2">BRUTO</th>
<th style="width:12%;font-weight:bold;font-size:12px;" class="text-md-center pt-2 pb-2">DISKON</th>
<th style="width:12%;font-weight:bold;font-size:12px;" class="text-md-center pt-2 pb-2">TOTAL</th>
</tr>
<tr style="font-size:12px" v-for="t in selected_test" v-bind:key="t.T_TestID">
<td class="text-md-left pl-3">
<p class="mb-1">{{ t.T_TestName}}</p>
<p class="mb-0 caption" v-show="child_test_show(t)">{{child_test(t.child_test)}}</p>
</td>
<td class="text-md-right mono pr-2">{{ one_money(t.T_PriceAmount) }}</td>
<td class="text-md-right mono pr-2">{{ one_money(calc_discount(t)) }}</td>
<td class="text-md-right mono font-weight-black pr-2">{{ one_money(calc_netto(t)) }}</td>
</tr>
<!-- TEST PANEL -->
<template v-for="p in selected_panel">
<tr class="tr-panel">
<td class="text-md-center">
<v-icon color="red" @click="deletePanel(p)">delete</v-icon>
</td>
<td class="text-md-left pl-3 pr-2" colspan="4">{{ p.T_TestPanelName}}</td>
</tr>
<tr v-for="t in p.test" v-bind:key="t.T_TestID">
<td class="text-md-center">
&nbsp;
</td>
<td class="text-md-left pl-3">{{ t.T_TestName}}</td>
<td class="text-md-right pr-2">{{ one_money(t.T_PriceAmount) }}</td>
<td class="text-md-right pr-2">{{ one_money(calc_discount(t)) }}</td>
<td class="text-md-right pr-2">{{ one_money(calc_netto(t)) }}</td>
</tr>
</template>
<!--/ TEST PANEL -->
<tfoot>
<tr>
<th style="background:#e16262;color:#fff" class="text-md-left pl-3 pt-2 pb-2">TOTAL</th>
<th style="background:#e16262;color:#fff" class="text-md-right pr-2 pt-2 pb-2">{{ one_money(bruto_total) }}</th>
<th style="background:#e16262;color:#fff" class="text-md-right pr-2 pt-2 pb-2">{{ one_money(diskon_total) }}</th>
<th style="background:#e16262;color:#fff" class="text-md-right pr-2 pt-2 pb-2" >{{ one_money(sub_total) }}</th>
</tr>
</tfoot>
</table>
</v-flex>
</v-layout>
<v-layout style="border-top:1px dashed rgb(221,221,221)" row mt-2 mb-2></v-layout>
</template>
<style scoped>
.v-input--selection-controls {
margin-top: 0px;
padding-top: 0px;
}
.text-fajrihm{
padding: 3px 20px 3px 0;
text-align:left;
font-size: 13px;
font-family: open sans, tahoma, sans-serif;
}
.label-delivery{
font-size: 11px;
padding: 3px 20px 3px 0;
font-family: open sans, tahoma, sans-serif;
}
.text-delivery{
font-size: 12px;
padding: 3px 20px 3px 0;
font-family: open sans, tahoma, sans-serif;
}
.nota {
font-size: 2em;
font-weight: bold;
text-align: left;
}
.total {
min-height:76px;
}
table {
font-family: arial, sans-serif;
border-collapse: collapse;
width: 100%;
background:white;
border: 0px;
}
th, td {
border: 1px solid black;
border-collapse: collapse;
padding-top: 2px;
padding-bottom: 2px;
}
table>tr>td {
padding: 8px;
}
table>tr>td:first {
padding-left:15px!important;
}
.nota {
font-size: 2em;
font-weight: bold;
text-align: left;
}
.total {
min-height:76px;
}
table {
font-family: arial, sans-serif;
border-collapse: collapse;
width: 100%;
background:white;
border: 0px;
}
th, td {
border: 1px solid black;
border-collapse: collapse;
padding-top: 2px;
padding-bottom: 2px;
}
table>tr>td {
padding: 8px;
}
table>tr>td:first {
padding-left:15px!important;
}
.vintage-text{
text-shadow: 0px -2px 0px #fff, 0px 2px 3px #fff;
}
</style>
<script>
module.exports = {
methods : {
one_money(p) {
return window.one_money(p)
},
child_test(x) {
let y = []
for (let i in x)
y.push(x[i].T_TestName)
return y.join(', ')
},
child_test_show(t) {
if (!t.child_test)
return false
if (t.child_test.length < 1)
return false
if (t.px_type != 'PN')
return false
return true
},
calc_netto(t) {
return one_float(t.T_PriceAmount) - one_float(t.T_PriceDisc) / 100 * one_float(t.T_PriceAmount)
- one_float(t.T_PriceDiscRp)
},
calc_discount(t) {
return ( one_float(t.T_PriceDisc) / 100 * one_float(t.T_PriceAmount) )
+ one_float(t.T_PriceDiscRp)
},
},
data() {
return {
}
},
computed : {
selected_panel() {
return this.$store.state.px.selected_panel
},
selected_test() {
return this.$store.state.px.selected_test
},
discount_pembulatan() {
//sipe : set to 0
return 0
let st = this.sub_total
let part = st%1000
if (part > 500) return part - 500
if (part < 500 && part > 0 ) return part
return 0
},
grand_total() {
let gt = this.sub_total - this.discount_pembulatan
return gt
},
sub_total() {
let tests = this.selected_test
sub_total = 0
tests.forEach(function(t,idx) {
let price = t.T_PriceAmount - t.T_PriceDisc / 100 * t.T_PriceAmount
- t.T_PriceDiscRp
sub_total += price
})
let panels = this.selected_panel
panels.forEach(function(p) {
let tests = p.test
tests.forEach(function(t,idx) {
let price = t.T_PriceAmount - t.T_PriceDisc / 100 * t.T_PriceAmount
- t.T_PriceDiscRp
sub_total += price
})
})
return sub_total
},
bruto_total() {
let tests = this.selected_test
bruto_total = 0
tests.forEach(function(t,idx) {
//console.log(t.T_PriceAmount)
bruto_total += parseInt(t.T_PriceAmount)
//console.log(bruto_total)
})
let panels = this.selected_panel
panels.forEach(function(p) {
let tests = p.test
tests.forEach(function(t,idx) {
bruto_total += parseInt(t.T_PriceAmount)
})
})
return bruto_total
},
diskon_total() {
let tests = this.selected_test
diskon_total = 0
tests.forEach(function(t,idx) {
let price = parseInt(t.T_PriceDisc) / 100 * parseInt(t.T_PriceAmount) + parseInt(t.T_PriceDiscRp)
diskon_total += price
})
let panels = this.selected_panel
panels.forEach(function(p) {
let tests = p.test
tests.forEach(function(t,idx) {
let price = parseInt(t.T_PriceDisc) / 100 * parseInt(t.T_PriceAmount) + parseInt(t.T_PriceDiscRp)
diskon_total += price
})
})
return diskon_total
},
order_no() {
return this.$store.state.payment.selected_patient.order_no
},
order_date() {
let x
try {
let z = this.$store.state.payment.selected_patient.order_date
let y = z.split(' ')
x = y[0].split('-').reverse().join('-') + ' ' + (y[1] ? y[1] : '')
} catch (e) { x = '-' }
return x
},
order_mou() {
return this.$store.state.payment.selected_patient.order_mou
},
order_company() {
return this.$store.state.payment.selected_patient.order_company
},
patient_name() {
return this.$store.state.payment.selected_patient.patient_name
},
patient_mr() {
return this.$store.state.payment.selected_patient.patient_mr
},
doctor_sender() {
var xdoctor = this.$store.state.payment.selected_patient.doctor_sender
if(this.$store.state.doctor.doctor_alias != '')
xdoctor = this.$store.state.doctor.doctor_alias
return xdoctor
},
doctor_sender_address() {
var xaddress = this.$store.state.payment.selected_patient.doctor_sender_address
if(this.$store.state.doctor.doctor_alias_address != '')
xaddress = this.$store.state.doctor.doctor_alias_address
return xaddress
},
doctor_pj() {
return this.$store.state.payment.selected_patient.doctor_pj
},
order_detail() {
return this.$store.state.payment.order_detail
},
order_subtotal() {
return this.$store.state.payment.order_subtotal
},
order_rounding() {
return this.$store.state.payment.order_rounding
},
order_total() {
return this.$store.state.payment.order_total
},
order_delivery() {
var dlvr = this.$store.state.delivery.data_deliveries
return _.filter(dlvr, function(o) { return o.chex === 'Y' })
}
}
}
</script>

View File

@@ -0,0 +1,442 @@
<template>
<v-layout column pb-2>
<v-card >
<v-layout row pa-2 align-center wrap >
<v-flex xs6>
<div class="label-tagihan text-xs-left">Total Tagihan 001</div>
<v-layout style="border-top:1px dashed rgb(221,221,221)" row mt-1 mb-1 class="mt-3"></v-layout>
<v-layout row wrap v-show="order_company.is_bill == 'N'">
<v-flex xs6>
<h3 class="subheading orange--text">Minimum DP ({{ order_company.min_dp }}%)</h3>
</v-flex>
<v-flex xs6>
<h3 class="subheading text-xs-right orange--text">{{ one_money(order_company.min_dp_rp) }}</h3>
</v-flex>
</v-layout>
<v-layout row wrap v-show="order_company.is_bill == 'Y' && order_company.on_hold == 'Y'">
<v-flex xs12>
<h3 class="subheading red--text">{{ order_company.on_hold_text }}</h3>
</v-flex>
</v-layout>
</v-flex>
<v-flex xs6>
<div class="text-tagihan text-xs-right"><kbd>{{ one_money(bill_total) }}</kbd></div>
</v-flex>
</v-layout>
<v-layout style="border-top:1px dashed rgb(221,221,221)" row mt-1 mb-1></v-layout>
<v-layout column>
<v-flex xs12 v-for="(p, pi) in payments" v-bind:key="p.payment_type_id">
<v-layout row pt-2 pb-1 pl-2 align-center wrap class="border-top-dashed">
<v-flex xs12>
<v-switch
true-value="Y"
false-value="N"
v-model="payments[pi].payment_enable"
:label="p.payment_type_name"
@change="(v) => payment_enable(pi, v)"
:disabled="paid"
></v-switch>
</v-flex>
</v-layout>
<v-layout row pa-2 align-center wrap >
<v-flex xs2>
<div class="sub-title pl-2">Jumlah</div>
</v-flex>
<v-flex xs4>
<div class="pa-2">
<v-text-field
v-bind:class="[p.payment_type_code == 'CASH' ? 'input-cash' : 'input-plain', 'text-xs-right font-weight-bold']"
v-model="payments[pi].payment_actual"
:disabled="paid || (payments[pi].payment_enable == 'Y' ? false : true)"
@input="(v) => update_payments(pi, 'payment_actual', v)"
reverse
>
</v-text-field>
</div>
</v-flex>
<v-flex xs2>
<div class="sub-title pl-2">{{ p.payment_note_label }}</div>
</v-flex>
<v-flex xs4>
<div class="pa-2">
<v-text-field
v-show="p.payment_type_code != 'CASH'"
class="input-plain"
v-model="payments[pi].payment_note"
:disabled="paid || (payments[pi].payment_enable == 'Y' ? false : true)"
@input="(v) => update_payments(pi, 'payment_amount', v)"
reverse
>
</v-text-field>
<v-text-field
v-show="p.payment_type_code == 'CASH'"
class="input-cash"
v-model="payments[pi].payment_change_mask"
disabled
reverse
>
</v-text-field>
</div>
</v-flex>
<v-flex xs12 v-if="['CREDIT', 'DEBIT'].indexOf(p.payment_type_code) > -1">
<v-layout row wrap>
<v-flex xs2>
<div class="sub-title pl-2">Kartu</div>
</v-flex>
<v-flex xs4>
<v-autocomplete
:items="banks"
item-text="Nat_BankName"
item-value="Nat_BankID"
outline
hide-details
height="30"
></v-autocomplete>
</v-flex>
<v-flex xs2>
<div class="sub-title pl-2">EDC</div>
</v-flex>
<v-flex xs4>
<v-autocomplete
:items="banks"
item-text="Nat_BankName"
item-value="Nat_BankID"
outline
hide-details
></v-autocomplete>
</v-flex>
</v-layout>
</v-flex>
</v-layout>
</v-flex>
</v-layout>
<v-layout style="border-top:1px dashed rgb(221,221,221)" row mt-1 mb-1></v-layout>
<!-- <v-layout row pa-2 align-center wrap >
<div>
<v-btn color="error" dark large @click="save" :disabled="!btn_save_enable">BAYAR</v-btn>
</div>
</v-layout> -->
<v-layout row pa-2 wrap >
<v-flex xs9>
<div>
<v-btn color="error" :dark="btn_save_enable && !paid" @click="save" :disabled="!btn_save_enable || paid || savepayment" class="mr-0">SIMPAN & BAYAR</v-btn>
<!-- <v-btn color="primary" large @click="print_invoice" class="ml-0 mr-0">C INVOICE</v-btn>
<v-btn color="primary" large @click="print_control" class="ml-0">C KARTU KONTROL</v-btn> -->
<template>
<v-menu offset-y top>
<template v-slot:activator="{ on }">
<v-btn
color="orange"
dark
v-on="on"
>
<v-icon class="mr-1">print</v-icon>
Cetak
</v-btn>
</template>
<v-list>
<v-list-tile
v-for="(item, index) in menu_print"
:key="index"
@click="print_me(item.code)"
>
<v-list-tile-title>{{ item.title }}</v-list-tile-title>
</v-list-tile>
</v-list>
</v-menu>
</template>
<v-btn color="primary" @click="reset" class="ml-0 mr-0">
<v-icon class="mr-1">description</v-icon> BARU</v-btn>
</div>
</v-flex>
<v-flex xs3>
<div class="text-tagihan text-xs-right"><kbd>{{ one_money(payment_total) }}</kbd></div>
</v-flex>
</v-layout>
</v-card>
<one-fo-registration-payment-finish></one-fo-registration-payment-finish>
<one-dialog-print></one-dialog-print>
</v-layout>
</template>
<style scoped>
.label-tagihan{
text-align:left;
font-size: 25px;
font-family: open sans, tahoma, sans-serif;
font-weight:700;
}
.sub-header{
text-align:left;
font-size: 18px;
font-family: open sans, tahoma, sans-serif;
font-weight:700;
}
.sub-title{
text-align:left;
font-size: 14px;
font-family: open sans, tahoma, sans-serif;
font-weight:700;
}
.text-tagihan{
text-align:left;
font-size: 42px;
font-family: open sans, tahoma, sans-serif;
}
.input-cash{
width: 100%;
padding: 8px 14px;
box-sizing: border-box;
border: 2px solid grey;
border-radius: 4px;
font-size: 22px;
font-weight:700;
text-align:right;
}
.input-plain{
width: 100%;
padding: 4px 8px;
box-sizing: border-box;
border: 2px solid grey;
border-radius: 4px;
font-size: 14px;
}
.v-input, .v-input__slot, .v-messages{
margin:0px;
padding:0px;
min-height: 0px;
}
.v-input--selection-controls:not(.v-input--hide-details) .v-input__slot {
margin-bottom: 0px;
}
.border-top-dashed {
border-top: 1px dashed rgb(221,221,221)
}
</style>
<script>
module.exports = {
components : {
'one-field-verification' : httpVueLoader('../../common/oneFieldVerificationSupply.vue'),
'one-fo-registration-payment-finish' : httpVueLoader('./oneFoRegistrationPaymentFinish.vue'),
'one-dialog-print' : httpVueLoader('./oneDialogPrint.vue')
},
data () {
return {
checkbox: true,
radioGroup: 1,
switchCash: true,
switchDebit: false,
switchKredit: false,
switch_payment_enable: [],
payment_amount: [],
menu_print: [
{ title:"Cetak Invoice", code:"P.INV" },
{ title:"Cetak Kartu Kontrol", code:"P.CC" }
]
}
},
methods : {
one_money(p) {
return window.one_money(p)
},
payment_enable (idx, v) {
let payments = this.payments
payments[idx]['payment_enable'] = v
this.$store.commit('payment/update_payments', payments)
},
save() {
this.$store.dispatch("payment/save");
return
},
update_payments (idx, type, v) {
let payments = this.payments
payments[idx][type] = v
this.$store.commit('payment/update_payments', payments)
},
reset () {
location.reload()
},
print_invoice () {
this.$store.dispatch('payment/print_invoice', this.$store.state.payment.order_id)
return
},
print_control () {
this.$store.dispatch('payment/print_control', this.$store.state.payment.order_id)
return
},
print_me (c) {
if (c == "P.INV")
return this.print_invoice()
else if (c == "P.CC")
return this.print_control()
}
},
computed : {
bill_total() {
return this.$store.state.payment.order_total
},
payment_total () {
return this.$store.state.payment.payment_total
},
savepayment () {
return this.$store.state.payment.savepayment
},
payment_cash_amount : {
get () {
return this.$store.state.payment.order_total
},
set (v) {
// this.$store.commit('payment/update_payment', {type:'cash',amount:v})
return
}
},
payment_debit_amount : {
get () {
return 0
},
set (v) {
return
}
},
payment_credit_amount : {
get () {
return 0
},
set (v) {
return
}
},
payments : {
get () {
let p = this.$store.state.payment.payments
for (let i in p)
p[i].payment_change_mask = window.one_money(p[i].payment_change)
return p
// [{"payment_type_id":"1","payment_type_name":"Cash","payment_type_code":"CASH","payment_amount":"0","payment_note":"","payment_note_label":"Kembali","payment_enable":"N"},{"payment_type_id":"2","payment_type_name":"Debit","payment_type_code":"DEBIT","payment_amount":"0","payment_note":"","payment_note_label":"Nomor Kartu","payment_enable":"N"},{"payment_type_id":"3","payment_type_name":"Credit","payment_type_code":"CREDIT","payment_amount":"0","payment_note":"","payment_note_label":"Nomor Kartu","payment_enable":"N"},{"payment_type_id":"4","payment_type_name":"Voucher","payment_type_code":"VOUCHER","payment_amount":"0","payment_note":"","payment_note_label":"Nomor Voucher","payment_enable":"N"}]
},
set (v) {
this.$store.commit('payment/update_payments', v)
return
}
},
order_id : {
get () {
return this.$store.state.payment.order_id
},
set (v) {
return
}
},
btn_save_enable () {
if (this.payments.length < 1)
return false
let en = false
let sm = 0
for (let i in this.payments) {
if (this.payments[i].payment_enable == "Y") {
en = true
sm = sm + Math.round(this.payments[i].payment_amount)
}
}
if (!en) return false
if (this.$store.state.payment.order_id == 0 ||
this.$store.state.payment.order_id == "0")
return false;
if (sm == 0)
return false
return true
},
paid : {
get () { return this.$store.state.payment.paid },
set (v) { this.$store.commit('payment/update_paid', v) }
},
order_company () {
return this.$store.state.payment.order_company
},
banks () {
return this.$store.state.other.banks
}
},
mounted () {
this.$store.dispatch('payment/search')
this.$store.dispatch('other/search_bank')
},
watch : {
switch_payment_enable (n, o) {
if (n != o) {
if (n.length < o.length) {
for (let i in o)
if (n.indexOf(o[i]) < 0)
return
}
}
},
order_id (n, o) {
if (n == 0 || n == "0")
this.$store.commit("order/update_tab_enable", [2, false])
else
this.$store.commit("order/update_tab_enable", [2, true])
}
}
}
</script>

View File

@@ -0,0 +1,526 @@
<template>
<v-layout column pb-2>
<v-card >
<v-layout row pa-2 align-center wrap >
<v-flex xs6>
<div class="label-tagihan text-xs-left">Total Tagihan</div>
<v-layout style="border-top:1px dashed rgb(221,221,221)" row mt-1 mb-1 class="mt-3"></v-layout>
<v-layout row wrap v-show="order_company.is_bill == 'N'">
<v-flex xs6>
<h3 class="subheading orange--text">Minimum DP ({{ order_company.min_dp }}%)</h3>
</v-flex>
<v-flex xs6>
<h3 class="subheading text-xs-right orange--text">{{ one_money(order_company.min_dp_rp) }}</h3>
</v-flex>
</v-layout>
<v-layout row wrap v-show="order_company.is_bill == 'Y' && order_company.on_hold == 'Y'">
<v-flex xs12>
<h3 class="subheading red--text">{{ order_company.on_hold_text }}</h3>
</v-flex>
</v-layout>
</v-flex>
<v-flex xs6>
<div class="text-tagihan text-xs-right"><kbd>{{ one_money(bill_total) }}</kbd></div>
</v-flex>
</v-layout>
<v-layout style="border-top:1px dashed rgb(221,221,221)" row mt-1 mb-1></v-layout>
<v-layout column>
<v-flex xs12 v-for="(p, pi) in payments" v-bind:key="p.payment_type_id">
<v-layout row pt-2 pb-1 pl-2 align-center wrap class="border-top-dashed">
<v-flex xs12>
<v-switch
true-value="Y"
false-value="N"
v-model="payments[pi].payment_enable"
:label="p.payment_type_name"
@change="(v) => payment_enable(pi, v)"
:disabled="paid"
></v-switch>
</v-flex>
</v-layout>
<v-layout row pa-2 wrap >
<v-flex xs4 pr-2>
<!-- <div class="pa-2"> -->
<v-text-field
v-bind:class="[p.payment_type_code == 'CASH' ? 'input-cash' : 'input-plain', 'text-xs-right font-weight-bold']"
v-model="payments[pi].payment_actual"
:disabled="paid || (payments[pi].payment_enable == 'Y' ? false : true)"
@input="(v) => update_payments(pi, 'payment_actual', v)"
reverse
label="Jumlah"
outline
>
</v-text-field>
<!-- </div> -->
</v-flex>
<v-flex xs4 v-if="['CASH', 'VOUCHER'].indexOf(p.payment_type_code) > -1">
<!-- <div class="pa-2"> -->
<v-text-field
v-show="p.payment_type_code == 'VOUCHER'"
class="input-plain"
v-model="payments[pi].payment_note"
:disabled="paid || (payments[pi].payment_enable == 'Y' ? false : true)"
@input="(v) => update_payments(pi, 'payment_amount', v)"
reverse
:label="p.payment_note_label"
outline
>
</v-text-field>
<v-text-field
v-show="p.payment_type_code == 'CASH'"
class="input-cash"
v-model="payments[pi].payment_change_mask"
disabled
reverse
:label="p.payment_note_label"
outline
>
</v-text-field>
<!-- </div> -->
</v-flex>
<v-flex xs4 v-if="['CREDIT', 'DEBIT'].indexOf(p.payment_type_code) > -1" pr-2>
<v-autocomplete
:items="cards"
item-text="Nat_BankName"
item-value="Nat_BankID"
outline
hide-details
height="30"
label="Kartu"
@change="(v) => update_payments(pi, 'payment_card_id', v)"
v-model="init_val_card[p.payment_type_code]"
></v-autocomplete>
</v-flex>
<v-flex xs4 v-if="['CREDIT', 'DEBIT'].indexOf(p.payment_type_code) > -1">
<!-- <v-autocomplete
:items="banks"
item-text="Nat_BankName"
item-value="Nat_BankID"
outline
hide-details
height="30"
label="EDC"
@change="(v) => update_payments(pi, 'payment_edc_id', v)"
v-model="init_val_edc[p.payment_type_code]"
></v-autocomplete> X -->
<v-autocomplete
:items="accounts"
item-text="M_BankAccountNo"
item-value="M_BankAccountID"
outline
hide-details
height="30"
label="EDC"
@change="(v) => update_payments(pi, 'payment_account_id', v)"
v-model="init_val_account[p.payment_type_code]"
></v-autocomplete>
</v-flex>
<v-flex xs4 v-if="['TRANSFER'].indexOf(p.payment_type_code) > -1" pr-2>
<v-autocomplete
:items="accounts"
item-text="M_BankAccountNo"
item-value="M_BankAccountID"
outline
hide-details
height="30"
label="No Rekening"
@change="(v) => update_payments(pi, 'payment_account_id', v)"
v-model="init_val_account[p.payment_type_code]"
></v-autocomplete>
</v-flex>
</v-layout>
</v-flex>
</v-layout>
<v-layout style="border-top:1px dashed rgb(221,221,221)" row mt-1 mb-1></v-layout>
<!-- <v-layout row pa-2 align-center wrap >
<div>
<v-btn color="error" dark large @click="save" :disabled="!btn_save_enable">BAYAR</v-btn>
</div>
</v-layout> -->
<v-layout row pa-2 wrap >
<v-flex xs9>
<div>
<v-btn v-show="!is_bill" color="error" :dark="btn_save_enable && !paid" @click="save" :disabled="!btn_save_enable || paid || savepayment" class="mr-0">SIMPAN & BAYAR</v-btn>
<v-btn v-show="is_bill" color="error" dark @click="print_bukti" class="mr-0">BUKTI PEMERIKSAAN</v-btn>
<!-- <v-btn color="primary" large @click="print_invoice" class="ml-0 mr-0">C INVOICE</v-btn>
<v-btn color="primary" large @click="print_control" class="ml-0">C KARTU KONTROL</v-btn> -->
<template>
<v-menu offset-y top>
<template v-slot:activator="{ on }">
<v-btn
color="orange"
dark
v-on="on"
>
<v-icon class="mr-1">print</v-icon>
Cetak
</v-btn>
</template>
<v-list>
<v-list-tile
v-for="(item, index) in menu_print"
:key="index"
@click="print_me(item.code)"
>
<v-list-tile-title>{{ item.title }}</v-list-tile-title>
</v-list-tile>
</v-list>
</v-menu>
</template>
<v-btn color="primary" @click="reset" class="ml-0 mr-0">
<v-icon class="mr-1">description</v-icon> BARU</v-btn>
</div>
</v-flex>
<v-flex xs3>
<div class="text-tagihan text-xs-right"><kbd>{{ one_money(payment_total) }}</kbd></div>
</v-flex>
</v-layout>
</v-card>
<one-fo-registration-payment-finish></one-fo-registration-payment-finish>
<one-dialog-print></one-dialog-print>
</v-layout>
</template>
<style scoped>
.label-tagihan{
text-align:left;
font-size: 25px;
font-family: open sans, tahoma, sans-serif;
font-weight:700;
}
.sub-header{
text-align:left;
font-size: 18px;
font-family: open sans, tahoma, sans-serif;
font-weight:700;
}
.sub-title{
text-align:left;
font-size: 14px;
font-family: open sans, tahoma, sans-serif;
font-weight:700;
}
.text-tagihan{
text-align:left;
font-size: 42px;
font-family: open sans, tahoma, sans-serif;
}
.input-cash{
width: 100%;
/* padding: 8px 14px; */
/* box-sizing: border-box; */
/* border: 2px solid grey;
border-radius: 4px; */
font-size: 22px;
font-weight:700;
text-align:right;
}
.input-plain{
width: 100%;
/* padding: 4px 8px; */
/* box-sizing: border-box; */
/* border: 2px solid grey;
border-radius: 4px; */
font-size: 14px;
}
.v-input, .v-input__slot, .v-messages{
margin:0px;
padding:0px;
min-height: 0px;
}
.v-input--selection-controls:not(.v-input--hide-details) .v-input__slot {
margin-bottom: 0px;
}
.border-top-dashed {
border-top: 1px dashed rgb(221,221,221)
}
</style>
<script>
module.exports = {
components : {
'one-field-verification' : httpVueLoader('../../common/oneFieldVerificationSupply.vue'),
'one-fo-registration-payment-finish' : httpVueLoader('./oneFoRegistrationPaymentFinish.vue'),
'one-dialog-print' : httpVueLoader('./oneDialogPrint.vue')
},
data () {
return {
checkbox: true,
radioGroup: 1,
switchCash: true,
switchDebit: false,
switchKredit: false,
switch_payment_enable: [],
payment_amount: [],
menu_print: [
{ title:"Cetak Invoice", code:"P.INV" },
{ title:"Cetak Kartu Kontrol", code:"P.CC" }
],
init_val_edc:{"CREDIT":0,"DEBIT":0},
init_val_card:{"CREDIT":0,"DEBIT":0},
init_val_account:{"CREDIT":0,"DEBIT":0,"TRANSFER":0}
}
},
methods : {
one_money(p) {
return window.one_money(p)
},
payment_enable (idx, v) {
let payments = this.payments
payments[idx]['payment_enable'] = v
if (v == "N") {
payments[idx]['payment_actual'] = 0
payments[idx]['payment_amount'] = 0
payments[idx]['payment_card_id'] = 0
payments[idx]['payment_edc_id'] = 0
payments[idx]['payment_change'] = 0
payments[idx]['payment_change_mask'] = 0
this.init_val_edc[payments[idx]['payment_type_code']] = 0
this.init_val_card[payments[idx]['payment_type_code']] = 0
} else {
payments[idx]['payment_amount'] = this.bill_rest
payments[idx]['payment_actual'] = this.bill_rest
}
this.$store.commit('payment/update_payments', payments)
},
save() {
this.$store.dispatch("payment/save");
return
},
update_payments (idx, type, v) {
let payments = this.payments
payments[idx][type] = v
this.$store.commit('payment/update_payments', payments)
},
reset () {
//location.reload()
// alert('dasdasdasd')
this.$store.dispatch('payment/reset', {order_id:this.$store.state.payment.order_id,time_start:this.$store.state.order.show_time})
},
print_invoice () {
this.$store.dispatch('payment/print_invoice', this.$store.state.payment.order_id)
return
},
print_control_xx () {
this.$store.dispatch('payment/print_control', this.$store.state.payment.order_id)
return
},
print_control () {
this.$store.dispatch('payment/print_control', {order_id:this.$store.state.payment.order_id,time_start:this.$store.state.order.show_time})
return
},
print_me (c) {
if (c == "P.INV")
return this.print_invoice()
else if (c == "P.CC")
return this.print_control()
},
xxx(v) {
alert(v)
},
print_bukti() {
this.$store.dispatch('payment/print_nota', this.order_id)
}
},
computed : {
bill_total() {
return this.$store.state.payment.order_total
},
payment_total () {
return this.$store.state.payment.payment_total
},
bill_rest () {
return this.bill_total - this.payment_total
},
savepayment () {
return this.$store.state.payment.savepayment
},
payment_cash_amount : {
get () {
return this.$store.state.payment.order_total
},
set (v) {
// this.$store.commit('payment/update_payment', {type:'cash',amount:v})
return
}
},
payment_debit_amount : {
get () {
return 0
},
set (v) {
return
}
},
payment_credit_amount : {
get () {
return 0
},
set (v) {
return
}
},
payments : {
get () {
let p = this.$store.state.payment.payments
for (let i in p)
p[i].payment_change_mask = window.one_money(p[i].payment_change)
return p
// [{"payment_type_id":"1","payment_type_name":"Cash","payment_type_code":"CASH","payment_amount":"0","payment_note":"","payment_note_label":"Kembali","payment_enable":"N"},{"payment_type_id":"2","payment_type_name":"Debit","payment_type_code":"DEBIT","payment_amount":"0","payment_note":"","payment_note_label":"Nomor Kartu","payment_enable":"N"},{"payment_type_id":"3","payment_type_name":"Credit","payment_type_code":"CREDIT","payment_amount":"0","payment_note":"","payment_note_label":"Nomor Kartu","payment_enable":"N"},{"payment_type_id":"4","payment_type_name":"Voucher","payment_type_code":"VOUCHER","payment_amount":"0","payment_note":"","payment_note_label":"Nomor Voucher","payment_enable":"N"}]
},
set (v) {
this.$store.commit('payment/update_payments', v)
return
}
},
order_id : {
get () {
return this.$store.state.payment.order_id
},
set (v) {
return
}
},
btn_save_enable () {
if (this.payments.length < 1)
return false
let en = false
let sm = 0
for (let i in this.payments) {
let p = this.payments[i]
if (p.payment_enable == "Y") {
en = true
sm = sm + Math.round(p.payment_amount)
// IF DEBIT OR CREDIT
if (['DEBIT', 'CREDIT'].indexOf(p.payment_type_code) > -1) {
if (p.payment_card_id == 0 || p.payment_account_id == 0)
en = false
}
if (['TRANSFER'].indexOf(p.payment_type_code) > -1) {
if (p.payment_account_id == 0)
en = false
}
console.log(p.payment_type_code + '-' + en)
}
}
if (!en) return false
if (this.$store.state.payment.order_id == 0 ||
this.$store.state.payment.order_id == "0")
return false;
if (sm == 0)
return false
return true
},
paid : {
get () { return this.$store.state.payment.paid },
set (v) { this.$store.commit('payment/update_paid', v) }
},
order_company () {
return this.$store.state.payment.order_company
},
banks () {
return this.$store.state.other.banks
},
cards () {
return this.$store.state.other.cards
},
accounts () {
return this.$store.state.other.accounts
},
is_bill () {
return this.$store.state.company.selected_mou.M_MouIsBill == "Y"
}
},
mounted () {
this.$store.dispatch('payment/search')
this.$store.dispatch('other/search_bank')
this.$store.dispatch('other/search_card')
this.$store.dispatch('other/search_accounts')
},
watch : {
switch_payment_enable (n, o) {
if (n != o) {
if (n.length < o.length) {
for (let i in o)
if (n.indexOf(o[i]) < 0)
return
}
}
},
order_id (n, o) {
if (n == 0 || n == "0")
this.$store.commit("order/update_tab_enable", [2, false])
else
this.$store.commit("order/update_tab_enable", [2, true])
}
}
}
</script>

View File

@@ -0,0 +1,525 @@
<template>
<v-layout column pb-2>
<v-card >
<v-layout row pa-2 align-center wrap >
<v-flex xs6>
<div class="label-tagihan text-xs-left">Total Tagihan</div>
<v-layout style="border-top:1px dashed rgb(221,221,221)" row mt-1 mb-1 class="mt-3"></v-layout>
<v-layout row wrap v-show="order_company.is_bill == 'N'">
<v-flex xs6>
<h3 class="subheading orange--text">Minimum DP ({{ order_company.min_dp }}%)</h3>
</v-flex>
<v-flex xs6>
<h3 class="subheading text-xs-right orange--text">{{ one_money(order_company.min_dp_rp) }}</h3>
</v-flex>
</v-layout>
<v-layout row wrap v-show="order_company.is_bill == 'Y' && order_company.on_hold == 'Y'">
<v-flex xs12>
<h3 class="subheading red--text">{{ order_company.on_hold_text }}</h3>
</v-flex>
</v-layout>
</v-flex>
<v-flex xs6>
<div class="text-tagihan text-xs-right"><kbd>{{ one_money(bill_total) }}</kbd></div>
</v-flex>
</v-layout>
<v-layout style="border-top:1px dashed rgb(221,221,221)" row mt-1 mb-1></v-layout>
<v-layout column>
<v-flex xs12 v-for="(p, pi) in payments" v-bind:key="p.payment_type_id">
<v-layout row pt-2 pb-1 pl-2 align-center wrap class="border-top-dashed">
<v-flex xs12>
<v-switch
true-value="Y"
false-value="N"
v-model="payments[pi].payment_enable"
:label="p.payment_type_name"
@change="(v) => payment_enable(pi, v)"
:disabled="paid"
></v-switch>
</v-flex>
</v-layout>
<v-layout row pa-2 wrap >
<v-flex xs4 pr-2>
<!-- <div class="pa-2"> -->
<v-text-field
v-bind:class="[p.payment_type_code == 'CASH' ? 'input-cash' : 'input-plain', 'text-xs-right font-weight-bold']"
v-model="payments[pi].payment_actual"
:disabled="paid || (payments[pi].payment_enable == 'Y' ? false : true)"
@input="(v) => update_payments(pi, 'payment_actual', v)"
reverse
label="Jumlah"
outline
>
</v-text-field>
<!-- </div> -->
</v-flex>
<v-flex xs4 v-if="['CASH', 'VOUCHER'].indexOf(p.payment_type_code) > -1">
<!-- <div class="pa-2"> -->
<v-text-field
v-show="p.payment_type_code == 'VOUCHER'"
class="input-plain"
v-model="payments[pi].payment_note"
:disabled="paid || (payments[pi].payment_enable == 'Y' ? false : true)"
@input="(v) => update_payments(pi, 'payment_amount', v)"
reverse
:label="p.payment_note_label"
outline
>
</v-text-field>
<v-text-field
v-show="p.payment_type_code == 'CASH'"
class="input-cash"
v-model="payments[pi].payment_change_mask"
disabled
reverse
:label="p.payment_note_label"
outline
>
</v-text-field>
<!-- </div> -->
</v-flex>
<v-flex xs4 v-if="['CREDIT', 'DEBIT'].indexOf(p.payment_type_code) > -1" pr-2>
<v-autocomplete
:items="cards"
item-text="Nat_BankName"
item-value="Nat_BankID"
outline
hide-details
height="30"
label="Kartu"
@change="(v) => update_payments(pi, 'payment_card_id', v)"
v-model="init_val_card[p.payment_type_code]"
></v-autocomplete>
</v-flex>
<v-flex xs4 v-if="['CREDIT', 'DEBIT'].indexOf(p.payment_type_code) > -1">
<!-- <v-autocomplete
:items="banks"
item-text="Nat_BankName"
item-value="Nat_BankID"
outline
hide-details
height="30"
label="EDC"
@change="(v) => update_payments(pi, 'payment_edc_id', v)"
v-model="init_val_edc[p.payment_type_code]"
></v-autocomplete> X -->
<v-autocomplete
:items="accounts"
item-text="M_BankAccountNo"
item-value="M_BankAccountID"
outline
hide-details
height="30"
label="EDC"
@change="(v) => update_payments(pi, 'payment_account_id', v)"
v-model="init_val_account[p.payment_type_code]"
></v-autocomplete>
</v-flex>
<v-flex xs4 v-if="['TRANSFER'].indexOf(p.payment_type_code) > -1" pr-2>
<v-autocomplete
:items="accounts"
item-text="M_BankAccountNo"
item-value="M_BankAccountID"
outline
hide-details
height="30"
label="No Rekening"
@change="(v) => update_payments(pi, 'payment_account_id', v)"
v-model="init_val_account[p.payment_type_code]"
></v-autocomplete>
</v-flex>
</v-layout>
</v-flex>
</v-layout>
<v-layout style="border-top:1px dashed rgb(221,221,221)" row mt-1 mb-1></v-layout>
<!-- <v-layout row pa-2 align-center wrap >
<div>
<v-btn color="error" dark large @click="save" :disabled="!btn_save_enable">BAYAR</v-btn>
</div>
</v-layout> -->
<v-layout row pa-2 wrap >
<v-flex xs9>
<div>
<v-btn v-show="!is_bill" color="error" :dark="btn_save_enable && !paid" @click="save" :disabled="!btn_save_enable || paid || savepayment" class="mr-0">SIMPAN & BAYAR</v-btn>
<v-btn v-show="is_bill" color="error" dark @click="print_bukti" class="mr-0">BUKTI PEMERIKSAAN</v-btn>
<!-- <v-btn color="primary" large @click="print_invoice" class="ml-0 mr-0">C INVOICE</v-btn>
<v-btn color="primary" large @click="print_control" class="ml-0">C KARTU KONTROL</v-btn> -->
<template>
<v-menu offset-y top>
<template v-slot:activator="{ on }">
<v-btn
color="orange"
dark
v-on="on"
>
<v-icon class="mr-1">print</v-icon>
Cetak
</v-btn>
</template>
<v-list>
<v-list-tile
v-for="(item, index) in menu_print"
:key="index"
@click="print_me(item.code)"
>
<v-list-tile-title>{{ item.title }}</v-list-tile-title>
</v-list-tile>
</v-list>
</v-menu>
</template>
<v-btn color="primary" @click="reset" class="ml-0 mr-0">
<v-icon class="mr-1">description</v-icon> BARU</v-btn>
</div>
</v-flex>
<v-flex xs3>
<div class="text-tagihan text-xs-right"><kbd>{{ one_money(payment_total) }}</kbd></div>
</v-flex>
</v-layout>
</v-card>
<one-fo-registration-payment-finish></one-fo-registration-payment-finish>
<one-dialog-print></one-dialog-print>
</v-layout>
</template>
<style scoped>
.label-tagihan{
text-align:left;
font-size: 25px;
font-family: open sans, tahoma, sans-serif;
font-weight:700;
}
.sub-header{
text-align:left;
font-size: 18px;
font-family: open sans, tahoma, sans-serif;
font-weight:700;
}
.sub-title{
text-align:left;
font-size: 14px;
font-family: open sans, tahoma, sans-serif;
font-weight:700;
}
.text-tagihan{
text-align:left;
font-size: 42px;
font-family: open sans, tahoma, sans-serif;
}
.input-cash{
width: 100%;
/* padding: 8px 14px; */
/* box-sizing: border-box; */
/* border: 2px solid grey;
border-radius: 4px; */
font-size: 22px;
font-weight:700;
text-align:right;
}
.input-plain{
width: 100%;
/* padding: 4px 8px; */
/* box-sizing: border-box; */
/* border: 2px solid grey;
border-radius: 4px; */
font-size: 14px;
}
.v-input, .v-input__slot, .v-messages{
margin:0px;
padding:0px;
min-height: 0px;
}
.v-input--selection-controls:not(.v-input--hide-details) .v-input__slot {
margin-bottom: 0px;
}
.border-top-dashed {
border-top: 1px dashed rgb(221,221,221)
}
</style>
<script>
module.exports = {
components : {
'one-field-verification' : httpVueLoader('../../common/oneFieldVerificationSupply.vue'),
'one-fo-registration-payment-finish' : httpVueLoader('./oneFoRegistrationPaymentFinish.vue'),
'one-dialog-print' : httpVueLoader('./oneDialogPrint.vue')
},
data () {
return {
checkbox: true,
radioGroup: 1,
switchCash: true,
switchDebit: false,
switchKredit: false,
switch_payment_enable: [],
payment_amount: [],
menu_print: [
{ title:"Cetak Invoice", code:"P.INV" },
{ title:"Cetak Kartu Kontrol", code:"P.CC" }
],
init_val_edc:{"CREDIT":0,"DEBIT":0},
init_val_card:{"CREDIT":0,"DEBIT":0},
init_val_account:{"CREDIT":0,"DEBIT":0,"TRANSFER":0}
}
},
methods : {
one_money(p) {
return window.one_money(p)
},
payment_enable (idx, v) {
let payments = this.payments
payments[idx]['payment_enable'] = v
if (v == "N") {
payments[idx]['payment_actual'] = 0
payments[idx]['payment_amount'] = 0
payments[idx]['payment_card_id'] = 0
payments[idx]['payment_edc_id'] = 0
payments[idx]['payment_change'] = 0
payments[idx]['payment_change_mask'] = 0
this.init_val_edc[payments[idx]['payment_type_code']] = 0
this.init_val_card[payments[idx]['payment_type_code']] = 0
} else {
payments[idx]['payment_amount'] = this.bill_rest
payments[idx]['payment_actual'] = this.bill_rest
}
this.$store.commit('payment/update_payments', payments)
},
save() {
this.$store.dispatch("payment/save");
return
},
update_payments (idx, type, v) {
let payments = this.payments
payments[idx][type] = v
this.$store.commit('payment/update_payments', payments)
},
reset () {
//location.reload()
this.$store.dispatch('payment/reset', {order_id:this.$store.state.payment.order_id,time_start:this.$store.state.order.show_time})
},
print_invoice () {
this.$store.dispatch('payment/print_invoice', this.$store.state.payment.order_id)
return
},
print_control_xx () {
this.$store.dispatch('payment/print_control', this.$store.state.payment.order_id)
return
},
print_control () {
this.$store.dispatch('payment/print_control', {order_id:this.$store.state.payment.order_id,time_start:this.$store.state.order.show_time})
return
},
print_me (c) {
if (c == "P.INV")
return this.print_invoice()
else if (c == "P.CC")
return this.print_control()
},
xxx(v) {
alert(v)
},
print_bukti() {
this.$store.dispatch('payment/print_nota', this.order_id)
}
},
computed : {
bill_total() {
return this.$store.state.payment.order_total
},
payment_total () {
return this.$store.state.payment.payment_total
},
bill_rest () {
return this.bill_total - this.payment_total
},
savepayment () {
return this.$store.state.payment.savepayment
},
payment_cash_amount : {
get () {
return this.$store.state.payment.order_total
},
set (v) {
// this.$store.commit('payment/update_payment', {type:'cash',amount:v})
return
}
},
payment_debit_amount : {
get () {
return 0
},
set (v) {
return
}
},
payment_credit_amount : {
get () {
return 0
},
set (v) {
return
}
},
payments : {
get () {
let p = this.$store.state.payment.payments
for (let i in p)
p[i].payment_change_mask = window.one_money(p[i].payment_change)
return p
// [{"payment_type_id":"1","payment_type_name":"Cash","payment_type_code":"CASH","payment_amount":"0","payment_note":"","payment_note_label":"Kembali","payment_enable":"N"},{"payment_type_id":"2","payment_type_name":"Debit","payment_type_code":"DEBIT","payment_amount":"0","payment_note":"","payment_note_label":"Nomor Kartu","payment_enable":"N"},{"payment_type_id":"3","payment_type_name":"Credit","payment_type_code":"CREDIT","payment_amount":"0","payment_note":"","payment_note_label":"Nomor Kartu","payment_enable":"N"},{"payment_type_id":"4","payment_type_name":"Voucher","payment_type_code":"VOUCHER","payment_amount":"0","payment_note":"","payment_note_label":"Nomor Voucher","payment_enable":"N"}]
},
set (v) {
this.$store.commit('payment/update_payments', v)
return
}
},
order_id : {
get () {
return this.$store.state.payment.order_id
},
set (v) {
return
}
},
btn_save_enable () {
if (this.payments.length < 1)
return false
let en = false
let sm = 0
for (let i in this.payments) {
let p = this.payments[i]
if (p.payment_enable == "Y") {
en = true
sm = sm + Math.round(p.payment_amount)
// IF DEBIT OR CREDIT
if (['DEBIT', 'CREDIT'].indexOf(p.payment_type_code) > -1) {
if (p.payment_card_id == 0 || p.payment_account_id == 0)
en = false
}
if (['TRANSFER'].indexOf(p.payment_type_code) > -1) {
if (p.payment_account_id == 0)
en = false
}
console.log(p.payment_type_code + '-' + en)
}
}
if (!en) return false
if (this.$store.state.payment.order_id == 0 ||
this.$store.state.payment.order_id == "0")
return false;
if (sm == 0)
return false
return true
},
paid : {
get () { return this.$store.state.payment.paid },
set (v) { this.$store.commit('payment/update_paid', v) }
},
order_company () {
return this.$store.state.payment.order_company
},
banks () {
return this.$store.state.other.banks
},
cards () {
return this.$store.state.other.cards
},
accounts () {
return this.$store.state.other.accounts
},
is_bill () {
return this.$store.state.company.selected_mou.M_MouIsBill == "Y"
}
},
mounted () {
this.$store.dispatch('payment/search')
this.$store.dispatch('other/search_bank')
this.$store.dispatch('other/search_card')
this.$store.dispatch('other/search_accounts')
},
watch : {
switch_payment_enable (n, o) {
if (n != o) {
if (n.length < o.length) {
for (let i in o)
if (n.indexOf(o[i]) < 0)
return
}
}
},
order_id (n, o) {
if (n == 0 || n == "0")
this.$store.commit("order/update_tab_enable", [2, false])
else
this.$store.commit("order/update_tab_enable", [2, true])
}
}
}
</script>

View File

@@ -0,0 +1,95 @@
<template>
<v-dialog
v-model="dialog"
width="500"
>
<v-card>
<v-card-title
class="headline grey lighten-2 pt-2 pb-2"
primary-title
>
Pembayaran Berhasil
</v-card-title>
<v-card-text class="pt-2 pb-2">
<h6 class="display-1 text-center">No Pembayaran <span class="blue--text">{{ text_payno }}</span></h6>
</v-card-text>
<v-divider></v-divider>
<v-card-actions>
<v-btn
color="warning"
@click="print_nota"
class="ml-2"
>
CETAK NOTA
</v-btn>
<v-btn
color="success"
@click="print_notain"
class="ml-2"
>
CETAK NOTA IN
</v-btn>
<v-spacer></v-spacer>
<v-btn
color="primary"
flat
@click="finish"
>
Tutup
</v-btn>
</v-card-actions>
</v-card>
</v-dialog>
</template>
<style scoped>
</style>
<script>
module.exports = {
components : {
},
methods : {
tuing: function() {
alert('x')
},
finish: function() {
this.dialog = false
// location.reload()
},
print_nota () {
this.$store.dispatch('payment/print_nota', this.$store.state.payment.payment_id)
return
},
print_notain () {
this.$store.dispatch('payment/print_notain', this.$store.state.payment.payment_id)
return
}
},
computed : {
dialog: {
get() {
return this.$store.state.payment.finish_dialog_is_active;
},
set(val) {
this.$store.commit('payment/update_finish_dialog_is_active', val);
}
},
text_payno () {
return this.$store.state.payment.payment_number
}
}
}
</script>

View File

@@ -0,0 +1,485 @@
<template>
<v-layout column pb-0>
<v-dialog
v-model="dialog_alert_msg"
width="60%"
>
<v-card >
<v-card-title
class="subtitle-1 white--text"
style="background:#ee7777"
>
PEMBERITAHUAN !
</v-card-title>
<v-card-text v-html="alert_msg">
</v-card-text>
<v-divider></v-divider>
<v-card-actions>
<v-spacer></v-spacer>
<v-btn
color="grey"
flat
@click="dialog_alert_msg = false"
>
OK ... saya mengerti
</v-btn>
</v-card-actions>
</v-card>
</v-dialog>
<!--#95eaf3-->
<v-card flat>
<table>
<tr style="background:#64b2cd">
<!-- <th style="width:5%;font-weight:bold;font-size:12px;color:#fff" class="text-md-center pt-2 pb-2"> </th>
<th style="width:7%;font-weight:bold;font-size:12px;color:#fff" class="text-md-center pt-2 pb-2">CITO</th> -->
<th style="width:42%;font-weight:bold;font-size:12px;color:#fff" class="text-md-center pt-2 pb-2">PEMERIKSAAN</th>
<th style="width:12%;font-weight:bold;font-size:12px;color:#fff" class="text-md-center pt-2 pb-2">BRUTO</th>
<th style="width:12%;font-weight:bold;font-size:12px;color:#fff" class="text-md-center pt-2 pb-2">DISKON</th>
<th style="width:12%;font-weight:bold;font-size:12px;color:#fff" class="text-md-center pt-2 pb-2">TOTAL</th>
</tr>
<tr v-if="selected_test.length === 0" >
<td class="pa-2 text-xs-center caption" colspan="6">Belum ada order pemeriksaan</td>
</tr>
<tr v-if="selected_test.length > 0" style="font-size:12px" v-for="t in selected_test" v-bind:key="t.T_TestID">
<!-- <td class="text-md-center">
<v-icon color="#ee7777" @click="deletePx(t)">delete</v-icon>
</td>
<td class="text-md-left pl-3">
<v-checkbox hide-details class="smr-1"
:value="t.T_TestID"
v-model="cito_test"
></v-checkbox>
</td>
-->
<td class="text-md-left pl-3">
<!-- <p class="mb-0 mono caption font-weight-bold" style="color:#3c70a4;font-size:10px!important">{{getTimeX(t.promise)}}</p> -->
<p class="mb-1">{{ t.T_TestName}}</p>
<p class="mb-0 caption" v-show="child_test_show(t)">{{child_test(t.child_test)}}</p>
</td>
<td class="text-md-right mono pr-2">{{ one_money(t.T_PriceAmount) }}</td>
<td class="text-md-right mono pr-2">{{ one_money(calc_discount(t)) }}</td>
<td class="text-md-right mono font-weight-black pr-2">{{ one_money(calc_netto(t)) }}</td>
</tr>
<!-- TEST PANEL -->
<template v-for="p in selected_panel">
<tr class="tr-panel">
<!-- <td class="text-md-center">
<v-icon color="red" @click="deletePanel(p)">delete</v-icon>
</td> -->
<td class="text-md-left pl-3 pr-2" colspan="4">{{ p.T_TestPanelName}}</td>
</tr>
<tr v-for="t in p.test" v-bind:key="t.T_TestID">
<td class="text-md-center">
&nbsp;
</td>
<td class="text-md-left pl-3">{{ t.T_TestName}}</td>
<td class="text-md-right pr-2">{{ one_money(t.T_PriceAmount) }}</td>
<td class="text-md-right pr-2">{{ one_money(calc_discount(t)) }}</td>
<td class="text-md-right pr-2">{{ one_money(calc_netto(t)) }}</td>
</tr>
</template>
<!--/ TEST PANEL -->
<tfoot>
<tr>
<!-- <th style="background:#3c70a4;color:#fff" colspan="2" class="text-md-right pr-5 pt-2 pb-2"></th> -->
<th style="background:#3c70a4;color:#fff" class="text-md-left pl-3 pt-2 pb-2">TOTAL</th>
<th style="background:#3c70a4;color:#fff" class="text-md-right pr-2 pt-2 pb-2">{{ one_money(bruto_total) }}</th>
<th style="background:#3c70a4;color:#fff" class="text-md-right pr-2 pt-2 pb-2">{{ one_money(diskon_total) }}</th>
<th style="background:#3c70a4;color:#fff" class="text-md-right pr-2 pt-2 pb-2" >{{ one_money(sub_total) }}</th>
</tr>
<tr style="display:none">
<th colspan="2" class="text-md-right pr-2 pt-1 pb-1">DISKON PEMBULATAN</th>
<th class="text-md-right pr-2 pt-1 pb-1" colspan="2">{{ one_money(discount_pembulatan) }}</th>
</tr>
</tfoot>
</table>
</v-card>
<v-card flat>
<v-layout row>
<v-flex xs4>
<v-btn block :disabled="in_saving" v-if="btn_save_enabled && !loading_process" title="simpan order" @click="save_order()" class="mb-1 mt-2 ml-0 mr-0" dark color="#3c70a4">
simpan
</v-btn>
<v-btn block v-if="!btn_save_enabled" title="simpan order" @click="check_msg_alert()" class="mb-1 mt-2 ml-0 mr-0 grey darken-1" dark>
simpan
</v-btn>
</v-flex>
</v-layout>
</v-card>
<one-dialog-loading></one-dialog-loading>
</v-layout>
</template>
<style scoped>
.nota {
font-size: 2em;
font-weight: bold;
text-align: left;
}
.total {
min-height:76px;
}
table {
font-family: arial, sans-serif;
border-collapse: collapse;
width: 100%;
background:white;
border: 0px;
}
th, td {
border: 1px solid black;
border-collapse: collapse;
padding-top: 2px;
padding-bottom: 2px;
}
table>tr>td {
padding: 8px;
}
table>tr>td:first {
padding-left:15px!important;
}
.vintage-text{
text-shadow: 0px -2px 0px #fff, 0px 2px 3px #fff;
}
.v-input--selection-controls {
margin-top: 0px;
padding-top: 0px;
}
</style>
<script>
module.exports = {
components : {
'one-dialog-loading': httpVueLoader('../../common/oneDialogLoading.vue')
},
data () {
return {
current_cito_change : [],
dialog_alert_msg:false,
alert_msg:''
}
},
watch : {
cito_test (n, o) {
if (n != o) {
if (n.length == 0)
this.current_cito_change = [o[0], "N"]
else if (o.length == 0)
this.current_cito_change = [n[0], "Y"]
else if (o.length > n.length) {
for (let i in o)
if (n.indexOf(o[i]) < 0) this.current_cito_change = [o[i], "N"]
}
else {
for (let i in n)
if (o.indexOf(n[i]) < 0) this.current_cito_change = [n[i], "Y"]
}
}
let is_cito = "N";
if (n.length > 0)
is_cito = "Y";
this.$store.commit('px/update_is_cito', is_cito);
this.$store.dispatch('px/get_price', {
test_id:this.current_cito_change[0],
mou_id:this.$store.state.company.selected_mou.M_MouID,
cito:this.current_cito_change[1]})
}
},
methods: {
getTimeX(xtime) {
var xvar = xtime
if(xvar)
xvar = xvar.split(",")
else
xvar = []
var new_time = []
if(xvar.length > 0){
xvar.forEach(function(xxtime) {
//console.log(xxtime)
let xxxtime = moment(xxtime).format('DD-MM-YYYY HH:mm')
//console.log(xxxtime)
new_time.push(xxxtime)
})
}
console.log(new_time)
if(new_time.length > 0)
return new_time.join(', ')
else
return ''
},
one_money(p) {
return window.one_money(p)
},
update_req(px) {
this.$store.dispatch("px/update_req", px)
},
deletePanel(panel) {
let sel = this.selected_panel
sel.forEach(function(p,idx) {
if(p.T_TestPanelID == panel.T_TestPanelID) {
sel.splice(idx,1)
}
});
this.$store.commit("px/update_selected_panel",sel)
let panels = this.$store.state.px.panels
if ( panels == undefined ) panels = []
panels.push(panel)
let dt = {
records : panels,
total: panels.length
}
this.$store.commit("px/update_panels",dt)
this.update_req()
},
deletePx(test) {
this.$store.dispatch("px/delete_px", test)
},
calc_netto(t) {
return one_float(t.T_PriceAmount) - one_float(t.T_PriceDisc) / 100 * one_float(t.T_PriceAmount)
- one_float(t.T_PriceDiscRp)
},
calc_discount(t) {
return ( one_float(t.T_PriceDisc) / 100 * one_float(t.T_PriceAmount) )
+ one_float(t.T_PriceDiscRp)
},
save_order() {
if (this.in_saving) return;
this.in_saving = true;
if (!window.one_token()) {
this.$store.commit('update_message_error', 'Maaf, koneksi Anda sempat terputus silahkan Log Out dan Login kembali')
this.$store.commit('update_dialog_error', true)
return
}
// Loading
this.$store.commit('order/update_loading_process', true)
this.$store.commit('update_dialog_loading', true)
this.$store.dispatch("order/save")
return
},
child_test(x) {
let y = []
for (let i in x)
y.push(x[i].T_TestName)
return y.join(', ')
},
child_test_show(t) {
if (!t.child_test)
return false
if (t.child_test.length < 1)
return false
if (t.px_type != 'PN')
return false
return true
},
check_msg_alert () {
// console.log(this.$store.state.patient.selected_patient.M_PatientID)
var msg = ""
if (!this.$store.state.patient.selected_patient.M_PatientID)
msg = msg +"<p class='caption mono mb-1'>- Ibarat ibu-ibu kalo belok tanpa lampu sein, bingung dong kalo belum dipilih pasien</p>"
if (this.$store.state.px.req_status == 'X')
msg = msg +"<p class='caption mono mb-1'>- Kalo mau ijab harus pakai mas kawin, kalo mau periksa harus ditanya dulu apakah persyaratan sudah memenuhi ?</p>"
if (this.$store.state.px.req_status == 'N' && this.$store.state.px.reqs.length < 1)
msg = msg +"<p class='caption mono mb-1'>- Yang tidak memenuhi persyaratannya apa ya ?</p>"
if (this.loading_data_patient == false)
msg = msg +"<p class='caption mono mb-1'>- Jangan buru-buru data pasien belum load sempurna</p>"
/* if (
!this.$store.state.doctor.selected_doctor.M_DoctorID ||
!this.$store.state.doctor.selected_address.M_DoctorAddressID )
msg = msg +"<p class='caption mono mb-1'>- Pergi beli es krim naik kereta, kalo tanpa pengirim bayar JPA ke siapa ?</p>"
var deliveries = this.$store.state.delivery.data_deliveries
var checked_deliveries = _.filter(deliveries, function(o) { return o.chex === 'Y' })
if (checked_deliveries.length === 0)
msg = msg +"<p class='caption mono mb-1'>- Dari sekian banyak wanita haya kau yang ku pilih, jangan lupa ya ... pengiriman hasil dipilih salah satu</p>"
*/
if (this.$store.state.px.selected_test.length < 1)
msg = msg +"<p class='caption mono mb-1'>- Jadi total semua nya 0 rupi...eh, ini kok belum ada pemeriksaan ? </p>"
this.alert_msg = msg
this.dialog_alert_msg = true
},
},
computed: {
loading_process() {
return this.$store.state.order.loading_process
},
loading_data_patient: {
get() {
return this.$store.state.order.loading_data_patient
},
set(val) {
this.$store.commit('order/update_loading_data_patient', val)
}
},
selected_panel() {
return this.$store.state.px.selected_panel
},
selected_test() {
return this.$store.state.px.selected_test
},
in_saving: {
get() {
return this.$store.state.order.in_saving
},
set(val) {
this.$store.commit("order/update_in_saving", val)
}
},
discount_pembulatan() {
//sipe : set to 0
return 0
let st = this.sub_total
let part = st%1000
if (part > 500) return part - 500
if (part < 500 && part > 0 ) return part
return 0
},
grand_total() {
let gt = this.sub_total - this.discount_pembulatan
return gt
},
sub_total() {
let tests = this.selected_test
sub_total = 0
tests.forEach(function(t,idx) {
let price = t.T_PriceAmount - t.T_PriceDisc / 100 * t.T_PriceAmount
- t.T_PriceDiscRp
sub_total += price
})
let panels = this.selected_panel
panels.forEach(function(p) {
let tests = p.test
tests.forEach(function(t,idx) {
let price = t.T_PriceAmount - t.T_PriceDisc / 100 * t.T_PriceAmount
- t.T_PriceDiscRp
sub_total += price
})
})
return sub_total
},
bruto_total() {
let tests = this.selected_test
bruto_total = 0
tests.forEach(function(t,idx) {
//console.log(t.T_PriceAmount)
bruto_total += parseInt(t.T_PriceAmount)
//console.log(bruto_total)
})
let panels = this.selected_panel
panels.forEach(function(p) {
let tests = p.test
tests.forEach(function(t,idx) {
bruto_total += parseInt(t.T_PriceAmount)
})
})
return bruto_total
},
diskon_total() {
let tests = this.selected_test
diskon_total = 0
tests.forEach(function(t,idx) {
let price = parseInt(t.T_PriceDisc) / 100 * parseInt(t.T_PriceAmount) + parseInt(t.T_PriceDiscRp)
diskon_total += price
})
let panels = this.selected_panel
panels.forEach(function(p) {
let tests = p.test
tests.forEach(function(t,idx) {
let price = parseInt(t.T_PriceDisc) / 100 * parseInt(t.T_PriceAmount) + parseInt(t.T_PriceDiscRp)
diskon_total += price
})
})
return diskon_total
},
btn_save_enabled () {
// console.log(this.$store.state.patient.selected_patient.M_PatientID)
if (!this.$store.state.patient.selected_patient.M_PatientID ||
!this.$store.state.patient.selected_patient.M_PatientName ||
!this.$store.state.patient.selected_patient.M_PatientNoReg ||
!this.$store.state.patient.selected_patient.M_PatientDOB ||
!this.$store.state.patient.selected_patient.patient_age ||
this.$store.state.px.selected_test.length < 1)
return false;
if (this.$store.state.px.req_status == 'X')
return false
//alert(this.$store.state.px.req_status)
if (this.$store.state.px.req_status == 'N' && this.$store.state.px.reqs.length < 1)
return false
if(this.loading_data_patient == false)
return false
/*
var deliveries = this.$store.state.delivery.data_deliveries
var checked_deliveries = _.filter(deliveries, function(o) { return o.chex === 'Y' })
if (checked_deliveries.length === 0)
return false
*/
return true;
},
cito_test : {
get () {
return this.$store.state.px.cito.test
},
set (v) {
this.$store.commit('px/update_cito', {t:'test', v:v})
return
}
}
}
}
</script>

View File

@@ -0,0 +1,264 @@
<template>
<div>
<v-layout column pb-2>
<v-card mb-2 class="one-fo-requirement">
<!--<v-subheader red--text text--lighten-1>
<v-layout row wrap>
<v-flex xs3>
<span>JANJI HASIL :</span>
</v-flex>
<v-flex xs3>
<span v-show="!cito_show && is_cito == 'Y'" class="mr-4 blue--text"><a href="javascript:;" class=" blue--text" @click="cito_show=!cito_show"><v-icon small>priority_high</v-icon> {{ selected_cito ? selected_cito.Nat_CitoName : '' }}</a></span>
<v-select
:items="citos"
item-text="Nat_CitoName"
item-value="Nat_CitoID"
return-object
hide-details
dense
v-model="selected_cito"
height="30"
v-show="cito_show && is_cito == 'Y'"
class="mt-0 pt-0"
append-icon="clear"
@click:append="selected_cito = null"
></v-select>
</v-flex>
<v-flex xs6 class="text-xs-right">
<span class="red--text">Perkiraan Janji Hasil : {{ appx_schedule }}</span>
</v-flex>
</v-layout>
</v-subheader>
<v-divider></v-divider>-->
<v-layout row wrap>
<v-flex xs12 pt-2>
<v-card color="#f3e595" outlined flat >
<v-card-text class="pt-2 pb-2">
<v-layout align-center row wrap>
<v-flex xs6>
<p v-if="req_status == 'X'" class="mb-0 subtitle-1 font-weight-black">Apakah persyaratan terpenuhi ?</p>
<p v-if="req_status == 'N'" class="mb-0 subtitle-1 font-weight-black">Pilih salah satu yang belum terpenuhi</p>
<p v-if="req_status == 'Y'" class="mb-0 subtitle-1 font-weight-black">Mantap ! sudah terpenuhi semua</p>
</v-flex>
<v-flex xs6 class="text-xs-right">
<v-btn small
:color="req_status == 'N' ? '#ee7777' : 'white'"
class="one-btn-icon mr-1 ma-0"
:depressed="req_status == 'N' ? true : false"
:dark="req_status == 'N'"
@click="reqMeNot">
<v-icon small>clear</v-icon>
</v-btn>
<v-btn small
:color="req_status == 'Y' ? '#40a798' : 'white'"
class="one-btn-icon mr-1 ma-0"
:dark="req_status == 'Y'"
:depressed="req_status == 'Y' ? true : false"
@click="reqMe">
<v-icon small>done</v-icon>
</v-btn>
<!-- <v-btn color="red" class="one-btn-icon mr-1 ma-0" @click="sampleReq"
v-show="req_status == 'X' || req_status == 'N'"
:disabled="req_status != 'X'"
:dark="req_status == 'X'">
<v-icon>clear</v-icon>
</v-btn>
<v-btn color="green" class="one-btn-icon ma-0" @click="sampleReqOK"
v-show="req_status == 'X' || req_status == 'Y'"
:disabled="req_status != 'X'"
:dark="req_status == 'X'">
<v-icon>done</v-icon>
</v-btn> -->
</v-flex>
</v-layout>
</v-card-text>
</v-card>
</v-flex>
</v-layout>
<v-layout row wrap v-if="req_status != 'N'" class="pl-3 pr-3 pa-2">
<v-flex xs6 v-for="(req, i) in requirements" v-bind:key="i" class="pt-0 pb-1 pr-1 pl-1">
<v-btn color="black" block small outline class="ma-0 btn-req">{{req.label}}</v-btn>
</v-flex>
<!-- <v-card flat>
<v-card-text class="pl-3 pr-3 pt-2 pb-2">
<v-layout row wrap>
</v-layout>
</v-card-text>
</v-card> -->
</v-layout>
<v-container fluid v-if="req_status == 'N'" class="pl-2 pr-2 pt-2 pb-2">
<v-layout row wrap>
<!-- <one-field-verification v-for="req in requirements" :key="req.idx"
@input="update_req"
:value="req" class="xs12 sm10" >
</one-field-verification> -->
<v-flex xs12
v-for="(req, i) in requirements"
v-bind:key="i">
<v-checkbox
color="#40a798"
:value="req.req_id"
:label="req.label"
v-model="reqs"
hide-details
class="mt-0"
></v-checkbox>
</v-flex>
</v-layout>
</v-container>
<v-divider></v-divider>
<!-- <v-layout mb-2 align-center>
<v-flex xs12 pl-4 pt-2>
<v-checkbox
class="mt-0"
color="#40a798"
v-model="received_sample"
style="font-size:12px"
value="Y"
hide-details
></v-checkbox>
<v-switch class="mt-0" color="#64b2cd" hide-details v-model="received_sample" value="Y" >
<template v-slot:label>
<span v-if="received_sample === 'Y'" class="font-weight-black" style="color:#64b2cd;font-size:12px;">Hanya terima sample</span>
<span v-if="received_sample === 'N'" class="font-weight-black" style="font-size:12px;">Hanya terima sample</span>
</template>
</v-switch>
</v-flex>
</v-layout> -->
</v-card>
</v-layout>
</div>
</template>
<style scoped>
div.persyaratan input[type=text]::-webkit-input-placeholder {
font-size: 1em;
}
div.persyaratan input[type=text] {
font-size: .7em;
}
div.persyaratan label {
color: #f44336!important;
font-size: 1.1em;
font-weight:400;
}
.btn-req > .v-btn__content {
justify-content: left !important
}
</style>
<script>
module.exports = {
components: {
"one-field-verification" : httpVueLoader("./oneFieldVerification.vue")
},
data () {
return {
cito_show : true
}
},
computed: {
requirements(){
return this.$store.state.px.requirement
},
received_sample : {
get () {
return this.$store.state.order.received_sample
},
set (v) {
if (v == null)
v = "N";
this.$store.commit("order/update_received_sample", v)
return
}
},
appx_schedule() {
return this.$store.state.px.appx_schedule
},
req_status() {
return this.$store.state.px.req_status
},
req_text() {
let x = []
for (let i in this.requirements)
x.push(this.requirements[i].label);
return x.join(', ')
},
reqs : {
get () { return this.$store.state.px.reqs },
set (v) { this.$store.commit('px/update_reqs', v) }
},
citos () {
return this.$store.state.px.citos
},
selected_cito : {
get () { return this.$store.state.px.selected_cito },
set (v) { this.$store.commit('px/update_selected_cito', v) }
},
is_cito () {
return this.$store.state.px.is_cito
}
},
methods: {
update_req(val) {
let reqs = this.$store.state.px.requirement
reqs.forEach(function(r,idx) {
if ( val.idx = r.idx ) {
reqs[idx] = val
}
})
this.$store.commit("px/update_requirement", reqs)
},
reqMe() {
this.$store.commit('px/update_req_status', 'Y')
},
reqMeNot() {
this.$store.commit('px/update_req_status', 'N')
}
},
mounted () {
this.$store.dispatch('px/search_cito')
},
watch : {
is_cito(val, old) {
// if (val == "Y" && old == "N")
// this.cito_show = false
}
}
}
</script>

View File

@@ -0,0 +1,69 @@
<template>
<v-layout row wrap>
<v-flex xs12 class="left" fill-height pa-1>
<!-- komponen kiri -->
<patient-left-side></patient-left-side>
</v-flex>
</v-layout>
</template>
<script>
module.exports = {
components: {
'patient-left-side': httpVueLoader('./patientLeftSide.vue'),
'patient-right-side': httpVueLoader('./patientRightSide.vue'),
'one-fo-registration-price-list': httpVueLoader('./oneFoRegistrationPriceList.vue?ts='
+ new Date().toISOString()),
'one-fo-registration-requirement': httpVueLoader('./oneFoRegistrationRequirement.vue')
},
computed: {
schedules() {
var xvar = this.$store.state.px.appx_schedule
if (xvar)
xvar = xvar.split(",")
else
xvar = []
return xvar
},
citos() {
return this.$store.state.px.citos
},
selected_cito: {
get() { return this.$store.state.px.selected_cito },
set(v) { this.$store.commit('px/update_selected_cito', v) }
},
is_cito() {
return this.$store.state.px.is_cito
}
},
methods: {
getTimeX(xtime) {
if (xtime)
return moment(xtime).format('DD-MM-YYYY HH:mm')
else
return
}
},
data() {
return {
cito_show: true,
dialog_cito: false
}
},
mounted() {
this.$store.dispatch('px/search_cito')
},
watch: {
is_cito(val, old) {
// if (val == "Y" && old == "N")
// this.cito_show = false
}
}
}
</script>

View File

@@ -0,0 +1,167 @@
<template>
<v-layout row wrap>
<v-dialog
v-model="dialog_cito"
width="500"
>
<v-card >
<v-card-title
class="subtitle-1"
color="#64b2cd"
>
PILIH CITO
</v-card-title>
<v-card-text>
<v-select
:items="citos"
item-text="Nat_CitoName"
item-value="Nat_CitoID"
return-object
hide-details
dense
v-model="selected_cito"
height="30"
v-show="cito_show && is_cito == 'Y'"
class="mt-0 pt-0"
append-icon="clear"
@click:append="selected_cito = null"
></v-select>
</v-card-text>
<v-divider></v-divider>
<v-card-actions>
<v-spacer></v-spacer>
<v-btn
color="black"
flat
@click="dialog_cito = false"
>
Tutup
</v-btn>
</v-card-actions>
</v-card>
</v-dialog>
<v-flex xs12 sm6 class="left" fill-height pa-1>
<!-- komponen kiri -->
<one-mou-px-left></one-mou-px-left>
</v-flex>
<v-flex xs12 sm6 class="right" fill-height pa-1>
<!-- komponen kanan -->
<v-card class="pa-1">
<v-layout column>
<v-layout align-center row>
<v-flex xs12>
<v-card tile class="pa-2" flat color="#64b2cd">
<h5 class="subtitle-1 font-weight-bold" style="color:#fff">DETAIL ORDER</h5>
</v-card>
</v-flex>
</v-layout>
<v-layout column>
<v-layout style="background:#89CFF0" mb-0 mt-1 align-center row>
<v-flex v-if="!cito_show || is_cito !== 'Y'" xs2>
<h5 class="mono subtitle-1 pl-2 font-weight-bold">
JANJI HASIL
</h5>
</v-flex>
<v-flex v-if="!cito_show || is_cito !== 'Y'" xs10 class="text-xs-right">
<p class="mb-0 pb-1 pt-1 pr-1">
<kbd class="mr-1" v-for="schedule in schedules">{{getTimeX(schedule)}}</kbd>
</p>
</v-flex>
<v-flex v-if="cito_show && is_cito == 'Y'" xs2>
<v-btn dark @click="dialog_cito = true" small color="#ee7777">{{selected_cito.Nat_CitoName}}</v-btn>
<!--<span class="font-weight-black caption" style="color:#6a6a6a">JANJI HASIL</span>-->
</v-flex>
<v-flex v-if="cito_show && is_cito == 'Y'" xs10 class="text-xs-right">
<p class="mb-0 pb-1 pt-1 pr-1">
<kbd class="mr-1" v-for="schedule in schedules">{{getTimeX(schedule)}}</kbd>
</p>
</v-flex>
</v-layout>
</v-layout>
<one-fo-registration-price-list></one-fo-registration-price-list>
</v-layout>
</v-card>
</v-flex>
</v-layout>
</template>
<style scoped>
.mini-select .v-select__selections {
align-items: center;
display: flex;
flex: 1 1 auto;
flex-wrap: wrap;
line-height: 10px;
}
</style>
<script>
module.exports = {
components : {
'one-mou-px-left' : httpVueLoader('./oneMouPxLeft.vue'),
'one-fo-registration-price-list' : httpVueLoader('./oneFoRegistrationPriceList.vue?ts='
+ new Date().toISOString())
},
computed: {
schedules() {
var xvar = this.$store.state.px.appx_schedule
if(xvar)
xvar = xvar.split(",")
else
xvar = []
return xvar
},
citos () {
return this.$store.state.px.citos
},
selected_cito : {
get () { return this.$store.state.px.selected_cito },
set (v) { this.$store.commit('px/update_selected_cito', v) }
},
is_cito () {
return this.$store.state.px.is_cito
}
},
methods: {
getTimeX(xtime) {
if(xtime)
return moment(xtime).format('DD-MM-YYYY HH:mm')
else
return
}
},
data () {
return {
cito_show : true,
dialog_cito:false
}
},
mounted () {
this.$store.dispatch('px/search_cito')
},
watch : {
is_cito(val, old) {
// if (val == "Y" && old == "N")
// this.cito_show = false
}
}
}
</script>

View File

@@ -0,0 +1,25 @@
<template>
<v-layout row wrap>
<v-flex xs12 sm6 class="left" fill-height pa-1>
<!-- komponen kiri -->
<one-fo-registration-detail-order></one-fo-registration-detail-order>
</v-flex>
<v-flex xs12 sm6 class="right" fill-height pa-1>
<!-- komponen kanan -->
<one-fo-registration-payment></one-fo-registration-payment>
</v-flex>
</v-layout>
</template>
<script>
module.exports = {
components : {
'one-fo-registration-detail-order' : httpVueLoader('./oneFoRegistrationDetailOrder.vue'),
'one-fo-registration-payment' : httpVueLoader('./oneFoRegistrationPayment2.vue?ts='+Date.now())
}
}
</script>

View File

@@ -0,0 +1,52 @@
<template>
<v-layout column pb-2>
<v-card class="search-test pa-1 mb-0">
<!-- <v-card-actions>
<v-btn flat :outline="isTab('px')" color="orange" @click="selectTab('px')" >Pemeriksaan</v-btn>
<v-btn flat :outline="isTab('panel')" color="orange" @click="selectTab('panel')" >Panel</v-btn>
<v-btn flat :outline="isTab('profile')" color="orange" @click="selectTab('profile')" >Profile</v-btn>
<v-btn flat :outline="isTab('mou')" color="orange" text-color="red" @click="selectTab('mou')" >MOU *</v-btn>
</v-card-actions> -->
<v-divider></v-divider>
<one-mou-px-mou-info v-if="isTab('mou')">
</one-mou-px-mou-info>
<one-mou-px-px v-if="isTab('px')">
</one-mou-px-px>
<one-mou-px-panel v-if="isTab('panel')">
</one-mou-px-panel>
<one-mou-px-profile v-if="isTab('profile')">
</one-mou-px-profile >
</v-layout>
</template>
<style scoped>
</style>
<script>
module.exports = {
components: {
'one-mou-px-mou-info' : httpVueLoader('./oneMouPxMouInfo.vue'),
'one-mou-px-px' : httpVueLoader('./oneMouPxPx.vue?ts' + new Date().toISOString() ),
'one-mou-px-panel' : httpVueLoader('./oneMouPxPanel.vue'),
'one-mou-px-profile' : httpVueLoader('./oneMouPxProfile.vue'),
},
methods: {
isTab(tab) {
return this.$store.state.company.selected_px_tab == tab
},
selectTab(tab) {
let prev_tab = this.$store.state.company.selected_px_tab
if (tab != this.$store.state.company.selected_px_tab ) {
//reset panels tests profiles
this.$store.commit('px/update_tests',[])
this.$store.commit('px/update_panels',[])
}
this.$store.commit('company/update_selected_px_tab',tab)
}
},
computed : {
selected_px_tab() {
return this.$store.state.company.selected_px_tab
}
}
}
</script>

View File

@@ -0,0 +1,117 @@
<template>
<v-layout row justify-center>
<v-dialog v-model="dialog_start" fullscreen persistense hide-overlay transition="dialog-bottom-transition">
<v-card>
<v-toolbar dark color="primary">
<v-btn icon dark @click="dialog = false">
<v-icon>close</v-icon>
</v-btn>
<v-toolbar-title>Settings</v-toolbar-title>
<v-spacer></v-spacer>
<v-toolbar-items>
<v-btn dark flat @click="dialog = false">Save</v-btn>
</v-toolbar-items>
</v-toolbar>
<v-list three-line subheader>
<v-subheader>User Controls</v-subheader>
<v-list-tile avatar>
<v-list-tile-content>
<v-list-tile-title>Content filtering</v-list-tile-title>
<v-list-tile-sub-title>Set the content filtering level to restrict apps that can be downloaded</v-list-tile-sub-title>
</v-list-tile-content>
</v-list-tile>
<v-list-tile avatar>
<v-list-tile-content>
<v-list-tile-title>Password</v-list-tile-title>
<v-list-tile-sub-title>Require password for purchase or use password to restrict purchase</v-list-tile-sub-title>
</v-list-tile-content>
</v-list-tile>
</v-list>
<v-divider></v-divider>
<v-list three-line subheader>
<v-subheader>General</v-subheader>
<v-list-tile avatar>
<v-list-tile-action>
<v-checkbox v-model="notifications"></v-checkbox>
</v-list-tile-action>
<v-list-tile-content>
<v-list-tile-title>Notifications</v-list-tile-title>
<v-list-tile-sub-title>Notify me about updates to apps or games that I downloaded</v-list-tile-sub-title>
</v-list-tile-content>
</v-list-tile>
<v-list-tile avatar>
<v-list-tile-action>
<v-checkbox v-model="sound"></v-checkbox>
</v-list-tile-action>
<v-list-tile-content>
<v-list-tile-title>Sound</v-list-tile-title>
<v-list-tile-sub-title>Auto-update apps at any time. Data charges may apply</v-list-tile-sub-title>
</v-list-tile-content>
</v-list-tile>
<v-list-tile avatar>
<v-list-tile-action>
<v-checkbox v-model="widgets"></v-checkbox>
</v-list-tile-action>
<v-list-tile-content>
<v-list-tile-title>Auto-add widgets</v-list-tile-title>
<v-list-tile-sub-title>Automatically add home screen widgets</v-list-tile-sub-title>
</v-list-tile-content>
</v-list-tile>
</v-list>
</v-card>
</v-dialog>
</v-layout>
</template>
<style scoped>
table.v-table tbody td,table.v-table tbody th {
height: 40px;
}
table.v-table thead tr {
height: 40px;
}
.one-btn-icon { font-size: 1.5em; float: right }
</style>
<script>
module.exports = {
computed : {
dialog_start: {
get() {
return this.$store.state.order.dialog_start
},
set(val) {
this.$store.commit('order/update_dialog_start',val)
}
},
status_start: {
get() {
return this.$store.state.order.status_start
},
set(val) {
this.$store.commit('order/update_status_start',val)
}
},
time_start: {
get() {
return this.$store.state.order.time_start
},
set(val) {
this.$store.commit('order/update_time_start',val)
}
}
},
data() {
return {
};
},
methods : {
}
}
</script>

View File

@@ -0,0 +1,19 @@
<template>
<v-layout column>
<one-fo-registration-company></one-fo-registration-company>
<one-fo-registration-test></one-fo-registration-test>
<one-fo-registration-requirement></one-fo-registration-requirement>
</v-layout>
</template>
<style scoped>
</style>
<script>
module.exports = {
components : {
'one-fo-registration-company' : httpVueLoader('./oneFoRegistrationCompany.vue'),
'one-fo-registration-test' : httpVueLoader('./oneFoRegistrationTest.vue?ts=' + new Date().toISOString() ),
'one-fo-registration-requirement' : httpVueLoader('./oneFoRegistrationRequirement.vue')
}
}
</script>

View File

@@ -0,0 +1,29 @@
<template>
<v-card-text class="pa-0">
<v-layout align-center row>
<v-flex xs12>
<v-card tile class="pa-2" flat color="#64b2cd">
<h5 class="subtitle-1 font-weight-bold">KEL. PELANGGAN DAN AGREEMENT</h5>
</v-card>
</v-flex>
</v-layout>
<div v-if="!mou.M_MouCompanyName">
Belum ada agreement yang di pilih
</div>
<div v-if="mou.M_MouCompanyName">
Agreement : {{mou.M_MouCompanyName}} <br/>
Start : {{mou.M_MouCompanyStartDate}} <br/>
End : {{mou.M_MouCompanyEndDate}} <br/>
Note : {{mou.M_MouCompanyNote}} <br/>
</div>
</v-card-text>
</template>
<script>
module.exports = {
computed : {
mou() {
return this.$store.state.company.selected_mou
}
}
}
</script>

View File

@@ -0,0 +1,109 @@
<template>
<v-card-text>
<v-layout row >
<v-flex xs6 class="pa-0 ma-0" >
<v-text-field
label="Panel"
placeholder="Cari Panel"
@change="search"
class="ma-0"
outline
>
</v-text-field>
</v-flex>
<v-flex xs6 class="pa-3">
<v-label >
Panel found {{panel_count}}, display {{ panel_count < 20 ? panel_count : 20 }}
</v-label>
</v-flex>
</v-layout>
<v-container grid-list-xs text-xs-center pa-0>
<v-layout row wrap>
<v-btn xs3 v-for="p in panels" :key="p.T_TestPanelID"
@click="selectPanel(p)"
depressed small color="error">
{{p.T_TestPanelName}}
</v-btn>
</v-layout>
</v-container>
</v-card-text>
</template>
<script>
module.exports = {
methods: {
search(val) {
if (this.prev_val == val ) return
this.prev_val = val
this.$store.commit("px/update_search_panel",val)
this.$store.dispatch("px/panel")
},
update_req(px) {
if (px.T_TestRequirement != '' ) {
let reqs = this.$store.state.px.requirement
if (! _.find(reqs, function(r) { return r.label == px.T_TestRequirement; }) ) {
reqs.push({
label: px.T_TestRequirement,
is_error: true,
checked : false,
error_message: 'Hasil harus di isi',
note: ''
})
}
this.$store.commit('px/update_requirement',reqs)
}
},
selectPanel(panel) {
try {
let selected_panel = this.$store.state.px.selected_panel
let flag_found = false
selected_panel.forEach( function(p,idx) {
if (panel.T_TestPanelID == p.T_TestPanelID) {
selected_panel[idx] = panel
flag_found = true
}
})
if (!flag_found) {
let f_update_req = this.update_req
selected_panel.push(panel)
panel.test.forEach(function(px){
f_update_req(px)
})
}
this.$store.commit('px/update_selected_panel',selected_panel)
let panels = this.$store.state.px.panels
let p_idx= -1
panels.forEach( function(p,idx) {
if (p.T_TestPanelID == panel.T_TestPanelID) p_idx = idx
})
if (p_idx >= 0 ) {
_.pullAt(panels,[p_idx])
let dt = {
records: panels,
total : panels.length
}
this.$store.commit('px/update_panels',dt)
}
} catch(e) {
console.log(e)
}
}
},
computed: {
panel_count() {
return this.$store.state.px.total_panel
},
panels() {
console.log('get panels')
return this.$store.state.px.panels
},
is_loading() {
return this.$store.state.px.search_panel_status == 1
}
},
data: function(){
return {
prev_val: ''
}
}
}
</script>

View File

@@ -0,0 +1,220 @@
<template>
<v-card-text>
<v-layout row >
<v-text-field
placeholder="ketikkan profile..."
class="pt-0"
v-model="search"
@keyup.enter="do_search"
>
</v-text-field>
</v-layout>
<v-layout row wrap>
<v-flex xs3 v-for="(profile, idx) in profiles" v-bind:key="idx">
<v-layout row>
<v-flex>
<v-btn depressed small color="error" class="mr-0 btn-profile" :disabled="profile.err > 0" :dark="profile.err < 1" block @click="selectPx(profile.detail)">{{ profile.T_ProfileName }}</v-btn>
</v-flex>
<v-flex>
<v-btn depressed small icon color="red lighten-2" dark class="ml-0" @click="profile_detail(profile)"><v-icon>search</v-icon></v-btn>
</v-flex>
</v-layout>
</v-flex>
<v-snackbar
v-model="snackbar"
top
>
{{ err_text }}
<v-btn color="red" flat @click="snackbar = false" >
Close
</v-btn>
</v-snackbar>
<v-dialog
v-model="profile_detail_dialog"
width="500"
>
<v-card>
<v-card-title
class="headline grey lighten-2"
primary-title
>
{{ profile_detail_title }}
</v-card-title>
<v-card-text>
<v-layout row wrap>
<v-flex xs6 v-for="(px, i) in profile_detail_px" v-bind:key="i" pa-1>
<v-btn color="orange" block dark>{{ px.T_TestName }}</v-btn>
</v-flex>
</v-layout>
</v-card-text>
<v-divider></v-divider>
<v-card-actions>
<v-btn
color="primary"
flat
@click="profile_detail_dialog = false"
>
Tutup
</v-btn>
<v-spacer></v-spacer>
<v-btn color="red" dark>Tambahkan ke Order</v-btn>
</v-card-actions>
</v-card>
</v-dialog>
</v-layout>
</v-card-text>
</template>
<style scoped>
.v-btn--icon {
border-radius: 0px
}
.btn-profile {
border-top-right-radius: 0%;
border-bottom-right-radius: 0%;
}
</style>
<script>
module.exports = {
data () {
return {
snackbar: false,
err_text: "",
profile_detail_dialog: false,
profile_detail_text: '',
profile_detail_title: 'SGPT',
profile_detail_px: []
}
},
computed : {
profiles () {
return this.$store.state.px.profiles
},
search : {
get () {
return this.$store.state.px.search_profile
},
set (v) {
this.$store.commit('px/update_search_profile', v)
}
}
},
methods : {
do_search() {
this.$store.dispatch('px/profile')
},
selectPx(pxs) {
let flag_found = false
let flag_name = ""
let selected_test = this.$store.state.px.selected_test
for (let i in pxs) {
var px = pxs[i]
selected_test.forEach( function(t, idx) {
if (t.T_TestID == px.T_TestID) {
flag_found = true
flag_name = t.T_TestName
}
})
}
if (flag_found) {
this.err_text = "Tidak bisa menambahkan Profile. Pemeriksaan " + flag_name + " sudah ada !"
this.snackbar = true
return
}
for (let i in pxs) {
var px = pxs[i]
try {
// if (in_selectPx) return
// in_selectPx = true
// let selected_test = this.$store.state.px.selected_test
flag_found = false
// let flag_found = false
// selected_test.forEach( function(t, idx) {
// if (t.T_TestID == px.T_TestID) {
// selected_test[idx] = px
// flag_found = true
// }
// })
if (!flag_found) {
selected_test.push(px)
// let tests = this.$store.state.px.tests
// let p_idx = -1
// tests.forEach(function(t,idx) {
// if (t.T_TestID == px.T_TestID) {
// p_idx = idx
// }
// })
// if (p_idx >= 0 ) {
// _.pullAt(tests,[p_idx])
// let dt = {
// records: tests,
// total: tests.length
// }
// this.$store.commit('px/update_tests',dt)
// }
}
this.$store.commit('px/update_selected_test', selected_test)
if (px.T_TestRequirement != '' ) {
let reqs = this.$store.state.px.requirement
let rst = _.find(reqs, function(r) { return r.label == px.T_TestRequirement; })
if ( rst == undefined ) {
reqs.push({
px_id: px.T_TestID,
label: px.T_TestRequirement,
error_message: 'Hasil harus di isi',
is_error: true,
checked : false,
note: ''
})
}
this.$store.commit('px/update_requirement', reqs)
// Update Janji Hasil
this.$store.dispatch('px/appx_schedule')
}
// in_selectPx = false
} catch(e) {
console.log(e)
// in_selectPx = false
}
}
},
profile_detail (profile) {
this.profile_detail_title = profile.T_ProfileName
this.profile_detail_text = JSON.stringify(profile.detail)
this.profile_detail_px = profile.detail
this.profile_detail_dialog = true
}
}
}
</script>

View File

@@ -0,0 +1,350 @@
<template>
<v-card-text class="pa-0">
<v-layout column>
<v-layout align-center row>
<v-flex xs12>
<v-card tile class="pa-2" flat color="#64b2cd">
<h5 style="color:#fff" class="subtitle-1 font-weight-bold">PEMERIKSAAN</h5>
</v-card>
</v-flex>
</v-layout>
<v-layout mt-1 align-row row>
<v-flex xs12 class="pl-1 pt-1 pr-1 ma-0" >
<v-text-field
placeholder="ketikkan pemeriksaan ..."
@change="search"
class="ma-0"
single-line
clearable
outline
hide-details
>
</v-text-field>
</v-flex>
</v-layout>
<v-layout row >
<v-flex xs6 pl-1 pr-1>
<p class="mb-0 mt-2 mono caption">Tekan <kbd>enter</kbd> untuk memulai pencarian</p>
</v-flex>
<v-flex xs6 pl-1 pr-1 >
<!--<p class="mb-0 pa-1 text-xs-right caption">
<v-icon small>search</v-icon> Ditemukan data sebanyak <kbd style="background:#64b2cd">{{test_count}}</kbd> pemeriksaan
</p>-->
</v-flex>
</v-layout>
<v-divider class="mt-2 mb-2"></v-divider>
<v-progress-linear class="ma-0 pa-0" indeterminate :active="is_loading" />
</v-layout>
<v-layout pl-1 pr-1 row wrap>
<v-flex xs6 v-for="test in tests" v-if="!selected_test(test)" :key="test.T_TestPriceID">
<!--<v-btn block
@click="selectPx(test)"
depressed small :color="px_color(test.px_type)" dark
outline
class="ma-0 btn-px"
>
{{test.T_TestName}}
</v-btn> -->
<v-layout style="cursor:pointer" align-center @click="selectPx(test)" row>
<v-flex xs12>
<v-card v-if="test.px_type !== 'PN' && test.px_type !== 'PR'" color="#ee7777" dark class="pa-2 ma-1" >
<p class="mb-0 caption"> {{test.T_TestName}}</p>
</v-card>
<v-card v-if="test.px_type === 'PN'" color="#40a798" dark class="pa-2 ma-1" >
<p class="mb-0 caption"> {{test.T_TestName}}</p>
</v-card>
<v-card v-if="test.px_type === 'PR'" color="#7c73e6" dark class="pa-2 ma-1" >
<p class="mb-0 caption"> {{test.T_TestName}}</p>
</v-card>
</v-flex>
</v-layout>
</v-flex>
</v-layout>
<v-divider class="mt-4 mb-2"></v-divider>
</v-card-text>
</template>
<style scoped>
.btn-px > .v-btn__content {
justify-content: left !important
}
</style>
<script>
let in_selectPx = false
module.exports = {
methods: {
selected_test(x_px){
var nat_tests = this.$store.state.px.nat_test
var found_nt = false
x_px.nat_test.forEach(function(entry) {
if (nat_tests.indexOf(entry) !== -1)
found_nt = true
})
return found_nt
},
search(val) {
if ( val == this.prev_search ) return
console.log('Searching',val)
this.prev_search = val
this.$store.commit("px/update_search",val)
this.$store.dispatch("px/search")
},
keyup(e) {
//this.showhint = true
if (e.which==13) {
if (!window.one_token()) {
this.$store.commit('update_message_error', 'Maaf, koneksi Anda sempat terputus silahkan Log Out dan Login kembali')
this.$store.commit('update_dialog_error', true)
return
}
//this.$store.commit('patient/update_current_page',1)
if ( this.search == this.prev_search ) return
console.log('Searching',this.search)
this.prev_search = this.search
in_selectPx = false
console.log(in_selectPx)
//this.$store.commit("px/update_search",val)
this.$store.dispatch("px/search")
}
},
selectPx(px) {
console.log(px)
//debugger
console.log("start select px")
if (!window.one_token()) {
this.$store.commit('update_message_error', 'Maaf, koneksi Anda sempat terputus silahkan Log Out dan Login kembali')
this.$store.commit('update_dialog_error', true)
return
}
try {
console.log(in_selectPx)
// START LOADING
this.$store.commit('update_dialog_loading', true)
// IF PROFILE
if (px.px_type == "PR" || px.px_type == "PXR")
return this.selectProfile(px)
// SEARCH NAT TEST
let nt = this.$store.state.px.nat_test
let found_nt = false
for (let i in px.nat_test) {
if (nt.indexOf(px.nat_test[i]) > -1)
found_nt = true
}
if (found_nt) {
alert('Pemeriksaan tersebut sudah ada !')
// END LOADING
this.$store.commit('update_dialog_loading', false)
return
}
//if (in_selectPx) return
in_selectPx = true
let selected_test = this.$store.state.px.selected_test
let flag_found = false
selected_test.forEach( function(t,idx) {
if (t.T_TestID == px.T_TestID) {
selected_test[idx] = px
flag_found = true
}
})
if (!flag_found) {
selected_test.push(px)
let tests = this.$store.state.px.tests
let p_idx = -1
tests.forEach(function(t,idx) {
if (t.T_TestID == px.T_TestID) {
p_idx = idx
}
})
if (p_idx >= 0 ) {
_.pullAt(tests,[p_idx])
let dt = {
records: tests,
total: tests.length
}
this.$store.commit('px/update_tests',dt)
}
}
this.$store.commit('px/update_selected_test', selected_test)
if (px.px_type !== "PN"){
let req = px.requirement
let reqs = this.$store.state.px.requirement
if (req.length > 0) {
for(let i in req) {
let found = false
for(let j in reqs) {
if (reqs[j]['req_id'] == req[i]['req_id'])
found = j
}
if (!found)
reqs.push({
px_id: [px.T_TestID],
label: req[i]['req_name'],
error_message: 'Hasil harus di isi',
is_error: true,
checked : false,
note: '',
req_id: req[i]['req_id']
})
else
reqs[found].px_id.push(px.T_TestID)
}
this.$store.commit('px/update_requirement', reqs)
}
}
this.$store.dispatch('px/appx_schedule')
in_selectPx = false
this.$store.commit('px/update_nat_test')
// END LOADING
if (px.px_type == "PN")
this.$store.dispatch('px/packet_reqs',{pxs:px.child_test})
this.$store.commit('update_dialog_loading', false)
} catch(e) {
console.log(e)
in_selectPx = false
}
},
selectProfile(px) {
try {
// SEARCH NAT TEST
let nt = this.$store.state.px.nat_test
let found_nt = false
for (let i in px.nat_test) {
if (nt.indexOf(px.nat_test[i]) > -1)
found_nt = true
}
if (found_nt) {
alert('Pemeriksaan tersebut sudah ada !')
// END LOADING
this.$store.commit('update_dialog_loading', false)
return
}
let pxs = px.child_test
for (let i in pxs) {
px = pxs[i]
let selected_test = this.$store.state.px.selected_test
let flag_found = false
selected_test.push(px)
let tests = this.$store.state.px.tests
let p_idx = -1
tests.forEach(function(t,idx) {
if (t.T_TestID == px.T_TestID) {
p_idx = idx
}
})
if (p_idx >= 0 ) {
_.pullAt(tests,[p_idx])
let dt = {
records: tests,
total: tests.length
}
this.$store.commit('px/update_tests',dt)
}
this.$store.commit('px/update_selected_test', selected_test)
let req = px.requirement
let reqs = this.$store.state.px.requirement
if (req.length > 0) {
for(let i in req) {
let found = false
for(let j in reqs) {
if (reqs[j]['req_id'] == req[i]['req_id'])
found = j
}
if (!found)
reqs.push({
px_id: [px.T_TestID],
label: req[i]['req_name'],
error_message: 'Hasil harus di isi',
is_error: true,
checked : false,
note: '',
req_id: req[i]['req_id']
})
else
reqs[found].px_id.push(px.T_TestID)
}
this.$store.commit('px/update_requirement', reqs)
}
}
this.$store.dispatch('px/appx_schedule')
in_selectPx = false
this.$store.commit('px/update_nat_test')
// END LOADING
this.$store.commit('update_dialog_loading', false)
} catch(e) {
console.log(e)
// END LOADING
this.$store.commit('update_dialog_loading', false)
in_selectPx = false
}
},
px_color (x) {
if (x == "PR")
return "green"
else if (x == "PN")
return "orange"
else
return "error"
}
},
computed: {
test_count() {
return this.$store.state.px.total_test
},
display_count() {
return this.tests.length
},
tests() {
return this.$store.state.px.tests
},
is_selectPx() {
return in_selectPx
},
is_loading() {
return this.$store.state.px.search_status == 1
}
},
data: function(){
return {
search_val:false,
search_flag:false,
prev_search : ''
}
}
}
</script>

View File

@@ -0,0 +1,185 @@
<template>
<div>
<!--<v-layout>
<v-flex xs12 text-xs-center mb-2>
<v-card color="blue lighten-4">
<v-card-text class="pb-0 pt-1">
<v-btn
v-for="tab in tabs"
:color="tab.code == active ? 'black' : 'grey lighten-5'"
class="black--text ma-0 tab-btn"
:class="[tab.code == active ? 'active' : '']"
@click="changeTab(tab.code)"
flat
:key="tab.code"
:data="tab"
:disabled="!tab.enabled"
>
<h6 class="title">{{ tab.label }}</h6>
</v-btn>
</v-card-text>
</v-card>
</v-flex>
</v-layout>-->
<v-layout mt-0 v-if="active == '01'" row>
<v-flex ml-1 mr-1 mb-1 xs12>
<v-card color="teal lighten-3">
<v-layout row>
<v-flex ml-2 mt-1 mr-1 mb-1 xs4>
<v-btn block
depressed
@click="changeTab('01')"
class="font-weight-black text-mono"
style="color:#fff!important"
color="teal lighten-2">
DEMOGRAFI
</v-btn>
</v-flex>
<v-flex ml-1 mt-1 mr-1 mb-1 xs4>
<v-btn block
flat
@click="changeTab('02')"
class="font-weight-black text-mono"
style="background:#fff!important"
color="#3c70a4">
PEMERIKSAAN
</v-btn>
</v-flex>
<v-flex ml-1 mt-1 mr-2 mb-1 xs4>
<v-btn block
flat
style="background:#fff!important"
class="font-weight-black text-mono"
color="#9e9e9e">
PEMBAYARAN
</v-btn>
</v-flex>
</v-layout>
</v-card>
</v-flex>
</v-layout>
<v-layout mt-0 v-if="active == '02'" row>
<v-flex ml-1 mr-1 mb-1 xs12>
<v-card color="#64b2cd">
<v-layout row>
<v-flex ml-2 mt-1 mr-1 mb-1 xs4>
<v-btn block
depressed
flat
@click="changeTab('01')"
style="background:#fff!important"
class="font-weight-black text-mono"
color="teal">
DEMOGRAFI
</v-btn>
</v-flex>
<v-flex ml-1 mt-1 mr-1 mb-1 xs4>
<v-btn block
depressed
@click="changeTab('02')"
class="font-weight-black text-mono"
style="color:#fff!important"
color="#3c70a4">
PEMERIKSAAN
</v-btn>
</v-flex>
<v-flex ml-1 mt-1 mr-2 mb-1 xs4>
<v-btn block
depressed
flat
style="background:#fff!important"
class="font-weight-black text-mono"
color="#9e9e9e">
PEMBAYARAN
</v-btn>
</v-flex>
</v-layout>
</v-card>
</v-flex>
</v-layout>
<v-layout mt-0 v-if="active == '03'" row>
<v-flex ml-1 mr-1 mb-1 xs12>
<v-card color="#ffeaa5">
<v-layout row>
<v-flex ml-2 mt-1 mr-1 mb-1 xs4>
<v-btn block
depressed
flat
style="background:#fff!important"
class="font-weight-black text-mono"
color="#9e9e9e">
DEMOGRAFI
</v-btn>
</v-flex>
<v-flex ml-1 mt-1 mr-1 mb-1 xs4>
<v-btn block
depressed
flat
style="background:#fff!important"
class="font-weight-black text-mono"
color="#9e9e9e">
PEMERIKSAAN
</v-btn>
</v-flex>
<v-flex ml-1 mt-1 mr-2 mb-1 xs4>
<v-btn block
depressed
@click="changeTab('03')"
style="color:#fff!important"
class="font-weight-black text-mono"
color="#e16262">
PEMBAYARAN
</v-btn>
</v-flex>
</v-layout>
</v-card>
</v-flex>
</v-layout>
</div>
</template>
<style scoped>
.active {
border-bottom: solid 7px #000066!important;
}
.tab-btn {
min-width: 400px;
}
</style>
<script>
module.exports = {
data () {
return {
}
},
methods : {
changeTab (x) {
// this.active = x;
this.$store.commit('change_tab', x);
}
},
computed : {
tabs : {
get () {
return this.$store.state.order.tabs
},
set (v) {
return
}
},
active () {
return this.$store.state.tab_active
}
}
}
</script>

View File

@@ -0,0 +1,193 @@
<template>
<v-layout column>
<v-dialog
v-model="dialog_delivery_note"
width="500"
>
<v-card>
<v-card-title
class="headline blue lighten-2 white--text"
>
Catatan Pengiriman
</v-card-title>
<v-card-text>
<v-layout row>
<v-flex d-flex>
<v-textarea
outline
label="Isikan Catatan"
v-model="selected_delivery_for_note.note"
></v-textarea>
</v-flex>
</v-layout>
<v-layout row>
<v-flex d-flex>
<p class="red--text font-weight-bold caption">
Untuk pengiriman email, penambahan catatan digunakan sebagai pengganti alamat email terpilih,
jika lebih dari satu,
tulis alamat email dengan separator koma
contoh : aku@gmail.com, kamu@gmail.com, dia@gmail.com
</p>
</v-flex>
</v-layout>
<v-layout row>
<v-flex d-flex>
<p class="red--text font-weight-bold caption">
Untuk pengiriman kurir, penambahan catatan digunakan sebagai keterangan
dan tidak merubah kecamatan kelurahan,
ketika proses spk kurir
</p>
</v-flex>
</v-layout>
</v-card-text>
<v-divider></v-divider>
<v-card-actions>
<v-spacer></v-spacer>
<v-btn
color="primary"
flat
@click="addDeliveryNote()"
>
Tambahkan
</v-btn>
</v-card-actions>
</v-card>
</v-dialog>
<h5 class="headline ml-2 mb-1">Pengiriman Hasil</h5>
<v-container grid-list-md>
<v-layout row wrap >
<v-flex class="row" xs6 v-for="(delivery,idx) in deliveries"
mt-2>
<v-layout row wrap :class="{'ml-4':(idx%2)==1}" >
<v-checkbox
hide-details class="shrink mr-1"
:value="delivery.idx"
:disabled="delivery.typeform === 'note'"
v-model="checked_id"
></v-checkbox>
<v-text-field
class="grow"
:append-icon="delivery.typeform === 'md' ? 'add' : 'delete'"
outline
:value="delivery.note"
:label="delivery.name"
@input="(val) => updateDelivery(idx,val)"
@click:append="doAction(idx,delivery)"
hide-details
readonly
></v-text-field>
</v-layout>
</v-flex >
<!-- <v-flex class="row" xs6 v-for="(delivery,idx) in deliveries"
:key="delivery.id" mt-2>
<v-layout row wrap :class="{'ml-4':(idx%2)==1}" >
<v-checkbox
hide-details class="shrink mr-1"
:value="delivery.selected"
@change="(val) => updateSelected(idx,val)"
></v-checkbox>
<v-text-field
class="grow"
outline
:value="delivery.note"
:label="delivery.name"
@input="(val) => updateDelivery(idx,val)"
hide-details
></v-text-field>
</v-layout>
</v-flex > -->
</v-layout>
</v-container>
</v-layout>
</template>
<script>
module.exports = {
data () {
return {
dialog_delivery_note:false,
selected_delivery_for_note:{}
}
},
methods: {
updateSelected(idx,val) {
console.log('idx:'+idx)
console.log('val:'+val)
var deliveries = this.$store.state.delivery.deliveries
deliveries[idx].selected = val
this.$store.commit("delivery/update_deliveries",deliveries)
},
updateDelivery(idx,val) {
var deliveries = this.$store.state.delivery.deliveries
deliveries[idx].note = val
this.$store.commit("delivery/update_deliveries",deliveries)
},
doAction(idx,val){
if(val.typeform === 'md'){
let dlv = this.$store.state.delivery.checked_id
dlv.push(val.idx)
this.$store.commit("delivery/update_checked_id",dlv)
this.selected_delivery_for_note = _.clone(val, true)
if(val.code == 'EMAIL')
this.selected_delivery_for_note.note = val.note
else
this.selected_delivery_for_note.note = ""
this.dialog_delivery_note = true
}
else{
var deliveries = this.$store.state.delivery.deliveries
deliveries.splice(idx, 1)
this.$store.commit("delivery/update_deliveries",deliveries)
}
},
addDeliveryNote(){
var xdt = this.selected_delivery_for_note
let dlv = this.$store.state.delivery.checked_id
dlv.push(xdt.idx)
this.$store.commit("delivery/update_checked_id",dlv)
xdt.typeform = 'note'
xdt.id = Date.now()
xdt.selected = xdt.idx
var deliveries = this.$store.state.delivery.deliveries
deliveries.push(xdt)
this.$store.commit("delivery/update_deliveries",deliveries)
this.dialog_delivery_note = false
}
},
computed: {
deliveries() {
return this.$store.state.delivery.deliveries
},
checked_id : {
get() {
return this.$store.state.delivery.checked_id
},
set(val) {
console.log(val)
this.$store.commit("delivery/update_checked_id", val)
this.$store.commit("delivery/update_deliveries_2")
}
}
},
mounted: function() {
this.$store.dispatch('delivery/search')
}
}
</script>

View File

@@ -0,0 +1,243 @@
<template>
<v-layout column>
<v-dialog
v-model="dialog_delivery_note"
width="500"
>
<v-card>
<v-card-title
class="headline blue lighten-2 white--text"
>
Catatan Pengiriman
</v-card-title>
<v-card-text>
<v-layout row>
<v-flex d-flex>
<v-textarea
outline
label="Isikan Catatan"
v-model="selected_delivery_for_note.description"
></v-textarea>
</v-flex>
</v-layout>
<v-layout row>
<v-flex d-flex>
<p class="red--text font-weight-bold caption">
Untuk pengiriman email, penambahan catatan digunakan sebagai pengganti alamat email terpilih,
jika lebih dari satu,
tulis alamat email dengan separator koma
contoh : aku@gmail.com, kamu@gmail.com, dia@gmail.com
</p>
</v-flex>
</v-layout>
<v-layout row>
<v-flex d-flex>
<p class="red--text font-weight-bold caption">
Untuk pengiriman kurir, penambahan catatan digunakan sebagai keterangan
dan tidak merubah kecamatan kelurahan,
ketika proses spk kurir
</p>
</v-flex>
</v-layout>
</v-card-text>
<v-divider></v-divider>
<v-card-actions>
<v-spacer></v-spacer>
<v-btn
color="primary"
flat
@click="addDeliveryNoteNew()"
>
Tambahkan
</v-btn>
</v-card-actions>
</v-card>
</v-dialog>
<v-layout align-center row>
<v-flex xs12>
<v-card tile flat color=" pa-2 teal lighten-4">
<h5 class=" subtitle-1 font-weight-bold">PENGIRIMAN HASIL</h5>
</v-card>
</v-flex>
</v-layout>
<v-layout mt-1 row wrap >
<v-flex class="row" ma-1 xs11 v-for="(delivery,idx) in deliveries">
<v-layout align-center row>
<v-flex xs1>
<v-btn v-if="delivery.chex === 'N'" @click="changeBoxRight(delivery,idx)" dark style="min-width:20px" small color="grey darken-1"><v-icon small>close</v-icon></v-btn>
<v-btn v-if="delivery.chex === 'Y'" @click="changeBoxRight(delivery,idx)" depressed style="min-width:20px" small color="teal lighten-4"><v-icon color="teal" small>check</v-icon></v-btn>
</v-flex>
<v-flex mb-1 pl-2 xs11>
<p :class="getColorFont(delivery)"
class="mb-0 font-weight-black"
style="font-size:11px">
{{delivery.delivery_name.toUpperCase()}}
</p>
<div v-if="delivery.description !== ''"
class="body-2 mb-1 mono caption"
v-html="reHTMLAddress(delivery.description)">
</div>
<v-textarea
v-if="delivery.chex === 'Y'"
v-model="delivery.note"
rows="1"
auto-grow
single-line
style="color:#800000;font-weight:500"
placeholder="Catatan"
hide-details
class="body-2 mb-1 mt-0 pt-0"
></v-textarea>
</v-flex>
</v-layout>
</v-flex >
</v-layout>
</v-layout>
</template>
<script>
module.exports = {
data () {
return {
dialog_delivery_note:false,
selected_delivery_for_note:{}
}
},
methods: {
reHTMLAddress(entry){
var rtn = ''
if(entry){
var perpart = entry.split("^")
rtn += "<p class='mb-0' style='font-size:12px'>"+perpart[0]+"</p>"
if(perpart[1])
rtn += "<p class='mb-0' style='font-size:12px'>"+perpart[1]+"</p>"
}
return rtn
},
changeBoxRight(value,idx){
var deliveries = this.$store.state.delivery.data_deliveries
console.log(deliveries)
deliveries[idx].chex = value.chex === 'N'?'Y':'N'
console.log(deliveries[idx].chex)
this.$store.commit("delivery/update_data_deliveries",deliveries)
},
getColorFont(value,type){
var xcolor = 'black--text'
if(value.chex === 'Y'){
xcolor = 'teal--text'
}
return xcolor
},
updateSelected(idx,val) {
console.log('idx:'+idx)
console.log('val:'+val)
var deliveries = this.$store.state.delivery.deliveries
deliveries[idx].selected = val
this.$store.commit("delivery/update_deliveries",deliveries)
},
updateDelivery(idx,val) {
var deliveries = this.$store.state.delivery.deliveries
deliveries[idx].note = val
this.$store.commit("delivery/update_deliveries",deliveries)
},
doAction(idx,val){
if(val.typeform === 'md'){
let dlv = this.$store.state.delivery.checked_id
dlv.push(val.idx)
this.$store.commit("delivery/update_checked_id",dlv)
this.selected_delivery_for_note = _.clone(val, true)
if(val.code == 'EMAIL')
this.selected_delivery_for_note.note = val.note
else
this.selected_delivery_for_note.note = ""
this.dialog_delivery_note = true
}
else{
var deliveries = this.$store.state.delivery.deliveries
deliveries.splice(idx, 1)
this.$store.commit("delivery/update_deliveries",deliveries)
}
},
doActionNew(idx,val){
if(val.typeform === 'origin'){
this.selected_delivery_for_note = _.clone(val, true)
var deliveries = this.$store.state.delivery.data_deliveries
deliveries[idx].chex = true
this.$store.commit("delivery/update_data_deliveries",deliveries)
if(val.delivery_code !== 'EMAIL')
this.selected_delivery_for_note.description = ""
this.dialog_delivery_note = true
}
else{
var deliveries = this.$store.state.delivery.data_deliveries
deliveries.splice(idx, 1)
this.$store.commit("delivery/update_data_deliveries",deliveries)
}
},
addDeliveryNote(){
var xdt = this.selected_delivery_for_note
let dlv = this.$store.state.delivery.checked_id
dlv.push(xdt.idx)
this.$store.commit("delivery/update_checked_id",dlv)
xdt.typeform = 'note'
xdt.id = Date.now()
xdt.selected = xdt.idx
var deliveries = this.$store.state.delivery.deliveries
deliveries.push(xdt)
this.$store.commit("delivery/update_deliveries",deliveries)
this.dialog_delivery_note = false
},
addDeliveryNoteNew(){
var xdt = this.selected_delivery_for_note
xdt.typeform = 'additional'
xdt.chex = true
var deliveries = this.$store.state.delivery.data_deliveries
deliveries.push(xdt)
this.$store.commit("delivery/update_data_deliveries",deliveries)
this.dialog_delivery_note = false
}
},
computed: {
deliveries() {
return this.$store.state.delivery.data_deliveries
},
checked_id : {
get() {
return this.$store.state.delivery.checked_id
},
set(val) {
console.log(val)
this.$store.commit("delivery/update_checked_id", val)
this.$store.commit("delivery/update_deliveries_2")
}
}
},
mounted: function() {
this.$store.dispatch('delivery/search')
}
}
</script>

View File

@@ -0,0 +1,240 @@
<template>
<v-layout column>
<v-dialog
v-model="dialog_delivery_note"
width="500"
>
<v-card>
<v-card-title
class="headline blue lighten-2 white--text"
>
Catatan Pengiriman
</v-card-title>
<v-card-text>
<v-layout row>
<v-flex d-flex>
<v-textarea
outline
label="Isikan Catatan"
v-model="selected_delivery_for_note.description"
></v-textarea>
</v-flex>
</v-layout>
<v-layout row>
<v-flex d-flex>
<p class="red--text font-weight-bold caption">
Untuk pengiriman email, penambahan catatan digunakan sebagai pengganti alamat email terpilih,
jika lebih dari satu,
tulis alamat email dengan separator koma
contoh : aku@gmail.com, kamu@gmail.com, dia@gmail.com
</p>
</v-flex>
</v-layout>
<v-layout row>
<v-flex d-flex>
<p class="red--text font-weight-bold caption">
Untuk pengiriman kurir, penambahan catatan digunakan sebagai keterangan
dan tidak merubah kecamatan kelurahan,
ketika proses spk kurir
</p>
</v-flex>
</v-layout>
</v-card-text>
<v-divider></v-divider>
<v-card-actions>
<v-spacer></v-spacer>
<v-btn
color="primary"
flat
@click="addDeliveryNoteNew()"
>
Tambahkan
</v-btn>
</v-card-actions>
</v-card>
</v-dialog>
<v-layout align-center row>
<v-flex xs12>
<v-card tile flat color=" pa-2 teal lighten-4">
<h5 class=" subtitle-1 font-weight-bold">PENGIRIMAN HASIL</h5>
</v-card>
</v-flex>
</v-layout>
<v-layout mt-1 row wrap >
<v-flex class="row" ma-1 xs11 v-for="(delivery,idx) in deliveries">
<v-layout align-center row>
<v-flex xs1>
<v-btn v-if="delivery.chex === 'N'" @click="changeBoxRight(delivery,idx)" dark style="min-width:20px" small color="grey darken-1"><v-icon small>close</v-icon></v-btn>
<v-btn v-if="delivery.chex === 'Y'" @click="changeBoxRight(delivery,idx)" depressed style="min-width:20px" small color="teal lighten-4"><v-icon color="teal" small>check</v-icon></v-btn>
</v-flex>
<v-flex mb-1 pl-2 xs11>
<p :class="getColorFont(delivery)"
class="mb-0 font-weight-black"
style="font-size:11px">
{{delivery.delivery_name.toUpperCase()}}
</p>
<div v-if="delivery.description !== ''"
class="body-2 mb-1 mono caption"
v-html="reHTMLAddress(delivery.description)">
</div>
<v-textarea
v-if="delivery.chex === 'Y'"
v-model="delivery.note"
rows="1"
auto-grow
single-line
style="color:#800000;font-weight:500"
placeholder="Catatan"
hide-details
class="body-2 mb-1 mt-0 pt-0"
></v-textarea>
</v-flex>
</v-layout>
</v-flex >
</v-layout>
</v-layout>
</template>
<script>
module.exports = {
data () {
return {
dialog_delivery_note:false,
selected_delivery_for_note:{}
}
},
methods: {
reHTMLAddress(entry){
var rtn = ''
var perpart = entry.split("^")
rtn += "<p class='mb-0' style='font-size:12px'>"+perpart[0]+"</p>"
if(perpart[1])
rtn += "<p class='mb-0' style='font-size:12px'>"+perpart[1]+"</p>"
return rtn
},
changeBoxRight(value,idx){
var deliveries = this.$store.state.delivery.data_deliveries
console.log(deliveries)
deliveries[idx].chex = value.chex === 'N'?'Y':'N'
console.log(deliveries[idx].chex)
this.$store.commit("delivery/update_data_deliveries",deliveries)
},
getColorFont(value,type){
var xcolor = 'black--text'
if(value.chex === 'Y'){
xcolor = 'teal--text'
}
return xcolor
},
updateSelected(idx,val) {
console.log('idx:'+idx)
console.log('val:'+val)
var deliveries = this.$store.state.delivery.deliveries
deliveries[idx].selected = val
this.$store.commit("delivery/update_deliveries",deliveries)
},
updateDelivery(idx,val) {
var deliveries = this.$store.state.delivery.deliveries
deliveries[idx].note = val
this.$store.commit("delivery/update_deliveries",deliveries)
},
doAction(idx,val){
if(val.typeform === 'md'){
let dlv = this.$store.state.delivery.checked_id
dlv.push(val.idx)
this.$store.commit("delivery/update_checked_id",dlv)
this.selected_delivery_for_note = _.clone(val, true)
if(val.code == 'EMAIL')
this.selected_delivery_for_note.note = val.note
else
this.selected_delivery_for_note.note = ""
this.dialog_delivery_note = true
}
else{
var deliveries = this.$store.state.delivery.deliveries
deliveries.splice(idx, 1)
this.$store.commit("delivery/update_deliveries",deliveries)
}
},
doActionNew(idx,val){
if(val.typeform === 'origin'){
this.selected_delivery_for_note = _.clone(val, true)
var deliveries = this.$store.state.delivery.data_deliveries
deliveries[idx].chex = true
this.$store.commit("delivery/update_data_deliveries",deliveries)
if(val.delivery_code !== 'EMAIL')
this.selected_delivery_for_note.description = ""
this.dialog_delivery_note = true
}
else{
var deliveries = this.$store.state.delivery.data_deliveries
deliveries.splice(idx, 1)
this.$store.commit("delivery/update_data_deliveries",deliveries)
}
},
addDeliveryNote(){
var xdt = this.selected_delivery_for_note
let dlv = this.$store.state.delivery.checked_id
dlv.push(xdt.idx)
this.$store.commit("delivery/update_checked_id",dlv)
xdt.typeform = 'note'
xdt.id = Date.now()
xdt.selected = xdt.idx
var deliveries = this.$store.state.delivery.deliveries
deliveries.push(xdt)
this.$store.commit("delivery/update_deliveries",deliveries)
this.dialog_delivery_note = false
},
addDeliveryNoteNew(){
var xdt = this.selected_delivery_for_note
xdt.typeform = 'additional'
xdt.chex = true
var deliveries = this.$store.state.delivery.data_deliveries
deliveries.push(xdt)
this.$store.commit("delivery/update_data_deliveries",deliveries)
this.dialog_delivery_note = false
}
},
computed: {
deliveries() {
return this.$store.state.delivery.data_deliveries
},
checked_id : {
get() {
return this.$store.state.delivery.checked_id
},
set(val) {
console.log(val)
this.$store.commit("delivery/update_checked_id", val)
this.$store.commit("delivery/update_deliveries_2")
}
}
},
mounted: function() {
this.$store.dispatch('delivery/search')
}
}
</script>

View File

@@ -0,0 +1,174 @@
<template>
<div id="e3" style="max-width: 400px; margin: auto;" class="grey lighten-3">
<v-dialog v-model="dialog_card" width="65%">
<v-card>
<v-card-title class="teal subheading white--text pt-2 pb-2" primary-title align-center>
<span class="font-weight-thin">KARTU ANGGOTA</span>
</v-card-title>
<v-card-text class="pt-2 pb-1">
<v-layout>
<v-flex xs12>
<object :data="rpt_card" width="100%" height="512px"></object>
</v-flex>
</v-layout>
</v-card-text>
</v-card>
</v-dialog>
<v-toolbar color="pink" dark>
<v-toolbar-side-icon></v-toolbar-side-icon>
<v-toolbar-title>My Music</v-toolbar-title>
<v-spacer></v-spacer>
<v-btn icon>
<v-icon>search</v-icon>
</v-btn>
</v-toolbar>
<v-card>
<v-container fluid grid-list-lg>
<v-layout row>
<v-flex xs12>
<v-card color="cyan darken-2" class="white--text">
<v-layout>
<v-flex xs5>
<v-img :src="patient_photo" aspect-ratio="1" height="125px" class="cyan darken-2 ma-3 pa-2"
contain>
<template v-slot:placeholder>
<v-layout fill-height align-center justify-center ma-0>
<v-progress-circular indeterminate color="grey lighten-5"></v-progress-circular>
</v-layout>
</template>
</v-img>
</v-flex>
<v-flex xs7>
<v-card-title primary-title>
<div>
<div class="headline">Supermodel</div>
<div>Foster the People</div>
<div>(2014)</div>
</div>
</v-card-title>
</v-flex>
</v-layout>
<v-divider light></v-divider>
<v-card-actions class="pa-3">
<v-btn small color="primary" @click="update_photo" dark>Upload Card</v-btn>
</v-card-actions>
</v-card>
</v-flex>
</v-layout>
</v-container>
<v-container>
<!-- display debug resp.data.data from photo.js/update_resp_data -->
<div class="div">{{ ocr_resp_msg }}</div>
<div class="div">{{ ocr_resp_data }}</div>
</v-container>
</v-card>
<patient-photo-dialog></patient-photo-dialog>
</div>
</template>
<style scoped>
.v-messages {
display: none;
}
.v-input__slot {
margin-bottom: 0px;
}
</style>
<script>
module.exports = {
components: {
'patient-search-dialog': httpVueLoader('./patientSearchDialog.vue'),
'patient-history-dialog': httpVueLoader('./patientHistoryDialog.vue'),
'patient-photo-dialog': httpVueLoader('./oneDialogPhoto.vue')
},
data() {
return {
showinfo: false,
dialog_card: false,
rpt_card: ''
};
},
computed: {
diagnosa: {
get() {
return this.$store.state.order.diagnosa
},
set(val) {
this.$store.commit('order/update_diagnosa', val)
}
},
patient() {
return this.$store.state.patient.selected_patient
},
patient_note: {
get() {
return this.$store.state.order.patient_note
},
set(val) {
this.$store.commit('order/update_patient_note', val)
}
},
patient_age: {
get() {
return this.$store.state.patient.selected_patient.patient_age
},
set(v) {
return
}
},
ocr_resp_data() {
return this.$store.state.photo.resp_data
},
ocr_resp_msg() {
return this.$store.state.photo.resp_msg
},
patient_dob() {
try {
return this.$store.state.patient.selected_patient.M_PatientDOB.split('-').reverse().join('-')
} catch (e) {
}
},
patient_photo() {
return this.$store.state.photo.photo_url
},
},
methods: {
update_photo() {
this.$store.commit('photo/update_dialog_photo', true)
},
update_resp_data() {
this.$store.commit('photo/update_resp_data', true)
},
edit_patient() {
this.$store.commit('patient/update_edit', true)
this.$store.commit('patient/update_patient_new_dialog_is_active', true)
},
getHistories(visit) {
console.log(visit)
if (parseInt(visit) > 1) {
this.$store.dispatch('history/search')
}
},
generate_card() {
var xid = this.$store.state.patient.selected_patient.M_PatientID
this.rpt_card = "/birt/run?__report=report/one/fo/rpt_card.rptdesign&__format=pdf&username=admin%20&PID=" + xid
this.dialog_card = true
}
}
}
</script>

View File

@@ -0,0 +1,96 @@
<template>
<v-card class="xs12 md12 mt-2" flat>
<!-- <v-card-title primary-title class="pt-1 pb-1 pl-2 pr-2">
<div>
<h3 class="headline mb-0">Histori Pasien</h3>
</div>
</v-card-title> -->
<v-card-text class="pt-1 pb-1 pl-2 pr-2">
<v-data-table :headers="headers" :items="histories"
hide-actions class="elevation-1">
<template slot="items" slot-scope="props">
<td class="text-xs-left pa-2" >{{ format_date(props.item.T_OrderHeaderDate) }}</td>
<td class="text-xs-left pa-2" >{{ props.item.T_OrderHeaderLabNumber}}</td>
<td class="pa-2" >{{ props.item.T_TestName }}</td>
<td class="text-xs-right pa-1">
<v-btn color="primary" dark small class="one-btn-icon ma-0"
@click="getMe(props.item.T_OrderHeaderID)">
<v-icon small>save_alt</v-icon>
</v-btn>
</td>
</template>
</v-data-table>
</v-card-text>
</v-card>
</template>
<style scoped>
table.v-table tbody td,table.v-table tbody th {
height: 40px;
}
table.v-table thead tr {
height: 40px;
}
.one-btn-icon { font-size: 1.5em; float: right }
</style>
<script>
module.exports = {
computed : {
histories(){
return this.$store.state.history.histories
}
},
data() {
return {
headers: [
{
text: "TANGGAL",
align: "left",
sortable: false,
width: "20%",
class: "pa-2 blue lighten-3 white--text"
},
{
text: "NO. LAB",
align: "left",
sortable: false,
width: "20%",
class: "pa-2 blue lighten-3 white--text"
},
{
text: "PEMERIKSAAN",
align: "left",
sortable: false,
width: "50%",
class: "pa-2 blue lighten-3 white--text"
},
{
text: "USE",
align: "right",
sortable: false,
width: "10%",
class: "pa-2 blue lighten-3 white--text"
}
]
};
},
methods : {
format_date(d) {
return d.substr(0, 10).split('-').reverse().join('-')
},
getMe(id) {
this.$store.dispatch('px/search_pxs', id)
}
}
}
</script>

View File

@@ -0,0 +1,211 @@
<template>
<v-dialog
v-model="dialog"
width="65%"
>
<v-card>
<v-card-title
class="teal subheading white--text pt-2 pb-2"
primary-title
align-center
>
<span class="font-weight-thin">RIWAYAT PASIEN</span>
</v-card-title>
<v-card-text class="pt-2 pb-1">
<v-layout v-for="(history,index) in histories" @click="opendetail(history,index)" row>
<v-flex xs12>
<v-layout align-center mb-1 row>
<v-flex xs12>
<v-card flat :color="getcolorlist(history.xshow)" class="white--text pt-1 pb-1 pl-2 pr-2">
<v-layout row>
<v-flex xs10>
<h3 class="subheading">
<kbd class="mono">{{history.labnumber_ext}} | {{history.xdate}} | {{history.M_MouName}} | <span :title="history.realdoctor">{{history.M_DoctorName}}</span></kbd>
</h3>
</v-flex>
<v-flex class="text-xs-right" xs2>
<!--<v-icon v-if="history.xshow === 'N'" style="cursor:pointer" @click="opendetail(history,index)" dark>more_horiz</v-icon>
<v-icon v-if="history.xshow === 'Y'" style="cursor:pointer" @click="opendetail(history,index)" dark>minimize</v-icon>-->
</v-flex>
</v-layout>
</v-card>
</v-flex>
</v-layout>
<v-layout v-if="history.xshow === 'Y'" mb-2 row>
<v-flex xs12>
<v-card flat color="#fcac8c" class="pt-2 pb-0 pl-2 pr-2">
<v-layout row>
<v-flex class="text-xs-left" xs12>
<v-btn @click="setToOrder(history.T_OrderHeaderID)" class="mb-0 mt-0 ml-0" dark color="#3c70a4">
jadikan order
</v-btn>
</v-flex>
</v-layout>
<v-divider dark class="mt-1 mb-1"></v-divider>
<v-card>
<v-layout pl-3 pt-2 pb-2 pr-3 row>
<v-flex xs2>
<h5 class="subtitle-2">NO REG</h5>
<p class="body-1 mb-0">{{history.labnumber_ext}}</p>
</v-flex>
<v-flex xs2>
<h5 class="subtitle-2 ma-0 pa-0">TANGGAL</h5>
<p class="body-1 mb-0">{{history.xdate}}</p>
</v-flex>
<v-flex xs4>
<h5 class="subtitle-2 ma-0 pa-0">DOKTER</h5>
<p class="body-1 mb-0">{{history.M_DoctorName}}</p>
</v-flex>
<v-flex xs4>
<h5 class="subtitle-2 ma-0 pa-0">AGREEMENT</h5>
<p class="body-1 mb-0">{{history.M_MouName}}</p>
</v-flex>
</v-layout>
</v-card>
<v-divider dark class="mt-1 mb-1"></v-divider>
<v-card>
<v-layout pl-3 pt-2 pb-2 pr-3 row>
<v-flex xs6>
<h5 class="subtitle-2 ma-0 pa-0">CATATAN PASIEN</h5>
<p class="body-1 mb-0">{{history.M_PatientNote}}</p>
</v-flex>
<v-flex xs6>
<h5 class="subtitle-2 ma-0 pa-0">CATATAN FO</h5>
<p class="body-1 mb-0">{{history.T_OrderHeaderFoNote}}</p>
</v-flex>
</v-layout>
</v-card>
<v-divider dark class="mt-1 mb-1"></v-divider>
<v-layout row>
<v-flex xs12>
<v-data-table
:headers="headers"
:items="history.details"
class="elevation-1"
hide-actions
>
<template v-slot:items="props">
<td>{{ props.item.test_name }}</td>
<td class="text-xs-right">{{ props.item.str_price }}</td>
<td class="text-xs-right">{{ props.item.str_disc }}</td>
<td class="text-xs-right">{{ props.item.str_total }}</td>
</template>
<template v-slot:footer>
<td><strong>TOTAL</strong></td>
<td class="text-xs-right"><strong>{{ history.T_OrderHeaderSubTotal }}</strong></td>
<td class="text-xs-right"><strong>{{ history.total_disc }}</strong></td>
<td class="text-xs-right"><strong>{{ history.T_OrderHeaderTotal }}</strong></td>
</template>
</v-data-table>
</v-flex>
</v-layout>
<v-divider dark class="mt-1 mb-1"></v-divider>
<v-layout mb-2 pb-2 row>
<v-flex xs12>
<v-card>
<v-layout v-for="delivery in history.deliveries" pl-3 pt-2 pb-2 pr-3 row>
<v-flex xs12>
<h5 class="subtitle-2 ma-0 pa-0">{{delivery.M_DeliveryName.toUpperCase() }}</h5>
<p class="body-1 mb-0">{{delivery.T_OrderDeliveryDestination}}</p>
<p class="mb-0"><kbd>catatan : {{ delivery.xnote }}</kbd></p>
</v-flex>
</v-layout>
</v-card>
</v-flex>
</v-layout>
</v-card>
</v-flex>
</v-layout>
</v-flex>
</v-layout>
</v-card-text>
<v-divider></v-divider>
<v-card-actions>
<v-spacer></v-spacer>
<v-btn
color="grey"
flat
@click="dialog = false"
>
Tutup
</v-btn>
</v-card-actions>
</v-card>
</v-dialog>
</template>
<style scoped>
.v-list--two-line .v-list__tile {
height: 55px!important;
}
.v-dialog__container {
display: block !important;
}
</style>
<script>
module.exports = {
components : {
'patient-history': httpVueLoader('./patientHistory.vue')
},
methods : {
setToOrder(id){
this.$store.dispatch('history/get_databyorder_id', {'order_id':id})
},
getcolorlist(value){
var rtn = "teal lighten-2"
if(value === 'Y')
rtn = "#ff8a5c"
return rtn
},
opendetail(value,idx){
console.log(value.xshow)
console.log(idx)
var all = this.$store.state.history.histories
all[idx].xshow = value.xshow == 'N'?'Y':'N'
console.log(all[idx].xshow)
console.log(all)
this.$store.commit('history/update_histories',all)
}
},
computed: {
no_history() {
if (! this.$store.state.patient.selected_patient.M_PatientID) return true
return this.$store.state.history.histories.length == 0
},
dialog: {
get() {
return this.$store.state.history.history_dialog
},
set(val) {
this.$store.commit('history/update_history_dialog',val)
}
},
histories(){
return this.$store.state.history.histories
}
},
data () {
return {
headers: [
{
text: 'PEMERIKSAAN',
align: 'left',
sortable: false,
},
{ text: 'BRUTO',align: 'right',sortable: false},
{ text: 'DISKON',align: 'right',sortable: false },
{ text: 'HARGA',align: 'right',sortable: false}
]
}
},
watch : {
}
}
</script>

View File

@@ -0,0 +1,86 @@
<template>
<v-layout column fill-height>
<v-flex xs12>
<patient-detail></patient-detail>
</v-flex>
</v-layout>
</template>
<style scoped>
/* .p-left-side {
min-height: 500px;
} */
</style>
<script>
module.exports = {
components: {
'patient-search-box': httpVueLoader('./patientSearchBox.vue'),
'patient-detail': httpVueLoader('./patientDetail.vue'),
'patient-notes': httpVueLoader('./patientNotes.vue'),
},
data() {
return {
};
},
computed: {
dialog_start: {
get() {
return this.$store.state.order.dialog_start
},
set(val) {
this.$store.commit('order/update_dialog_start', val)
}
},
status_start: {
get() {
return this.$store.state.order.status_start
},
set(val) {
this.$store.commit('order/update_status_start', val)
}
},
time_start: {
get() {
return this.$store.state.order.time_start
},
set(val) {
this.$store.commit('order/update_time_start', val)
}
},
elapsedTime: {
get() {
return this.$store.state.order.elapsedTime
},
set(val) {
this.$store.commit('order/update_elapsedTime', val)
}
}
},
methods: {
start() {
this.time_start = setInterval(() => {
this.elapsedTime += 1000;
}, 1000);
this.status_start = 'Y'
// this.show_time = moment(new Date()).format('YYYY-MM-DD HH:mm:ss')
//this.dialog_start = false
this.$store.dispatch('order/get_time_start', { 'id': 0 })
},
stop() {
clearInterval(this.time_start);
},
reset() {
this.elapsedTime = 0;
}
}
}
</script>

View File

@@ -0,0 +1,582 @@
<template>
<v-dialog
persistent
v-model="dialog"
width="1000"
>
<v-btn
class="mt-1"
fab
small
slot="activator"
title="tambahkan pasien baru"
@click="new_patient"
dark
color="teal lighten-2">
<v-icon dark>add</v-icon>
</v-btn>
<v-card>
<v-card-title
class="teal lighten-2 white--text pt-2 pb-2"
primary-title
>
{{ dialog_title }}
</v-card-title>
<v-card-text class="pt-2 pb-2">
<v-layout pt-2 row>
<v-flex xs6 pr-3>
<v-layout row wrap>
<v-flex xs3 pr-1>
<v-text-field
style="font-size:12px;padding:4px 0"
v-model="patient_new.M_PatientPrefix"
label="Awalan"
></v-text-field>
</v-flex>
<v-flex xs6>
<v-text-field
style="font-size:12px;padding:4px 0"
v-model="patient_new.M_PatientName"
label="Nama Pasien"
:error="errors.name"
:rules="[rules.name]"
:disabled="edit"
></v-text-field>
</v-flex>
<v-flex xs3 pl-1>
<v-text-field
style="font-size:12px;padding:4px 0"
v-model="patient_new.M_PatientSuffix"
label="Akhiran"
></v-text-field>
</v-flex>
<v-flex xs6 pr-2>
<v-select
style="font-size:12px;padding:4px 0"
v-model="selected_sex"
:items="sex"
item-value="M_SexID"
item-text="M_SexName"
label="Jenis Kelamin"
return-object
:error="errors.sex"
:rules="[rules.sex]"
:disabled="edit"
>
</v-select>
</v-flex>
<v-flex xs6 pl-2>
<v-select
style="font-size:12px;padding:4px 0"
item-text="M_TitleName"
return-object
:items="title"
v-model="selected_title"
hide-details
label="Title"
:error="errors.title"
:rules="[rules.title]"
></v-select>
</v-flex>
<v-flex xs8 pr-3>
<v-text-field
style="font-size:12px;padding:4px 0"
v-model="patient_new.M_PatientPOB"
label="Tempat Lahir"
:error="errors.pob"
:rules="[rules.pob]"
></v-text-field>
</v-flex>
<v-flex xs4>
<v-text-field
style="font-size:12px;padding:4px 0"
v-model="patient_new.M_PatientDOB"
label="Tanggal Lahir"
return-masked-value
mask="##-##-####"
:rules="[rules.dob]"
:error="errors.dob"
v-if="dialog"
:disabled="edit"
></v-text-field>
</v-flex>
<v-flex xs6 pr-3>
<v-select
style="font-size:12px;padding:4px 0"
item-text="M_ReligionName"
return-object
:items="religions"
v-model="selected_religion"
hide-details
label="Agama"
></v-select>
</v-flex>
<v-flex xs6>
<v-text-field
style="font-size:12px;padding:4px 0"
v-model="patient_new.M_PatientHP"
label="No HP"
:error="errors.hp"
:rules="[rules.hp]"
></v-text-field>
</v-flex>
<v-flex xs12>
<v-text-field
style="font-size:12px;padding:4px 0"
v-model="my_email"
label="Email"
hint="Pisahkan dengan (koma) jika email lebih dari satu"
></v-text-field>
</v-flex>
<v-flex xs4 pr-2>
<v-select
style="font-size:12px;padding:4px 0"
v-model="selected_idtype"
:items="idtypes"
item-value="M_IdTypeID"
item-text="M_IdTypeName"
label="Tipe ID"
return-object
clearable
>
</v-select>
</v-flex>
<v-flex xs8>
<v-text-field
style="font-size:12px;padding:4px 0"
v-model="patient_new.M_PatientIDNumber"
label="Nomor ID"
></v-text-field>
</v-flex>
<v-flex xs12>
<v-textarea
style="font-size:12px;padding:4px 0"
v-model="patient_new.M_PatientNote"
label="Catatan Pasien"
auto-grow
rows="1">
</v-textarea>
</v-flex>
</v-layout>
</v-flex>
<v-flex xs6 pl-3>
<v-layout row wrap>
<v-flex xs12>
<v-autocomplete
style="font-size:12px;padding:4px 0"
:items="provinces"
item-text="M_ProvinceName"
item-value="M_ProvinceID"
label="Propinsi"
v-model="selected_province"
clearable
return-object
></v-autocomplete>
</v-flex>
<v-flex xs12>
<v-autocomplete
style="font-size:12px;padding:4px 0"
:items="cities"
item-text="M_CityName"
item-value="M_CityID"
label="Kota"
v-model="selected_city"
clearable
return-object
></v-autocomplete>
</v-flex>
<v-flex xs12>
<v-autocomplete
style="font-size:12px;padding:4px 0"
:items="districts"
item-text="M_DistrictName"
item-value="M_DistrictID"
label="Kecamatan"
v-model="selected_district"
clearable
return-object
></v-autocomplete>
</v-flex>
<v-flex xs12>
<v-autocomplete
style="font-size:12px;padding:4px 0"
:items="villages"
item-text="M_KelurahanName"
item-value="M_KelurahanID"
label="Kelurahan"
clearable
v-model="selected_village"
:error="errors.kelurahan"
:rules="[rules.kelurahan]"
return-object
></v-autocomplete>
</v-flex>
<v-flex xs12>
<v-textarea
style="font-size:12px;padding:4px 0"
auto-grow
rows="1"
v-model="patient_new.M_PatientAddressDescription"
label="Alamat"
:error="errors.address"
:rules="[rules.address]">
</v-textarea>
</v-flex>
</v-layout>
</v-flex>
</v-layout>
</v-card-text>
<v-card-actions>
<v-spacer></v-spacer>
<v-btn
color="teal"
dark
@click="add_use()"
:disabled="!btn_save_enabled"
v-show="!edit"
>
Simpan dan Gunakan
</v-btn>
<v-btn
dark
color="teal"
@click="add_new()"
v-show="edit"
:disabled="!btn_save_enabled"
>
Simpan
</v-btn>
<v-btn
color="grey"
flat
@click="dialog = false"
>
Tutup
</v-btn>
</v-card-actions>
</v-card>
</v-dialog>
</template>
<style scoped>
.v-dialog__container {
display: block !important;
}
</style>
<script>
module.exports = {
components : {
'one-date-picker' : httpVueLoader('../../common/oneDatePicker.vue')
},
data() {
return {
dialog_title: 'Data Pasien Baru',
emailRules:[],
email: value => {
const pattern = /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
return pattern.test(value) || 'Invalid e-mail.'
},
id_number: '',
my_email: '',
rules: {
dob: value => {
const pattern = /^(((0[1-9]|[12]\d|3[01])-(0[13578]|1[02])-((19|[2-9]\d)\d{2}))|((0[1-9]|[12]\d|30)-(0[13456789]|1[012])-((19|[2-9]\d)\d{2}))|((0[1-9]|1\d|2[0-8])-02-((19|[2-9]\d)\d{2}))|(29-02-((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))$/
let x = pattern.test(value)
this.errors.dob = !x
return pattern.test(value) || 'Format : dd-mm-yyyy !'
},
name: value => { this.errors.name = !value; return !!value || "Harus diisi !" },
sex: value => { this.errors.sex = !value.M_SexID; return !!value.M_SexID || "Harus diisi !" },
title: value => { this.errors.title = !value.M_TitleID; return !!value.M_TitleID || "Harus diisi !" },
pob: value => { this.errors.pob = !value; return !!value || "Harus diisi !" },
hp: value => { this.errors.hp = !value; return !!value || "Harus diisi !" },
address: value => { this.errors.address = !value; return !!value || "Harus diisi !" },
kelurahan: value => { this.errors.kelurahan = !value; return !!value || "Harus diisi !" }
},
errors: { dob: false, name: false, sex: false, title: false, hp: false,
address: false, province: false, city: false, district: false, kelurahan: false
}
}
},
computed: {
patient_new : {
get () {
return this.$store.state.patient.patient_new
},
set (v) {
this.$store.commit('patient/update_patient_new', v)
}
},
dialog: {
get() {
return this.$store.state.patient.patient_new_dialog_is_active
},
set(val) {
this.$store.commit('patient/update_patient_new_dialog_is_active', val)
}
},
sex () {
return this.$store.state.other.sex
},
selected_sex : {
get () {
return this.$store.state.other.selected_sex
},
set (val) {
this.$store.commit('other/update_selected_sex', val)
}
},
title () {
return this.$store.state.other.title
},
selected_title : {
get () {
return this.$store.state.other.selected_title
},
set (val) {
this.$store.commit('other/update_selected_title', val)
}
},
provinces () { return this.$store.state.area.provinces },
selected_province : {
get () { return this.$store.state.area.selected_province },
set (v) {
this.$store.commit('area/update_selected_area', {type:'province',val:v})
this.$store.dispatch('area/search_city')
}
},
cities () { return this.$store.state.area.cities },
selected_city : {
get () { return this.$store.state.area.selected_city },
set (v){
this.$store.commit('area/update_selected_area', {type:'city',val:v})
this.$store.dispatch('area/search_district')
}
},
districts () { return this.$store.state.area.districts },
selected_district : {
get () { return this.$store.state.area.selected_district },
set (v) { this.$store.commit('area/update_selected_area', {type:'district',val:v})
this.$store.dispatch('area/search_kelurahan') }
},
villages () { return this.$store.state.area.villages },
selected_village : {
get () {
let x = this.$store.state.area.selected_village
if (x) if(x.M_KelurahanID) this.errors.kelurahan = false
return x
},
set (v) {
this.$store.commit('area/update_selected_area', {type:'village',val:v})
let x = this.$store.state.area.selected_village
if (x) if(x.M_KelurahanID) this.errors.kelurahan = false
}
},
idtypes () {
return this.$store.state.patient.idtypes
},
selected_idtype : {
get () { return this.$store.state.patient.selected_idtype },
set (v) { this.$store.commit('patient/update_selected_idtype', v) }
},
btn_save_enabled () {
let xxx = true
if (this.errors.name || this.errors.sex || this.errors.dob ||
this.errors.title || this.errors.pob || this.errors.hp ||
this.errors.address || this.errors.kelurahan) xxx = false
if (!this.selected_village)
xxx = false
return xxx
return true
},
edit() {
return this.$store.state.patient.edit
},
selected_patient() {
return this.$store.state.patient.selected_patient
},
religions () {
return this.$store.state.other.religions
},
selected_religion : {
get () {
return this.$store.state.other.selected_religion
},
set (val) {
this.$store.commit('other/update_selected_religion', val)
}
}
},
methods : {
get_city() {
return
},
add_new (use) {
religion = 0
if(this.selected_religion)
religion = this.selected_religion.M_ReligionID
let prm = {
M_PatientName : this.patient_new.M_PatientName,
M_PatientM_TitleID : this.selected_title.M_TitleID,
M_PatientPrefix : this.patient_new.M_PatientPrefix,
M_PatientSuffix : this.patient_new.M_PatientSuffix,
M_PatientM_SexID : this.selected_sex.M_SexID,
M_PatientM_ReligionID : religion,
M_PatientPOB : this.patient_new.M_PatientPOB,
M_PatientDOB : this.patient_new.M_PatientDOB,
M_PatientHP : this.patient_new.M_PatientHP,
M_PatientPhone : this.patient_new.M_PatientPhone,
M_PatientEmail : this.my_email,
M_PatientM_IdTypeID : (this.selected_idtype ? this.selected_idtype.M_IdTypeID : 0),
M_PatientIDNumber : this.patient_new.M_PatientIDNumber,
M_PatientNote : this.patient_new.M_PatientNote,
M_PatientAddressDescription : this.patient_new.M_PatientAddressDescription,
M_PatientAddressM_KelurahanID : this.selected_village.M_KelurahanID
}
if (use || this.edit) { prm.use = true }
this.$store.dispatch('patient/add_new', prm)
this.dialog = false
},
add_use () {
this.add_new(true)
},
set_date (x) {
this.patient_new.M_PatientDOB = x.new_date
},
new_patient() {
this.$store.commit('patient/update_edit', false)
}
},
watch : {
my_email (v, o) {
if (v == "") {
this.email = value => {
return /\s/ || 'Hahaha'
}
} else {
this.email = value => {
const pattern = /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
return pattern.test(value) || 'Invalid e-mail.'
}
}
},
async dialog (val, old) {
if (val && !old) {
if (this.edit) {
this.dialog_title = 'PERUBAHAN DATA PASIEN'
let x = this.patient_new
let y = this.selected_patient
x.M_PatientPrefix = y.M_PatientPrefix
x.M_PatientName = y.M_PatientRealName
x.M_PatientSuffix = y.M_PatientSuffix
x.M_PatientDOB = y.M_PatientDOB.split('-').reverse().join('-')
x.M_PatientPOB = y.M_PatientPOB
x.M_PatientHP = y.M_PatientHP
x.M_PatientEmail = y.M_PatientEmail
x.M_PatientNote = y.M_PatientNote
x.M_PatientIDNumber = y.M_PatientIDNumber
x.M_PatientAddressDescription = y.M_PatientAddressDescription
this.my_email = y.M_PatientEmail
this.patient_new = x
console.log(this.selected_patient)
// SEX
await this.$store.dispatch("other/search_sex")
let sex = this.$store.state.other.sex
console.log("sex")
console.log(sex)
console.log(this.selected_patient.M_SexID)
let x_sexid = this.selected_patient.M_SexID
let idx_sex = _.findIndex(sex, function(o) { return parseInt(o.M_SexID) === parseInt(x_sexid) })
this.selected_sex = sex[idx_sex]
console.log('selected_sex')
console.log(this.selected_sex)
let titles = sex[idx_sex].title
this.$store.commit("other/update_title", titles)
// TITLE
//let title = this.$store.state.other.title
console.log('title')
console.log(titles)
console.log('patient title : '+this.selected_patient.M_TitleID)
let x_titleid = this.selected_patient.M_TitleID
let idx_title = _.findIndex(titles, function(o) { return parseInt(o.M_TitleID) === parseInt(x_titleid) })
console.log('idx title : '+idx_title)
this.selected_title = titles[idx_title]
console.log('selected title')
console.log(this.selected_title)
console.log(titles[idx_title])
// ID TYPE
this.selected_idtype = null
let idtype = this.$store.state.patient.idtypes
for (let i in idtype)
if (idtype[i].M_IdTypeID == y.M_PatientM_IdTypeID)
this.selected_idtype = idtype[i]
// RELIgION
let religions = this.$store.state.other.religions
let x_religionid = this.selected_patient.M_PatientM_ReligionID
let idx_religion = _.findIndex(religions, function(o) { return parseInt(o.M_ReligionID) === parseInt(x_religionid) })
this.selected_religion = religions[idx_religion]
// ERRORS
let err = { dob: false, name: false, sex: false, title: false, hp: false,
address: false, province: false, city: false, district: false, kelurahan: false}
this.errors = err
} else {
this.dialog_title = 'DATA PASIEN BARU'
let x = this.patient_new
this.my_email = ""
x.M_PatientNote = ""
x.M_PatientPrefix = ""
x.M_PatientName = ""
x.M_PatientSuffix = ""
x.M_PatientDOB = ""
x.M_PatientPOB = ""
x.M_PatientHP = ""
x.M_PatientEmail = ""
x.M_PatientAddressDescription = ""
x.M_PatientIDNumber = ""
this.patient_new = x
this.selected_sex = {}
this.selected_title = {}
this.selected_idtype = {}
this.selected_religion = {}
}
this.$store.dispatch('area/search_province')
}
}
},
mounted () {
// this.$store.dispatch('area/search_province')
this.$store.dispatch('other/search_sex')
this.$store.dispatch('other/search_religion')
this.$store.dispatch('patient/search_idtype')
// this.$store.dispatch('area/search_city')
}
}
</script>

View File

@@ -0,0 +1,42 @@
<template>
<v-card flat>
<v-divider></v-divider>
<v-card-text class="pt-1 pb-1 pl-1 pr-0">
<v-layout>
<v-flex xs12 pa-1>
<v-textarea
hide-details
outline
placeholder=""
auto-grow
label="Catatan FO"
rows="1"
v-model="catatan_fo"
></v-textarea>
</v-flex>
</v-layout>
</v-card-text>
</v-card>
</template>
<script>
module.exports = {
components : {
},
computed : {
catatan_fo: {
get() {
return this.$store.state.order.catatan_fo
},
set(val) {
this.$store.commit('order/update_catatan_fo', val)
}
}
},
}
</script>

View File

@@ -0,0 +1,449 @@
<template>
<v-card class="pa-1" height="100%">
<v-layout align-center row>
<v-flex xs12>
<v-card tile flat color=" pa-2 teal lighten-4">
<h5 class=" subtitle-1 font-weight-bold">PENGIRIM DAN BAHASA</h5>
</v-card>
</v-flex>
</v-layout>
<v-layout column>
<v-flex xs12 class="pa-2">
<v-layout>
<v-flex xs6 mr-1>
<v-autocomplete
label="Pengirim"
v-model="selected_doctor"
:items="doctors"
:search-input.sync="search"
auto-select-first
style="font-size:12px;padding:4px 0"
no-filter
return-object
clearable
item-text="M_DoctorName"
:loading="is_loading"
no-data-text="Pilih Pengirim"
hide-details
>
<template
slot="item"
slot-scope="{ item }"
>
<v-list-tile-content>
<v-list-tile-title v-text="item.M_DoctorName"></v-list-tile-title>
<v-list-tile-sub-title v-text="getAddress(item)"></v-list-tile-sub-title>
</v-list-tile-content>
</template>
</v-autocomplete>
<span class="caption">{{selected_doctor.M_DoctorNote}}</span>
</v-flex>
<v-flex xs6 ml-1>
<v-select
v-model="selected_address"
:items="doctor_address"
hide-details
style="font-size:12px;padding:4px 0"
item-text="description"
item-value="M_DoctorAddressID"
return-object
label="Alamat"
></v-select>
</v-flex>
</v-layout>
<v-layout v-if="showalias" row>
<v-flex xs12>
<v-text-field
background-color="teal lighten-4"
single-line
hide-details
v-model="doctor_alias"
style="font-size:12px;padding:4px 0"
placeholder="Isikan nama alias dokter di sini, lengkap dengan gelar"
box
></v-text-field>
</v-flex>
</v-layout>
<p v-if="showalias" class="mb-1 ma-1 mono caption"><code>* Nama alias digunakan ketika data dokter belum ada, untuk ditampilkan di nota</code></p>
<v-layout v-if="showalias" row>
<v-flex xs12>
<v-textarea
box
background-color="teal lighten-4"
style="font-size:12px;padding:4px 0"
single-line
hide-details
auto-grow
rows="1"
v-model="doctor_alias_address"
placeholder="Isikan alamat lengkap di sini"
></v-textarea>
</v-flex>
</v-layout>
<p v-if="showalias" class="mb-1 ma-1 mono caption"><code>* Isikan juga alamat dokter lengkap, untuk ditampilkan di nota</code></p>
<v-layout row mt-3>
<v-flex xs6 mr-1>
<v-select
readonly
v-model="selected_language"
:items="languages"
item-text="name"
item-value="key"
style="font-size:12px;padding:4px 0"
label="Bahasa"
return-object
></v-select>
</v-flex>
<v-flex xs6>
<v-select
v-model="selected_language_2"
:items="languages_2"
item-text="name"
item-value="key"
style="font-size:12px;padding:4px 0"
label="Bahasa 2"
return-object
clearable
></v-select>
</v-flex>
</v-layout>
</v-flex>
<v-flex xs12>
<patient-delivery></patient-delivery>
</v-flex>
</v-layout>
</v-card>
</template>
<script>
module.exports = {
components: {
'patient-delivery' : httpVueLoader('./patientDelivery.vue')
},
data() {
return {
n_mounted : 1
}
},
computed: {
doctor_alias_address:{
get(){
return this.$store.state.doctor.doctor_alias_address
},
set(val) {
this.$store.commit('doctor/update_doctor_alias_address',val)
}
},
doctor_alias:{
get(){
return this.$store.state.doctor.doctor_alias
},
set(val) {
//alert(val.M_DoctorName)
this.$store.commit('doctor/update_doctor_alias',val)
var xdoc = this.$store.state.doctor.selected_doctor
var company = this.$store.state.company.selected_company
var doctorname = xdoc.M_DoctorName.split(']')
//alert(xdoc.M_DoctorName.split(']'))
console.log(doctorname)
if(doctorname[1].trim() === '-' && company.M_CompanyName !== 'PASIEN MANDIRI'){
this.$store.commit("company/update_show_alias_doctor",true)
}
else{
this.$store.commit("company/update_show_alias_doctor",false)
this.$store.commit('doctor/update_doctor_alias','')
this.$store.commit('doctor/update_doctor_alias_address','')
}
if(company){
if(val === '' && doctorname[1].trim() === '-' && company.M_CompanyName !== 'PASIEN MANDIRI'){
this.$store.commit('doctor/update_show_doctor_alert',true)
}
else{
this.$store.commit('doctor/update_show_doctor_alert',false)
}
}
else{
this.$store.commit('doctor/update_show_doctor_alert',false)
}
}
},
search:{
get(){
return this.$store.state.doctor.search
},
set(val) {
this.$store.commit('doctor/update_search',val)
}
},
languages() {
return this.$store.state.language.languages
},
languages_2 () {
return this.$store.state.language.languages_2
},
selected_language: {
get() {
return this.$store.state.language.selected_language
},
set(val) {
this.$store.commit('language/update_selected_language', val)
// this.$store.commit('language/update_selected_language_2', null)
}
},
selected_language_2: {
get() {
return this.$store.state.language.selected_language_2
},
set(val) {
this.$store.commit('language/update_selected_language_2', val)
}
},
selected_doctor_pj: {
get() {
return this.$store.state.doctor.selected_doctor_pj
},
set(val) {
this.$store.commit('doctor/update_selected_doctor_pj',val)
}
},
doctors_pj() {
return this.$store.state.doctor.doctors_pj
},
selected_address: {
get() {
return this.$store.state.doctor.selected_address
},
set(val) {
this.$store.commit('doctor/update_selected_address', val)
}
},
doctor_address() {
if (! this.$store.state.doctor.selected_doctor ) return []
if (! this.$store.state.doctor.selected_doctor.address) return []
return this.$store.state.doctor.selected_doctor.address
},
doctors() {
return this.$store.state.doctor.doctors
},
selected_doctor: {
get() {
return this.$store.state.doctor.selected_doctor
},
set(val) {
if (val) {
this.$store.commit("doctor/update_selected_doctor", val)
// Auto CHECKED
let cdoc = val
//alert("YYY")
//this.$store.commit('delivery/update_params', {d_id:val.M_DoctorID})
//this.$store.dispatch('delivery/search')
var company = this.$store.state.company.selected_company
var doctorname = cdoc.M_DoctorName.split(' ] ')
if(doctorname[1].trim() === '-' && company.M_CompanyName !== 'PASIEN MANDIRI'){
this.$store.commit("company/update_show_alias_doctor",true)
}
else{
this.$store.commit("company/update_show_alias_doctor",false)
this.$store.commit('doctor/update_doctor_alias','')
this.$store.commit('doctor/update_doctor_alias_address','')
}
console.log(company)
if(company){
if(this.doctor_alias === '' && doctorname[1].trim() === '-' && company.M_CompanyName !== 'PASIEN MANDIRI'){
this.$store.commit('doctor/update_show_doctor_alert',true)
//alert('YYY')
}
else{
this.$store.commit('doctor/update_show_doctor_alert',false)
}
}
else{
this.$store.commit('doctor/update_show_doctor_alert',false)
}
this.$store.dispatch('delivery/search_deliveries',{type:'doctor',id:val.M_DoctorID})
} else {
this.$store.commit("doctor/update_selected_doctor", {})
this.$store.commit('delivery/update_params', {d_id:0})
this.$store.dispatch('delivery/search_deliveries',{type:'doctor',id:0})
this.$store.commit('doctor/update_show_doctor_alert',true)
}
}
},
selected_doctor_x() {
return this.$store.state.doctor.selected_doctor
},
is_loading: {
get() {
return this.$store.state.doctor.search_status == 1
},
set(val) {
this.$store.commit("doctoc/update_search_status",val ? 1 : 2)
}
},
showalias: {
get() {
return this.$store.state.company.show_alias_doctor
},
set(val) {
this.$store.commit("company/update_show_alias_doctor",val)
}
}
},
methods: {
xxxshowalias(){
var value = this.$store.state.doctor.selected_doctor
var doctorname = doctor.M_DoctorName.split(']')
var company = this.$store.state.company.selected_company
console.log(value)
if(!_.isEmpty(value)){
if(this.doctor_alias === '' && doctorname[1].trim() === '-' && company.M_CompanyName !== 'PASIEN MANDIRI')
return true
else{
this.doctor_alias = ''
this.doctor_alias_address = ''
return false
}
}
else{
this.doctor_alias = ''
this.doctor_alias_address = ''
return false
}
},
getAddress(doc) {
var s_addr = ''
if (! doc.address ) return ''
doc.address.forEach(function(addr){
if (s_addr != '') s_addr += ', '
s_addr += addr.M_DoctorAddressDescription
});
return s_addr
},
thr_search: _.debounce( function () {
if (!window.one_token()) {
this.$store.commit('update_message_error', 'Maaf, koneksi Anda sempat terputus silahkan Log Out dan Login kembali')
this.$store.commit('update_dialog_error', true)
return
}
// this.$store.commit("doctor/update_search_status", 1) // LOADING
this.$store.dispatch("doctor/search")
}, 1000),
doctorAdd() {
this.$store.commit('doctor_new/update_dialog_new', true)
}
},
watch : {
search(val, old) {
if (this.$store.state.order.is_from_clinic)
return
if (this.$store.state.doctor_new.adhoc) {
var store = this.$store
setTimeout(function() {
store.commit('doctor_new/update_adhoc', false)
delete store;
}, 2000)
return
}
this.$store.commit("doctor/update_search", val)
if (val == "" ) return
if (val == old ) return
if (! val) return
if (val.length < 2 ) return
if (this.$store.state.doctor.search_status == 1 ) return
this.thr_search()
},
selected_address(val, o) {
let dlv = this.$store.state.delivery.checked_id
if (!val) {
// REMOVE FROM DELIVERY
let idx = dlv.indexOf(o.delivery_code)
if ( idx > -1) {
dlv.splice(idx, 1)
this.$store.commit('delivery/update_checked_id', dlv)
}
}
if (val) {
// Auto CHECKED
let cadd = val
if (cadd.delivery_default == "Y") {
if (dlv.indexOf(cadd.delivery_code) < 0) {
dlv.push(cadd.delivery_code)
this.$store.commit('delivery/update_checked_id', dlv)
}
}
}
},
selected_doctor(val, o) {
let dlv = this.$store.state.delivery.checked_id
// REMOVE FROM DELIVERY
if (!val.email_default) {
let idx = dlv.indexOf(o.delivery_code)
if ( idx > -1) {
dlv.splice(idx, 1)
this.$store.commit('delivery/update_checked_id', dlv)
}
} else if (val.email_default != "Y") {
let idx = dlv.indexOf(o.delivery_code)
if ( idx > -1) {
dlv.splice(idx, 1)
this.$store.commit('delivery/update_checked_id', dlv)
}
}
}
},
mounted: function() {
this.$store.dispatch("language/search")
/*
if ( this.$store.state.doctor.mounted < 1 ) {
this.$store.dispatch("doctor/search")
this.$store.dispatch("doctor/search_pj")
this.$store.dispatch("language/search")
}
this.$store.commit("doctor/increment_mounted", 1);
console.log("doctor mounted : ", this.$store.state.doctor.mounted)
*/
}
}
</script>

View File

@@ -0,0 +1,125 @@
<template>
<v-card class="pa-2" flat>
<v-layout>
<v-flex xs2 pa-1>
<v-text-field
label="No Antrian"
placeholder="No Antrian"
single-line
outline
v-model="queue"
hide-details
@keyup.enter.native="queue_check"
></v-text-field>
</v-flex>
<v-flex xs2 pa-1>
<v-text-field
label="Search"
placeholder="PID"
single-line
outline
v-model="noreg"
@keyup.native="keyup"
hide-details
></v-text-field>
</v-flex>
<v-flex xs5 pa-1>
<v-text-field
label=""
placeholder="Nama + HP + DOB + Alamat"
v-model="search"
single-line
outline
hide-details
@keyup.native="keyup"
></v-text-field>
</v-flex>
<v-flex xs3>
<v-layout row wrap>
<v-flex xs6>
<patient-search-dialog></patient-search-dialog>
</v-flex>
<v-flex xs6>
<!-- <v-btn color="primary" class="mr-1 ml-1" block>BARU</v-btn> -->
<patient-new-dialog></patient-new-dialog>
</v-flex>
</v-layout>
</v-flex>
</v-layout>
</v-card>
</template>
<style scoped>
.v-btn {
min-width: auto;
}
.v-input__slot {
margin-bottom: 0px !important;
}
.v-messages {
display: none;
}
.v-text-field--box>.v-input__control>.v-input__slot,.v-text-field--full-width>.v-input__control>.v-input__slot,.v-text-field--outline>.v-input__control>.v-input__slot {
min-height: 44px;
}
.v-text-field--box.v-text-field--single-line input,.v-text-field--full-width.v-text-field--single-line input,.v-text-field--outline.v-text-field--single-line input {
margin-top: 6px;
}
</style>
<script>
module.exports = {
methods: {
keyup(e) {
if (e.which==13) {
this.$store.commit('patient/update_search_dialog_is_active',true)
this.$store.dispatch('patient/search')
}
},
queue_check(e) {
this.$store.dispatch('order/load_from_clinic')
}
},
computed: {
noreg: {
get() {
return this.$store.state.patient.noreg
},
set(val) {
this.$store.commit('patient/update_noreg',val)
}
},
search: {
get() {
return this.$store.state.patient.search
},
set(val) {
this.$store.commit('patient/update_search',val)
}
},
queue: {
get() {
return this.$store.state.order.queue
},
set(v) {
this.$store.commit('order/update_queue', v)
return
}
}
},
components : {
'patient-search-dialog': httpVueLoader('./patientSearchDialog.vue'),
'patient-new-dialog' : httpVueLoader('./patientNewDialog.vue')
}
}
</script>

View File

@@ -0,0 +1,185 @@
<template>
<v-card flat>
<v-layout row align-center >
<v-flex xs1 pa-1>
<patient-new-dialog></patient-new-dialog>
<!--<v-text-field
label="No Antrian"
placeholder="No Antrian"
single-line
outline
v-model="queue"
hide-details
@keyup.enter.native="queue_check"
></v-text-field>-->
</v-flex>
<v-flex xs2 pa-1>
<v-text-field
label="PID"
placeholder="PID"
single-line
class="ma-0"
outline
hide-details
v-model="noreg"
@keyup.native="keyup"
clearable
></v-text-field>
</v-flex>
<v-flex xs5 pa-1>
<v-text-field
label="Nama + HP + DOB + Alamat"
placeholder="Nama + HP + DOB + Alamat"
v-model="search"
class="ma-0"
single-line
hide-details
outline
clearable
@keyup.native="keyup"
></v-text-field>
</v-flex>
<!--<v-flex xs3>
<v-layout row wrap>
<v-flex xs6>
<v-btn
color="blue"
dark
class="one-btn-icon ma-1"
@click="search_patient"
>
<span class="icon-search"></span>
</v-btn>
</v-flex>
<v-flex xs6>
</v-flex>
</v-layout>
</v-flex>-->
<patient-search-dialog></patient-search-dialog>
</v-layout>
<v-divider v-if="showhint"></v-divider>
<v-layout row >
<v-flex xs1 pl-1 pr-1></v-flex>
<v-flex xs11 pl-1 pr-1>
<p v-if="showhint" class="mb-0 mt-1 mono caption">Tekan <kbd>enter</kbd> untuk memulai pencarian [<span class="font-weight-bold">Nama</span> + <span class="font-weight-bold">HP</span> + <span class="font-weight-bold">DOB</span> + <span class="font-weight-bold">Alamat</span>]</p>
</v-flex>
</v-layout>
</v-card>
</template>
<style scoped>
.v-btn {
min-width: auto;
}
.v-input__slot {
margin-bottom: 0px !important;
}
.v-messages {
display: none;
}
.v-text-field--box>.v-input__control>.v-input__slot,.v-text-field--full-width>.v-input__control>.v-input__slot,.v-text-field--outline>.v-input__control>.v-input__slot {
min-height: 25px!important;
padding-bottom:5px;
}
.v-text-field--box.v-text-field--single-line input,.v-text-field--full-width.v-text-field--single-line input,.v-text-field--outline.v-text-field--single-line input {
margin-top: 0px;
}
.one-btn-icon { font-size: 1.5em; height: 42px; }
</style>
<script>
module.exports = {
components : {
'patient-search-dialog': httpVueLoader('./patientSearchDialog.vue'),
'patient-new-dialog' : httpVueLoader('./patientNewDialog.vue')
},
computed: {
noreg: {
get() {
return this.$store.state.patient.noreg
},
set(val) {
this.$store.commit('patient/update_noreg',val)
}
},
search: {
get() {
return this.$store.state.patient.search
},
set(val) {
this.$store.commit('patient/update_search',val)
}
},
queue: {
get() {
return this.$store.state.order.queue
},
set(v) {
this.$store.commit('order/update_queue', v)
return
}
}
},
methods: {
keyup(e) {
this.showhint = true
if (e.which==13) {
if (!window.one_token()) {
this.$store.commit('update_message_error', 'Maaf, koneksi Anda sempat terputus silahkan Log Out dan Login kembali')
this.$store.commit('update_dialog_error', true)
return
}
var xsearch = this.$store.state.patient.search
var xnoreg = this.$store.state.patient.noreg
if (xsearch.length === 0 && xnoreg.length === 0) {
this.$store.commit('update_message_error', 'Ketika hanya kehampaan, ku tak sanggup mencari ... terlalu berat, cari tau apa yang ingin kau cari')
this.$store.commit('update_dialog_error', true)
return
}
this.showhint = false
this.$store.commit('patient/update_search_dialog_is_active',true)
var xxdata = {records:[],total:0}
this.$store.commit('patient/update_patients',xxdata)
this.$store.commit('patient/update_current_page',1)
this.$store.dispatch('patient/search')
}
},
queue_check(e) {
this.$store.dispatch('order/load_from_clinic')
},
search_patient() {
if (!window.one_token()) {
this.$store.commit('update_message_error', 'Maaf, koneksi Anda sempat terputus silahkan Log Out dan Login kembali')
this.$store.commit('update_dialog_error', true)
return
}
this.$store.commit('patient/update_current_page',1)
this.$store.commit('patient/update_search_dialog_is_active',true)
var xxdata = {records:[],total:0}
this.$store.commit('patient/update_patients',xxdata)
this.$store.dispatch('patient/search')
}
},
data() {
return {
showhint:false
};
},
}
</script>

View File

@@ -0,0 +1,74 @@
<template>
<v-dialog
v-model="dialog"
width="75%"
persistent
>
<!-- <v-btn
color="blue"
slot="activator"
dark
@click="search"
class="one-btn-icon ma-1"
>
<span class="icon-search"></span>
</v-btn> -->
<v-card>
<v-card-title
class="teal subheading white--text pt-2 pb-2"
primary-title
align-center
>
<span class="font-weight-thin">LISTING PASIEN</span>
</v-card-title>
<v-card-text class="pt-2 pb-2">
<patient-search-result></patient-search-result>
</v-card-text>
<v-divider></v-divider>
<v-card-actions>
<v-spacer></v-spacer>
<v-btn
color="grey"
flat
@click="dialog = false"
>
Tutup
</v-btn>
</v-card-actions>
</v-card>
</v-dialog>
</template>
<style scoped>
.one-btn-icon { font-size: 1.5em; height: 42px; }
</style>
<script>
module.exports = {
components : {
'patient-search-result': httpVueLoader('./patientSearchResult.vue')
},
methods : {
search: function() {
this.$store.dispatch('patient/search')
}
},
computed : {
dialog: {
get() {
return this.$store.state.patient.search_dialog_is_active;
},
set(val) {
this.$store.commit('patient/update_search_dialog_is_active',val);
}
}
},
watch : {
}
}
</script>

View File

@@ -0,0 +1,286 @@
<template>
<div>
<v-layout wrap>
<v-flex xs12 pl-0 pr-0 pt-2 pb-2>
<v-data-table
:headers="headers"
:items="patients"
:loading="isLoading"
hide-actions class="elevation-1">
<template slot="no-data">
<v-alert :value="isError" color="error" icon="warning">
Data Pasien tidak di temukan
{{errorMessage}}
</v-alert>
</template>
<template slot="items" slot-scope="props">
<td class="text-xs-left caption mono pt-1 pb-1 pl-2 " v-bind:class="{'teal lighten-4':props.item.divider === 'Y','amber lighten-4':props.item.selected}" @click="selectMe(props.item)">{{ props.item.M_PatientNoReg }}</td>
<td class="text-xs-left caption mono pa-1" v-bind:class="{'teal lighten-4':props.item.divider === 'Y','amber lighten-4':props.item.selected}" @click="selectMe(props.item)">{{ props.item.M_PatientName }}</td>
<td class="pa-1 caption mono " v-bind:class="{'teal lighten-4':props.item.divider === 'Y','amber lighten-4':props.item.selected}" @click="selectMe(props.item)">{{ props.item.hp }}</td>
<td class="text-xs-left caption mono pa-1" v-bind:class="{'teal lighten-4':props.item.divider === 'Y','amber lighten-4':props.item.selected}" @click="selectMe(props.item)">{{ props.item.dob_ina}}</td>
<td class="pa-1 caption mono " v-bind:class="{'teal lighten-4':props.item.divider === 'Y','amber lighten-4':props.item.selected}" @click="selectMe(props.item)">{{ props.item.M_PatientAddress}}</td>
</template>
</v-data-table>
<div class="text-xs-center pt-2">
<v-btn :loading="loading" dark v-if="show_more" @click="showMore()" small color="teal lighten-3">
Tampilkan lebih banyak
<template v-slot:loader>
sedang memuat ...
</template>
</v-btn>
<v-btn depressed v-if="!show_more" small color="grey lighten-2">Tidak ada lagi data</v-btn>
</div>
</v-flex>
</v-layout>
<v-dialog
persistent
v-model="dialog_birthday"
width="70%"
>
<v-card>
<v-card-title
class="headline teal white--text"
primary-title
>
HAPPY BIRTHDAY : UCAPKAN SELAMAT ULANG TAHUN KEPADA PASIEN
</v-card-title>
<v-card-text>
<v-layout row>
<v-flex xs12>
<v-img
src="../../../libs/image/hb.png"
contain
>
<v-layout
align-center
column
justify-center
>
</v-layout>
</v-img>
</v-flex>
</v-layout>
</v-card-text>
<v-divider></v-divider>
<v-card-actions>
<v-spacer></v-spacer>
<v-btn
color="primary"
flat
@click="dialog_birthday = false"
>
Tutup
</v-btn>
</v-card-actions>
</v-card>
</v-dialog>
</div>
</template>
<style scoped>
.custom-loader {
animation: loader 1s infinite;
display: flex;
}
@-moz-keyframes loader {
from {
transform: rotate(0);
}
to {
transform: rotate(360deg);
}
}
@-webkit-keyframes loader {
from {
transform: rotate(0);
}
to {
transform: rotate(360deg);
}
}
@-o-keyframes loader {
from {
transform: rotate(0);
}
to {
transform: rotate(360deg);
}
}
@keyframes loader {
from {
transform: rotate(0);
}
to {
transform: rotate(360deg);
}
}
table.v-table tbody td,table.v-table tbody th {
height: 40px;
}
table.v-table thead tr {
height: 40px;
}
</style>
<script>
module.exports = {
methods: {
showMore(){
if(!this.loading){
this.$store.commit('patient/update_loading', true)
var xnow = this.curr_page
this.curr_page = xnow + 1
}
},
selectMe(pat) {
this.$store.commit('patient/update_selected_patient', pat)
console.log(pat.info.birthday)
if(pat.info.birthday === 'Y')
this.dialog_birthday = true
this.$store.commit('patient/update_search_dialog_is_active',false)
this.$store.commit('order/update_patient_note', "")
if (pat && pat.M_PatientNote )
this.$store.commit('order/update_patient_note', pat.M_PatientNote)
this.$store.commit('order/update_catatan_fo', "")
this.$store.commit('patientaddress/testx', pat.M_PatientID);
this.$store.dispatch('patientaddress/search')
this.$store.commit('delivery/update_params', {p_id:pat.M_PatientID})
this.$store.dispatch('delivery/search_deliveries',{type:'patient',id:pat.M_PatientID})
// clear search
this.$store.commit('patient/update_search', '')
// Clear delivery
this.$store.commit('delivery/update_checked_id', [])
// Photo module
this.$store.commit('photo/update_patient_id', pat.M_PatientID)
if (pat.M_PatientPhoto == null || pat.M_PatientPhoto == "")
this.$store.commit('photo/update_photo_url', this.$store.state.photo.default_photo_url)
else
this.$store.commit('photo/update_photo_url', pat.M_PatientPhoto + "?r=" + Math.round(Math.random() * 1000000000))
// HISTORIES
//this.$store.dispatch('history/search')
}
},
computed : {
loading() {
return this.$store.state.patient.loading
},
show_more() {
return this.$store.state.patient.show_more
},
curr_page: {
get() {
return this.$store.state.patient.current_page
},
set(val) {
this.$store.commit("patient/update_current_page",val)
this.$store.dispatch('patient/search')
}
},
xtotal_page: {
get() {
return this.$store.state.patient.total_patient
},
set(val) {
this.$store.commit("patient/update_total_patient",val)
}
},
isError() {
return this.$store.state.patient.search_status == 3
},
errorMessage() {
return this.$store.state.patient.search_error_message
},
isLoading() {
return this.$store.state.patient.search_status == 1
},
patients() {
return this.$store.state.patient.patients
},
total() {
return this.$store.state.patient.total_patient
},
total_display() {
return this.$store.state.patient.total_display
},
dialog_birthday() {
return this.$store.state.patient.dialog_birthday
},
dialog_birthday: {
get() {
return this.$store.state.patient.dialog_birthday
},
set(val) {
this.$store.commit('patient/update_dialog_birthday', val)
// this.$store.commit('language/update_selected_language_2', null)
}
},
},
data() {
return {
headers: [
{
text: "NO RM",
align: "left",
sortable: false,
value: "mr",
width: "15%",
class: "pa-2 teal lighten-3 white--text"
},
{
text: "NAMA",
align: "left",
sortable: false,
value: "name",
width: "25%",
class: "pa-2 teal lighten-3 white--text"
},
{
text: "HP",
align: "left",
sortable: false,
value: "hp",
width: "15%",
class: "pa-2 teal lighten-3 white--text"
},
{
text: "DOB",
align: "left",
sortable: false,
value: "dob",
width: "15%",
class: "pa-2 teal lighten-3 white--text"
},
{
text: "ALAMAT",
align: "left",
sortable: false,
value: "address",
class: "pa-2 teal lighten-3 white--text"
}
],
};
}
}
</script>