Skip to content

Commit 1a1e213

Browse files
authored
fix: 1190 fusager account creation DROM and Corse (#1029)
## Ticket(s) lié(s) 1190 ## Description Correction de la création de compte pour les utilisateurs OVA dont le SIRET dépend d'une DROM ou de la région Corse
1 parent 1b7435b commit 1a1e213

File tree

6 files changed

+113
-30
lines changed

6 files changed

+113
-30
lines changed

packages/backend/src/controllers/authentication/email/__tests__/register.test.js

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -102,11 +102,11 @@ describe("register controller", () => {
102102
User.read.mockResolvedValue([]);
103103
insee.getEtablissement.mockResolvedValue({
104104
adresseEtablissement: {
105-
codePostalEtablissement: "75001",
105+
codeCommuneEtablissement: "75101",
106106
},
107107
});
108108
getFichesTerritoireForRegionByInseeCode.mockResolvedValue({
109-
terCode: "TER123",
109+
inseeCode: "75101",
110110
});
111111
User.registerByEmail.mockRejectedValue(new Error("DB failure"));
112112

@@ -119,11 +119,11 @@ describe("register controller", () => {
119119
User.read.mockResolvedValue([]);
120120
insee.getEtablissement.mockResolvedValue({
121121
adresseEtablissement: {
122-
codePostalEtablissement: "75001",
122+
codeCommuneEtablissement: "75101",
123123
},
124124
});
125125
getFichesTerritoireForRegionByInseeCode.mockResolvedValue({
126-
terCode: "TER123",
126+
inseeCode: "75101",
127127
});
128128
User.registerByEmail.mockResolvedValue({
129129
user: { id: 1 },
@@ -142,11 +142,11 @@ describe("register controller", () => {
142142
User.read.mockResolvedValue([]);
143143
insee.getEtablissement.mockResolvedValue({
144144
adresseEtablissement: {
145-
codePostalEtablissement: "75001",
145+
codeCommuneEtablissement: "75101",
146146
},
147147
});
148148
getFichesTerritoireForRegionByInseeCode.mockResolvedValue({
149-
terCode: "TER123",
149+
inseeCode: "75101",
150150
});
151151
User.registerByEmail.mockResolvedValue({
152152
user: { id: 1 },

packages/backend/src/controllers/authentication/email/register.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,9 +56,10 @@ module.exports = async function register(req, res, next) {
5656
let territoire = "";
5757
try {
5858
const etablissement = await insee.getEtablissement(siret);
59-
const codePostal =
60-
etablissement.adresseEtablissement.codePostalEtablissement;
61-
territoire = await getFichesTerritoireForRegionByInseeCode(codePostal);
59+
const inseeCode = String(
60+
etablissement.adresseEtablissement.codeCommuneEtablissement,
61+
);
62+
territoire = await getFichesTerritoireForRegionByInseeCode({ inseeCode });
6263
} catch (error) {
6364
log.w("DONE with error");
6465
return next(error);

packages/backend/src/services/Territoire.js

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
const AppError = require("../utils/error");
22
const logger = require("../utils/logger");
33
const pool = require("../utils/pgpool").getPool();
4+
const getCodeTerritoireByInseeCode = require("../utils/geo");
45

56
const log = logger(module.filename);
67
const {
@@ -56,22 +57,19 @@ const query = {
5657
FROM geo.territoires ter
5758
INNER JOIN back.fiche_territoire fte ON fte.ter_code = ter.code
5859
WHERE ter.code <> 'FRA'`,
59-
selectTerritoiresByInseeCode: (inseeCode) => [
60-
`
61-
SELECT
62-
ft.id,
63-
ft.ter_code AS "terCode",
64-
ft.service_mail AS "serviceMail",
65-
ft.service_telephone AS "serviceTelephone",
66-
ft.corresp_vao_nom AS "correspVaoNom",
67-
ft.corresp_vao_prenom AS "correspVaoPrenom",
68-
ft.edited_at AS "editedAt"
69-
FROM back.fiche_territoire ft
70-
JOIN geo.territoires t ON ft.ter_code = t.parent_code
71-
WHERE t.code = $1;
72-
`,
73-
[inseeCode],
74-
],
60+
selectTerritoiresByInseeCode: `
61+
SELECT
62+
ft.id,
63+
ft.ter_code AS "terCode",
64+
ft.service_mail AS "serviceMail",
65+
ft.service_telephone AS "serviceTelephone",
66+
ft.corresp_vao_nom AS "correspVaoNom",
67+
ft.corresp_vao_prenom AS "correspVaoPrenom",
68+
ft.edited_at AS "editedAt"
69+
FROM back.fiche_territoire ft
70+
JOIN geo.territoires t ON ft.ter_code = t.parent_code
71+
WHERE t.code = $1;
72+
`,
7573

7674
update: `
7775
UPDATE back.fiche_territoire
@@ -170,10 +168,12 @@ module.exports.update = async (id, { nom, prenom, email, telephone }) => {
170168
return { territoire: response.rows[0] };
171169
};
172170

173-
module.exports.getFichesTerritoireForRegionByInseeCode = async (InseeCode) => {
174-
const code = InseeCode.substring(0, 2);
175-
const { rows } = await pool.query(
176-
...query.selectTerritoiresByInseeCode(code),
177-
);
171+
module.exports.getFichesTerritoireForRegionByInseeCode = async ({
172+
inseeCode,
173+
}) => {
174+
const terCode = getCodeTerritoireByInseeCode({ inseeCode });
175+
const { rows } = await pool.query(query.selectTerritoiresByInseeCode, [
176+
terCode,
177+
]);
178178
return rows[0];
179179
};
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
jest.mock("../../utils/error");
2+
const pgpool = require("../../utils/pgpool");
3+
4+
jest.mock("../../utils/pgpool", () => {
5+
const mockQuery = jest.fn();
6+
return {
7+
getPool: jest.fn(() => ({ query: mockQuery })),
8+
__mockQuery: mockQuery,
9+
};
10+
});
11+
12+
describe("Service Territoire", () => {
13+
describe("getFichesTerritoireForRegionByInseeCode", () => {
14+
it("should return a valid id for any valid inseeCode", async () => {
15+
const pool = pgpool.getPool();
16+
17+
pool.query.mockImplementation((sql, params) => {
18+
expect(sql).toMatch(/SELECT/);
19+
expect(params).toEqual(["972"]);
20+
return Promise.resolve({ rows: [{ id: 12, terCode: "MAR" }] });
21+
});
22+
23+
const ficheTerritoire = require("../Territoire");
24+
const result =
25+
await ficheTerritoire.getFichesTerritoireForRegionByInseeCode({
26+
inseeCode: "97200",
27+
});
28+
29+
expect(result).toEqual({ id: 12, terCode: "MAR" });
30+
expect(pool.query).toHaveBeenCalledTimes(1);
31+
});
32+
});
33+
});

packages/backend/src/utils/geo.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
module.exports = function getCodeTerritoireByInseeCode({ inseeCode } = {}) {
2+
if (!inseeCode) return "";
3+
return inseeCode.startsWith("97")
4+
? inseeCode.slice(0, 3)
5+
: inseeCode.slice(0, 2);
6+
};
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
/*
2+
Test Geo
3+
*/
4+
const getCodeTerritoireByInseeCode = require("./geo");
5+
6+
describe("getCodeTerritoireByInseeCode", () => {
7+
it("should return first 2 digits for metropolitan France codes", () => {
8+
expect(getCodeTerritoireByInseeCode({ inseeCode: "75056" })).toBe("75");
9+
expect(getCodeTerritoireByInseeCode({ inseeCode: "13001" })).toBe("13");
10+
expect(getCodeTerritoireByInseeCode({ inseeCode: "06088" })).toBe("06");
11+
});
12+
13+
it("should return first 3 digits for overseas codes starting with 97", () => {
14+
expect(getCodeTerritoireByInseeCode({ inseeCode: "97123" })).toBe("971");
15+
expect(getCodeTerritoireByInseeCode({ inseeCode: "97245" })).toBe("972");
16+
expect(getCodeTerritoireByInseeCode({ inseeCode: "97356" })).toBe("973");
17+
expect(getCodeTerritoireByInseeCode({ inseeCode: "97489" })).toBe("974");
18+
expect(getCodeTerritoireByInseeCode({ inseeCode: "97612" })).toBe("976");
19+
});
20+
21+
it("should handle short codes correctly", () => {
22+
expect(getCodeTerritoireByInseeCode({ inseeCode: "97" })).toBe("97");
23+
expect(getCodeTerritoireByInseeCode({ inseeCode: "971" })).toBe("971");
24+
expect(getCodeTerritoireByInseeCode({ inseeCode: "75" })).toBe("75");
25+
});
26+
27+
it("should return first 2 characters for Corsica codes (2A/2B)", () => {
28+
expect(getCodeTerritoireByInseeCode({ inseeCode: "2A004" })).toBe("2A");
29+
expect(getCodeTerritoireByInseeCode({ inseeCode: "2A200" })).toBe("2A");
30+
expect(getCodeTerritoireByInseeCode({ inseeCode: "2B033" })).toBe("2B");
31+
expect(getCodeTerritoireByInseeCode({ inseeCode: "2B300" })).toBe("2B");
32+
});
33+
34+
it("should handle empty string", () => {
35+
expect(getCodeTerritoireByInseeCode({ inseeCode: "" })).toBe("");
36+
});
37+
38+
it("should handle non-string input gracefully", () => {
39+
expect(getCodeTerritoireByInseeCode({ inseeCode: null })).toBe("");
40+
expect(getCodeTerritoireByInseeCode({ inseeCode: undefined })).toBe("");
41+
expect(getCodeTerritoireByInseeCode()).toBe(""); // test du cas sans argument
42+
});
43+
});

0 commit comments

Comments
 (0)