chore(quarkus-327): bump to Quarkus 3.27.3 LTS, rename quarkus-resteasy-reactive → quarkus-rest, fix testGetAuditQuestions map vs list, rename deprecated config keys
This commit is contained in:
393
src/main/java/dev/lions/audit/AuditDataInitializer.java
Normal file
393
src/main/java/dev/lions/audit/AuditDataInitializer.java
Normal file
@@ -0,0 +1,393 @@
|
||||
package dev.lions.audit;
|
||||
|
||||
import dev.lions.quote.ModuleCatalog;
|
||||
import jakarta.enterprise.context.ApplicationScoped;
|
||||
import jakarta.enterprise.event.Observes;
|
||||
import jakarta.inject.Inject;
|
||||
import jakarta.persistence.EntityManager;
|
||||
import jakarta.transaction.Transactional;
|
||||
import io.quarkus.runtime.StartupEvent;
|
||||
import java.util.Arrays;
|
||||
|
||||
/**
|
||||
* Initialisation des questions d'audit spécifiques aux PME ivoiriennes
|
||||
*/
|
||||
@ApplicationScoped
|
||||
public class AuditDataInitializer {
|
||||
|
||||
@Inject
|
||||
EntityManager em;
|
||||
|
||||
@Transactional
|
||||
public void initializeAuditQuestions(@Observes StartupEvent event) {
|
||||
// Vérifier si les questions existent déjà
|
||||
Long questionCount = em.createQuery("SELECT COUNT(q) FROM AuditQuestion q", Long.class)
|
||||
.getSingleResult();
|
||||
|
||||
if (questionCount == 0) {
|
||||
createCommercialQuestions();
|
||||
createStockQuestions();
|
||||
createComptabiliteQuestions();
|
||||
createRhQuestions();
|
||||
createInfrastructureQuestions();
|
||||
}
|
||||
|
||||
// Vérifier si le catalogue existe déjà
|
||||
Long catalogCount = em.createQuery("SELECT COUNT(m) FROM ModuleCatalog m", Long.class)
|
||||
.getSingleResult();
|
||||
|
||||
if (catalogCount == 0) {
|
||||
createModuleCatalog();
|
||||
}
|
||||
}
|
||||
|
||||
private void createCommercialQuestions() {
|
||||
// Question 1: Gestion des clients
|
||||
AuditQuestion q1 = new AuditQuestion();
|
||||
q1.setCategory("commercial");
|
||||
q1.setQuestion("Comment gérez-vous actuellement vos contacts clients ?");
|
||||
q1.setOptions(Arrays.asList(
|
||||
"Carnet papier ou fichier Excel basique",
|
||||
"Fichier Excel avec historique des contacts",
|
||||
"Logiciel de gestion simple (contacts + ventes)",
|
||||
"CRM complet avec suivi des opportunités",
|
||||
"CRM avancé avec automation marketing"
|
||||
));
|
||||
q1.setScores(Arrays.asList(1, 2, 3, 4, 5));
|
||||
q1.setWeight(3);
|
||||
q1.setDisplayOrder(1);
|
||||
q1.setRecommendation("Un CRM adapté améliore la relation client et augmente les ventes de 20-30%");
|
||||
em.persist(q1);
|
||||
|
||||
// Question 2: Facturation
|
||||
AuditQuestion q2 = new AuditQuestion();
|
||||
q2.setCategory("commercial");
|
||||
q2.setQuestion("Comment établissez-vous vos factures ?");
|
||||
q2.setOptions(Arrays.asList(
|
||||
"Factures manuscrites ou Word/Excel",
|
||||
"Modèle Excel avec calculs automatiques",
|
||||
"Logiciel de facturation simple",
|
||||
"Système intégré (devis → facture → paiement)",
|
||||
"Facturation automatisée avec relances"
|
||||
));
|
||||
q2.setScores(Arrays.asList(1, 2, 3, 4, 5));
|
||||
q2.setWeight(3);
|
||||
q2.setDisplayOrder(2);
|
||||
q2.setRecommendation("La facturation automatisée réduit les erreurs et accélère les paiements");
|
||||
em.persist(q2);
|
||||
|
||||
// Question 3: Suivi des ventes
|
||||
AuditQuestion q3 = new AuditQuestion();
|
||||
q3.setCategory("commercial");
|
||||
q3.setQuestion("Avez-vous une visibilité sur vos performances commerciales ?");
|
||||
q3.setOptions(Arrays.asList(
|
||||
"Aucun suivi régulier",
|
||||
"Calculs manuels mensuels",
|
||||
"Tableaux de bord Excel",
|
||||
"Rapports automatiques hebdomadaires",
|
||||
"Dashboard temps réel avec KPI"
|
||||
));
|
||||
q3.setScores(Arrays.asList(1, 2, 3, 4, 5));
|
||||
q3.setWeight(2);
|
||||
q3.setDisplayOrder(3);
|
||||
em.persist(q3);
|
||||
|
||||
// Question 4: Gestion des devis
|
||||
AuditQuestion q4 = new AuditQuestion();
|
||||
q4.setCategory("commercial");
|
||||
q4.setQuestion("Comment gérez-vous vos devis et propositions commerciales ?");
|
||||
q4.setOptions(Arrays.asList(
|
||||
"Devis manuscrits ou Word",
|
||||
"Modèles Excel personnalisables",
|
||||
"Logiciel de devis avec bibliothèque",
|
||||
"Système intégré avec signature électronique",
|
||||
"Configurateur automatique avec approbation workflow"
|
||||
));
|
||||
q4.setScores(Arrays.asList(1, 2, 3, 4, 5));
|
||||
q4.setWeight(2);
|
||||
q4.setDisplayOrder(4);
|
||||
em.persist(q4);
|
||||
}
|
||||
|
||||
private void createStockQuestions() {
|
||||
// Question 1: Inventaire
|
||||
AuditQuestion q1 = new AuditQuestion();
|
||||
q1.setCategory("stock");
|
||||
q1.setQuestion("Comment suivez-vous vos stocks ?");
|
||||
q1.setOptions(Arrays.asList(
|
||||
"Comptage manuel périodique",
|
||||
"Fichier Excel mis à jour manuellement",
|
||||
"Logiciel de stock simple",
|
||||
"Système avec codes-barres",
|
||||
"Gestion automatisée avec alertes"
|
||||
));
|
||||
q1.setScores(Arrays.asList(1, 2, 3, 4, 5));
|
||||
q1.setWeight(3);
|
||||
q1.setDisplayOrder(1);
|
||||
em.persist(q1);
|
||||
|
||||
// Question 2: Approvisionnement
|
||||
AuditQuestion q2 = new AuditQuestion();
|
||||
q2.setCategory("stock");
|
||||
q2.setQuestion("Comment planifiez-vous vos achats et approvisionnements ?");
|
||||
q2.setOptions(Arrays.asList(
|
||||
"Achats au feeling quand stock bas",
|
||||
"Planning mensuel basique",
|
||||
"Calculs de stock minimum",
|
||||
"Prévisions basées sur l'historique",
|
||||
"Optimisation automatique avec IA"
|
||||
));
|
||||
q2.setScores(Arrays.asList(1, 2, 3, 4, 5));
|
||||
q2.setWeight(2);
|
||||
q2.setDisplayOrder(2);
|
||||
em.persist(q2);
|
||||
|
||||
// Question 3: Valorisation
|
||||
AuditQuestion q3 = new AuditQuestion();
|
||||
q3.setCategory("stock");
|
||||
q3.setQuestion("Connaissez-vous la valeur exacte de votre stock ?");
|
||||
q3.setOptions(Arrays.asList(
|
||||
"Estimation approximative",
|
||||
"Calcul manuel périodique",
|
||||
"Valorisation Excel",
|
||||
"Valorisation automatique temps réel",
|
||||
"Analyse de rotation et obsolescence"
|
||||
));
|
||||
q3.setScores(Arrays.asList(1, 2, 3, 4, 5));
|
||||
q3.setWeight(2);
|
||||
q3.setDisplayOrder(3);
|
||||
em.persist(q3);
|
||||
}
|
||||
|
||||
private void createComptabiliteQuestions() {
|
||||
// Question 1: Tenue comptable
|
||||
AuditQuestion q1 = new AuditQuestion();
|
||||
q1.setCategory("comptabilite");
|
||||
q1.setQuestion("Comment tenez-vous votre comptabilité ?");
|
||||
q1.setOptions(Arrays.asList(
|
||||
"Cahiers manuscrits",
|
||||
"Excel avec saisie manuelle",
|
||||
"Logiciel comptable simple",
|
||||
"Logiciel intégré avec automatisation",
|
||||
"ERP complet avec expert-comptable connecté"
|
||||
));
|
||||
q1.setScores(Arrays.asList(1, 2, 3, 4, 5));
|
||||
q1.setWeight(3);
|
||||
q1.setDisplayOrder(1);
|
||||
em.persist(q1);
|
||||
|
||||
// Question 2: Déclarations fiscales
|
||||
AuditQuestion q2 = new AuditQuestion();
|
||||
q2.setCategory("comptabilite");
|
||||
q2.setQuestion("Comment gérez-vous vos obligations fiscales (TVA, IS, etc.) ?");
|
||||
q2.setOptions(Arrays.asList(
|
||||
"Calculs manuels avec expert-comptable",
|
||||
"Excel avec formules de calcul",
|
||||
"Logiciel avec aide au calcul",
|
||||
"Génération automatique des déclarations",
|
||||
"Télédéclaration automatisée"
|
||||
));
|
||||
q2.setScores(Arrays.asList(1, 2, 3, 4, 5));
|
||||
q2.setWeight(3);
|
||||
q2.setDisplayOrder(2);
|
||||
em.persist(q2);
|
||||
|
||||
// Question 3: Analyse financière
|
||||
AuditQuestion q3 = new AuditQuestion();
|
||||
q3.setCategory("comptabilite");
|
||||
q3.setQuestion("Avez-vous une vision claire de votre situation financière ?");
|
||||
q3.setOptions(Arrays.asList(
|
||||
"Bilan annuel uniquement",
|
||||
"Situation trimestrielle",
|
||||
"Tableaux de bord mensuels",
|
||||
"Reporting automatique hebdomadaire",
|
||||
"Dashboard temps réel avec prévisions"
|
||||
));
|
||||
q3.setScores(Arrays.asList(1, 2, 3, 4, 5));
|
||||
q3.setWeight(2);
|
||||
q3.setDisplayOrder(3);
|
||||
em.persist(q3);
|
||||
}
|
||||
|
||||
private void createRhQuestions() {
|
||||
// Question 1: Gestion du personnel
|
||||
AuditQuestion q1 = new AuditQuestion();
|
||||
q1.setCategory("rh");
|
||||
q1.setQuestion("Comment gérez-vous les dossiers de vos employés ?");
|
||||
q1.setOptions(Arrays.asList(
|
||||
"Dossiers papier classés",
|
||||
"Fichiers Excel par employé",
|
||||
"Logiciel RH basique",
|
||||
"SIRH avec self-service employé",
|
||||
"SIRH complet avec workflow"
|
||||
));
|
||||
q1.setScores(Arrays.asList(1, 2, 3, 4, 5));
|
||||
q1.setWeight(2);
|
||||
q1.setDisplayOrder(1);
|
||||
em.persist(q1);
|
||||
|
||||
// Question 2: Paie et CNPS
|
||||
AuditQuestion q2 = new AuditQuestion();
|
||||
q2.setCategory("rh");
|
||||
q2.setQuestion("Comment calculez-vous la paie et les cotisations CNPS ?");
|
||||
q2.setOptions(Arrays.asList(
|
||||
"Calculs manuels",
|
||||
"Excel avec formules",
|
||||
"Logiciel de paie simple",
|
||||
"Paie automatisée avec déclarations",
|
||||
"Intégration complète CNPS/DGI"
|
||||
));
|
||||
q2.setScores(Arrays.asList(1, 2, 3, 4, 5));
|
||||
q2.setWeight(3);
|
||||
q2.setDisplayOrder(2);
|
||||
em.persist(q2);
|
||||
|
||||
// Question 3: Gestion des congés
|
||||
AuditQuestion q3 = new AuditQuestion();
|
||||
q3.setCategory("rh");
|
||||
q3.setQuestion("Comment gérez-vous les demandes de congés ?");
|
||||
q3.setOptions(Arrays.asList(
|
||||
"Demandes papier",
|
||||
"Email et validation manuelle",
|
||||
"Fichier Excel partagé",
|
||||
"Système de workflow digital",
|
||||
"Application mobile avec approbation"
|
||||
));
|
||||
q3.setScores(Arrays.asList(1, 2, 3, 4, 5));
|
||||
q3.setWeight(1);
|
||||
q3.setDisplayOrder(3);
|
||||
em.persist(q3);
|
||||
}
|
||||
|
||||
private void createInfrastructureQuestions() {
|
||||
// Question 1: Équipement informatique
|
||||
AuditQuestion q1 = new AuditQuestion();
|
||||
q1.setCategory("infrastructure");
|
||||
q1.setQuestion("Quel est l'état de votre parc informatique ?");
|
||||
q1.setOptions(Arrays.asList(
|
||||
"Ordinateurs anciens (>5 ans), pas de réseau",
|
||||
"Mix d'ordinateurs, réseau basique",
|
||||
"Parc récent, réseau WiFi, serveur local",
|
||||
"Infrastructure moderne, cloud hybride",
|
||||
"Infrastructure cloud-native sécurisée"
|
||||
));
|
||||
q1.setScores(Arrays.asList(1, 2, 3, 4, 5));
|
||||
q1.setWeight(2);
|
||||
q1.setDisplayOrder(1);
|
||||
em.persist(q1);
|
||||
|
||||
// Question 2: Sauvegardes
|
||||
AuditQuestion q2 = new AuditQuestion();
|
||||
q2.setCategory("infrastructure");
|
||||
q2.setQuestion("Comment protégez-vous vos données importantes ?");
|
||||
q2.setOptions(Arrays.asList(
|
||||
"Aucune sauvegarde régulière",
|
||||
"Copies manuelles sur clé USB",
|
||||
"Sauvegarde externe périodique",
|
||||
"Sauvegarde automatique cloud",
|
||||
"Sauvegarde redondante avec plan de reprise"
|
||||
));
|
||||
q2.setScores(Arrays.asList(1, 2, 3, 4, 5));
|
||||
q2.setWeight(3);
|
||||
q2.setDisplayOrder(2);
|
||||
em.persist(q2);
|
||||
|
||||
// Question 3: Sécurité
|
||||
AuditQuestion q3 = new AuditQuestion();
|
||||
q3.setCategory("infrastructure");
|
||||
q3.setQuestion("Quelles mesures de sécurité informatique avez-vous ?");
|
||||
q3.setOptions(Arrays.asList(
|
||||
"Antivirus basique uniquement",
|
||||
"Antivirus + mots de passe",
|
||||
"Sécurité réseau + formation utilisateurs",
|
||||
"Sécurité multicouche + monitoring",
|
||||
"Sécurité enterprise avec audit régulier"
|
||||
));
|
||||
q3.setScores(Arrays.asList(1, 2, 3, 4, 5));
|
||||
q3.setWeight(3);
|
||||
q3.setDisplayOrder(3);
|
||||
em.persist(q3);
|
||||
}
|
||||
|
||||
/**
|
||||
* Crée le catalogue des modules avec tarification
|
||||
*/
|
||||
private void createModuleCatalog() {
|
||||
// Module CRM Commercial
|
||||
ModuleCatalog crmModule = new ModuleCatalog("CRM", "Gestion Commerciale CRM", "commercial");
|
||||
crmModule.setDescription("Solution complète de gestion de la relation client avec suivi des prospects, opportunités et ventes");
|
||||
crmModule.setFeatures("• Gestion contacts et prospects\n• Pipeline de ventes\n• Suivi des opportunités\n• Facturation intégrée\n• Rapports commerciaux\n• Tableaux de bord");
|
||||
crmModule.setBasicPrice(150000.0); // 150K FCFA
|
||||
crmModule.setStandardPrice(250000.0); // 250K FCFA
|
||||
crmModule.setAdvancedPrice(400000.0); // 400K FCFA
|
||||
crmModule.setEnterprisePrice(650000.0); // 650K FCFA
|
||||
crmModule.setBaseImplementationDays(10);
|
||||
crmModule.setMaxUsers(50);
|
||||
crmModule.setSupportLevel("Email + Téléphone");
|
||||
crmModule.setTechnicalRequirements("Windows/Mac/Linux, Navigateur web moderne, 4GB RAM minimum");
|
||||
crmModule.setDisplayOrder(1);
|
||||
crmModule.setPopular(true);
|
||||
em.persist(crmModule);
|
||||
|
||||
// Module Gestion de Stock
|
||||
ModuleCatalog stockModule = new ModuleCatalog("STOCK", "Gestion des Stocks", "stock");
|
||||
stockModule.setDescription("Système de gestion des stocks avec codes-barres, inventaires et approvisionnements automatisés");
|
||||
stockModule.setFeatures("• Gestion multi-entrepôts\n• Codes-barres et QR codes\n• Inventaires automatisés\n• Alertes stock minimum\n• Prévisions d'achat\n• Valorisation FIFO/LIFO");
|
||||
stockModule.setBasicPrice(120000.0);
|
||||
stockModule.setStandardPrice(200000.0);
|
||||
stockModule.setAdvancedPrice(350000.0);
|
||||
stockModule.setEnterprisePrice(550000.0);
|
||||
stockModule.setBaseImplementationDays(8);
|
||||
stockModule.setMaxUsers(20);
|
||||
stockModule.setSupportLevel("Email + Téléphone");
|
||||
stockModule.setTechnicalRequirements("Windows/Mac/Linux, Lecteur codes-barres (optionnel), Imprimante étiquettes");
|
||||
stockModule.setDisplayOrder(2);
|
||||
em.persist(stockModule);
|
||||
|
||||
// Module Comptabilité
|
||||
ModuleCatalog comptaModule = new ModuleCatalog("COMPTA", "Comptabilité Intégrée", "comptabilite");
|
||||
comptaModule.setDescription("Comptabilité complète conforme aux normes ivoiriennes avec déclarations fiscales automatisées");
|
||||
comptaModule.setFeatures("• Plan comptable SYSCOHADA\n• Saisie automatisée\n• Déclarations TVA/IS\n• Bilan et compte de résultat\n• Rapports DGI\n• Intégration bancaire");
|
||||
comptaModule.setBasicPrice(180000.0);
|
||||
comptaModule.setStandardPrice(300000.0);
|
||||
comptaModule.setAdvancedPrice(500000.0);
|
||||
comptaModule.setEnterprisePrice(800000.0);
|
||||
comptaModule.setBaseImplementationDays(12);
|
||||
comptaModule.setMaxUsers(10);
|
||||
comptaModule.setSupportLevel("Email + Téléphone + Expert-comptable");
|
||||
comptaModule.setTechnicalRequirements("Windows/Mac/Linux, Connexion internet sécurisée, Sauvegarde automatique");
|
||||
comptaModule.setDisplayOrder(3);
|
||||
comptaModule.setPopular(true);
|
||||
em.persist(comptaModule);
|
||||
|
||||
// Module RH
|
||||
ModuleCatalog rhModule = new ModuleCatalog("RH", "Gestion des Ressources Humaines", "rh");
|
||||
rhModule.setDescription("SIRH complet avec paie, congés, formation et conformité CNPS");
|
||||
rhModule.setFeatures("• Dossiers employés\n• Calcul de paie CNPS\n• Gestion des congés\n• Formation et évaluation\n• Déclarations sociales\n• Self-service employé");
|
||||
rhModule.setBasicPrice(100000.0);
|
||||
rhModule.setStandardPrice(180000.0);
|
||||
rhModule.setAdvancedPrice(320000.0);
|
||||
rhModule.setEnterprisePrice(500000.0);
|
||||
rhModule.setBaseImplementationDays(6);
|
||||
rhModule.setMaxUsers(100);
|
||||
rhModule.setSupportLevel("Email + Téléphone");
|
||||
rhModule.setTechnicalRequirements("Windows/Mac/Linux, Connexion CNPS (optionnelle), Scanner documents");
|
||||
rhModule.setDisplayOrder(4);
|
||||
em.persist(rhModule);
|
||||
|
||||
// Module Infrastructure
|
||||
ModuleCatalog infraModule = new ModuleCatalog("INFRA", "Infrastructure IT", "infrastructure");
|
||||
infraModule.setDescription("Mise en place et sécurisation de l'infrastructure informatique avec sauvegarde cloud");
|
||||
infraModule.setFeatures("• Audit infrastructure\n• Sécurisation réseau\n• Sauvegarde automatique\n• Antivirus enterprise\n• Monitoring 24/7\n• Support technique");
|
||||
infraModule.setBasicPrice(200000.0);
|
||||
infraModule.setStandardPrice(350000.0);
|
||||
infraModule.setAdvancedPrice(600000.0);
|
||||
infraModule.setEnterprisePrice(1000000.0);
|
||||
infraModule.setBaseImplementationDays(5);
|
||||
infraModule.setMaxUsers(999);
|
||||
infraModule.setSupportLevel("Email + Téléphone + Intervention sur site");
|
||||
infraModule.setTechnicalRequirements("Réseau existant, Serveur ou Cloud, Postes de travail Windows/Mac");
|
||||
infraModule.setDisplayOrder(5);
|
||||
em.persist(infraModule);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user