diff --git a/src/i18n/locale/en.yml b/src/i18n/locale/en.yml index 24fda7aff..10186d92a 100644 --- a/src/i18n/locale/en.yml +++ b/src/i18n/locale/en.yml @@ -313,6 +313,7 @@ globals: changePass: Change password deleteConfirmTitle: Delete selected elements changeState: Change state + raid: 'Raid {daysInForward} days' errors: statusUnauthorized: Access denied statusInternalServerError: An internal server error has ocurred @@ -370,7 +371,6 @@ entry: companyFk: Company travelFk: Travel isExcludedFromAvailable: Inventory - isRaid: Raid invoiceAmount: Import summary: commission: Commission @@ -381,7 +381,6 @@ entry: ordered: Ordered confirmed: Confirmed booked: Booked - raid: Raid excludedFromAvailable: Inventory travelReference: Reference travelAgency: Agency @@ -414,7 +413,6 @@ entry: ordered: Ordered confirmed: Confirmed booked: Booked - raid: Raid excludedFromAvailable: Inventory agency: Agency warehouseOut: Warehouse Out @@ -477,7 +475,6 @@ entry: packingOut: Package out landing: Landing isExcludedFromAvailable: Es inventory - isRaid: Raid ticket: pageTitles: tickets: Tickets @@ -1041,6 +1038,7 @@ travel: warehouseIn: Warehouse In delivered: Delivered received: Received + daysInForward: Days in forward thermographs: code: Code temperature: Temperature diff --git a/src/i18n/locale/es.yml b/src/i18n/locale/es.yml index 1571f7b92..66b5efd52 100644 --- a/src/i18n/locale/es.yml +++ b/src/i18n/locale/es.yml @@ -317,6 +317,7 @@ globals: changePass: Cambiar contraseña deleteConfirmTitle: Eliminar los elementos seleccionados changeState: Cambiar estado + raid: 'Redada {daysInForward} días' errors: statusUnauthorized: Acceso denegado statusInternalServerError: Ha ocurrido un error interno del servidor @@ -372,7 +373,6 @@ entry: companyFk: Empresa travelFk: Envio isExcludedFromAvailable: Inventario - isRaid: Redada invoiceAmount: Importe summary: commission: Comisión @@ -383,7 +383,6 @@ entry: ordered: Pedida confirmed: Confirmada booked: Contabilizada - raid: Redada excludedFromAvailable: Inventario travelReference: Referencia travelAgency: Agencia @@ -416,7 +415,6 @@ entry: ordered: Pedida confirmed: Confirmado booked: Asentado - raid: Redada excludedFromAvailable: Inventario agency: Agencia warehouseOut: Alm. salida @@ -479,7 +477,6 @@ entry: packingOut: Embalaje envíos landing: Llegada isExcludedFromAvailable: Es inventario - isRaid: Redada ticket: pageTitles: tickets: Tickets @@ -1039,6 +1036,7 @@ travel: warehouseIn: Alm. entrada delivered: Enviada received: Recibida + daysInForward: Días redada thermographs: code: Código temperature: Temperatura diff --git a/src/pages/Entry/Card/EntryBasicData.vue b/src/pages/Entry/Card/EntryBasicData.vue index b81b1db22..3288616fb 100644 --- a/src/pages/Entry/Card/EntryBasicData.vue +++ b/src/pages/Entry/Card/EntryBasicData.vue @@ -168,7 +168,6 @@ const onFilterTravelSelected = (formData, id) => { v-model="data.isExcludedFromAvailable" :label="t('entry.basicData.excludedFromAvailable')" /> - (data.value = useCardDescription(entity.supplier?.nickname, entity.id)); -const currentEntry = computed(() => state.get('entry')); - const getEntryRedirectionFilter = (entry) => { let entryTravel = entry && entry.travel; @@ -133,10 +136,10 @@ watch; :value="entity.travel?.warehouseOut?.name" /> - + {{ t('Inventory entry') }} - {{ t('Virtual entry') }} + + {{ + t('globals.raid', { + daysInForward: entity?.travel?.daysInForward, + }) + }} diff --git a/src/pages/Entry/Card/EntrySummary.vue b/src/pages/Entry/Card/EntrySummary.vue index c2f1e6b57..62e13551a 100644 --- a/src/pages/Entry/Card/EntrySummary.vue +++ b/src/pages/Entry/Card/EntrySummary.vue @@ -259,11 +259,6 @@ const fetchEntryBuys = async () => { v-model="entry.isBooked" :disable="true" /> - [ + { + name: 'status', + columnFilter: false, + }, { align: 'left', label: t('entry.list.tableVisibleColumns.id'), @@ -154,27 +158,8 @@ const columns = computed(() => [ cardVisible: true, }, { - align: 'left', label: t('entry.list.tableVisibleColumns.isExcludedFromAvailable'), name: 'isExcludedFromAvailable', - chip: { - color: null, - condition: (value) => value, - icon: 'vn:inventory', - }, - columnFilter: { - inWhere: true, - }, - }, - { - align: 'left', - label: t('entry.list.tableVisibleColumns.isRaid'), - name: 'isRaid', - chip: { - color: null, - condition: (value) => value, - icon: 'vn:net', - }, columnFilter: { inWhere: true, }, @@ -225,6 +210,26 @@ onMounted(async () => { auto-load :right-search="false" > + + + + {{ + t('entry.list.tableVisibleColumns.isExcludedFromAvailable') + }} + + + + {{ + t('globals.raid', { daysInForward: row.daysInForward }) + }} + + + {{ row.supplierName }} diff --git a/src/pages/Entry/locale/en.yml b/src/pages/Entry/locale/en.yml index f9dbd0589..cd5113d84 100644 --- a/src/pages/Entry/locale/en.yml +++ b/src/pages/Entry/locale/en.yml @@ -1,7 +1,6 @@ entryList: list: inventoryEntry: Inventory entry - virtualEntry: Virtual entry entryFilter: filter: search: General search diff --git a/src/pages/Entry/locale/es.yml b/src/pages/Entry/locale/es.yml index feeea1fc9..3007c5d44 100644 --- a/src/pages/Entry/locale/es.yml +++ b/src/pages/Entry/locale/es.yml @@ -4,7 +4,6 @@ You can search by entry reference: Puedes buscar por referencia de la entrada entryList: list: inventoryEntry: Es inventario - virtualEntry: Es una redada entryFilter: filter: search: Búsqueda general diff --git a/src/pages/Travel/Card/TravelBasicData.vue b/src/pages/Travel/Card/TravelBasicData.vue index a3620a6ba..d6245e655 100644 --- a/src/pages/Travel/Card/TravelBasicData.vue +++ b/src/pages/Travel/Card/TravelBasicData.vue @@ -72,6 +72,16 @@ const agenciesOptions = ref([]); + + + + {{ t('raidDays') }} + + + + + +es: + raidDays: Al rellenarlo, generamos una redada. Indica los días que un travel se moverá automáticamente en el tiempo +en: + raidDays: When filling, a raid is generated. Enter the number of days the travel will automatically forward in time + diff --git a/src/pages/Travel/Card/TravelDescriptor.vue b/src/pages/Travel/Card/TravelDescriptor.vue index bda29903b..6025ad045 100644 --- a/src/pages/Travel/Card/TravelDescriptor.vue +++ b/src/pages/Travel/Card/TravelDescriptor.vue @@ -32,6 +32,7 @@ const filter = { 'warehouseOutFk', 'cargoSupplierFk', 'agencyModeFk', + 'daysInForward', ], include: [ { @@ -77,6 +78,22 @@ const setData = (entity) => (data.value = useCardDescription(entity.ref, entity. + + + + + {{ + t('globals.raid', { daysInForward: entity.daysInForward }) + }} + + + `#/travel/${entityId.value}/${param}`; + diff --git a/src/pages/Travel/TravelList.vue b/src/pages/Travel/TravelList.vue index a8c0e69cb..334640bff 100644 --- a/src/pages/Travel/TravelList.vue +++ b/src/pages/Travel/TravelList.vue @@ -45,6 +45,10 @@ const redirectCreateEntryView = (travelData) => { }; const columns = computed(() => [ + { + name: 'status', + columnFilter: false, + }, { align: 'left', name: 'id', @@ -221,6 +225,17 @@ const columns = computed(() => [ :is-editable="false" :use-model="true" > + + + + + {{ + t('globals.raid', { daysInForward: row.daysInForward }) + }} + + + { + let wrapper; + let vm; + + beforeAll(() => { + vi.spyOn(axios, 'get').mockImplementation(() => ({ data: [] })); + wrapper = createWrapper(TicketAdvance); + vm = wrapper.vm; + vi.spyOn(vm.vnTableRef, 'reload').mockImplementation(() => vi.fn()); + vm.vnTableRef.value = { params: {} }; + }); + beforeEach(() => { + Notify.create = vi.fn(); + }); + afterEach(() => { + vi.clearAllMocks(); + }); + + describe('requestComponentUpdate()', () => { + const mockTicket = { + futureId: 1, + futureClientFk: 1, + nickname: 'test', + futureAddressFk: 1, + futureAgencyModeFk: 1, + futureWarehouseFk: 1, + futureCompanyFk: 1, + landed: '2023-01-02', + zoneFk: 1, + }; + const mockParams = { + clientFk: 1, + nickname: 'test', + agencyModeFk: 1, + addressFk: 1, + zoneFk: 1, + warehouseFk: 1, + companyFk: 1, + landed: '2023-01-02', + shipped: '2023-01-01', + isDeleted: false, + isWithoutNegatives: false, + newTicket: undefined, + keepPrice: true, + }; + const queryResult = 'tickets/1/componentUpdate'; + + it('should return query and params when ticket has no landed', async () => { + vm.vnTableRef.params.dateToAdvance = '2023-01-01'; + await nextTick(); + + const mockLanded = { landed: '2023-01-02', zoneFk: 1 }; + vi.spyOn(vm, 'getLanded').mockResolvedValue(mockLanded); + + const { query, params } = await vm.requestComponentUpdate(mockTicket, false); + + expect(query).toBe(queryResult); + expect(params).toEqual(mockParams); + }); + + it('should return query and params when ticket has landed', async () => { + const { query, params } = await vm.requestComponentUpdate(mockTicket, false); + + expect(query).toBe(queryResult); + expect(params).toEqual(mockParams); + }); + }); + + describe('moveTicketsAdvance()', () => { + it('should move tickets and notify success', async () => { + const tickets = [ + { + id: 1, + futureId: 2, + futureShipped: '2023-01-01', + shipped: '2023-01-02', + workerFk: 1, + }, + { + id: 2, + futureId: 3, + futureShipped: '2023-01-01', + shipped: '2023-01-02', + workerFk: 1, + }, + ]; + vm.selectedTickets = tickets; + vi.spyOn(axios, 'post').mockResolvedValue({}); + await vm.moveTicketsAdvance(); + + expect(axios.post).toHaveBeenCalledOnce('Tickets/merge', { + tickets: [ + { + originId: 2, + destinationId: 1, + originShipped: '2023-01-01', + destinationShipped: '2023-01-02', + workerFk: 1, + }, + { + originId: 3, + destinationId: 2, + originShipped: '2023-01-01', + destinationShipped: '2023-01-02', + workerFk: 1, + }, + ], + }); + expect(vm.vnTableRef.reload).toHaveBeenCalled(); + expect(Notify.create).toHaveBeenCalled(); + expect(vm.selectedTickets).toEqual([]); + }); + }); +}); diff --git a/test/vitest/helper.js b/test/vitest/helper.js index e201535ec..4bfae5dc8 100644 --- a/test/vitest/helper.js +++ b/test/vitest/helper.js @@ -70,8 +70,10 @@ class FormDataMock { vi.fn(); } } + global.FormData = FormDataMock; global.URL = class URL {}; +global.Date.vnNew = () => new Date(Date.UTC(2001, 0, 1, 11)); export function createWrapper(component, options) { const defaultOptions = {