fix: refs #8388 update invoice total calculation logic and improve UI feedback for discrepancies
This commit is contained in:
parent
5a49d72986
commit
e2a989df9c
|
@ -26,6 +26,7 @@ const invoiceId = +route.params.id;
|
|||
const filter = { where: { invoiceInFk: invoiceId } };
|
||||
const areRows = ref(false);
|
||||
const totalTaxableBase = ref();
|
||||
const noMatch = computed(() => totalAmount.value != totalTaxableBase.value);
|
||||
const columns = computed(() => [
|
||||
{
|
||||
name: 'duedate',
|
||||
|
@ -74,12 +75,12 @@ async function insert() {
|
|||
notify(t('globals.dataSaved'), 'positive');
|
||||
}
|
||||
|
||||
const getTaxableBase = async () => {
|
||||
async function setTaxableBase() {
|
||||
const { data } = await axios.get(`InvoiceIns/${invoiceId}/getTotals`);
|
||||
return data.totalTaxableBase;
|
||||
};
|
||||
totalTaxableBase.value = data.totalTaxableBase;
|
||||
}
|
||||
|
||||
onBeforeMount(async () => (totalTaxableBase.value = await getTaxableBase()));
|
||||
onBeforeMount(async () => await setTaxableBase());
|
||||
</script>
|
||||
<template>
|
||||
<CrudModel
|
||||
|
@ -92,14 +93,14 @@ onBeforeMount(async () => (totalTaxableBase.value = await getTaxableBase()));
|
|||
:data-required="{ invoiceInFk: invoiceId }"
|
||||
v-model:selected="rowsSelected"
|
||||
@on-fetch="(data) => (areRows = !!data.length)"
|
||||
@save-changes="() => {}"
|
||||
@save-changes="setTaxableBase"
|
||||
>
|
||||
<template #body="{ rows }">
|
||||
<QTable
|
||||
v-model:selected="rowsSelected"
|
||||
selection="multiple"
|
||||
:columns="columns"
|
||||
:rows="rows"
|
||||
:columns
|
||||
:rows
|
||||
row-key="$index"
|
||||
:grid="$q.screen.lt.sm"
|
||||
>
|
||||
|
@ -157,13 +158,13 @@ onBeforeMount(async () => (totalTaxableBase.value = await getTaxableBase()));
|
|||
<QTd>
|
||||
<QChip
|
||||
dense
|
||||
:color="
|
||||
totalAmount != totalTaxableBase
|
||||
? 'negative'
|
||||
: 'transparent'
|
||||
"
|
||||
:color="noMatch ? 'negative' : 'transparent'"
|
||||
class="q-pa-xs"
|
||||
:title="t('invoiceIn.summary.noMatch')"
|
||||
:title="
|
||||
noMatch
|
||||
? t('invoiceIn.noMatch', { totalTaxableBase })
|
||||
: ''
|
||||
"
|
||||
>
|
||||
{{ toCurrency(totalAmount) }}
|
||||
</QChip>
|
||||
|
|
|
@ -68,3 +68,4 @@ invoiceIn:
|
|||
isBooked: Is booked
|
||||
account: Ledger account
|
||||
correctingFk: Rectificative
|
||||
noMatch: No match with the vat({totalTaxableBase})
|
||||
|
|
|
@ -60,9 +60,11 @@ invoiceIn:
|
|||
net: Neto
|
||||
stems: Tallos
|
||||
country: País
|
||||
noMatch: No cuadra
|
||||
params:
|
||||
search: Id o nombre proveedor
|
||||
correctedFk: Rectificada
|
||||
isBooked: Contabilizada
|
||||
account: Cuenta contable
|
||||
correctingFk: Rectificativa
|
||||
noMatch: No cuadra con el iva({totalTaxableBase})
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
<script setup>
|
||||
import { ref, nextTick } from 'vue';
|
||||
import { ref, nextTick, onMounted } from 'vue';
|
||||
import { useRoute } from 'vue-router';
|
||||
import { useI18n } from 'vue-i18n';
|
||||
import VnInputDate from 'src/components/common/VnInputDate.vue';
|
||||
import FetchData from 'components/FetchData.vue';
|
||||
|
@ -17,12 +18,12 @@ const maritalStatus = [
|
|||
{ code: 'M', name: t('Married') },
|
||||
{ code: 'S', name: t('Single') },
|
||||
];
|
||||
async function setAdvancedSummary(data) {
|
||||
const advanced = (await useAdvancedSummary('Workers', data.id)) ?? {};
|
||||
|
||||
onMounted(async () => {
|
||||
const advanced = await useAdvancedSummary('Workers', useRoute().params.id);
|
||||
Object.assign(form.value.formData, advanced);
|
||||
await nextTick();
|
||||
if (form.value) form.value.hasChanges = false;
|
||||
}
|
||||
nextTick(() => (form.value.hasChanges = false));
|
||||
});
|
||||
</script>
|
||||
<template>
|
||||
<FetchData
|
||||
|
@ -42,7 +43,6 @@ async function setAdvancedSummary(data) {
|
|||
:url-update="`Workers/${$route.params.id}`"
|
||||
auto-load
|
||||
model="Worker"
|
||||
@on-fetch="setAdvancedSummary"
|
||||
>
|
||||
<template #form="{ data }">
|
||||
<VnRow>
|
||||
|
|
|
@ -1,7 +1,38 @@
|
|||
<script setup>
|
||||
import VnCard from 'src/components/common/VnCard.vue';
|
||||
import { useRoute } from 'vue-router';
|
||||
import { computed } from 'vue';
|
||||
|
||||
import VnCard from 'components/common/VnCard.vue';
|
||||
import ZoneDescriptor from './ZoneDescriptor.vue';
|
||||
import ZoneFilterPanel from '../ZoneFilterPanel.vue';
|
||||
import filter from './ZoneFilter.js';
|
||||
|
||||
const route = useRoute();
|
||||
const routeName = computed(() => route.name);
|
||||
|
||||
function notIsLocations(ifIsFalse, ifIsTrue) {
|
||||
if (routeName.value != 'ZoneLocations') return ifIsFalse;
|
||||
return ifIsTrue;
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<VnCard data-key="Zone" url="Zones" :descriptor="ZoneDescriptor" />
|
||||
<VnCard
|
||||
data-key="Zone"
|
||||
:url="notIsLocations(`Zones/${route.params.id}`, undefined)"
|
||||
:descriptor="ZoneDescriptor"
|
||||
:filter="filter"
|
||||
:filter-panel="notIsLocations(ZoneFilterPanel, undefined)"
|
||||
:search-data-key="notIsLocations('ZoneList', undefined)"
|
||||
:searchbar-props="{
|
||||
url: notIsLocations('Zones', 'ZoneLocations'),
|
||||
label: notIsLocations($t('list.searchZone'), $t('list.searchLocation')),
|
||||
info: $t('list.searchInfo'),
|
||||
whereFilter: notIsLocations((value) => {
|
||||
return /^\d+$/.test(value)
|
||||
? { id: value }
|
||||
: { name: { like: `%${value}%` } };
|
||||
}),
|
||||
}"
|
||||
/>
|
||||
</template>
|
||||
|
|
Loading…
Reference in New Issue