|
|
|
@ -9,7 +9,7 @@ import { useDialogPluginComponent } from 'quasar';
|
|
|
|
|
import { usePrintService } from 'composables/usePrintService';
|
|
|
|
|
import useNotify from 'src/composables/useNotify.js';
|
|
|
|
|
import FetchData from 'components/FetchData.vue';
|
|
|
|
|
import FormModel from 'components/FormModel.vue';
|
|
|
|
|
import FormModelPopup from 'components/FormModelPopup.vue';
|
|
|
|
|
import VnRow from 'components/ui/VnRow.vue';
|
|
|
|
|
import VnInputDate from 'components/common/VnInputDate.vue';
|
|
|
|
|
import VnInputNumber from 'components/common/VnInputNumber.vue';
|
|
|
|
@ -74,39 +74,44 @@ const filterRecordFindOne = {
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const initialData = reactive({
|
|
|
|
|
amountPaid: $props.totalCredit,
|
|
|
|
|
supplierFk: route.params.id,
|
|
|
|
|
companyFk: $props.companyId,
|
|
|
|
|
bankFk: $props.bankId,
|
|
|
|
|
email: recordFindOne.value.email,
|
|
|
|
|
received: '2001-01-01T11:00:00.000Z',
|
|
|
|
|
supplierFk: '1',
|
|
|
|
|
amount: 123123,
|
|
|
|
|
currencyFk: 1,
|
|
|
|
|
bankFk: 3,
|
|
|
|
|
concept: 'Credit Card, ',
|
|
|
|
|
amountToReturn: null,
|
|
|
|
|
orderBy: 'issued',
|
|
|
|
|
payMethodFk: 1,
|
|
|
|
|
bankingFees: 0,
|
|
|
|
|
companyFk: 442,
|
|
|
|
|
divisa: null,
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
onBeforeMount(() => {
|
|
|
|
|
urlCreate.value = `Suppliers/${route.params.id}/createReceipt`;
|
|
|
|
|
urlCreate.value = `Suppliers/${route.params.id}/createPayment`;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
function setPaymentType(accounting) {
|
|
|
|
|
if (!accounting) return;
|
|
|
|
|
accountingType.value = accounting.accountingType;
|
|
|
|
|
|
|
|
|
|
initialData.description = [];
|
|
|
|
|
initialData.payed = Date.vnNew();
|
|
|
|
|
initialData.concept = [];
|
|
|
|
|
initialData.received = Date.vnNew();
|
|
|
|
|
isCash.value = accountingType.value.code == 'cash';
|
|
|
|
|
viewReceipt.value = isCash.value;
|
|
|
|
|
if (accountingType.value.daysInFuture)
|
|
|
|
|
initialData.payed.setDate(
|
|
|
|
|
initialData.payed.getDate() + accountingType.value.daysInFuture
|
|
|
|
|
initialData.received.setDate(
|
|
|
|
|
initialData.received.getDate() + accountingType.value.daysInFuture
|
|
|
|
|
);
|
|
|
|
|
maxAmount.value = accountingType.value && accountingType.value.maxAmount;
|
|
|
|
|
|
|
|
|
|
if (accountingType.value.code == 'compensation')
|
|
|
|
|
return (initialData.description = '');
|
|
|
|
|
if (accountingType.value.receiptDescription)
|
|
|
|
|
initialData.description.push(accountingType.value.receiptDescription);
|
|
|
|
|
if (initialData.description) initialData.description.push(initialData.description);
|
|
|
|
|
if (accountingType.value.code == 'compensation') return (initialData.concept = '');
|
|
|
|
|
if (accountingType.value.receiptconcept)
|
|
|
|
|
initialData.concept.push(accountingType.value.receiptconcept);
|
|
|
|
|
if (initialData.concept) initialData.concept.push(initialData.concept);
|
|
|
|
|
|
|
|
|
|
initialData.description = initialData.description.join(', ');
|
|
|
|
|
initialData.concept = initialData.concept.join(', ');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const calculateFromAmount = (event) => {
|
|
|
|
@ -115,17 +120,18 @@ const calculateFromAmount = (event) => {
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const calculateFromDeliveredAmount = (event) => {
|
|
|
|
|
initialData.amountToReturn = parseFloat(event) - initialData.amountPaid;
|
|
|
|
|
initialData.amountToReturn = parseFloat(event) - initialData.amount;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
function onBeforeSave(data) {
|
|
|
|
|
const exceededAmount = data.amountPaid > maxAmount.value;
|
|
|
|
|
const exceededAmount = data.amount > maxAmount.value;
|
|
|
|
|
if (isCash.value && exceededAmount)
|
|
|
|
|
return notify(t('Amount exceeded', { maxAmount: maxAmount.value }), 'negative');
|
|
|
|
|
|
|
|
|
|
if (isCash.value && shouldSendEmail.value && !data.email)
|
|
|
|
|
return notify(t(`There is no assigned email for this supplier`), 'negative');
|
|
|
|
|
|
|
|
|
|
data.dueDate = data.received;
|
|
|
|
|
data.bankFk = data.bankFk.id;
|
|
|
|
|
return data;
|
|
|
|
|
}
|
|
|
|
@ -144,25 +150,7 @@ async function onDataSaved(formData, { id }) {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async function accountShortToStandard({ target: { value } }) {
|
|
|
|
|
if (!value) return (initialData.description = '');
|
|
|
|
|
initialData.compensationAccount = value.replace('.', '0'.repeat(11 - value.length));
|
|
|
|
|
const params = { bankAccount: initialData.compensationAccount };
|
|
|
|
|
const { data } = await axios(`Clients/getClientOrSupplierReference`, { params });
|
|
|
|
|
if (!data.clientId) {
|
|
|
|
|
initialData.description = t('Supplier Compensation Reference', {
|
|
|
|
|
supplierId: data.supplierId,
|
|
|
|
|
supplierName: data.supplierName,
|
|
|
|
|
});
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
initialData.description = t('Client Compensation Reference', {
|
|
|
|
|
clientId: data.clientId,
|
|
|
|
|
clientName: data.clientName,
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async function getAmountPaid() {
|
|
|
|
|
async function getAmount() {
|
|
|
|
|
const filter = {
|
|
|
|
|
where: {
|
|
|
|
|
supplierFk: route.params.id,
|
|
|
|
@ -170,7 +158,7 @@ async function getAmountPaid() {
|
|
|
|
|
},
|
|
|
|
|
};
|
|
|
|
|
const { data } = await getSupplierRisk(filter);
|
|
|
|
|
initialData.amountPaid = (data?.length && data[0].amount) || undefined;
|
|
|
|
|
initialData.amount = (data?.length && data[0].amount) || undefined;
|
|
|
|
|
}
|
|
|
|
|
</script>
|
|
|
|
|
|
|
|
|
@ -195,7 +183,7 @@ async function getAmountPaid() {
|
|
|
|
|
@on-fetch="(data) => (currenciesOptions = data)"
|
|
|
|
|
auto-load
|
|
|
|
|
/>
|
|
|
|
|
<FormModel
|
|
|
|
|
<FormModelPopup
|
|
|
|
|
ref="formModelRef"
|
|
|
|
|
:form-initial-data="initialData"
|
|
|
|
|
:observe-form-changes="false"
|
|
|
|
@ -203,7 +191,7 @@ async function getAmountPaid() {
|
|
|
|
|
:mapper="onBeforeSave"
|
|
|
|
|
@on-data-saved="onDataSaved"
|
|
|
|
|
>
|
|
|
|
|
<template #form="{ data, validate }">
|
|
|
|
|
<template #form-inputs="{ data, validate }">
|
|
|
|
|
<span ref="closeButton" class="row justify-end close-icon" v-close-popup>
|
|
|
|
|
<QIcon name="close" size="sm" />
|
|
|
|
|
</span>
|
|
|
|
@ -213,7 +201,7 @@ async function getAmountPaid() {
|
|
|
|
|
<VnInputDate
|
|
|
|
|
:label="t('Date')"
|
|
|
|
|
:required="true"
|
|
|
|
|
v-model="data.payed"
|
|
|
|
|
v-model="data.received"
|
|
|
|
|
/>
|
|
|
|
|
<VnSelect
|
|
|
|
|
:label="t('Company')"
|
|
|
|
@ -224,7 +212,7 @@ async function getAmountPaid() {
|
|
|
|
|
option-label="code"
|
|
|
|
|
option-value="id"
|
|
|
|
|
v-model="data.companyFk"
|
|
|
|
|
@update:model-value="getAmountPaid()"
|
|
|
|
|
@update:model-value="getAmount()"
|
|
|
|
|
/>
|
|
|
|
|
</VnRow>
|
|
|
|
|
<VnRow>
|
|
|
|
@ -251,33 +239,30 @@ async function getAmountPaid() {
|
|
|
|
|
</QItem>
|
|
|
|
|
</template>
|
|
|
|
|
</VnSelect>
|
|
|
|
|
<VnSelect
|
|
|
|
|
:label="t('supplier.billingData.payMethodFk')"
|
|
|
|
|
v-model="data.payMethodFk"
|
|
|
|
|
url="Paymethods"
|
|
|
|
|
auto-load
|
|
|
|
|
option-value="id"
|
|
|
|
|
option-label="name"
|
|
|
|
|
hide-selected
|
|
|
|
|
:rules="validate('supplier.payMethodFk')"
|
|
|
|
|
/>
|
|
|
|
|
</VnRow>
|
|
|
|
|
|
|
|
|
|
<VnInputNumber
|
|
|
|
|
:label="t('Amount')"
|
|
|
|
|
:required="true"
|
|
|
|
|
@update:model-value="calculateFromAmount($event)"
|
|
|
|
|
clearable
|
|
|
|
|
v-model.number="data.amountPaid"
|
|
|
|
|
v-model.number="data.amount"
|
|
|
|
|
/>
|
|
|
|
|
</VnRow>
|
|
|
|
|
<div v-if="data.bankFk?.accountingType?.code == 'compensation'">
|
|
|
|
|
<div class="text-h6">
|
|
|
|
|
{{ t('Compensation') }}
|
|
|
|
|
</div>
|
|
|
|
|
<VnRow>
|
|
|
|
|
<VnAccountNumber
|
|
|
|
|
:label="t('Compensation account')"
|
|
|
|
|
clearable
|
|
|
|
|
required
|
|
|
|
|
v-model="data.compensationAccount"
|
|
|
|
|
@blur="accountShortToStandard"
|
|
|
|
|
/>
|
|
|
|
|
</VnRow>
|
|
|
|
|
</div>
|
|
|
|
|
<VnInput
|
|
|
|
|
:label="t('Reference')"
|
|
|
|
|
:required="true"
|
|
|
|
|
clearable
|
|
|
|
|
v-model="data.description"
|
|
|
|
|
v-model="data.concept"
|
|
|
|
|
/>
|
|
|
|
|
|
|
|
|
|
<div v-if="data.bankFk?.accountingType?.code == 'cash'">
|
|
|
|
@ -305,7 +290,12 @@ async function getAmountPaid() {
|
|
|
|
|
v-if="$props.extraFields.includes('orderBy')"
|
|
|
|
|
:label="t('Type')"
|
|
|
|
|
v-model="data.orderBy"
|
|
|
|
|
:options="['issued', ' bookEntried', ' booked', ' dueDate']"
|
|
|
|
|
:options="[
|
|
|
|
|
{ id: 'issued', name: 'Fecha de expedición' },
|
|
|
|
|
{ id: 'bookEntried', name: 'Fecha de asiento' },
|
|
|
|
|
{ id: 'booked', name: 'Fecha contable' },
|
|
|
|
|
{ id: 'dueDate', name: 'Fecha de vencimiento' },
|
|
|
|
|
]"
|
|
|
|
|
option-value="id"
|
|
|
|
|
option-label="name"
|
|
|
|
|
hide-selected
|
|
|
|
@ -327,27 +317,8 @@ async function getAmountPaid() {
|
|
|
|
|
v-model="data.divisa"
|
|
|
|
|
/>
|
|
|
|
|
</VnRow>
|
|
|
|
|
<div class="q-mt-lg row justify-end">
|
|
|
|
|
<QBtn
|
|
|
|
|
:disabled="formModelRef.isLoading"
|
|
|
|
|
:label="t('globals.cancel')"
|
|
|
|
|
:loading="formModelRef.isLoading"
|
|
|
|
|
class="q-ml-sm"
|
|
|
|
|
color="primary"
|
|
|
|
|
flat
|
|
|
|
|
type="reset"
|
|
|
|
|
v-close-popup
|
|
|
|
|
/>
|
|
|
|
|
<QBtn
|
|
|
|
|
:disabled="formModelRef.isLoading"
|
|
|
|
|
:label="t('globals.save')"
|
|
|
|
|
:loading="formModelRef.isLoading"
|
|
|
|
|
color="primary"
|
|
|
|
|
type="submit"
|
|
|
|
|
/>
|
|
|
|
|
</div>
|
|
|
|
|
</template>
|
|
|
|
|
</FormModel>
|
|
|
|
|
</FormModelPopup>
|
|
|
|
|
</QDialog>
|
|
|
|
|
</template>
|
|
|
|
|
|
|
|
|
|