Skip to content

Commit

Permalink
Réarrangement exportations
Browse files Browse the repository at this point in the history
  • Loading branch information
julienmalard committed Nov 3, 2023
1 parent 41e4f2a commit a57b9c7
Show file tree
Hide file tree
Showing 5 changed files with 1,220 additions and 1,199 deletions.
93 changes: 39 additions & 54 deletions src/bds.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import { isBrowser, isWebWorker } from "wherearewe";
import { v4 as uuidv4 } from "uuid";
import { suivreBdDeFonction } from "@constl/utils-ipa";

import type { InfoColAvecCatégorie } from "@/tableaux.js";
import { attendreStabilité, type InfoColAvecCatégorie } from "@/tableaux.js";
import {
schémaStatut,
schémaStructureBdMétadonnées,
Expand All @@ -25,6 +25,7 @@ import type {
élémentBdListeDonnées,
différenceTableaux,
élémentDonnées,
donnéesTableauExportation,
} from "@/tableaux.js";
import ClientConstellation from "@/client.js";
import {
Expand Down Expand Up @@ -69,6 +70,11 @@ export interface infoScore {
total: number;
}

export type donnéesBdExportation = {
nomBd: string;
tableaux: donnéesTableauExportation[];
};

export interface donnéesBdExportées {
doc: WorkBook;
fichiersSFIP: Set<string>;
Expand Down Expand Up @@ -2153,22 +2159,11 @@ export default class BDs extends ComposanteClientListe<string> {
}: {
idBd: string;
langues?: string[];
f: schémaFonctionSuivi<{
nomBd: string;
données: {
nomTableau: string;
données: élémentBdListeDonnées[];
fichiersSFIP: Set<string>;
}[];
}>;
f: schémaFonctionSuivi<donnéesBdExportation>;
}): Promise<schémaFonctionOublier> {
const info: {
nomsBd?: { [langue: string]: string };
données?: {
nomTableau: string;
données: élémentBdListeDonnées[];
fichiersSFIP: Set<string>;
}[];
données?: donnéesTableauExportation[];
} = {};
const fsOublier: schémaFonctionOublier[] = [];

Expand All @@ -2181,7 +2176,7 @@ export default class BDs extends ComposanteClientListe<string> {
nomsBd && langues ? traduire(nomsBd, langues) || idCourt : idCourt;
await f({
nomBd,
données,
tableaux: données,
});
};

Expand All @@ -2192,33 +2187,24 @@ export default class BDs extends ComposanteClientListe<string> {
return await this.suivreTableauxBd({ idBd, f: fSuivreRacine });
},
f: async (
données: {
nomTableau: string;
données: élémentBdListeDonnées[];
fichiersSFIP: Set<string>;
}[],
données: donnéesTableauExportation[],
) => {
info.données = données;
await fFinale();
},
fBranche: async (
id: string,
fSuivreBranche: schémaFonctionSuivi<{
idTableau: string;
données: {
nomTableau: string;
données: élémentBdListeDonnées[];
fichiersSFIP: Set<string>;
};
}>,
fSuivreBranche: schémaFonctionSuivi<donnéesTableauExportation>,
): Promise<schémaFonctionOublier> => {
return await this.client.tableaux!.suivreDonnéesExportation({
idTableau: id,
langues,
f: async (données) =>
await fSuivreBranche({ idTableau: id, données }),
f: async (données) =>{
return await fSuivreBranche(données)},
});
},
fIdBdDeBranche: x => x.id,
fCode: (x) => x.id,
});
fsOublier.push(fOublierDonnées);

Expand Down Expand Up @@ -2248,34 +2234,33 @@ export default class BDs extends ComposanteClientListe<string> {
nomFichier?: string;
}): Promise<donnéesBdExportées> {
const doc = utils.book_new();
const fichiersSFIP: Set<string> = new Set();

const infosTableaux = await uneFois(
(f: schémaFonctionSuivi<infoTableauAvecId[]>) =>
this.suivreTableauxBd({ idBd, f }),
);

for (const tableau of infosTableaux) {
const { id: idTableau } = tableau;
const { fichiersSFIP: fichiersSFIPTableau } =
await this.client.tableaux!.exporterDonnées({
idTableau,
const données = await uneFois(
async (
fSuivi: schémaFonctionSuivi<donnéesBdExportation>,
): Promise<schémaFonctionOublier> => {
return await this.suivreDonnéesExportation({
idBd,
langues,
doc,
f: fSuivi,
});
fichiersSFIPTableau.forEach((f) => fichiersSFIP.add(f));
}

if (!nomFichier) {
const nomsBd = await uneFois(
(f: schémaFonctionSuivi<{ [key: string]: string }>) =>
this.suivreNomsBd({ idBd, f }),
);
const idCourt = idBd.split("/").pop()!;

nomFichier = langues ? traduire(nomsBd, langues) || idCourt : idCourt;
},
attendreStabilité(1000)
);

nomFichier = nomFichier || données.nomBd;

const fichiersSFIP = new Set<string>();

for (const tableau of données.tableaux) {
tableau.fichiersSFIP.forEach(x=>fichiersSFIP.add(x))

/* Créer le tableau */
const tableauXLSX = utils.json_to_sheet(tableau.données);

/* Ajouter la feuille au document. XLSX n'accepte pas les noms de colonne > 31 caractères */
utils.book_append_sheet(doc, tableauXLSX, tableau.nomTableau.slice(0, 30));
}

return { doc, fichiersSFIP, nomFichier };
}

Expand Down
149 changes: 109 additions & 40 deletions src/projets.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import type { ToFile } from "ipfs-core-types/src/utils";

import { WorkBook, BookType, write as writeXLSX } from "xlsx";
import { WorkBook, BookType, write as writeXLSX, utils } from "xlsx";
import toBuffer from "it-to-buffer";
import path from "path";

Expand All @@ -24,15 +24,20 @@ import {
import { traduire, zipper, uneFois } from "@constl/utils-ipa";
import { ComposanteClientListe } from "./composanteClient.js";
import { JSONSchemaType } from "ajv";
import { schémaCopiéDe } from "./bds.js";
import { donnéesBdExportation, schémaCopiéDe } from "./bds.js";
import { TypedKeyValue, TypedSet } from "@constl/bohr-db";
import { estUnContrôleurConstellation } from "./accès/utils.js";
import { attendreStabilité } from "./tableaux.js";

const schémaStructureBdMotsClefsdeProjet: JSONSchemaType<string> = {
type: "string",
};
const schémaStuctureBdsDeProjet: JSONSchemaType<string> = { type: "string" };

export interface donnéesProjetExportation {
nomProjet: string;
bds: donnéesBdExportation[]
};
export interface donnéesProjetExportées {
docs: { doc: WorkBook; nom: string }[];
fichiersSFIP: Set<string>;
Expand Down Expand Up @@ -847,57 +852,121 @@ export default class Projets extends ComposanteClientListe<string> {
});
}

async exporterDonnées({
async suivreDonnéesExportation({
idProjet,
langues,
nomFichier,
f,
}: {
idProjet: string;
langues?: string[];
nomFichier?: string;
}): Promise<donnéesProjetExportées> {
if (!nomFichier) {
const nomsBd = await uneFois(
(f: schémaFonctionSuivi<{ [key: string]: string }>) =>
this.suivreNomsProjet({ idProjet, f }),
);
f: schémaFonctionSuivi<donnéesProjetExportation>;
}): Promise<schémaFonctionOublier> {
const info: {
nomsProjet?: { [langue: string]: string };
données?: donnéesBdExportation[];
} = {};
const fsOublier: schémaFonctionOublier[] = [];

const fFinale = async () => {
const { nomsProjet, données } = info;
if (!données) return;

const idCourt = idProjet.split("/").pop()!;
const nomProjet =
nomsProjet && langues
? traduire(nomsProjet, langues) || idCourt
: idCourt;
return await f({
nomProjet,
bds: données,
});
};

nomFichier = langues ? traduire(nomsBd, langues) || idCourt : idCourt;
const fOublierDonnées = await this.client.suivreBdsDeFonctionListe({
fListe: async (fSuivreRacine: (éléments: string[]) => Promise<void>) => {
return await this.suivreBdsProjet({ idProjet, f: fSuivreRacine });
},
f: async (
données: donnéesBdExportation[],
) => {
info.données = données;
await fFinale();
},
fBranche: async (
id: string,
fSuivreBranche: schémaFonctionSuivi<donnéesBdExportation>,
): Promise<schémaFonctionOublier> => {
return await this.client.bds!.suivreDonnéesExportation({
idBd: id,
langues,
f: fSuivreBranche,
});
},
});
fsOublier.push(fOublierDonnées);

if (langues) {
const fOublierNomsProjet = await this.suivreNomsProjet({
idProjet,
f: async (noms) => {
info.nomsProjet = noms;
await fFinale();
},
});
fsOublier.push(fOublierNomsProjet);
}
const données: donnéesProjetExportées = {
docs: [],
fichiersSFIP: new Set(),
nomFichier,

return async () => {
await Promise.all(fsOublier.map((f) => f()));
};
const idsBds = await uneFois((f: schémaFonctionSuivi<string[]>) =>
this.suivreBdsProjet({ idProjet, f }),
}

async exporterDonnées({
idProjet,
langues,
nomFichier,
}: {
idProjet: string;
langues?: string[];
nomFichier?: string;
}): Promise<donnéesProjetExportées> {
const données = await uneFois(
async (
fSuivi: schémaFonctionSuivi<donnéesProjetExportation>,
): Promise<schémaFonctionOublier> => {
return await this.suivreDonnéesExportation({
idProjet,
langues,
f: fSuivi,
});
},
attendreStabilité(1000)
);
for (const idBd of idsBds) {
const { doc, fichiersSFIP } = await this.client.bds!.exporterDonnées({
idBd,
langues,
});

let nom: string;
const idCourtBd = idBd.split("/").pop()!;
if (langues) {
const noms = await uneFois(
(f: schémaFonctionSuivi<{ [key: string]: string }>) =>
this.client.bds!.suivreNomsBd({ idBd, f }),
);
nomFichier = nomFichier || données.nomProjet;

nom = traduire(noms, langues) || idCourtBd;
} else {
nom = idCourtBd;
}
données.docs.push({ doc, nom });
const fichiersSFIP = new Set<string>();
données.bds.forEach(bd=>{
bd.tableaux.forEach(
t => t.fichiersSFIP.forEach(x=>fichiersSFIP.add(x))
)
});

for (const fichier of fichiersSFIP) {
données.fichiersSFIP.add(fichier);
}
}
return données;
return {
docs: données.bds.map(donnéesBd => {
const doc = utils.book_new();
for (const tableau of donnéesBd.tableaux) {
/* Créer le tableau */
const tableauXLSX = utils.json_to_sheet(tableau.données);

/* Ajouter la feuille au document. XLSX n'accepte pas les noms de colonne > 31 caractères */
utils.book_append_sheet(doc, tableauXLSX, tableau.nomTableau.slice(0, 30));
}
return { doc, nom: donnéesBd.nomBd }
}),
fichiersSFIP,
nomFichier,
};
}

async exporterDocumentDonnées({
Expand Down
Loading

0 comments on commit a57b9c7

Please sign in to comment.