fix: refs #8388 update invoice total calculation logic and improve UI feedback for discrepancies

This commit is contained in:
Jorge Penadés 2025-03-18 10:05:29 +01:00
parent 5a49d72986
commit e2a989df9c
5 changed files with 57 additions and 22 deletions

View File

@ -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>

View File

@ -68,3 +68,4 @@ invoiceIn:
isBooked: Is booked
account: Ledger account
correctingFk: Rectificative
noMatch: No match with the vat({totalTaxableBase})

View File

@ -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})

View File

@ -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>

View File

@ -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>