diff --git a/src/components/common/VnInput.vue b/src/components/common/VnInput.vue index 684770e9c..9d5849b68 100644 --- a/src/components/common/VnInput.vue +++ b/src/components/common/VnInput.vue @@ -83,7 +83,7 @@ const inputRules = [ - + { box-shadow: none; .vn-label-value { + &.negative > .value span { + color: $alert; + } display: flex; flex-direction: row; margin-top: 2px; diff --git a/src/i18n/locale/en.yml b/src/i18n/locale/en.yml index 05241747b..a71e4a887 100644 --- a/src/i18n/locale/en.yml +++ b/src/i18n/locale/en.yml @@ -32,6 +32,7 @@ globals: confirm: Confirm assign: Assign back: Back + downloadPdf: Download PDF yes: 'Yes' no: 'No' noChanges: No changes to save @@ -271,6 +272,7 @@ customer: tableVisibleColumns: id: Identifier name: Name + socialName: Social name fi: Tax number salesPersonFk: Salesperson credit: Credit diff --git a/src/i18n/locale/es.yml b/src/i18n/locale/es.yml index ad7c8d4aa..d78e1762c 100644 --- a/src/i18n/locale/es.yml +++ b/src/i18n/locale/es.yml @@ -59,6 +59,7 @@ globals: amount: Importe packages: Bultos download: Descargar + downloadPdf: Descargar PDF selectRows: 'Seleccionar las { numberRows } filas(s)' allRows: 'Todo { numberRows } filas(s)' markAll: Marcar todo @@ -269,6 +270,7 @@ customer: tableVisibleColumns: id: Identificador name: Nombre + socialName: Razón social fi: NIF / CIF salesPersonFk: Comercial credit: Crédito diff --git a/src/pages/Claim/ClaimList.vue b/src/pages/Claim/ClaimList.vue index 6e0a08f2c..c3c5f5b7b 100644 --- a/src/pages/Claim/ClaimList.vue +++ b/src/pages/Claim/ClaimList.vue @@ -12,7 +12,6 @@ import CustomerDescriptorProxy from 'src/pages/Customer/Card/CustomerDescriptorP import VnUserLink from 'src/components/ui/VnUserLink.vue'; import ClaimSummary from './Card/ClaimSummary.vue'; import { useSummaryDialog } from 'src/composables/useSummaryDialog'; -import { getUrl } from 'src/composables/getUrl'; const stateStore = useStateStore(); const router = useRouter(); diff --git a/src/pages/Customer/Card/CustomerBalance.vue b/src/pages/Customer/Card/CustomerBalance.vue index 2c1d6eccc..0886383de 100644 --- a/src/pages/Customer/Card/CustomerBalance.vue +++ b/src/pages/Customer/Card/CustomerBalance.vue @@ -11,6 +11,7 @@ import { useState } from 'src/composables/useState'; import { useStateStore } from 'stores/useStateStore'; import { useValidator } from 'src/composables/useValidator'; import { usePrintService } from 'src/composables/usePrintService'; +import { useSession } from 'src/composables/useSession'; import VnPaginate from 'src/components/ui/VnPaginate.vue'; import FetchData from 'components/FetchData.vue'; @@ -19,6 +20,9 @@ import VnSelect from 'src/components/common/VnSelect.vue'; import CustomerNewPayment from 'src/pages/Customer/components/CustomerNewPayment.vue'; import WorkerDescriptorProxy from 'src/pages/Worker/Card/WorkerDescriptorProxy.vue'; import InvoiceOutDescriptorProxy from 'src/pages/InvoiceOut/Card/InvoiceOutDescriptorProxy.vue'; +const session = useSession(); + +const tokenMultimedia = session.getTokenMultimedia(); const { sendEmail } = usePrintService(); const { t } = useI18n(); @@ -188,6 +192,11 @@ const saveFieldValue = async (row) => { const sendEmailAction = () => { sendEmail(`Suppliers/${route.params.id}/campaign-metrics-email`); }; + +const showBalancePdf = (balance) => { + const url = `api/InvoiceOuts/${balance.id}/download?access_token=${tokenMultimedia}`; + window.open(url, '_blank'); +}; @@ -257,17 +266,28 @@ const sendEmailAction = () => { {{ t('Send compensation') }} + + + {{ t('globals.downloadPdf') }} + + diff --git a/src/pages/Customer/Card/CustomerCreditContracts.vue b/src/pages/Customer/Card/CustomerCreditContracts.vue index 1729ac076..568adcf0b 100644 --- a/src/pages/Customer/Card/CustomerCreditContracts.vue +++ b/src/pages/Customer/Card/CustomerCreditContracts.vue @@ -105,7 +105,7 @@ const updateData = () => { color="primary" name="lock" size="md" - style="font-variation-settings: 'FILL' 1" + class="fill-icon" > {{ t('Close contract') }} diff --git a/src/pages/Customer/Defaulter/CustomerDefaulter.vue b/src/pages/Customer/Defaulter/CustomerDefaulter.vue index 5816eb1ec..6fc36bcff 100644 --- a/src/pages/Customer/Defaulter/CustomerDefaulter.vue +++ b/src/pages/Customer/Defaulter/CustomerDefaulter.vue @@ -3,10 +3,10 @@ import { ref, computed } from 'vue'; import { useI18n } from 'vue-i18n'; import { QBtn, QCheckbox, useQuasar } from 'quasar'; +import { useStateStore } from 'stores/useStateStore'; -import { toCurrency, toDate } from 'filters/index'; - -import FetchData from 'components/FetchData.vue'; +import { toCurrency, toDate, dateRange } from 'filters/index'; +import VnPaginate from 'src/components/ui/VnPaginate.vue'; import CustomerNotificationsFilter from './CustomerDefaulterFilter.vue'; import CustomerBalanceDueTotal from './CustomerBalanceDueTotal.vue'; import CustomerDescriptorProxy from 'src/pages/Customer/Card/CustomerDescriptorProxy.vue'; @@ -14,13 +14,14 @@ import WorkerDescriptorProxy from 'src/pages/Worker/Card/WorkerDescriptorProxy.v import VnSubToolbar from 'src/components/ui/VnSubToolbar.vue'; import VnInput from 'src/components/common/VnInput.vue'; import CustomerDefaulterAddObservation from './CustomerDefaulterAddObservation.vue'; +const stateStore = useStateStore(); -const { t } = useI18n(); +const { t, locale } = useI18n(); const quasar = useQuasar(); +const dataRef = ref(null); const balanceDueTotal = ref(0); const selected = ref([]); -const rows = ref([]); const tableColumnComponents = { client: { @@ -167,39 +168,71 @@ const columns = computed(() => [ }, ]); -const setRows = (data) => { - rows.value = data; - balanceDueTotal.value = data.reduce((accumulator, currentValue) => { - return accumulator + (currentValue['amount'] || 0); - }, 0); -}; - const viewAddObservation = (rowsSelected) => { quasar.dialog({ component: CustomerDefaulterAddObservation, componentProps: { clients: rowsSelected, - promise: refreshData, + promise: async () => await dataRef.value.fetch(), }, }); }; -const refreshData = () => { - setRows(); +const onFetch = (data) => { + for (const element of data) element.isWorker = element.businessTypeFk === 'worker'; + + balanceDueTotal.value = data.reduce((acc, { amount = 0 }) => acc + amount, 0); }; -const onFetch = (data) => { - for (const element of data) { - element.isWorker = element.businessTypeFk === 'worker'; +function getRange(value) { + let date; + if (locale.value === 'es') { + const [day, month, year] = value.split('/'); + date = new Date(year, month - 1, day); + } else date = new Date(value); + + return dateRange(date); +} + +function exprBuilder(param, value) { + switch (param) { + case 'clientFk': + return { [`d.${param}`]: value?.id }; + case 'creditInsurance': + case 'amount': + case 'workerFk': + case 'countryFk': + case 'payMethod': + case 'salesPersonFk': + return { [`d.${param}`]: value }; + case 'date': + return { 'd.created': { between: getRange(value) } }; + case 'defaulterSinced': + return { 'd.defaulterSinced': { between: getRange(value) } }; } - rows.value = data; -}; +} - + + + + + + {{ t('globals.collapseMenu') }} + + + + + - + @@ -214,69 +247,107 @@ const onFetch = (data) => { icon="vn:notes" :disabled="!selected.length" @click.stop="viewAddObservation(selected)" - /> + > + {{ t('Add observation') }} + - - - - - - - - {{ t(col.label) }} - {{ col.tooltip }} - - - + + + + + + + + + + {{ t(col.label) }} + {{ + col.tooltip + }} + + + - - - - - - - - - {{ props.value }} - + + + + + + + + + {{ props.value }} + - - - - - - + + + + + + + + + - + @@ -289,6 +360,7 @@ const onFetch = (data) => { es: + Add observation: Añadir observación Client: Cliente Is worker: Es trabajador Salesperson: Comercial diff --git a/src/pages/Customer/Defaulter/CustomerDefaulterFilter.vue b/src/pages/Customer/Defaulter/CustomerDefaulterFilter.vue index 9d173087b..0a594f92f 100644 --- a/src/pages/Customer/Defaulter/CustomerDefaulterFilter.vue +++ b/src/pages/Customer/Defaulter/CustomerDefaulterFilter.vue @@ -57,7 +57,7 @@ const authors = ref(); hide-selected map-options option-label="name" - option-value="clientTypeFk" + option-value="id" outlined rounded use-input diff --git a/src/pages/Customer/ExtendedList/CustomerExtendedList.vue b/src/pages/Customer/ExtendedList/CustomerExtendedList.vue index a24d3211a..b5b509d1b 100644 --- a/src/pages/Customer/ExtendedList/CustomerExtendedList.vue +++ b/src/pages/Customer/ExtendedList/CustomerExtendedList.vue @@ -10,7 +10,7 @@ import CustomerExtendedListActions from './CustomerExtendedListActions.vue'; import CustomerExtendedListFilter from './CustomerExtendedListFilter.vue'; import TableVisibleColumns from 'src/components/common/TableVisibleColumns.vue'; import VnSubToolbar from 'src/components/ui/VnSubToolbar.vue'; - +import VnPaginate from 'src/components/ui/VnPaginate.vue'; import { useArrayData } from 'composables/useArrayData'; import { useStateStore } from 'stores/useStateStore'; import { toDate } from 'src/filters'; @@ -37,8 +37,6 @@ onMounted(() => { allColumnNames.value = filteredColumns.map((col) => col.name); }); -const rows = computed(() => arrayData.value.store.data); - const selectedCustomerId = ref(0); const selectedSalesPersonId = ref(0); const allColumnNames = ref([]); @@ -70,6 +68,11 @@ const tableColumnComponents = { props: () => {}, event: () => {}, }, + socialName: { + component: 'span', + props: () => {}, + event: () => {}, + }, fi: { component: 'span', props: () => {}, @@ -283,6 +286,12 @@ const columns = computed(() => [ label: t('customer.extendedList.tableVisibleColumns.name'), name: 'name', }, + { + align: 'left', + field: 'socialName', + label: t('customer.extendedList.tableVisibleColumns.socialName'), + name: 'socialName', + }, { align: 'left', field: 'fi', @@ -485,6 +494,23 @@ const selectSalesPersonId = (id) => (selectedSalesPersonId.value = id); + + + + + + {{ t('globals.collapseMenu') }} + + + + (selectedSalesPersonId.value = id); - + (selectedSalesPersonId.value = id); - navigateToTravelId(row.id)" + - - - {{ value }} - - - - - + + navigateToTravelId(row.id)" > - - {{ props.row.id }} - - + + + {{ value }} + + + + + + + + + + + + + {{ props.row.id }} + + + + + + + + {{ props.row.salesPerson }} + + - + + + + + + + + + - - - - - {{ props.row.salesPerson }} - - - - - - - - - - - + diff --git a/src/pages/Customer/Notifications/CustomerNotifications.vue b/src/pages/Customer/Notifications/CustomerNotifications.vue index 52ea4cc27..9ff6b2301 100644 --- a/src/pages/Customer/Notifications/CustomerNotifications.vue +++ b/src/pages/Customer/Notifications/CustomerNotifications.vue @@ -1,17 +1,16 @@ - (rows = data)" - auto-load - url="Clients" - /> + + + + + + {{ t('globals.collapseMenu') }} + + + + + - + - - - + + + + + - - - - - - {{ props.value }} - - - - + + + + + + + + + {{ props.value }} + + + + + + + - + @@ -140,4 +175,5 @@ es: Phone: Teléfono City: Población Email: Email + Campaign consumption: Consumo campaña diff --git a/src/pages/Customer/Notifications/CustomerNotificationsCampaignConsumption.vue b/src/pages/Customer/Notifications/CustomerNotificationsCampaignConsumption.vue new file mode 100644 index 000000000..6d8e00966 --- /dev/null +++ b/src/pages/Customer/Notifications/CustomerNotificationsCampaignConsumption.vue @@ -0,0 +1,152 @@ + + + + (campaignsOptions = data)" + :filter="{ fields: ['id', 'code', 'dated'], order: 'code ASC', limit: 30 }" + auto-load + /> + (upcomingOptions = data)" + auto-load + /> + + + + {{ t('Campaign consumption') }} + + + + + + + + + + + + + + {{ t('Campaign consumption') }} + + + + + en: + params: + valentinesDay: Valentine's Day + mothersDay: Mother's Day + allSaints: All Saints' Day + es: + params: + valentinesDay: Día de San Valentín + mothersDay: Día de la Madre + allSaints: Día de Todos los Santos + Campaign consumption: Consumo campaña + Campaign: Campaña + From: Desde + To: Hasta + diff --git a/src/pages/Customer/Payments/CustomerPayments.vue b/src/pages/Customer/Payments/CustomerPayments.vue index 623d610ef..e53da84a3 100644 --- a/src/pages/Customer/Payments/CustomerPayments.vue +++ b/src/pages/Customer/Payments/CustomerPayments.vue @@ -110,13 +110,7 @@ function stateColor(row) { - + diff --git a/src/pages/Entry/EntryLatestBuys.vue b/src/pages/Entry/EntryLatestBuys.vue index c3e83c96f..da4190a04 100644 --- a/src/pages/Entry/EntryLatestBuys.vue +++ b/src/pages/Entry/EntryLatestBuys.vue @@ -12,6 +12,7 @@ import VnInput from 'src/components/common/VnInput.vue'; import VnSelect from 'src/components/common/VnSelect.vue'; import EntryLatestBuysFilter from './EntryLatestBuysFilter.vue'; import ItemDescriptorProxy from '../Item/Card/ItemDescriptorProxy.vue'; +import VnSubToolbar from 'src/components/ui/VnSubToolbar.vue'; import { useStateStore } from 'stores/useStateStore'; import { toDate, toCurrency } from 'src/filters'; @@ -636,18 +637,18 @@ onUnmounted(() => (stateStore.rightDrawer = false)); auto-load @on-fetch="(data) => (intrastatOptions = data)" /> - - + + - + - + diff --git a/src/pages/InvoiceOut/InvoiceOutList.vue b/src/pages/InvoiceOut/InvoiceOutList.vue index c77502af5..a969c2c4b 100644 --- a/src/pages/InvoiceOut/InvoiceOutList.vue +++ b/src/pages/InvoiceOut/InvoiceOutList.vue @@ -139,7 +139,7 @@ const openCreateInvoiceModal = () => { icon="cloud_download" :disable="selectedCards.size === 0" > - {{ t('downloadPdf') }} + {{ t('globals.downloadPdf') }} diff --git a/src/pages/Route/Roadmap/RoadmapSummary.vue b/src/pages/Route/Roadmap/RoadmapSummary.vue index 1fed6aa78..9aa8f40d7 100644 --- a/src/pages/Route/Roadmap/RoadmapSummary.vue +++ b/src/pages/Route/Roadmap/RoadmapSummary.vue @@ -72,7 +72,12 @@ const openAddStopDialog = () => { - + diff --git a/src/pages/Route/RouteTickets.vue b/src/pages/Route/RouteTickets.vue index 44818323e..eb2035011 100644 --- a/src/pages/Route/RouteTickets.vue +++ b/src/pages/Route/RouteTickets.vue @@ -274,7 +274,7 @@ const openSmsDialog = async () => { @@ -295,7 +295,7 @@ const openSmsDialog = async () => { @@ -425,10 +425,6 @@ const openSmsDialog = async () => { .table-actions { gap: 12px; } - -.filled-icon { - font-variation-settings: 'FILL' 1; -} es: diff --git a/src/router/modules/customer.js b/src/router/modules/customer.js index 5ef5945f3..092d60639 100644 --- a/src/router/modules/customer.js +++ b/src/router/modules/customer.js @@ -87,7 +87,7 @@ export default { name: 'CustomerNotifications', meta: { title: 'notifications', - icon: 'notifications', + icon: 'campaign', }, component: () => import( @@ -99,7 +99,7 @@ export default { name: 'CustomerDefaulter', meta: { title: 'defaulter', - icon: 'vn:risk', + icon: 'vn:defaulter', }, component: () => import('src/pages/Customer/Defaulter/CustomerDefaulter.vue'),