diff --git a/src/pages/Customer/composables/__tests__/getAddresses.spec.js b/src/pages/Customer/composables/__tests__/getAddresses.spec.js new file mode 100644 index 000000000..9e04a83cc --- /dev/null +++ b/src/pages/Customer/composables/__tests__/getAddresses.spec.js @@ -0,0 +1,33 @@ +import { describe, it, expect, vi, afterEach } from 'vitest'; +import axios from 'axios'; +import { getAddresses } from 'src/pages/Customer/composables/getAddresses'; + +vi.mock('axios'); + +describe('getAddresses', () => { + afterEach(() => { + vi.clearAllMocks(); + }); + + it('should fetch addresses with correct parameters for a valid clientId', async () => { + const clientId = '12345'; + + await getAddresses(clientId); + + expect(axios.get).toHaveBeenCalledWith(`Clients/${clientId}/addresses`, { + params: { + filter: JSON.stringify({ + fields: ['nickname', 'street', 'city', 'id'], + where: { isActive: true }, + order: 'nickname ASC', + }), + }, + }); + }); + + it('should return undefined when clientId is not provided', async () => { + await getAddresses(undefined); + + expect(axios.get).not.toHaveBeenCalled(); + }); +}); \ No newline at end of file diff --git a/src/pages/Customer/composables/__tests__/getClient.spec.js b/src/pages/Customer/composables/__tests__/getClient.spec.js new file mode 100644 index 000000000..a83d3d89f --- /dev/null +++ b/src/pages/Customer/composables/__tests__/getClient.spec.js @@ -0,0 +1,41 @@ +import { describe, it, expect, vi, afterEach } from 'vitest'; +import axios from 'axios'; +import { getClient } from 'src/pages/Customer/composables/getClient'; + +vi.mock('axios'); + +describe('getClient', () => { + afterEach(() => { + vi.clearAllMocks(); + }); + + const generateParams = (clientId) => ({ + params: { + filter: JSON.stringify({ + include: { + relation: 'defaultAddress', + scope: { + fields: ['id', 'agencyModeFk'], + }, + }, + where: { id: clientId }, + }), + }, + }); + + it('should fetch client data with correct parameters for a valid clientId', async () => { + const clientId = '12345'; + + await getClient(clientId); + + expect(axios.get).toHaveBeenCalledWith('Clients', generateParams(clientId)); + }); + + it('should return undefined when clientId is not provided', async () => { + const clientId = undefined; + + await getClient(clientId); + + expect(axios.get).toHaveBeenCalledWith('Clients', generateParams(clientId)); + }); +}); diff --git a/src/pages/Customer/composables/getAddresses.js b/src/pages/Customer/composables/getAddresses.js new file mode 100644 index 000000000..eecc0150b --- /dev/null +++ b/src/pages/Customer/composables/getAddresses.js @@ -0,0 +1,14 @@ +import axios from 'axios'; + +export async function getAddresses(clientId) { + if (!clientId) return; + const filter = { + fields: ['nickname', 'street', 'city', 'id'], + where: { isActive: true }, + order: 'nickname ASC', + }; + const params = { filter: JSON.stringify(filter) }; + return await axios.get(`Clients/${clientId}/addresses`, { + params, + }); +}; \ No newline at end of file diff --git a/src/pages/Customer/composables/getClient.js b/src/pages/Customer/composables/getClient.js new file mode 100644 index 000000000..ecacc67c0 --- /dev/null +++ b/src/pages/Customer/composables/getClient.js @@ -0,0 +1,15 @@ +import axios from 'axios'; + +export async function getClient(clientId) { + const filter = { + include: { + relation: 'defaultAddress', + scope: { + fields: ['id', 'agencyModeFk'], + }, + }, + where: { id: clientId }, + }; + const params = { filter: JSON.stringify(filter) }; + return await axios.get('Clients', { params }); +}; \ No newline at end of file diff --git a/src/pages/Route/Agency/composables/__tests__/getAgencies.spec.js b/src/pages/Route/Agency/composables/__tests__/getAgencies.spec.js new file mode 100644 index 000000000..9897173f1 --- /dev/null +++ b/src/pages/Route/Agency/composables/__tests__/getAgencies.spec.js @@ -0,0 +1,55 @@ +import { describe, it, expect, vi, afterEach } from 'vitest'; +import axios from 'axios'; +import { getAgencies } from 'src/pages/Route/Agency/composables/getAgencies'; + +vi.mock('axios'); + +describe('getAgencies', () => { + afterEach(() => { + vi.clearAllMocks(); + }); + + const generateParams = (formData) => ({ + params: { + warehouseFk: formData.warehouseId, + addressFk: formData.addressId, + landed: formData.landed, + }, + }); + + it('should fetch agencies data with correct parameters for valid formData', async () => { + const formData = { + warehouseId: '123', + addressId: '456', + landed: 'true', + }; + + await getAgencies(formData); + + expect(axios.get).toHaveBeenCalledWith('Agencies/getAgenciesWithWarehouse', generateParams(formData)); + }); + + it('should not call API when formData is missing required landed field', async () => { + const formData = { warehouseId: '123', addressId: '456' }; + + await getAgencies(formData); + + expect(axios.get).not.toHaveBeenCalled(); + }); + + it('should not call API when formData is missing required addressId field', async () => { + const formData = { warehouseId: '123', landed: 'true' }; + + await getAgencies(formData); + + expect(axios.get).not.toHaveBeenCalled(); + }); + + it('should not call API when formData is missing required warehouseId field', async () => { + const formData = { addressId: '456', landed: 'true' }; + + await getAgencies(formData); + + expect(axios.get).not.toHaveBeenCalled(); + }); +}); diff --git a/src/pages/Route/Agency/composables/getAgencies.js b/src/pages/Route/Agency/composables/getAgencies.js new file mode 100644 index 000000000..7299d7e23 --- /dev/null +++ b/src/pages/Route/Agency/composables/getAgencies.js @@ -0,0 +1,12 @@ +import axios from 'axios'; + +export async function getAgencies(formData) { + if (!formData.warehouseId || !formData.addressId || !formData.landed) return; + let params = { + warehouseFk: formData.warehouseId, + addressFk: formData.addressId, + landed: formData.landed, + }; + + return await axios.get('Agencies/getAgenciesWithWarehouse', { params }); +} diff --git a/src/pages/Ticket/Card/TicketDescriptorMenu.vue b/src/pages/Ticket/Card/TicketDescriptorMenu.vue index 8f60cf509..89f7015d7 100644 --- a/src/pages/Ticket/Card/TicketDescriptorMenu.vue +++ b/src/pages/Ticket/Card/TicketDescriptorMenu.vue @@ -16,6 +16,8 @@ import VnInputTime from 'src/components/common/VnInputTime.vue'; import { useAcl } from 'src/composables/useAcl'; import VnInputNumber from 'src/components/common/VnInputNumber.vue'; import { useArrayData } from 'src/composables/useArrayData'; +import { getAddresses } from 'src/pages/Customer/composables/getAddresses'; +import { getClient } from 'src/pages/Customer/composables/getClient'; const props = defineProps({ ticket: { @@ -40,8 +42,8 @@ const { openReport, sendEmail } = usePrintService(); const ticketSummary = useArrayData('TicketSummary'); const { ticket } = toRefs(props); const ticketId = computed(() => props.ticket.id ?? currentRoute.value.params.id); -const client = ref(); -const address = ref(); +const client = ref(null); +const address = ref(null); const addressesOptions = ref([]); const selectedClient = ref(); const showTransferDialog = ref(false); @@ -57,37 +59,23 @@ const quasar = useQuasar(); const canRestoreTicket = ref(false); const onClientSelected = async(clientId) =>{ - await fetchClient(clientId); - await fetchAddresses(clientId); + client.value = clientId; + await fetchClient(); + await fetchAddresses(); }; -const fetchClient = async (clientId) => { - const filter = { - include: { - relation: 'defaultAddress', - scope: { - fields: ['id', 'nickname'], - }, - }, - where: { id: clientId }, - }; - const params = { filter: JSON.stringify(filter) }; - const { data } = await axios.get('Clients', { params }); - const [client] = data; - selectedClient.value = client; +const onAddressSelected = (addressId) => { + address.value = addressId; +} + +const fetchClient = async () => { + const { data } = await getClient(client.value) + const [retrievedClient] = data; + selectedClient.value = retrievedClient; }; -const fetchAddresses = async (clientId) => { - if (!clientId) return; - - const filter = { - fields: ['nickname', 'street', 'city', 'id', 'isActive'], - order: ['isDefaultAddress DESC', 'isActive DESC', 'nickname ASC'], - }; - const params = { filter: JSON.stringify(filter) }; - const { data } = await axios.get(`Clients/${clientId}/addresses`, { - params, - }); +const fetchAddresses = async () => { + const { data } = await getAddresses(client.value); addressesOptions.value = data; const { defaultAddress } = selectedClient.value; @@ -302,12 +290,12 @@ async function makeInvoice() { window.location.reload(); } -async function transferClient(client, address) { +async function transferClient() { const params = { - clientFk: client, - addressFk: address, + clientFk: client.value, + addressFk: address.value, }; - + await axios.patch( `Tickets/${ticketId.value}/transferClient`, params ); window.location.reload(); } @@ -485,7 +473,7 @@ async function ticketToRestore() {