107 lines
2.9 KiB
TypeScript
107 lines
2.9 KiB
TypeScript
// // src/scripts/import-users-from-csv.ts
|
||
// import { PrismaClient } from '@prisma/client';
|
||
// import * as fs from 'fs';
|
||
// import * as path from 'path';
|
||
|
||
// const prisma = new PrismaClient();
|
||
|
||
// // ⚙️ Chemin vers ton CSV (à adapter selon où tu le mets)
|
||
// const CSV_PATH = path.resolve(__dirname, 'data/export_employee_table.csv');
|
||
|
||
// // Type aligné sur les colonnes du CSV
|
||
// type CsvUserRow = {
|
||
// email: string;
|
||
// first_name: string;
|
||
// last_name: string;
|
||
// phone_number: string;
|
||
// };
|
||
|
||
// // Petit parseur de ligne CSV sans dépendance
|
||
// function splitCsvLine(line: string): string[] {
|
||
// const result: string[] = [];
|
||
// let current = '';
|
||
// let inQuotes = false;
|
||
|
||
// for (let i = 0; i < line.length; i++) {
|
||
// const char = line[i];
|
||
|
||
// if (char === '"') {
|
||
// // guillemet échappé ""
|
||
// if (inQuotes && line[i + 1] === '"') {
|
||
// current += '"';
|
||
// i++; // on saute le deuxième
|
||
// } else {
|
||
// inQuotes = !inQuotes;
|
||
// }
|
||
// } else if (char === ',' && !inQuotes) {
|
||
// result.push(current);
|
||
// current = '';
|
||
// } else {
|
||
// current += char;
|
||
// }
|
||
// }
|
||
|
||
// result.push(current);
|
||
// return result.map((v) => v.trim());
|
||
// }
|
||
|
||
// async function main() {
|
||
// // 1. Lecture du fichier CSV
|
||
// const fileContent = fs.readFileSync(CSV_PATH, 'utf-8');
|
||
|
||
// const lines = fileContent
|
||
// .split(/\r?\n/)
|
||
// .map((l) => l.trim())
|
||
// .filter((l) => l.length > 0);
|
||
|
||
// if (lines.length <= 1) {
|
||
// console.error('CSV vide ou seulement un header');
|
||
// return;
|
||
// }
|
||
|
||
// // 2. Header (noms de colonnes) -> ["email", "first_name", "last_name", "phone_number"]
|
||
// const header = splitCsvLine(lines[0]);
|
||
// const dataLines = lines.slice(1);
|
||
|
||
// // 3. Conversion de chaque ligne en objet { email, first_name, last_name, phone_number }
|
||
// const records: CsvUserRow[] = dataLines.map((line) => {
|
||
// const values = splitCsvLine(line);
|
||
// const row: any = {};
|
||
|
||
// header.forEach((col, idx) => {
|
||
// row[col] = values[idx] ?? '';
|
||
// });
|
||
|
||
// return row as CsvUserRow;
|
||
// });
|
||
|
||
// // 4. Mapping vers le format attendu par Prisma (model Users)
|
||
// const data = records.map((row) => ({
|
||
// email: row.email.trim(),
|
||
// first_name: row.first_name.trim(),
|
||
// last_name: row.last_name.trim(),
|
||
// phone_number: row.phone_number.trim(),
|
||
// // residence: null,
|
||
// // role: 'EMPLOYEE',
|
||
// }));
|
||
|
||
// console.log(`➡️ ${data.length} lignes trouvées dans le CSV`);
|
||
// console.log('Exemple importé :', data[0]);
|
||
|
||
|
||
// const result = await prisma.users.createMany({
|
||
// data,
|
||
// });
|
||
|
||
// console.log(`✅ ${result.count} utilisateurs insérés dans la DB`);
|
||
// }
|
||
|
||
// main()
|
||
// .catch((err) => {
|
||
// console.error('Erreur pendant l’import CSV → DB', err);
|
||
// process.exit(1);
|
||
// })
|
||
// .finally(async () => {
|
||
// await prisma.$disconnect();
|
||
// });
|