1028 lines
45 KiB
Vue
1028 lines
45 KiB
Vue
<template>
|
|
<div>
|
|
<!-- Dialog Besar (Head) -->
|
|
<v-dialog persistent v-model="dialogJurnalTerimaBarang" width="70vw">
|
|
<v-card>
|
|
<v-card-title class="headline grey lighten-2" primary-title>
|
|
FORM JURNAL PENERIMAAN BARANG
|
|
</v-card-title>
|
|
|
|
<v-card-text>
|
|
<v-layout row wrap>
|
|
<v-flex xs6 class="px-1 mb-2">
|
|
<v-text-field label="COMPANY"
|
|
:value="xact === 'edit' ? selectedJurnal.M_BranchCompanyName : user.M_BranchCompanyName"
|
|
readonly hide-details outline></v-text-field>
|
|
</v-flex>
|
|
<v-flex xs6 class="px-1 mb-2">
|
|
<v-text-field :value="selectedJurnalType.JurnalTypeName" label="JURNAL TYPE" readonly
|
|
hide-details outline></v-text-field>
|
|
<p v-if="checkErrorFormJurnal('requireitemjurnaltype')" class="error pl-2 pr-2"
|
|
style="color:#fff">Pilih salah satu tipe jurnal</p>
|
|
</v-flex>
|
|
<v-flex xs6 class="px-1 mb-2">
|
|
<v-text-field label="REGIONAL"
|
|
:value="xact === 'edit' ? selectedJurnal.S_RegionalName : user.S_RegionalName" readonly
|
|
hide-details outline></v-text-field>
|
|
</v-flex>
|
|
<v-flex xs3 class="px-1 mb-2">
|
|
<v-menu v-model="menuFormSelectedDate" :close-on-content-click="false" :nudge-right="40"
|
|
lazy transition="scale-transition" offset-y full-width max-width="290px"
|
|
min-width="290px">
|
|
<template v-slot:activator="{ on }">
|
|
<v-text-field class="mr-2" v-model="formatedSelectedDate" label="TANGGAL" outline
|
|
hide-details readonly v-on="on"
|
|
@blur="deFormatedDate(formatedSelectedDate)"></v-text-field>
|
|
</template>
|
|
<v-date-picker v-model="selectedDate" no-title
|
|
@input="menuFormSelectedDate = false"></v-date-picker>
|
|
</v-menu>
|
|
<p v-if="checkErrorFormJurnal('requireitemdate')" class="error pl-2 pr-2"
|
|
style="color:#fff">Pilih tanggal jurnal</p>
|
|
<p v-if="checkErrorFormJurnal('dateoutofperiode')" class=" error pl-2 pr-2"
|
|
style="color:#fff">
|
|
Tanggal di luar rentang periode terpilih
|
|
</p>
|
|
</v-flex>
|
|
<v-flex xs3 class="px-1 mb-2">
|
|
<v-autocomplete :search-input.sync="searchPeriode" v-model="selectedPeriode"
|
|
:items="periodeList" item-text="displayPeriode" :loading="loadingAutocomplete"
|
|
hide-no-data hide-selected label="PERIODE" hide-details outline return-object required>
|
|
<template slot="item" slot-scope="{ item }">
|
|
<v-list-tile-content>
|
|
<v-list-tile-title v-text="item.displayPeriode"></v-list-tile-title>
|
|
<v-list-tile-sub-title v-text="item.periode"></v-list-tile-sub-title>
|
|
</v-list-tile-content>
|
|
</template>
|
|
</v-autocomplete>
|
|
<p v-if="checkErrorFormJurnal('requireitemperiode')" class="error pl-2 pr-2"
|
|
style="color:#fff">Periode harus
|
|
dipilih</p>
|
|
</v-flex>
|
|
<v-flex xs6 class="px-1 mb-2">
|
|
<v-text-field label="BRANCH"
|
|
:value="xact === 'edit' ? selectedJurnal.M_BranchName : user.M_BranchName" readonly
|
|
hide-details outline></v-text-field>
|
|
</v-flex>
|
|
<v-flex xs6 class="px-1 mb-2">
|
|
<v-text-field label="JUDUL JURNAL" v-model="jurnalTitle" hide-details outline
|
|
required></v-text-field>
|
|
<p v-if="checkErrorFormJurnal('requireitemtitle')" class="error pl-2 pr-2"
|
|
style="color:#fff">Judul harus
|
|
diisi</p>
|
|
</v-flex>
|
|
<v-flex xs4 class="px-1 mb-2">
|
|
<v-autocomplete :search-input.sync="searchSupplier" v-model="selectedSupplier"
|
|
:items="supplierList" item-text="displaySupplier" :loading="loadingAutocomplete"
|
|
label="SUPPLIER" hide-no-data hide-selected hide-details outline return-object required>
|
|
</v-autocomplete>
|
|
<p v-if="checkErrorFormJurnal('requireitemsupplier')" class="error pl-2 pr-2"
|
|
style="color:#fff">Supplier harus
|
|
dipilih</p>
|
|
</v-flex>
|
|
<v-flex xs4 class="px-1 mb-2">
|
|
<v-text-field label="GRNI No." v-model="grniValue" :disabled="invoiceValue !== ''"
|
|
:required="invoiceValue === ''" @input="handleInputInvGrni('grniValue')"></v-text-field>
|
|
</v-flex>
|
|
<v-flex xs4 class="px-1 mb-2">
|
|
<v-text-field label="INVOICE No." v-model="invoiceValue" :disabled="grniValue !== ''"
|
|
:required="grniValue === ''" @input="handleInputInvGrni('invoiceValue')"></v-text-field>
|
|
<p v-if="checkErrorFormJurnal('requireitemgrniinvoice')" class="error pl-2 pr-2"
|
|
style="color:#fff">
|
|
Isi salah satu GRNI atau Invoice
|
|
</p>
|
|
</v-flex>
|
|
<v-flex xs12 class="px-1 mb-2">
|
|
<v-text-field label="DESKRIPSI JURNAL" v-model="jurnalDescription" hide-details outline
|
|
required></v-text-field>
|
|
<p v-if="checkErrorFormJurnal('requireitemdescription')" class="error pl-2 pr-2"
|
|
style="color:#fff">Deskripsi
|
|
harus diisi</p>
|
|
</v-flex>
|
|
<v-flex xs12 class="px-1 mb-2" text-xs-right>
|
|
<v-btn small color="info" @click="openDialogAddDetail()">TAMBAH DETAIL</v-btn>
|
|
</v-flex>
|
|
|
|
<v-flex xs12 class="px-1 mb-2 mt-2">
|
|
<v-data-table :headers="detailHeader" :items="detailsJurnalTerimaBarang" hide-actions
|
|
class="elevation-1">
|
|
<template v-slot:items="props">
|
|
<td class="px-1 text-xs-center">{{ props.item.coaAccountNo }}</td>
|
|
<td class="px-1 text-xs-center">{{ props.item.coaDescription }}</td>
|
|
<td class="px-1 text-xs-right">{{ oneMoney(props.item.jurnalTxDebit)
|
|
}}
|
|
</td>
|
|
<td class="px-1 text-xs-right">{{ oneMoney(props.item.jurnalTxCredit)
|
|
}}
|
|
</td>
|
|
<td class="px-1 text-xs-center"><v-icon small
|
|
@click="deleteDetailTerimaBarang(props.item)">delete</v-icon></td>
|
|
</template>
|
|
<template v-slot:footer>
|
|
<tr>
|
|
<td colspan="2" class="font-weight-bold px-1">Total</td>
|
|
<td class="font-weight-bold px-1 text-xs-right">
|
|
{{ oneMoney(detailSum.debit) }}
|
|
</td>
|
|
<td class="font-weight-bold px-1 text-xs-right">
|
|
{{ oneMoney(detailSum.credit) }}
|
|
</td>
|
|
<td class="font-weight-bold px-1"></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="3" class="font-weight-bold px-1">
|
|
Balance
|
|
</td>
|
|
<td class="text-right font-weight-bold px-1 text-xs-right">
|
|
{{ oneMoney(detailSum.balance) }}
|
|
</td>
|
|
<td class="font-weight-bold px-1"></td>
|
|
</tr>
|
|
<tr v-if="checkErrorFormJurnal('balanceerror')">
|
|
<td colspan="5" class="text-xs-right">
|
|
<p class="error pl-2 pr-2" style="color:#fff">
|
|
Balance harus 0 sebelum disimpan. Silakan edit debit/kredit
|
|
</p>
|
|
<p class="error pl-2 pr-2" style="color:#fff">
|
|
Hanya boleh ada 1 kredit di Jurnal Penerimaan Barang
|
|
</p>
|
|
</td>
|
|
</tr>
|
|
</template>
|
|
</v-data-table>
|
|
</v-flex>
|
|
</v-layout>
|
|
</v-card-text>
|
|
|
|
<v-divider></v-divider>
|
|
|
|
<v-card-actions>
|
|
<v-spacer></v-spacer>
|
|
<v-btn color="error" flat @click="closeDialog()">
|
|
TUTUP
|
|
</v-btn>
|
|
<v-btn v-if="xact === 'add'" color="primary" @click="saveJurnalTerimaBarang()">SIMPAN</v-btn>
|
|
<v-btn v-if="xact === 'edit'" :disabled="this.$store.state.terimaBarang.isPosted === 'Y'"
|
|
color="primary" @click="saveEditJurnalTerimaBarang()">SIMPAN PERUBAHAN</v-btn>
|
|
</v-card-actions>
|
|
</v-card>
|
|
</v-dialog>
|
|
|
|
<!-- Dialog Kecil (Detail) -->
|
|
<v-dialog v-model="dialogAddDetail" persistent width="500">
|
|
<v-card>
|
|
<v-card-title class="headline grey lighten-2" primary-title>
|
|
FORM DETAIL PENERIMAAN BARANG
|
|
</v-card-title>
|
|
<v-card-text>
|
|
<v-layout wrap>
|
|
<v-flex xs12 class="px-1 mb-2">
|
|
<v-autocomplete label="No. CoA" :items="coaList" v-model="selectedCoa" hide-no-data
|
|
:search-input.sync="searchCoa" hide-details auto-select-first no-filter
|
|
item-text="coaDescription" outline return-object :loading="loadingAutocomplete"
|
|
no-data-text="Pilih Coa" clearable>
|
|
<template slot="item" slot-scope="{ item }">
|
|
<v-list-tile-content>
|
|
<v-list-tile-title v-text="item.coaDescription"></v-list-tile-title>
|
|
<v-list-tile-sub-title v-text="item.coaAccountNo"></v-list-tile-sub-title>
|
|
</v-list-tile-content>
|
|
</template>
|
|
</v-autocomplete>
|
|
<p v-if="checkErrorFormDetail('requireitemcoa')" class="error pl-2 pr-2" style="color:#fff">
|
|
CoA harus dipilih
|
|
</p>
|
|
</v-flex>
|
|
<v-flex xs12 class="px-1 mb-2">
|
|
<v-text-field
|
|
prefix="Rp"
|
|
label="Debit" v-model="formattedDebitValue" :disabled="kreditValue !== 0"
|
|
:required="kreditValue === 0" @input="handleInputDetail('debitValue')"
|
|
@focus="clearDebit" @blur="resetDebit">
|
|
</v-text-field>
|
|
</v-flex>
|
|
<v-flex xs12 class="px-1 mb-2">
|
|
<v-text-field prefix="Rp" label="Kredit" v-model="formattedKreditValue" :disabled="debitValue !== 0"
|
|
:required="kreditValue === 0" @input="handleInputDetail('kreditValue')"
|
|
@focus="clearCredit" @blur="resetCredit">
|
|
</v-text-field>
|
|
</v-flex>
|
|
<v-flex xs-12 class="px-1 mb-2">
|
|
<p v-if="checkErrorFormDetail('requireitemdebitkredit')" class="error pl-2 pr-2"
|
|
style="color:#fff">
|
|
Isi salah satu Debit / Kredit
|
|
</p>
|
|
</v-flex>
|
|
</v-layout>
|
|
</v-card-text>
|
|
|
|
<v-divider></v-divider>
|
|
|
|
<v-card-actions>
|
|
<v-spacer></v-spacer>
|
|
<v-btn color="secondary" flat @click="closeDialogAddDetail()">
|
|
TUTUP
|
|
</v-btn>
|
|
<v-btn color="primary" @click="addDetailTerimaBarang()">SIMPAN</v-btn>
|
|
</v-card-actions>
|
|
</v-card>
|
|
</v-dialog>
|
|
|
|
</div>
|
|
</template>
|
|
|
|
<style scoped></style>
|
|
|
|
<script>
|
|
module.exports = {
|
|
name: "JurnalPenerimaanBarang",
|
|
props: {
|
|
show: {
|
|
type: Boolean,
|
|
default: false,
|
|
},
|
|
},
|
|
components: {},
|
|
mounted() {
|
|
this.$store.dispatch("terimaBarang/getJurnalType");
|
|
this.$store.dispatch("terimaBarang/getPeriode");
|
|
this.$store.dispatch("terimaBarang/getSupplier");
|
|
this.$store.dispatch("terimaBarang/getCoa");
|
|
},
|
|
data: () => ({
|
|
menuFormSelectedDate: false,
|
|
dialogAddDetail: false,
|
|
detailHeader: [
|
|
{
|
|
text: "AKUN",
|
|
align: "center",
|
|
sortable: false,
|
|
value: "mr",
|
|
width: "15%",
|
|
class: "pa-2 blue lighten-3 white--text",
|
|
},
|
|
{
|
|
text: "DESKRIPSI",
|
|
align: "center",
|
|
sortable: false,
|
|
value: "lab",
|
|
width: "35%",
|
|
class: "pa-2 blue lighten-3 white--text",
|
|
},
|
|
{
|
|
text: "DEBET",
|
|
align: "center",
|
|
sortable: false,
|
|
value: "lab",
|
|
width: "20%",
|
|
class: "pa-2 blue lighten-3 white--text",
|
|
},
|
|
{
|
|
text: "KREDIT",
|
|
align: "center",
|
|
sortable: false,
|
|
value: "lab",
|
|
width: "20%",
|
|
class: "pa-2 blue lighten-3 white--text",
|
|
},
|
|
{
|
|
text: "AKSI",
|
|
align: "center",
|
|
sortable: false,
|
|
value: "lab",
|
|
width: "15%",
|
|
class: "pa-2 blue lighten-3 white--text",
|
|
}
|
|
]
|
|
}),
|
|
computed: {
|
|
formattedDebitValue: {
|
|
get() {
|
|
return this.oneMoney(this.debitValue);
|
|
},
|
|
set(value) {
|
|
// Hilangkan titik dan koma, ubah jadi number
|
|
let raw = value.replace(/\./g, '').replace(',', '.');
|
|
this.debitValue = parseFloat(raw) || 0;
|
|
}
|
|
},
|
|
formattedKreditValue: {
|
|
get() {
|
|
return this.oneMoney(this.kreditValue);
|
|
},
|
|
set(value) {
|
|
// Hilangkan titik dan koma, ubah jadi number
|
|
let raw = value.replace(/\./g, '').replace(',', '.');
|
|
this.kreditValue = parseFloat(raw) || 0;
|
|
}
|
|
},
|
|
dialogJurnalTerimaBarang: {
|
|
get() {
|
|
return this.$store.state.terimaBarang.dialogJurnalTerimaBarang;
|
|
},
|
|
set(value) {
|
|
this.$store.commit("terimaBarang/update_dialogJurnalTerimaBarang", value);
|
|
},
|
|
},
|
|
|
|
user() {
|
|
console.log("user", this.$store.state.terimaBarang.user);
|
|
return this.$store.state.terimaBarang.user;
|
|
},
|
|
|
|
selectedJurnalType() {
|
|
if (this.xact == 'edit') {
|
|
return this.$store.state.terimaBarang.selectedJurnalType;
|
|
} else {
|
|
return this.$store.state.jurnalumum.x_drop_tipe_jurnal;
|
|
}
|
|
},
|
|
|
|
jurnalTypeList() {
|
|
return this.$store.state.terimaBarang.jurnalTypeList;
|
|
},
|
|
|
|
searchPeriode: {
|
|
get() {
|
|
return this.$store.state.terimaBarang.searchPeriode;
|
|
},
|
|
set(value) {
|
|
this.$store.commit("terimaBarang/update_searchPeriode", value);
|
|
}
|
|
},
|
|
selectedPeriode: {
|
|
get() {
|
|
return this.$store.state.terimaBarang.selectedPeriode;
|
|
},
|
|
set(val) {
|
|
this.$store.commit("terimaBarang/update_selectedPeriode", val);
|
|
}
|
|
},
|
|
|
|
selectedDate: {
|
|
get() {
|
|
return this.$store.state.terimaBarang.selectedDate;
|
|
},
|
|
set(value) {
|
|
this.$store.commit("terimaBarang/update_selectedDate", value);
|
|
}
|
|
},
|
|
isSelectedDateValid() {
|
|
return this.isDateInRange(this.selectedDate, this.selectedPeriode.periodeStartDate, this.selectedPeriode.periodeEndDate);
|
|
},
|
|
|
|
formatedSelectedDate() {
|
|
return this.formatDate(this.selectedDate);
|
|
},
|
|
|
|
|
|
periodeList() {
|
|
return this.$store.state.terimaBarang.periodeList;
|
|
},
|
|
|
|
loadingAutocomplete: {
|
|
get() {
|
|
return this.$store.state.terimaBarang.loadingAutocomplete;
|
|
},
|
|
set(val) {
|
|
this.$store.commit("terimaBarang/update_loadingAutocomplete", val);
|
|
}
|
|
},
|
|
|
|
jurnalTitle: {
|
|
get() {
|
|
return this.$store.state.terimaBarang.jurnalTitle;
|
|
},
|
|
set(val) {
|
|
this.$store.commit("terimaBarang/update_jurnalTitle", val);
|
|
}
|
|
},
|
|
|
|
searchSupplier: {
|
|
get() {
|
|
return this.$store.state.terimaBarang.searchSupplier;
|
|
},
|
|
set(val) {
|
|
this.$store.commit("terimaBarang/update_searchSupplier", val);
|
|
}
|
|
},
|
|
selectedSupplier: {
|
|
get() {
|
|
return this.$store.state.terimaBarang.selectedSupplier;
|
|
},
|
|
set(val) {
|
|
this.$store.commit("terimaBarang/update_selectedSupplier", val);
|
|
}
|
|
},
|
|
supplierList() {
|
|
return this.$store.state.terimaBarang.supplierList;
|
|
},
|
|
|
|
grniValue: {
|
|
get() {
|
|
return this.$store.state.terimaBarang.grniValue;
|
|
},
|
|
set(val) {
|
|
this.$store.commit("terimaBarang/update_grniValue", val);
|
|
}
|
|
},
|
|
invoiceValue: {
|
|
get() {
|
|
return this.$store.state.terimaBarang.invoiceValue;
|
|
},
|
|
set(val) {
|
|
this.$store.commit("terimaBarang/update_invoiceValue", val);
|
|
}
|
|
},
|
|
|
|
jurnalDescription: {
|
|
get() {
|
|
return this.$store.state.terimaBarang.jurnalDescription;
|
|
},
|
|
set(val) {
|
|
this.$store.commit("terimaBarang/update_jurnalDescription", val);
|
|
}
|
|
},
|
|
|
|
searchCoa: {
|
|
get() {
|
|
return this.$store.state.terimaBarang.searchCoa;
|
|
},
|
|
set(val) {
|
|
this.$store.commit("terimaBarang/update_searchCoa", val);
|
|
}
|
|
},
|
|
coaList() {
|
|
return this.$store.state.terimaBarang.coaList;
|
|
},
|
|
selectedCoa: {
|
|
get() {
|
|
return this.$store.state.terimaBarang.selectedCoa;
|
|
},
|
|
set(val) {
|
|
this.$store.commit("terimaBarang/update_selectedCoa", val);
|
|
}
|
|
},
|
|
|
|
debitValue: {
|
|
get() {
|
|
return this.$store.state.terimaBarang.debitValue;
|
|
},
|
|
set(val) {
|
|
this.$store.commit("terimaBarang/update_debitValue", val);
|
|
}
|
|
},
|
|
kreditValue: {
|
|
get() {
|
|
return this.$store.state.terimaBarang.kreditValue;
|
|
},
|
|
set(val) {
|
|
this.$store.commit("terimaBarang/update_kreditValue", val);
|
|
}
|
|
},
|
|
detailsJurnalTerimaBarang: {
|
|
get() {
|
|
return this.$store.state.terimaBarang.detailsJurnalTerimaBarang;
|
|
},
|
|
set(val) {
|
|
this.$store.commit("terimaBarang/update_detailsJurnalTerimaBarang", val);
|
|
}
|
|
},
|
|
detailSum() {
|
|
return this.$store.state.terimaBarang.detailSum;
|
|
},
|
|
|
|
xact: {
|
|
get() {
|
|
return this.$store.state.terimaBarang.act
|
|
},
|
|
set(val) {
|
|
this.$store.commit("terimaBarang/update_actForm", val)
|
|
}
|
|
},
|
|
|
|
selectedJurnal() {
|
|
return this.$store.state.terimaBarang.selectedJurnal
|
|
},
|
|
|
|
},
|
|
methods: {
|
|
roundToThreeSignificantDigits(num) {
|
|
if (num === 0) return 0;
|
|
|
|
// Hitung jumlah digit
|
|
const absNum = Math.abs(num);
|
|
const magnitude = Math.floor(Math.log10(absNum)) + 1;
|
|
|
|
// Jika kurang dari 3 digit, tidak perlu dibulatkan
|
|
if (magnitude <= 3) return num;
|
|
|
|
// Hitung faktor pembulatan
|
|
const factor = Math.pow(10, magnitude - 3);
|
|
|
|
// Bulatkan
|
|
return Math.round(num / factor) * factor;
|
|
},
|
|
oneMoney(value){
|
|
//return one_money(value);
|
|
let splitValue = value.toString().split(".");
|
|
if(splitValue.length > 1) {
|
|
let val = splitValue[0]
|
|
return val.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ".") + "," + this.roundToThreeSignificantDigits(splitValue[1]);
|
|
} else {
|
|
return value.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ".");
|
|
}
|
|
},
|
|
convertMoney(money){
|
|
return one_money(money)
|
|
},
|
|
formatAngka(nilai) {
|
|
// Jika tidak ada nilai
|
|
if (!nilai) return '';
|
|
|
|
try {
|
|
// Ubah ke string
|
|
let strNilai = String(nilai);
|
|
|
|
// Jika berisi titik desimal
|
|
if (strNilai.includes('.')) {
|
|
// Split bagian utama dan desimal
|
|
let bagian = strNilai.split('.');
|
|
let utama = bagian[0];
|
|
let desimal = bagian[1];
|
|
|
|
// Format bagian utama
|
|
utama = utama.replace(/\B(?=(\d{3})+(?!\d))/g, '.');
|
|
|
|
// Kembalikan gabungan
|
|
return utama + ',' + desimal;
|
|
} else {
|
|
// Tidak ada desimal, hanya format bagian utama
|
|
return strNilai.replace(/\B(?=(\d{3})+(?!\d))/g, '.');
|
|
}
|
|
} catch (error) {
|
|
console.error("Error formatting:", error);
|
|
return nilai;
|
|
}
|
|
},
|
|
closeDialog() {
|
|
this.$store.commit("terimaBarang/update_dialogJurnalTerimaBarang", false)
|
|
this.$store.commit("terimaBarang/update_actForm", '')
|
|
// reset all state in form
|
|
this.$store.commit("terimaBarang/update_selectedJurnalType", {})
|
|
this.$store.commit("terimaBarang/update_selectedPeriode", {})
|
|
this.$store.commit("terimaBarang/update_selectedDate", '')
|
|
this.$store.commit("terimaBarang/update_jurnalTitle", '')
|
|
this.$store.commit("terimaBarang/update_selectedSupplier", {})
|
|
this.$store.commit("terimaBarang/update_grniValue", '')
|
|
this.$store.commit("terimaBarang/update_invoiceValue", '')
|
|
this.$store.commit("terimaBarang/update_jurnalDescription", '')
|
|
this.$store.commit("terimaBarang/update_detailsJurnalTerimaBarang", [])
|
|
this.$store.commit("terimaBarang/update_detailSum", {
|
|
debit: 0,
|
|
credit: 0,
|
|
balance: 0
|
|
})
|
|
this.$store.commit("jurnalumum/update_x_drop_tipe_jurnal", {})
|
|
},
|
|
isDateInRange(selectedDate, startDate, endDate) {
|
|
if (!this.selectedPeriode) return true; // If periode is not selected, return true dulu
|
|
|
|
if (!selectedDate || !startDate || !endDate) {
|
|
return false; // If any date is missing, return false
|
|
}
|
|
return selectedDate >= startDate && selectedDate <= endDate;
|
|
},
|
|
formatDate(date) {
|
|
if (!date) return null;
|
|
|
|
const [year, month, day] = date.split("-");
|
|
return `${day}/${month}/${year}`;
|
|
},
|
|
deFormatedDate(date) {
|
|
if (!date) return null;
|
|
|
|
const [day, month, year] = date.split("-");
|
|
return `${year}-${month.padStart(2, "0")}-${day.padStart(2, "0")}`;
|
|
},
|
|
handleInputInvGrni(input) {
|
|
if (input === 'grniValue') {
|
|
this.invoiceValue = ''; // Reset invoiceValue if grniValue is being inputed
|
|
} else if (input === 'invoiceValue') {
|
|
this.grniValue = ''; // Reset grniValue if invoiceValue is being inputed
|
|
}
|
|
},
|
|
thr_search_periode: _.debounce(function () {
|
|
this.$store.dispatch("terimaBarang/getPeriode", this.searchPeriode)
|
|
}, 1000),
|
|
thr_search_supplier: _.debounce(function () {
|
|
this.$store.dispatch("terimaBarang/getSupplier", this.searchSupplier)
|
|
}, 1000),
|
|
|
|
openDialogAddDetail() {
|
|
this.$store.commit("terimaBarang/update_errorsAddJurnal", []);
|
|
var errTambah = this.$store.state.terimaBarang.errorsAddJurnal;
|
|
if (_.isEmpty(this.selectedJurnalType)) {
|
|
errTambah.push("requireitemjurnaltype")
|
|
}
|
|
if (_.isEmpty(this.selectedPeriode)) {
|
|
errTambah.push("requireitemperiode")
|
|
}
|
|
if (_.isEmpty(this.selectedDate)) {
|
|
errTambah.push("requireitemdate")
|
|
}
|
|
if (_.isEmpty(this.jurnalTitle)) {
|
|
errTambah.push("requireitemtitle")
|
|
}
|
|
if (_.isEmpty(this.selectedSupplier)) {
|
|
errTambah.push("requireitemsupplier")
|
|
}
|
|
if (_.isEmpty(this.grniValue) && _.isEmpty(this.invoiceValue)) {
|
|
errTambah.push("requireitemgrniinvoice")
|
|
}
|
|
if (_.isEmpty(this.jurnalDescription)) {
|
|
errTambah.push("requireitemdescription")
|
|
}
|
|
// Validate selectedDate in range periodeStartDate and periodeEndDate
|
|
if (!this.isSelectedDateValid) {
|
|
errTambah.push("dateoutofperiode")
|
|
}
|
|
|
|
if (errTambah.length === 0) {
|
|
this.$store.commit("terimaBarang/update_coaList", []);
|
|
this.dialogAddDetail = true; // If there is no error, open dialog
|
|
}
|
|
},
|
|
closeDialogAddDetail() {
|
|
this.dialogAddDetail = false;
|
|
},
|
|
thr_searchCoa: _.debounce(function () {
|
|
this.$store.dispatch("terimaBarang/getCoa", this.searchCoa);
|
|
}, 2000),
|
|
|
|
handleInputDetail(input) {
|
|
if (input === 'debitValue') {
|
|
this.kreditValue = 0; // Reset kreditValue if debitValue is being inputd
|
|
} else if (input === 'kreditValue') {
|
|
this.debitValue = 0; // Reset debitValue if kreditValue is being inputd
|
|
}
|
|
},
|
|
clearDebit() {
|
|
if (this.debitValue === 0) {
|
|
this.debitValue = '';
|
|
}
|
|
},
|
|
resetDebit() {
|
|
if (this.debitValue === '' || this.debitValue === null) {
|
|
this.debitValue = 0;
|
|
}
|
|
},
|
|
clearCredit() {
|
|
if (this.kreditValue === 0) {
|
|
this.kreditValue = '';
|
|
}
|
|
},
|
|
resetCredit() {
|
|
if (this.kreditValue === '' || this.kreditValue === null) {
|
|
this.kreditValue = 0;
|
|
}
|
|
},
|
|
|
|
addDetailTerimaBarang() {
|
|
this.$store.commit("terimaBarang/update_errorsAddDetail", []);
|
|
var errDetail = this.$store.state.terimaBarang.errorsAddDetail;
|
|
// if (_.isEmpty(this.debitValue) && _.isEmpty(this.kreditValue)) {
|
|
// errDetail.push("requireitemdebitkredit")
|
|
// }
|
|
if (_.isEmpty(this.selectedCoa)) {
|
|
errDetail.push("requireitemcoa")
|
|
}
|
|
// if (!_.isEmpty(this.debitValue) && !_.isEmpty(this.kreditValue)) {
|
|
// errDetail.push("requireitemdebitkredit")
|
|
// }
|
|
const isDebitValid = this.debitValue !== null && this.debitValue !== undefined && this.debitValue !== '' && parseFloat(this.debitValue) > 0;
|
|
const isKreditValid = this.kreditValue !== null && this.kreditValue !== undefined && this.kreditValue !== '' && parseFloat(this.kreditValue) > 0;
|
|
if (!isDebitValid && !isKreditValid) {
|
|
errDetail.push("requireitemdebitkredit");
|
|
}
|
|
|
|
if (isDebitValid && isKreditValid) {
|
|
errDetail.push("requireitemdebitkredit");
|
|
}
|
|
|
|
if (errDetail.length === 0) {
|
|
this.$store.commit("terimaBarang/update_errorsAddDetail", []);
|
|
let detailsJurnalTerimaBarang = this.detailsJurnalTerimaBarang
|
|
|
|
// Jika Debit
|
|
if (_.isEmpty(this.kreditValue)) {
|
|
// TODO: Validate selectedCoa.coatype juga harus debit
|
|
|
|
detailsJurnalTerimaBarang.push({
|
|
coaID: this.selectedCoa.coaID,
|
|
coaDescription: this.selectedCoa.coaDescription,
|
|
jurnalTxDebit: this.debitValue,
|
|
jurnalTxCredit: this.kreditValue,
|
|
coaAccountNo: this.selectedCoa.coaAccountNo
|
|
})
|
|
}
|
|
// Jika Credit
|
|
else if (_.isEmpty(this.debitValue)) {
|
|
// TODO: Validate selectedCoa.coatype juga harus credit
|
|
|
|
let addOns = {}
|
|
// Jika ada GRNI pakai grni value jika tidak pakai invoice value
|
|
if (!_.isEmpty(this.grniValue)) {
|
|
addOns = [
|
|
{
|
|
jurnalAddOnCode: "SUPCD",
|
|
jurnalAddOnValue: this.selectedSupplier.SupplierCode
|
|
},
|
|
{
|
|
jurnalAddOnCode: "GRNIGR",
|
|
jurnalAddOnValue: this.grniValue
|
|
}
|
|
]
|
|
} else {
|
|
addOns = [
|
|
{
|
|
jurnalAddOnCode: "SUPCD",
|
|
jurnalAddOnValue: this.selectedSupplier.SupplierCode
|
|
},
|
|
{
|
|
jurnalAddOnCode: "INVGR",
|
|
jurnalAddOnValue: this.invoiceValue
|
|
}
|
|
]
|
|
|
|
}
|
|
detailsJurnalTerimaBarang.push({
|
|
coaID: this.selectedCoa.coaID,
|
|
coaDescription: this.selectedCoa.coaDescription,
|
|
jurnalTxDebit: this.debitValue,
|
|
jurnalTxCredit: this.kreditValue,
|
|
addOns: addOns,
|
|
coaAccountNo: this.selectedCoa.coaAccountNo
|
|
})
|
|
}
|
|
|
|
if (this.detailsJurnalTerimaBarang.length > 0) {
|
|
this.closeDialogAddDetail();
|
|
this.selectedCoa = null;
|
|
this.debitValue = 0;
|
|
this.kreditValue = 0;
|
|
}
|
|
|
|
// foreach item in detailsJurnalTerimaBarang then sum debit, credit, and balance
|
|
let totalDebit = 0, totalCredit = 0, totalBalance = 0;
|
|
|
|
let summaryPre = {
|
|
debit: totalDebit,
|
|
credit: totalCredit,
|
|
balance: totalBalance
|
|
}
|
|
|
|
detailsJurnalTerimaBarang.forEach(item => {
|
|
totalDebit += parseFloat(item.jurnalTxDebit);
|
|
totalCredit += parseFloat(item.jurnalTxCredit);
|
|
});
|
|
totalBalance = totalDebit - totalCredit;
|
|
let summary = {
|
|
debit: totalDebit,
|
|
credit: totalCredit,
|
|
balance: totalBalance
|
|
}
|
|
this.$store.commit("terimaBarang/update_detailSum", summary);
|
|
}
|
|
|
|
},
|
|
deleteDetailTerimaBarang(item) {
|
|
const index = this.detailsJurnalTerimaBarang.findIndex(
|
|
(detail) => detail.coaID === item.coaID && detail.jurnalTxDebit === item.jurnalTxDebit && detail.jurnalTxCredit === item.jurnalTxCredit
|
|
);
|
|
if (index !== -1) {
|
|
this.detailsJurnalTerimaBarang.splice(index, 1); // remove one element on index=index
|
|
console.log("details after delete: ", this.detailsJurnalTerimaBarang)
|
|
// recalculate summary
|
|
let totalDebit = 0, totalCredit = 0, totalBalance = 0;
|
|
this.detailsJurnalTerimaBarang.forEach(item => {
|
|
totalDebit += parseFloat(item.jurnalTxDebit);
|
|
totalCredit += parseFloat(item.jurnalTxCredit);
|
|
});
|
|
totalBalance = totalDebit - totalCredit;
|
|
let summary = {
|
|
debit: totalDebit,
|
|
credit: totalCredit,
|
|
balance: totalBalance
|
|
}
|
|
this.$store.commit("terimaBarang/update_detailSum", summary);
|
|
}
|
|
},
|
|
|
|
checkErrorFormDetail(value) {
|
|
var errors = this.$store.state.terimaBarang.errorsAddDetail
|
|
if (errors.includes(value)) {
|
|
return true
|
|
} else {
|
|
return false
|
|
}
|
|
},
|
|
|
|
checkErrorFormJurnal(value) {
|
|
var errTambah = this.$store.state.terimaBarang.errorsAddJurnal;
|
|
if (errTambah.includes(value)) {
|
|
return true
|
|
} else {
|
|
return false
|
|
}
|
|
},
|
|
formatCurrency(value) {
|
|
if (
|
|
value === null ||
|
|
value === undefined ||
|
|
value === "" ||
|
|
value == NaN
|
|
)
|
|
return "";
|
|
return (
|
|
"Rp " +
|
|
parseFloat(value).toLocaleString("id-ID", {
|
|
minimumFractionDigits: 2,
|
|
maximumFractionDigits: 2,
|
|
})
|
|
);
|
|
},
|
|
|
|
|
|
saveJurnalTerimaBarang() {
|
|
this.$store.commit("terimaBarang/update_errorsAddJurnal", []);
|
|
var errTambah = this.$store.state.terimaBarang.errorsAddJurnal;
|
|
if (_.isEmpty(this.selectedJurnalType)) {
|
|
errTambah.push("requireitemjurnaltype")
|
|
}
|
|
if (_.isEmpty(this.selectedPeriode)) {
|
|
errTambah.push("requireitemperiode")
|
|
}
|
|
if (_.isEmpty(this.selectedDate)) {
|
|
errTambah.push("requireitemdate")
|
|
}
|
|
if (_.isEmpty(this.jurnalTitle)) {
|
|
errTambah.push("requireitemtitle")
|
|
}
|
|
if (_.isEmpty(this.selectedSupplier)) {
|
|
errTambah.push("requireitemsupplier")
|
|
}
|
|
if (_.isEmpty(this.grniValue) && _.isEmpty(this.invoiceValue)) {
|
|
errTambah.push("requireitemgrniinvoice")
|
|
}
|
|
if (_.isEmpty(this.jurnalDescription)) {
|
|
errTambah.push("requireitemdescription")
|
|
}
|
|
|
|
// Validasi Balance
|
|
if (this.detailSum.balance !== 0) {
|
|
errTambah.push("balanceerror")
|
|
}
|
|
|
|
// Validasi hanya boleh ada 1 kredit
|
|
let creditCount = 0;
|
|
this.detailsJurnalTerimaBarang.forEach(item => {
|
|
if (item.isCredit || item.jurnalTxCredit > 0) {
|
|
creditCount++;
|
|
}
|
|
});
|
|
if (creditCount > 1) {
|
|
errTambah.push("creditcounterror")
|
|
}
|
|
|
|
if (errTambah.length === 0) {
|
|
this.$store.commit("terimaBarang/update_errorsAddJurnal", []);
|
|
let prm = {
|
|
M_BranchCompanyID: this.user.M_BranchCompanyID,
|
|
M_BranchID: this.user.M_BranchID,
|
|
S_RegionalID: this.user.S_RegionalID,
|
|
periodeID: this.selectedPeriode.periodeID,
|
|
jurnalTitle: this.jurnalTitle,
|
|
jurnalTypeID: this.selectedJurnalType.JurnalTypeID,
|
|
jurnalDescription: this.jurnalDescription,
|
|
jurnalDate: this.selectedDate,
|
|
details: this.detailsJurnalTerimaBarang
|
|
}
|
|
this.$store.dispatch("terimaBarang/saveJurnal", prm) // NOTE: comment untuk debugging
|
|
console.log("SubmitJurnal", prm)
|
|
this.detailsJurnalTerimaBarang = [];
|
|
this.$store.commit("terimaBarang/update_detailSum", {
|
|
debit: 0,
|
|
credit: 0,
|
|
balance: 0
|
|
});
|
|
this.$store.commit("terimaBarang/update_selectedJurnalType", {});
|
|
this.$store.commit("terimaBarang/update_selectedPeriode", {});
|
|
// this.$store.commit("terimaBarang/update_selectedDate", {});
|
|
this.$store.commit("terimaBarang/update_jurnalTitle", "");
|
|
this.$store.commit("terimaBarang/update_selectedSupplier", {});
|
|
this.$store.commit("terimaBarang/update_grniValue", "");
|
|
this.$store.commit("terimaBarang/update_invoiceValue", "");
|
|
this.$store.commit("terimaBarang/update_jurnalDescription", "");
|
|
this.closeDialog();
|
|
}
|
|
},
|
|
saveEditJurnalTerimaBarang() {
|
|
this.$store.commit("terimaBarang/update_errorsAddJurnal", []);
|
|
var errTambah = this.$store.state.terimaBarang.errorsAddJurnal;
|
|
if (_.isEmpty(this.selectedJurnalType)) {
|
|
errTambah.push("requireitemjurnaltype")
|
|
}
|
|
if (_.isEmpty(this.selectedPeriode)) {
|
|
errTambah.push("requireitemperiode")
|
|
}
|
|
if (_.isEmpty(this.selectedDate)) {
|
|
errTambah.push("requireitemdate")
|
|
}
|
|
if (_.isEmpty(this.jurnalTitle)) {
|
|
errTambah.push("requireitemtitle")
|
|
}
|
|
if (_.isEmpty(this.selectedSupplier)) {
|
|
errTambah.push("requireitemsupplier")
|
|
}
|
|
if (_.isEmpty(this.grniValue) && _.isEmpty(this.invoiceValue)) {
|
|
errTambah.push("requireitemgrniinvoice")
|
|
}
|
|
if (_.isEmpty(this.jurnalDescription)) {
|
|
errTambah.push("requireitemdescription")
|
|
}
|
|
|
|
// Validasi Balance
|
|
if (this.detailSum.balance !== 0) {
|
|
errTambah.push("balanceerror")
|
|
}
|
|
|
|
// Validasi hanya boleh ada 1 kredit
|
|
let creditCount = 0;
|
|
this.detailsJurnalTerimaBarang.forEach(item => {
|
|
if (item.isCredit || item.jurnalTxCredit > 0) {
|
|
creditCount++;
|
|
}
|
|
});
|
|
if (creditCount > 1) {
|
|
errTambah.push("creditcounterror")
|
|
}
|
|
|
|
if (errTambah.length === 0) {
|
|
this.$store.commit("terimaBarang/update_errorsAddJurnal", []);
|
|
let prm = {
|
|
jurnalID: this.selectedJurnal.jurnalID,
|
|
M_BranchCompanyID: this.selectedJurnal.M_BranchCompanyID,
|
|
M_BranchID: this.selectedJurnal.M_BranchID,
|
|
S_RegionalID: this.selectedJurnal.S_RegionalID,
|
|
periodeID: this.selectedPeriode.periodeID,
|
|
jurnalTitle: this.jurnalTitle,
|
|
jurnalTypeID: this.selectedJurnalType.JurnalTypeID,
|
|
jurnalDescription: this.jurnalDescription,
|
|
jurnalDate: this.selectedDate,
|
|
details: this.detailsJurnalTerimaBarang
|
|
}
|
|
this.$store.dispatch("terimaBarang/updateJurnal", prm) // NOTE: comment untuk debugging
|
|
console.log("SubmitEditJurnal", prm)
|
|
this.detailsJurnalTerimaBarang = [];
|
|
this.$store.commit("terimaBarang/update_detailSum", {
|
|
debit: 0,
|
|
credit: 0,
|
|
balance: 0
|
|
});
|
|
this.$store.commit("terimaBarang/update_selectedJurnalType", {});
|
|
this.$store.commit("terimaBarang/update_selectedPeriode", {});
|
|
// this.$store.commit("terimaBarang/update_selectedDate", {});
|
|
this.$store.commit("terimaBarang/update_jurnalTitle", "");
|
|
this.$store.commit("terimaBarang/update_selectedSupplier", {});
|
|
this.$store.commit("terimaBarang/update_grniValue", "");
|
|
this.$store.commit("terimaBarang/update_invoiceValue", "");
|
|
this.$store.commit("terimaBarang/update_jurnalDescription", "");
|
|
this.closeDialog();
|
|
}
|
|
},
|
|
},
|
|
watch: {
|
|
searchPeriode(val, old) {
|
|
if (val == old) return;
|
|
if (!val) return;
|
|
if (val.length < 1) return;
|
|
if (this.$store.state.terimaBarang.loadingAutocomplete == 1) return; // sedang ada query lain yang loading
|
|
this.thr_search_periode(); // Tunggu 2 detik setelah input sebelum request search lagi
|
|
},
|
|
searchSupplier(val, old) {
|
|
if (val == old) return;
|
|
if (!val) return;
|
|
if (val.length < 1) return;
|
|
if (this.$store.state.terimaBarang.loadingAutocomplete == 1) return;
|
|
this.thr_search_supplier();
|
|
},
|
|
searchCoa(val, old) {
|
|
if (val == old) return;
|
|
if (!val) return;
|
|
if (val.length < 1) return;
|
|
if (this.$store.state.terimaBarang.loadingAutocomplete == 1) return;
|
|
this.thr_searchCoa();
|
|
},
|
|
},
|
|
};
|
|
</script> |