Skip to content

Commit

Permalink
hotfix internal server error when duplicating bsda with no transporte…
Browse files Browse the repository at this point in the history
…rs (#3251)
  • Loading branch information
benoitguigal authored Apr 11, 2024
1 parent 83f3689 commit 64b7125
Show file tree
Hide file tree
Showing 3 changed files with 112 additions and 50 deletions.
4 changes: 2 additions & 2 deletions back/src/bsda/__tests__/factories.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,10 +34,10 @@ export const bsdaFactory = async ({

const data: Prisma.BsdaCreateInput = {
...bsdaObject,
...opt,
transporters: {
create: { ...bsdaObject.transporters!.create!, ...transporterOpt }
}
},
...opt
};

const created = await prisma.bsda.create({
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -395,12 +395,47 @@ describe("Mutation.Bsda.duplicate", () => {
expect(duplicatedBsda.workerWorkSignatureAuthor).toBeNull();
expect(duplicatedBsda.destinationOperationSignatureDate).toBeNull();
expect(duplicatedBsda.destinationOperationSignatureAuthor).toBeNull();
expect(duplicatedBsda.transportersOrgIds).toEqual([
transporterCompanySiret
]);
expect(duplicatedTransporter.transporterTransportSignatureDate).toBeNull();
expect(
duplicatedTransporter.transporterTransportSignatureAuthor
).toBeNull();
});

it("should duplicate a BSDA COLLECTION_2710 with no transporters", async () => {
const emitter = await userWithCompanyFactory("MEMBER");
const bsda = await bsdaFactory({
opt: {
type: "COLLECTION_2710",
workerCompanySiret: null,
workerCompanyName: null,
emitterCompanySiret: emitter.company.siret,
// no transporters
transporters: {}
}
});
const { mutate } = makeClient(emitter.user);

const { data, errors } = await mutate<Pick<Mutation, "duplicateBsda">>(
DUPLICATE_BSDA,
{
variables: {
id: bsda.id
}
}
);

const duplicated = await prisma.bsda.findUniqueOrThrow({
where: { id: data.duplicateBsda.id },
include: { transporters: true }
});

expect(errors).toBeUndefined();
expect(duplicated.transporters).toEqual([]);
});

test("duplicated BSDA should have the updated data when company info changes", async () => {
// Given
const { bsda, transporter, emitter, worker, broker } = await createBsda();
Expand Down
123 changes: 75 additions & 48 deletions back/src/bsda/resolvers/mutations/duplicate.ts
Original file line number Diff line number Diff line change
Expand Up @@ -62,25 +62,20 @@ export default async function duplicate(
enableCompletionTransformers: true
});

// FIXME gérer le cas où il n'y a aucun transporteur
const firstTransporter = parsedBsda.transporters![0];
const firstTransporter = parsedBsda.transporters?.[0];

const {
id: transporterId,
bsdaId: transporterBsdaId,
transporterTransportPlates,
transporterTransportTakenOverAt,
transporterTransportSignatureAuthor,
transporterTransportSignatureDate,
transporterCustomInfo,
// transporter values that should be duplicated
...transporterData
} = firstTransporter;
const { id: bsdaId, intermediaries, ...bsda } = parsedBsda;
id: bsdaId,
intermediaries,
transporters,
transportersOrgIds,
...bsda
} = parsedBsda;

const companiesOrgIds: string[] = [
bsda.emitterCompanySiret,
firstTransporter.transporterCompanySiret,
firstTransporter.transporterCompanyVatNumber,
firstTransporter?.transporterCompanySiret,
firstTransporter?.transporterCompanyVatNumber,
bsda.brokerCompanySiret,
bsda.workerCompanySiret,
bsda.destinationCompanySiret
Expand Down Expand Up @@ -109,16 +104,12 @@ export default async function duplicate(
const broker = companies.find(
company => company.orgId === bsda.brokerCompanySiret
);
const transporterCompany = companies.find(
company =>
company.orgId === firstTransporter.transporterCompanySiret ||
company.orgId === firstTransporter.transporterCompanyVatNumber
);

const worker = companies.find(
company => company.orgId === bsda.workerCompanySiret
);

const data: Prisma.BsdaCreateInput = {
let data: Prisma.BsdaCreateInput = {
...bsda,
id: getReadableId(ReadableIdPrefix.BSDA),
status: BsdaStatus.INITIAL,
Expand Down Expand Up @@ -166,30 +157,68 @@ export default async function duplicate(
workerCertificationCertificationNumber:
worker?.workerCertification?.certificationNumber ??
bsda.workerCertificationCertificationNumber,
transporters: {
create: {
...transporterData,
number: 1,
// Transporter company info
transporterCompanyMail:
transporterCompany?.contactEmail ??
firstTransporter.transporterCompanyMail,
transporterCompanyPhone:
transporterCompany?.contactPhone ??
firstTransporter.transporterCompanyPhone,
transporterCompanyContact:
transporterCompany?.contact ??
firstTransporter.transporterCompanyContact,
// Transporter recepisse
transporterRecepisseNumber:
transporterCompany?.transporterReceipt?.receiptNumber ?? null,
transporterRecepisseValidityLimit:
transporterCompany?.transporterReceipt?.validityLimit ?? null,
transporterRecepisseDepartment:
transporterCompany?.transporterReceipt?.department ?? null
transportersOrgIds: [],
intermediariesOrgIds: [],
grouping: undefined,
forwarding: undefined
};

if (firstTransporter) {
const transporterCompany = firstTransporter
? companies.find(
company =>
company.orgId === firstTransporter.transporterCompanySiret ||
company.orgId === firstTransporter.transporterCompanyVatNumber
)
: null;
const {
// transport values that should not be duplicated
id: transporterId,
bsdaId: transporterBsdaId,
transporterTransportPlates,
transporterTransportTakenOverAt,
transporterTransportSignatureAuthor,
transporterTransportSignatureDate,
transporterCustomInfo,
number,
// transporter values that should be duplicated
...transporterData
} = firstTransporter;
data = {
...data,
transportersOrgIds: [
firstTransporter.transporterCompanySiret,
firstTransporter.transporterCompanyVatNumber
].filter(Boolean),
transporters: {
create: {
...transporterData,
number: 1,
// Transporter company info
transporterCompanyMail:
transporterCompany?.contactEmail ??
firstTransporter.transporterCompanyMail,
transporterCompanyPhone:
transporterCompany?.contactPhone ??
firstTransporter.transporterCompanyPhone,
transporterCompanyContact:
transporterCompany?.contact ??
firstTransporter.transporterCompanyContact,
// Transporter recepisse
transporterRecepisseNumber:
transporterCompany?.transporterReceipt?.receiptNumber ?? null,
transporterRecepisseValidityLimit:
transporterCompany?.transporterReceipt?.validityLimit ?? null,
transporterRecepisseDepartment:
transporterCompany?.transporterReceipt?.department ?? null
}
}
},
...(intermediaries && {
};
}

if (intermediaries) {
data = {
...data,
intermediaries: {
createMany: {
data: intermediaries.map(intermediary => ({
Expand All @@ -204,10 +233,8 @@ export default async function duplicate(
}
},
intermediariesOrgIds
}),
grouping: undefined,
forwarding: undefined
};
};
}

const newBsda = await getBsdaRepository(user).create(data);

Expand Down

0 comments on commit 64b7125

Please sign in to comment.