Skip to content
Draft
2 changes: 1 addition & 1 deletion cypress/e2e/work-order/create/appointment-form.cy.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ describe('Schedule appointment form', () => {
cy.intercept(
{
method: 'GET',
path: '/api/contractors?propertyReference=00012345&tradeCode=PL',
path: '/api/contractors?getAllContractors=true',
},
{ fixture: 'contractors/contractors.json' }
).as('contractors')
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,19 +20,11 @@ describe('Raise repair form', () => {
cy.intercept(
{
method: 'GET',
path: '/api/contractors?propertyReference=00012345&tradeCode=PL',
path: '/api/contractors?getAllContractors=true',
},
{ fixture: 'contractors/contractors.json' }
).as('contractorsRequest')

cy.intercept(
{
method: 'GET',
path: '/api/contractors?propertyReference=00012345&tradeCode=MU',
},
{ fixture: 'contractors/contractors.json' }
).as('multiTradeContractorsRequest')

cy.intercept(
{ method: 'GET', path: '/api/schedule-of-rates/priorities' },
{ fixture: 'scheduleOfRates/priorities.json' }
Expand Down Expand Up @@ -274,12 +266,32 @@ describe('Raise repair form', () => {
cy.get('#repair-request-form').within(() => {
cy.get('#trade').type('Multi Trade - MU', { delay: 0 })

cy.wait('@multiTradeContractorsRequest')
cy.wait('@contractorsRequest')

cy.get('#contractor').type('PURDY CONTRACTS (C2A) - PUR', {
delay: 0,
})

cy.intercept(
{
method: 'GET',
path: '/api/contractors?propertyReference=00012345&tradeCode=MU', // Match the MU trade code
},
{
body: [
{
contractorReference: 'PUR',
contractorName: 'PURDY CONTRACTS (C2A)',
tradeCode: 'MU',
propertyReference: '00012345',
},
],
}
).as('multiTradeContractorRequest')

cy.wait('@contractorRequest')
cy.wait('@multiTradeContractorRequest')

cy.contains('Enter three characters to view results')

cy.get('[data-testid="rateScheduleItems[0][code]"]').type('Bat', {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ describe('Schedule appointment form', () => {
cy.intercept(
{
method: 'GET',
path: '/api/contractors?propertyReference=00012345&tradeCode=PL',
path: '/api/contractors?getAllContractors=true',
},
{ fixture: 'contractors/contractors.json' }
).as('contractors')
Expand Down
2 changes: 1 addition & 1 deletion cypress/e2e/work-order/create/create.cy.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ describe('Raise repair form', () => {
cy.intercept(
{
method: 'GET',
path: '/api/contractors?propertyReference=00012345&tradeCode=PL',
path: '/api/contractors?getAllContractors=true',
},
{ fixture: 'contractors/contractors.json' }
).as('contractorsRequest')
Expand Down
14 changes: 12 additions & 2 deletions cypress/fixtures/contractor/contractor.json
Original file line number Diff line number Diff line change
@@ -1,8 +1,18 @@
{
[
{
"contractorReference": "PUR",
"contractorName": "Purdy Contracts (P) Ltd",
"useExternalScheduleManager": false,
"canAssignOperative": false,
"perTradeAvailability": true,
"multiTradeEnabled": false
}
},
{
"contractorReference": "APS",
"contractorName": "APS Plumbing Ltd",
"useExternalScheduleManager": false,
"canAssignOperative": false,
"perTradeAvailability": true,
"multiTradeEnabled": false
}
]
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,10 @@ import BudgetCodeItemView from './BudgetCodeItemView'
import UserContext from '@/components/UserContext'
import { canAssignBudgetCode } from '@/utils/userPermissions'
import { MULTITRADE_TRADE_CODE } from '@/utils/constants'
import { getContractor } from '@/root/src/utils/requests/contractor'
import {
getContractor,
fetchContractorsRelatedToPropertyAndTradeCode,
} from '@/root/src/utils/requests/contractor'
import { APIResponseError } from '@/root/src/types/requests/types'
import Contractor from '@/root/src/models/contractor'
import { formatRequestErrorMessage } from '@/root/src/utils/errorHandling/formatErrorMessage'
Expand Down Expand Up @@ -138,7 +141,7 @@ const TradeContractorRateScheduleItemView = (props: Props) => {

resetSORs()

getContractorsData(propertyReference, newTradeCode)
getContractorsData()
} else {
setContractors([])
setTradeCode('')
Expand Down Expand Up @@ -199,8 +202,46 @@ const TradeContractorRateScheduleItemView = (props: Props) => {

const contractorResponse = await getContractor(contractorRef)

const contractorsRelatedToPropertyResponse = await fetchContractorsRelatedToPropertyAndTradeCode(
{ propertyReference, tradeCode }
)

const contractorHasContractsLinkedToTrade = contractorsRelatedToPropertyResponse?.response?.find(
(contractor: Contractor) => {
return (
contractor.contractorReference ===
contractorResponse.response.contractorReference
)
}
)
setLoadingContractor(false)

if (!contractorsRelatedToPropertyResponse.success) {
console.error(
'An error has occured:',
contractorsRelatedToPropertyResponse.error
)

if (
contractorsRelatedToPropertyResponse.error instanceof APIResponseError
) {
setGetContractorError(
contractorsRelatedToPropertyResponse.error.message
)
} else {
setGetContractorError(
formatRequestErrorMessage(contractorsRelatedToPropertyResponse.error)
)
}
return
}

if (!contractorHasContractsLinkedToTrade) {
setGetContractorError(
`This property doesn't have any ${contractorName} contracts linked to the ${tradeCode} trade.`
)
}

if (!contractorResponse.success) {
console.error('An error has occured:', contractorResponse.error)

Expand Down Expand Up @@ -228,24 +269,20 @@ const TradeContractorRateScheduleItemView = (props: Props) => {
}
}

const getContractorsData = async (
propertyReference: string,
tradeCode: string
) => {
const getContractorsData = async () => {
setLoadingContractors(true)
setGetContractorsError(null)

try {
const contractors = await frontEndApiRequest({
const allContractors = await frontEndApiRequest({
method: 'get',
path: '/api/contractors',
params: {
propertyReference: propertyReference,
tradeCode: tradeCode,
getAllContractors: true,
},
})

setContractors(contractors)
setContractors(allContractors)
} catch (e) {
setContractors([])
setContractorReference('')
Expand Down
41 changes: 41 additions & 0 deletions src/utils/requests/contractor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -51,3 +51,44 @@ export const fetchContractors = async ({

return contractors
}

interface FetchContractorsRelatedToPropertyAndTradeCodeArguments {
propertyReference: string
tradeCode: string
}

export const fetchContractorsRelatedToPropertyAndTradeCode = async ({
propertyReference,
tradeCode,
}: FetchContractorsRelatedToPropertyAndTradeCodeArguments): Promise<
ApiResponseType<Contractor[] | null>
> => {
const params = {}
if (propertyReference !== null && propertyReference !== '')
params['propertyReference'] = propertyReference
if (tradeCode !== null && tradeCode !== '') params['tradeCode'] = tradeCode
try {
const contractorsRelatedToProperty = await frontEndApiRequest({
method: 'get',
path: '/api/contractors',
params: params,
})
return {
success: true,
response: contractorsRelatedToProperty,
error: null,
}
} catch (e) {
console.error('An error has occurred:', e.response)

return {
success: false,
response: null,
error: new APIResponseError(
e.response?.status === 404
? `No contractors related to ${propertyReference} property.`
: formatRequestErrorMessage(e)
),
}
}
}
Loading