From 945af9fda5146405ab9903d4d268bcb2fe95da25 Mon Sep 17 00:00:00 2001 From: polo Date: Tue, 10 Jan 2023 13:08:54 +0100 Subject: enregistrement section 1 --- data/ordipolo.sqlite | Bin 32768 -> 32768 bytes src/functions.php | 35 +--- src/main.php | 37 ++-- src/model/Clients.php | 65 +++---- src/model/DevisFactures.php | 102 ++++++----- src/model/Model.php | 30 ++-- src/model/Prestations.php | 73 ++++---- src/model/StructTablesDB.php | 3 +- src/model/traits.php | 83 ++++++++- src/sections/1_new_service.php | 354 +++++++++++++++++--------------------- src/sections/2_modify_service.php | 9 + src/view/ZenitySetup.php | 9 +- 12 files changed, 417 insertions(+), 383 deletions(-) create mode 100644 src/sections/2_modify_service.php diff --git a/data/ordipolo.sqlite b/data/ordipolo.sqlite index 2c76848..094294b 100644 Binary files a/data/ordipolo.sqlite and b/data/ordipolo.sqlite differ diff --git a/src/functions.php b/src/functions.php index bdcd594..0ec280f 100644 --- a/src/functions.php +++ b/src/functions.php @@ -22,42 +22,17 @@ function windowAppCommand(string $app, string $path = ''): string return $command; } -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); -} - // 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?) // NOTE 4: l'objet est détruit lorsque la dernière référence est supprimée -function controlFormInput(array $data): bool +function rechercheClient(string $input, Clients $Client): array { - $tableSize = count(StructTablesDB::$structureOfTables[$table]); // int - if($data !== '') - { - $dataArray = explode('|', $data); - - if(count($dataArray) === $tableSize - 1) // nombre de champs sauf ID qui est auto-incrémenté automatiquement - { - - - } - else - { - echo "debug: mauvais tableau, il doit avoir " . $tableSize - 1 . " cases\n"; - return false; - } - } - else - { - echo "debug: pas de données saisies\n"; - return false; - } + $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 getLatexFromTemplate(string $template) diff --git a/src/main.php b/src/main.php index 12715f3..0a8ae09 100755 --- a/src/main.php +++ b/src/main.php @@ -43,38 +43,49 @@ require('view/ZenitySetup.php'); // texte dans les fenêtres ET instanciation (u require('Latex.php'); // générer le code LaTeX require('sections/1_new_service.php'); - +require('sections/2_modify_service.php'); // boucle principale $boucle = true; +$code_retour = 0; // 0 dirige vers le menu principal, 1 vers la section 1, etc while($boucle) { // niveau 1: menu principal - $MenuPrincipal = new ZenityList(ZenitySetup::$menu_principal_text, ZenitySetup::$menu_principal_entrees); - $choix_niv1 = exec($MenuPrincipal->get()); + if($code_retour === 0) + { + $MenuPrincipal = new ZenityList(ZenitySetup::$menu_principal_text, ZenitySetup::$menu_principal_entrees); + $choix_niv1 = exec($MenuPrincipal->get()); + } + else + { + $choix_niv1 = ''; + } + // -- SECTION 1: Nouvelle prestation -- - if($choix_niv1 === ZenitySetup::$menu_principal_entrees[0]) + if($choix_niv1 === ZenitySetup::$menu_principal_entrees[0] || $code_retour === 1) { echo("choix: $choix_niv1\n"); - newService(); + $code_retour = newService(); + echo "hello, code retour: " . $code_retour . "\n"; } // -- SECTION 2: Modifier un enregistrement -- - elseif($choix_niv1 === ZenitySetup::$menu_principal_entrees[1]) + elseif($choix_niv1 === ZenitySetup::$menu_principal_entrees[1] || $code_retour === 2) { echo("choix: $choix_niv1\n"); + $code_retour = modifyService(); } - // -- SECTION 3: Fichier clients -- - elseif($choix_niv1 === ZenitySetup::$menu_principal_entrees[2]) + // -- SECTION 3: Consulter/analyser les données -- + elseif($choix_niv1 === ZenitySetup::$menu_principal_entrees[2] || $code_retour === 3) { echo("choix: $choix_niv1\n"); - // quel affichage? un grand tableau avec zenity? une page web? un document LaTeX? + // quel affichage? des tableaux avec zenity? LaTeX? une page web? un autre outil servant à faire des tableaux et graphiques } - // -- SECTION 4: documents à imprimer -- - elseif($choix_niv1 === ZenitySetup::$menu_principal_entrees[3]) // = Créer/imprimer un document + // -- SECTION 4: Imprimer -- + elseif($choix_niv1 === ZenitySetup::$menu_principal_entrees[3] || $code_retour === 4) // = Imprimer un document { echo("choix: $choix_niv1\n"); $MenuDocuments = new ZenityList(ZenitySetup::$menu_documents_text, ZenitySetup::$menu_documents_entrees); @@ -110,7 +121,7 @@ while($boucle) } // -- SECTION 5: Supports de communication -- - elseif($choix_niv1 === ZenitySetup::$menu_principal_entrees[4]) // = Communication + elseif($choix_niv1 === ZenitySetup::$menu_principal_entrees[4] || $code_retour === 5) // = Communication { echo("choix: $choix_niv1\n"); $MenuCommunication = new ZenityList(ZenitySetup::$menu_communication_text, ZenitySetup::$menu_communication_entrees); @@ -134,7 +145,7 @@ while($boucle) } // -- SECTION 6: BDD -- - elseif($choix_niv1 === ZenitySetup::$menu_principal_entrees[5]) // = Base de données + elseif($choix_niv1 === ZenitySetup::$menu_principal_entrees[5] || $code_retour === 6) // = Base de données { echo("choix: $choix_niv1\n"); if($sqlitebrowser_enable) diff --git a/src/model/Clients.php b/src/model/Clients.php index aeb39c1..9661562 100644 --- a/src/model/Clients.php +++ b/src/model/Clients.php @@ -5,18 +5,18 @@ class Clients extends Model { // lecture des données ou hydratation protected $ID; // auto-incrémentée - protected $prenom_nom = ''; - protected $code_client = ''; - protected $adresse = ''; - protected $telephone = ''; - protected $courriel = ''; - protected $commentaires = ''; + protected $prenom_nom; + protected $code_client; + protected $adresse; + protected $telephone; + protected $courriel; + protected $commentaires; - use ModelChildren; // renseigne parent::table + use ModelChildren; // pour hydrateFromForm() public function __construct() { - $this->table = 'clients'; + $this->table = 'clients'; // à mettre dans ModelChildren } //~ public function set(string $variable, $value) @@ -36,59 +36,48 @@ class Clients extends Model } // setters - public function setID(int $value) // inutile? il s'autoincrémente - { - $this->ID = $value; - return($this); - } - public function setPrenom_nom(string $value) + //~ public function setID() -> dans le trait ModelChildren + + public function setPrenomNom($value) { - $this->prenom_nom = $value; + $this->prenom_nom = (string) $value; return($this); } - public function setCode_client(string $value) + public function setCodeClient($value) { - $this->code_client = $value; + $this->code_client = (string) $value; return($this); } - public function setAdresse(string $value) + public function setAdresse($value) { - $this->adresse = $value; + $this->adresse = (string) $value; return($this); } - public function setTelephone(string $value) // chaine parce que zenity renvoie une chaine et parce qu'on garde le 0 au début + public function setTelephone($value) // chaine parce que zenity renvoie une chaine et parce qu'on garde le 0 au début { if(is_numeric($value)) { - $this->telephone = $value; + $this->telephone = (string) $value; + } + else + { + $this->telephone = ''; + echo 'debug: le champ "telephone" ne doit comporter que des nombres, aucun numéro ne sera utilisé' . "\n"; } return($this); } - public function setCourriel(string $value) + public function setCourriel($value) { - $this->courriel = $value; + $this->courriel = (string) $value; return($this); } - public function setCommentaires(string $value) + public function setCommentaires($value) { - $this->commentaires = $value; + $this->commentaires = (string) $value; return($this); } - public function newRow(array $input) - { - $this->hydrate(['prenom_nom' => $input[0], 'code_client' => $input[1], 'adresse' => $input[2], 'telephone' => $input[3], 'courriel' => $input[4], 'commentaires' => $input[5]]); - $this->create(); - // ID obtenu par auto-incrémentation - $this->ID = $this->db->lastInsertId(); // méthode de PDO - } - //~ public function setIdFromLastInsertID() // à faire juste après l'écriture d'une nouvelle entrée - //~ { - //~ $this->db = parent::getInstance(); // $db est créée dans Model::execQuery() - //~ $this->ID = $this->db->lastInsertId(); // méthode de PDO - //~ } - public function findByKeywords(array $keywords, string $field): array // n'hydrate pas les variables, on doit choisir un client et hydrater ensuite { $result = []; diff --git a/src/model/DevisFactures.php b/src/model/DevisFactures.php index 1ed3a5c..ff80960 100644 --- a/src/model/DevisFactures.php +++ b/src/model/DevisFactures.php @@ -3,49 +3,42 @@ class DevisFactures extends Model { + //~ public $type = ''; // deux tables séparées devis ou factures + // lecture des données ou hydratation - private $ID_devis_facture; // auto-incrémentée - private $ID_presta = 0; - private $validite_devis; - private $signature_devis; - private $taches; - private $machine; - private $OS; - private $donnees; - private $cles_licences; - private $total_main_d_oeuvre; - private $pieces; - private $total_pieces; - private $deplacement; - private $total_HT; + protected $ID; // auto-incrémentée + protected $ID_presta; + protected $taches; + protected $machine; + protected $OS; + protected $donnees; + protected $cles_licences; + protected $temps; + protected $total_main_d_oeuvre; + protected $pieces; + protected $total_pieces; + protected $deplacement; + protected $total_HT; + protected $validite_devis; + protected $signature_devis; - //~ use ModelChildren; + use ModelChildren; // pour hydrateFromForm() - public function __construct(int $ID_presta) + public function __construct(int $ID_presta, string $table) { - $this->table = 'devisfactures'; $this->ID_presta = $ID_presta; + $this->table = $table; // deux tables séparées devis et factures } // setters - public function setIDDevisFacture(int $value = 0) - { - if($value === 0) - { - $this->ID_devis_facture = $this->db->lastInsertId(); // méthode de PDO - } - else - { - $this->ID_devis_facture = $value; - } - return($this); - } + //~ public function setID() -> dans le trait ModelChildren + public function setIDPresta(int $value) { $this->ID_presta = $value; return($this); } - public function setValiditeDdevis(string $value) + public function setValiditedevis(string $value) { $this->validite_devis = $value; return($this); @@ -80,9 +73,15 @@ class DevisFactures extends Model $this->cles_licences = $value; return($this); } - public function setTotalMainDOeuvre(float $value) + public function setTemps(string $value) { - $this->total_main_d_oeuvre = $value; + $this->temps = $value; + return($this); + } + public function setTotalMainDOeuvre($value) + { + $value = str_replace(',', '.', $value); + $this->total_main_d_oeuvre = (float) $value; // float "nettoie" tous les caractères après le dernier chiffre trouvé (ex: 50€ => 50, abc => 0) return($this); } public function setPieces(string $value) @@ -90,28 +89,39 @@ class DevisFactures extends Model $this->pieces = $value; return($this); } - public function setTotalPieces(float $value) + public function setTotalPieces($value) { - $this->total_pieces = $value; + $value = str_replace(',', '.', $value); + $this->total_pieces = (float) $value; return($this); } - public function setDeplacement(float $value) + public function setDeplacement($value) { - $this->deplacement = $value; + $value = str_replace(',', '.', $value); + $this->deplacement = (float) $value; return($this); } - public function setTotalHT(float $value) + public function setTotalHT($value) { - $this->total_HT = $value; + $value = str_replace(',', '.', $value); + $this->total_HT = (float) $value; return($this); } - public function newRow(array $input, array $quotations_input = []) - { - if(!empty($quotations_input)) // cas d'un devis - { - $this->hydrate(['validite_devis' => $quotations_input[0], 'signature_devis' => $quotations_input[1]]); - } - $this->hydrate([]); - } + //~ public function newRow(array $input) + //~ { + //~ if($this->table === 'devis') // comme la table 'factures' avec deux champs en plus + //~ { + //~ $this->hydrate(['ID' => $input[0], 'ID_presta' => $input[1], 'taches' => $input[2], 'machine' => $input[3], 'OS' => $input[4], 'donnees' => $input[5], 'cles_licences' => $input[6], 'total_main_d_oeuvre' => $input[7], 'pieces' => $input[8], 'total_pieces' => $input[9], 'deplacement' => $input[10], 'total_HT' => $input[11]], + //~ ['validite_devis' => $input[12], 'signature_devis' => $input[13]]); + //~ $this->hydrate(['validite_devis' => $quotations_input[0], 'signature_devis' => $quotations_input[1]]); + //~ } + //~ elseif($this->table === 'factures') + //~ { + //~ $this->hydrate(['ID' => $input[0], 'ID_presta' => $input[1], 'taches' => $input[2], 'machine' => $input[3], 'OS' => $input[4], 'donnees' => $input[5], 'cles_licences' => $input[6], 'total_main_d_oeuvre' => $input[7], 'pieces' => $input[8], 'total_pieces' => $input[9], 'deplacement' => $input[10], 'total_HT' => $input[11]]); + //~ } + //~ $this->hydrate(['ID' => $input[0], 'ID_presta' => $input[1], 'taches' => $input[2], 'machine' => $input[3], 'OS' => $input[4], 'donnees' => $input[5], 'cles_licences' => $input[6], 'total_main_d_oeuvre' => $input[7], 'pieces' => $input[8], 'total_pieces' => $input[9], 'deplacement' => $input[10], 'total_HT' => $input[11]]); + //~ $this->create(); + //~ $this->ID_devis_facture = $this->db->lastInsertId(); // méthode de PDO + //~ } } diff --git a/src/model/Model.php b/src/model/Model.php index 938e3dd..4c1fb4d 100644 --- a/src/model/Model.php +++ b/src/model/Model.php @@ -19,22 +19,26 @@ class Model extends DB return($this->table); } - // setters (plusieurs en même temps) - public function hydrate(array $data) // $data = tableau associatif en entrée: nom_du_champ => valeur + // setters + public function hydrate(array $data): bool // $data = tableau associatif en entrée: nom_du_champ => valeur { foreach($data as $key => $value) { - // nom d'un setter, forme "setMachin()" - $setterName = 'set' . ucfirst($key); // ucfirst met la première lettre en majuscule - // détection - if(method_exists($this, $setterName) && $value != NULL) // on trouve aussi la méthode is_callable() + // nom du setter + // nom_du_champ devient setNomDuChamp + // on sépare les mots par des espaces, ucwords met la première lettre de chaque mot en majuscule, puis on supprime les espaces + $setter_name = 'set' . str_replace(' ', '', ucwords(str_replace('_', ' ', $key))); // ucwords: première lettre de chaque mot en majuscule + if(method_exists($this, $setter_name)) { - //~ var_dump($value); - // on renseigne les propriétés des l'instance - $this->$setterName($value); // nom d'une méthode dans une variable + $this->$setter_name($value); } + else + { + echo "debug: la méthode $setter_name n'existe pas\n"; + return false; + } } - return($this); + return true; } @@ -47,6 +51,8 @@ class Model extends DB if($attributes !== null) // requête préparée { + var_dump($sql); + var_dump($attributes); $query = $this->db->prepare($sql); $query->execute($attributes); return $query; @@ -66,10 +72,12 @@ class Model extends DB $fields = []; $question_marks = []; // ? $values = []; + //~ var_dump($this); foreach($this as $field => $value) { + var_dump($field); var_dump($value); // champs non renseignées et variables de l'objet qui ne sont pas des champs - // note: avec le !== (au lieu de !=) une valeur 0 passe le filtre + // note: avec le !== (au lieu de !=) une valeur 0 est différente de null if($value !== null && $field != 'db' && $field != 'table') { $fields[] = $field; // push diff --git a/src/model/Prestations.php b/src/model/Prestations.php index cbe8e6c..2f84daa 100644 --- a/src/model/Prestations.php +++ b/src/model/Prestations.php @@ -4,66 +4,59 @@ class Prestations extends Model { // lecture des données ou hydratation - protected $ID_presta; // auto-incrémentée + protected $ID; // auto-incrémentée protected $ID_client = 0; - protected $combientieme_fois = 0; + //~ protected $combientieme_fois = 0; protected $code_presta = ''; protected $date = 0; // timestamp unix protected $type_presta = ''; protected $mode_paiement = ''; protected $commentaires = ''; - //~ use ModelChildren; + use ModelChildren; public function __construct(int $ID_client) { $this->table = 'prestations'; $this->ID_client = $ID_client; - $this->combientiemeFois(); + //~ $this->combientiemeFois(); } // getters - public function getIDPresta(): int + public function getID(): int { - return $this->ID_presta; + return $this->ID; } public function getIDClient(): int { return $this->ID_client; } - public function getCombientiemeFois(): int - { - return $this->combientieme_fois; - } + //~ public function getCombientiemeFois(): int + //~ { + //~ return $this->combientieme_fois; + //~ } public function getDate(): int { return $this->date; } - - // setters - public function setIDPresta(int $value = 0) + public function getTypePresta(): string { - if($value === 0) - { - $this->ID_presta = $this->db->lastInsertId(); // méthode de PDO - } - else - { - $this->ID_presta = $value; - } - return($this); + return $this->type_presta; } + + // setters + //~ public function setID() -> dans le trait ModelChildren public function setIDClient(int $value) { $this->ID_client = $value; return($this); } - public function setCombientiemeFois(int $value) - { - $this->combientieme_fois = $value; - return($this); - } + //~ public function setCombientiemeFois(int $value) + //~ { + //~ $this->combientieme_fois = $value; + //~ return($this); + //~ } public function setCodePresta(string $value) { $this->code_presta = $value; @@ -90,25 +83,21 @@ class Prestations extends Model return($this); } - protected function combientiemeFois() - { - // on récupère un tableau contenant toutes les prestations d'un client tous types confondus (devis, facture, cesu, location, enregistrement sans vente) - $array = $this->find(['ID_client' => $this->ID_client]); - $this->combientieme_fois = count($array) + 1; - } + //~ protected function combientiemeFois() + //~ { + //~ // on récupère un tableau contenant toutes les prestations d'un client tous types confondus (devis, facture, cesu, location, enregistrement sans vente) + //~ $array = $this->find(['ID_client' => $this->ID_client]); + //~ //$this->combientieme_fois = count($array) + 1; + //~ return count($array) + 1; + //~ } // code client = année-mois-jour-codeclient-combientièmefois public function makeCodePresta(Dates $Date, string $code_client) { - $array_code = [$Date->getYear(), $Date->getMonth(), $Date->getDay(), $code_client, $this->combientieme_fois]; + // on récupère un tableau contenant toutes les prestations d'un client tous types confondus (devis, facture, cesu, location, enregistrement sans vente) + $combientieme_fois = count($this->find(['ID_client' => $this->ID_client])) + 1; + + $array_code = [$Date->getYear(), $Date->getMonth(), $Date->getDay(), $code_client, $combientieme_fois]; $this->code_presta = implode('-', $array_code); } - - //~ public function newRow(array $input) - //~ { - //~ $this->hydrate(['ID_client' => $input[0], 'code_presta' => $input[1], 'date' => $input[2], 'type_presta' => $input[3], 'mode_paiement' => $input[4], 'commentaires' => $input[5]]); - //~ $this->create(); - //~ // ID obtenu par auto-incrémentation - //~ $this->ID_presta = $this->db->lastInsertId(); // méthode de PDO - //~ } } diff --git a/src/model/StructTablesDB.php b/src/model/StructTablesDB.php index 0f13b80..00c5321 100644 --- a/src/model/StructTablesDB.php +++ b/src/model/StructTablesDB.php @@ -11,7 +11,8 @@ class StructTablesDB // les tables devis_factures, cesu et locations sont liées à la table prestations 'clients' => ['ID' => 'INTEGER', 'prenom_nom' => 'TEXT', 'code_client' => 'TEXT', 'adresse' => 'TEXT', 'telephone' => 'TEXT', 'courriel' => 'TEXT', 'commentaires' => 'TEXT'], 'prestations' => ['ID' => 'INTEGER', 'ID_client' => 'INTEGER', 'code_presta' => 'TEXT', 'date' => 'INTEGER', 'type_presta' => 'TEXT', 'mode_paiement' => 'TEXT', 'commentaires' => 'TEXT'], - 'devisfactures' => ['ID' => 'INTEGER', 'ID_presta' => 'INTEGER', 'validite_devis' => 'TEXT', 'signature_devis' => 'TEXT', 'taches' => 'TEXT', 'machine' => 'TEXT', 'OS' => 'TEXT', 'donnees' => 'TEXT', 'cles_licences' => 'TEXT', 'total_main_d_oeuvre' => 'REAL', 'pieces' => 'TEXT', 'total_pieces' => 'REAL', 'deplacement' => 'REAL', 'total_HT' => 'REAL'], + 'devis' => ['ID' => 'INTEGER', 'ID_presta' => 'INTEGER', 'taches' => 'TEXT', 'machine' => 'TEXT', 'OS' => 'TEXT', 'donnees' => 'TEXT', 'cles_licences' => 'TEXT', 'temps' => 'TEXT', 'total_main_d_oeuvre' => 'REAL', 'pieces' => 'TEXT', 'total_pieces' => 'REAL', 'deplacement' => 'REAL', 'total_HT' => 'REAL', 'validite_devis' => 'TEXT', 'signature_devis' => 'TEXT'], + 'factures' => ['ID' => 'INTEGER', 'ID_presta' => 'INTEGER', 'taches' => 'TEXT', 'machine' => 'TEXT', 'OS' => 'TEXT', 'donnees' => 'TEXT', 'cles_licences' => 'TEXT', 'temps' => 'TEXT', 'total_main_d_oeuvre' => 'REAL', 'pieces' => 'TEXT', 'total_pieces' => 'REAL', 'deplacement' => 'REAL', 'total_HT' => 'REAL'], 'cesu' => ['ID' => 'INTEGER', 'ID_presta' => 'INTEGER', 'taches' => 'TEXT', 'duree_travail' => 'TEXT', 'salaire' => 'REAL'], 'locations' => ['ID' => 'INTEGER', 'ID_presta' => 'INTEGER', 'designation' => 'TEXT', 'modele_description' => 'TEXT', 'valeur' => 'REAL', 'etat_des_lieux_debut' => 'TEXT', 'etat_des_lieux_fin' => 'TEXT', 'duree_location' => 'INTEGER', 'loyer_mensuel' => 'REAL', 'loyers_payes' => 'INTEGER', 'caution' => 'INTEGER'] ]; diff --git a/src/model/traits.php b/src/model/traits.php index 3d446c1..41f1c35 100644 --- a/src/model/traits.php +++ b/src/model/traits.php @@ -1,7 +1,9 @@ db = parent::getInstance(); //~ $this->ID = $this->db->lastInsertId(); // méthode de PDO //~ } + + public function setID(int $value = 0) + { + if($value === 0) + { + $this->ID = $this->db->lastInsertId(); // méthode de PDO + } + else + { + $this->ID = $value; + } + return($this); + } + + function hydrateFromForm(string $data_string, Object $Presta = NULL): bool // quand l'objet est $DetailsPresta, on hydrate aussi $Presta + { + //~ $tableSize = count(StructTablesDB::$structureOfTables[$this->getTable()]); // int + + if($data_string !== '') + { + $data_array = explode('|', $data_string); // array + //~ var_dump($data_array); + //~ if(count($data_array) === $tableSize - 1) // nombre de champs sauf ID qui est auto-incrémenté automatiquement + //~ { + //~ var_dump($this->getTable()); + //~ var_dump($data_array); + $check = false; + switch($this->getTable()) + { + case 'clients'; + if($data_array[0] == '') + { + echo "debug: données insuffisantes, le nom du client doit au minimum être renseigné\n"; + return false; + } + else + { + $check = $this->hydrate(['prenom_nom' => $data_array[0], 'code_client' => $data_array[1], 'adresse' => $data_array[2], 'telephone' => $data_array[3], 'courriel' => $data_array[4], 'commentaires' => $data_array[5]]); + } + break; + case 'prestations'; // inutilisé + break; + case 'devis'; + $check = $Presta->hydrate(['mode_paiement' => $data_array[11]]); + if($check) + { + $check = $this->hydrate(['taches' => $data_array[0], 'machine' => $data_array[1], 'OS' => $data_array[2], 'donnees' => $data_array[3], 'cles_licences' => $data_array[4], 'temps' => $data_array[5], 'total_main_d_oeuvre' => $data_array[6], 'pieces' => $data_array[7], 'total_pieces' => $data_array[8], 'deplacement' => $data_array[9], 'total_HT' => $data_array[10], + 'validite_devis' => $data_array[12], 'signature_devis' => $data_array[13]]); + } + break; + case 'factures'; + $check = $Presta->hydrate(['mode_paiement' => $data_array[11]]); + if($check) + { + $check = $this->hydrate(['taches' => $data_array[0], 'machine' => $data_array[1], 'OS' => $data_array[2], 'donnees' => $data_array[3], 'cles_licences' => $data_array[4], 'temps' => $data_array[5], 'total_main_d_oeuvre' => $data_array[6], 'pieces' => $data_array[7], 'total_pieces' => $data_array[8], 'deplacement' => $data_array[9], 'total_HT' => $data_array[10]]); + } + break; + case 'cesu'; + break; + case 'locations'; + break; + default: // inutilisé + echo "debug: table inconnue hydrateFromForm()"; + return false; + } + return $check; + //~ } + //~ else + //~ { + //~ echo "debug: mauvais tableau, il doit avoir " . $tableSize - 1 . " cases\n"; // ou -3 pour les factures + //~ return false; + //~ } + } + else + { + echo "debug: annulation lors du formulaire\n"; + return false; + } + } } diff --git a/src/sections/1_new_service.php b/src/sections/1_new_service.php index 172402a..aaf441a 100644 --- a/src/sections/1_new_service.php +++ b/src/sections/1_new_service.php @@ -3,7 +3,7 @@ // // -- SECTION 1: Nouvelle prestation -- -function newService() +function newService(): int // code de retour, si 0 retour menu principal, si 2 aller à la section 2, etc { // fenêtres $QuestionNouveauClient = new ZenityQuestion(ZenitySetup::$question_nouveau_client_text); @@ -12,230 +12,188 @@ function newService() $NouveauClient = new ZenityForms(ZenitySetup::$nouveau_client_text, ZenitySetup::$nouveau_client_entrees); $MenuEnregistrement = new ZenityList(ZenitySetup::$menu_enregistrement_text, ZenitySetup::$menu_enregistrement_entrees); $Calendrier = new ZenityCalendar(ZenitySetup::$calendar_text); - $FormulaireDevis = new ZenityForms(ZenitySetup::$formulaire_text, array_merge(ZenitySetup::$formulaire_devis_entrees, ZenitySetup::$formulaire_facture_entrees)); + $FormulaireDevis = new ZenityForms(ZenitySetup::$formulaire_text, array_merge(ZenitySetup::$formulaire_facture_entrees, ZenitySetup::$formulaire_devis_entrees)); $FormulaireFacture = new ZenityForms(ZenitySetup::$formulaire_text, ZenitySetup::$formulaire_facture_entrees); $FormulaireCesu = new ZenityForms(ZenitySetup::$formulaire_text, ZenitySetup::$formulaire_cesu_entrees); $FormulaireLocation = new ZenityForms(ZenitySetup::$formulaire_text, ZenitySetup::$formulaire_location_entrees); $CommentairePrestation = new ZenityEntry(ZenitySetup::$commentaire_prestation_text); + $Recapitulatif = new ZenityList(ZenitySetup::$recapitulatif_text, ZenitySetup::$recapitulatif_entrees); // tableau à multiples colonnes + $QuestionModifierPrestation = new ZenityQuestion(ZenitySetup::$question_modification_text); - $Client = new Clients; // modèle de la table 'clients' + $Client = new Clients; - $continuer = false; - // niveau 2: est ce que le client est déjà dans la base? + + // -- partie 1: le client -- + + // est ce que le client est déjà dans la base? + $client_inconnu = true; if(exec($QuestionNouveauClient->get()) == '0') // $? = 0 signifie oui, double égal == pour le transtypage { echo "debug: recherche souhaitée\n"; - - // niveau 3: saisie du nom du client - $nom_client = exec($RechercheClient->get()); - if($nom_client !== '') + $input = exec($RechercheClient->get()); + if($input == '') { - echo "debug: recherche effectuée\n"; - $ResultatsRechercheClient->setListRows(rechercheClient($nom_client, $Client), $Client->getTable()); // recherche silencieuse - unset($nom_client); - - // 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 sélectionné\n"; - $Client->hydrate($Client->findById($choix_niv4)); - $continuer = true; - } - else - { - echo "debug: client pas trouvé ou pas sélectionné\n"; - } + echo "debug: recherche annulée ou saisie vide\n"; + return(0); } - else + + 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: recherche annulée ou saisie vide\n"; + 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 "debug: nouveau client\n"; } - // niveau 2: on n'a pas cherché OU on n'a pas trouvé - if(!$continuer) + // on n'a pas cherché OU on n'a pas trouvé + if($client_inconnu) { - $data_string = exec($NouveauClient->get()); - //~ $data_array = explode('|', $data_string); - //~ if(controlFormInput($data_array)) - //~ { - //~ $Client->newRow($data_array); // écriture dans la BDD - //~ $continuer = true; - //~ } - - if($data_string !== '') + $input = exec($NouveauClient->get()); + if($input == '') { - $data_array = explode('|', $data_string); - $data_string = ''; // nettoyage - - if(count($data_array) === count(StructTablesDB::$structureOfTables[$Client->getTable()]) - 1) - { - if($data_array[0] != "") // le champ "prenom_nom" ne doit pas être vide - { - $Client->newRow($data_array); // écriture dans la BDD - $continuer = true; - } - else - { - echo "debug: données insuffisantes, le nom du client doit au minimum être renseigné\n"; - $continuer = false; - } - } - else - { - echo "debug: le nombre d'informations à enregistrer du nombre de champs à renseigner dans la table\n"; - $continuer = false; - } + echo "debug: annulation lors de l'enregistrement d'un nouveau client\n"; + return(0); } - else + if(!$Client->hydrateFromForm($input)) { - echo "debug: annulation lors du formulaire\n"; - $continuer = false; + // messages d'erreur dans hydrateFromForm() + return(0); } + unset($input); + $Client->create(); + $Client->setID(); // sans paramètre, exécute un $this->db->lastInsertId() } + + // -- partie 2: la prestation -- + // niveau 2: type comptable d'enregistrement: devis, facture, cesu, location ou pas de prestation - if($continuer) + $choix_niv2 = exec($MenuEnregistrement->get()); + if($choix_niv2 === '') { - $choix_niv2 = exec($MenuEnregistrement->get()); - $continuer = false; - $Presta = new Prestations($Client->getID()); - - switch($choix_niv2) - { - case ZenitySetup::$menu_enregistrement_entrees[0]: // "Devis" - $DetailsPresta = new DevisFactures($Client->getID()); - $Presta->setTypePresta('devis'); - $continuer = true; - break; - case ZenitySetup::$menu_enregistrement_entrees[1]: // "Facture" - $DetailsPresta = new DevisFactures($Client->getID()); - $Presta->setTypePresta('facture'); - $continuer = true; - break; - case ZenitySetup::$menu_enregistrement_entrees[2]: // "CESU" - $DetailsPresta = new CESU($Client->getID()); - $Presta->setTypePresta('cesu'); - $continuer = true; - break; - case ZenitySetup::$menu_enregistrement_entrees[3]: // "Location" - $DetailsPresta = new Locations($Client->getID()); - $Presta->setTypePresta('location'); - $continuer = true; - break; - case ZenitySetup::$menu_enregistrement_entrees[4]: // "non_vendue" - // objet $Presta uniquement - $Presta->setTypePresta('non_vendue'); - $continuer = true; - break; - default: - $continuer = false; // annulation, retour menu principal - } - - if($continuer) - { - // niveau 3: détail de la prestation - // noter que exec() renvoie toujours une chaîne, sauf en cas d'erreur où il renvoie un "false" - $Date = new Dates(exec($Calendrier->get())); - if($Date->getDate() !== '') // on n'a pas cliqué sur "annuler" - { - $Presta->setDate($Date->getTimestamp()); // un entier pour la BDD - $Presta->makeCodePresta($Date, $Client->getCodeClient()); // d'un objet à l'autre - - // on continue si le formulaire précédent a été rempli - switch($choix_niv2) - { - case $Presta->getType = 'devis'; - $data_string = exec($FormulaireDevis->get()); - break; - case $Presta->getType = 'facture'; - $data_string = exec($FormulaireFacture->get()); // tester si c'est vide ou clic sur 'Annuler' - break; - case $Presta->getType = 'cesu'; - $data_string = exec($FormulaireCesu->get()); - break; - case $Presta->getType = 'location'; - $data_string = exec($FormulaireLocation->get()); - break; - case $data_string->getType = 'non_vendue'; - // ne rien faire - break; - default: - $continuer = false; // annulation, retour menu principal - } - - if($continuer) - { - // dans $Presta - $comment = exec($CommentairePrestation->get()); - if(!empty($comment)) - { - $Presta->setCommentaires($comment); - } - else - { - $continuer = false; // annulation, retour menu principal - } - } - } - $Presta->create(); - $Presta->setIDPresta(); // sans paramètre pour récupérer le dernier ID inséré - - if($data_string !== '') - { - $data_array = explode('|', $data_string); - - if(count($data_array) === count(StructTablesDB::$structureOfTables[$DetailsPresta->getTable()]) - 1) - { - if($data_array[0] != "") // le champ "prenom_nom" ne doit pas être vide - { - $DetailsPresta->newRow($data_array); // INSUFFISANT - $continuer = true; - } - else - { - echo "debug: données insuffisantes, le nom du client doit au minimum être renseigné\n"; - $continuer = false; - } - } - else - { - echo "debug: le nombre d'informations à enregistrer du nombre de champs à renseigner dans la table\n"; - $continuer = false; - } - } - else - { - echo "debug: annulation lors du formulaire\n"; - $continuer = false; - } - $DetailsPresta->setIDPresta($Presta->getIDPresta()); // d'un objet à l'autre - $DetailsPresta->create(); - - - // tableau récaptilatif, possibilité de modification - //ZenityList - - - // création fichiers LaTeX et PDF - //~ $latex_path = '../data/latex/'; // noms de variables dans le config.php - //~ $file_name = 'devis.tex'; - //~ $template = 'devis'; // vaut 'devis' ou 'enveloppe_recto' ou 'enveloppe_verso' ou 'facture' ou 'location' - //~ $latex = getLatexFromTemplate($template); - //~ file_put_contents($latex_path . $file_name, $latex); // injection des variables & écriture du fichier - //~ $pdf_path = '../data/pdf/'; - //~ latexToPdf($latex_path, $file_name, $pdf_path); - - // 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"'); - } + echo "debug: annulation menu enregistrement\n"; + return(0); // menu principal + } + + $Presta = new Prestations($Client->getID()); + + // détail de la prestation + // calendrier - étape 1/3 + $Date = new Dates(exec($Calendrier->get())); // exec() renvoie soit une chaîne soit un false + if($Date->getDate() == '') // on n'a pas cliqué sur "annuler" + { + echo "debug: annulation à la saisie d'une date\n"; + return(0); // menu principal + } + + $Presta->setDate($Date->getTimestamp()); // un entier pour la BDD + $Presta->makeCodePresta($Date, $Client->getCodeClient()); // d'un objet à l'autre + + switch($choix_niv2) + { + // formulaire - étape 2/3 + case ZenitySetup::$menu_enregistrement_entrees[0]: // "Devis" + $Details = new DevisFactures($Client->getID(), 'devis'); + $Presta->setTypePresta('devis'); + $input = exec($FormulaireDevis->get()); + break; + case ZenitySetup::$menu_enregistrement_entrees[1]: // "Facture" + $Details = new DevisFactures($Client->getID(), '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($Client->getID()); + $Presta->setTypePresta('cesu'); + $input = exec($FormulaireCesu->get()); + break; + case ZenitySetup::$menu_enregistrement_entrees[3]: // "Location" + $Details = new Locations($Client->getID()); + $Presta->setTypePresta('location'); + $input = exec($FormulaireLocation->get()); + break; + case ZenitySetup::$menu_enregistrement_entrees[4]: // "Prestation non vendue" + $Presta->setTypePresta('non_vendue'); + break; + default: // inutile normallement, cas déjà géré plus haut + echo "debug: sortie du menu enregistrement incorrect\n"; + return(0); + } + + if($input == '') + { + echo "debug: annulation lors de l'enregistrement des détails de la prestation\n"; + return(0); + } + elseif(isset($Details) && !$Details->hydrateFromForm($input, $Presta)) + { + // messages d'erreur dans hydrateFromForm() + return(0); + } + unset($input); + + // commentaire - étape 3/3 + $input = exec($CommentairePrestation->get()); + //~ if($input == '') + //~ { + //~ echo "debug: annulation à la saisie d'un commentaire\n"; + //~ return(0); + //~ } + $Presta->setCommentaires($input); + unset($input); + + $Presta->create(); + $Presta->setID(); // sans paramètre, exécute un $this->db->lastInsertId() + + $Details->setIDPresta($Presta->getID()); // d'un objet à l'autre + $Details->create(); + $Details->setID(); // sans paramètre, exécute un $this->db->lastInsertId() + + + // -- partie 3: LaTeX -- + + // création fichiers LaTeX et PDF + //~ $latex_path = '../data/latex/'; // noms de variables dans le config.php + //~ $file_name = 'devis.tex'; + //~ $template = 'devis'; // vaut 'devis' ou 'enveloppe_recto' ou 'enveloppe_verso' ou 'facture' ou 'location' + //~ $latex = getLatexFromTemplate($template); + //~ file_put_contents($latex_path . $file_name, $latex); // injection des variables & écriture du fichier + //~ $pdf_path = '../data/pdf/'; + //~ latexToPdf($latex_path, $file_name, $pdf_path); + + + // -- 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"'); + + // possibilité de modification + // zenityQuestion + if(exec($QuestionModifierPrestation->get()) == '0') + { + return(2); // section 2 + } + else + { + return(0); // menu principal } } diff --git a/src/sections/2_modify_service.php b/src/sections/2_modify_service.php new file mode 100644 index 0000000..72e2605 --- /dev/null +++ b/src/sections/2_modify_service.php @@ -0,0 +1,9 @@ +