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 7dc5777bf..7d680c681 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/Card/CustomerGreuges.vue b/src/pages/Customer/Card/CustomerGreuges.vue
index 0c6e04520..0dcb3a3a9 100644
--- a/src/pages/Customer/Card/CustomerGreuges.vue
+++ b/src/pages/Customer/Card/CustomerGreuges.vue
@@ -1,20 +1,17 @@
-
+
+
+
+
+
+ {{ t('globals.collapseMenu') }}
+
+
+
+
+
+
+
+
+ {{ t('Total') }}:
+ {{ toCurrency(totalAmount) }}
+
+
+
+
-
-
- {{ t('Total') }}:
- {{ toCurrency(totalAmount) }}
-
-
-
{
-
+
{{ t('New greuge') }}
diff --git a/src/pages/Customer/Defaulter/CustomerDefaulter.vue b/src/pages/Customer/Defaulter/CustomerDefaulter.vue
index 5816eb1ec..c1e537c0a 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,61 @@ 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 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: dateRange(value) } };
+ case 'defaulterSinced':
+ return { 'd.defaulterSinced': { between: dateRange(value) } };
}
- rows.value = data;
-};
+}
-
+
+
+
+
+
+ {{ t('globals.collapseMenu') }}
+
+
+
+
+
-
+
@@ -214,69 +237,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 +350,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..26a6743d5 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
@@ -162,7 +162,7 @@ const authors = ref();
- {
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'),