File size: 13,609 Bytes
4d733e8 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 | import PptxGenJS from 'pptxgenjs';
import puppeteer from 'puppeteer';
import * as path from 'path';
import * as fs from 'fs';
// Asset Paths
const assetsDir = '/Users/macbookair/.gemini/antigravity/brain/ea618d02-1ee0-47c1-a2b7-aed00a3604bc';
const outputDir = '/Volumes/sms/edtech/docs';
async function generateBankLevelPptx() {
console.log("Generating Premium PPTX...");
const pres = new PptxGenJS();
// Design System
pres.defineSlideMaster({
title: 'MASTER_SLIDE',
bkgd: 'FFFFFF',
objects: [
{ rect: { x: 0, y: 0, w: '100%', h: 0.75, fill: { color: '1B3A57' } } },
{ rect: { x: 0, y: 0.75, w: '100%', h: 0.05, fill: { color: 'F4A261' } } } // Orange accent
]
});
// 1. Cover Slide
const slide1 = pres.addSlide();
slide1.bkgd = '1B3A57';
slide1.addImage({ path: path.join(assetsDir, 'atelier_facade_1772852282648.png'), x: 0, y: 0, w: '100%', h: '100%' });
slide1.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: '100%', h: '100%', fill: { color: '000000', transparency: 60 } });
slide1.addText('SARTORIA NDOYE', { x: 0.5, y: 2, w: '90%', fontSize: 54, color: 'FFFFFF', bold: true, align: 'center', fontFace: 'Montserrat' });
slide1.addText('L\'Excellence Tradi-Moderne à Dakar - Business Plan 2026', { x: 0.5, y: 3.2, w: '90%', fontSize: 24, color: 'F4A261', align: 'center', fontFace: 'Inter' });
// 2. Problem/Solution
const slide2 = pres.addSlide({ masterName: 'MASTER_SLIDE' });
slide2.addText('1. MBIR MI AK SAFARA SI (Problème & Solution)', { x: 0.5, y: 0.15, w: '90%', fontSize: 28, color: 'FFFFFF', bold: true, fontFace: 'Montserrat' });
slide2.addText('Le Problème (Jafe-jafe bi):', { x: 0.5, y: 1.2, w: '40%', fontSize: 20, color: '1C7C54', bold: true });
slide2.addText('- Manque de tailleurs réguliers\n- Qualité des finitions aléatoire\n- Délais de livraison non respectés', { x: 0.5, y: 1.7, w: '40%', fontSize: 16, color: '333333', bullet: true });
slide2.addText('La Solution (Safara si):', { x: 5.5, y: 1.2, w: '40%', fontSize: 20, color: '1C7C54', bold: true });
slide2.addText('- Atelier premium standardisé\n- Promesse de tenues sur mesure à temps\n- Finitions parfaites (Contrôle Qualité)', { x: 5.5, y: 1.7, w: '40%', fontSize: 16, color: '333333', bullet: true });
slide2.addImage({ path: path.join(assetsDir, 'modern_workspace_1772852299569.png'), x: 0.5, y: 3.0, w: '40%', h: 2.2 });
slide2.addText('Notre Espace de Travail Moderne', { x: 0.5, y: 5.2, w: '40%', fontSize: 12, color: '666666', align: 'center' });
// 3. The Product
const slide3 = pres.addSlide({ masterName: 'MASTER_SLIDE' });
slide3.addText('2. LE PRODUIT : L\'EXCELLENCE (Qualité Supérieure)', { x: 0.5, y: 0.15, w: '90%', fontSize: 28, color: 'FFFFFF', bold: true, fontFace: 'Montserrat' });
slide3.addImage({ path: path.join(assetsDir, 'finishing_zoom_1772852316317.png'), x: 0.5, y: 1.2, w: 4, h: 4, rounding: true });
slide3.addText('Savoir-Faire Unique', { x: 5, y: 1.5, w: 4, fontSize: 24, color: '1B3A57', bold: true });
slide3.addText('Nous fusionnons le tissu traditionnel africain (Bazin, Wax) avec des textiles modernes.\n\nPoint critique : Les finitions.\nNotre atelier garantit des coutures nettes, des broderies précises et un tombé impeccable digne de la haute couture, à des prix accessibles.', { x: 5, y: 2.2, w: 4.5, fontSize: 18, color: '333333', lineSpacing: 28 });
// 4. Market
const slide4 = pres.addSlide({ masterName: 'MASTER_SLIDE' });
slide4.addText('3. MARCHE ET OPPORTUNITÉ (Marché à Dakar)', { x: 0.5, y: 0.15, w: '90%', fontSize: 28, color: 'FFFFFF', bold: true, fontFace: 'Montserrat' });
slide4.addText('Population de Dakar (2024)', { x: 0.5, y: 1.2, w: 3, fontSize: 16, color: '1C7C54', bold: true, align: 'center' });
slide4.addText('4,4 Millions', { x: 0.5, y: 1.6, w: 3, fontSize: 36, color: '1B3A57', bold: true, align: 'center' });
slide4.addText('Budget Mensuel Habillement', { x: 3.5, y: 1.2, w: 3, fontSize: 16, color: '1C7C54', bold: true, align: 'center' });
slide4.addText('12 000 FCFA', { x: 3.5, y: 1.6, w: 3, fontSize: 36, color: 'F4A261', bold: true, align: 'center' });
slide4.addText('Croissance Tradi-Moderne', { x: 6.5, y: 1.2, w: 3, fontSize: 16, color: '1C7C54', bold: true, align: 'center' });
slide4.addText('+15% / an', { x: 6.5, y: 1.6, w: 3, fontSize: 36, color: '1B3A57', bold: true, align: 'center' });
slide4.addText('TAM / SAM / SOM', { x: 0.5, y: 2.8, w: '90%', fontSize: 20, color: '1B3A57', bold: true });
slide4.addText('• TAM : Femmes de Dakar (Classe moyenne/Aisée) ~ 1.2 Millions\n• SAM : Femmes achetant des tenues pour évènements réguliers ~ 300 000\n• SOM : Cible pour notre atelier (Capacité année 1) ~ 1 500 clientes', { x: 0.5, y: 3.3, w: '90%', fontSize: 18, color: '333333', bullet: true, lineSpacing: 35 });
// 5. Financials
const slide5 = pres.addSlide({ masterName: 'MASTER_SLIDE' });
slide5.addText('4. PROJECTIONS FINANCIÈRES (Xaliss bi)', { x: 0.5, y: 0.15, w: '90%', fontSize: 28, color: 'FFFFFF', bold: true, fontFace: 'Montserrat' });
const chartData = [
{ name: 'Revenu', labels: ['Q1', 'Q2', 'Q3', 'Q4'], values: [3, 4.5, 7, 12] },
{ name: 'Coûts', labels: ['Q1', 'Q2', 'Q3', 'Q4'], values: [2.5, 3, 3.5, 4.5] }
];
slide5.addChart(pres.ChartType.bar, [chartData[0], chartData[1]], {
x: 0.5, y: 1.2, w: 6, h: 4,
chartColors: ['1C7C54', 'F4A261'],
showLegend: true, legendPos: 'b',
title: 'Prévisions Millions FCFA', showTitle: true,
valAxisTitle: 'Millions FCFA', catAxisTitle: 'Trimestres'
});
slide5.addText('Objectif de Rentabilité', { x: 6.8, y: 1.2, w: 3, fontSize: 20, color: '1B3A57', bold: true });
slide5.addText('Objectif mensuel J8 :\n300 000 FCFA net\n\nPrix moyen unitaire :\n15 000 FCFA\n\nMarge Brute estimée :\n60%', { x: 6.8, y: 1.7, w: 3, fontSize: 16, color: '333333' });
// 6. Team
const slide6 = pres.addSlide({ masterName: 'MASTER_SLIDE' });
slide6.addText('5. L\'ÉQUIPE DIRIGEANTE (Njiit yi)', { x: 0.5, y: 0.15, w: '90%', fontSize: 28, color: 'FFFFFF', bold: true, fontFace: 'Montserrat' });
slide6.addImage({ path: path.join(assetsDir, 'proud_entrepreneur_1772852329232.png'), x: 0.5, y: 1.2, w: 4, h: 4 });
slide6.addText('Fatou Ndoye\nFondatrice & Chef d\'Atelier', { x: 5, y: 1.5, w: 4.5, fontSize: 24, color: '1B3A57', bold: true });
slide6.addText('"Xam-xam bi ma jàng XAMLÉ dana ma dimbali ma gëna yokk sama business Couture. Sama yéne mooy defar ay ngënéel yu mag ci Sénégal."\n\n- 10 ans d\'expérience dans la mode locale.\n- Formation en gestion d\'entreprise XAMLÉ effectuée.', { x: 5, y: 2.5, w: 4.5, fontSize: 18, color: '333333', lineSpacing: 25 });
const pptxPath = path.join(outputDir, 'Sartoria_Ndoye_PitchDeck_Premium.pptx');
await pres.writeFile({ fileName: pptxPath });
console.log(`PPTX created at: ${pptxPath}`);
}
async function generateBankLevelPdf() {
console.log("Generating Premium PDF...");
const htmlContent = `
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<style>
@import url('https://fonts.googleapis.com/css2?family=Montserrat:wght@400;700&family=Inter:wght@400;600&display=swap');
body { font-family: 'Inter', sans-serif; color: #333; margin: 0; padding: 40px; background-color: #fcfcfc; }
.container { max-width: 1000px; margin: auto; background: white; padding: 50px; box-shadow: 0 4px 15px rgba(0,0,0,0.05); }
header { display: flex; justify-content: space-between; align-items: center; border-bottom: 3px solid #1C7C54; padding-bottom: 20px; margin-bottom: 30px; }
h1 { font-family: 'Montserrat', sans-serif; color: #1B3A57; font-size: 38px; margin: 0; text-transform: uppercase; letter-spacing: 1px; }
.subtitle { color: #F4A261; font-weight: 600; font-size: 18px; margin-top: 5px; }
.grid { display: grid; grid-template-columns: 1fr 1fr; gap: 40px; }
.section h2 { font-family: 'Montserrat', sans-serif; color: #1C7C54; font-size: 22px; border-bottom: 1px dashed #ccc; padding-bottom: 5px; text-transform: uppercase; }
.section p { font-size: 14px; line-height: 1.7; color: #555; }
.stats { display: flex; justify-content: space-between; background: #1B3A57; color: white; padding: 20px; border-radius: 8px; margin: 30px 0; }
.stat-box { text-align: center; }
.stat-number { font-size: 28px; font-weight: bold; font-family: 'Montserrat'; color: #F4A261; }
.stat-label { font-size: 12px; opacity: 0.9; text-transform: uppercase; }
.image-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 15px; margin-top: 20px; }
.image-grid img { width: 100%; height: 200px; object-fit: cover; border-radius: 8px; }
</style>
</head>
<body>
<div class="container">
<header>
<div>
<h1>Sartoria Ndoye</h1>
<div class="subtitle">L'Excellence Couture Tradi-Moderne (Dakar)</div>
</div>
<div>
<img src="file://${path.join(assetsDir, 'proud_entrepreneur_1772852329232.png')}" style="width:100px; height:100px; border-radius:50%; object-fit:cover; border: 3px solid #1C7C54;">
</div>
</header>
<div class="grid">
<div class="section">
<h2>Résumé Exécutif (Executive Summary)</h2>
<p>Fondée à Dakar, Sartoria Ndoye répond à un besoin crucial du marché de la mode sénégalaise : la fiabilité et la qualité des finitions. Nous ciblons une clientèle exigeante de femmes pour leurs tenues d'événements et professionnels, en fusionnant les pratiques traditionnelles avec des standards de conception modernes.</p>
</div>
<div class="section">
<h2>Marché & Opportunité (Market Size)</h2>
<p>Dakar représente un bassin de 4,4 millions d'habitants où la femme urbaine consacre en moyenne 12 000 FCFA par mois à l'habillement. Le segment "made in Sénégal" croît de 15% par an, porté par une fierté identitaire forte. Notre SOM (Serviceable Obtainable Market) initial est de 1 500 clientes récurrentes.</p>
</div>
</div>
<div class="stats">
<div class="stat-box"><div class="stat-number">15 000F</div><div class="stat-label">Prix Moyen Unitaire</div></div>
<div class="stat-box"><div class="stat-number">60%</div><div class="stat-label">Marge Brute Prévue</div></div>
<div class="stat-box"><div class="stat-number">300K F</div><div class="stat-label">Objectif Rentabilité Mensuelle</div></div>
<div class="stat-box"><div class="stat-number">B2C</div><div class="stat-label">Modèle d'Acquisition</div></div>
</div>
<div class="grid">
<div class="section">
<h2>Modèle Opérationnel & Stratégie (Go-to-Market)</h2>
<p>1. <b>Acquisition :</b> Campagnes sponsorisées Instagram (Focus sur la qualité visuelle des détails) et fidélisation relationnelle via WhatsApp Business.<br>
2. <b>Production :</b> Espace de travail standardisé et achat de machinerie haut de gamme (piqueuses plates, surjeteuses professionnelles). Collaboration avec les grossistes du marché HLM pour les matières premières.<br>
3. <b>Promesse :</b> "Des tenues sur mesure livrées à temps avec des finitions parfaites."</p>
</div>
<div class="section">
<h2>Focus sur la Qualité (Production)</h2>
<div class="image-grid">
<img src="file://${path.join(assetsDir, 'modern_workspace_1772852299569.png')}">
<img src="file://${path.join(assetsDir, 'finishing_zoom_1772852316317.png')}">
</div>
</div>
</div>
<div style="text-align: center; margin-top: 40px; font-size: 14px; color: #888;">
<i>Business Plan généré par la plateforme Moteur IA XAMLÉ</i>
</div>
</div>
</body>
</html>
`;
const browser = await puppeteer.launch({
executablePath: process.env.PUPPETEER_EXECUTABLE_PATH || undefined,
headless: true,
args: ['--no-sandbox', '--disable-setuid-sandbox', '--allow-file-access-from-files']
});
const page = await browser.newPage();
await page.setContent(htmlContent, { waitUntil: 'networkidle0' });
const pdfPath = path.join(outputDir, 'Sartoria_Ndoye_BusinessPlan_Premium.pdf');
await page.pdf({
path: pdfPath,
format: 'A4',
printBackground: true,
margin: { top: 0, bottom: 0, left: 0, right: 0 }
});
await browser.close();
console.log(`PDF created at: ${pdfPath}`);
}
async function run() {
console.log("Starting Bank-Level Generation...");
if (!fs.existsSync(outputDir)) {
fs.mkdirSync(outputDir, { recursive: true });
}
await generateBankLevelPptx();
await generateBankLevelPdf();
console.log("Documents successfully completed in docs/");
}
run().catch(console.error);
|