diff --git a/src/pages/InvoiceOut/InvoiceOutNegativeBases.vue b/src/pages/InvoiceOut/InvoiceOutNegativeBases.vue
index b062678a097..432cd07d7c6 100644
--- a/src/pages/InvoiceOut/InvoiceOutNegativeBases.vue
+++ b/src/pages/InvoiceOut/InvoiceOutNegativeBases.vue
@@ -8,7 +8,7 @@ import { useInvoiceOutGlobalStore } from 'src/stores/invoiceOutGlobal.js';
import { useArrayData } from 'src/composables/useArrayData';
import CustomerDescriptorProxy from '../Customer/Card/CustomerDescriptorProxy.vue';
import TicketDescriptorProxy from '../Ticket/Card/TicketDescriptorProxy.vue';
-import WorkerDescriptorProxy from '../Worker/Card/WorkerDescriptorProxy.vue';
+import DepartmentDescriptorProxy from '../Worker/Department/Card/DepartmentDescriptorProxy.vue';
import VnInputDate from 'components/common/VnInputDate.vue';
import InvoiceOutNegativeBasesFilter from './InvoiceOutNegativeBasesFilter.vue';
import RightMenu from 'src/components/common/RightMenu.vue';
@@ -115,18 +115,16 @@ const columns = computed(() => [
},
{
align: 'left',
- label: t('customer.extendedList.tableVisibleColumns.salesPersonFk'),
- name: 'workerName',
+ name: 'departmentFk',
+ label: t('customer.summary.team'),
component: 'select',
attrs: {
- url: 'Workers/activeWithInheritedRole',
- fields: ['id', 'name'],
- where: { role: 'salesPerson' },
+ url: 'Departments',
},
columnField: {
component: null,
},
- format: (row, dashIfEmpty) => dashIfEmpty(row.workerName),
+ format: (row, dashIfEmpty) => dashIfEmpty(row.departmentName),
},
]);
@@ -198,10 +196,10 @@ const downloadCSV = async () => {
-
+
- {{ row.workerName }}
-
+ {{ row.departmentName }}
+
diff --git a/src/pages/InvoiceOut/InvoiceOutNegativeBasesFilter.vue b/src/pages/InvoiceOut/InvoiceOutNegativeBasesFilter.vue
index 579ab8871c4..b24c8b2471f 100644
--- a/src/pages/InvoiceOut/InvoiceOutNegativeBasesFilter.vue
+++ b/src/pages/InvoiceOut/InvoiceOutNegativeBasesFilter.vue
@@ -129,12 +129,15 @@ const props = defineProps({
-
diff --git a/src/pages/InvoiceOut/locale/en.yml b/src/pages/InvoiceOut/locale/en.yml
index 17d19835149..9d6a4a244e8 100644
--- a/src/pages/InvoiceOut/locale/en.yml
+++ b/src/pages/InvoiceOut/locale/en.yml
@@ -1,6 +1,7 @@
invoiceOut:
search: Search invoice
searchInfo: You can search by invoice reference
+ externalRef: External Ref.
params:
id: ID
company: Company
@@ -12,7 +13,6 @@ invoiceOut:
isActive: Active
hasToInvoice: Has to invoice
hasVerifiedData: Verified data
- workerName: Worker
isTaxDataChecked: Verified data
amount: Amount
clientFk: Client
@@ -26,6 +26,7 @@ invoiceOut:
max: Max
hasPdf: Has PDF
search: Contains
+ departmentFk: Department
card:
issued: Issued
customerCard: Customer card
diff --git a/src/pages/InvoiceOut/locale/es.yml b/src/pages/InvoiceOut/locale/es.yml
index 3df95d6b2dd..f9448cd9b4a 100644
--- a/src/pages/InvoiceOut/locale/es.yml
+++ b/src/pages/InvoiceOut/locale/es.yml
@@ -1,6 +1,7 @@
invoiceOut:
search: Buscar factura emitida
searchInfo: Puedes buscar por referencia de la factura
+ externalRef: Ref. externa
params:
id: ID
company: Empresa
@@ -12,7 +13,6 @@ invoiceOut:
isActive: Activo
hasToInvoice: Debe facturar
hasVerifiedData: Datos verificados
- workerName: Comercial
isTaxDataChecked: Datos comprobados
amount: Importe
clientFk: Cliente
@@ -26,6 +26,7 @@ invoiceOut:
max: Max
hasPdf: Tiene PDF
search: Contiene
+ departmentFk: Departamento
card:
issued: Fecha emisión
customerCard: Ficha del cliente
diff --git a/src/pages/Item/ItemRequest.vue b/src/pages/Item/ItemRequest.vue
index 43fc611d81e..ccae98025f8 100644
--- a/src/pages/Item/ItemRequest.vue
+++ b/src/pages/Item/ItemRequest.vue
@@ -3,6 +3,7 @@ import { ref, computed, onMounted } from 'vue';
import { useI18n } from 'vue-i18n';
import TicketDescriptorProxy from 'src/pages/Ticket/Card/TicketDescriptorProxy.vue';
import WorkerDescriptorProxy from 'src/pages/Worker/Card/WorkerDescriptorProxy.vue';
+import DepartmentDescriptorProxy from 'src/pages/Worker/Department/Card/DepartmentDescriptorProxy.vue';
import { useStateStore } from 'stores/useStateStore';
import { toCurrency } from 'filters/index';
import useNotify from 'src/composables/useNotify.js';
@@ -61,6 +62,7 @@ const columns = computed(() => [
columnClass: 'expand',
},
{
+ align: 'left',
label: t('item.buyRequest.requester'),
name: 'requesterName',
component: 'select',
@@ -77,6 +79,19 @@ const columns = computed(() => [
},
columnClass: 'shrink',
},
+ {
+ align: 'left',
+ name: 'departmentFk',
+ label: t('customer.summary.team'),
+ component: 'select',
+ attrs: {
+ url: 'Departments',
+ },
+ columnField: {
+ component: null,
+ },
+ format: (row, dashIfEmpty) => dashIfEmpty(row.departmentName),
+ },
{
label: t('item.buyRequest.requested'),
name: 'quantity',
@@ -107,6 +122,7 @@ const columns = computed(() => [
},
columnClass: 'shrink',
},
+
{
label: t('globals.item'),
name: 'item',
@@ -262,6 +278,12 @@ const onDenyAccept = (_, responseData) => {
+
+
+ {{ row.departmentName }}
+
+
+
diff --git a/src/pages/Item/ItemRequestFilter.vue b/src/pages/Item/ItemRequestFilter.vue
index c2a63ddd9b3..a29203df309 100644
--- a/src/pages/Item/ItemRequestFilter.vue
+++ b/src/pages/Item/ItemRequestFilter.vue
@@ -221,7 +221,7 @@ en:
attenderFk: Atender
clientFk: Client id
warehouseFk: Warehouse
- requesterFk: Salesperson
+ requesterFk: Requester
from: From
to: To
mine: For me
@@ -239,7 +239,7 @@ es:
attenderFk: Comprador
clientFk: Id cliente
warehouseFk: Almacén
- requesterFk: Comercial
+ requesterFk: Solicitante
from: Desde
to: Hasta
mine: Para mi
diff --git a/src/pages/Item/ItemType/Card/ItemTypeSummary.vue b/src/pages/Item/ItemType/Card/ItemTypeSummary.vue
index 3b63c4b63ed..ba294e144df 100644
--- a/src/pages/Item/ItemType/Card/ItemTypeSummary.vue
+++ b/src/pages/Item/ItemType/Card/ItemTypeSummary.vue
@@ -7,6 +7,7 @@ import filter from './ItemTypeFilter.js';
import CardSummary from 'components/ui/CardSummary.vue';
import VnLv from 'src/components/ui/VnLv.vue';
import VnToSummary from 'src/components/ui/VnToSummary.vue';
+import VnTitle from 'src/components/common/VnTitle.vue';
onUpdated(() => summaryRef.value.fetch());
@@ -62,13 +63,10 @@ async function setItemTypeData(data) {
-
+
diff --git a/src/pages/Item/locale/en.yml b/src/pages/Item/locale/en.yml
index 9d27fc96e2a..ff8df26d4bd 100644
--- a/src/pages/Item/locale/en.yml
+++ b/src/pages/Item/locale/en.yml
@@ -84,7 +84,7 @@ item:
attenderFk: Atender
clientFk: Client id
warehouseFk: Warehouse
- requesterFk: Salesperson
+ requesterFk: Requester
from: From
to: To
mine: For me
diff --git a/src/pages/Item/locale/es.yml b/src/pages/Item/locale/es.yml
index 935f5160bf1..7b768d0cbb1 100644
--- a/src/pages/Item/locale/es.yml
+++ b/src/pages/Item/locale/es.yml
@@ -93,7 +93,7 @@ item:
attenderFk: Comprador
clientFk: Id cliente
warehouseFk: Almacén
- requesterFk: Comercial
+ requesterFk: Solicitante
from: Desde
to: Hasta
mine: Para mi
diff --git a/src/pages/Monitor/MonitorClients.vue b/src/pages/Monitor/MonitorClients.vue
index c1958cdcb34..278b0b26f3c 100644
--- a/src/pages/Monitor/MonitorClients.vue
+++ b/src/pages/Monitor/MonitorClients.vue
@@ -31,7 +31,7 @@ function exprBuilder(param, value) {
switch (param) {
case 'clientFk':
return { [`c.id`]: value };
- case 'salesPersonFk':
+ case 'departmentFk':
return { [`c.${param}`]: value };
}
}
@@ -62,25 +62,17 @@ const columns = computed(() => [
columnFilter: false,
},
{
- label: t('salesClientsTable.salesPerson'),
- name: 'salesPersonFk',
- field: 'salesPerson',
align: 'left',
+ name: 'departmentFk',
+ label: t('customer.summary.team'),
+ component: 'select',
+ attrs: {
+ url: 'Departments',
+ },
columnField: {
component: null,
},
- optionFilter: 'firstName',
- columnFilter: {
- component: 'select',
- attrs: {
- url: 'Workers/activeWithInheritedRole',
- fields: ['id', 'name'],
- sortBy: 'nickname ASC',
- where: { role: 'salesPerson' },
- useLike: false,
- },
- },
- columnClass: 'no-padding',
+ format: (row, dashIfEmpty) => dashIfEmpty(row.departmentName),
},
{
label: t('salesClientsTable.client'),
@@ -128,9 +120,9 @@ const columns = computed(() => [
-
-
-
+
+
+
diff --git a/src/pages/Monitor/MonitorOrders.vue b/src/pages/Monitor/MonitorOrders.vue
index 873f8abb4ee..2679f722443 100644
--- a/src/pages/Monitor/MonitorOrders.vue
+++ b/src/pages/Monitor/MonitorOrders.vue
@@ -1,9 +1,9 @@
+
+
+
+
+
diff --git a/src/pages/Route/Agency/Card/AgencySummary.vue b/src/pages/Route/Agency/Card/AgencySummary.vue
index 71a6d106623..ab274939abf 100644
--- a/src/pages/Route/Agency/Card/AgencySummary.vue
+++ b/src/pages/Route/Agency/Card/AgencySummary.vue
@@ -6,29 +6,31 @@ import { useI18n } from 'vue-i18n';
import CardSummary from 'components/ui/CardSummary.vue';
import VnLv from 'components/ui/VnLv.vue';
import VnTitle from 'src/components/common/VnTitle.vue';
+import VnCheckbox from 'components/common/VnCheckbox.vue';
+const route = useRoute();
const $props = defineProps({ id: { type: Number, default: 0 } });
const { t } = useI18n();
-const entityId = computed(() => $props.id || useRoute().params.id);
+const entityId = computed(() => $props.id || route.params.id);
-
+
{{ agency.name }}
-
-
diff --git a/src/pages/Route/Agency/locale/en.yml b/src/pages/Route/Agency/locale/en.yml
index 93f8b4aaa75..78a687f2ee5 100644
--- a/src/pages/Route/Agency/locale/en.yml
+++ b/src/pages/Route/Agency/locale/en.yml
@@ -1,11 +1,12 @@
agency:
search: Search agency
- searchInfo: You can search by name
+ searchInfo: You can search by name and by id
isOwn: Own
isAnyVolumeAllowed: Any volume allowed
+ removeItem: Agency removed successfully
notification:
- removeItemError: Error removing agency
- removeItem: WorkCenter removed successfully
+ removeItemError: Error removing work center
+ removeItem: Work center removed successfully
pageTitles:
agency: Agency
searchBar:
diff --git a/src/pages/Route/Agency/locale/es.yml b/src/pages/Route/Agency/locale/es.yml
index 1efed0e9ca8..b6237a9f7da 100644
--- a/src/pages/Route/Agency/locale/es.yml
+++ b/src/pages/Route/Agency/locale/es.yml
@@ -1,15 +1,14 @@
agency:
search: Buscar agencia
- searchInfo: Puedes buscar por nombre
+ searchInfo: Puedes buscar por nombre y por id
isOwn: Propio
isAnyVolumeAllowed: Cualquier volumen
removeItem: Agencia eliminada correctamente
notification:
- removeItemError: Error al eliminar la agencia
+ removeItemError: Error al eliminar la el centro de trabajo
removeItem: Centro de trabajo eliminado correctamente
pageTitles:
agency: Agencia
searchBar:
info: Puedes buscar por nombre o id
label: Buscar agencia...
-
diff --git a/src/pages/Route/Card/RouteDescriptorProxy.vue b/src/pages/Route/Card/RouteDescriptorProxy.vue
index 1ff39a51e03..7553469f3b3 100644
--- a/src/pages/Route/Card/RouteDescriptorProxy.vue
+++ b/src/pages/Route/Card/RouteDescriptorProxy.vue
@@ -7,6 +7,10 @@ const $props = defineProps({
type: Number,
required: true,
},
+ summary: {
+ type: Object,
+ default: null,
+ },
});
diff --git a/src/pages/Route/Card/RouteFilter.vue b/src/pages/Route/Card/RouteFilter.vue
index 21858102be2..cb515851719 100644
--- a/src/pages/Route/Card/RouteFilter.vue
+++ b/src/pages/Route/Card/RouteFilter.vue
@@ -25,7 +25,7 @@ const emit = defineEmits(['search']);
>
- {{ t(`params.${tag.label}`) }}:
+ {{ t(`route.params.${tag.label}`) }}:
{{ formatFn(tag.value) }}
@@ -33,6 +33,7 @@ const emit = defineEmits(['search']);
@@ -146,7 +147,7 @@ const emit = defineEmits(['search']);
@@ -154,38 +155,3 @@ const emit = defineEmits(['search']);
-
-
-en:
- params:
- warehouseFk: Warehouse
- description: Description
- m3: m³
- scopeDays: Days Onward
- vehicleFk: Vehicle
- agencyModeFk: Agency
- workerFk: Worker
- from: From
- to: To
- Served: Served
-es:
- params:
- warehouseFk: Almacén
- description: Descripción
- m3: m³
- scopeDays: Días en adelante
- vehicleFk: Vehículo
- agencyModeFk: Agencia
- workerFk: Trabajador
- from: Desde
- to: Hasta
- Warehouse: Almacén
- Description: Descripción
- Vehicle: Vehículo
- Agency: Agencia
- Worker: Trabajador
- From: Desde
- To: Hasta
- Served: Servida
- Days Onward: Días en adelante
-
diff --git a/src/pages/Route/Card/RouteSummary.vue b/src/pages/Route/Card/RouteSummary.vue
index 3051972b25d..f6862809527 100644
--- a/src/pages/Route/Card/RouteSummary.vue
+++ b/src/pages/Route/Card/RouteSummary.vue
@@ -135,7 +135,7 @@ const ticketColumns = ref([
@@ -168,7 +168,7 @@ const ticketColumns = ref([
{{ value }}
@@ -230,7 +230,7 @@ const ticketColumns = ref([
-
+
{{ value }}
@@ -238,7 +238,7 @@ const ticketColumns = ref([
-
+
{{ value }}
diff --git a/src/pages/Route/Cmr/CmrList.vue b/src/pages/Route/Cmr/CmrList.vue
index b3eaf3b48f4..d0683e48194 100644
--- a/src/pages/Route/Cmr/CmrList.vue
+++ b/src/pages/Route/Cmr/CmrList.vue
@@ -2,28 +2,38 @@
import { onBeforeMount, onMounted, computed, ref } from 'vue';
import { useI18n } from 'vue-i18n';
import { Notify } from 'quasar';
+import { useRoute } from 'vue-router';
import { useSession } from 'src/composables/useSession';
import { toDateHourMin } from 'filters/index';
import { useStateStore } from 'src/stores/useStateStore';
-import axios from 'axios';
import TicketDescriptorProxy from 'pages/Ticket/Card/TicketDescriptorProxy.vue';
import CustomerDescriptorProxy from 'pages/Customer/Card/CustomerDescriptorProxy.vue';
import VnSubToolbar from 'src/components/ui/VnSubToolbar.vue';
import VnTable from 'components/VnTable/VnTable.vue';
+import VnSearchbar from 'src/components/ui/VnSearchbar.vue';
+const route = useRoute();
const { t } = useI18n();
const { getTokenMultimedia } = useSession();
const token = getTokenMultimedia();
const state = useStateStore();
-const warehouses = ref([]);
const selectedRows = ref([]);
+const dataKey = 'CmrList';
+const shipped = Date.vnNew();
+shipped.setHours(0, 0, 0, 0);
+shipped.setDate(shipped.getDate() - 1);
+const userParams = {
+ shipped: null,
+};
+
+
const columns = computed(() => [
{
align: 'left',
name: 'cmrFk',
- label: t('route.cmr.list.cmrFk'),
+ label: t('route.cmr.params.cmrFk'),
chip: {
condition: () => true,
},
@@ -32,62 +42,67 @@ const columns = computed(() => [
{
align: 'center',
name: 'hasCmrDms',
- label: t('route.cmr.list.hasCmrDms'),
+ label: t('route.cmr.params.hasCmrDms'),
component: 'checkbox',
cardVisible: true,
},
{
align: 'left',
- label: t('route.cmr.list.ticketFk'),
+ label: t('route.cmr.params.ticketFk'),
name: 'ticketFk',
},
{
align: 'left',
- label: t('route.cmr.list.routeFk'),
+ label: t('route.cmr.params.routeFk'),
name: 'routeFk',
},
{
align: 'left',
- label: t('route.cmr.list.clientFk'),
+ label: t('route.cmr.params.clientFk'),
name: 'clientFk',
},
{
align: 'right',
- label: t('route.cmr.list.country'),
+ label: t('route.cmr.params.countryFk'),
name: 'countryFk',
- cardVisible: true,
+ component: 'select',
attrs: {
url: 'countries',
fields: ['id', 'name'],
- optionLabel: 'name',
- optionValue: 'id',
},
columnFilter: {
- inWhere: true,
- component: 'select',
+ name: 'countryFk',
+ attrs: {
+ url: 'countries',
+ fields: ['id', 'name'],
+ },
},
format: ({ countryName }) => countryName,
},
{
align: 'right',
- label: t('route.cmr.list.shipped'),
+ label: t('route.cmr.params.shipped'),
name: 'shipped',
cardVisible: true,
- columnFilter: {
- component: 'date',
- inWhere: true,
- },
+ component: 'date',
format: ({ shipped }) => toDateHourMin(shipped),
},
{
align: 'right',
+ label: t('route.cmr.params.warehouseFk'),
name: 'warehouseFk',
- label: t('globals.warehouse'),
- columnFilter: {
- component: 'select',
- },
+ component: 'select',
attrs: {
- options: warehouses.value,
+ url: 'warehouses',
+ fields: ['id', 'name'],
+ },
+ columnFilter: {
+ inWhere: true,
+ name: 'warehouseFk',
+ attrs: {
+ url: 'warehouses',
+ fields: ['id', 'name'],
+ },
},
format: ({ warehouseName }) => warehouseName,
},
@@ -96,7 +111,7 @@ const columns = computed(() => [
name: 'tableActions',
actions: [
{
- title: t('Ver cmr'),
+ title: t('route.cmr.params.viewCmr'),
icon: 'visibility',
isPrimary: true,
action: (row) => window.open(getCmrUrl(row?.cmrFk), '_blank'),
@@ -105,13 +120,17 @@ const columns = computed(() => [
},
]);
-onBeforeMount(async () => {
- const { data } = await axios.get('Warehouses');
- warehouses.value = data;
+onBeforeMount(() => {
+ initializeFromQuery();
});
onMounted(() => (state.rightDrawer = true));
+const initializeFromQuery = () => {
+ const query = route.query.table ? JSON.parse(route.query.table) : {};
+ shipped.value = query.shipped || shipped.toISOString();
+ Object.assign(userParams, { shipped });
+};
function getApiUrl() {
return new URL(window.location).origin;
}
@@ -133,6 +152,11 @@ function downloadPdfs() {
}
+
- {{ t('route.cmr.list.downloadCmrs') }}
+ {{ t('route.cmr.params.downloadCmrs') }}
{
{
-
+
diff --git a/src/pages/Route/RouteAutonomous.vue b/src/pages/Route/RouteAutonomous.vue
index 3047cdf8675..15db2a55f99 100644
--- a/src/pages/Route/RouteAutonomous.vue
+++ b/src/pages/Route/RouteAutonomous.vue
@@ -13,6 +13,7 @@ import RouteSummary from 'pages/Route/Card/RouteSummary.vue';
import RouteDescriptorProxy from 'pages/Route/Card/RouteDescriptorProxy.vue';
import InvoiceInDescriptorProxy from 'pages/InvoiceIn/Card/InvoiceInDescriptorProxy.vue';
import SupplierDescriptorProxy from 'pages/Supplier/Card/SupplierDescriptorProxy.vue';
+import AgencyDescriptorProxy from 'pages/Route/Agency/Card/AgencyDescriptorProxy.vue';
import VnSearchbar from 'components/ui/VnSearchbar.vue';
import VnDms from 'components/common/VnDms.vue';
import VnTable from 'components/VnTable/VnTable.vue';
@@ -236,10 +237,16 @@ onUnmounted(() => (stateStore.rightDrawer = false));
selection: 'multiple',
}"
>
-
+
- {{ row.routeFk }}
-
+ {{ row?.agencyModeName }}
+
+
+
+
+
+ {{ row?.agencyAgreement }}
+
diff --git a/src/pages/Route/RouteExtendedList.vue b/src/pages/Route/RouteExtendedList.vue
index a7e192765c1..fb19323c97b 100644
--- a/src/pages/Route/RouteExtendedList.vue
+++ b/src/pages/Route/RouteExtendedList.vue
@@ -38,7 +38,7 @@ const routeFilter = {
};
const columns = computed(() => [
{
- align: 'center',
+ align: 'right',
name: 'id',
label: 'Id',
chip: {
@@ -46,11 +46,11 @@ const columns = computed(() => [
},
isId: true,
columnFilter: false,
+ width: '25px',
},
{
- align: 'center',
name: 'workerFk',
- label: t('route.Worker'),
+ label: t('globals.worker'),
create: true,
component: 'select',
attrs: {
@@ -71,9 +71,8 @@ const columns = computed(() => [
format: (row, dashIfEmpty) => dashIfEmpty(row.workerUserName),
},
{
- align: 'center',
name: 'agencyModeFk',
- label: t('route.Agency'),
+ label: t('globals.agency'),
isTitle: true,
cardVisible: true,
create: true,
@@ -90,9 +89,8 @@ const columns = computed(() => [
format: (row, dashIfEmpty) => dashIfEmpty(row.agencyName),
},
{
- align: 'center',
name: 'vehicleFk',
- label: t('route.Vehicle'),
+ label: t('globals.vehicle'),
cardVisible: true,
create: true,
component: 'select',
@@ -111,9 +109,8 @@ const columns = computed(() => [
format: (row, dashIfEmpty) => dashIfEmpty(row.vehiclePlateNumber),
},
{
- align: 'center',
name: 'dated',
- label: t('route.Date'),
+ label: t('globals.date'),
columnFilter: false,
cardVisible: true,
create: true,
@@ -122,9 +119,8 @@ const columns = computed(() => [
dated === '0000-00-00' ? dashIfEmpty(null) : toDate(dated),
},
{
- align: 'center',
name: 'from',
- label: t('route.From'),
+ label: t('globals.from'),
visible: false,
cardVisible: true,
create: true,
@@ -132,9 +128,8 @@ const columns = computed(() => [
format: ({ from }) => toDate(from),
},
{
- align: 'center',
name: 'to',
- label: t('route.To'),
+ label: t('globals.to'),
visible: false,
cardVisible: true,
create: true,
@@ -142,30 +137,31 @@ const columns = computed(() => [
format: ({ date }) => toDate(date),
},
{
- align: 'center',
+ align: 'right',
name: 'm3',
label: 'm3',
cardVisible: true,
columnClass: 'shrink',
+ width: '50px',
},
{
- align: 'center',
name: 'started',
label: t('route.hourStarted'),
component: 'time',
columnFilter: false,
format: ({ started }) => toHour(started),
+ width: '50px',
},
{
- align: 'center',
name: 'finished',
label: t('route.hourFinished'),
component: 'time',
columnFilter: false,
format: ({ finished }) => toHour(finished),
+ width: '50px',
},
{
- align: 'center',
+ align: 'right',
name: 'kmStart',
label: t('route.KmStart'),
columnClass: 'shrink',
@@ -173,7 +169,7 @@ const columns = computed(() => [
visible: false,
},
{
- align: 'center',
+ align: 'right',
name: 'kmEnd',
label: t('route.KmEnd'),
columnClass: 'shrink',
@@ -181,16 +177,15 @@ const columns = computed(() => [
visible: false,
},
{
- align: 'center',
+ align: 'left',
name: 'description',
- label: t('route.Description'),
+ label: t('globals.description'),
isTitle: true,
create: true,
component: 'input',
field: 'description',
},
{
- align: 'center',
name: 'isOk',
label: t('route.Served'),
component: 'checkbox',
@@ -202,7 +197,7 @@ const columns = computed(() => [
name: 'tableActions',
actions: [
{
- title: t('route.Add tickets'),
+ title: t('route.addTicket'),
icon: 'vn:ticketAdd',
action: (row) => openTicketsDialog(row?.id),
isPrimary: true,
@@ -214,7 +209,7 @@ const columns = computed(() => [
isPrimary: true,
},
{
- title: t('route.Route summary'),
+ title: t('route.routeSummary'),
icon: 'arrow_forward',
action: (row) => navigate(row?.id),
isPrimary: true,
@@ -276,11 +271,13 @@ const openTicketsDialog = (id) => {
- {{ t('route.Select the starting date') }}
+
+ {{ t('route.extendedList.selectStartingDate') }}
+
@@ -288,7 +285,7 @@ const openTicketsDialog = (id) => {
@@ -339,7 +336,7 @@ const openTicketsDialog = (id) => {
:disable="!selectedRows?.length"
@click="confirmationDialog = true"
>
- {{ t('route.Clone Selected Routes') }}
+ {{ t('route.extendedList.cloneSelectedRoutes') }}
{
:disable="!selectedRows?.length"
@click="showRouteReport"
>
- {{ t('route.Download selected routes as PDF') }}
+ {{
+ t('route.extendedList.downloadSelectedRoutes')
+ }}
{
:disable="!selectedRows?.length"
@click="markAsServed()"
>
- {{ t('route.Mark as served') }}
+ {{ t('route.extendedList.markServed') }}
diff --git a/src/pages/Route/RouteList.vue b/src/pages/Route/RouteList.vue
index 5723e2f0d96..7fc1027eadf 100644
--- a/src/pages/Route/RouteList.vue
+++ b/src/pages/Route/RouteList.vue
@@ -7,8 +7,11 @@ import RouteSummary from 'pages/Route/Card/RouteSummary.vue';
import RouteFilter from 'pages/Route/Card/RouteFilter.vue';
import VnTable from 'components/VnTable/VnTable.vue';
import WorkerDescriptorProxy from 'src/pages/Worker/Card/WorkerDescriptorProxy.vue';
+import AgencyDescriptorProxy from 'src/pages/Route/Agency/Card/AgencyDescriptorProxy.vue';
+import VehicleDescriptorProxy from 'src/pages/Route/Vehicle/Card/VehicleDescriptorProxy.vue';
import VnSection from 'src/components/common/VnSection.vue';
import VnSelectWorker from 'src/components/common/VnSelectWorker.vue';
+import RouteTickets from './RouteTickets.vue';
const { t } = useI18n();
const { viewSummary } = useSummaryDialog();
@@ -24,6 +27,12 @@ const routeFilter = {
},
],
};
+
+function redirectToTickets(id) {
+ const url = `#/route/${id}/tickets`;
+ window.open(url, '_blank');
+}
+
const columns = computed(() => [
{
align: 'right',
@@ -34,25 +43,29 @@ const columns = computed(() => [
condition: () => true,
},
columnFilter: false,
+ width: '25px',
},
{
- align: 'left',
name: 'workerFk',
- label: t('route.Worker'),
+ label: t('gloabls.worker'),
component: markRaw(VnSelectWorker),
create: true,
- cardVisible: true,
format: (row, dashIfEmpty) => dashIfEmpty(row.travelRef),
columnFilter: false,
+ width: '100px',
},
{
- align: 'left',
- name: 'agencyName',
- label: t('route.Agency'),
+ name: 'workerFk',
+ label: t('globals.worker'),
+ visible: false,
cardVisible: true,
},
{
- label: t('route.Agency'),
+ name: 'agencyName',
+ label: t('globals.agency'),
+ },
+ {
+ label: t('globals.Agency'),
name: 'agencyModeFk',
component: 'select',
attrs: {
@@ -68,14 +81,18 @@ const columns = computed(() => [
visible: false,
},
{
- align: 'left',
- name: 'vehiclePlateNumber',
- label: t('route.Vehicle'),
+ name: 'agencyName',
+ label: t('globals.agency'),
+ visible: false,
cardVisible: true,
},
+ {
+ name: 'vehiclePlateNumber',
+ label: t('globals.vehicle'),
+ },
{
name: 'vehicleFk',
- label: t('route.Vehicle'),
+ label: t('globals.Vehicle'),
cardVisible: true,
component: 'select',
attrs: {
@@ -93,25 +110,27 @@ const columns = computed(() => [
visible: false,
},
{
- align: 'left',
+ align: 'center',
name: 'started',
label: t('route.hourStarted'),
cardVisible: true,
columnFilter: false,
- format: (row) => toHour(row.started),
+ format: ({ started }) => toHour(started),
+ width: '50px',
},
{
- align: 'left',
+ align: 'center',
name: 'finished',
label: t('route.hourFinished'),
cardVisible: true,
columnFilter: false,
- format: (row) => toHour(row.started),
+ format: ({ finished }) => toHour(finished),
+ width: '50px',
},
{
align: 'left',
name: 'description',
- label: t('route.Description'),
+ label: t('globals.description'),
cardVisible: true,
isTitle: true,
create: true,
@@ -119,7 +138,6 @@ const columns = computed(() => [
columnFilter: false,
},
{
- align: 'left',
name: 'isOk',
label: t('route.Served'),
component: 'checkbox',
@@ -130,6 +148,12 @@ const columns = computed(() => [
align: 'right',
name: 'tableActions',
actions: [
+ {
+ title: t('globals.pageTitles.tickets'),
+ icon: 'vn:ticket',
+ action: (row) => redirectToTickets(row?.id),
+ isPrimary: true,
+ },
{
title: t('components.smartCard.viewSummary'),
icon: 'preview',
@@ -155,6 +179,7 @@ const columns = computed(() => [
[
+
+
+ {{ row?.agencyName }}
+
+
+
+
+
+ {{ row?.vehiclePlateNumber }}
+
+
+
diff --git a/src/pages/Route/RouteRoadmap.vue b/src/pages/Route/RouteRoadmap.vue
index 23b1b1d5b2a..c981b86a5e0 100644
--- a/src/pages/Route/RouteRoadmap.vue
+++ b/src/pages/Route/RouteRoadmap.vue
@@ -2,13 +2,11 @@
import { useI18n } from 'vue-i18n';
import { computed, ref } from 'vue';
import { dashIfEmpty } from 'src/filters';
-import { toDate, toDateHourMin } from 'filters/index';
+import { toDate, toDateHourMin, toCurrency } from 'filters/index';
import { useQuasar } from 'quasar';
import { useSummaryDialog } from 'composables/useSummaryDialog';
-import toCurrency from 'filters/toCurrency';
import axios from 'axios';
-import VnSearchbar from 'components/ui/VnSearchbar.vue';
import VnSubToolbar from 'src/components/ui/VnSubToolbar.vue';
import VnTable from 'components/VnTable/VnTable.vue';
import RoadmapSummary from 'pages/Route/Roadmap/RoadmapSummary.vue';
@@ -17,6 +15,8 @@ import VnInputDate from 'components/common/VnInputDate.vue';
import VnInputTime from 'src/components/common/VnInputTime.vue';
import VnSection from 'src/components/common/VnSection.vue';
import RoadmapFilter from './Roadmap/RoadmapFilter.vue';
+import VehicleDescriptorProxy from 'src/pages/Route/Vehicle/Card/VehicleDescriptorProxy.vue';
+import SupplierDescriptorProxy from 'src/pages/Supplier/Card/SupplierDescriptorProxy.vue';
const { viewSummary } = useSummaryDialog();
const { t } = useI18n();
@@ -33,7 +33,7 @@ const columns = computed(() => [
{
align: 'left',
name: 'name',
- label: t('Roadmap'),
+ label: t('route.roadmap.roadmap'),
create: true,
cardVisible: true,
columnFilter: {
@@ -41,9 +41,9 @@ const columns = computed(() => [
},
},
{
- align: 'left',
+ align: 'center',
name: 'etd',
- label: t('ETD'),
+ label: t('route.roadmap.etd'),
component: 'date',
columnFilter: {
inWhere: true,
@@ -54,7 +54,7 @@ const columns = computed(() => [
{
align: 'left',
name: 'supplierFk',
- label: t('Carrier'),
+ label: t('route.roadmap.carrier'),
component: 'select',
attrs: {
url: 'suppliers',
@@ -65,21 +65,21 @@ const columns = computed(() => [
},
{
name: 'tractorPlate',
- label: t('Plate'),
+ label: t('route.roadmap.vehicle'),
field: (row) => row.tractorPlate,
sortable: true,
align: 'left',
},
{
name: 'price',
- label: t('Price'),
- field: (row) => toCurrency(row.price),
+ label: t('route.roadmap.price'),
+ format: ({ price }) => toCurrency(price),
sortable: true,
- align: 'left',
+ align: 'right',
},
{
name: 'observations',
- label: t('Observations'),
+ label: t('route.roadmap.observations'),
field: (row) => dashIfEmpty(row.observations),
sortable: true,
align: 'left',
@@ -89,7 +89,7 @@ const columns = computed(() => [
name: 'tableActions',
actions: [
{
- title: t('Ver cmr'),
+ title: t('route.roadmap.seeCmr'),
icon: 'preview',
isPrimary: true,
action: (row) => viewSummary(row?.id, RoadmapSummary),
@@ -124,8 +124,8 @@ function confirmRemove() {
.dialog({
component: VnConfirm,
componentProps: {
- title: t('Selected roadmaps will be removed'),
- message: t('Are you sure you want to continue?'),
+ title: t('route.roadmap.selectedRoadmapsRemoved'),
+ message: t('route.roadmap.areYouSure'),
promise: removeSelection,
},
})
@@ -157,15 +157,24 @@ function exprBuilder(param, value) {
- {{ t('Select the estimated date of departure (ETD)') }}
+ {{ t('route.roadmap.selectEtd') }}
-
+
-
+
{{ t('globals.clone') }}
@@ -181,7 +190,7 @@ function exprBuilder(param, value) {
:disable="!selectedRows?.length"
@click="isCloneDialogOpen = true"
>
- {{ t('Clone Selected Routes') }}
+ {{ t('route.roadmap.cloneSelected') }}
- {{ t('Delete roadmap(s)') }}
+ {{ t('route.roadmap.deleteRoadmap') }}
@@ -222,7 +231,7 @@ function exprBuilder(param, value) {
redirect="route/roadmap"
:create="{
urlCreate: 'Roadmaps',
- title: t('Create routemap'),
+ title: t('route.roadmap.createRoadmap'),
onDataSaved: ({ id }) => tableRef.redirect(id),
formInitialData: {},
}"
@@ -232,7 +241,10 @@ function exprBuilder(param, value) {
{{ toDateHourMin(row.etd) }}
- {{ row.supplierFk }}
+
+ {{ row.driverName }}
+
+
@@ -251,21 +263,3 @@ function exprBuilder(param, value) {
gap: 12px;
}
-
-es:
- Create routemap: Crear troncal
- Search roadmaps: Buscar troncales
- You can search by roadmap reference: Puedes buscar por referencia del troncal
- Delete roadmap(s): Eliminar troncal(es)
- Selected roadmaps will be removed: Los troncales seleccionadas serán eliminados
- Are you sure you want to continue?: ¿Seguro que quieres continuar?
- The date can't be empty: La fecha no puede estar vacía
- Clone Selected Routes: Clonar rutas seleccionadas
- Create roadmap: Crear troncal
- Roadmap: Troncal
- Carrier: Transportista
- Plate: Matrícula
- Price: Precio
- Observations: Observaciones
- Select the estimated date of departure (ETD): Selecciona la fecha estimada de salida
-
diff --git a/src/pages/Route/RouteTickets.vue b/src/pages/Route/RouteTickets.vue
index adc7dfdaaad..b17fb543f31 100644
--- a/src/pages/Route/RouteTickets.vue
+++ b/src/pages/Route/RouteTickets.vue
@@ -37,9 +37,9 @@ const columns = computed(() => [
align: 'left',
},
{
- name: 'city',
- label: t('City'),
- field: (row) => row?.city,
+ name: 'client',
+ label: t('Client'),
+ field: (row) => row?.nickname,
sortable: false,
align: 'left',
},
@@ -51,9 +51,9 @@ const columns = computed(() => [
align: 'center',
},
{
- name: 'client',
- label: t('Client'),
- field: (row) => row?.nickname,
+ name: 'city',
+ label: t('City'),
+ field: (row) => row?.city,
sortable: false,
align: 'left',
},
diff --git a/src/pages/Route/Vehicle/Card/VehicleDescriptor.vue b/src/pages/Route/Vehicle/Card/VehicleDescriptor.vue
index d9a2434ab3c..ad2ae61e4fc 100644
--- a/src/pages/Route/Vehicle/Card/VehicleDescriptor.vue
+++ b/src/pages/Route/Vehicle/Card/VehicleDescriptor.vue
@@ -1,17 +1,29 @@
+import VehicleDescriptor from 'pages/Route/Vehicle/Card/VehicleDescriptor.vue';
+import VehicleSummary from './VehicleSummary.vue';
+
+const $props = defineProps({
+ id: {
+ type: Number,
+ required: true,
+ },
+ summary: {
+ type: Object,
+ default: null,
+ },
+});
+
+
+
+
+
+
diff --git a/src/pages/Route/Vehicle/Card/VehicleSummary.vue b/src/pages/Route/Vehicle/Card/VehicleSummary.vue
index e4b0a9497fb..13d4bbc9dc6 100644
--- a/src/pages/Route/Vehicle/Card/VehicleSummary.vue
+++ b/src/pages/Route/Vehicle/Card/VehicleSummary.vue
@@ -13,12 +13,13 @@ const props = defineProps({ id: { type: [Number, String], default: null } });
const route = useRoute();
const entityId = computed(() => props.id || +route.params.id);
+const baseLink = `#/${route.meta.moduleName.toLowerCase()}/vehicle/${entityId.value}`;
const links = {
- 'basic-data': `#/vehicle/${entityId.value}/basic-data`,
- notes: `#/vehicle/${entityId.value}/notes`,
- dms: `#/vehicle/${entityId.value}/dms`,
- 'invoice-in': `#/vehicle/${entityId.value}/invoice-in`,
- events: `#/vehicle/${entityId.value}/events`,
+ 'basic-data': `${baseLink}/basic-data`,
+ notes: `${baseLink}/notes`,
+ dms: `${baseLink}/dms`,
+ 'invoice-in': `${baseLink}/invoice-in`,
+ events: `${baseLink}/events`,
};
@@ -54,7 +55,10 @@ const links = {
{{ entity.supplier?.name }}
-
+
@@ -63,6 +67,7 @@ const links = {
{{ entity.supplierCooler?.name }}
diff --git a/src/pages/Route/Vehicle/VehicleList.vue b/src/pages/Route/Vehicle/VehicleList.vue
index e5b94501005..a79cc2e35ca 100644
--- a/src/pages/Route/Vehicle/VehicleList.vue
+++ b/src/pages/Route/Vehicle/VehicleList.vue
@@ -116,6 +116,7 @@ const columns = computed(() => [
title: t('components.smartCard.openSummary'),
icon: 'preview',
action: (row) => viewSummary(row.id, VehicleSummary),
+ isPrimary: true,
},
],
},
diff --git a/src/pages/Route/locale/en.yml b/src/pages/Route/locale/en.yml
index cc445f41203..283b6185560 100644
--- a/src/pages/Route/locale/en.yml
+++ b/src/pages/Route/locale/en.yml
@@ -1,48 +1,79 @@
route:
+ filter:
+ Served: Served
+ extendedList:
+ selectStartingDate: Select the starting date
+ startingDate: Starting date
+ cloneSelectedRoutes: Clone selected routes
+ downloadSelectedRoutes: Download selected routes as PDF
+ markServed: Mark as served
roadmap:
+ roadmap: Roadmap
+ carrier: Carrier
+ vehicle: Vehicle
+ price: Price
+ observations: Observations
+ etd: ETD
+ dateCantEmpty: The date can't be empty
+ createRoadmap: Create roadmap
+ deleteRoadmap: Delete roadmap(s)
+ cloneSelected: Clone selected routes
+ selectedRoadmapsRemoved: Selected roadmaps will be removed
+ areYouSure: Are you sure you want to continue?
+ selectEtd: Select the estimated date of departure (ETD)
search: Search roadmap
searchInfo: You can search by roadmap reference
params:
+ warehouseFk: Warehouse
+ description: Description
+ m3: m³
+ scopeDays: Days Onward
+ vehicleFk: Vehicle
+ agencyModeFk: Agency
+ workerFk: Worker
+ from: From
+ to: To
+ isOk: Served
etd: ETD
tractorPlate: Plate
price: Price
observations: Observations
- id: ID
+ id: Id
name: Name
cmrFk: CMR id
hasCmrDms: Attached in gestdoc
ticketFk: Ticketd id
routeFk: Route id
+ clientFk: Client id
+ countryFk: Country
shipped: Shipped
agencyAgreement: Agency agreement
agencyModeName: Agency route
+ isOwn: Own
+ isAnyVolumeallowed: Any volume allowed
Worker: Worker
Agency: Agency
Vehicle: Vehicle
Description: Description
hourStarted: H.Start
hourFinished: H.End
- dated: Dated
- From: From
- To: To
+ createRoute: Create route
Date: Date
KmStart: Km start
KmEnd: Km end
Served: Served
- Clone Selected Routes: Clone selected routes
- Select the starting date: Select the starting date
- Stating date: Starting date
- Cancel: Cancel
- Mark as served: Mark as served
- Download selected routes as PDF: Download selected routes as PDF
- Add ticket: Add ticket
- Summary: Summary
+ addTicket: Add ticket
+ routeSummary: Go to summary
Route is closed: Route is closed
Route is not served: Route is not served
search: Search route
searchInfo: You can search by route reference
+ dated: Dated
+ preview: Preview
cmr:
- list:
+ search: Search Cmr
+ searchInfo: You can search Cmr by Id
+ params:
results: results
cmrFk: CMR id
hasCmrDms: Attached in gestdoc
@@ -50,8 +81,10 @@ route:
'false': 'No'
ticketFk: Ticketd id
routeFk: Route id
- country: Country
+ countryFk: Country
clientFk: Client id
+ warehouseFk: Warehouse
shipped: Preparation date
viewCmr: View CMR
- downloadCmrs: Download CMRs
\ No newline at end of file
+ downloadCmrs: Download CMRs
+ search: General search
diff --git a/src/pages/Route/locale/es.yml b/src/pages/Route/locale/es.yml
index 51d43774a5a..2785ded31f2 100644
--- a/src/pages/Route/locale/es.yml
+++ b/src/pages/Route/locale/es.yml
@@ -1,21 +1,57 @@
route:
+ filter:
+ Served: Servida
+ extendedList:
+ selectStartingDate: Seleccione la fecha de inicio
+ statingDate: Fecha de inicio
+ cloneSelectedRoutes: Clonar rutas seleccionadas
+ downloadSelectedRoutes: Descargar rutas seleccionadas como PDF
+ markServed: Marcar como servidas
roadmap:
+ roadmap: Troncal
+ carrier: Transportista
+ vehicle: Vehículo
+ price: Precio
+ observations: Observaciones
+ etd: ETD
+ dateCantEmpty: La fecha no puede estar vacía
+ createRoadmap: Crear troncal
+ deleteRoadmap: Eliminar troncal(es)
+ cloneSelected: Clonar rutas seleccionadas
+ selectedRoadmapsRemoved: Los troncales seleccionadas serán eliminados
+ areYouSure: ¿Seguro que quieres continuar?
+ selectEtd: Selecciona la fecha estimada de salida
search: Buscar troncales
searchInfo: Puedes buscar por referencia del troncal
params:
- agencyModeName: Agencia Ruta
- agencyAgreement: Agencia Acuerdo
- id: Id
- name: Troncal
+ warehouseFk: Almacén
+ description: Descripción
+ m3: m³
+ scopeDays: Días adelante
+ vehicleFk: Vehículo
+ agencyModeFk: Agencia
+ workerFk: Trabajador
+ from: Desde
+ to: Hasta
+ isOk: Servida
etd: ETD
tractorPlate: Matrícula
price: Precio
observations: Observaciones
+ id: Id
+ name: Troncal
cmrFk: Id CMR
hasCmrDms: Gestdoc
+ search: Búsqueda general
ticketFk: Id ticket
- routeFK: Id ruta
+ routeFk: Id ruta
+ clientFk: Id cliente
+ countryFk: Pais
shipped: Fecha preparación
+ agencyModeName: Agencia Ruta
+ agencyAgreement: Agencia Acuerdo
+ isOwn: Propio
+ isAnyVolumeAllowed: Cualquier volumen
Worker: Trabajador
Agency: Agencia
Vehicle: Vehículo
@@ -23,25 +59,18 @@ route:
hourStarted: H.Inicio
hourFinished: H.Fin
createRoute: Crear ruta
- From: Desde
- To: Hasta
Date: Fecha
KmStart: Km inicio
KmEnd: Km fin
Served: Servida
- Clone Selected Routes: Clonar rutas seleccionadas
- Select the starting date: Seleccione la fecha de inicio
- Stating date: Fecha de inicio
- Cancel: Cancelar
- Mark as served: Marcar como servidas
- Download selected routes as PDF: Descargar rutas seleccionadas como PDF
- Add ticket: Añadir tickets
- preview: Vista previa
- Summary: Resumen
+ addTicket: Añadir tickets
+ routeSummary: Ir a vista previa
Route is closed: La ruta está cerrada
Route is not served: La ruta no está servida
search: Buscar rutas
searchInfo: Puedes buscar por referencia de la ruta
+ dated: Fecha
+ preview: Vista previa
cmr:
list:
results: resultados
@@ -55,4 +84,4 @@ route:
clientFk: Id cliente
shipped: Fecha preparación
viewCmr: Ver CMR
- downloadCmrs: Descargar CMRs
\ No newline at end of file
+ downloadCmrs: Descargar CMRs
diff --git a/src/pages/Shelving/Card/ShelvingFilter.vue b/src/pages/Shelving/Card/ShelvingFilter.vue
index 56cf4f58c44..88d716046a2 100644
--- a/src/pages/Shelving/Card/ShelvingFilter.vue
+++ b/src/pages/Shelving/Card/ShelvingFilter.vue
@@ -2,6 +2,7 @@
import { useI18n } from 'vue-i18n';
import VnFilterPanel from 'components/ui/VnFilterPanel.vue';
import VnSelect from 'src/components/common/VnSelect.vue';
+import VnSelectWorker from 'src/components/common/VnSelectWorker.vue';
const { t } = useI18n();
const props = defineProps({
@@ -46,19 +47,7 @@ const emit = defineEmits(['search']);
-
+
diff --git a/src/pages/Shelving/Card/ShelvingSummary.vue b/src/pages/Shelving/Card/ShelvingSummary.vue
index f89ff4d788e..4a66696249c 100644
--- a/src/pages/Shelving/Card/ShelvingSummary.vue
+++ b/src/pages/Shelving/Card/ShelvingSummary.vue
@@ -6,6 +6,7 @@ import VnLv from 'components/ui/VnLv.vue';
import VnUserLink from 'components/ui/VnUserLink.vue';
import filter from './ShelvingFilter.js';
import ShelvingDescriptorMenu from './ShelvingDescriptorMenu.vue';
+import VnTitle from 'src/components/common/VnTitle.vue';
const $props = defineProps({
id: {
@@ -38,13 +39,10 @@ const entityId = computed(() => $props.id || route.params.id);
-
+
-
+
{
- {{ buy.itemName }}
+ {{ buy.itemName }}
diff --git a/src/pages/Ticket/Card/BasicData/TicketBasicDataView.vue b/src/pages/Ticket/Card/BasicData/TicketBasicDataView.vue
index ef2eb75d6e0..3c2fe95e568 100644
--- a/src/pages/Ticket/Card/BasicData/TicketBasicDataView.vue
+++ b/src/pages/Ticket/Card/BasicData/TicketBasicDataView.vue
@@ -44,8 +44,8 @@ const getPriceDifference = async () => {
shipped: ticket.value.shipped,
};
const { data } = await axios.post(
- `tickets/${ticket.value.id}/priceDifference`,
- params
+ `tickets/${formData.value.id}/priceDifference`,
+ params,
);
ticket.value.sale = data;
};
@@ -71,8 +71,8 @@ const submit = async () => {
};
const { data } = await axios.post(
- `tickets/${ticket.value.id}/componentUpdate`,
- params
+ `tickets/${formData.value.id}/componentUpdate`,
+ params,
);
if (!data) return;
@@ -99,7 +99,7 @@ const onNextStep = async () => {
openConfirmationModal(
t('basicData.negativesConfirmTitle'),
t('basicData.negativesConfirmMessage'),
- submitWithNegatives
+ submitWithNegatives,
);
else submit();
}
diff --git a/src/pages/Ticket/Card/TicketDescriptor.vue b/src/pages/Ticket/Card/TicketDescriptor.vue
index 1e585592f31..743f2188c05 100644
--- a/src/pages/Ticket/Card/TicketDescriptor.vue
+++ b/src/pages/Ticket/Card/TicketDescriptor.vue
@@ -3,14 +3,15 @@ import { ref, computed } from 'vue';
import { useRoute } from 'vue-router';
import { useI18n } from 'vue-i18n';
import CustomerDescriptorProxy from 'pages/Customer/Card/CustomerDescriptorProxy.vue';
+import DepartmentDescriptorProxy from 'pages/Worker/Department/Card/DepartmentDescriptorProxy.vue';
import CardDescriptor from 'components/ui/CardDescriptor.vue';
import TicketDescriptorMenu from './TicketDescriptorMenu.vue';
import VnLv from 'src/components/ui/VnLv.vue';
-import VnUserLink from 'src/components/ui/VnUserLink.vue';
import { toDateTimeFormat } from 'src/filters/date';
import filter from './TicketFilter.js';
import FetchData from 'src/components/FetchData.vue';
import TicketProblems from 'src/components/TicketProblems.vue';
+import axios from 'axios';
const $props = defineProps({
id: {
@@ -31,23 +32,37 @@ const entityId = computed(() => {
return $props.id || route.params.id;
});
const problems = ref({});
+const originalTicket = ref();
function ticketFilter(ticket) {
return JSON.stringify({ clientFk: ticket.clientFk });
}
+async function getClaims() {
+ const userFilter = { where: { refundTicketFk: entityId.value } };
+ const { data } = await axios.get(`TicketRefunds`, {
+ params: { filter: JSON.stringify(userFilter) },
+ });
+ if (!data) return;
+ originalTicket.value = data[0]?.originalTicketFk;
+}
+async function getProblems() {
+ const { data } = await axios.get(`Tickets/${entityId.value}/getTicketProblems`);
+ if (!data) return;
+ problems.value = data[0];
+}
+function getInfo() {
+ getClaims();
+ getProblems();
+}
- ([problems] = data)"
- />
@@ -73,12 +88,12 @@ function ticketFilter(ticket) {
-
+
-
+
+ {{ entity?.client?.department?.name || '-' }}
+
+
-
+
@@ -129,6 +144,15 @@ function ticketFilter(ticket) {
>
{{ t('ticket.card.newOrder') }}
+
+ {{ t('ticket.card.ticketClaimed') }}
+
diff --git a/src/pages/Ticket/Card/TicketEditMana.vue b/src/pages/Ticket/Card/TicketEditMana.vue
index ff40a659252..266c82ccde0 100644
--- a/src/pages/Ticket/Card/TicketEditMana.vue
+++ b/src/pages/Ticket/Card/TicketEditMana.vue
@@ -33,7 +33,7 @@ const save = (sale = $props.sale) => {
};
const getMana = async () => {
- const { data } = await axios.get(`Tickets/${route.params.id}/getSalesPersonMana`);
+ const { data } = await axios.get(`Tickets/${route.params.id}/getDepartmentMana`);
mana.value = data;
await getUsesMana();
};
diff --git a/src/pages/Ticket/Card/TicketFilter.js b/src/pages/Ticket/Card/TicketFilter.js
index 7846f16584e..daa204a7ad1 100644
--- a/src/pages/Ticket/Card/TicketFilter.js
+++ b/src/pages/Ticket/Card/TicketFilter.js
@@ -12,7 +12,7 @@ export default {
fields: [
'id',
'name',
- 'salesPersonFk',
+ 'departmentFk',
'phone',
'mobile',
'email',
@@ -29,7 +29,7 @@ export default {
fields: ['id', 'lang'],
},
},
- { relation: 'salesPersonUser' },
+ { relation: 'department' },
],
},
},
diff --git a/src/pages/Ticket/Card/TicketSale.vue b/src/pages/Ticket/Card/TicketSale.vue
index e69d489c0c8..2fb305cc3df 100644
--- a/src/pages/Ticket/Card/TicketSale.vue
+++ b/src/pages/Ticket/Card/TicketSale.vue
@@ -174,22 +174,26 @@ const getSaleTotal = (sale) => {
return price - discount;
};
-const getRowUpdateInputEvents = (sale) => ({
- 'keyup.enter': () => {
- changeQuantity(sale);
- },
- blur: () => {
- changeQuantity(sale);
- },
-});
+const getRowUpdateInputEvents = (sale) => {
+ return {
+ 'keyup.enter': () => {
+ changeQuantity(sale);
+ },
+ blur: () => {
+ changeQuantity(sale);
+ },
+ };
+};
const resetChanges = async () => {
arrayData.fetch({ append: false });
tableRef.value.reload();
+ selectedRows.value = [];
};
const changeQuantity = async (sale) => {
if (!sale.itemFk || sale.quantity == null || sale?.originalQuantity === sale.quantity)
return;
+ else sale.originalQuantity = sale.quantity;
if (!sale.id) return addSale(sale);
if (await isSalePrepared(sale)) {
@@ -235,7 +239,7 @@ const addSale = async (sale) => {
notify('globals.dataSaved', 'positive');
sale.isNew = false;
- arrayData.fetch({});
+ resetChanges();
};
const changeConcept = async (sale) => {
if (await isSalePrepared(sale)) {
@@ -258,6 +262,18 @@ const DEFAULT_EDIT = {
oldQuantity: null,
};
const edit = ref({ ...DEFAULT_EDIT });
+const usesMana = ref(null);
+
+const getUsesMana = async () => {
+ const { data } = await axios.get('Sales/usesMana');
+ usesMana.value = data;
+};
+
+const getMana = async () => {
+ const { data } = await axios.get(`Tickets/${route.params.id}/getDepartmentMana`);
+ mana.value = data;
+ await getUsesMana();
+};
const selectedValidSales = computed(() => {
if (!sales.value) return;
@@ -310,7 +326,7 @@ const changeDiscount = async (sale) => {
}
};
-const updateDiscounts = async (sales, newDiscount = null) => {
+const updateDiscounts = async (sales, newDiscount) => {
const salesTracking = await fetchSalesTracking();
const someSaleIsPrepared = salesTracking.some((sale) =>
@@ -320,12 +336,11 @@ const updateDiscounts = async (sales, newDiscount = null) => {
else updateDiscount(sales, newDiscount);
};
-const updateDiscount = async (sales, newDiscount = null) => {
- const saleIds = sales.map((sale) => sale.id);
- const _newDiscount = newDiscount || edit.value.discount;
+const updateDiscount = async (sales, newDiscount = 0) => {
+ const salesIds = sales.map(({ id }) => id);
const params = {
- salesIds: saleIds,
- newDiscount: _newDiscount,
+ salesIds,
+ newDiscount,
manaCode: manaCode.value,
};
await axios.post(`Tickets/${route.params.id}/updateDiscount`, params);
@@ -474,7 +489,7 @@ const endNewRow = (row) => {
};
async function confirmUpdate(cb) {
- await quasar
+ quasar
.dialog({
component: VnConfirm,
componentProps: {
@@ -664,6 +679,7 @@ watch(
selection: 'multiple',
}"
:right-search="false"
+ :search-url="false"
:column-search="false"
:disable-option="{ card: true }"
auto-load
@@ -703,7 +719,7 @@ watch(
-
+
@@ -751,7 +767,7 @@ watch(
{{ row?.item?.subName.toUpperCase() }}
-
+
{
}
return false;
});
-const hasReserves = computed(() => props.sales.some((sale) => sale.reserved == true));
-
const sendSms = async (params) => {
await axios.post(`Tickets/${ticket.value.id}/sendSms`, params);
notify(t('SMS sent'), 'positive');
@@ -144,14 +142,6 @@ const onCreateClaimAccepted = async () => {
push({ name: 'ClaimBasicData', params: { id: data.id } });
};
-const setReserved = async (reserved) => {
- const params = { ticketId: ticket.value.id, sales: props.sales, reserved: reserved };
- await axios.post(`Sales/reserve`, params);
- props.sales.forEach((sale) => {
- sale.reserved = reserved;
- });
-};
-
const createRefund = async (withWarehouse) => {
if (!props.ticket) return;
@@ -252,18 +242,6 @@ const createRefund = async (withWarehouse) => {
{{ t('Mark as reserved') }}
-
-
- {{ t('Unmark as reserved') }}
-
-
{{ t('Refund') }}
diff --git a/src/pages/Ticket/Card/TicketSummary.vue b/src/pages/Ticket/Card/TicketSummary.vue
index 5838efa8803..a19ab3779e5 100644
--- a/src/pages/Ticket/Card/TicketSummary.vue
+++ b/src/pages/Ticket/Card/TicketSummary.vue
@@ -13,9 +13,9 @@ import VnLinkPhone from 'src/components/ui/VnLinkPhone.vue';
import { getUrl } from 'src/composables/getUrl';
import useNotify from 'src/composables/useNotify.js';
import { useArrayData } from 'composables/useArrayData';
-import VnUserLink from 'src/components/ui/VnUserLink.vue';
import VnTitle from 'src/components/common/VnTitle.vue';
import ItemDescriptorProxy from 'src/pages/Item/Card/ItemDescriptorProxy.vue';
+import DepartmentDescriptorProxy from 'src/pages/Worker/Department/Card/DepartmentDescriptorProxy.vue';
import ZoneDescriptorProxy from 'src/pages/Zone/Card/ZoneDescriptorProxy.vue';
import VnSelect from 'src/components/common/VnSelect.vue';
import VnToSummary from 'src/components/ui/VnToSummary.vue';
@@ -152,12 +152,14 @@ onMounted(async () => {
-
+
-
+
+ {{ entity?.client?.department?.name || '-' }}
+
+
diff --git a/src/pages/Ticket/Negative/TicketLackTable.vue b/src/pages/Ticket/Negative/TicketLackTable.vue
index 176e8f7adf9..c9c2a7cad28 100644
--- a/src/pages/Ticket/Negative/TicketLackTable.vue
+++ b/src/pages/Ticket/Negative/TicketLackTable.vue
@@ -225,7 +225,7 @@ function onBuysFetched(data) {
/>
-
+
{{ item?.longName ?? item.name }}
diff --git a/src/pages/Ticket/TicketAdvance.vue b/src/pages/Ticket/TicketAdvance.vue
index 94b4623aae5..bf3593acdde 100644
--- a/src/pages/Ticket/TicketAdvance.vue
+++ b/src/pages/Ticket/TicketAdvance.vue
@@ -259,7 +259,7 @@ const moveTicketsAdvance = async () => {
destinationId: ticket.id,
originShipped: ticket.futureShipped,
destinationShipped: ticket.shipped,
- salesPersonFk: ticket.workerFk,
+ departmentFk: ticket.departmentFk,
});
}
const params = { tickets: ticketsToMove };
@@ -285,7 +285,7 @@ const progressAdd = () => {
t('advanceTickets.moveTicketSuccess', {
ticketsNumber: progressLength.value - splitErrors.value.length,
}),
- 'positive'
+ 'positive',
);
}
};
@@ -345,16 +345,16 @@ watch(
originElRef.value.setAttribute('colspan', '9');
destinationElRef.value.textContent = `${t(
- 'advanceTickets.destination'
+ 'advanceTickets.destination',
)} ${toDateFormat(vnTableRef.value.params.dateToAdvance)}`;
originElRef.value.textContent = `${t('advanceTickets.origin')} ${toDateFormat(
- vnTableRef.value.params.dateFuture
+ vnTableRef.value.params.dateFuture,
)}`;
newRow.append(destinationElRef.value, originElRef.value);
head.insertBefore(newRow, firstRow);
},
- { once: true, inmmediate: true }
+ { once: true, inmmediate: true },
);
watch(
@@ -362,14 +362,14 @@ watch(
() => {
if (originElRef.value && destinationElRef.value) {
destinationElRef.value.textContent = `${t(
- 'advanceTickets.destination'
+ 'advanceTickets.destination',
)} ${toDateFormat(vnTableRef.value.params.dateToAdvance)}`;
originElRef.value.textContent = `${t('advanceTickets.origin')} ${toDateFormat(
- vnTableRef.value.params.dateFuture
+ vnTableRef.value.params.dateFuture,
)}`;
}
},
- { deep: true }
+ { deep: true },
);
@@ -405,7 +405,7 @@ watch(
t(`advanceTickets.advanceTitleSubtitle`, {
selectedTickets: selectedTickets.length,
}),
- moveTicketsAdvance
+ moveTicketsAdvance,
)
"
>
@@ -423,7 +423,7 @@ watch(
t(`advanceTickets.advanceWithoutNegativeSubtitle`, {
selectedTickets: selectedTickets.length,
}),
- splitTickets
+ splitTickets,
)
"
>
diff --git a/src/pages/Ticket/TicketFilter.vue b/src/pages/Ticket/TicketFilter.vue
index bdf75c82648..f959157f68a 100644
--- a/src/pages/Ticket/TicketFilter.vue
+++ b/src/pages/Ticket/TicketFilter.vue
@@ -97,15 +97,15 @@ const getGroupedStates = (data) => {
-
@@ -308,7 +308,6 @@ en:
from: From
shipped: Shipped
to: To
- salesPersonFk: Salesperson
stateFk: State
groupedStates: Grouped State
refFk: Invoice Ref.
@@ -336,7 +335,6 @@ es:
from: Desde
shipped: F. envío
to: Hasta
- salesPersonFk: Comercial
stateFk: Estado
groupedStates: Estado agrupado
refFk: Ref. Factura
@@ -355,7 +353,6 @@ es:
Order ID: ID Pedido
From: Desde
To: Hasta
- Salesperson: Comercial
State: Estado
Invoice Ref.: Ref. Factura
My team: Mi equipo
diff --git a/src/pages/Ticket/TicketFuture.vue b/src/pages/Ticket/TicketFuture.vue
index 92911cd2549..588379ed962 100644
--- a/src/pages/Ticket/TicketFuture.vue
+++ b/src/pages/Ticket/TicketFuture.vue
@@ -160,7 +160,7 @@ const moveTicketsFuture = async () => {
destinationId: ticket.futureId,
originShipped: ticket.shipped,
destinationShipped: ticket.futureShipped,
- salesPersonFk: ticket.salesPersonFk,
+ departmentFk: ticket.departmentFk,
};
});
diff --git a/src/pages/Ticket/TicketList.vue b/src/pages/Ticket/TicketList.vue
index dfaabc84840..c603246d1bf 100644
--- a/src/pages/Ticket/TicketList.vue
+++ b/src/pages/Ticket/TicketList.vue
@@ -17,6 +17,7 @@ import TicketFilter from './TicketFilter.vue';
import VnInput from 'src/components/common/VnInput.vue';
import FetchData from 'src/components/FetchData.vue';
import CustomerDescriptorProxy from 'src/pages/Customer/Card/CustomerDescriptorProxy.vue';
+import DepartmentDescriptorProxy from 'src/pages/Worker/Department/Card/DepartmentDescriptorProxy.vue';
import ZoneDescriptorProxy from 'src/pages/Zone/Card/ZoneDescriptorProxy.vue';
import { toTimeFormat } from 'src/filters/date';
import InvoiceOutDescriptorProxy from 'src/pages/InvoiceOut/Card/InvoiceOutDescriptorProxy.vue';
@@ -99,22 +100,16 @@ const columns = computed(() => [
},
{
align: 'left',
- label: t('ticketList.salesPerson'),
- name: 'salesPersonFk',
+ name: 'departmentFk',
+ label: t('customer.summary.team'),
component: 'select',
attrs: {
- url: 'Workers/activeWithInheritedRole',
- fields: ['id', 'name'],
- where: { role: 'salesPerson' },
- optionFilter: 'firstName',
- useLike: false,
+ url: 'Departments',
},
columnField: {
component: null,
},
- columnClass: 'expand',
- cardVisible: true,
- format: (row, dashIfEmpty) => dashIfEmpty(row.salesPerson),
+ format: (row, dashIfEmpty) => dashIfEmpty(row.departmentName),
},
{
align: 'left',
@@ -519,10 +514,10 @@ function setReference(data) {
-
+
- {{ dashIfEmpty(row.userName) }}
-
+ {{ dashIfEmpty(row.departmentName) }}
+
diff --git a/src/pages/Ticket/TicketWeekly.vue b/src/pages/Ticket/TicketWeekly.vue
index 0e18fe02822..d6493550b65 100644
--- a/src/pages/Ticket/TicketWeekly.vue
+++ b/src/pages/Ticket/TicketWeekly.vue
@@ -5,7 +5,7 @@ import VnSelect from 'src/components/common/VnSelect.vue';
import VnSelectCache from 'src/components/common/VnSelectCache.vue';
import CustomerDescriptorProxy from 'src/pages/Customer/Card/CustomerDescriptorProxy.vue';
import TicketDescriptorProxy from 'src/pages/Ticket/Card/TicketDescriptorProxy.vue';
-import WorkerDescriptorProxy from 'src/pages/Worker/Card/WorkerDescriptorProxy.vue';
+import DepartmentDescriptorProxy from 'src/pages/Worker/Department/Card/DepartmentDescriptorProxy.vue';
import VnSearchbar from 'src/components/ui/VnSearchbar.vue';
import { useStateStore } from 'stores/useStateStore';
import { useVnConfirm } from 'composables/useVnConfirm';
@@ -112,23 +112,17 @@ const columns = computed(() => [
},
{
align: 'left',
- name: 'id',
- label: t('weeklyTickets.salesperson'),
- columnFilter: {
- component: 'select',
- alias: 'u',
- attrs: {
- url: 'Workers/activeWithInheritedRole',
- fields: ['id', 'name'],
- where: { role: 'salesperson' },
- },
- inWhere: true,
+ name: 'departmentFk',
+ label: t('customer.summary.team'),
+ component: 'select',
+ attrs: {
+ url: 'Departments',
},
+ create: true,
columnField: {
component: null,
},
- cardVisible: true,
- format: (row) => row.userName,
+ format: (row, dashIfEmpty) => dashIfEmpty(row.departmentName),
},
{
align: 'right',
@@ -142,9 +136,9 @@ const columns = computed(() => [
openConfirmationModal(
t('You are going to delete this weekly ticket'),
t(
- 'This ticket will be removed from weekly tickets! Continue anyway?'
+ 'This ticket will be removed from weekly tickets! Continue anyway?',
),
- () => deleteWeekly(row.ticketFk)
+ () => deleteWeekly(row.ticketFk),
),
isPrimary: true,
},
@@ -219,10 +213,10 @@ onMounted(async () => {
-
+
- {{ row.userName }}
-
+ {{ row.departmentName }}
+
diff --git a/src/pages/Ticket/locale/en.yml b/src/pages/Ticket/locale/en.yml
index cdbb22d9be6..9eb8ce8cbfc 100644
--- a/src/pages/Ticket/locale/en.yml
+++ b/src/pages/Ticket/locale/en.yml
@@ -136,7 +136,6 @@ purchaseRequest:
weeklyTickets:
id: Ticket ID
shipment: Shipment
- salesperson: Salesperson
search: Search weekly tickets
searchInfo: Search weekly tickets by id or client id
ticketSaleTracking:
@@ -172,7 +171,7 @@ tracking:
addState: Add state
package:
package: Package
- added: Added
+ added: D. Added
addPackage: Add package
removePackage: Remove package
ticketList:
@@ -181,7 +180,6 @@ ticketList:
state: State
shipped: Shipped
zone: Zone
- salesPerson: Sales person
totalWithVat: Total with VAT
summary: Summary
client: Customer
diff --git a/src/pages/Ticket/locale/es.yml b/src/pages/Ticket/locale/es.yml
index 75d3c6a2b7b..62013d9c528 100644
--- a/src/pages/Ticket/locale/es.yml
+++ b/src/pages/Ticket/locale/es.yml
@@ -58,7 +58,6 @@ basicData:
weeklyTickets:
id: ID Ticket
shipment: Salida
- salesperson: Comercial
search: Buscar por tickets programados
searchInfo: Buscar tickets programados por el identificador o el identificador del cliente
advanceTickets:
@@ -162,7 +161,7 @@ expedition:
removeExpedition: Eliminar expedición
package:
package: Embalaje
- added: Añadido
+ added: F. Creacion
addPackage: Añadir embalaje
removePackage: Quitar embalaje
ticketSaleTracking:
@@ -186,7 +185,6 @@ ticketList:
state: Estado
shipped: F. Envío
zone: Zona
- salesPerson: Comercial
totalWithVat: Total con IVA
summary: Resumen
client: Cliente
diff --git a/src/pages/Worker/Card/WorkerDescriptor.vue b/src/pages/Worker/Card/WorkerDescriptor.vue
index 0e946f1ddcc..6e3a5e83f64 100644
--- a/src/pages/Worker/Card/WorkerDescriptor.vue
+++ b/src/pages/Worker/Card/WorkerDescriptor.vue
@@ -23,6 +23,10 @@ const $props = defineProps({
required: false,
default: 'Worker',
},
+ summary: {
+ type: Object,
+ default: null,
+ },
});
const image = ref(null);
@@ -51,6 +55,7 @@ const handlePhotoUpdated = (evt = false) => {
{
:value="entity.user?.emailUser?.email"
copy
/>
-
+
diff --git a/src/pages/Worker/Card/WorkerSummary.vue b/src/pages/Worker/Card/WorkerSummary.vue
index 78c5dfd82b3..c486a00c28f 100644
--- a/src/pages/Worker/Card/WorkerSummary.vue
+++ b/src/pages/Worker/Card/WorkerSummary.vue
@@ -50,7 +50,7 @@ onBeforeMount(async () => {
-
+
{
const response = await axios.get(`Zones/${route.params.id}/getLeaves`, {
params,
});
+ response.data = JSON.parse(response.data);
if (response.data) {
node.childs = response.data.map((n) => {
if (n.sons > 0) n.childs = [{}];
@@ -126,14 +127,17 @@ watch(
async (val) => {
if (!val) return;
// // Se triggerea cuando se actualiza el store.data, el cual es el resultado del fetch de la searchbar
+ val = JSON.parse(val);
if (!nodes.value[0]) nodes.value = [defaultNode];
nodes.value[0].childs = [...val];
const fetchedNodeKeys = val.flatMap(getNodeIds);
state.set('Tree', [...fetchedNodeKeys]);
expanded.value = [null, ...fetchedNodeKeys];
+ const fetchs = [];
for (let n of state.get('Tree')) {
- await fetchNodeLeaves(n);
+ fetchs.push(fetchNodeLeaves(n));
}
+ await Promise.all(fetchs);
previousExpandedNodes.value = new Set(expanded.value);
},
{ immediate: true },
diff --git a/src/router/modules/customer.js b/src/router/modules/customer.js
index 67b00b161eb..a33ed6be5b1 100644
--- a/src/router/modules/customer.js
+++ b/src/router/modules/customer.js
@@ -4,8 +4,8 @@ const customerCard = {
name: 'CustomerCard',
path: ':id',
component: () => import('src/pages/Customer/Card/CustomerCard.vue'),
- redirect: { name: 'CustomerSummary' },
- meta: {
+ redirect: { name: 'CustomerSummary' },
+ meta: {
menu: [
'CustomerBasicData',
'CustomerFiscalData',
@@ -40,8 +40,7 @@ const customerCard = {
title: 'basicData',
icon: 'vn:settings',
},
- component: () =>
- import('src/pages/Customer/Card/CustomerBasicData.vue'),
+ component: () => import('src/pages/Customer/Card/CustomerBasicData.vue'),
},
{
path: 'fiscal-data',
@@ -50,8 +49,7 @@ const customerCard = {
title: 'fiscalData',
icon: 'vn:dfiscales',
},
- component: () =>
- import('src/pages/Customer/Card/CustomerFiscalData.vue'),
+ component: () => import('src/pages/Customer/Card/CustomerFiscalData.vue'),
},
{
path: 'billing-data',
@@ -60,8 +58,7 @@ const customerCard = {
title: 'billingData',
icon: 'vn:payment',
},
- component: () =>
- import('src/pages/Customer/Card/CustomerBillingData.vue'),
+ component: () => import('src/pages/Customer/Card/CustomerBillingData.vue'),
},
{
path: 'address',
@@ -85,9 +82,7 @@ const customerCard = {
title: 'address-create',
},
component: () =>
- import(
- 'src/pages/Customer/components/CustomerAddressCreate.vue'
- ),
+ import('src/pages/Customer/components/CustomerAddressCreate.vue'),
},
{
path: ':addressId',
@@ -125,8 +120,7 @@ const customerCard = {
title: 'credits',
icon: 'vn:credit',
},
- component: () =>
- import('src/pages/Customer/Card/CustomerCredits.vue'),
+ component: () => import('src/pages/Customer/Card/CustomerCredits.vue'),
},
{
path: 'greuges',
@@ -135,8 +129,7 @@ const customerCard = {
title: 'greuges',
icon: 'vn:greuge',
},
- component: () =>
- import('src/pages/Customer/Card/CustomerGreuges.vue'),
+ component: () => import('src/pages/Customer/Card/CustomerGreuges.vue'),
},
{
path: 'balance',
@@ -145,8 +138,7 @@ const customerCard = {
title: 'balance',
icon: 'balance',
},
- component: () =>
- import('src/pages/Customer/Card/CustomerBalance.vue'),
+ component: () => import('src/pages/Customer/Card/CustomerBalance.vue'),
},
{
path: 'recoveries',
@@ -155,8 +147,7 @@ const customerCard = {
title: 'recoveries',
icon: 'vn:recovery',
},
- component: () =>
- import('src/pages/Customer/Card/CustomerRecoveries.vue'),
+ component: () => import('src/pages/Customer/Card/CustomerRecoveries.vue'),
},
{
path: 'web-access',
@@ -165,8 +156,7 @@ const customerCard = {
title: 'webAccess',
icon: 'vn:web',
},
- component: () =>
- import('src/pages/Customer/Card/CustomerWebAccess.vue'),
+ component: () => import('src/pages/Customer/Card/CustomerWebAccess.vue'),
},
{
path: 'log',
@@ -247,9 +237,7 @@ const customerCard = {
title: 'creditOpinion',
},
component: () =>
- import(
- 'src/pages/Customer/Card/CustomerCreditOpinion.vue'
- ),
+ import('src/pages/Customer/Card/CustomerCreditOpinion.vue'),
},
],
},
@@ -319,9 +307,7 @@ const customerCard = {
title: 'samples',
},
component: () =>
- import(
- 'src/pages/Customer/Card/CustomerSamples.vue'
- ),
+ import('src/pages/Customer/Card/CustomerSamples.vue'),
},
{
path: 'create',
@@ -376,9 +362,7 @@ const customerCard = {
title: 'fileManagement',
},
component: () =>
- import(
- 'src/pages/Customer/Card/CustomerFileManagement.vue'
- ),
+ import('src/pages/Customer/Card/CustomerFileManagement.vue'),
},
{
path: 'file-management',
@@ -420,8 +404,7 @@ const customerCard = {
meta: {
title: 'unpaid',
},
- component: () =>
- import('src/pages/Customer/Card/CustomerUnpaid.vue'),
+ component: () => import('src/pages/Customer/Card/CustomerUnpaid.vue'),
},
],
},
@@ -429,7 +412,7 @@ const customerCard = {
};
export default {
- name: 'Customer',
+ name: 'Customer',
path: '/customer',
meta: {
title: 'customers',
@@ -469,15 +452,6 @@ export default {
customerCard,
],
},
- {
- path: 'create',
- name: 'CustomerCreate',
- meta: {
- title: 'customerCreate',
- icon: 'add',
- },
- component: () => import('src/pages/Customer/CustomerCreate.vue'),
- },
{
path: 'payments',
name: 'CustomerPayments',
diff --git a/src/router/modules/route.js b/src/router/modules/route.js
index 835324d20b1..c84795a98b3 100644
--- a/src/router/modules/route.js
+++ b/src/router/modules/route.js
@@ -220,7 +220,6 @@ export default {
path: '',
name: 'RouteIndexMain',
redirect: { name: 'RouteList' },
- component: () => import('src/pages/Route/RouteList.vue'),
children: [
{
name: 'RouteList',
@@ -229,6 +228,7 @@ export default {
title: 'list',
icon: 'view_list',
},
+ component: () => import('src/pages/Route/RouteList.vue'),
},
routeCard,
],
@@ -268,7 +268,6 @@ export default {
title: 'RouteRoadmap',
icon: 'vn:troncales',
},
- component: () => import('src/pages/Route/RouteRoadmap.vue'),
children: [
{
name: 'RoadmapList',
@@ -277,6 +276,7 @@ export default {
title: 'list',
icon: 'view_list',
},
+ component: () => import('src/pages/Route/RouteRoadmap.vue'),
},
roadmapCard,
],
@@ -298,7 +298,6 @@ export default {
title: 'agency',
icon: 'garage_home',
},
- component: () => import('src/pages/Route/Agency/AgencyList.vue'),
children: [
{
name: 'AgencyList',
@@ -307,6 +306,8 @@ export default {
title: 'list',
icon: 'view_list',
},
+ component: () =>
+ import('src/pages/Route/Agency/AgencyList.vue'),
},
agencyCard,
],
@@ -319,7 +320,6 @@ export default {
title: 'vehicle',
icon: 'directions_car',
},
- component: () => import('src/pages/Route/Vehicle/VehicleList.vue'),
children: [
{
path: 'list',
@@ -328,6 +328,8 @@ export default {
title: 'vehicleList',
icon: 'directions_car',
},
+ component: () =>
+ import('src/pages/Route/Vehicle/VehicleList.vue'),
},
vehicleCard,
],
diff --git a/test/cypress/integration/claim/claimAction.spec.js b/test/cypress/integration/claim/claimAction.spec.js
index b0a16a2add1..8f406ad2ff6 100644
--- a/test/cypress/integration/claim/claimAction.spec.js
+++ b/test/cypress/integration/claim/claimAction.spec.js
@@ -1,5 +1,5 @@
///
-describe('ClaimAction', () => {
+describe.skip('ClaimAction', () => {
const claimId = 1;
const firstRow = 'tbody > :nth-child(1)';
@@ -15,12 +15,14 @@ describe('ClaimAction', () => {
cy.get('[title="Import claim"]').click();
});
- it('should change destination', () => {
+ // https://redmine.verdnatura.es/issues/8756
+ xit('should change destination', () => {
const rowData = [true, null, null, 'Bueno'];
cy.fillRow(firstRow, rowData);
});
- it('should change destination from other button', () => {
+ // https://redmine.verdnatura.es/issues/8756
+ xit('should change destination from other button', () => {
const rowData = [true];
cy.fillRow(firstRow, rowData);
@@ -33,7 +35,8 @@ describe('ClaimAction', () => {
cy.get('[title="Regularize"]').click();
});
- it('should remove the line', () => {
+ // https://redmine.verdnatura.es/issues/8756
+ xit('should remove the line', () => {
cy.fillRow(firstRow, [true]);
cy.removeCard();
cy.clickConfirm();
diff --git a/test/cypress/integration/claim/claimPhoto.spec.js b/test/cypress/integration/claim/claimPhoto.spec.js
index b84b4f9581e..ac04600296d 100755
--- a/test/cypress/integration/claim/claimPhoto.spec.js
+++ b/test/cypress/integration/claim/claimPhoto.spec.js
@@ -1,5 +1,5 @@
///
-describe('ClaimPhoto', () => {
+describe.skip('ClaimPhoto', () => {
const carrouselClose =
'.q-dialog__inner > .q-toolbar > .q-btn > .q-btn__content > .q-icon';
beforeEach(() => {
diff --git a/test/cypress/integration/client/clientBalance.spec.js b/test/cypress/integration/client/clientBalance.spec.js
index 4579efaa61a..fff6a5e04df 100644
--- a/test/cypress/integration/client/clientBalance.spec.js
+++ b/test/cypress/integration/client/clientBalance.spec.js
@@ -1,17 +1,13 @@
///
-describe.skip('Client balance', () => {
+describe('Client balance', () => {
beforeEach(() => {
- cy.viewport(1280, 720);
cy.login('developer');
cy.visit('#/customer/1101/balance');
});
- it('Should load layout', () => {
- cy.get('.q-page').should('be.visible');
- });
it('Should create a mandate', () => {
cy.get('.q-page-sticky > div > .q-btn').click();
- cy.dataCy('paymentBank').type({ arroyDown });
- cy.dataCy('paymentAmount').type('100');
+ cy.selectOption('[data-cy="paymentBank"]', 2);
+ cy.dataCy('paymentAmount_input').clear().type('100');
cy.saveCard();
});
});
diff --git a/test/cypress/integration/client/clientList.spec.js b/test/cypress/integration/client/clientList.spec.js
index b29ad74af74..467c6c37d8b 100644
--- a/test/cypress/integration/client/clientList.spec.js
+++ b/test/cypress/integration/client/clientList.spec.js
@@ -1,5 +1,5 @@
///
-describe('Client list', () => {
+describe.skip('Client list', () => {
beforeEach(() => {
cy.login('developer');
cy.visit('/#/customer/list', {
@@ -25,7 +25,7 @@ describe('Client list', () => {
'Web user': { val: `user_test_${randomInt}` },
Street: { val: `C/ STREET ${randomInt}` },
Email: { val: `user.test${randomInt}@cypress.com` },
- 'Sales person': { val: 'salesPerson', type: 'select' },
+ Team: { val: 'Informatica', type: 'select' },
Location: { val: '46000', type: 'select' },
'Business type': { val: 'others', type: 'select' },
};
diff --git a/test/cypress/integration/invoiceOut/invoiceOutList.spec.js b/test/cypress/integration/invoiceOut/invoiceOutList.spec.js
index d3a84d226b4..b8b42fa4bb0 100644
--- a/test/cypress/integration/invoiceOut/invoiceOutList.spec.js
+++ b/test/cypress/integration/invoiceOut/invoiceOutList.spec.js
@@ -13,7 +13,6 @@ describe('InvoiceOut list', () => {
':nth-child(1) > .text-right > [data-cy="tableAction-0"] > .q-btn__content > .q-icon';
beforeEach(() => {
- cy.viewport(1920, 1080);
cy.login('developer');
cy.visit(`/#/invoice-out/list`);
cy.typeSearchbar('{enter}');
@@ -41,7 +40,7 @@ describe('InvoiceOut list', () => {
});
it('should filter the results by client ID, then check the first result is correct', () => {
- cy.dataCy('Customer ID_input').type('1103');
+ cy.dataCy('Client id_input').type('1103');
cy.get(filterBtn).click();
cy.get(firstRowDescriptor).click();
cy.get('.q-item > .q-item__label').should('include.text', '1103');
diff --git a/test/cypress/integration/invoiceOut/invoiceOutNegativeBases.spec.js b/test/cypress/integration/invoiceOut/invoiceOutNegativeBases.spec.js
index 0039f6240cd..9c6eef2edaf 100644
--- a/test/cypress/integration/invoiceOut/invoiceOutNegativeBases.spec.js
+++ b/test/cypress/integration/invoiceOut/invoiceOutNegativeBases.spec.js
@@ -16,9 +16,9 @@ describe('InvoiceOut negative bases', () => {
cy.get(getDescriptors('ticketFk')).click();
cy.get('.descriptor').should('be.visible');
cy.get('.q-item > .q-item__label').should('include.text', '23');
- cy.get(getDescriptors('workerName')).click();
+ cy.get(getDescriptors('departmentFk')).click();
cy.get('.descriptor').should('be.visible');
- cy.get('.q-item > .q-item__label').should('include.text', '18');
+ cy.get('.q-item > .q-item__label').should('include.text', '155');
});
it('should filter and download as CSV', () => {
diff --git a/test/cypress/integration/outLogin/login.spec.js b/test/cypress/integration/outLogin/login.spec.js
index 2bd5a8c3bcf..22e30dd8e34 100755
--- a/test/cypress/integration/outLogin/login.spec.js
+++ b/test/cypress/integration/outLogin/login.spec.js
@@ -12,7 +12,7 @@ describe('Login', () => {
cy.get('button[type="submit"]').click();
cy.get('.q-notification__message').should(
'have.text',
- 'Invalid username or password'
+ 'Invalid username or password',
);
});
@@ -23,7 +23,7 @@ describe('Login', () => {
cy.get('button[type="submit"]').click();
cy.get('.q-notification__message').should(
'have.text',
- 'Invalid username or password'
+ 'Invalid username or password',
);
});
@@ -33,7 +33,7 @@ describe('Login', () => {
cy.get('button[type="submit"]').click();
cy.get('.q-notification__message').should(
'have.text',
- 'You have successfully logged in'
+ 'You have successfully logged in',
);
cy.url().should('contain', '/dashboard');
});
@@ -44,7 +44,7 @@ describe('Login', () => {
cy.get('button[type="submit"]').click();
cy.get('.q-notification__message').should(
'have.text',
- 'You have successfully logged in'
+ 'You have successfully logged in',
);
cy.url().should('contain', '/dashboard');
cy.get('#user').click();
@@ -61,14 +61,4 @@ describe('Login', () => {
cy.get('button[type="submit"]').click();
cy.url().should('contain', '/dashboard');
});
-
- // ticket creation is not yet implemented, use this test once it is
- // it(`should get redirected to ticket creation after login since salesPerson can do it`, () => {
- // cy.visit('/#/ticket/create', { failOnStatusCode: false });
- // cy.url().should('contain', '/#/login?redirect=/ticket/create');
- // cy.get('input[aria-label="Username"]').type('salesPerson');
- // cy.get('input[aria-label="Password"]').type('nightmare');
- // cy.get('button[type="submit"]').click();
- // cy.url().should('contain', '/#/ticket/create');
- // })
});
diff --git a/test/cypress/integration/outLogin/logout.spec.js b/test/cypress/integration/outLogin/logout.spec.js
index 373f0cc933c..b3583e4d355 100644
--- a/test/cypress/integration/outLogin/logout.spec.js
+++ b/test/cypress/integration/outLogin/logout.spec.js
@@ -24,12 +24,21 @@ describe('Logout', () => {
},
},
statusMessage: 'AUTHORIZATION_REQUIRED',
- });
+ }).as('badRequest');
});
it('when token not exists', () => {
+ const exceptionHandler = (err) => {
+ if (err.code === 'AUTHORIZATION_REQUIRED') return;
+ };
+ Cypress.on('uncaught:exception', exceptionHandler);
+
cy.get('.q-list').first().should('be.visible').click();
+ cy.wait('@badRequest');
+
cy.checkNotification('Authorization Required');
+
+ Cypress.off('uncaught:exception', exceptionHandler);
});
});
});
diff --git a/test/cypress/integration/route/agency/agencyWorkCenter.spec.js b/test/cypress/integration/route/agency/agencyWorkCenter.spec.js
index 5679ceba118..22a1a01433f 100644
--- a/test/cypress/integration/route/agency/agencyWorkCenter.spec.js
+++ b/test/cypress/integration/route/agency/agencyWorkCenter.spec.js
@@ -1,27 +1,34 @@
describe.skip('AgencyWorkCenter', () => {
+ const selectors = {
+ workCenter: 'workCenter_select',
+ popupSave: 'FormModelPopup_save',
+ popupCancel: 'FormModelPopup_cancel',
+ remove: 'removeWorkCenterBtn',
+ };
+
+ const messages = {
+ dataCreated: 'Data created',
+ alreadyAssigned: 'This workCenter is already assigned to this agency',
+ removed: 'WorkCenter removed successfully',
+ };
+
beforeEach(() => {
cy.viewport(1920, 1080);
cy.login('developer');
cy.visit(`/#/route/agency/11/workCenter`);
});
- const createButton = '.q-page-sticky > div > .q-btn > .q-btn__content > .q-icon';
- const workCenterCombobox = 'input[role="combobox"]';
- it('check workCenter crud', () => {
- // create
- cy.get(createButton).click();
- cy.get(workCenterCombobox).type('workCenterOne{enter}');
+ it('Should add work center, check already assigned and remove work center', () => {
+ cy.addBtnClick();
+ cy.selectOption('[data-cy="workCenter_select"]', 'workCenterOne');
+ cy.dataCy(selectors.popupSave).click();
cy.checkNotification('Data created');
-
- // expect error when duplicate
- cy.get(createButton).click();
- cy.selectOption(workCenterCombobox, 'workCenterOne');
- cy.get('[data-cy="FormModelPopup_save"]').click();
- cy.checkNotification('This workCenter is already assigned to this agency');
- cy.get('[data-cy="FormModelPopup_cancel"]').click();
-
- // delete
- cy.get('.q-item__section--side > .q-btn > .q-btn__content > .q-icon').click();
- cy.checkNotification('WorkCenter removed successfully');
+ cy.addBtnClick();
+ cy.selectOption('[data-cy="workCenter_select"]', 'workCenterOne');
+ cy.dataCy(selectors.popupSave).click();
+ cy.checkNotification(messages.alreadyAssigned);
+ cy.dataCy(selectors.popupCancel).click();
+ cy.dataCy(selectors.remove).click();
+ cy.checkNotification(messages.removed);
});
});
diff --git a/test/cypress/integration/route/roadMap/roadmapList.spec.js b/test/cypress/integration/route/roadMap/roadmapList.spec.js
index 6d46b2cf623..35c0c2b0285 100644
--- a/test/cypress/integration/route/roadMap/roadmapList.spec.js
+++ b/test/cypress/integration/route/roadMap/roadmapList.spec.js
@@ -1,12 +1,74 @@
describe('RoadMap', () => {
+ const getSelector = (colField) =>
+ `tr:last-child > [data-col-field="${colField}"] > .no-padding`;
+
+ const selectors = {
+ roadmap: getSelector('name'),
+ id: getSelector('id'),
+ etd: getSelector('etd'),
+ summaryHeader: '.summaryHeader > :nth-child(2)',
+ summaryGoToSummaryBtn: '.summaryHeader > a > .q-icon',
+ summaryBtn: 'tableAction-0',
+ inputRoadmap: 'Roadmap_input',
+ checkbox: '.q-virtual-scroll__content tr:last-child .q-checkbox',
+ cloneFormBtn: '.q-card__actions > .q-btn--standard',
+ cloneBtn: '#subToolbar > :nth-child(3)',
+ deleteBtn: ':nth-child(4) > .q-btn__content',
+ confirmBtn: 'VnConfirm_confirm',
+ inputEtd: 'ETD_inputDate',
+ };
+
+ const data = {
+ roadmap: 'TEST-ROADMAP',
+ etd: '01/01/2025',
+ };
+
+ const dataCreated = 'Data created';
+ const summaryUrl = '/summary';
+
beforeEach(() => {
+ cy.viewport(1920, 1080);
cy.login('developer');
cy.visit(`/#/route/roadmap`);
+ cy.typeSearchbar('{enter}');
});
+
+ it('Should list roadmaps', () => {
+ cy.get('.q-table')
+ .children()
+ .should('be.visible')
+ .should('have.length.greaterThan', 0);
+ });
+
it('Route list create roadmap and redirect', () => {
cy.addBtnClick();
- cy.get('input[name="name"]').type('roadMapTestOne{enter}');
- cy.get('.q-notification__message').should('have.text', 'Data created');
- cy.url().should('include', '/summary');
+ cy.dataCy(selectors.inputRoadmap).type(`${data.roadmap}{enter}`);
+ cy.checkNotification(dataCreated);
+ cy.url().should('include', summaryUrl);
+ });
+
+ it('open summary', () => {
+ cy.dataCy(selectors.summaryBtn).last().click();
+ cy.get(selectors.summaryHeader).should('contain', data.roadmap);
+ cy.get(selectors.summaryGoToSummaryBtn).click();
+ cy.get(selectors.summaryHeader).should('contain', data.roadmap);
+ });
+
+ it('Should clone selected roadmap with new ETD', () => {
+ cy.get(selectors.checkbox).click();
+ cy.get(selectors.cloneBtn).click();
+ cy.dataCy(selectors.inputEtd).click().type(`${data.etd}{enter}`);
+ cy.get(selectors.cloneFormBtn).click();
+ cy.get(selectors.etd).should('contain', data.etd);
+ });
+
+ it('Should delete selected roadmap', () => {
+ cy.get(selectors.id).then(($el) => {
+ cy.get(selectors.checkbox).click();
+ cy.get(selectors.deleteBtn).click();
+ cy.dataCy(selectors.confirmBtn).click();
+ cy.typeSearchbar('{enter}');
+ cy.get(selectors.id).should('not.have.text', $el.text);
+ });
});
});
diff --git a/test/cypress/integration/route/routeAutonomous.spec.js b/test/cypress/integration/route/routeAutonomous.spec.js
index acf82bd95d6..08fd7d7eace 100644
--- a/test/cypress/integration/route/routeAutonomous.spec.js
+++ b/test/cypress/integration/route/routeAutonomous.spec.js
@@ -1,4 +1,4 @@
-describe('RouteAutonomous', () => {
+describe.skip('RouteAutonomous', () => {
const getLinkSelector = (colField) =>
`tr:first-child > [data-col-field="${colField}"] > .no-padding > .link`;
diff --git a/test/cypress/integration/shelving/parking/parkingList.spec.js b/test/cypress/integration/shelving/parking/parkingList.spec.js
index ca18776214d..7372da1649c 100644
--- a/test/cypress/integration/shelving/parking/parkingList.spec.js
+++ b/test/cypress/integration/shelving/parking/parkingList.spec.js
@@ -2,7 +2,7 @@
describe('ParkingList', () => {
const searchbar = '#searchbar input';
const firstCard = ':nth-child(1) > .q-card > .no-margin > .q-py-none';
- const summaryHeader = '.summaryBody .header';
+ const summaryHeader = '.header-link';
beforeEach(() => {
cy.viewport(1920, 1080);
diff --git a/test/cypress/integration/shelving/shelvingList.spec.js b/test/cypress/integration/shelving/shelvingList.spec.js
index 745dd1b7878..20b72e419f0 100644
--- a/test/cypress/integration/shelving/shelvingList.spec.js
+++ b/test/cypress/integration/shelving/shelvingList.spec.js
@@ -16,8 +16,8 @@ describe('ShelvingList', () => {
it('should redirect from preview to basic-data', () => {
cy.typeSearchbar('{enter}');
cy.dataCy('cardBtn').eq(0).click();
- cy.get('.q-card > .header').click();
- cy.url().should('include', '/shelving/1/basic-data');
+ cy.get('.summaryHeader > .header > .q-icon').click();
+ cy.url().should('include', '/shelving/1/summary');
});
it('should filter and redirect if only one result', () => {
diff --git a/test/cypress/integration/ticket/negative/TicketLackDetail.spec.js b/test/cypress/integration/ticket/negative/TicketLackDetail.spec.js
index 7b1932b11bc..b4997fa69ce 100644
--- a/test/cypress/integration/ticket/negative/TicketLackDetail.spec.js
+++ b/test/cypress/integration/ticket/negative/TicketLackDetail.spec.js
@@ -138,8 +138,8 @@ describe.skip('Ticket Lack detail', () => {
cy.get('[data-cy="itemProposal"]').click();
cy.wait('@getItemGetSimilar');
});
- describe('Replace item if', () => {
- it.skip('Quantity is less than available', () => {
+ describe.skip('Replace item if', () => {
+ it('Quantity is less than available', () => {
cy.get(':nth-child(1) > .text-right > .q-btn').click();
});
});
diff --git a/test/cypress/integration/ticket/ticketSale.spec.js b/test/cypress/integration/ticket/ticketSale.spec.js
index 81ea761c42b..6d84f214cfe 100644
--- a/test/cypress/integration/ticket/ticketSale.spec.js
+++ b/test/cypress/integration/ticket/ticketSale.spec.js
@@ -1,139 +1,14 @@
///
+const firstRow = 'tbody > :nth-child(1)';
describe('TicketSale', () => {
- describe.skip('Free ticket #31', () => {
- beforeEach(() => {
- cy.login('developer');
- cy.viewport(1920, 1080);
- cy.visit('/#/ticket/31/sale');
- });
-
- const firstRow = 'tbody > :nth-child(1)';
-
- const selectFirstRow = () => {
- cy.waitForElement(firstRow);
- cy.get(firstRow).find('.q-checkbox__inner').click();
- };
-
- it('it should add item to basket', () => {
- cy.window().then((win) => {
- cy.stub(win, 'open').as('windowOpen');
- });
- cy.dataCy('ticketSaleAddToBasketBtn').should('exist');
- cy.dataCy('ticketSaleAddToBasketBtn').click();
- cy.get('@windowOpen').should('be.calledWithMatch', /\/order\/\d+\/catalog/);
- });
-
- it('should send SMS', () => {
- selectFirstRow();
- cy.dataCy('ticketSaleMoreActionsDropdown').click();
- cy.waitForElement('[data-cy="sendShortageSMSItem"]');
- cy.dataCy('sendShortageSMSItem').should('exist');
- cy.dataCy('sendShortageSMSItem').click();
- cy.dataCy('vnSmsDialog').should('exist');
- cy.dataCy('sendSmsBtn').click();
- cy.checkNotification('SMS sent');
- });
-
- it('should recalculate price when "Recalculate price" is clicked', () => {
- cy.intercept('POST', '**/recalculatePrice').as('recalculatePrice');
- selectFirstRow();
- cy.dataCy('ticketSaleMoreActionsDropdown').click();
- cy.waitForElement('[data-cy="recalculatePriceItem"]');
- cy.dataCy('recalculatePriceItem').should('exist');
- cy.dataCy('recalculatePriceItem').click();
- cy.wait('@recalculatePrice').its('response.statusCode').should('eq', 200);
- cy.checkNotification('Data saved');
- });
-
- it('should update discount when "Update discount" is clicked', () => {
- selectFirstRow();
- cy.dataCy('ticketSaleMoreActionsDropdown').click();
- cy.waitForElement('[data-cy="updateDiscountItem"]');
- cy.dataCy('updateDiscountItem').should('exist');
- cy.dataCy('updateDiscountItem').click();
- cy.waitForElement('[data-cy="ticketSaleDiscountInput"]');
- cy.dataCy('ticketSaleDiscountInput').find('input').focus();
- cy.dataCy('ticketSaleDiscountInput').find('input').type('10');
- cy.dataCy('saveManaBtn').click();
- cy.waitForElement('.q-notification__message');
- cy.checkNotification('Data saved');
- });
-
- it('adds claim', () => {
- selectFirstRow();
- cy.dataCy('ticketSaleMoreActionsDropdown').click();
- cy.dataCy('createClaimItem').click();
- cy.dataCy('VnConfirm_confirm').click();
- cy.url().should('contain', 'claim/');
- // Delete created claim to avoid cluttering the database
- cy.dataCy('descriptor-more-opts').click();
- cy.dataCy('deleteClaim').click();
- cy.dataCy('VnConfirm_confirm').click();
- cy.checkNotification('Data deleted');
- });
-
- it('marks row as reserved', () => {
- selectFirstRow();
- cy.dataCy('ticketSaleMoreActionsDropdown').click();
- cy.waitForElement('[data-cy="markAsReservedItem"]');
- cy.dataCy('markAsReservedItem').click();
- cy.dataCy('ticketSaleReservedIcon').should('exist');
- });
-
- it('unmarks row as reserved', () => {
- selectFirstRow();
- cy.dataCy('ticketSaleMoreActionsDropdown').click();
- cy.waitForElement('[data-cy="unmarkAsReservedItem"]');
- cy.dataCy('unmarkAsReservedItem').click();
- cy.dataCy('ticketSaleReservedIcon').should('not.exist');
- });
-
- it('refunds row with warehouse', () => {
- selectFirstRow();
- cy.dataCy('ticketSaleMoreActionsDropdown').click();
- cy.dataCy('ticketSaleRefundItem').click();
- cy.dataCy('ticketSaleRefundWithWarehouse').click();
- cy.checkNotification('The following refund ticket have been created');
- });
-
- it('refunds row without warehouse', () => {
- selectFirstRow();
- cy.dataCy('ticketSaleMoreActionsDropdown').click();
- cy.dataCy('ticketSaleRefundItem').click();
- cy.dataCy('ticketSaleRefundWithoutWarehouse').click();
- cy.checkNotification('The following refund ticket have been created');
- });
-
- it('transfer sale to a new ticket', () => {
- cy.visit('/#/ticket/32/sale');
- cy.get('.q-item > .q-item__label').should('have.text', ' #32');
- selectFirstRow();
- cy.dataCy('ticketSaleTransferBtn').click();
- cy.dataCy('ticketTransferPopup').should('exist');
- cy.dataCy('ticketTransferNewTicketBtn').click();
- cy.get('.q-item > .q-item__label').should('not.have.text', ' #32');
- });
-
- it('should redirect to ticket logs', () => {
- cy.get(firstRow).find('.q-btn:last').click();
- cy.url().should('match', /\/ticket\/31\/log/);
- });
- });
- describe.skip('Ticket prepared #23', () => {
+ describe('Ticket #23', () => {
beforeEach(() => {
cy.login('developer');
cy.viewport(1920, 1080);
cy.visit('/#/ticket/23/sale');
});
- const firstRow = 'tbody > :nth-child(1)';
-
- const selectFirstRow = () => {
- cy.waitForElement(firstRow);
- cy.get(firstRow).find('.q-checkbox__inner').click();
- };
-
it('update price', () => {
const price = Number((Math.random() * 99 + 1).toFixed(2));
cy.waitForElement(firstRow);
@@ -148,7 +23,7 @@ describe('TicketSale', () => {
cy.get('[data-col-field="price"]')
.find('.q-btn > .q-btn__content')
- .should('have.text', `€${price}`);
+ .should('contain.text', `€${price}`);
});
it('update discount', () => {
const discount = Math.floor(Math.random() * 100) + 1;
@@ -196,8 +71,128 @@ describe('TicketSale', () => {
.should('have.value', `${quantity}`);
});
});
-});
+ describe('Ticket to add claim #24', () => {
+ beforeEach(() => {
+ cy.login('developer');
+ cy.viewport(1920, 1080);
+ cy.visit('/#/ticket/24/sale');
+ });
+ it('adds claim', () => {
+ selectFirstRow();
+ cy.dataCy('ticketSaleMoreActionsDropdown').click();
+ cy.dataCy('createClaimItem').click();
+ cy.dataCy('VnConfirm_confirm').click();
+ cy.url().should('contain', 'claim/');
+ // Delete created claim to avoid cluttering the database
+ cy.dataCy('descriptor-more-opts').click();
+ cy.dataCy('deleteClaim').click();
+ cy.dataCy('VnConfirm_confirm').click();
+ });
+ });
+ describe('Free ticket #31', () => {
+ beforeEach(() => {
+ cy.login('developer');
+ cy.viewport(1920, 1080);
+ cy.visit('/#/ticket/31/sale');
+ });
+
+ it('it should add item to basket', () => {
+ cy.window().then((win) => {
+ cy.stub(win, 'open').as('windowOpen');
+ });
+ cy.dataCy('ticketSaleAddToBasketBtn').should('exist');
+ cy.dataCy('ticketSaleAddToBasketBtn').click();
+ cy.get('@windowOpen').should('be.calledWithMatch', /\/order\/\d+\/catalog/);
+ });
+
+ it('should send SMS', () => {
+ selectFirstRow();
+ cy.dataCy('ticketSaleMoreActionsDropdown').click();
+ cy.waitForElement('[data-cy="sendShortageSMSItem"]');
+ cy.dataCy('sendShortageSMSItem').should('exist');
+ cy.dataCy('sendShortageSMSItem').click();
+ cy.dataCy('vnSmsDialog').should('exist');
+ cy.dataCy('sendSmsBtn').click();
+ cy.checkNotification('SMS sent');
+ });
+
+ it('should recalculate price when "Recalculate price" is clicked', () => {
+ cy.intercept('POST', '**/recalculatePrice').as('recalculatePrice');
+ selectFirstRow();
+ cy.dataCy('ticketSaleMoreActionsDropdown').click();
+ cy.waitForElement('[data-cy="recalculatePriceItem"]');
+ cy.dataCy('recalculatePriceItem').should('exist');
+ cy.dataCy('recalculatePriceItem').click();
+ cy.wait('@recalculatePrice').its('response.statusCode').should('eq', 200);
+ cy.checkNotification('Data saved');
+ cy.dataCy('ticketSaleMoreActionsDropdown').should('be.disabled');
+ });
+
+ it('should update discount when "Update discount" is clicked', () => {
+ selectFirstRow();
+ cy.dataCy('ticketSaleMoreActionsDropdown').click();
+ cy.waitForElement('[data-cy="updateDiscountItem"]');
+ cy.dataCy('updateDiscountItem').should('exist');
+ cy.dataCy('updateDiscountItem').click();
+ cy.waitForElement('[data-cy="ticketSaleDiscountInput"]');
+ cy.dataCy('ticketSaleDiscountInput').find('input').focus();
+ cy.dataCy('ticketSaleDiscountInput').find('input').type('10');
+ cy.dataCy('saveManaBtn').click();
+ cy.waitForElement('.q-notification__message');
+ cy.checkNotification('Data saved');
+ cy.dataCy('ticketSaleMoreActionsDropdown').should('be.disabled');
+ });
+
+ it('adds claim', () => {
+ selectFirstRow();
+ cy.dataCy('ticketSaleMoreActionsDropdown').click();
+ cy.dataCy('createClaimItem').click();
+ cy.dataCy('VnConfirm_confirm').click();
+ cy.checkNotification('Future ticket date not allowed');
+ });
+
+ it('refunds row with warehouse', () => {
+ selectFirstRow();
+ cy.dataCy('ticketSaleMoreActionsDropdown').click();
+ cy.dataCy('ticketSaleRefundItem').click();
+ cy.dataCy('ticketSaleRefundWithWarehouse').click();
+ cy.checkNotification('The following refund ticket have been created');
+ });
+
+ it('refunds row without warehouse', () => {
+ selectFirstRow();
+ cy.dataCy('ticketSaleMoreActionsDropdown').click();
+ cy.dataCy('ticketSaleRefundItem').click();
+ cy.dataCy('ticketSaleRefundWithoutWarehouse').click();
+ cy.checkNotification('The following refund ticket have been created');
+ });
+
+ it('should redirect to ticket logs', () => {
+ cy.get(firstRow).find('.q-btn:last').click();
+ cy.url().should('match', /\/ticket\/31\/log/);
+ });
+ });
+ describe('Ticket to transfer #32', () => {
+ beforeEach(() => {
+ cy.login('developer');
+ cy.viewport(1920, 1080);
+ cy.visit('/#/ticket/32/sale');
+ });
+ it('transfer sale to a new ticket', () => {
+ cy.get('.q-item > .q-item__label').should('have.text', ' #32');
+ selectFirstRow();
+ cy.dataCy('ticketSaleTransferBtn').click();
+ cy.dataCy('ticketTransferPopup').should('exist');
+ cy.dataCy('ticketTransferNewTicketBtn').click();
+ cy.get('.q-item > .q-item__label').should('not.have.text', ' #32');
+ });
+ });
+});
+function selectFirstRow() {
+ cy.waitForElement(firstRow);
+ cy.get(firstRow).find('.q-checkbox__inner').click();
+}
function handleVnConfirm() {
cy.get('[data-cy="VnConfirm_confirm"]').click();
cy.waitForElement('.q-notification__message');
diff --git a/test/cypress/integration/worker/workerBusiness.spec.js b/test/cypress/integration/worker/workerBusiness.spec.js
index 1650b66c724..46da28cd6af 100644
--- a/test/cypress/integration/worker/workerBusiness.spec.js
+++ b/test/cypress/integration/worker/workerBusiness.spec.js
@@ -1,4 +1,4 @@
-describe('WorkerBusiness', () => {
+describe.skip('WorkerBusiness', () => {
const saveBtn = '.q-mt-lg > .q-btn--standard';
const contributionCode = `Representantes de comercio`;
const contractType = `INDEFINIDO A TIEMPO COMPLETO`;
diff --git a/test/cypress/integration/zone/zoneLocations.spec.js b/test/cypress/integration/zone/zoneLocations.spec.js
index cdc2c778b07..3a52d276c54 100644
--- a/test/cypress/integration/zone/zoneLocations.spec.js
+++ b/test/cypress/integration/zone/zoneLocations.spec.js
@@ -1,4 +1,4 @@
-describe('ZoneLocations', () => {
+describe.skip('ZoneLocations', () => {
const data = {
Warehouse: { val: 'Warehouse One', type: 'select' },
};
diff --git a/test/cypress/run.sh b/test/cypress/run.sh
index 1f506aa57ac..0f8c5990214 100755
--- a/test/cypress/run.sh
+++ b/test/cypress/run.sh
@@ -1,24 +1,39 @@
#!/bin/bash
+salix_dir="${1:-$HOME/Projects/salix}"
+salix_dir=$(eval echo "$salix_dir")
+
+echo "$salix_dir"
+
+current_dir=$(pwd)
+
cleanup() {
- if [[ -z "$ended" ]]; then
- ended=true
- docker-compose -p e2e --project-directory . -f test/cypress/docker-compose.yml down -v
- fi
+ docker-compose -p e2e --project-directory . -f test/cypress/docker-compose.yml down -v
}
trap cleanup SIGINT
-#CLEAN
+# CLEAN
rm -rf test/cypress/screenshots
rm -f test/cypress/results/*
rm -f test/cypress/reports/*
rm -f junit/e2e-*.xml
-#RUN
+# RUN
export CI=true
export TZ=Europe/Madrid
+# IMAGES
+docker build -t registry.verdnatura.es/salix-back:dev -f "$salix_dir/back/Dockerfile" "$salix_dir"
+cd "$salix_dir" && npx myt run -t
+docker exec vn-database sh -c "rm -rf /mysql-template"
+docker exec vn-database sh -c "cp -a /var/lib/mysql /mysql-template"
+docker commit vn-database registry.verdnatura.es/salix-db:dev
+docker rm -f vn-database
+cd "$current_dir"
+docker build -f ./docs/Dockerfile.dev -t lilium-dev .
+# END IMAGES
+
docker-compose -p e2e --project-directory . -f test/cypress/docker-compose.yml up -d
docker run -it --rm \
diff --git a/test/cypress/support/commands.js b/test/cypress/support/commands.js
index d7238f124ac..7d9b5eeb964 100755
--- a/test/cypress/support/commands.js
+++ b/test/cypress/support/commands.js
@@ -62,12 +62,7 @@ Cypress.Commands.overwrite('visit', (originalFn, url, options, waitRequest = tru
originalFn(url, options);
cy.waitUntil(() => cy.document().then((doc) => doc.readyState === 'complete'));
cy.waitUntil(() => cy.get('main').should('exist'));
- if (waitRequest)
- cy.get('body').then(($body) => {
- if ($body.find('[data-cy="loading-spinner"]').length) {
- cy.get('[data-cy="loading-spinner"]').should('not.be.visible');
- }
- });
+ if (waitRequest) cy.waitSpinner();
});
Cypress.Commands.add('waitForElement', (element) => {
@@ -99,6 +94,14 @@ Cypress.Commands.add('getValue', (selector) => {
});
});
+Cypress.Commands.add('waitSpinner', () => {
+ cy.get('body').then(($body) => {
+ if ($body.find('[data-cy="loading-spinner"]').length) {
+ cy.get('[data-cy="loading-spinner"]').should('not.be.visible');
+ }
+ });
+});
+
// Fill Inputs
Cypress.Commands.add('selectOption', (selector, option, timeout = 2500) => {
cy.waitForElement(selector, timeout);
@@ -116,6 +119,7 @@ Cypress.Commands.add('selectOption', (selector, option, timeout = 2500) => {
function selectItem(selector, option, ariaControl, hasWrite = true) {
if (!hasWrite) cy.wait(100);
+ cy.waitSpinner();
getItems(ariaControl).then((items) => {
const matchingItem = items
@@ -135,6 +139,7 @@ function getItems(ariaControl, startTime = Cypress._.now(), timeout = 2500) {
.should('exist')
.find('.q-item')
.should('exist')
+ .should('be.visible')
.then(($items) => {
if (!$items?.length || $items.first().text().trim() === '') {
if (Cypress._.now() - startTime > timeout) {
diff --git a/test/cypress/support/index.js b/test/cypress/support/index.js
index 87e869b6d94..b0f0fb3b125 100644
--- a/test/cypress/support/index.js
+++ b/test/cypress/support/index.js
@@ -40,6 +40,11 @@ style.innerHTML = `
`;
document.head.appendChild(style);
+// FIXME: https://redmine.verdnatura.es/issues/8771
+Cypress.on('uncaught:exception', (err) => {
+ if (err.code === 'ERR_CANCELED') return false;
+});
+
const waitForApiReady = (url, maxRetries = 20, delay = 1000) => {
let retries = 0;