Files
fe-accone/test/vuex/acc-one-faktur-v4/module/form.js
2026-07-20 13:14:28 +07:00

357 lines
17 KiB
JavaScript

import * as api from "../api/form.js";
export default {
namespaced: true,
state: {
opendialog: false,
user: one_user(),
form_faktur: {
form_date: moment(new Date()).format("YYYY-MM-DD"),
form_duedate: moment(new Date()).format("YYYY-MM-DD"),
form_draftdate: moment(new Date()).format("YYYY-MM-DD"),
form_supplier: {},
form_po: {},
form_refnumber: "",
form_supplier_invoicenum: "",
form_supplier_invoicedate: moment(new Date()).format("YYYY-MM-DD"),
form_tax_percent_pph: 0.00,
form_tax_amount_pph: 0.00,
form_tax_percent_ppn: 0.00,
form_tax_amount_ppn: 0.00,
form_disc_po: 0.00,
form_disc_amount: 0.00,
form_disc_type: "",
form_subtotal: 0.00,
form_grandtotal: 0.00,
form_note: "",
form_adjust_amount: 0.00,
form_adjust_note: "",
form_shipping_cost: 0.00,
},
// form tambah item
dialog_item: false,
form_ro: {},
form_item: [],
is_create: false,
},
mutations: {
update_opendialog(state, data) {
state.opendialog = data
},
update_form_faktur(state, data) {
state.form_faktur = data
},
update_form_ro(state, data) {
state.form_ro = data
},
update_form_item(state, data) {
state.form_item = data
},
update_dialog_item(state, data) {
state.dialog_item = data
},
update_is_create(state, data) {
state.is_create = data
}
},
actions: {
resetForm(context) {
const form_faktur = {
form_date: moment(new Date()).format("YYYY-MM-DD"),
form_duedate: moment(new Date()).format("YYYY-MM-DD"),
form_draftdate: moment(new Date()).format("YYYY-MM-DD"),
form_supplier: {},
form_po: {},
form_refnumber: "",
form_supplier_invoicenum: "",
form_supplier_invoicedate: moment(new Date()).format("YYYY-MM-DD"),
form_tax_percent_pph: 0.00,
form_tax_amount_pph: 0.00,
form_tax_percent_ppn: 0.00,
form_tax_amount_ppn: 0.00,
form_disc_po: 0.00,
form_disc_amount: 0.00,
form_disc_type: "R",
form_subtotal: 0.00,
form_grandtotal: 0.00,
form_note: "",
form_adjust_amount: 0.00,
form_adjust_note: "",
form_shipping_cost: 0.00,
}
context.commit("update_form_faktur", form_faktur)
context.commit("update_form_ro", {})
context.commit("update_form_item", [])
context.commit("data/update_list_po", {records: [], total: 0}, {root: true})
},
async calcSummary(context) {
try {
let item = context.state.form_item
let faktur = context.state.form_faktur
if (item.length > 0) {
let sub = 0
let podisc = 0
item.forEach(ite => {
let price = Number(ite.ReceiveOrderPoDetailPrice)
let disc = Number(ite.Discount)
let qty = Number(ite.ReceiveOrderPoDetailQty)
if (ite.PurchaseOrderSummaryDiscountType == 'P') {
disc = (price * Number(ite.Discount)) / 100
}
sub = sub + (qty * (price - disc))
podisc = podisc + Number(ite.ReceiveOrderPoDetailDiskonPoProrata)
});
let pph = (sub - podisc) * (Number(faktur.form_tax_percent_pph) / 100)
let ppn = (sub - podisc) * (Number(faktur.form_tax_percent_ppn) / 100)
let grandtotal = 0;
let dpamount = Number(faktur.dp_amount);
if (faktur.type_purchase == 'aset') {
grandtotal = (sub - podisc) + ( pph + ppn) - dpamount
grandtotal = grandtotal + Number(faktur.form_adjust_amount) + Number(faktur.form_shipping_cost)
} else {
grandtotal = (sub - podisc + pph + ppn) + Number(faktur.form_adjust_amount) + Number(faktur.form_shipping_cost)
}
// Store exact values with 2 decimal places using floor instead of rounding
// This prevents rounding errors in financial calculations
faktur.form_subtotal = sub
faktur.form_disc_amount = podisc
faktur.form_tax_amount_ppn = ppn
faktur.form_tax_amount_pph = pph
faktur.form_grandtotal = grandtotal
} else {
faktur.form_subtotal = 0.00
faktur.form_disc_amount = 0.00
faktur.form_grandtotal = 0.00
faktur.form_tax_amount_pph = 0.00
faktur.form_tax_amount_ppn = 0.00
faktur.form_adjust_amount = 0.00
faktur.form_adjust_note = ""
faktur.dp_amount = 0.00
}
context.commit("update_form_faktur", faktur)
} catch (error) {
let snacc = {isOpen: true, message: error.message, color: "error"}
context.commit("data/update_snack", snacc, {root: true})
}
},
async createFaktur(context) {
try {
let item = context.state.form_item
let para_item = []
let param = {
SIPoID: context.state.form_faktur.form_po.PurchaseOrderID,
SIDate: context.state.form_faktur.form_date,
SIDueDate: context.state.form_faktur.form_duedate,
SIDraftDate: context.state.form_faktur.form_draftdate,
SISupplierID: context.state.form_faktur.form_supplier.SupplierID,
SIRefNumber: context.state.form_faktur.form_refnumber,
SISupplierInvoiceNumber: context.state.form_faktur.form_supplier_invoicenum,
SISupplierInvoiceDate: context.state.form_faktur.form_supplier_invoicedate,
SISubTotal: context.state.form_faktur.form_subtotal,
SIDiscountPercent: context.state.form_faktur.form_disc_type == 'P' ? context.state.form_faktur.form_disc_po : 0,
SIDiscountAmount: context.state.form_faktur.form_disc_amount,
SITaxPercentPph: context.state.form_faktur.form_tax_percent_pph,
SITaxAmountPph: context.state.form_faktur.form_tax_amount_pph,
SITaxPercentPpn: context.state.form_faktur.form_tax_percent_ppn,
SITaxAmountPpn: context.state.form_faktur.form_tax_amount_ppn,
SIShippingCost: context.state.form_faktur.form_shipping_cost,
SIAdjustmentAmount: context.state.form_faktur.form_adjust_amount,
SIAdjustmentNote: context.state.form_faktur.form_adjust_note,
SIGrandTotal: context.state.form_faktur.form_grandtotal,
SINote: context.state.form_faktur.form_note,
SIReceiveDate: moment(new Date()).format("YYYY-MM-DD"),
SIReceivedBy: context.state.user.M_UserID,
SIStatus: 'Draft',
SIDetail: [],
token: one_token()
}
item.forEach(ele => {
let a = {
SIDPOID: ele.ReceiveOrderPoDetailPurchaseOrderID,
SIDPOSummaryID: ele.ReceiveOrderPoDetailPurchaseOrderSummaryID,
SIDROID: ele.ReceiveOrderPoDetailReceiveOrderPoID,
SIDRODetailID: ele.ReceiveOrderPoDetailID,
SIDItemID: ele.M_ItemID,
SIDItemUnitID: ele.ReceiveOrderPoItemUnitID,
SIDDescription: ele.M_ItemDesc,
SIDQty: ele.ReceiveOrderPoDetailQty,
SIDPrice: ele.ReceiveOrderPoDetailPrice,
SIDDiscountPercent: ele.PurchaseOrderSummaryDiscountType == 'P' ? ele.Discount: 0,
SIDDiscountRupiah: ele.PurchaseOrderSummaryDiscountType == 'R' ? ele.Discount: 0,
SIDDiscountType: ele.PurchaseOrderSummaryDiscountType,
SIDDiscountAmount: ele.disc_amount,
SIDDiscountPOProrata: ele.ReceiveOrderPoDetailDiskonPoProrata,
SIDTotal: ele.subtotal
}
para_item.push(a)
});
param.SIDetail = para_item
let resp = await api.CreateFaktur(param)
if (resp.status != 'OK') {
let snacc = {isOpen: true, message: resp.message, color: "error"}
context.commit("data/update_snack", snacc, {root: true})
} else {
let snacc = {isOpen: true, message: 'Success', color: "success"}
context.commit("data/update_snack", snacc, {root: true})
context.dispatch("data/getListFaktur", {}, {root: true})
context.commit("update_opendialog", false)
}
} catch (error) {
let snacc = {isOpen: true, message: error.message, color: "error"}
context.commit("data/update_snack", snacc, {root: true})
}
},
async updateFaktur(context) {
try {
let faktur = context.state.form_faktur
let param = {
SIPoID: faktur.form_po.PurchaseOrderID,
SIDate: faktur.form_date,
SIDueDate: faktur.form_duedate,
SIDraftDate: faktur.form_draftdate,
SISupplierID: faktur.form_supplier.SupplierID,
SIRefNumber: faktur.form_refnumber,
SISupplierInvoiceNumber: faktur.form_supplier_invoicenum,
SISupplierInvoiceDate: faktur.form_supplier_invoicedate,
SISubTotal: faktur.form_subtotal,
SIDiscountPercent: faktur.form_disc_type == 'P' ? faktur.form_disc_po : 0,
SIDiscountAmount: faktur.form_disc_amount,
SITaxPercentPph: faktur.form_tax_percent_pph,
SITaxAmountPph: faktur.form_tax_amount_pph,
SITaxPercentPpn: faktur.form_tax_percent_ppn,
SITaxAmountPpn: faktur.form_tax_amount_ppn,
SIShippingCost: faktur.form_shipping_cost,
SIAdjustmentAmount: faktur.form_adjust_amount,
SIAdjustmentNote: faktur.form_adjust_note,
SIGrandTotal: faktur.form_grandtotal,
SINote: faktur.form_note,
SIStatus: 'Draft',
SIDetail: [],
fakturID: faktur.fakturID,
token: one_token()
}
let item = context.state.form_item
let detail = []
item.forEach(ele => {
let a = {
SIDPOID: ele.ReceiveOrderPoDetailPurchaseOrderID,
SIDPOSummaryID: ele.ReceiveOrderPoDetailPurchaseOrderSummaryID,
SIDROID: ele.ReceiveOrderPoDetailReceiveOrderPoID,
SIDRODetailID: ele.ReceiveOrderPoDetailID,
SIDItemID: ele.M_ItemID,
SIDItemUnitID: ele.ReceiveOrderPoItemUnitID,
SIDDescription: ele.M_ItemDesc,
SIDQty: ele.ReceiveOrderPoDetailQty,
SIDPrice: ele.ReceiveOrderPoDetailPrice,
SIDDiscountPercent: ele.PurchaseOrderSummaryDiscountType == 'P' ? ele.Discount: 0,
SIDDiscountRupiah: ele.PurchaseOrderSummaryDiscountType == 'R' ? ele.Discount: 0,
SIDDiscountType: ele.PurchaseOrderSummaryDiscountType,
SIDDiscountAmount: ele.disc_amount,
SIDDiscountPOProrata: ele.ReceiveOrderPoDetailDiskonPoProrata,
SIDTotal: ele.subtotal
}
detail.push(a)
})
param.SIDetail = detail
// console.log('param update', param)
let resp = await api.UpdateFaktur(param)
if (resp.status != 'OK') {
let snacc = {isOpen: true, message: resp.message, color: "error"}
context.commit("data/update_snack", snacc, {root: true})
} else {
let snacc = {isOpen: true, message: 'Success', color: "success"}
context.commit("data/update_snack", snacc, {root: true})
context.dispatch("data/getListFaktur", {}, {root: true})
context.commit("update_opendialog", false)
}
} catch (error) {
let snacc = {isOpen: true, message: error.message, color: "error"}
context.commit("data/update_snack", snacc, {root: true})
}
},
async deleteFaktur(context, params) {
try {
params.token = one_token()
let resp = await api.DeleteFaktur(params)
if (resp.status != 'OK') {
let snacc = {isOpen: true, message: resp.message, color: "error"}
context.commit("data/update_snack", snacc, {root: true})
} else {
let snacc = {isOpen: true, message: 'Success', color: "success"}
context.commit("data/update_snack", snacc, {root: true})
context.dispatch("data/getListFaktur", {}, {root: true})
}
} catch (error) {
let snacc = {isOpen: true, message: error.message, color: "error"}
context.commit("data/update_snack", snacc, {root: true})
}
},
async approveFaktur(context, param) {
try {
param.token = one_token()
let resp = await api.ApproveFaktur(param)
if (resp.status != 'OK') {
let snacc = {isOpen: true, message: resp.message, color: "error"}
context.commit("data/update_snack", snacc, {root: true})
} else {
let snacc = {isOpen: true, message: 'Success', color: "success"}
context.commit("data/update_snack", snacc, {root: true})
context.dispatch("data/getListFaktur", {}, {root: true})
}
} catch (error) {
let snacc = {isOpen: true, message: error.message, color: "error"}
context.commit("data/update_snack", snacc, {root: true})
}
},
async rejectFaktur(context, param) {
try {
param.token = one_token()
let resp = await api.RejectFaktur(param)
if (resp.status != 'OK') {
let snacc = {isOpen: true, message: resp.message, color: "error"}
context.commit("data/update_snack", snacc, {root: true})
} else {
let snacc = {isOpen: true, message: 'Success', color: "success"}
context.commit("data/update_snack", snacc, {root: true})
context.dispatch("data/getListFaktur", {}, {root: true})
}
} catch (error) {
let snacc = {isOpen: true, message: error.message, color: "error"}
context.commit("data/update_snack", snacc, {root: true})
}
},
async verifyFaktur(context, param) {
try {
param.token = one_token()
let resp = await api.VerifyFaktur(param)
if (resp.status != 'OK') {
let snacc = {isOpen: true, message: resp.message, color: "error"}
context.commit("data/update_snack", snacc, {root: true})
} else {
let snacc = {isOpen: true, message: 'Success', color: "success"}
context.commit("data/update_snack", snacc, {root: true})
context.dispatch("data/getListFaktur", {}, {root: true})
}
} catch (error) {
let snacc = {isOpen: true, message: error.message, color: "error"}
context.commit("data/update_snack", snacc, {root: true})
}
}
}
}