summaryrefslogtreecommitdiff
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
parentee372629d665ea0b77889e3cc6e9b1738310a68e (diff)
downloadAppliGestionPHP-22b941b3526dd3aaf6976eb4ed30aa2ecc30f921.zip
factorisation 1_new_service.php vers functions.php
-rw-r--r--README.txt2
-rw-r--r--data/dev.sqlitebin36864 -> 36864 bytes
-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
23 files changed, 217 insertions, 211 deletions
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,
3il ne nécessite pas de déclaration à la CNIL. 3il ne nécessite pas de déclaration à la CNIL.
4Il ne comporte aucune fonctionnalité réseau, ni aucune sécurité. 4Il ne comporte aucune fonctionnalité réseau, ni aucune sécurité.
5L'utilisateur est responsable des informations enregistrées, 5L'utilisateur est responsable des informations enregistrées,
6lesquelles ne sont destinées sortir de son ordinteur. 6lesquelles ne sont pas destinées sortir de son ordinteur.
7 7
8 8
9OS compatible: 9OS compatible:
diff --git a/data/dev.sqlite b/data/dev.sqlite
index dce37bd..c933839 100644
--- a/data/dev.sqlite
+++ b/data/dev.sqlite
Binary files 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
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"];