summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorpolo <ordipolo@gmx.fr>2023-06-22 15:22:23 +0200
committerpolo <ordipolo@gmx.fr>2023-06-22 15:22:23 +0200
commit22b941b3526dd3aaf6976eb4ed30aa2ecc30f921 (patch)
treef345f53c2f4c0ecdeabf9b2d1aac280a4b708a56 /src
parentee372629d665ea0b77889e3cc6e9b1738310a68e (diff)
downloadAppliGestionPHP-22b941b3526dd3aaf6976eb4ed30aa2ecc30f921.zip
factorisation 1_new_service.php vers functions.php
Diffstat (limited to 'src')
-rw-r--r--src/Config.php4
-rw-r--r--src/Dates.php2
-rw-r--r--src/Latex.php2
-rw-r--r--src/dependances.php2
-rw-r--r--src/functions.php172
-rwxr-xr-xsrc/main.php42
-rw-r--r--src/model/CESU.php2
-rw-r--r--src/model/Clients.php2
-rw-r--r--src/model/DB.php2
-rw-r--r--src/model/DevisFactures.php2
-rw-r--r--src/model/File.php7
-rw-r--r--src/model/Locations.php2
-rw-r--r--src/model/Model.php2
-rw-r--r--src/model/Prestations.php2
-rw-r--r--src/model/StructTablesDB.php2
-rw-r--r--src/model/traits.php2
-rw-r--r--src/sections/1_new_service.php153
-rw-r--r--src/sections/2_quotations.php9
-rw-r--r--src/sections/3_modify_service.php (renamed from src/sections/2_modify_service.php)4
-rw-r--r--src/view/Zenity.php2
-rw-r--r--src/view/ZenitySetup.php9
21 files changed, 216 insertions, 210 deletions
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
49 { 49 {
50 if(self::checkPath($field, $value)) 50 if(self::checkPath($field, $value))
51 { 51 {
52 $value = self::slashAtEndOfPath($value); 52 self::$$field = self::slashAtEndOfPath($value);
53 self::$$field = $value; 53 //self::$$field = $value;
54 } 54 }
55 } 55 }
56 else // tester le reste? 56 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 @@
1<?php 1<?php
2// php/DateTimestamp.php 2// src/DateTimestamp.php
3// 3//
4// attention à strtotime(), php "devine" le format de la date selon qu'elle comporte des slashs / ou des tirets - 4// attention à strtotime(), php "devine" le format de la date selon qu'elle comporte des slashs / ou des tirets -
5// pour php une date avec des slashs / est américaine, mais si on fait comme ça aussi par ici 5// pour php une date avec des slashs / est américaine, mais si on fait comme ça aussi par ici
diff --git a/src/Latex.php b/src/Latex.php
index c3d56af..9ae9435 100644
--- a/src/Latex.php
+++ b/src/Latex.php
@@ -1,5 +1,5 @@
1<?php 1<?php
2// php/Latex.php 2// src/Latex.php
3// 3//
4// génération du code LaTeX 4// génération du code LaTeX
5 5
diff --git a/src/dependances.php b/src/dependances.php
index 66ce414..a3dd320 100644
--- a/src/dependances.php
+++ b/src/dependances.php
@@ -1,5 +1,5 @@
1<?php 1<?php
2// php/dependances.php 2// src/dependances.php
3// Vérification des dépendances nécessaires au fonctionnement de ce programmes. 3// Vérification des dépendances nécessaires au fonctionnement de ce programmes.
4 4
5// Environnement dans lequel ce programmes a été créé: 5// Environnement dans lequel ce programmes a été créé:
diff --git a/src/functions.php b/src/functions.php
index bd91ddf..0b075b5 100644
--- a/src/functions.php
+++ b/src/functions.php
@@ -22,6 +22,72 @@ function windowAppCommand(string $app, string $path = ''): string
22 return $command; 22 return $command;
23} 23}
24 24
25function makeObjectCLient()
26{
27 // fenêtres
28 $QuestionNouveauClient = new ZenityQuestion(ZenitySetup::$question_nouveau_client_text);
29 $RechercheClient = new zenityEntry(ZenitySetup::$recherche_client_text);
30 $ResultatsRechercheClient = new ZenityList(ZenitySetup::$resultats_recherche_client_text, []);
31 $NouveauClient = new ZenityForms(ZenitySetup::$nouveau_client_text, ZenitySetup::$nouveau_client_entrees);
32
33 $Client = new Clients;
34
35 // est ce que le client est déjà dans la base?
36 $client_inconnu = true;
37 if(exec($QuestionNouveauClient->get()) == '0') // $? = 0 signifie oui, double égal == pour le transtypage
38 {
39 echo "choix: recherche d'une client\n";
40 $input = exec($RechercheClient->get());
41 if($input == '')
42 {
43 echo "debug: recherche annulée ou saisie vide\n";
44 return 0;
45 }
46
47 echo "debug: recherche effectuée\n";
48 $ResultatsRechercheClient->setListRows(rechercheClient($input, $Client), $Client->getTable()); // recherche silencieuse
49
50 // sélection parmi les résultats
51 $input = exec($ResultatsRechercheClient->get()); // renvoie l'ID de la table 'clients'
52 $ResultatsRechercheClient->cleanCommand();
53
54 if($input == '')
55 {
56 echo "debug: client pas trouvé ou pas sélectionné\n";
57 return 0;
58 }
59
60 echo "debug: client sélectionné\n";
61 $Client->hydrate($Client->findById($input));
62 $client_inconnu = false;
63 }
64 else
65 {
66 echo "choix: nouveau client\n";
67 }
68
69 // on n'a pas cherché OU on n'a pas trouvé
70 if($client_inconnu)
71 {
72 $input = exec($NouveauClient->get());
73 if($input == '')
74 {
75 echo "debug: annulation lors de l'enregistrement d'un nouveau client\n";
76 return 0;
77 }
78 if(!$Client->hydrateFromForm($input))
79 {
80 // messages d'erreur dans hydrateFromForm()
81 return 0;
82 }
83 unset($input);
84 $Client->create();
85 $Client->setID(); // sans paramètre, exécute un $this->db->lastInsertId()
86 }
87
88 return $Client;
89}
90
25// 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 91// 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
26// 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 92// 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
27// NOTE 3: la variable créée lors d'un "new" est elle-même une référence contenant un identifiant (= le pointeur?) 93// 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
30function rechercheClient(string $input, Clients $Client): array 96function rechercheClient(string $input, Clients $Client): array
31{ 97{
32 $input_array = explode(' ', $input); // si plusieurs mot, on les recherche tous l'un après l'autre 98 $input_array = explode(' ', $input); // si plusieurs mot, on les recherche tous l'un après l'autre
33
34 $result = $Client->findByKeywords($input_array, 'prenom_nom'); // on obtient un tableau à deux dimensions avec les entrées trouvées 99 $result = $Client->findByKeywords($input_array, 'prenom_nom'); // on obtient un tableau à deux dimensions avec les entrées trouvées
35 return($result); 100 return($result);
36} 101}
37 102
38function makeFolder(string $path) 103function makeLatexAndPdfDocument(Clients $Client = null, Prestations $Presta = null, $PrestaDetails = null)
39{
40 if(!file_exists($path))
41 {
42 mkdir($path);
43 chmod($path, 0755); // droits en octal
44 }
45}
46
47function makeLatexAndPdfDocument($documentType, Clients $Client = null, Prestations $Presta = null, $Details = null) // $Details peut être de type DevisFactures ou Locations
48{ 104{
49 $latex = ''; 105 $latex = '';
50 $year = ''; 106 $year = '';
51 $data = []; 107 $data = [];
52 $file_name = $documentType . '.tex';
53 $latex_path = Config::$latex_path; 108 $latex_path = Config::$latex_path;
54 $pdf_path = Config::$pdf_path; 109 $pdf_path = Config::$pdf_path;
55 110
56 // tableau associatif avec des données des différents objets 111 // verso d'une enveloppe
57 // note: la propriété 'commentaires' de $Presta écrase celle de $Client (pas grave, les clients n'ont pas besoin d'en avoir connaissance) 112 $latex = makeLatex('enveloppe_verso'); // pas de données transmises, elles sont dans la classe Config
58 // encore une fois, ce programme est destiné à un usage privé et hors ligne, sans déclaration CNIL 113 $file_name = 'enveloppe_verso.tex';
114 makeFiles($latex_path, $pdf_path, $file_name, $latex);
59 115
60 if($Client == null) // verso d'une enveloppe 116 if($Client !== null)
61 {
62 $latex = makeLatex($documentType); // pas de données transmises, elles sont dans la classe Config
63 $file_name = 'enveloppe_verso';
64 }
65 else
66 { 117 {
67 $data = $Client->getAll(); 118 $data = $Client->getAll();
68 119
69 if($Presta == null) // recto d'une enveloppe 120 // recto d'une enveloppe
70 { 121 $latex_recto_path = $latex_path . 'enveloppes_recto/';
71 $latex_path .= 'enveloppes_recto/'; 122 $pdf_verso_path = $pdf_path . 'enveloppes_recto/';
72 $pdf_path .= 'enveloppes_recto/'; 123 $data['code_postal'] = implode(' \ ', str_split($data['code_postal'])); // code postal avec 2 espaces entre chaque chiffre: 2 \ 9 \ 0 \ 0 \ 0
73 $data['code_postal'] = implode(' \ ', str_split($data['code_postal'])); // code postal avec 2 espaces entre chaque chiffre: 2 \ 9 \ 0 \ 0 \ 0 124 $latex = makeLatex('enveloppe_recto', $data); // injection des variables
74 $latex = makeLatex($documentType, $data); // injection des variables 125 $file_name = $Client->getCodeClient() . '.tex';
75 $file_name = $Client->getCodeClient() . '.tex'; 126 makeFiles($latex_recto_path, $pdf_verso_path, $file_name, $latex);
76 } 127
77 else // facture, devis, location 128 // facture, devis, location
129 if($Presta !== null && $PrestaDetails !== null)
78 { 130 {
79 $data = array_merge($data, $Presta->getAll()); 131 $type = $Presta->getTypePresta();
80 $Date = new Dates($Presta->getDate()); // entrée = timestamp (doit être un "int"!!) 132 $file_name = $type . '.tex';
81 $year = $Date->getYear(); 133 if($type === 'facture' || $type === 'devis' || $type === 'location')
82
83 // créer un sous-dossier pour la nouvelle année
84 $latex_path .= $year . '/';
85 $pdf_path .= $year . '/';
86
87 if($Details != null)
88 { 134 {
89 $data = array_merge($data, $Details->getAll()); 135 $data = array_merge($data, $Presta->getAll());
136 $Date = new Dates($Presta->getDate()); // entrée = timestamp (doit être un "int"!!)
137 $year = $Date->getYear();
138 $latex_year_path = $latex_path . $year . '/'; // un sous-dossier par année
139 $pdf_year_path = $pdf_path . $year . '/';
140 $data = array_merge($data, $PrestaDetails->getAll());
141 $latex = makeLatex($type, $data, $Date); // injection des variables
142 $file_name = $Presta->getCodePresta() . '.tex';
143 makeFiles($latex_year_path, $pdf_year_path, $file_name, $latex);
144 }
145 elseif($type === 'cesu' || $type === 'non_vendue')
146 {} // pas de document
147 else
148 {
149 echo "debug: erreur génération latex, type de prestation \n";
150 return 0;
90 } 151 }
91
92 $latex = makeLatex($documentType, $data, $Date); // injection des variables
93 $file_name = $Presta->getCodePresta() . '.tex';
94 } 152 }
95 } 153 }
96
97 // création des fichiers
98 makeFolder($latex_path);
99 makeFolder($pdf_path);
100 file_put_contents($latex_path. $file_name, $latex); // écriture du fichier
101 latexToPdf($latex_path, $file_name, $pdf_path);
102} 154}
103 155
104function makeLatex(string $documentType, array $data = [], Dates $Date = null) 156
157function makeLatex(string $type, array $data = [], Dates $Date = null)
105{ 158{
106 $date = ''; 159 $date = '';
107 if($Date != null) 160 if($Date != null)
@@ -113,13 +166,30 @@ function makeLatex(string $documentType, array $data = [], Dates $Date = null)
113 // on obtient la variable $latex avec ob_get_clean() 166 // on obtient la variable $latex avec ob_get_clean()
114 // le include() ici, c'est du génie ou c'est moche ou les deux? 167 // le include() ici, c'est du génie ou c'est moche ou les deux?
115 // un nouveau fichier php est inséré à chaque itération 168 // un nouveau fichier php est inséré à chaque itération
116 include('latex_templates/' . $documentType . '.php'); 169 include('latex_templates/' . $type . '.php');
117 170
118 // on retourne le buffer 171 // on retourne le buffer
119 // normallement le code PHP inséré avec include est nettoyé en quittant la fonction 172 // normallement le code PHP inséré avec include est nettoyé en quittant la fonction
120 return($latex); 173 return($latex);
121} 174}
122 175
176function makeFiles($latex_path, $pdf_path, $file_name, $latex)
177{
178 makeFolder($latex_path);
179 makeFolder($pdf_path);
180 file_put_contents($latex_path. $file_name, $latex); // écriture du fichier
181 latexToPdf($latex_path, $file_name, $pdf_path);
182}
183
184function makeFolder(string $path)
185{
186 if(!file_exists($path))
187 {
188 mkdir($path);
189 chmod($path, 0755); // droits en octal
190 }
191}
192
123// compilation à partir d'un fichier .tex 193// compilation à partir d'un fichier .tex
124function latexToPdf(string $latexPath, string $fileName, string $pdfPath) 194function latexToPdf(string $latexPath, string $fileName, string $pdfPath)
125{ 195{
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 @@
1#!/bin/php 1#!/bin/php
2<?php 2<?php
3// php/main.php 3// src/main.php
4
5require('functions.php');
6require('model/File.php');
4 7
5// configuration du programme par l'utilisateur 8// configuration du programme par l'utilisateur
6//~ require('../config.php'); // fichier de l'utilisateur: à déplacer peut-être dans un dossier config
7require('Config.php'); // classe structure de données, lit config.php et préviens les erreurs (par exemple les / aux chemins manquants) 9require('Config.php'); // classe structure de données, lit config.php et préviens les erreurs (par exemple les / aux chemins manquants)
8Config::readFile('../config.ini'); 10Config::readFile('../config.ini');
11makeFolder(Config::$latex_path);
12makeFolder(Config::$pdf_path);
9Config::hydrate(); 13Config::hydrate();
10
11// et à coder peut-être plus tard 14// et à coder peut-être plus tard
12//require('config_window.php'); // configuration user-friendly et assistée avec des messages d'erreur et des indications 15//require('config_window.php'); // configuration user-friendly et assistée avec des messages d'erreur et des indications
13 16
@@ -20,9 +23,7 @@ Config::$db_path .= Config::$db_name . '.' . Config::$sgbd;
20$sqlitebrowser_enable = false; 23$sqlitebrowser_enable = false;
21$sqlite_cli = ''; // commande sqlite ou sqlite3 24$sqlite_cli = ''; // commande sqlite ou sqlite3
22$x_term_command = ''; // commande terminal en mode graphique 25$x_term_command = ''; // commande terminal en mode graphique
23
24require('dependances.php'); // vérification des dépendances 26require('dependances.php'); // vérification des dépendances
25require('functions.php');
26require('Dates.php'); // gère dates et timestamps 27require('Dates.php'); // gère dates et timestamps
27Dates::$date_format = Config::$date_format; // dates européennes ou américaines 28Dates::$date_format = Config::$date_format; // dates européennes ou américaines
28 29
@@ -43,10 +44,13 @@ require('model/Locations.php');
43 44
44require('view/Zenity.php'); // commande système zenity 45require('view/Zenity.php'); // commande système zenity
45require('view/ZenitySetup.php'); // texte dans les fenêtres ET instanciation (un objet = une commande) 46require('view/ZenitySetup.php'); // texte dans les fenêtres ET instanciation (un objet = une commande)
46require('Latex.php'); // générer le code LaTeX 47
48// factoriser et créer une classe
49//require('Latex.php'); // générer le code LaTeX
47 50
48require('sections/1_new_service.php'); 51require('sections/1_new_service.php');
49require('sections/2_modify_service.php'); 52require('sections/2_quotations.php');
53require('sections/3_modify_service.php');
50 54
51// boucle principale 55// boucle principale
52$boucle = true; 56$boucle = true;
@@ -73,22 +77,28 @@ while($boucle)
73 echo "debug: main.php: hello, code retour " . $code_retour . "\n"; 77 echo "debug: main.php: hello, code retour " . $code_retour . "\n";
74 } 78 }
75 79
76 // -- SECTION 2: Modifier un enregistrement -- 80 // -- SECTION 2: Devis --
77 elseif($choix_niv1 === ZenitySetup::$menu_principal_entrees[1] || $code_retour === 2) 81 elseif($choix_niv1 === ZenitySetup::$menu_principal_entrees[1] || $code_retour === 2)
78 { 82 {
79 echo("choix: $choix_niv1\n"); 83 echo("choix: $choix_niv1\n");
80 $code_retour = modifyService(); 84 $code_retour = modifyService();
81 } 85 }
86 // -- SECTION 3: Modifier un enregistrement --
87 elseif($choix_niv1 === ZenitySetup::$menu_principal_entrees[2] || $code_retour === 3)
88 {
89 echo("choix: $choix_niv1\n");
90 $code_retour = modifyService();
91 }
82 92
83 // -- SECTION 3: Consulter/analyser les données -- 93 // -- SECTION 4: Consulter/analyser les données --
84 elseif($choix_niv1 === ZenitySetup::$menu_principal_entrees[2] || $code_retour === 3) 94 elseif($choix_niv1 === ZenitySetup::$menu_principal_entrees[3] || $code_retour === 4)
85 { 95 {
86 echo("choix: $choix_niv1\n"); 96 echo("choix: $choix_niv1\n");
87 // quel affichage? des tableaux avec zenity? LaTeX? une page web? un autre outil servant à faire des tableaux et graphiques 97 // quel affichage? des tableaux avec zenity? LaTeX? une page web? un autre outil servant à faire des tableaux et graphiques
88 } 98 }
89 99
90 // -- SECTION 4: Imprimer -- 100 // -- SECTION 5: Imprimer --
91 elseif($choix_niv1 === ZenitySetup::$menu_principal_entrees[3] || $code_retour === 4) // = Imprimer un document 101 elseif($choix_niv1 === ZenitySetup::$menu_principal_entrees[4] || $code_retour === 5) // = Imprimer un document
92 { 102 {
93 echo("choix: $choix_niv1\n"); 103 echo("choix: $choix_niv1\n");
94 $MenuDocuments = new ZenityList(ZenitySetup::$menu_documents_text, ZenitySetup::$menu_documents_entrees); 104 $MenuDocuments = new ZenityList(ZenitySetup::$menu_documents_text, ZenitySetup::$menu_documents_entrees);
@@ -123,8 +133,8 @@ while($boucle)
123 } 133 }
124 } 134 }
125 135
126 // -- SECTION 5: Supports de communication -- 136 // -- SECTION 6: Supports de communication --
127 elseif($choix_niv1 === ZenitySetup::$menu_principal_entrees[4] || $code_retour === 5) // = Communication 137 elseif($choix_niv1 === ZenitySetup::$menu_principal_entrees[5] || $code_retour === 6) // = Communication
128 { 138 {
129 echo("choix: $choix_niv1\n"); 139 echo("choix: $choix_niv1\n");
130 $MenuCommunication = new ZenityList(ZenitySetup::$menu_communication_text, ZenitySetup::$menu_communication_entrees); 140 $MenuCommunication = new ZenityList(ZenitySetup::$menu_communication_text, ZenitySetup::$menu_communication_entrees);
@@ -147,8 +157,8 @@ while($boucle)
147 } 157 }
148 } 158 }
149 159
150 // -- SECTION 6: BDD -- 160 // -- SECTION 7: BDD --
151 elseif($choix_niv1 === ZenitySetup::$menu_principal_entrees[5] || $code_retour === 6) // = Base de données 161 elseif($choix_niv1 === ZenitySetup::$menu_principal_entrees[6] || $code_retour === 7) // = Base de données
152 { 162 {
153 echo("choix: $choix_niv1\n"); 163 echo("choix: $choix_niv1\n");
154 if($sqlitebrowser_enable) 164 if($sqlitebrowser_enable)
diff --git a/src/model/CESU.php b/src/model/CESU.php
index 8771607..dbb4023 100644
--- a/src/model/CESU.php
+++ b/src/model/CESU.php
@@ -1,5 +1,5 @@
1<?php 1<?php
2// model/CESU.php 2// src/model/CESU.php
3 3
4class CESU extends Model 4class CESU extends Model
5{ 5{
diff --git a/src/model/Clients.php b/src/model/Clients.php
index d841451..8f460c6 100644
--- a/src/model/Clients.php
+++ b/src/model/Clients.php
@@ -1,5 +1,5 @@
1<?php 1<?php
2// model/Clients.php 2// src/model/Clients.php
3 3
4class Clients extends Model 4class Clients extends Model
5{ 5{
diff --git a/src/model/DB.php b/src/model/DB.php
index 52d6479..4e54015 100644
--- a/src/model/DB.php
+++ b/src/model/DB.php
@@ -1,5 +1,5 @@
1<?php 1<?php
2// php/DB.php 2// src/model/DB.php
3 3
4// cette classe applique le pattern "singleton" 4// cette classe applique le pattern "singleton"
5// but: ne permettre qu'une seule instance de la classe (laquelle sera éventuellement globale) 5// but: ne permettre qu'une seule instance de la classe (laquelle sera éventuellement globale)
diff --git a/src/model/DevisFactures.php b/src/model/DevisFactures.php
index 92a5443..c9b7d18 100644
--- a/src/model/DevisFactures.php
+++ b/src/model/DevisFactures.php
@@ -1,5 +1,5 @@
1<?php 1<?php
2// model/DevisFactures.php 2// src/model/DevisFactures.php
3 3
4class DevisFactures extends Model 4class DevisFactures extends Model
5{ 5{
diff --git a/src/model/File.php b/src/model/File.php
new file mode 100644
index 0000000..8bcdead
--- /dev/null
+++ b/src/model/File.php
@@ -0,0 +1,7 @@
1<?php
2// src/model/File.php
3//
4// manipulations des fichiers
5
6class File
7{}
diff --git a/src/model/Locations.php b/src/model/Locations.php
index 149c1f1..b669e7c 100644
--- a/src/model/Locations.php
+++ b/src/model/Locations.php
@@ -1,5 +1,5 @@
1<?php 1<?php
2// model/Locations.php 2// src/model/Locations.php
3 3
4class Locations extends Model 4class Locations extends Model
5{ 5{
diff --git a/src/model/Model.php b/src/model/Model.php
index 0240a9e..40a9fcb 100644
--- a/src/model/Model.php
+++ b/src/model/Model.php
@@ -1,5 +1,5 @@
1<?php 1<?php
2// php/Model.php 2// src/model/Model.php
3 3
4abstract class Model extends DB 4abstract class Model extends DB
5{ 5{
diff --git a/src/model/Prestations.php b/src/model/Prestations.php
index d246a3d..94dd805 100644
--- a/src/model/Prestations.php
+++ b/src/model/Prestations.php
@@ -1,5 +1,5 @@
1<?php 1<?php
2// model/Prestations.php 2// src/model/Prestations.php
3 3
4class Prestations extends Model 4class Prestations extends Model
5{ 5{
diff --git a/src/model/StructTablesDB.php b/src/model/StructTablesDB.php
index b1e3c7a..75a4383 100644
--- a/src/model/StructTablesDB.php
+++ b/src/model/StructTablesDB.php
@@ -1,5 +1,5 @@
1<?php 1<?php
2// model/StructTablesDB.php 2// src/model/StructTablesDB.php
3 3
4// structure de données façon C 4// structure de données façon C
5// créer les requêtes avec implode(', ', $DbStructure) 5// créer les requêtes avec implode(', ', $DbStructure)
diff --git a/src/model/traits.php b/src/model/traits.php
index a00032e..03121be 100644
--- a/src/model/traits.php
+++ b/src/model/traits.php
@@ -1,5 +1,5 @@
1<?php 1<?php
2// model/traits.php 2// src/model/traits.php
3// 3//
4// fonctions à utiliser par les enfants de Model 4// fonctions à utiliser par les enfants de Model
5 5
diff --git a/src/sections/1_new_service.php b/src/sections/1_new_service.php
index ae2d2ef..f9105b7 100644
--- a/src/sections/1_new_service.php
+++ b/src/sections/1_new_service.php
@@ -1,15 +1,11 @@
1<?php 1<?php
2// sections/1_new_service.php 2// src/sections/1_new_service.php
3// 3//
4// -- SECTION 1: Nouvelle prestation -- 4// -- SECTION 1: Nouvelle prestation --
5 5
6function newService(): int // code de retour, si 0 retour menu principal, si 2 aller à la section 2, etc 6function newService(): int // code de retour, si 0 retour menu principal, si 2 aller à la section 2, etc
7{ 7{
8 // fenêtres 8 // fenêtres
9 $QuestionNouveauClient = new ZenityQuestion(ZenitySetup::$question_nouveau_client_text);
10 $RechercheClient = new zenityEntry(ZenitySetup::$recherche_client_text);
11 $ResultatsRechercheClient = new ZenityList(ZenitySetup::$resultats_recherche_client_text, []);
12 $NouveauClient = new ZenityForms(ZenitySetup::$nouveau_client_text, ZenitySetup::$nouveau_client_entrees);
13 $MenuEnregistrement = new ZenityList(ZenitySetup::$menu_enregistrement_text, ZenitySetup::$menu_enregistrement_entrees); 9 $MenuEnregistrement = new ZenityList(ZenitySetup::$menu_enregistrement_text, ZenitySetup::$menu_enregistrement_entrees);
14 $Calendrier = new ZenityCalendar(ZenitySetup::$calendar_text); 10 $Calendrier = new ZenityCalendar(ZenitySetup::$calendar_text);
15 $FormulaireDevis = new ZenityForms(ZenitySetup::$formulaire_text, ZenitySetup::$formulaire_devis_entrees); 11 $FormulaireDevis = new ZenityForms(ZenitySetup::$formulaire_text, ZenitySetup::$formulaire_devis_entrees);
@@ -20,63 +16,12 @@ function newService(): int // code de retour, si 0 retour menu principal, si 2 a
20 $Recapitulatif = new ZenityList(ZenitySetup::$recapitulatif_text, ZenitySetup::$recapitulatif_entrees); // tableau à multiples colonnes 16 $Recapitulatif = new ZenityList(ZenitySetup::$recapitulatif_text, ZenitySetup::$recapitulatif_entrees); // tableau à multiples colonnes
21 $QuestionModifierPrestation = new ZenityQuestion(ZenitySetup::$question_modification_text); 17 $QuestionModifierPrestation = new ZenityQuestion(ZenitySetup::$question_modification_text);
22 18
23 $Client = new Clients;
24
25 19
26 // -- partie 1: le client -- 20 // -- partie 1: le client --
27 21 $Client = makeObjectCLient();
28 // est ce que le client est déjà dans la base? 22 if($Client === 0)
29 $client_inconnu = true;
30 if(exec($QuestionNouveauClient->get()) == '0') // $? = 0 signifie oui, double égal == pour le transtypage
31 { 23 {
32 echo "choix: recherche d'une client\n"; 24 return 0; // menu principal
33 $input = exec($RechercheClient->get());
34 if($input == '')
35 {
36 echo "debug: recherche annulée ou saisie vide\n";
37 return(0);
38 }
39
40 echo "debug: recherche effectuée\n";
41 $ResultatsRechercheClient->setListRows(rechercheClient($input, $Client), $Client->getTable()); // recherche silencieuse
42 unset($input);
43
44 // niveau 4: sélection parmi les résultats
45 $choix_niv4 = exec($ResultatsRechercheClient->get()); // renvoie l'ID de la table 'clients'
46 $ResultatsRechercheClient->cleanCommand();
47
48 if($choix_niv4 == '')
49 {
50 echo "debug: client pas trouvé ou pas sélectionné\n";
51 return(0);
52 }
53
54 echo "debug: client sélectionné\n";
55 $Client->hydrate($Client->findById($choix_niv4));
56 $client_inconnu = false;
57 }
58 else
59 {
60 echo "choix: nouveau client\n";
61 }
62
63 // on n'a pas cherché OU on n'a pas trouvé
64 if($client_inconnu)
65 {
66 $input = exec($NouveauClient->get());
67 if($input == '')
68 {
69 echo "debug: annulation lors de l'enregistrement d'un nouveau client\n";
70 return(0);
71 }
72 if(!$Client->hydrateFromForm($input))
73 {
74 // messages d'erreur dans hydrateFromForm()
75 return(0);
76 }
77 unset($input);
78 $Client->create();
79 $Client->setID(); // sans paramètre, exécute un $this->db->lastInsertId()
80 } 25 }
81 26
82 27
@@ -87,7 +32,7 @@ function newService(): int // code de retour, si 0 retour menu principal, si 2 a
87 if($choix_niv2 === '') 32 if($choix_niv2 === '')
88 { 33 {
89 echo "debug: annulation menu enregistrement\n"; 34 echo "debug: annulation menu enregistrement\n";
90 return(0); // menu principal 35 return 0; // menu principal
91 } 36 }
92 37
93 $Presta = new Prestations($Client->getID()); 38 $Presta = new Prestations($Client->getID());
@@ -98,7 +43,7 @@ function newService(): int // code de retour, si 0 retour menu principal, si 2 a
98 if($Date->getDate() == '') // on n'a pas cliqué sur "annuler" 43 if($Date->getDate() == '') // on n'a pas cliqué sur "annuler"
99 { 44 {
100 echo "debug: annulation à la saisie d'une date\n"; 45 echo "debug: annulation à la saisie d'une date\n";
101 return(0); // menu principal 46 return 0; // menu principal
102 } 47 }
103 48
104 $Presta->setDate($Date->getTimestamp()); // un entier pour la BDD 49 $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
106 switch($choix_niv2) 51 switch($choix_niv2)
107 { 52 {
108 // formulaire - étape 2/3 53 // formulaire - étape 2/3
109 case ZenitySetup::$menu_enregistrement_entrees[0]: // "Devis" 54 //~ case ZenitySetup::$menu_enregistrement_entrees[0]: // "Devis"
110 $Details = new DevisFactures('devis'); 55 //~ $PrestaDetails = new DevisFactures('devis');
111 $Presta->setTypePresta('devis'); 56 //~ $Presta->setTypePresta('devis');
112 $input = exec($FormulaireDevis->get()); 57 //~ $input = exec($FormulaireDevis->get());
113 break; 58 //~ break;
114 case ZenitySetup::$menu_enregistrement_entrees[1]: // "Facture" 59 case ZenitySetup::$menu_enregistrement_entrees[0]: // "Facture"
115 $Details = new DevisFactures('factures'); // 'factures' est le nom de la table, pas le type de presta 60 $PrestaDetails = new DevisFactures('factures'); // 'factures' est le nom de la table, pas le type de presta
116 $Presta->setTypePresta('facture'); 61 $Presta->setTypePresta('facture');
117 $input =exec($FormulaireFacture->get()); 62 $input =exec($FormulaireFacture->get());
118 break; 63 break;
119 case ZenitySetup::$menu_enregistrement_entrees[2]: // "CESU" 64 case ZenitySetup::$menu_enregistrement_entrees[1]: // "CESU"
120 $Details = new CESU(); 65 $PrestaDetails = new CESU();
121 $Presta->setTypePresta('cesu'); 66 $Presta->setTypePresta('cesu');
122 $input = exec($FormulaireCesu->get()); 67 $input = exec($FormulaireCesu->get());
123 break; 68 break;
124 case ZenitySetup::$menu_enregistrement_entrees[3]: // "Location" 69 case ZenitySetup::$menu_enregistrement_entrees[2]: // "Location"
125 $Details = new Locations(); 70 $PrestaDetails = new Locations();
126 $Presta->setTypePresta('location'); 71 $Presta->setTypePresta('location');
127 $input = exec($FormulaireLocation->get()); 72 $input = exec($FormulaireLocation->get());
128 break; 73 break;
129 case ZenitySetup::$menu_enregistrement_entrees[4]: // "Prestation non vendue" 74 case ZenitySetup::$menu_enregistrement_entrees[3]: // "Prestation non vendue"
130 $Presta->setTypePresta('non_vendue'); 75 $Presta->setTypePresta('non_vendue');
131 break; 76 break;
132 default: // inutile normallement, cas déjà géré avant 77 default: // inutile normallement, cas déjà géré avant
133 echo "debug: sortie du menu enregistrement incorrect\n"; 78 echo "debug: sortie du menu enregistrement incorrect\n";
134 return(0); 79 return 0;
135 } 80 }
136 81
137 $Presta->makeCodePresta($Date, $Client->getCodeClient()); // d'un objet à l'autre 82 $Presta->makeCodePresta($Date, $Client->getCodeClient()); // d'un objet à l'autre
138 83
139 if($choix_niv2 != ZenitySetup::$menu_enregistrement_entrees[4]) // si presta non vendue, saut étape 3/3 84 if($choix_niv2 != ZenitySetup::$menu_enregistrement_entrees[3]) // si presta non vendue, saut étape 3/3
140 { 85 {
141 if($input == '') // annulation 86 if($input == '') // annulation
142 { 87 {
143 echo "debug: annulation lors de l'enregistrement des détails de la prestation\n"; 88 echo "debug: annulation lors de l'enregistrement des détails de la prestation\n";
144 return(0); 89 return 0;
145 } 90 }
146 elseif(isset($Details) && !$Details->hydrateFromForm($input, $Presta)) // echec de l'hydratation 91 elseif(isset($PrestaDetails) && !$PrestaDetails->hydrateFromForm($input, $Presta)) // echec de l'hydratation
147 { 92 {
148 echo "debug: erreur de hydrateFromForm()\n"; // messages d'erreur à mettre ici ou dans hydrateFromForm()? 93 echo "debug: erreur de hydrateFromForm()\n"; // messages d'erreur à mettre ici ou dans hydrateFromForm()?
149 return(0); 94 return 0;
150 } 95 }
151 unset($input); 96 unset($input);
152 } 97 }
@@ -167,7 +112,7 @@ function newService(): int // code de retour, si 0 retour menu principal, si 2 a
167 //~ if(exec('echo $?') != 1) 112 //~ if(exec('echo $?') != 1)
168 //~ { 113 //~ {
169 //~ echo "debug: annulation à la saisie d'un commentaire\n"; 114 //~ echo "debug: annulation à la saisie d'un commentaire\n";
170 //~ return(0); 115 //~ return 0;
171 //~ } 116 //~ }
172 $Presta->setCommentaires($input); 117 $Presta->setCommentaires($input);
173 unset($input); 118 unset($input);
@@ -175,53 +120,17 @@ function newService(): int // code de retour, si 0 retour menu principal, si 2 a
175 $Presta->create(); 120 $Presta->create();
176 $Presta->setID(); // sans paramètre, exécute un $this->db->lastInsertId() 121 $Presta->setID(); // sans paramètre, exécute un $this->db->lastInsertId()
177 122
178 if(isset($Details)) // presta non vendue 123 if(isset($PrestaDetails)) // presta non vendue
179 { 124 {
180 $Details->setIDPresta($Presta->getID()); // d'un objet à l'autre 125 $PrestaDetails->setIDPresta($Presta->getID()); // d'un objet à l'autre
181 $Details->create(); 126 $PrestaDetails->create();
182 $Details->setID(); // sans paramètre, exécute un $this->db->lastInsertId() 127 $PrestaDetails->setID(); // sans paramètre, exécute un $this->db->lastInsertId()
183 } 128 }
184 129
185 130
186 // -- partie 3: LaTeX -- 131 // -- partie 3: LaTeX --
187 132
188 // document de la prestation 133 makeLatexAndPdfDocument($Client, $Presta, $PrestaDetails);
189 switch($choix_niv2)
190 {
191 case ZenitySetup::$menu_enregistrement_entrees[0]: // "Devis"
192 $type = 'devis';
193 makeLatexAndPdfDocument($type, $Client, $Presta, $Details);
194 break;
195 case ZenitySetup::$menu_enregistrement_entrees[1]: // "Facture"
196 $type = 'facture';
197 makeLatexAndPdfDocument($type, $Client, $Presta, $Details);
198 break;
199 case ZenitySetup::$menu_enregistrement_entrees[2]: // "CESU"
200 // pas de facture
201 break;
202 case ZenitySetup::$menu_enregistrement_entrees[3]: // "Location"
203 $type = 'location';
204 makeLatexAndPdfDocument($type, $Client, $Presta, $Details);
205 break;
206 case ZenitySetup::$menu_enregistrement_entrees[4]: // "Prestation non vendue"
207 // pas de facture
208 break;
209 default: // inutile normallement, cas déjà géré avant
210 echo "debug: sortie du menu enregistrement incorrect\n";
211 return(0);
212 }
213
214 // enveloppe recto
215 $type = 'enveloppe_recto';
216 makeLatexAndPdfDocument($type, $Client);
217
218 // le verso ne dépend pas du client mais de l'entreprise, dans la classe Config
219 if(!file_exists(Config::$pdf_path . 'enveloppe_verso.pdf'))
220 {
221 $type = 'enveloppe_verso';
222 makeLatexAndPdfDocument($type);
223 }
224
225 134
226 // -- partie 4: récapitulatif -- 135 // -- partie 4: récapitulatif --
227 136
@@ -237,10 +146,10 @@ function newService(): int // code de retour, si 0 retour menu principal, si 2 a
237 // zenityQuestion 146 // zenityQuestion
238 if(exec($QuestionModifierPrestation->get()) == '0') 147 if(exec($QuestionModifierPrestation->get()) == '0')
239 { 148 {
240 return(2); // section 2 149 return 3; // section "Modifier un enregistrement"
241 } 150 }
242 else 151 else
243 { 152 {
244 return(0); // menu principal 153 return 0; // menu principal
245 } 154 }
246} 155}
diff --git a/src/sections/2_quotations.php b/src/sections/2_quotations.php
new file mode 100644
index 0000000..76b66fd
--- /dev/null
+++ b/src/sections/2_quotations.php
@@ -0,0 +1,9 @@
1<?php
2// src/sections/2_quotations.php
3//
4// -- SECTION 2: Devis --
5
6function quotation(): int // code de retour, si 2 aller à la section 2, etc
7{
8 return(0); // menu principal
9}
diff --git a/src/sections/2_modify_service.php b/src/sections/3_modify_service.php
index 72e2605..3147969 100644
--- a/src/sections/2_modify_service.php
+++ b/src/sections/3_modify_service.php
@@ -1,7 +1,7 @@
1<?php 1<?php
2// sections/2_modify_service.php 2// src/sections/3_modify_service.php
3// 3//
4// -- SECTION 2: Modifier une prestation -- 4// -- SECTION 3: Modifier une prestation --
5 5
6function modifyService(): int // code de retour, si 2 aller à la section 2, etc 6function modifyService(): int // code de retour, si 2 aller à la section 2, etc
7{ 7{
diff --git a/src/view/Zenity.php b/src/view/Zenity.php
index 091a2c0..73c8c3e 100644
--- a/src/view/Zenity.php
+++ b/src/view/Zenity.php
@@ -1,5 +1,5 @@
1<?php 1<?php
2// php/Zenity.php 2// src/view/Zenity.php
3// 3//
4// générer les commandes qui ouvrent les fenêtres zenity, un objet = une commande 4// générer les commandes qui ouvrent les fenêtres zenity, un objet = une commande
5// s'utilisent comme ceci: exec($Objet->get()); 5// s'utilisent comme ceci: exec($Objet->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 @@
1<?php 1<?php
2// view/ZenitySetup.php 2// src/view/ZenitySetup.php
3// 3//
4// ces variables sont des paramètres de la commande zenity (--text, --add-entry, --column) 4// ces variables sont des paramètres de la commande zenity (--text, --add-entry, --column)
5// les utiliser à l'instanciation des objets Zenity à la manière de l'exemple suivant: 5// les utiliser à l'instanciation des objets Zenity à la manière de l'exemple suivant:
@@ -8,11 +8,12 @@
8class ZenitySetup 8class ZenitySetup
9{ 9{
10 static public $menu_principal_text = "Gestion d'une micro-entreprise"; 10 static public $menu_principal_text = "Gestion d'une micro-entreprise";
11 static public $menu_principal_entrees = ["Nouvelle prestation", "Modifier enregistrement", "Consulter/analyser les données", "Imprimer un document", "Communication", "Base de données"]; 11 static public $menu_principal_entrees = ["Nouvelle prestation", "Devis", "Modifier un enregistrement", "Consulter/analyser les données", "Imprimer un document", "Communication", "Base de données"];
12 static public $question_nouveau_client_text = "Ce client figure t\'il déjà dans le fichier clients?"; 12 static public $question_nouveau_client_text = "Ce client figure t\'il déjà dans le fichier clients?";
13 static public $menu_enregistrement_text = "Type d\'enregistrement?"; 13 static public $menu_enregistrement_text = "Type d\'enregistrement?";
14 static public $menu_enregistrement_entrees = ["Devis", "Facture", "CESU", "Location", "Prestation non vendue"]; 14 //static public $menu_enregistrement_entrees = ["Devis", "Facture", "CESU", "Location", "Prestation non vendue"];
15 static public $menu_documents_text = "Création de documents LaTeX"; 15 static public $menu_enregistrement_entrees = ["Facture", "CESU", "Location", "Prestation non vendue"];
16 static public $menu_documents_text = "Imprimer un document LaTeX";
16 static public $menu_documents_entrees = ["Devis", "Facture", "Lettre avec adresse", "Livre des recettes", "Registre des achats", "Bilan annuel"]; 17 static public $menu_documents_entrees = ["Devis", "Facture", "Lettre avec adresse", "Livre des recettes", "Registre des achats", "Bilan annuel"];
17 static public $menu_communication_text = "Imprimer un support de communication"; 18 static public $menu_communication_text = "Imprimer un support de communication";
18 static public $menu_communication_entrees = ["Flyer (nécessite gimp)", "Carte de visite (nécessite scribus)", "Explorateur de fichiers"]; 19 static public $menu_communication_entrees = ["Flyer (nécessite gimp)", "Carte de visite (nécessite scribus)", "Explorateur de fichiers"];