From 22b941b3526dd3aaf6976eb4ed30aa2ecc30f921 Mon Sep 17 00:00:00 2001 From: polo Date: Thu, 22 Jun 2023 15:22:23 +0200 Subject: factorisation 1_new_service.php vers functions.php --- README.txt | 2 +- data/dev.sqlite | Bin 36864 -> 36864 bytes src/Config.php | 4 +- src/Dates.php | 2 +- src/Latex.php | 2 +- src/dependances.php | 2 +- src/functions.php | 172 +++++++++++++++++++++++++++----------- src/main.php | 42 ++++++---- src/model/CESU.php | 2 +- src/model/Clients.php | 2 +- src/model/DB.php | 2 +- src/model/DevisFactures.php | 2 +- src/model/File.php | 7 ++ src/model/Locations.php | 2 +- src/model/Model.php | 2 +- src/model/Prestations.php | 2 +- src/model/StructTablesDB.php | 2 +- src/model/traits.php | 2 +- src/sections/1_new_service.php | 153 +++++++-------------------------- src/sections/2_modify_service.php | 9 -- src/sections/2_quotations.php | 9 ++ src/sections/3_modify_service.php | 9 ++ src/view/Zenity.php | 2 +- src/view/ZenitySetup.php | 9 +- 24 files changed, 224 insertions(+), 218 deletions(-) create mode 100644 src/model/File.php delete mode 100644 src/sections/2_modify_service.php create mode 100644 src/sections/2_quotations.php create mode 100644 src/sections/3_modify_service.php diff --git a/README.txt b/README.txt index d454b27..172bbb0 100644 --- a/README.txt +++ b/README.txt @@ -3,7 +3,7 @@ Ce programme est destiné à un usage privé et hors-ligne, il ne nécessite pas de déclaration à la CNIL. Il ne comporte aucune fonctionnalité réseau, ni aucune sécurité. L'utilisateur est responsable des informations enregistrées, -lesquelles ne sont destinées sortir de son ordinteur. +lesquelles ne sont pas destinées sortir de son ordinteur. OS compatible: diff --git a/data/dev.sqlite b/data/dev.sqlite index dce37bd..c933839 100644 Binary files a/data/dev.sqlite and b/data/dev.sqlite differ diff --git a/src/Config.php b/src/Config.php index 3e2b204..b4f8e5b 100644 --- a/src/Config.php +++ b/src/Config.php @@ -49,8 +49,8 @@ class Config { if(self::checkPath($field, $value)) { - $value = self::slashAtEndOfPath($value); - self::$$field = $value; + self::$$field = self::slashAtEndOfPath($value); + //self::$$field = $value; } } else // tester le reste? diff --git a/src/Dates.php b/src/Dates.php index ff6e318..eb57ca8 100644 --- a/src/Dates.php +++ b/src/Dates.php @@ -1,5 +1,5 @@ get()) == '0') // $? = 0 signifie oui, double égal == pour le transtypage + { + echo "choix: recherche d'une client\n"; + $input = exec($RechercheClient->get()); + if($input == '') + { + echo "debug: recherche annulée ou saisie vide\n"; + return 0; + } + + echo "debug: recherche effectuée\n"; + $ResultatsRechercheClient->setListRows(rechercheClient($input, $Client), $Client->getTable()); // recherche silencieuse + + // sélection parmi les résultats + $input = exec($ResultatsRechercheClient->get()); // renvoie l'ID de la table 'clients' + $ResultatsRechercheClient->cleanCommand(); + + if($input == '') + { + echo "debug: client pas trouvé ou pas sélectionné\n"; + return 0; + } + + echo "debug: client sélectionné\n"; + $Client->hydrate($Client->findById($input)); + $client_inconnu = false; + } + else + { + echo "choix: nouveau client\n"; + } + + // on n'a pas cherché OU on n'a pas trouvé + if($client_inconnu) + { + $input = exec($NouveauClient->get()); + if($input == '') + { + echo "debug: annulation lors de l'enregistrement d'un nouveau client\n"; + return 0; + } + if(!$Client->hydrateFromForm($input)) + { + // messages d'erreur dans hydrateFromForm() + return 0; + } + unset($input); + $Client->create(); + $Client->setID(); // sans paramètre, exécute un $this->db->lastInsertId() + } + + return $Client; +} + // NOTE 1: en PHP les objets sont passés aux fonctions par référence par défaut, toutefois ce n'est pas entièrement vrai // NOTE 2: PHP n'a pas de pointeur mais des références, une référence est un alias qui ne contient pas l'objet lui-même // NOTE 3: la variable créée lors d'un "new" est elle-même une référence contenant un identifiant (= le pointeur?) @@ -30,78 +96,65 @@ function windowAppCommand(string $app, string $path = ''): string function rechercheClient(string $input, Clients $Client): array { $input_array = explode(' ', $input); // si plusieurs mot, on les recherche tous l'un après l'autre - $result = $Client->findByKeywords($input_array, 'prenom_nom'); // on obtient un tableau à deux dimensions avec les entrées trouvées return($result); } -function makeFolder(string $path) -{ - if(!file_exists($path)) - { - mkdir($path); - chmod($path, 0755); // droits en octal - } -} - -function makeLatexAndPdfDocument($documentType, Clients $Client = null, Prestations $Presta = null, $Details = null) // $Details peut être de type DevisFactures ou Locations +function makeLatexAndPdfDocument(Clients $Client = null, Prestations $Presta = null, $PrestaDetails = null) { $latex = ''; $year = ''; $data = []; - $file_name = $documentType . '.tex'; $latex_path = Config::$latex_path; $pdf_path = Config::$pdf_path; - // tableau associatif avec des données des différents objets - // note: la propriété 'commentaires' de $Presta écrase celle de $Client (pas grave, les clients n'ont pas besoin d'en avoir connaissance) - // encore une fois, ce programme est destiné à un usage privé et hors ligne, sans déclaration CNIL + // verso d'une enveloppe + $latex = makeLatex('enveloppe_verso'); // pas de données transmises, elles sont dans la classe Config + $file_name = 'enveloppe_verso.tex'; + makeFiles($latex_path, $pdf_path, $file_name, $latex); - if($Client == null) // verso d'une enveloppe - { - $latex = makeLatex($documentType); // pas de données transmises, elles sont dans la classe Config - $file_name = 'enveloppe_verso'; - } - else + if($Client !== null) { $data = $Client->getAll(); - if($Presta == null) // recto d'une enveloppe - { - $latex_path .= 'enveloppes_recto/'; - $pdf_path .= 'enveloppes_recto/'; - $data['code_postal'] = implode(' \ ', str_split($data['code_postal'])); // code postal avec 2 espaces entre chaque chiffre: 2 \ 9 \ 0 \ 0 \ 0 - $latex = makeLatex($documentType, $data); // injection des variables - $file_name = $Client->getCodeClient() . '.tex'; - } - else // facture, devis, location + // recto d'une enveloppe + $latex_recto_path = $latex_path . 'enveloppes_recto/'; + $pdf_verso_path = $pdf_path . 'enveloppes_recto/'; + $data['code_postal'] = implode(' \ ', str_split($data['code_postal'])); // code postal avec 2 espaces entre chaque chiffre: 2 \ 9 \ 0 \ 0 \ 0 + $latex = makeLatex('enveloppe_recto', $data); // injection des variables + $file_name = $Client->getCodeClient() . '.tex'; + makeFiles($latex_recto_path, $pdf_verso_path, $file_name, $latex); + + // facture, devis, location + if($Presta !== null && $PrestaDetails !== null) { - $data = array_merge($data, $Presta->getAll()); - $Date = new Dates($Presta->getDate()); // entrée = timestamp (doit être un "int"!!) - $year = $Date->getYear(); - - // créer un sous-dossier pour la nouvelle année - $latex_path .= $year . '/'; - $pdf_path .= $year . '/'; - - if($Details != null) + $type = $Presta->getTypePresta(); + $file_name = $type . '.tex'; + if($type === 'facture' || $type === 'devis' || $type === 'location') { - $data = array_merge($data, $Details->getAll()); + $data = array_merge($data, $Presta->getAll()); + $Date = new Dates($Presta->getDate()); // entrée = timestamp (doit être un "int"!!) + $year = $Date->getYear(); + $latex_year_path = $latex_path . $year . '/'; // un sous-dossier par année + $pdf_year_path = $pdf_path . $year . '/'; + $data = array_merge($data, $PrestaDetails->getAll()); + $latex = makeLatex($type, $data, $Date); // injection des variables + $file_name = $Presta->getCodePresta() . '.tex'; + makeFiles($latex_year_path, $pdf_year_path, $file_name, $latex); + } + elseif($type === 'cesu' || $type === 'non_vendue') + {} // pas de document + else + { + echo "debug: erreur génération latex, type de prestation \n"; + return 0; } - - $latex = makeLatex($documentType, $data, $Date); // injection des variables - $file_name = $Presta->getCodePresta() . '.tex'; } } - - // création des fichiers - makeFolder($latex_path); - makeFolder($pdf_path); - file_put_contents($latex_path. $file_name, $latex); // écriture du fichier - latexToPdf($latex_path, $file_name, $pdf_path); } -function makeLatex(string $documentType, array $data = [], Dates $Date = null) + +function makeLatex(string $type, array $data = [], Dates $Date = null) { $date = ''; if($Date != null) @@ -113,13 +166,30 @@ function makeLatex(string $documentType, array $data = [], Dates $Date = null) // on obtient la variable $latex avec ob_get_clean() // le include() ici, c'est du génie ou c'est moche ou les deux? // un nouveau fichier php est inséré à chaque itération - include('latex_templates/' . $documentType . '.php'); + include('latex_templates/' . $type . '.php'); // on retourne le buffer // normallement le code PHP inséré avec include est nettoyé en quittant la fonction return($latex); } +function makeFiles($latex_path, $pdf_path, $file_name, $latex) +{ + makeFolder($latex_path); + makeFolder($pdf_path); + file_put_contents($latex_path. $file_name, $latex); // écriture du fichier + latexToPdf($latex_path, $file_name, $pdf_path); +} + +function makeFolder(string $path) +{ + if(!file_exists($path)) + { + mkdir($path); + chmod($path, 0755); // droits en octal + } +} + // compilation à partir d'un fichier .tex function latexToPdf(string $latexPath, string $fileName, string $pdfPath) { diff --git a/src/main.php b/src/main.php index 2b2da84..13d77c3 100755 --- a/src/main.php +++ b/src/main.php @@ -1,13 +1,16 @@ #!/bin/php get()) == '0') // $? = 0 signifie oui, double égal == pour le transtypage + $Client = makeObjectCLient(); + if($Client === 0) { - echo "choix: recherche d'une client\n"; - $input = exec($RechercheClient->get()); - if($input == '') - { - echo "debug: recherche annulée ou saisie vide\n"; - return(0); - } - - echo "debug: recherche effectuée\n"; - $ResultatsRechercheClient->setListRows(rechercheClient($input, $Client), $Client->getTable()); // recherche silencieuse - unset($input); - - // niveau 4: sélection parmi les résultats - $choix_niv4 = exec($ResultatsRechercheClient->get()); // renvoie l'ID de la table 'clients' - $ResultatsRechercheClient->cleanCommand(); - - if($choix_niv4 == '') - { - echo "debug: client pas trouvé ou pas sélectionné\n"; - return(0); - } - - echo "debug: client sélectionné\n"; - $Client->hydrate($Client->findById($choix_niv4)); - $client_inconnu = false; - } - else - { - echo "choix: nouveau client\n"; - } - - // on n'a pas cherché OU on n'a pas trouvé - if($client_inconnu) - { - $input = exec($NouveauClient->get()); - if($input == '') - { - echo "debug: annulation lors de l'enregistrement d'un nouveau client\n"; - return(0); - } - if(!$Client->hydrateFromForm($input)) - { - // messages d'erreur dans hydrateFromForm() - return(0); - } - unset($input); - $Client->create(); - $Client->setID(); // sans paramètre, exécute un $this->db->lastInsertId() + return 0; // menu principal } @@ -87,7 +32,7 @@ function newService(): int // code de retour, si 0 retour menu principal, si 2 a if($choix_niv2 === '') { echo "debug: annulation menu enregistrement\n"; - return(0); // menu principal + return 0; // menu principal } $Presta = new Prestations($Client->getID()); @@ -98,7 +43,7 @@ function newService(): int // code de retour, si 0 retour menu principal, si 2 a if($Date->getDate() == '') // on n'a pas cliqué sur "annuler" { echo "debug: annulation à la saisie d'une date\n"; - return(0); // menu principal + return 0; // menu principal } $Presta->setDate($Date->getTimestamp()); // un entier pour la BDD @@ -106,47 +51,47 @@ function newService(): int // code de retour, si 0 retour menu principal, si 2 a switch($choix_niv2) { // formulaire - étape 2/3 - case ZenitySetup::$menu_enregistrement_entrees[0]: // "Devis" - $Details = new DevisFactures('devis'); - $Presta->setTypePresta('devis'); - $input = exec($FormulaireDevis->get()); - break; - case ZenitySetup::$menu_enregistrement_entrees[1]: // "Facture" - $Details = new DevisFactures('factures'); // 'factures' est le nom de la table, pas le type de presta + //~ case ZenitySetup::$menu_enregistrement_entrees[0]: // "Devis" + //~ $PrestaDetails = new DevisFactures('devis'); + //~ $Presta->setTypePresta('devis'); + //~ $input = exec($FormulaireDevis->get()); + //~ break; + case ZenitySetup::$menu_enregistrement_entrees[0]: // "Facture" + $PrestaDetails = new DevisFactures('factures'); // 'factures' est le nom de la table, pas le type de presta $Presta->setTypePresta('facture'); $input =exec($FormulaireFacture->get()); break; - case ZenitySetup::$menu_enregistrement_entrees[2]: // "CESU" - $Details = new CESU(); + case ZenitySetup::$menu_enregistrement_entrees[1]: // "CESU" + $PrestaDetails = new CESU(); $Presta->setTypePresta('cesu'); $input = exec($FormulaireCesu->get()); break; - case ZenitySetup::$menu_enregistrement_entrees[3]: // "Location" - $Details = new Locations(); + case ZenitySetup::$menu_enregistrement_entrees[2]: // "Location" + $PrestaDetails = new Locations(); $Presta->setTypePresta('location'); $input = exec($FormulaireLocation->get()); break; - case ZenitySetup::$menu_enregistrement_entrees[4]: // "Prestation non vendue" + case ZenitySetup::$menu_enregistrement_entrees[3]: // "Prestation non vendue" $Presta->setTypePresta('non_vendue'); break; default: // inutile normallement, cas déjà géré avant echo "debug: sortie du menu enregistrement incorrect\n"; - return(0); + return 0; } $Presta->makeCodePresta($Date, $Client->getCodeClient()); // d'un objet à l'autre - if($choix_niv2 != ZenitySetup::$menu_enregistrement_entrees[4]) // si presta non vendue, saut étape 3/3 + if($choix_niv2 != ZenitySetup::$menu_enregistrement_entrees[3]) // si presta non vendue, saut étape 3/3 { if($input == '') // annulation { echo "debug: annulation lors de l'enregistrement des détails de la prestation\n"; - return(0); + return 0; } - elseif(isset($Details) && !$Details->hydrateFromForm($input, $Presta)) // echec de l'hydratation + elseif(isset($PrestaDetails) && !$PrestaDetails->hydrateFromForm($input, $Presta)) // echec de l'hydratation { echo "debug: erreur de hydrateFromForm()\n"; // messages d'erreur à mettre ici ou dans hydrateFromForm()? - return(0); + return 0; } unset($input); } @@ -167,7 +112,7 @@ function newService(): int // code de retour, si 0 retour menu principal, si 2 a //~ if(exec('echo $?') != 1) //~ { //~ echo "debug: annulation à la saisie d'un commentaire\n"; - //~ return(0); + //~ return 0; //~ } $Presta->setCommentaires($input); unset($input); @@ -175,53 +120,17 @@ function newService(): int // code de retour, si 0 retour menu principal, si 2 a $Presta->create(); $Presta->setID(); // sans paramètre, exécute un $this->db->lastInsertId() - if(isset($Details)) // presta non vendue + if(isset($PrestaDetails)) // presta non vendue { - $Details->setIDPresta($Presta->getID()); // d'un objet à l'autre - $Details->create(); - $Details->setID(); // sans paramètre, exécute un $this->db->lastInsertId() + $PrestaDetails->setIDPresta($Presta->getID()); // d'un objet à l'autre + $PrestaDetails->create(); + $PrestaDetails->setID(); // sans paramètre, exécute un $this->db->lastInsertId() } // -- partie 3: LaTeX -- - // document de la prestation - switch($choix_niv2) - { - case ZenitySetup::$menu_enregistrement_entrees[0]: // "Devis" - $type = 'devis'; - makeLatexAndPdfDocument($type, $Client, $Presta, $Details); - break; - case ZenitySetup::$menu_enregistrement_entrees[1]: // "Facture" - $type = 'facture'; - makeLatexAndPdfDocument($type, $Client, $Presta, $Details); - break; - case ZenitySetup::$menu_enregistrement_entrees[2]: // "CESU" - // pas de facture - break; - case ZenitySetup::$menu_enregistrement_entrees[3]: // "Location" - $type = 'location'; - makeLatexAndPdfDocument($type, $Client, $Presta, $Details); - break; - case ZenitySetup::$menu_enregistrement_entrees[4]: // "Prestation non vendue" - // pas de facture - break; - default: // inutile normallement, cas déjà géré avant - echo "debug: sortie du menu enregistrement incorrect\n"; - return(0); - } - - // enveloppe recto - $type = 'enveloppe_recto'; - makeLatexAndPdfDocument($type, $Client); - - // le verso ne dépend pas du client mais de l'entreprise, dans la classe Config - if(!file_exists(Config::$pdf_path . 'enveloppe_verso.pdf')) - { - $type = 'enveloppe_verso'; - makeLatexAndPdfDocument($type); - } - + makeLatexAndPdfDocument($Client, $Presta, $PrestaDetails); // -- partie 4: récapitulatif -- @@ -237,10 +146,10 @@ function newService(): int // code de retour, si 0 retour menu principal, si 2 a // zenityQuestion if(exec($QuestionModifierPrestation->get()) == '0') { - return(2); // section 2 + return 3; // section "Modifier un enregistrement" } else { - return(0); // menu principal + return 0; // menu principal } } diff --git a/src/sections/2_modify_service.php b/src/sections/2_modify_service.php deleted file mode 100644 index 72e2605..0000000 --- a/src/sections/2_modify_service.php +++ /dev/null @@ -1,9 +0,0 @@ -get()); diff --git a/src/view/ZenitySetup.php b/src/view/ZenitySetup.php index cd7e364..b6d83f6 100644 --- a/src/view/ZenitySetup.php +++ b/src/view/ZenitySetup.php @@ -1,5 +1,5 @@