From b0f06b1d7dc3a790d6d8babe5f0855c08c5f7878 Mon Sep 17 00:00:00 2001 From: polo Date: Tue, 20 Oct 2026 21:49:17 +0200 Subject: =?UTF-8?q?mise=20en=20place=20de=20l'h=C3=A9ritage=202,=20nombreu?= =?UTF-8?q?ses=20simplifications=20et=20factorisations?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/sections/2_service.php | 114 +++++++++++++++++------------------- src/sections/3-1_windows.php | 30 +--------- src/sections/3_modify_data.php | 128 +++++++++++++---------------------------- 3 files changed, 94 insertions(+), 178 deletions(-) (limited to 'src/sections') diff --git a/src/sections/2_service.php b/src/sections/2_service.php index dc16fe8..e2d64f2 100644 --- a/src/sections/2_service.php +++ b/src/sections/2_service.php @@ -5,11 +5,9 @@ function newService(?Client $Client = null): array { - // fenêtres recherche d'un client + // fenêtres $RechercheClient = new zenityEntry(ZenitySetup::$recherche_client['text']); $ResultatsRechercheClient = new ZenityList(ZenitySetup::$resultats_recherche_client['text'], []); - - // fenêtres $MenuEnregistrement = new ZenityList(ZenitySetup::$menu_enregistrement['text'], ZenitySetup::$menu_enregistrement['entrees']); $Calendrier = new ZenityCalendar(ZenitySetup::$calendar['section2']); $FormulaireDevis = new ZenityForms(ZenitySetup::$formulaire['text'], ZenitySetup::$formulaire['devis_entrees']); @@ -17,15 +15,16 @@ function newService(?Client $Client = null): array $FormulaireFactureReduit = new ZenityForms(ZenitySetup::$formulaire['text'], ZenitySetup::$formulaire['facture_entrees_reduit']); $FormulaireCesu = new ZenityForms(ZenitySetup::$formulaire['text'], ZenitySetup::$formulaire['cesu_entrees']); $FormulaireLocation = new ZenityForms(ZenitySetup::$formulaire['text'], ZenitySetup::$formulaire['location_entrees']); + $FormulaireNonVendue = new ZenityForms(ZenitySetup::$formulaire['text'], ZenitySetup::$formulaire['non_vendue_entrees']); $CommentairePrestation = new ZenityEntry(ZenitySetup::$commentaire_prestation['text']); //$Recapitulatif = new ZenityList(ZenitySetup::$recapitulatif_text, ZenitySetup::$recapitulatif_entrees); // tableau à multiples colonnes $FinSection2 = new ZenityList(ZenitySetup::$fin_section_2['text'], ZenitySetup::$fin_section_2['entrees']); - // -- partie 1: le client -- + // -- partie 1: rechercher un client -- if(!$Client) { - $Client = Client::find($RechercheClient, $ResultatsRechercheClient); // retourne un Client ou 0 + $Client = Client::find($RechercheClient, $ResultatsRechercheClient); //$ResultatsRechercheClient->cleanCommand(); // inutile parce qu'on ne boucle pas dans cette fonction if(!$Client) { @@ -51,69 +50,82 @@ function newService(?Client $Client = null): array echo "debug: annulation à la saisie d'une date\n"; return [2, $Client]; } - - $Presta = new Prestation($Client); - //var_dump($Client);die; - $Presta->setDate($date_array[2] . '-' . $date_array[1] . '-' . $date_array[0]); // 2026-10-17 - + + // formulaire - étape 2/3 switch($choix_niv2) { - // comparaison retour de $MenuEnregistrement->get() avec les noms des entrées du même menu + // comparaison du retour de $MenuEnregistrement->get() avec les noms des entrées du même menu case ZenitySetup::$menu_enregistrement['entrees'][0]: // "Devis" - $PrestaDetails = new Devis($Presta); - $Presta->setTypePresta('devis'); + $Presta = new Devis($Client); $answers = exec($FormulaireDevis->get()); break; case ZenitySetup::$menu_enregistrement['entrees'][1]: // "Facture" - $PrestaDetails = new Facture($Presta); - $Presta->setTypePresta('facture'); + $Presta = new Facture($Client, false); $answers = exec($FormulaireFacture->get()); break; case ZenitySetup::$menu_enregistrement['entrees'][2]: // "Facture à partir d'un devis" - // recherche du devis - $Quotation = Prestation::getServices($Client, 'devis'); // rechercher un devis, type 'devis' spécifié - if(!is_object($Quotation) || get_class($Quotation) != 'Prestation' || $Quotation->getTypePresta() != 'devis') - { + $Quotation = Prestation::getServices($Client, Devis::class); + if(!is_object($Quotation) || $Quotation->getTypePresta() != 'devis'){ echo "debug: annulation sélection client\n"; return [2, $Client]; // menu précédent } - $QuotationDetails = Devis::getQuotation($Quotation); - $PrestaDetails = new Facture($Presta); - $PrestaDetails->hydrateWithQuotation($QuotationDetails); // du devis à la facture - $Presta->setTypePresta('facture'); + $Presta = new Facture($Client, true); // true = à partir d'un devis + $Presta->hydrateWithQuotation($Quotation); // du devis à la facture $answers = exec($FormulaireFactureReduit->get()); break; case ZenitySetup::$menu_enregistrement['entrees'][3]: // "CESU" - $PrestaDetails = new CESU($Presta); - $Presta->setTypePresta('cesu'); + $Presta = new CESU($Client); $answers = exec($FormulaireCesu->get()); break; case ZenitySetup::$menu_enregistrement['entrees'][4]: // "Location" - $PrestaDetails = new Location($Presta); - $Presta->setTypePresta('location'); + $Presta = new Location($Client); $answers = exec($FormulaireLocation->get()); break; case ZenitySetup::$menu_enregistrement['entrees'][5]: // "Prestation non vendue" - $Presta->setTypePresta('non_vendue'); + $Presta = new NonVendue($Client); + $answers = exec($FormulaireNonVendue->get()); break; default: // inutile normallement, cas déjà géré avant echo "debug: sortie du menu enregistrement incorrect\n"; return [0, null]; } + $Presta->setDate($date_array[2] . '-' . $date_array[1] . '-' . $date_array[0]); // 2026-10-17 //$Presta->makeCodePresta($Date, $Client->getCodeClient()); // d'un objet à l'autre //$Presta->makeCodePresta($Client->getCodeClient()); // d'un objet à l'autre $Presta->setCodePresta(1); // d'un objet à l'autre + + if($Presta->getTypePresta() !== 'devis'){ + $Client->setType('client'); // changer prospect en client + } + + $answers = $Presta->cleanSpecialChars($answers); + + $data_array = $Presta->answersToArray($answers); + if(!$data_array){ // annulation + echo "debug: annulation lors de l'enregistrement des détails de la prestation\n"; + return [0, null]; + } + + // attention risque d'erreur! les données n'ont pas de d'identifiant! + // leur ordre et leur nombre permettent d'insérer la bonne info au bon endroit + // toute modif du modèle ou d'un formulaire doit être répèrcutée ici + if(!$Presta->validateForm($data_array)){ + echo "erreur: les données du formulaire sont incompatibles avec le modèle\n"; + return [0, null]; + } + + // hydratation avec la saisie du formulaire + $Presta->hydrate($data_array); // commentaire - étape 3/3 $comment = exec($CommentairePrestation->get()); - if($comment == '') - { + if($comment == ''){ echo "debug: pas de commentaire saisi\n"; - // on n'interrompt pas le script et on enregistre dans tous les cas (annulatation comprise) + // on n'interrompt pas le script et on enregistre dans tous les cas (annulation comprise) } - // Cliquer sur annuler (ou appuyer sur échap) revient dont à valider avec une chaîne vide et enregistrer la prestation + // Cliquer sur annuler (ou appuyer sur échap) revient donc à valider avec une chaîne vide et enregistrer la prestation // la commande 'echo $?' ($? est le code de sortie de la commande précédente) renvoit 1 si on annule avec la touche échap () // elle renvoit 0 si la fenêtre est fermée correctement, qu'on valide une chaîne vide ou qu'on clique sur Annuler (on ne peut pas savoir) // malheureusement, si les deux commandes sont liées par un '&&' et qu'on annule la saisie, la 2è commande n'est pas exécutée @@ -125,31 +137,11 @@ function newService(?Client $Client = null): array //~ return 0; //~ } $Presta->setCommentaires($comment); - - // hydratation avec la saisie du formulaire - if($choix_niv2 != ZenitySetup::$menu_enregistrement['entrees'][5]) // cas: tous les cas sauf presta non vendue - { - //var_dump($answers); - if($Presta->getTypePresta() !== 'devis'){ - $Client->setType('client'); - } - if($answers == '') // annulation - { - echo "debug: annulation lors de l'enregistrement des détails de la prestation\n"; - return [0, null]; - } - $PrestaDetails->hydrate($answers); - - // déléguer la synchronisation (flush) avec la BDD à une classe "Manager" - } - - // si encore de type prospect, devient un type client - // déjà fait ailleurs je crois! - /*if($Client->typeToClient()) // utile si $Client est renvoyé dans le "return" - { - $Client->updateOneValue('type', 'client'); // base synchronisée - }*/ - + + // enregistrement + // déléguer la synchronisation (flush) avec la BDD à une classe "Manager"? + Prestation::$entityManager->persist($Presta); + Prestation::$entityManager->flush(); // -- partie 3: LaTeX -- @@ -162,9 +154,8 @@ function newService(?Client $Client = null): array $EnveloppeRecto->setData($Client); $EnveloppeRecto->makeLatex(); $EnveloppeVerso->makeLatex(); - if($DocumentPresta !== null) - { - $DocumentPresta->setData($Client)->setData($Presta)->setData($PrestaDetails); + if($DocumentPresta !== null){ // facture, devis ou location + $DocumentPresta->setData($Client)->setData($Presta); $DocumentPresta->makeLatex(); } @@ -172,8 +163,7 @@ function newService(?Client $Client = null): array $EnveloppeRecto->makeTexAndPdf(); $EnveloppeVerso->makeTexAndPdf(); - if($DocumentPresta !== null) - { + if($DocumentPresta !== null){ $DocumentPresta->makeTexAndPdf(); } diff --git a/src/sections/3-1_windows.php b/src/sections/3-1_windows.php index 76d01dd..152c3d3 100644 --- a/src/sections/3-1_windows.php +++ b/src/sections/3-1_windows.php @@ -22,12 +22,12 @@ function makeModifyCustomerWindow(Client $Customer): ZenityList $entries[$i][] = ''; //~ $entries[$i][] = ZenitySetup::$modification_client['return']; //~ $entries[$i][] = ''; - $ModifyCustomer->setListRows($entries, 2, 2.5); + $ModifyCustomer->setListRows($entries, 2, 2.5); return $ModifyCustomer; } -function makeModifyServiceWindow(Prestation $Service, $ServiceDetails = null): ZenityList +function makeModifyServiceWindow(Prestation $Service): ZenityList { // fenêtre $ModifyService = new ZenityList(ZenitySetup::$modification_presta['text'], []); @@ -42,31 +42,7 @@ function makeModifyServiceWindow(Prestation $Service, $ServiceDetails = null): Z $entrees[$i][] = $value; $i++; } - - if(is_object($ServiceDetails)) - { - $presta_data = $ServiceDetails->getAllWithWindowFields(); - //var_dump($presta_data); - foreach($presta_data as $key => $value) - { - $entrees[$i][] = $key; - $entrees[$i][] = $value; - $i++; - } - } - - //~ if($Service->getTypePresta() === 'devis') - //~ { - //~ $entrees[$i][] = ZenitySetup::$modification_presta['devis_facture']; // option créer une facture à partir du devis - //~ $entrees[$i][] = ''; - //~ } - - //~ $entrees[$i][] = ZenitySetup::$modification_presta['service']; - //~ $entrees[$i][] = ''; - //~ $i++; - //~ $entrees[$i][] = ZenitySetup::$modification_presta['return']; - //~ $entrees[$i][] = ''; - + $ModifyService->setListRows($entrees, 2, 2.5); return $ModifyService; } diff --git a/src/sections/3_modify_data.php b/src/sections/3_modify_data.php index d70c7d6..5651ed3 100644 --- a/src/sections/3_modify_data.php +++ b/src/sections/3_modify_data.php @@ -7,16 +7,14 @@ require('3-1_windows.php'); function modifyData(?Client $Client = null): array { - // -- partie 1: rechercher un client -- - - // fenêtres statiques - // recherche d'un client + // fenêtres $RechercheClient = new zenityEntry(ZenitySetup::$recherche_client['text']); $ResultatsRechercheClient = new ZenityList(ZenitySetup::$resultats_recherche_client['text'], []); - // modification de données $TypeDeClient = new ZenityList(ZenitySetup::$type_client['text'], ZenitySetup::$type_client['entrees']); $Calendrier = new ZenityCalendar(ZenitySetup::$calendar['section3']); + + // -- partie 1: rechercher un client -- if(!$Client) { $Client = Client::find($RechercheClient, $ResultatsRechercheClient); @@ -93,120 +91,72 @@ function modifyData(?Client $Client = null): array // -- partie 3: rechercher une prestation -- - $Presta = Prestation::getServices($Client); // = 0 ou type "Prestation" + $Presta = Prestation::getServices($Client); if(!is_object($Presta) || !get_class($Presta) == 'Prestation') { echo "debug: annulation sélection d'une prestation\n"; return [3, $Client]; // menu précédent } $type_presta = $Presta->getTypePresta(); - $classe = ''; - switch($type_presta){ - case 'facture': - $classe = 'Facture'; - break; - case 'devis': - $classe = 'Devis'; - break; - case 'cesu': - $classe = 'CESU'; - break; - case 'location': - $classe = 'Location'; - break; - case 'non_vendue': - $PrestaDetails = null; - break; - default: - echo "erreur: type de prestation buggué\n"; - } - if($type_presta != 'non_vendue') - { - $repository = $classe::$entityManager->getRepository($classe); - $PrestaDetails = $repository->findOneBy(['presta' => $Presta->getId()]); - } + $classe = match($type_presta){ + 'facture' => Facture::class, + 'devis' => Devis::class, + 'cesu' => CESU::class, + 'location' => Location::class, + 'non_vendue' => NonVendue::class, + }; + + $repository = Prestation::$entityManager->getRepository($classe); + $Presta = $repository->findOneBy(['id' => $Presta->getId()]); // -- partie 4: modifier une prestation -- // fenêtre - $ModificationPrestaMenu = makeModifyServiceWindow($Presta, $PrestaDetails); - + $ModificationPrestaMenu = makeModifyServiceWindow($Presta); $choix_niv3 = exec($ModificationPrestaMenu->get()); - - if($choix_niv3 === 'Date:') - { + if($choix_niv3 === 'Date:'){ $date_array = explode('/', exec($Calendrier->get())); // 17/10/2026 if(count($date_array) === 1){ echo "debug: annulation à la saisie d'une date\n"; return [3, $Client]; } - - // entités et BDD - $Presta->set($choix_niv3, $date_array[2] . '-' . $date_array[1] . '-' . $date_array[0]); // 2026-10-09 - $old_code = $Presta->getCodePresta(); - $Presta->setCodePresta(0); - $Presta::$entityManager->flush(); - - // documents - if($type_presta === 'devis' || $type_presta === 'facture' || $type_presta === 'location') - { - $DocumentPresta = Latex::makeInstance($Presta->getTypePresta()); // $type = facture, devis, location - $DocumentPresta->setData($Client)->setData($Presta)->setData($PrestaDetails); - $DocumentPresta->makeLatex(); // en mémoire - - File::renameFiles($DocumentPresta, $old_code, $Presta->getCodePresta()); - $DocumentPresta->makeTexAndPdf(); // une nouvelle facture est créée, supprimer l'ancienne ou la renommer avec la nouvelle date - } - - return [3, $Client]; // menu précédent + $input = $date_array[2] . '-' . $date_array[1] . '-' . $date_array[0]; // 2026-10-17 } //~ elseif($choix_niv3 === 'Type de Presta:') // compliqué! choix impossible pour le moment //~ { //~ echo "choix: changer le type de prestation (devis, facture, etc)\n"; //~ return [3, $Client]; // menu "client" //~ } - elseif(is_string($choix_niv3) && $choix_niv3 != '') // modifier une valeur - { + elseif(is_string($choix_niv3) && $choix_niv3 != ''){ // modifier une valeur echo "choix: modifier " . $choix_niv3 . "\n"; $ModificationPrestaForm = new ZenityEntry($choix_niv3); $input = shell_exec($ModificationPrestaForm->get()); // shell_exec() retourne null si la commande échoue, exec() retourne la dernière ligne de texte en sortie ou null si aucune commande ne réussit - if(is_string($input)) // chaîne vide autorisée - { - // entités et BDD - $Presta->set($choix_niv3, $input); - $old_code = $Presta->getCodePresta(); - $Presta->setCodePresta(0); - if($type_presta != 'non_vendue') - { - $PrestaDetails->set($choix_niv3, $input); - $PrestaDetails::$entityManager->flush(); - } - else - { - $Presta::$entityManager->flush(); - } - - // documents - if($type_presta === 'devis' || $type_presta === 'facture' || $type_presta === 'location') - { - $DocumentPresta = Latex::makeInstance($type_presta); - $DocumentPresta->setData($Client)->setData($Presta)->setData($PrestaDetails); // polymorphisme - $DocumentPresta->makeLatex(); - - File::renameFiles($DocumentPresta, $old_code, $Presta->getCodePresta()); - $DocumentPresta->makeTexAndPdf(); - } - } - else - { + if(!is_string($input)){ // chaîne vide autorisée echo "choix: annulation\n"; + return [3, $Client]; // menu précédent } - return [3, $Client]; // menu précédent } - else // annuler - { + else{ echo "annulation: retour au menu précédent\n"; return [3, $Client]; // menu précédent } + + // entités et BDD + $Presta->set($choix_niv3, $input); + $old_code = $Presta->getCodePresta(); + $Presta->setCodePresta(0); + $Presta::$entityManager->flush(); + + // documents + if($type_presta === 'devis' || $type_presta === 'facture' || $type_presta === 'location'){ + $DocumentPresta = Latex::makeInstance($type_presta); + $DocumentPresta->setData($Client)->setData($Presta); + $DocumentPresta->makeLatex(); + + File::renameFiles($DocumentPresta, $old_code, $Presta->getCodePresta()); + $DocumentPresta->makeTexAndPdf(); + } + + return [3, $Client]; // menu précédent } -- cgit v1.2.3