Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(backend): fix headers of exports #3621

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import { readFile, writeFile } from "fs-extra";
import { join } from "path";

import { format } from "prettier";
import {
NewStructureEmailModel,
newStructureEmailRenderer,
} from "./newStructureEmailRenderer.service";
import { domifaConfig } from "../../../../../config";

describe("newStructureEmailRenderer", () => {
it("newStructureEmailRenderer render ", async () => {
const model: NewStructureEmailModel = {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ import { UsagersService } from "../services/usagers.service";

import { format } from "date-fns";
import {
applyDateFormat,
renderStructureUsagersHeaders,
renderStructureUsagersRows,
StructureUsagerExport,
} from "../services/xlsx-structure-usagers-renderer";
Expand Down Expand Up @@ -45,35 +47,78 @@ export class ExportStructureUsagersController {

const workbook = XLSX.utils.book_new();

const wsUsagers = XLSX.utils.json_to_sheet([], { skipHeader: true });
const wsEntretiens = XLSX.utils.json_to_sheet([], { skipHeader: true });
const { firstSheetHeaders, secondSheetHeaders } =
renderStructureUsagersHeaders(user.structure);

const usagersHeadersAoA = [
[firstSheetHeaders[0].USAGER_CUSTOM_REF],
Object.values(firstSheetHeaders[1]),
];

const entretiensHeadersAoA = [
[secondSheetHeaders[0].USAGER_CUSTOM_REF],
Object.values(secondSheetHeaders[1]),
];

// Créer les worksheets avec aoa_to_sheet
const wsUsagers = XLSX.utils.aoa_to_sheet(usagersHeadersAoA, {
cellDates: true,
dateNF: "DD/MM/YYYY",
});

const wsEntretiens = XLSX.utils.aoa_to_sheet(entretiensHeadersAoA, {
cellDates: true,
dateNF: "DD/MM/YYYY",
});

XLSX.utils.book_append_sheet(workbook, wsUsagers, "Liste des domiciliés");
XLSX.utils.book_append_sheet(workbook, wsEntretiens, "Entretiens");

let currentRowUsagers = 0;
let currentRowEntretiens = 0;
let currentRowUsagers = 2;
let currentRowEntretiens = 2;

const processChunk = async (chunk: StructureUsagerExport[]) => {
console.log({
date: new Date(),
structureId: user.structureId,
currentRowUsagers,
});
const { firstSheetUsagers, secondSheetEntretiens } =
renderStructureUsagersRows(chunk, user.structure);

// Application du format des dates
applyDateFormat(firstSheetUsagers, [
"USAGER_DATE_NAISSANCE",
"DATE_RADIATION",
"DATE_REFUS",
"DATE_DEBUT_DOM",
"DATE_FIN_DOM",
"DATE_PREMIERE_DOM",
"DATE_DERNIER_PASSAGE",
]);

// Ajoute les lignes à la première feuille
XLSX.utils.sheet_add_json(wsUsagers, firstSheetUsagers, {
skipHeader: true,
origin: currentRowUsagers,
cellDates: true,
dateNF: "DD/MM/YYYY",
});
currentRowUsagers += firstSheetUsagers.length;

applyDateFormat(secondSheetEntretiens, ["USAGER_DATE_NAISSANCE"]);

// Ajoute les lignes à la deuxième feuille
XLSX.utils.sheet_add_json(wsEntretiens, secondSheetEntretiens, {
skipHeader: true,
origin: currentRowEntretiens,
cellDates: true,
dateNF: "DD/MM/YYYY",
});

currentRowEntretiens += secondSheetEntretiens.length;
};

// Lance l'export par chunks
await this.usagersService.exportByChunks(
user.structureId,
5000,
Expand Down Expand Up @@ -108,6 +153,7 @@ export class ExportStructureUsagersController {

res.send(buffer);
} catch (err) {
console.log(err);
appLogger.error("[EXPORT] Unexpected error", err);
res.sendStatus(500);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ import { UsagerHistoryStateService } from "../services/usagerHistoryState.servic
import { domifaConfig } from "../../config";
import { FileManagerService } from "../../util/file-manager/file-manager.service";
import { Not } from "typeorm";
import { subMinutes } from "date-fns";

@Controller("usagers")
@ApiTags("usagers")
Expand Down Expand Up @@ -143,7 +144,7 @@ export class UsagersController {
`"structureId" = :structureId AND "updatedAt" >= :fiveMinutesAgo`,
{
structureId: user.structureId,
fiveMinutesAgo: new Date(Date.now() - 5 * 60 * 1000),
fiveMinutesAgo: subMinutes(new Date(), 5),
}
)
.getRawMany();
Expand Down
22 changes: 21 additions & 1 deletion packages/backend/src/usagers/services/usagers.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -253,6 +253,12 @@ export class UsagersService {
processChunk: (chunk: StructureUsagerExport[]) => Promise<void>
): Promise<void> {
let skip = 0;
let total = 0;

const [{ count }] = await usagerRepository.query(
`SELECT COUNT(*) as count FROM usager WHERE "structureId" = $1`,
[structureId]
);

const query = `
SELECT
Expand Down Expand Up @@ -320,7 +326,21 @@ export class UsagersService {
}

await processChunk(chunk);
skip += chunkSize;
total += chunk.length;
skip += chunk.length;

console.log({
processedCount: total,
totalCount: count,
chunkSize: chunk.length,
skip,
});
}

if (total !== parseInt(count)) {
console.warn(
`⚠️ Différence détectée - Exportés: ${total}, Total attendu: ${count}`
);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import { StructureCustomDocTags } from "../../../_common/model";
import { isValid, parse } from "date-fns";
export const applyDateFormat = (
worksheet: StructureCustomDocTags[],
elements: Array<keyof StructureCustomDocTags>
): void => {
worksheet.forEach((ws: StructureCustomDocTags) => {
elements.forEach((element: keyof StructureCustomDocTags) => {
if (ws[element]) {
const value = ws[element] as string;
ws[element] = isValid(parse(value, "dd/MM/yyyy", new Date()))
? parse(value, "dd/MM/yyyy", new Date())
: value;
}
});
});
};
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
//@index('./*', f => `export * from '${f.path}'`)
export * from "./renderStructureUsagersExcel";
export * from "./applyDateFormat";
export * from "./renderStructureUsagersRows";
export * from "./StructureUsagerExport.type";

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,11 @@ import { StructureUsagerExport } from "./StructureUsagerExport.type";
import { format } from "date-fns";
import { dateFormat } from "../../../util";

export const renderStructureUsagersRows = (
usagers: StructureUsagerExport[],
export const renderStructureUsagersHeaders = (
structure: StructureCommon
): {
firstSheetUsagers: StructureCustomDocTags[];
secondSheetEntretiens: StructureCustomDocTags[];
firstSheetHeaders: StructureCustomDocTags[];
secondSheetHeaders: StructureCustomDocTags[];
} => {
const dateHeader = dateFormat(
new Date(),
Expand Down Expand Up @@ -91,12 +90,12 @@ export const renderStructureUsagersRows = (
ENTRETIEN_COMMENTAIRE: CUSTOM_DOCS_LABELS.ENTRETIEN_COMMENTAIRE,
};

const firstSheetUsagers = [
const firstSheetHeaders = [
{ USAGER_CUSTOM_REF: dateHeader },
usagersListHeader,
];

const secondSheetEntretiens = [
const secondSheetHeaders = [
{ USAGER_CUSTOM_REF: dateHeader },
entretiensHeader,
];
Expand All @@ -116,6 +115,22 @@ export const renderStructureUsagersRows = (
set(usagersListHeader, `AD_LIEN_${index}`, `Lien de parenté ${index + 1}`);
}

return {
firstSheetHeaders,
secondSheetHeaders,
};
};

export const renderStructureUsagersRows = (
usagers: StructureUsagerExport[],
structure: StructureCommon
): {
firstSheetUsagers: StructureCustomDocTags[];
secondSheetEntretiens: StructureCustomDocTags[];
} => {
const firstSheetUsagers = [];
const secondSheetEntretiens = [];

for (const usagerToExport of usagers) {
try {
const customData = {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,73 +1,4 @@
export const FIRST_SHEET_USAGERS = [
{
AD_DATE_NAISSANCE_0: "Date naissance ayant-droit 1",
AD_DATE_NAISSANCE_1: "Date naissance ayant-droit 2",
AD_DATE_NAISSANCE_2: "Date naissance ayant-droit 3",
AD_DATE_NAISSANCE_3: "Date naissance ayant-droit 4",
AD_DATE_NAISSANCE_4: "Date naissance ayant-droit 5",
AD_DATE_NAISSANCE_5: "Date naissance ayant-droit 6",
AD_DATE_NAISSANCE_6: "Date naissance ayant-droit 7",
AD_DATE_NAISSANCE_7: "Date naissance ayant-droit 8",
AD_LIEN_0: "Lien de parenté 1",
AD_LIEN_1: "Lien de parenté 2",
AD_LIEN_2: "Lien de parenté 3",
AD_LIEN_3: "Lien de parenté 4",
AD_LIEN_4: "Lien de parenté 5",
AD_LIEN_5: "Lien de parenté 6",
AD_LIEN_6: "Lien de parenté 7",
AD_LIEN_7: "Lien de parenté 8",
AD_NOM_0: "Nom ayant-droit 1",
AD_NOM_1: "Nom ayant-droit 2",
AD_NOM_2: "Nom ayant-droit 3",
AD_NOM_3: "Nom ayant-droit 4",
AD_NOM_4: "Nom ayant-droit 5",
AD_NOM_5: "Nom ayant-droit 6",
AD_NOM_6: "Nom ayant-droit 7",
AD_NOM_7: "Nom ayant-droit 8",
AD_PRENOM_0: "Prénom ayant-droit 1",
AD_PRENOM_1: "Prénom ayant-droit 2",
AD_PRENOM_2: "Prénom ayant-droit 3",
AD_PRENOM_3: "Prénom ayant-droit 4",
AD_PRENOM_4: "Prénom ayant-droit 5",
AD_PRENOM_5: "Prénom ayant-droit 6",
AD_PRENOM_6: "Prénom ayant-droit 7",
AD_PRENOM_7: "Prénom ayant-droit 8",
AYANTS_DROITS_NOMBRE: "Nombre d'ayants-droit",
DATE_DEBUT_DOM: "Date de Début de la domiciliation (ex: 12/10/2020)",
DATE_DERNIER_PASSAGE: "Date de dernier passage (ex: 01/09/2020 à 10h45)",
DATE_FIN_DOM: "Date de fin de la domiciliation (ex: 12/10/2020)",
DATE_PREMIERE_DOM: "Date de la 1ere domiciliation (ex: 12/10/2020)",
DATE_RADIATION: "Date de la radiation",
DATE_REFUS: "Date du refus",
DECISION_NOM_AGENT: "Utilisateur ayant prit la décision",
MOTIF_RADIATION: "Motif de la radiation",
MOTIF_REFUS: "Motif du refus",
STATUT_DOM: "Statut de la domiciliation",
TYPE_DOM: "Type de domiciliation",
USAGER_CIVILITE: "Civilité",
PREMIERE_DOM_NOM_AGENT: "Utilisateur ayant validé la 1ere dom",
TRANSFERT_ACTIF: "Transfert actif ou non : (oui / non)",
TRANSFERT_ADRESSE: "Adresse de l'établissement",
TRANSFERT_DATE_DEBUT: "Date de début de validité (jj/mm/aaaa)",
TRANSFERT_DATE_FIN: "Date de fin de validité (jj/mm/aaaa)",
TRANSFERT_NOM: "Nom de l'établissement",
PROCURATIONS_NOMBRE: "Nombre de procurations",
PROCURATION_ACTIF: "Procuration active ou non : (oui / non)",
USAGER_DATE_NAISSANCE: "Date naissance",
USAGER_EMAIL: "Adresse email",
USAGER_LANGUE: "Langue parlée",
USAGER_LIEU_NAISSANCE: "Lieu naissance",
USAGER_NATIONALITE: "Nationalité",
USAGER_CUSTOM_REF: "Identifiant personnalisé",
USAGER_NUMERO_DISTRIBUTION_SPECIALE:
"Numéro de distribution (TSA, BP, etc)",
USAGER_PHONE: "Numéro de téléphone",
USAGER_PRENOM: "Prénom",
USAGER_NOM: "Nom",
MON_DOMIFA_ACTIVATION: "Portail Mon DomiFa activé ?",
SMS_ACTIVATION: "SMS activés ?",
USAGER_SURNOM: "Nom d'usage / Surnom",
},
{
AYANTS_DROITS_NOMBRE: "0",
DATE_DEBUT_DOM: "01/11/2020",
Expand Down
Loading
Loading