918 lines
32 KiB
Vue
918 lines
32 KiB
Vue
<template>
|
|
<div>
|
|
<v-layout row justify-center>
|
|
<v-dialog v-model="dialogRequest" persistent max-width="75%">
|
|
<v-card>
|
|
<v-card-title class="headline grey lighten-2" primary-title>
|
|
FORM PENGELUARAN BARANG
|
|
</v-card-title>
|
|
<v-card-text class="pt-2 pb-0">
|
|
<v-form ref="formRequest" v-model="validationForm" lazy-validtion>
|
|
<v-layout row>
|
|
<v-flex xs6 pa-2>
|
|
<v-menu
|
|
v-model="menuDateUse"
|
|
:close-on-content-click="false"
|
|
transition="scale-transition"
|
|
:nudge-right="40"
|
|
lazy
|
|
offset-y
|
|
full-width
|
|
max-width="290px"
|
|
min-width="290px"
|
|
>
|
|
<template v-slot:activator="{ on }">
|
|
<v-text-field
|
|
v-model="dateUseFormatted"
|
|
label="Tanggal Transaksi"
|
|
readonly
|
|
v-on="on"
|
|
@blur="dDateUse = deFormatedDate(dateUseFormatted)"
|
|
></v-text-field>
|
|
</template>
|
|
<v-date-picker
|
|
no-title
|
|
v-model="xDateUse"
|
|
@input="menuDateUse = false"
|
|
></v-date-picker>
|
|
</v-menu>
|
|
</v-flex>
|
|
<v-flex xs6 pa-2>
|
|
<v-autocomplete
|
|
v-model="xWarehouse"
|
|
label="Gudang"
|
|
menu-icon="mdi-chevron-down"
|
|
:items="warehouseOptions"
|
|
item-text="WarehouseName"
|
|
item-value="WarehouseID"
|
|
:rules="warehouseRules"
|
|
required
|
|
></v-autocomplete>
|
|
</v-flex>
|
|
<v-flex xs6 pa-2>
|
|
<v-autocomplete
|
|
v-model="selectedDivision"
|
|
label="Divisi"
|
|
menu-icon="mdi-chevron-down"
|
|
:items="divisionOptions"
|
|
item-text="DivisionName"
|
|
item-value="DivisionID"
|
|
:rules="divisionRules"
|
|
required
|
|
></v-autocomplete>
|
|
</v-flex>
|
|
<v-flex pa-2 xs6>
|
|
<v-text-field
|
|
v-model="xNote"
|
|
label="Catatan"
|
|
></v-text-field>
|
|
</v-flex>
|
|
</v-layout>
|
|
</v-form>
|
|
|
|
<v-layout row>
|
|
<v-flex pa-2 pl-0 xs12>
|
|
<v-btn v-if="dialogItem == false" color="primary" @click="dialogItem = true">Pilih Item</v-btn>
|
|
<v-btn v-if="dialogItem == true" color="primary" @click="dialogItem = false">Tutup Pilih Item</v-btn>
|
|
</v-flex>
|
|
</v-layout>
|
|
|
|
<div v-if="dialogItem == true">
|
|
<v-card class="mt-2">
|
|
<v-layout row>
|
|
<v-flex class="mt-2" pa-2 pb-0 xs3>
|
|
<v-text-field
|
|
v-model="searchItem"
|
|
label="Cari..."
|
|
placeholder="Ketikkan item"
|
|
style="max-width: 250px"
|
|
hide-details
|
|
></v-text-field>
|
|
</v-flex>
|
|
<v-flex class="mt-2" pa-2 pb-0 xs2>
|
|
<v-btn
|
|
dark
|
|
color="success"
|
|
style="min-width: 40px; height: 40px; margin: 0"
|
|
@click="itemSearch()"
|
|
>
|
|
<v-icon>search</v-icon>
|
|
</v-btn>
|
|
</v-flex>
|
|
</v-layout>
|
|
<v-layout row >
|
|
<v-flex xs12 pl-2 pr-2 pt-2 pb-2>
|
|
<v-data-table
|
|
:headers="headers"
|
|
:items="items"
|
|
:loading="loadingItem"
|
|
hide-actions
|
|
class="elevation-1"
|
|
>
|
|
<template slot="items" slot-scope="props">
|
|
<td
|
|
class="text-xs-left pa-2"
|
|
v-bind:class="{ 'amber lighten-4': isSelected(props.item) }"
|
|
@click="selectMe(props.item)"
|
|
>
|
|
<div
|
|
style="
|
|
display: flex;
|
|
flex-direction: column;
|
|
align-items: center;
|
|
"
|
|
>
|
|
{{ props.item.rioNumber }}
|
|
</div>
|
|
</td>
|
|
<td
|
|
class="text-xs-left pa-2"
|
|
v-bind:class="{ 'amber lighten-4': isSelected(props.item) }"
|
|
@click="selectMe(props.item)"
|
|
>
|
|
<div
|
|
style="
|
|
display: flex;
|
|
flex-direction: column;
|
|
align-items: center;
|
|
"
|
|
>
|
|
{{ props.item.itemCode }}
|
|
<v-chip small style="border-radius: 5px; flex-grow: 0">
|
|
{{ props.item.itemDesc }}
|
|
</v-chip>
|
|
</div>
|
|
</td>
|
|
<td
|
|
class="text-xs-center pa-2"
|
|
v-bind:class="{ 'amber lighten-4': isSelected(props.item) }"
|
|
@click="selectMe(props.item)"
|
|
>
|
|
{{ props.item.unitName }}
|
|
</td>
|
|
<td
|
|
class="text-xs-center pa-2"
|
|
v-bind:class="{ 'amber lighten-4': isSelected(props.item) }"
|
|
@click="selectMe(props.item)"
|
|
>
|
|
{{ props.item.StockQty }}
|
|
</td>
|
|
<td
|
|
class="text-xs-center pa-2"
|
|
v-bind:class="{ 'amber lighten-4': isSelected(props.item) }"
|
|
@click="selectMe(props.item)"
|
|
>
|
|
{{ props.item.rioDQty }}
|
|
</td>
|
|
<td
|
|
class="text-xs-center pa-2"
|
|
v-bind:class="{ 'amber lighten-4': isSelected(props.item) }"
|
|
@click="selectMe(props.item)"
|
|
>
|
|
<v-btn v-if="checkSelected(props.item) == false"style="min-width: 35px; height: 35px; margin: 0" small color="success" @click="addItem(props.item)"><v-icon small>check</v-icon></v-btn>
|
|
</td>
|
|
</template>
|
|
</v-data-table>
|
|
</v-flex>
|
|
</v-layout>
|
|
<v-divider></v-divider>
|
|
<v-layout row>
|
|
<v-flex xs6>
|
|
<v-pagination
|
|
style="margin-top: 10px; margin-bottom: 10px"
|
|
v-model="itemCurrentPage"
|
|
:length="itemTotalPage"
|
|
:total-visible="7"
|
|
></v-pagination>
|
|
</v-flex>
|
|
<v-flex class="pt-2 text-xs-right" xs6>
|
|
<v-btn color="primary" @click="dialogItem = false">Tutup Pilih Item</v-btn>
|
|
</v-flex>
|
|
</v-layout>
|
|
|
|
</v-card>
|
|
</div>
|
|
<v-divider></v-divider>
|
|
|
|
<v-card elevation="0" flat class=" mt-2">
|
|
<v-layout row style="max-height: 600px; overflow: auto">
|
|
<v-flex xs12 pl-2 pr-2 pt-2 pb-2>
|
|
<v-data-table
|
|
:headers="headersItems"
|
|
:items="selectedItems"
|
|
hide-actions
|
|
class="elevation-1"
|
|
>
|
|
<template slot="items" slot-scope="props">
|
|
<td
|
|
class="text-xs-left pa-2"
|
|
v-bind:class="{ 'amber lighten-4': isSelected(props.item) }"
|
|
@click="selectMe(props.item)"
|
|
>
|
|
<div
|
|
style="
|
|
display: flex;
|
|
flex-direction: column;
|
|
align-items: center;
|
|
"
|
|
>
|
|
{{ props.item.rioNumber }}
|
|
<!-- <span v-if="props.item.ioDetailConfirm == 'Y'">
|
|
<v-tooltip bottom>
|
|
<template v-slot:activator="{ on, attrs }">
|
|
<v-icon v-bind="attrs" v-on="on" class="ml-1" color="blue" small>check_circle</v-icon>
|
|
</template>
|
|
<span>Sudah di konfirmasi</span>
|
|
</v-tooltip>
|
|
</span> -->
|
|
</div>
|
|
</td>
|
|
<td
|
|
class="text-xs-left pa-2"
|
|
v-bind:class="{ 'amber lighten-4': isSelected(props.item) }"
|
|
@click="selectMe(props.item)"
|
|
>
|
|
<div
|
|
style="
|
|
display: flex;
|
|
flex-direction: column;
|
|
align-items: center;
|
|
"
|
|
>
|
|
{{ props.item.itemCode }}
|
|
<v-chip small style="border-radius: 5px; flex-grow: 0">
|
|
{{ props.item.itemDesc }}
|
|
</v-chip>
|
|
</div>
|
|
</td>
|
|
<td
|
|
class="text-xs-center pa-2"
|
|
v-bind:class="{ 'amber lighten-4': isSelected(props.item) }"
|
|
@click="selectMe(props.item)"
|
|
>
|
|
<p v-for="obj in props.item.ItemRequest" class="body-1 mb-0">
|
|
Batch: {{ obj.StockBatchNo }}, Jumlah: {{ obj.QtyReq }}, {{ obj.WarehouseName }}
|
|
</p>
|
|
</td>
|
|
<td
|
|
class="text-xs-center pa-2"
|
|
v-bind:class="{ 'amber lighten-4': isSelected(props.item) }"
|
|
@click="selectMe(props.item)"
|
|
>
|
|
{{ props.item.StockQty }}
|
|
</td>
|
|
<td
|
|
class="text-xs-center pa-2"
|
|
v-bind:class="{ 'amber lighten-4': isSelected(props.item) }"
|
|
@click="selectMe(props.item)"
|
|
>
|
|
{{ props.item.rioDQty }}
|
|
</td>
|
|
<td
|
|
class="text-xs-center pa-2"
|
|
v-bind:class="{ 'amber lighten-4': isSelected(props.item) }"
|
|
@click="selectMe(props.item)"
|
|
@blur="validateReceiveQty(props.item)"
|
|
>
|
|
{{ getRemaining(props.item) }} / {{ props.item.rioDReceiveQty }} {{ props.item.unitName }}
|
|
<p v-show="emptycheck.includes(props.item.rioDID)" style="color: red;" class="ma-0 pa-0">Jumlah melebihi request qty</p>
|
|
<p v-show="emptycheckvalue.includes(props.item.rioDID)" style="color: red;" class="ma-0 pa-0">Jumlah item harus diisi</p>
|
|
</td>
|
|
<!-- <td
|
|
class="text-xs-center pa-2"
|
|
v-bind:class="{ 'amber lighten-4': isSelected(props.item) }"
|
|
@click="selectMe(props.item)"
|
|
>
|
|
<v-text-field
|
|
v-model=""
|
|
type="number"
|
|
@input="validateReceiveQty(props.item)"
|
|
></v-text-field>
|
|
<p v-show="emptycheck.includes(props.item.rioDID)" style="color: red;" class="ma-0 pa-0">Jumlah melebihi request qty</p>
|
|
<p v-show="emptycheckvalue.includes(props.item.rioDID)" style="color: red;" class="ma-0 pa-0">Jumlah harus diisi</p>
|
|
</td> -->
|
|
<td
|
|
class="text-xs-center pa-2"
|
|
v-bind:class="{ 'amber lighten-4': isSelected(props.item) }"
|
|
@click="selectMe(props.item)"
|
|
>
|
|
<v-btn
|
|
style="min-width: 35px; height: 35px; margin: 0;"
|
|
small
|
|
color="orange" title="Pilih Batch Item"
|
|
@click="updateBatchNo(props.item)"
|
|
>
|
|
<v-icon small color="white">edit</v-icon>
|
|
</v-btn>
|
|
<v-btn style="min-width: 35px; height: 35px; margin: 0" small color="error" dark @click="deleteItem(props.item)"><v-icon small>close</v-icon></v-btn>
|
|
|
|
</td>
|
|
</template>
|
|
</v-data-table>
|
|
</v-flex>
|
|
</v-layout>
|
|
</v-card>
|
|
|
|
</v-card-text>
|
|
<v-card-actions>
|
|
<v-btn
|
|
v-if="act === 'edit'"
|
|
color="blue"
|
|
:disabled="loadingSave"
|
|
dark
|
|
@click="saveConfirm()"
|
|
>Konfirmasi</v-btn
|
|
>
|
|
<v-spacer></v-spacer>
|
|
<v-btn color="error" flat @click="closeDialogRequest()">
|
|
Tutup
|
|
</v-btn>
|
|
<v-btn
|
|
v-if="act === 'new'"
|
|
color="primary"
|
|
:disabled="loadingSave"
|
|
dark
|
|
@click="saveRequest()"
|
|
>Simpan</v-btn
|
|
>
|
|
<v-btn
|
|
v-if="act === 'edit'"
|
|
color="primary"
|
|
:disabled="loadingSave"
|
|
dark
|
|
@click="updateRequest()"
|
|
>Simpan Perubahan</v-btn
|
|
>
|
|
</v-card-actions>
|
|
</v-card>
|
|
</v-dialog>
|
|
</v-layout>
|
|
<one-dialog-batch></one-dialog-batch>
|
|
</div>
|
|
</template>
|
|
|
|
<script>
|
|
module.exports = {
|
|
name: "AddPurchaseRequestDialog",
|
|
components: {
|
|
"one-dialog-batch": httpVueLoader("./dialogBatch.vue")
|
|
},
|
|
data() {
|
|
return {
|
|
warehouseRules: [(v) => !!v || "Gudang harus diisi"],
|
|
divisionRules: [(v) => !!v || "Division harus diisi"],
|
|
validationForm: false,
|
|
headers: [
|
|
{
|
|
text: "NO. RIO",
|
|
align: "center",
|
|
sortable: false,
|
|
value: "itemName",
|
|
width: "20%",
|
|
class: "success lighten-3 white--text",
|
|
},
|
|
{
|
|
text: "ITEM",
|
|
align: "center",
|
|
sortable: false,
|
|
value: "itemName",
|
|
width: "35%",
|
|
class: "success lighten-3 white--text",
|
|
},
|
|
{
|
|
text: "SATUAN",
|
|
align: "center",
|
|
sortable: false,
|
|
value: "unitName",
|
|
width: "20%",
|
|
class: "success lighten-3 white--text",
|
|
},
|
|
{
|
|
text: "STOCK",
|
|
align: "center",
|
|
sortable: false,
|
|
value: "itemName",
|
|
width: "10%",
|
|
class: "success lighten-3 white--text",
|
|
},
|
|
{
|
|
text: "REQUEST QTY",
|
|
align: "center",
|
|
sortable: false,
|
|
value: "itemName",
|
|
width: "15%",
|
|
class: "success lighten-3 white--text",
|
|
},
|
|
{
|
|
text: "AKSI",
|
|
align: "center",
|
|
sortable: false,
|
|
value: "action",
|
|
width: "10%",
|
|
class: "success lighten-3 white--text",
|
|
},
|
|
],
|
|
headersItems: [
|
|
{
|
|
text: "NO. RIO",
|
|
align: "center",
|
|
sortable: false,
|
|
value: "action",
|
|
width: "10%",
|
|
class: "pa-2 pl-2 blue lighten-3 white--text",
|
|
},
|
|
{
|
|
text: "ITEM",
|
|
align: "center",
|
|
sortable: false,
|
|
value: "action",
|
|
width: "20%",
|
|
class: "pa-2 pl-2 blue lighten-3 white--text",
|
|
},
|
|
{
|
|
text: "ITEM GUDANG",
|
|
align: "center",
|
|
sortable: false,
|
|
value: "action",
|
|
width: "20%",
|
|
class: "pa-2 pl-2 blue lighten-3 white--text",
|
|
},
|
|
{
|
|
text: "STOCK",
|
|
align: "center",
|
|
sortable: false,
|
|
value: "action",
|
|
width: "10%",
|
|
class: "pa-2 pl-2 blue lighten-3 white--text",
|
|
},
|
|
{
|
|
text: "REQ QTY",
|
|
align: "center",
|
|
sortable: false,
|
|
value: "action",
|
|
width: "10%",
|
|
class: "pa-2 pl-2 blue lighten-3 white--text",
|
|
},
|
|
{
|
|
text: "JUMLAH (SISA REQUEST/ITEM OUT)",
|
|
align: "center",
|
|
sortable: false,
|
|
value: "action",
|
|
width: "20%",
|
|
class: "pa-2 pl-2 blue lighten-3 white--text",
|
|
},
|
|
{
|
|
text: "AKSI",
|
|
align: "center",
|
|
sortable: false,
|
|
value: "action",
|
|
width: "10%",
|
|
class: "pa-2 pl-2 blue lighten-3 white--text",
|
|
}
|
|
]
|
|
};
|
|
},
|
|
mounted() {
|
|
|
|
},
|
|
computed: {
|
|
user() {
|
|
return this.$store.state.requester.user;
|
|
},
|
|
dialogRequest: {
|
|
get() {
|
|
return this.$store.state.requester.dialogRequest;
|
|
},
|
|
set(val) {
|
|
this.$store.commit("requester/updateDialogRequest", val);
|
|
},
|
|
},
|
|
menuDateUse: {
|
|
get() {
|
|
return this.$store.state.requester.menuDateUse;
|
|
},
|
|
set(val) {
|
|
this.$store.commit("requester/updateMenuDateUse", val);
|
|
},
|
|
},
|
|
dateUseFormatted() {
|
|
return this.formatDate(this.xDateUse);
|
|
},
|
|
dDateUse: {
|
|
get() {
|
|
return this.$store.state.requester.dDateUse;
|
|
},
|
|
set(val) {
|
|
this.$store.commit("requester/updateDDateUse", val);
|
|
},
|
|
},
|
|
xDateUse: {
|
|
get() {
|
|
return this.$store.state.requester.xDateUse;
|
|
},
|
|
set(val) {
|
|
this.$store.commit("requester/updateXDateUse", val);
|
|
},
|
|
},
|
|
xNote: {
|
|
get() {
|
|
return this.$store.state.requester.xNote;
|
|
},
|
|
set(val) {
|
|
this.$store.commit("requester/updateXNote", val);
|
|
},
|
|
},
|
|
xWarehouse: {
|
|
get() {
|
|
return this.$store.state.requester.xWarehouse;
|
|
},
|
|
set(val) {
|
|
this.$store.commit("requester/updateXWarehouse", val);
|
|
this.$store.dispatch("requester/getItemRequest", {
|
|
search: this.searchItem,
|
|
warehouseID: this.xWarehouse.WarehouseID ? this.xWarehouse.WarehouseID : this.xWarehouse,
|
|
divisionID: this.selectedDivision.DivisionID ? this.selectedDivision.DivisionID : this.selectedDivision
|
|
});
|
|
},
|
|
},
|
|
xDepartment: {
|
|
get() {
|
|
return this.$store.state.requester.xDepartment;
|
|
},
|
|
set(val) {
|
|
this.$store.commit("requester/updateXDepartment", val);
|
|
},
|
|
},
|
|
warehouseOptions() {
|
|
return this.$store.state.requester.warehouseOptions;
|
|
},
|
|
departmentOptions() {
|
|
return this.$store.state.requester.departmentOptions;
|
|
},
|
|
regionalOptions() {
|
|
return this.$store.state.requester.regionalOptions;
|
|
},
|
|
branchOptions() {
|
|
return this.$store.state.requester.branchOptions;
|
|
},
|
|
xTotalPrice: {
|
|
get() {
|
|
return this.$store.state.requester.xTotalPrice;
|
|
},
|
|
set(val) {
|
|
this.$store.commit("requester/updateXTotalPrice", val);
|
|
},
|
|
},
|
|
xIOID() {
|
|
return this.$store.state.requester.xIOID;
|
|
},
|
|
act() {
|
|
return this.$store.state.requester.act;
|
|
},
|
|
divisionOptions() {
|
|
return this.$store.state.requester.divisionOptions;
|
|
},
|
|
selectedDivision: {
|
|
get() {
|
|
return this.$store.state.requester.selectedDivision;
|
|
},
|
|
set(val) {
|
|
this.$store.commit("requester/updateSelectedDivision", val);
|
|
this.$store.dispatch("requester/getItemRequest", {
|
|
search: this.searchItem,
|
|
warehouseID: this.xWarehouse.WarehouseID ? this.xWarehouse.WarehouseID : this.xWarehouse,
|
|
divisionID: this.selectedDivision.DivisionID ? this.selectedDivision.DivisionID : this.selectedDivision
|
|
});
|
|
},
|
|
},
|
|
dialogItem: {
|
|
get() {
|
|
return this.$store.state.requester.dialogItem;
|
|
},
|
|
set(val) {
|
|
this.$store.commit("requester/updateDialogItem", val);
|
|
},
|
|
},
|
|
searchItem: {
|
|
get() {
|
|
return this.$store.state.requester.searchItem;
|
|
},
|
|
set(val) {
|
|
this.$store.commit("requester/updateSearchItem", val);
|
|
},
|
|
},
|
|
loadingItem: {
|
|
get() {
|
|
return this.$store.state.requester.loadingItem;
|
|
},
|
|
set(val) {
|
|
this.$store.commit("requester/updateLoadingItem", val);
|
|
},
|
|
},
|
|
items() {
|
|
return this.$store.state.requester.items
|
|
},
|
|
itemTotalPage: {
|
|
get() {
|
|
return this.$store.state.requester.itemTotalPage;
|
|
},
|
|
set(val) {
|
|
this.$store.commit("requester/updateItemTotalPage", val);
|
|
},
|
|
},
|
|
itemCurrentPage: {
|
|
get() {
|
|
return this.$store.state.requester.itemCurrentPage;
|
|
},
|
|
set(val) {
|
|
this.$store.commit("requester/updateItemCurrentPage", val);
|
|
this.$store.dispatch("requester/getItemRequest", {
|
|
search: this.searchItem,
|
|
warehouseID: this.xWarehouse.WarehouseID ? this.xWarehouse.WarehouseID : "",
|
|
divisionID: this.selectedDivision.DivisionID ? this.selectedDivision.DivisionID : ""
|
|
});
|
|
},
|
|
},
|
|
selectedItems: {
|
|
get() {
|
|
return this.$store.state.requester.selectedItems;
|
|
},
|
|
set(val) {
|
|
this.$store.commit("requester/updateSelectedItems", val);
|
|
}
|
|
},
|
|
loadingSave: {
|
|
get() {
|
|
return this.$store.state.requester.loadingSave;
|
|
},
|
|
set(val) {
|
|
this.$store.commit("requester/updateLoadingSave", val);
|
|
}
|
|
},
|
|
emptycheck: {
|
|
get() {
|
|
return this.$store.state.requester.emptycheck;
|
|
},
|
|
set(val) {
|
|
this.$store.commit("requester/updateEmptycheck", val);
|
|
}
|
|
},
|
|
emptycheckvalue: {
|
|
get() {
|
|
return this.$store.state.requester.emptycheckvalue;
|
|
},
|
|
set(val) {
|
|
this.$store.commit("requester/updateEmptycheckvalue", val);
|
|
}
|
|
},
|
|
},
|
|
methods: {
|
|
isSelected(p) {
|
|
return (
|
|
p.rioDID ==
|
|
this.$store.state.requester.selectedItem
|
|
.rioDID
|
|
);
|
|
},
|
|
selectMe(sc) {
|
|
this.$store.commit("requester/updateSelectedItem", sc);
|
|
},
|
|
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")}`;
|
|
},
|
|
closeDialogRequest() {
|
|
this.$store.commit("requester/updateEmptycheck", []);
|
|
this.$store.commit("requester/updateEmptycheckvalue", []);
|
|
this.$store.commit(
|
|
"requester/updateXDateUse",
|
|
moment(new Date()).format("YYYY-MM-DD")
|
|
);
|
|
this.$store.commit("requester/updateXWarehouse", "");
|
|
this.$store.commit("requester/updateXDepartment", "");
|
|
this.$refs.formRequest.resetValidation();
|
|
this.$store.commit("requester/updateDialogRequest", false);
|
|
this.$store.commit("requester/updateTempBatchNumber", {
|
|
records: [],
|
|
total: 0
|
|
});
|
|
},
|
|
saveRequest() {
|
|
let empty = [];
|
|
let emptycheckvalue = [];
|
|
let tempSelectedItems = this.selectedItems;
|
|
|
|
if (tempSelectedItems.length == 0) {
|
|
this.$store.commit("requester/updateErrMessage", `[Error] data item belum dipilih`);
|
|
this.$store.commit("requester/updateAlertError", true);
|
|
return;
|
|
}
|
|
|
|
tempSelectedItems.forEach(e => {
|
|
let totalRequestQty = parseInt(e.rioDQty) || 0;
|
|
// let alreadyReceivedQty = parseInt(e.rioDReceiveQtyBeforeEdit) || 0;
|
|
let currentInputQty = parseInt(e.rioDReceiveQty) || 0;
|
|
|
|
// let remainingQty = totalRequestQty - alreadyReceivedQty; // sisa yg boleh diinput
|
|
|
|
// Kalau input user lebih besar dari sisa yang seharusnya
|
|
if (currentInputQty > totalRequestQty) {
|
|
empty.push(e.rioDID);
|
|
return;
|
|
}
|
|
|
|
// Kalau input user kosong atau 0
|
|
if (currentInputQty <= 0) {
|
|
emptycheckvalue.push(e.rioDID);
|
|
return;
|
|
}
|
|
});
|
|
|
|
if (empty.length === 0 && emptycheckvalue.length === 0) {
|
|
this.emptycheck = empty;
|
|
this.emptycheckvalue = emptycheckvalue;
|
|
this.$store.commit("requester/updateLoadingSave", true);
|
|
|
|
let prm = {
|
|
date: this.xDateUse,
|
|
note: this.xNote,
|
|
warehouseID: this.xWarehouse.WarehouseID ? this.xWarehouse.WarehouseID : this.xWarehouse,
|
|
divisionID: this.selectedDivision.DivisionID ? this.selectedDivision.DivisionID : this.selectedDivision,
|
|
items: this.selectedItems
|
|
};
|
|
|
|
// console.log('prm', prm)
|
|
this.$store.dispatch("requester/saveRequest", prm);
|
|
} else {
|
|
this.emptycheck = empty;
|
|
this.emptycheckvalue = emptycheckvalue;
|
|
}
|
|
},
|
|
updateRequest() {
|
|
let empty = [];
|
|
let emptycheckvalue = [];
|
|
let tempSelectedItems = this.selectedItems;
|
|
|
|
if (tempSelectedItems.length == 0) {
|
|
this.$store.commit("requester/updateErrMessage", `[Error] data item belum dipilih`);
|
|
this.$store.commit("requester/updateAlertError", true);
|
|
return;
|
|
}
|
|
|
|
// Mengecek jika jumlah yang diterima tidak melebihi jumlah yang diminta dan jika jumlah yang diterima adalah 0
|
|
tempSelectedItems.forEach(e => {
|
|
let qty = parseInt(e.rioDQty); // Jumlah yang diminta
|
|
let qtyReceive = parseInt(e.rioDReceiveQty); // Jumlah yang diterima
|
|
|
|
if (qtyReceive > qty) {
|
|
empty.push(e.rioDID); // Menandai item jika qtyReceive melebihi qty yang diminta
|
|
return;
|
|
}
|
|
if (qtyReceive === 0) {
|
|
emptycheckvalue.push(e.rioDID); // Menandai item jika qtyReceive adalah 0
|
|
return;
|
|
}
|
|
});
|
|
|
|
// Jika tidak ada item yang memiliki masalah pada qtyReceive
|
|
if (empty.length === 0 && emptycheckvalue.length === 0) {
|
|
this.emptycheck = empty; // Menyimpan item yang qtyReceive-nya melebihi qty
|
|
this.emptycheckvalue = emptycheckvalue; // Menyimpan item yang qtyReceive-nya 0
|
|
|
|
this.$store.commit("requester/updateLoadingSave", true);
|
|
let prm = {
|
|
date: this.xDateUse,
|
|
note: this.xNote,
|
|
warehouseID: this.xWarehouse.WarehouseID ? this.xWarehouse.WarehouseID : this.xWarehouse,
|
|
divisionID: this.selectedDivision.DivisionID ? this.selectedDivision.DivisionID : this.selectedDivision,
|
|
IOID: this.xIOID,
|
|
items: this.selectedItems
|
|
};
|
|
|
|
// console.log(prm);
|
|
this.$store.dispatch("requester/updateRequest", prm);
|
|
} else {
|
|
this.emptycheck = empty;
|
|
this.emptycheckvalue = emptycheckvalue;
|
|
}
|
|
},
|
|
saveConfirm() {
|
|
this.$store.commit("requester/updateLoadingSave", true);
|
|
let prm = {
|
|
ioID: this.xIOID,
|
|
}
|
|
this.$store.dispatch("requester/confirmIO", prm);
|
|
},
|
|
itemSearch() {
|
|
this.$store.dispatch("requester/getItemRequest", {
|
|
search: this.searchItem,
|
|
warehouseID: this.xWarehouse.WarehouseID ? this.xWarehouse.WarehouseID : "",
|
|
divisionID: this.selectedDivision
|
|
});
|
|
},
|
|
checkSelected(item) {
|
|
let selectedItems = this.selectedItems;
|
|
let rtn = false
|
|
if(selectedItems.length == 0) {
|
|
// console.log(item.rioDID,"selectedItems.length == 0");
|
|
rtn = false;
|
|
}
|
|
selectedItems.forEach(itemloop => {
|
|
if(itemloop.rioDID == item.rioDID) {
|
|
// console.log(item.rioDID,"itemloop.rioDID == item.rioDID");
|
|
rtn = true;
|
|
}
|
|
});
|
|
// console.log(item.rioDID,"return false");
|
|
return rtn;
|
|
},
|
|
addItem(item) {
|
|
let selectedItems = this.selectedItems;
|
|
let index = selectedItems.findIndex(itemloop => itemloop.rioDID == item.rioDID);
|
|
if(index == -1) {
|
|
item.rioDReceiveQtyBeforeEdit = parseInt(item.rioDReceiveQty) || 0;
|
|
selectedItems.push(item);
|
|
}
|
|
|
|
this.$store.commit("requester/updateSelectedItems", selectedItems);
|
|
},
|
|
deleteItem(item) {
|
|
let selectedItems = this.selectedItems;
|
|
let index = selectedItems.findIndex(itemloop => itemloop.rioDID == item.rioDID);
|
|
if (index != -1) {
|
|
selectedItems.splice(index, 1);
|
|
}
|
|
|
|
// Reset receiveQty ke nilai awal sebelum edit
|
|
// item.rioDReceiveQty = item.rioDReceiveQtyBeforeEdit || 0;
|
|
|
|
// Bersihkan warning
|
|
this.emptycheck = this.emptycheck.filter(id => id !== item.rioDID);
|
|
this.emptycheckvalue = this.emptycheckvalue.filter(id => id !== item.rioDID);
|
|
|
|
// Commit perubahan
|
|
this.$store.commit("requester/updateSelectedItems", selectedItems);
|
|
},
|
|
validateReceiveQtyolds(item) {
|
|
let totalRequestQty = parseInt(item.rioDQty) || 0;
|
|
let alreadyReceivedQty = parseInt(item.rioDReceiveQtyBeforeEdit) || 0;
|
|
let inputReceiveQty = parseInt(item.rioDReceiveQty) || 0;
|
|
|
|
// Hitung jumlah kumulatif
|
|
// let cumulativeReceiveQty = alreadyReceivedQty + inputReceiveQty;
|
|
|
|
if (inputReceiveQty > totalRequestQty) {
|
|
// let allowedQty = totalRequestQty - alreadyReceivedQty; // Sisa yang boleh diterima
|
|
// item.rioDReceiveQty = allowedQty; // Set input sesuai maksimal sisa
|
|
if (!this.emptycheck.includes(item.rioDID)) {
|
|
this.emptycheck.push(item.rioDID);
|
|
}
|
|
} else {
|
|
this.emptycheck = this.emptycheck.filter(id => id !== item.rioDID);
|
|
}
|
|
|
|
// Kalau kosong atau 0, kasih warning juga
|
|
if (inputReceiveQty <= 0) {
|
|
if (!this.emptycheckvalue.includes(item.rioDID)) {
|
|
this.emptycheckvalue.push(item.rioDID);
|
|
}
|
|
} else {
|
|
this.emptycheckvalue = this.emptycheckvalue.filter(id => id !== item.rioDID);
|
|
}
|
|
},
|
|
getRemaining(item) {
|
|
const totalRequestQty = parseInt(item.rioDQty) || 0;
|
|
const alreadyReceivedQty = parseInt(item.rioDReceiveQtyBeforeEdit) || 0;
|
|
const currentInputQty = parseInt(item.rioDReceiveQty) || 0;
|
|
|
|
return totalRequestQty - currentInputQty;
|
|
},
|
|
updateBatchNo(val) {
|
|
let params = {
|
|
itemid: val.rioDItemID,
|
|
unitid: val.rioDItemUnitID,
|
|
batchno: ""
|
|
}
|
|
this.$store.commit("requester/update_dialog_batchitem", true);
|
|
this.$store.commit("requester/update_buffer_detailitem", val);
|
|
this.$store.dispatch("requester/getBatchItemDetail", params);
|
|
|
|
if (val.ItemRequest.length > 0) {
|
|
this.$store.commit("requester/update_form_batchitem", val.ItemRequest)
|
|
}
|
|
}
|
|
},
|
|
watch: {
|
|
|
|
}
|
|
};
|
|
</script>
|