Files
fe-accone/test/vuex/acc-one-jurnal/components/jurnalgaji.vue

1526 lines
48 KiB
Vue

<template>
<div>
<v-snackbar
:color="snackbar.color"
v-model="snackbar.state"
:timeout="5000"
top
>
{{ snackbar.msg }}
<v-btn flat @click="snackbar.state = false">
Close
</v-btn>
</v-snackbar>
<v-dialog v-model="dialogAddDetail" persistent width="500">
<v-card>
<v-card-title class="headline grey lighten-2" primary-title>
FORM DETAIL
</v-card-title>
<v-card-text>
<v-autocomplete
v-model="selectedBranchDetail"
:items="defaultBranch"
:loading="loadingAutocomplete"
hide-no-data
class="mb-3"
hide-selected
item-text="branchName"
label="Cabang"
hide-details
outline
return-object
></v-autocomplete>
<v-autocomplete
:search-input.sync="searchCoaDetail"
v-model="selectedCoaDetail"
:items="coaListDetail"
:loading="loadingAutocomplete"
hide-no-data
hide-selected
class="mb-3"
item-text="display"
label="ACCOUNT"
hide-details
outline
return-object
></v-autocomplete>
<v-text-field
prefix="Rp"
v-model="formattedKreditDetail"
label="KREDIT"
hide-details
outline
class="mb-3">
</v-text-field>
</v-card-text>
<v-divider></v-divider>
<v-card-actions>
<v-spacer></v-spacer>
<v-btn color="error" flat @click="closeDialogAddDetail()">
TUTUP
</v-btn>
<v-btn
color="primary"
v-if="dialogDetailEditAct==='add'"
flat
@click="addDetailJurnalGaji()"
>
TAMBAHKAN
</v-btn>
<v-btn
color="primary"
v-if="dialogDetailEditAct==='edit'"
flat
@click="editDetailJurnalGaji()"
>
EDIT
</v-btn>
</v-card-actions>
</v-card>
</v-dialog>
<v-dialog v-model="dialogForm" persistent width="70vw">
<v-card>
<v-card-title class="headline grey lighten-2" primary-title>
FORM JURNAL GAJI REGIONAL
</v-card-title>
<v-card-text>
<v-layout row wrap>
<v-flex xs6 class="px-1 mb-2">
<v-text-field
label="COMPANY"
v-model="user.M_BranchCompanyName"
readonly
hide-details
outline
></v-text-field>
</v-flex>
<v-flex xs6 class="px-1 mb-2">
<v-autocomplete
v-model="selectedJurnalType"
:items="jurnalTypeList"
hide-no-data
hide-selected
item-text="JurnalTypeName"
label="JURNAL TYPE"
hide-details
readonly
outline
return-object
></v-autocomplete>
</v-flex>
<v-flex xs6 class="px-1 mb-2">
<v-text-field
label="REGIONAL"
v-model="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
:disabled="disableForm()"
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>
<!-- :allowed-dates="disablePastDates" -->
<v-date-picker
v-model="selectedDate"
no-title
@input="menuFormSelectedDate = false"
></v-date-picker>
</v-menu>
</v-flex>
<v-flex xs3 class="px-1 mb-2">
<v-autocomplete
:search-input.sync="searchPeriode"
v-model="selectedPeriode"
:items="periodeList"
:loading="loadingAutocomplete"
hide-no-data
hide-selected
item-text="display"
label="PERIODE"
hide-details
:readonly="disableForm()"
outline
return-object
></v-autocomplete>
</v-flex>
<!-- <v-flex xs6 class="px-1 mb-2">
<v-text-field
label="BRANCH"
hide-details
disabled
outline
></v-text-field>
</v-flex> -->
<v-flex xs6 class="px-1 mb-2">
<v-text-field
label="JUDUL"
v-model="title"
:readonly="disableForm()"
hide-details
outline
></v-text-field>
</v-flex>
<v-flex xs6 class="px-1 mb-2">
<v-autocomplete
:search-input.sync="searchCoa"
v-model="selectedCoa"
:items="coaList"
:loading="loadingAutocomplete"
hide-no-data
:readonly="disableForm()"
hide-selected
item-text="display"
label="ACCOUNT"
hide-details
outline
return-object
></v-autocomplete>
</v-flex>
<v-flex xs6 class="px-1 mb-2">
<v-autocomplete
:search-input.sync="searchCoaKas"
v-model="selectedCoaKas"
:items="coaListKas"
:loading="loadingAutocomplete"
hide-no-data
:readonly="disableForm()"
hide-selected
item-text="display"
v-if="dialogType === 'N' || dialogType === 'R'"
label="ACCOUNT BANK"
hide-details
outline
return-object
></v-autocomplete>
</v-flex>
<v-flex xs6 class="px-1 mb-2">
<v-autocomplete
:search-input.sync="searchCoaReg"
v-model="selectedCoaReg"
:items="coaListReg"
:loading="loadingAutocomplete"
hide-no-data
:readonly="disableForm()"
hide-selected
item-text="display"
label="ACCOUNT REGIONAL"
hide-details
outline
return-object
></v-autocomplete>
</v-flex>
<v-flex xs6 class="px-1 mb-2">
<v-text-field
prefix="Rp"
v-model="formattedSallary"
label="JUMLAH GAJI REGIONAL PER PT"
v-if="dialogType === 'N' || dialogType === 'R'"
hide-details
outline
:readonly="disableForm()">
</v-text-field>
</v-flex>
<v-flex xs6 class="px-1 mb-2">
<v-autocomplete
v-model="selectedBranchPercent"
:items="branchPercentList"
hide-no-data
:readonly="disableForm()"
hide-selected
item-text="BranchPercentType"
label="PRESENTASE CABANG"
v-if="dialogType === 'N' || dialogType === 'R'"
hide-details
outline
return-object
></v-autocomplete>
</v-flex>
<v-flex xs12 class="px-1 mb-2">
<v-text-field
v-model="description"
label="DESKRIPSI"
:readonly="disableForm()"
hide-details
outline
></v-text-field>
</v-flex>
<v-flex
xs12
class="px-1 mb-2 mt-2 text-xs-center"
v-if="detailJurnalGajiRegional.length > 0"
>
<p class="title p-0">JURNAL REGIONAL</p>
</v-flex>
<v-flex
xs12
class="px-1 mb-2 mt-2"
v-if="detailJurnalGajiRegional.length > 0"
>
<!-- {{ detailJurnalGaji }} -->
<v-data-table
hide-actions
:headers="headers"
:items="detailJurnalGajiRegional"
class="elevation-1"
>
<!-- :items="desserts" -->
<template v-slot:items="props">
<td class="px-1">{{ props.item.branchName }}</td>
<td class="px-1">{{ props.item.coaNo }}</td>
<td class="px-1">{{ props.item.description }}</td>
<td class="px-1">{{ oneMoney(props.item.debet) }}</td>
<td class="px-1">{{ oneMoney(props.item.kredit) }}</td>
<td class="px-1 text-xs-center">
<!-- <div v-if="props.item.type === 'K'">
<v-btn
@click="openDialogEditDetail(props.item)"
small
flat
icon
color="info"
class="mr-2"
>
<v-icon small>edit</v-icon>
</v-btn>
<v-btn
@click="deleteDetailJurnalGaji(props.item)"
small
flat
icon
color="error"
>
<v-icon small>delete</v-icon>
</v-btn>
</div> -->
</td>
</template>
<template v-slot:footer>
<tr>
<td colspan="3" class="font-weight-bold px-1">Total</td>
<td class="font-weight-bold px-1">
{{ oneMoney(balanceRegional.debet) }}
</td>
<td class="font-weight-bold px-1">
{{ oneMoney(balanceRegional.kredit) }}
</td>
<td class="font-weight-bold px-1"></td>
</tr>
<tr>
<td colspan="4" class="font-weight-bold px-1">
Balance
</td>
<td colspan="2">
<div class="d-flex text-right font-weight-bold px-1">
<v-spacer></v-spacer>
{{ oneMoney(balanceRegional.balance) }}
</div>
</td>
</tr>
</template>
</v-data-table>
</v-flex>
<v-flex
xs12
class="px-1 mb-2 mt-2 text-xs-center"
v-if="detailJurnalGaji.length > 0"
>
<p class="title p-0">JURNAL CABANG</p>
</v-flex>
<!-- <v-flex
xs12
class="px-1 mb-1 text-xs-right"
v-if="detailJurnalGaji.length > 0"
>
<v-btn
color="info"
v-if="dialogType === 'N'"
:disabled="detailJurnalGaji.length === 0 || disableForm() || balance.balance === 0"
@click="openDialogAddDetail()"
>TAMBAH</v-btn
>
</v-flex> -->
<v-flex
xs12
class="px-1 mb-2 mt-2"
v-if="detailJurnalGaji.length > 0"
>
<!-- {{ detailJurnalGaji }} -->
<v-data-table
hide-actions
:headers="headers"
:items="detailJurnalGaji"
class="elevation-1"
>
<!-- :items="desserts" -->
<template v-slot:items="props">
<td class="px-1">{{ props.item.branchName }}</td>
<td class="px-1">{{ props.item.coaNo }}</td>
<td class="px-1">{{ props.item.description }}</td>
<td class="px-1">{{ oneMoney(props.item.debet) }}</td>
<td class="px-1">{{ oneMoney(props.item.kredit) }}</td>
<td class="px-1 text-xs-center">
<!-- <div v-if="props.item.type === 'K' && !disableForm()">
<v-btn
@click="openDialogEditDetail(props.item)"
small
flat
icon
color="info"
class="mr-2"
>
<v-icon small>edit</v-icon>
</v-btn>
<v-btn
@click="deleteDetailJurnalGaji(props.item)"
small
flat
icon
color="error"
>
<v-icon small>delete</v-icon>
</v-btn>
</div> -->
</td>
</template>
<template v-slot:footer>
<tr>
<td colspan="3" class="font-weight-bold px-1">Total</td>
<td class="font-weight-bold px-1">
{{ oneMoney(balance.debet) }}
</td>
<td class="font-weight-bold px-1">
{{ oneMoney(balance.kredit) }}
</td>
<td class="font-weight-bold px-1"></td>
</tr>
<tr>
<td colspan="4" class="font-weight-bold px-1">
Balance
</td>
<td colspan="2">
<div class="d-flex text-right font-weight-bold px-1">
<v-spacer></v-spacer>
{{ oneMoney(balance.balance) }}
</div>
</td>
</tr>
</template>
</v-data-table>
</v-flex>
</v-layout>
<v-progress-linear
v-if="loading"
class="p-0"
:indeterminate="loading"
></v-progress-linear>
<v-divider></v-divider>
</v-card-text>
<v-card-actions>
<v-spacer></v-spacer>
<v-btn color="error" :disabled="loading" flat @click="closeDialog()">
TUTUP
</v-btn>
<v-btn
:loading="loading"
color="success"
:disabled="loading"
flat
v-if="dialogType === 'N'"
@click="saveJurnalGaji()"
>
SIMPAN
</v-btn>
</v-card-actions>
</v-card>
</v-dialog>
</div>
</template>
<style scoped></style>
<script>
module.exports = {
name: "JurnalGaji",
props: {
show: {
type: Boolean,
default: false,
},
},
components: {},
mounted() {
console.log("Ini mounted dialog");
},
data: () => ({
loadingCsv: false,
menuFormSelectedDate: false,
menuFormDateEnd: false,
act: "",
alertMsg: "",
dialogDetailEditAct: "add",
selectedDetail: {},
headers: [
{
text: "CABANG",
align: "left",
sortable: false,
value: "action",
width: "15%",
class: "pa-2 pl-2 blue lighten-3 white--text",
},
{
text: "AKUN",
align: "left",
sortable: false,
value: "mr",
width: "10%",
class: "pa-2 blue lighten-3 white--text",
},
{
text: "DESKRIPSI",
align: "left",
sortable: false,
value: "lab",
width: "20%",
class: "pa-2 blue lighten-3 white--text",
},
{
text: "DEBET",
align: "left",
sortable: false,
value: "lab",
width: "15%",
class: "pa-2 blue lighten-3 white--text",
},
{
text: "KREDIT",
align: "left",
sortable: false,
value: "lab",
width: "15%",
class: "pa-2 blue lighten-3 white--text",
},
{
text: "AKSI",
align: "left",
sortable: false,
value: "lab",
width: "10%",
class: "pa-2 blue lighten-3 white--text",
},
],
}),
computed: {
formattedSallary: {
get() {
return this.oneMoney(this.sallary);
},
set(value) {
// Hilangkan titik dan koma, ubah jadi number
let raw = value.replace(/\./g, '').replace(',', '.');
this.sallary = parseFloat(raw) || 0;
}
},
formattedKreditDetail: {
get() {
return this.oneMoney(this.kreditDetail);
},
set(value) {
// Hilangkan titik dan koma, ubah jadi number
let raw = value.replace(/\./g, '').replace(',', '.');
this.kreditDetail = parseFloat(raw) || 0;
}
},
dialogLocal: {
get() {
return this.show;
},
set(value) {
this.$emit("update:show", value);
},
},
balanceRegional: {
get() {
return this.$store.state.jurnalgaji.balanceRegional;
},
set(val) {
this.$store.commit("jurnalgaji/update_balanceRegional", val);
},
},
balance: {
get() {
return this.$store.state.jurnalgaji.balance;
},
set(val) {
this.$store.commit("jurnalgaji/update_balance", val);
},
},
dialogForm: {
get() {
return this.$store.state.jurnalgaji.dialogForm;
},
set(val) {
this.$store.commit("jurnalgaji/update_dialogForm", val);
},
},
selectedBranchPercent: {
get() {
return this.$store.state.jurnalgaji.selectedBranchPercent;
},
set(val) {
this.$store.commit("jurnalgaji/update_selectedBranchPercent", val);
this.generateDetail();
},
},
dialogAddDetail: {
get() {
return this.$store.state.jurnalgaji.dialogAddDetail;
},
set(val) {
this.$store.commit("jurnalgaji/update_dialogAddDetail", val);
},
},
loading: {
get() {
return this.$store.state.jurnalgaji.loading;
},
set(val) {
this.$store.commit("jurnalgaji/update_loading", val);
},
},
detailJurnalGaji: {
get() {
return this.$store.state.jurnalgaji.detailJurnalGaji;
},
set(val) {
this.$store.commit("jurnalgaji/update_detailJurnalGaji", val);
},
},
detailJurnalGajiRegional: {
get() {
return this.$store.state.jurnalgaji.detailJurnalGajiRegional;
},
set(val) {
this.$store.commit("jurnalgaji/update_detailJurnalGajiRegional", val);
},
},
defaultBranch: {
get() {
return this.$store.state.jurnalgaji.defaultBranch;
},
set(val) {
this.$store.commit("jurnalgaji/update_defaultBranch", val);
},
},
sallary: {
get() {
return this.$store.state.jurnalgaji.sallary;
},
set(val) {
this.$store.commit("jurnalgaji/update_sallary", val);
this.generateDetail();
},
},
description: {
get() {
return this.$store.state.jurnalgaji.description;
},
set(val) {
this.$store.commit("jurnalgaji/update_description", val);
},
},
title: {
get() {
return this.$store.state.jurnalgaji.title;
},
set(val) {
this.$store.commit("jurnalgaji/update_title", val);
},
},
selectedDate: {
get() {
return this.$store.state.jurnalgaji.selectedDate;
},
set(val) {
this.$store.commit("jurnalgaji/update_selectedDate", val);
},
},
selectedJurnalType: {
get() {
return this.$store.state.jurnalgaji.selectedJurnalType;
},
set(val) {
this.$store.commit("jurnalgaji/update_selectedJurnalType", val);
},
},
loadingAutocomplete: {
get() {
return this.$store.state.jurnalgaji.loadingAutocomplete;
},
set(val) {
this.$store.commit("jurnalgaji/update_loadingAutocomplete", val);
},
},
selectedPeriode: {
get() {
return this.$store.state.jurnalgaji.selectedPeriode;
},
set(val) {
this.$store.commit("jurnalgaji/update_selectedPeriode", val);
},
},
searchPeriode: {
get() {
return this.$store.state.jurnalgaji.searchPeriode;
},
set(val) {
this.$store.commit("jurnalgaji/update_searchPeriode", val);
},
},
selectedCoa: {
get() {
return this.$store.state.jurnalgaji.selectedCoa;
},
set(val) {
this.$store.commit("jurnalgaji/update_selectedCoa", val);
this.generateDetail();
},
},
kreditDetail: {
get() {
return this.$store.state.jurnalgaji.kreditDetail;
},
set(val) {
this.$store.commit("jurnalgaji/update_kreditDetail", val);
},
},
selectedBranchDetail: {
get() {
return this.$store.state.jurnalgaji.selectedBranchDetail;
},
set(val) {
this.$store.commit("jurnalgaji/update_selectedBranchDetail", val);
this.selectedCoaDetail = {};
this.coaListDetail = [];
this.searchCoaDetail = "";
},
},
searchCoa: {
get() {
return this.$store.state.jurnalgaji.searchCoa;
},
set(val) {
this.$store.commit("jurnalgaji/update_searchCoa", val);
},
},
selectedCoaDetail: {
get() {
return this.$store.state.jurnalgaji.selectedCoaDetail;
},
set(val) {
this.$store.commit("jurnalgaji/update_selectedCoaDetail", val);
},
},
searchCoaDetail: {
get() {
return this.$store.state.jurnalgaji.searchCoaDetail;
},
set(val) {
this.$store.commit("jurnalgaji/update_searchCoaDetail", val);
},
},
coaListDetail: {
get() {
return this.$store.state.jurnalgaji.coaListDetail;
},
set(val) {
this.$store.commit("jurnalgaji/update_coaListDetail", val);
},
},
selectedCoaKas: {
get() {
return this.$store.state.jurnalgaji.selectedCoaKas;
},
set(val) {
this.$store.commit("jurnalgaji/update_selectedCoaKas", val);
},
},
searchCoaKas: {
get() {
return this.$store.state.jurnalgaji.searchCoaKas;
},
set(val) {
this.$store.commit("jurnalgaji/update_searchCoaKas", val);
},
},
coaListKas: {
get() {
return this.$store.state.jurnalgaji.coaListKas;
},
set(val) {
this.$store.commit("jurnalgaji/update_coaListKas", val);
},
},
selectedCoaReg: {
get() {
return this.$store.state.jurnalgaji.selectedCoaReg;
},
set(val) {
this.$store.commit("jurnalgaji/update_selectedCoaReg", val);
},
},
searchCoaReg: {
get() {
return this.$store.state.jurnalgaji.searchCoaReg;
},
set(val) {
this.$store.commit("jurnalgaji/update_searchCoaReg", val);
},
},
coaListReg: {
get() {
return this.$store.state.jurnalgaji.coaListReg;
},
set(val) {
this.$store.commit("jurnalgaji/update_coaListReg", val);
},
},
snackbar: {
get() {
return this.$store.state.jurnalgaji.snackbar;
},
set(val) {
this.$store.commit("jurnalgaji/update_snackbar", val);
},
},
branchPercentList() {
return this.$store.state.jurnalgaji.branchPercentList;
},
// coaListDetail() {
// return this.$store.state.jurnalgaji.coaListDetail;
// },
coaList() {
return this.$store.state.jurnalgaji.coaList;
},
periodeList() {
return this.$store.state.jurnalgaji.periodeList;
},
jurnalTypeList() {
return this.$store.state.jurnalgaji.jurnalTypeList;
},
defaultJurnalType() {
return this.$store.state.jurnalgaji.defaultJurnalType;
},
user() {
return this.$store.state.jurnalgaji.user;
},
formatedSelectedDate() {
return this.formatDate(this.selectedDate);
},
idEdit: {
get() {
return this.$store.state.jurnalgaji.idEdit;
},
set(val) {
this.$store.commit("jurnalgaji/update_idEdit", val);
},
},
dialogType: {
get() {
return this.$store.state.jurnalgaji.dialogType;
},
set(val) {
this.$store.commit("jurnalgaji/update_dialogType", val);
},
},
},
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(vaslue);
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;
}
},
disableForm() {
return (
this.loading || this.dialogType === "R" || this.dialogType === "B"
);
},
countSummary() {
let kredit = 0;
let debet = 0;
this.detailJurnalGaji.forEach((e) => {
if (e.type === "D") {
debet = parseFloat(e.debet) + debet;
}
if (e.type === "K") {
kredit = parseFloat(e.kredit) + kredit;
}
});
let total = debet - kredit;
let summary = {
debet: debet,
kredit: kredit,
balance: total,
};
this.balance = summary;
},
countSummaryRegional() {
let kredit = 0;
let debet = 0;
this.detailJurnalGajiRegional.forEach((e) => {
if (e.type === "D") {
debet = parseFloat(e.debet) + debet;
}
if (e.type === "K") {
kredit = parseFloat(e.kredit) + kredit;
}
});
let total = debet - kredit;
let summary = {
debet: debet,
kredit: kredit,
balance: total,
};
this.balanceRegional = summary;
},
formatCurrency(value) {
// console.log(value);
if (
value === null ||
value === undefined ||
value === "" ||
value == NaN
)
return "";
return (
"Rp " +
parseFloat(value).toLocaleString("id-ID", {
minimumFractionDigits: 2,
maximumFractionDigits: 2,
})
);
},
generateRandomId() {
return (
"id-" +
Math.random().toString(36).substr(2, 9) +
"-" +
Date.now().toString(36)
);
},
isObjectEmpty(obj) {
return Object.keys(obj).length === 0 && obj.constructor === Object;
},
openDialogAddDetail() {
this.dialogDetailEditAct = "add";
this.dialogAddDetail = true;
},
closeDialogAddDetail() {
this.coaListDetail = [];
this.selectedCoaDetail = {};
this.selectedBranchDetail = {};
this.kreditDetail = 0;
this.dialogAddDetail = false;
},
openDialogEditDetail(data) {
// data = {
// tmpID: this.generateRandomId(),
// id: "0",
// branchID: this.selectedBranchDetail.branchID,
// branchName: this.selectedBranchDetail.branchName,
// description: coa.keterangan,
// debet: 0,
// type: "K",
// dataType: "N",
// kredit: this.kreditDetail,
// precentage: 0,
// coaID: coa.id,
// coaName: coa.keterangan,
// coaNo: coa.number,
// }
this.dialogDetailEditAct = "edit";
this.selectedDetail = data;
this.selectedBranchDetail = {
branchID: data.branchID,
branchRegionalID: "",
branchCode: "",
branchName: data.branchName,
branchCompanyID: "",
};
this.selectedCoaDetail = {
display: data.coaNo + " - " + data.coaName,
id: data.coaID,
keterangan: data.coaName,
number: data.coaNo,
};
this.searchCoaDetail = data.coaNo + " - " + data.coaName;
this.kreditDetail = data.kredit;
this.dialogAddDetail = true;
},
deleteDetailJurnalGaji(data) {
if (data.dataType === "D") {
return;
}
// for (let i = 0; i < tmpList.length; i++) {
// const e = tmpList[i];
// if (e.id === data.id) {
// console.log("DATA FOUND");
// tmpList[i] = data;
// }
// }
let tmpList = this.detailJurnalGaji;
tmpList = tmpList.filter((e) => {
return e.id !== data.id;
});
// tmpList.push(data);
tmpList.sort((a, b) => a.branchName.localeCompare(b.branchName));
let tmp = JSON.stringify(tmpList);
this.detailJurnalGaji = JSON.parse(tmp);
this.closeDialogAddDetail();
this.countSummary();
},
editDetailJurnalGaji() {
if (this.isObjectEmpty(this.selectedCoaDetail)) return;
if (this.isObjectEmpty(this.selectedBranchDetail)) return;
if (this.kreditDetail == "" || this.kreditDetail <= 0) return;
var coa = this.selectedCoaDetail;
var branchPercent = this.selectedBranchPercent;
var selectedDetail = this.selectedDetail;
let data = {};
branchPercent.detail.forEach((p) => {
if (
this.selectedBranchDetail.branchID ===
p.BranchPercentDetailM_BranchID
) {
data = {
id: selectedDetail.id,
branchID: this.selectedBranchDetail.branchID,
branchName: this.selectedBranchDetail.branchName,
description: coa.keterangan,
debet: 0,
type: "K",
dataType: selectedDetail.dataType,
kredit: this.kreditDetail,
precentage: 0,
coaID: coa.id,
coaName: coa.keterangan,
coaNo: coa.number,
};
}
});
let debet = 0;
let kredit = 0;
this.detailJurnalGaji.forEach((element) => {
if (this.selectedBranchDetail.branchID === element.branchID) {
if (element.type === "K" && element.id != data.id) {
kredit = kredit + parseFloat(element.kredit);
}
if (element.type === "D") {
debet = debet + parseFloat(element.debet);
}
}
});
kredit = kredit + parseFloat(data.kredit);
console.log("debet :" + debet);
console.log("kredit :" + kredit);
if (parseFloat(kredit) > parseFloat(debet)) {
alert(
"total kredit tidak boleh lebih besar dari total depet di cabang " +
data.branchName
);
return;
}
let tmpList = this.detailJurnalGaji;
// debugger;
console.log("BEFORE");
console.log(tmpList);
// tmpList.forEach((e, i) => {
// console.log("data");
// if (e.id === data.id) {
// console.log("DATA FOUND");
// tmpList[i] = data;
// }
// });
for (let i = 0; i < tmpList.length; i++) {
const e = tmpList[i];
if (e.id === data.id) {
console.log("DATA FOUND");
tmpList[i] = data;
}
}
console.log("AFTER");
console.log(tmpList);
// tmpList.push(data);
tmpList.sort((a, b) => a.branchName.localeCompare(b.branchName));
let tmp = JSON.stringify(tmpList);
this.detailJurnalGaji = JSON.parse(tmp);
this.closeDialogAddDetail();
this.countSummary();
},
addDetailJurnalGaji() {
if (this.isObjectEmpty(this.selectedCoaDetail)) return;
if (this.isObjectEmpty(this.selectedBranchDetail)) return;
if (this.kreditDetail == "" || this.kreditDetail <= 0) return;
var coa = this.selectedCoaDetail;
var branchPercent = this.selectedBranchPercent;
let data = {};
branchPercent.detail.forEach((p) => {
if (
this.selectedBranchDetail.branchID ===
p.BranchPercentDetailM_BranchID
) {
data = {
id: this.generateRandomId(),
branchID: this.selectedBranchDetail.branchID,
branchName: this.selectedBranchDetail.branchName,
description: coa.keterangan,
debet: 0,
type: "K",
dataType: "N",
kredit: this.kreditDetail,
precentage: 0,
coaID: coa.id,
coaName: coa.keterangan,
coaNo: coa.number,
};
}
});
let debet = 0;
let kredit = 0;
this.detailJurnalGaji.forEach((element) => {
if (this.selectedBranchDetail.branchID === element.branchID) {
if (element.type === "K") {
kredit = kredit + parseFloat(element.kredit);
}
if (element.type === "D") {
debet = debet + parseFloat(element.debet);
}
}
});
kredit = kredit + parseFloat(data.kredit);
console.log("debet :" + debet);
console.log("kredit :" + kredit);
if (parseFloat(kredit) > parseFloat(debet)) {
alert(
"total kredit tidak boleh lebih besar dari total depet di cabang " +
data.branchName
);
return;
}
let tmpList = this.detailJurnalGaji;
tmpList.push(data);
tmpList.sort((a, b) => a.branchName.localeCompare(b.branchName));
this.detailJurnalGaji = tmpList;
this.closeDialogAddDetail();
this.countSummary();
},
generateDetail() {
if (this.isObjectEmpty(this.selectedCoa)) return;
if (this.isObjectEmpty(this.selectedCoaKas)) return;
if (this.isObjectEmpty(this.selectedCoaReg)) return;
if (this.isObjectEmpty(this.selectedBranchPercent)) return;
if (this.sallary <= 0) return;
// let data = {
// branchID: "",
// branchName: "",
// description: "",
// debet: "",
// kredit: "",
// precentage: 0,
// coaID: "",
// coaName: "",
// coaNo: "",
// };
var sallaryReg = parseFloat(this.sallary);
var coa = this.selectedCoa;
var branch = this.defaultBranch;
var branchPercent = this.selectedBranchPercent;
var coaReg = this.selectedCoaReg;
console.log('coa', coa);
console.log('coaReg', coaReg);
console.log('branch', branch);
console.log('branchPercent', branchPercent);
let detail = [];
branch.forEach((e, index) => {
branchPercent.detail.forEach((p) => {
if (e.branchID === p.BranchPercentDetailM_BranchID) {
let percent = parseFloat(p.BranchPercentDetailValue);
let sall = sallaryReg;
let value = (percent / 100) * sall;
let dbt = Math.round(value);
detail.push({
id: this.generateRandomId(),
branchID: e.branchID,
branchName: e.branchName,
description: coa.keterangan,
debet: dbt,
kredit: 0,
precentage: 0,
type: "D",
dataType: "N",
coaID: coa.id,
coaName: coa.keterangan,
coaNo: coa.number,
});
}
});
});
// detail.sort((a, b) => a.branchName.localeCompare(b.branchName));
let detailReg = [];
branch.forEach((e, index) => {
branchPercent.detail.forEach((p) => {
if (e.branchID === p.BranchPercentDetailM_BranchID) {
let percent = parseFloat(p.BranchPercentDetailValue);
let sall = sallaryReg;
let value = (percent / 100) * sall;
let krd = Math.round(value);
detailReg.push({
id: this.generateRandomId(),
branchID: e.branchID,
branchName: e.branchName,
description: coaReg.keterangan,
debet: 0,
kredit: krd,
precentage: 0,
type: "K",
dataType: "N",
coaID: coaReg.id,
coaName: coaReg.keterangan,
coaNo: coaReg.number,
});
}
});
});
let detailRegional = [];
branch.forEach((e, index) => {
branchPercent.detail.forEach((p) => {
if (e.branchID === p.BranchPercentDetailM_BranchID) {
let percent = parseFloat(p.BranchPercentDetailValue);
let sall = sallaryReg;
let value = (percent / 100) * sall;
let dbt = Math.round(value);
detailRegional.push({
id: this.generateRandomId(),
branchID: e.branchID,
branchName: e.branchName,
description: p.coaDescription,
debet: dbt,
kredit: 0,
precentage: 0,
type: "D",
dataType: "N",
coaID: p.coaID,
coaName: p.coaDescription,
coaNo: p.coaAccountNo,
});
}
});
});
detailRegional.sort((a, b) => a.branchName.localeCompare(b.branchName));
this.detailJurnalGajiRegional = [
{
id: this.generateRandomId(),
branchID: "",
branchName: "",
description: this.selectedCoaKas.keterangan,
debet: 0,
kredit: this.sallary,
precentage: 0,
type: "K",
dataType: "N",
coaID: this.selectedCoaKas.id,
coaName: this.selectedCoaKas.keterangan,
coaNo: this.selectedCoaKas.number,
},
...detailRegional,
];
let arrMergeDetail = [...detail, ...detailReg]
arrMergeDetail.sort((a, b) => a.branchName.localeCompare(b.branchName));
console.log('arrMergeDetail', arrMergeDetail)
console.log('detail', detail)
console.log('detailReg', detailReg)
this.detailJurnalGaji = arrMergeDetail;
this.countSummary();
this.countSummaryRegional();
},
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")}`;
},
handleDialogOpen() {
console.log("Dialog telah dibuka");
},
closeDialog() {
this.selectedPeriode = {};
this.selectedCoa = {};
this.selectedCoaKas = {};
this.selectedCoaReg = {};
this.selectedBranchPercent = {};
this.detailJurnalGaji = [];
this.detailJurnalGajiRegional = [];
this.balance = {
debet: 0,
kredit: 0,
balance: 0,
};
this.sallary = 0;
this.searchCoa = "";
this.searchCoaKas = "";
this.searchCoaReg = "";
this.title = "";
this.description = "";
console.log("close dialogs");
this.$emit("update:show", false);
this.dialogForm = false;
this.$store.commit("jurnalumum/update_x_drop_tipe_jurnal", {});
},
saveJurnalGaji() {
let message = [];
if (this.isObjectEmpty(this.selectedPeriode)) {
message.push("Pilih periode terlebih dahulu");
}
if (this.isObjectEmpty(this.selectedCoa)) {
message.push("Pilih account terlebih dahulu");
}
if (this.isObjectEmpty(this.selectedCoaKas)) {
message.push("Pilih account bank terlebih dahulu");
}
if (this.isObjectEmpty(this.selectedBranchPercent)) {
message.push("Pilih presentase cabang terlebih dahulu");
}
if (this.title === "") {
message.push("Isi judul terlebih dahulu");
}
if (parseFloat(this.sallary) <= 0) {
message.push("Jumlah gaji regional per pt tidak sesuai");
}
if (this.balance.balance > 0) {
message.push("jumlah tidak balance");
}
const isDateInRange = (date, startDate, endDate) => {
return date >= startDate && date <= endDate;
};
if (
!isDateInRange(
moment(this.selectedDate).format("YYYY-MM-DD"),
moment(this.selectedPeriode.periodeStartDate).format("YYYY-MM-DD"),
moment(this.selectedPeriode.periodeEndDate).format("YYYY-MM-DD")
)
) {
message.push(
"Tanggal yang dipilih tidak dalam rentang periode yang ada pilih"
);
}
if (message.length > 0) {
let snackbar = {
state: true,
color: "warning",
msg: message.join(", "),
};
this.snackbar = snackbar;
return;
}
if (this.detailJurnalGaji.length === 0) return;
if (this.detailJurnalGajiRegional.length === 0) return;
let header = {
companyID: this.user.M_BranchCompanyID,
regionalID: this.user.S_RegionalID,
jurnalTypeID: this.selectedJurnalType.JurnalTypeID,
date: this.selectedDate,
periodeID: this.selectedPeriode.periodeID,
title: this.title,
coaID: this.selectedCoa.id,
coaName: this.selectedCoa.keterangan,
coaNo: this.selectedCoa.number,
coaKasID: this.selectedCoaKas.id,
coaKasName: this.selectedCoaKas.keterangan,
coaKasNo: this.selectedCoaKas.number,
sallary: this.sallary,
description: this.description,
branchPrecenID: this.selectedBranchPercent.BranchPercentID,
jurnalRegional: this.detailJurnalGajiRegional,
detail: this.detailJurnalGaji,
};
this.$store.dispatch("jurnalgaji/saveJurnalGaji", header);
console.log(header);
},
},
watch: {
searchPeriode(val, old) {
if (val == old) return;
if (!val) return;
if (val.length < 1) return;
this.$store.dispatch("jurnalgaji/getPeriode");
},
searchCoaDetail(val, old) {
if (val == old) return;
if (!val) return;
if (val.length < 1) return;
this.$store.dispatch("jurnalgaji/getCoaDetail");
},
searchCoa(val, old) {
if (val == old) return;
if (!val) return;
if (val.length < 1) return;
this.$store.dispatch("jurnalgaji/getCoa");
},
searchCoaKas(val, old) {
if (val == old) return;
if (!val) return;
if (val.length < 1) return;
this.$store.dispatch("jurnalgaji/getCoaKas");
},
searchCoaReg(val, old) {
if (val == old) return;
if (!val) return;
if (val.length < 1) return;
this.$store.dispatch("jurnalgaji/getCoaReg");
},
async dialogForm(val, old) {
if (val) {
await this.$store.dispatch("jurnalgaji/getJurnalType");
await this.$store.dispatch("jurnalgaji/getBranchpercent");
await this.$store.dispatch("jurnalgaji/getDefaultBranch");
if (this.idEdit !== 0) {
await this.$store.dispatch("jurnalgaji/getDetail", {
id: this.idEdit,
});
} else {
this.dialogType = "N";
}
} else {
console.log("Dialog jurnal gaji close ");
}
},
show(newVal) {
if (newVal) {
this.handleDialogOpen();
}
},
},
};
</script>