Files
fe-accone/test/vuex/acc-one-approval-po-asset/modules/form-view.js
2026-07-20 13:14:28 +07:00

198 lines
7.1 KiB
JavaScript

import * as api from "../api/api.js";
export default {
namespaced: true,
state: {
form_order: {
podate: moment(new Date()).format('YYYY-MM-DD'),
supplierID: "",
reference: "",
branchID: "",
gudangID: "",
typepajak: "percent",
valuepajak: 0,
typediskon: "percent",
valuediskon: 0,
catatan: ""
},
form_kontrak: {
nama_kontrak: '',
tanggal_kontrak: moment(new Date()).format('YYYY-MM-DD'),
tanggalAwal_kontrak: moment(new Date()).format('YYYY-MM-DD'),
tanggalAkhir_kontrak: moment(new Date()).format('YYYY-MM-DD'),
durasi_cicilan: 1,
jumlah_cicilan: 1,
tanggalBayar_cicilan: 1,
besarNilai_cicilan: 0,
type_downpayment: 'percent',
besarNilai_downpayment: 0
},
received_order: [],
summary_order: {
subtotal: 0,
diskon: 0,
pajak: 0,
downpayment: 0,
total_before_downpayment: 0,
total: 0
}
},
mutations: {
update_form_order(state, val) {
state.form_order = val
},
update_form_kontrak(state, val) {
state.form_kontrak = val
},
update_received_order(state, val) {
state.received_order = val
},
update_summary_order(state, val) {
state.summary_order = val
}
},
actions: {
async getDetailDataPO(context, poID) {
try {
const params = {
token: one_token(),
poID: poID,
};
const resp = await api.getDataKontrakPoAset(params);
if (resp.status != 'OK') {
throw new Error(resp.message);
}
let formOrder = {
podate: resp.data.podate,
supplierID: resp.data.supplierID,
reference: resp.data.reference,
branchID: resp.data.branchID,
gudangID: resp.data.gudangID,
typepajak: resp.data.typepajak,
valuepajak: parseFloat(resp.data.valuepajak),
typediskon: resp.data.typediskon,
valuediskon: parseFloat(resp.data.valuediskon),
catatan: resp.data.catatan
};
let formKontrak = {
nama_kontrak: resp.data.contractName,
tanggal_kontrak: resp.data.contractDate,
tanggalAwal_kontrak: resp.data.contractStart,
tanggalAkhir_kontrak: resp.data.contractEnd,
durasi_cicilan: resp.data.contractDuration,
jumlah_cicilan: resp.data.installmentNumber,
tanggalBayar_cicilan: resp.data.installmentDate,
besarNilai_cicilan: parseFloat(resp.data.installmentPayAmount),
type_downpayment: resp.data.installmentDownPaymentType,
besarNilai_downpayment: parseFloat(resp.data.installmentDownPayment),
};
let summary = resp.data.summary;
let selected_request = resp.data.detail;
selected_request.forEach(item => {
item.SupplierPrice = parseFloat(item.SupplierPrice)
item.DiskonAmount = parseFloat(item.DiskonAmount)
});
context.dispatch('orderAsset/listingGudang', resp.data.branchID, { root: true });
context.commit('update_form_kontrak', formKontrak);
context.commit("update_form_order", formOrder);
context.commit("update_received_order", selected_request);
context.commit("update_summary_order", summary);
context.dispatch('recalculateOrderSummary');
} catch (e) {
const snac = { color: 'error', msg: e.message, state: true };
context.commit("orderAsset/update_snackbar", snac, { root: true });
}
},
async recalculateOrderSummary(context) {
const formOrder = context.state.form_order;
const formKontrak = context.state.form_kontrak;
const items = JSON.parse(JSON.stringify(context.state.received_order));
const calculatedItems = items.map(item => {
const supplierPrice = parseCurrency(item.SupplierPrice);
const requestQty = item.detail.reduce((sum, detail) => {
return sum + parseCurrency(detail.RequestQty);
}, 0);
let itemDiscount = 0;
if (item.DiskonType == 'P') {
itemDiscount = supplierPrice * parseCurrency(item.DiskonAmount) / 100;
} else {
itemDiscount = parseCurrency(item.DiskonAmount);
}
const endPrice = Math.max(supplierPrice - itemDiscount, 0);
const tempTotal = requestQty * endPrice;
return {
...item,
RequestQty: requestQty,
EndPrice: endPrice,
TempTotal: tempTotal,
detail: item.detail.map(detail => ({
...detail,
SupplierPrice: supplierPrice
}))
};
});
const subtotal = calculatedItems.reduce((sum, item) => {
return sum + parseCurrency(item.TempTotal);
}, 0);
const diskon = calculateByType(
formOrder.typediskon,
formOrder.valuediskon,
subtotal
);
const subtotalAfterDiskon = Math.max(subtotal - diskon, 0);
const pajak = calculateByType(
formOrder.typepajak,
formOrder.valuepajak,
subtotalAfterDiskon
);
const totalBeforeDownpayment = subtotalAfterDiskon + pajak;
const downpayment = calculateByType(
formKontrak.type_downpayment,
formKontrak.besarNilai_downpayment,
totalBeforeDownpayment
);
const total = Math.max(totalBeforeDownpayment - downpayment, 0);
context.commit('update_received_order', calculatedItems);
context.commit('update_summary_order', {
subtotal: subtotal,
diskon: diskon,
pajak: pajak,
downpayment: downpayment,
total_before_downpayment: totalBeforeDownpayment,
total: total
});
}
}
}
function parseCurrency(value) {
let cleanValue = String(value || 0).replace(/\./g, '');
cleanValue = cleanValue.replace(',', '.');
return parseFloat(cleanValue) || 0;
}
function calculateByType(type, value, base) {
const amount = parseCurrency(value);
if (type == 'percent') {
return base * amount / 100;
}
return amount;
}