cleanCommand(); // inutile parce qu'on ne boucle pas dans cette fonction if(!$Client) { echo "debug: annulation sélection client\n"; return [0, null]; // menu principal } } // -- partie 2: la prestation -- // niveau 2: type comptable d'enregistrement: devis, facture, cesu, location ou prestation non vendue $choix_niv2 = exec($MenuEnregistrement->get()); if($choix_niv2 === '') { echo "debug: annulation menu enregistrement\n"; return [0, null]; // menu principal } // calendrier - étape 1/3 $date_array = explode('/', exec($Calendrier->get())); // 17/10/2026 if(count($date_array) === 1){ echo "debug: annulation à la saisie d'une date\n"; return [2, $Client]; } // formulaire - étape 2/3 switch($choix_niv2) { // comparaison du retour de $MenuEnregistrement->get() avec les noms des entrées du même menu case ZenitySetup::$menu_enregistrement['entrees'][0]: // "Devis" $Presta = new Devis($Client); $answers = exec($FormulaireDevis->get()); break; case ZenitySetup::$menu_enregistrement['entrees'][1]: // "Facture" $Presta = new Facture($Client, false); $answers = exec($FormulaireFacture->get()); break; case ZenitySetup::$menu_enregistrement['entrees'][2]: // "Facture à partir d'un 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 } $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" $Presta = new CESU($Client); $answers = exec($FormulaireCesu->get()); break; case ZenitySetup::$menu_enregistrement['entrees'][4]: // "Location" $Presta = new Location($Client); $answers = exec($FormulaireLocation->get()); break; case ZenitySetup::$menu_enregistrement['entrees'][5]: // "Prestation 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 == ''){ echo "debug: pas de commentaire saisi\n"; // on n'interrompt pas le script et on enregistre dans tous les cas (annulation comprise) } // 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 // solution partielle si echo $? ne renvoit rien, c'est qu'echo n'a pas été exécuté parce qu'on a appuyé sur échap (ou que le programme) // 2>&1 semble inutile, pas de sortie d'erreur de zenity --entry //~ if(exec('echo $?') != 1) //~ { //~ echo "debug: annulation à la saisie d'un commentaire\n"; //~ return 0; //~ } $Presta->setCommentaires($comment); // enregistrement // déléguer la synchronisation (flush) avec la BDD à une classe "Manager"? Prestation::$entityManager->persist($Presta); Prestation::$entityManager->flush(); // -- partie 3: LaTeX -- // fabrique d'objets enfants de Latex (sans connaître les noms des classes) $EnveloppeRecto = Latex::makeInstance('enveloppe_recto'); $EnveloppeVerso = Latex::makeInstance('enveloppe_verso'); $DocumentPresta = Latex::makeInstance($Presta->getTypePresta()); // retourne objet ou null // génération du latex $EnveloppeRecto->setData($Client); $EnveloppeRecto->makeLatex(); $EnveloppeVerso->makeLatex(); if($DocumentPresta !== null){ // facture, devis ou location $DocumentPresta->setData($Client)->setData($Presta); $DocumentPresta->makeLatex(); } // création des fichiers $EnveloppeRecto->makeTexAndPdf(); $EnveloppeVerso->makeTexAndPdf(); if($DocumentPresta !== null){ $DocumentPresta->makeTexAndPdf(); } // -- partie 4: récapitulatif -- // tableau récaptilatif // ZenityList // imprimer? //~ $imprimer_facture = exec('zenity --question --width=250 --title="Base de données mise à jour" --text="Imprimer la facture?"'); //~ $imprimer_enveloppe = exec('zenity --question --width=250 --title="Base de données mise à jour" --text="Imprimer l\'adresse sur une enveloppe? (insérer une enveloppe DL sans fenêtre dans l\'imprimante"'); // ? modifications avec le menu de la section 3 obtenu avec makeModifyCustomerWindow() // -- partie 5: on fait quoi maintenant -- $choix_niv2 = exec($FinSection2->get()); if($choix_niv2 === ZenitySetup::$fin_section_2['entrees'][0]) // afficher le document { return [4, null]; // section 4: getDocument() } elseif($choix_niv2 === ZenitySetup::$fin_section_2['entrees'][1]) // modifier les informations { return [3, $Client]; // section 3: modifyData() } elseif($choix_niv2 === ZenitySetup::$fin_section_2['entrees'][2]) // enregistrer une autre prestation (même client) { return [2, $Client]; // relancer section 2: newService() } elseif($choix_niv2 === ZenitySetup::$fin_section_2['entrees'][3]) // enregistrer une autre prestation (autre client) { return [2, null]; // relancer section 2: newService() } else { return [0, null]; // menu principal } return [0, null]; // menu principal }