summaryrefslogtreecommitdiff
path: root/src/model
diff options
context:
space:
mode:
Diffstat (limited to 'src/model')
-rw-r--r--src/model/doctrine-bootstrap.php31
-rw-r--r--src/model/entities/CESU.php131
-rw-r--r--src/model/entities/Client.php314
-rw-r--r--src/model/entities/Devis.php241
-rw-r--r--src/model/entities/Facture.php261
-rw-r--r--src/model/entities/Location.php209
-rw-r--r--src/model/entities/Prestation.php252
-rw-r--r--src/model/version 0.1/CESU.php (renamed from src/model/CESU.php)0
-rw-r--r--src/model/version 0.1/Clients.php (renamed from src/model/Clients.php)0
-rw-r--r--src/model/version 0.1/DB.php (renamed from src/model/DB.php)0
-rw-r--r--src/model/version 0.1/DevisFactures.php (renamed from src/model/DevisFactures.php)0
-rw-r--r--src/model/version 0.1/Locations.php (renamed from src/model/Locations.php)0
-rw-r--r--src/model/version 0.1/Model.php (renamed from src/model/Model.php)0
-rw-r--r--src/model/version 0.1/Prestations.php (renamed from src/model/Prestations.php)110
-rw-r--r--src/model/version 0.1/StructTablesDB.php (renamed from src/model/StructTablesDB.php)0
15 files changed, 1491 insertions, 58 deletions
diff --git a/src/model/doctrine-bootstrap.php b/src/model/doctrine-bootstrap.php
new file mode 100644
index 0000000..029b1b1
--- /dev/null
+++ b/src/model/doctrine-bootstrap.php
@@ -0,0 +1,31 @@
1<?php
2// src/model/doctrine-bootstrap.php
3
4use Doctrine\DBAL\DriverManager;
5use Doctrine\ORM\EntityManager;
6use Doctrine\ORM\ORMSetup;
7
8require_once "vendor/autoload.php";
9
10// Create a simple "default" Doctrine ORM configuration for Attributes
11$config = ORMSetup::createAttributeMetadataConfiguration(
12 //paths: array(__DIR__.'/entities'),
13 paths: array('src/model/entities'),
14 isDevMode: true,
15);
16// or if you prefer XML
17// $config = ORMSetup::createXMLMetadataConfiguration(
18// paths: array(__DIR__."/config/xml"),
19// isDevMode: true,
20//);
21
22// configuring the database connection
23$connection = DriverManager::getConnection([
24 'driver' => 'pdo_sqlite',
25 //'path' => __DIR__ . '/../../data/' . Config::$db_name . '.sqlite',
26 'path' => 'data/' . Config::$db_name . '.sqlite',
27], $config);
28
29// obtaining the entity manager
30$entityManager = new EntityManager($connection, $config);
31
diff --git a/src/model/entities/CESU.php b/src/model/entities/CESU.php
new file mode 100644
index 0000000..09a2542
--- /dev/null
+++ b/src/model/entities/CESU.php
@@ -0,0 +1,131 @@
1<?php
2// src/entities/CESU.php
3
4use Doctrine\ORM\Mapping as ORM;
5use Doctrine\ORM\EntityManager;
6
7#[ORM\Entity]
8#[ORM\Table(name: 'cesu')]
9class CESU
10{
11 #[ORM\Id]
12 #[ORM\Column(type: 'integer')]
13 #[ORM\GeneratedValue]
14 private int|null $id = null;
15
16 #[ORM\ManyToOne(targetEntity: Prestation::class, cascade: ['persist'])]
17 #[ORM\JoinColumn(name: 'id_presta', referencedColumnName: 'id')]
18 private Prestation|null $presta = null;
19
20 #[ORM\Column]
21 private string $taches;
22 #[ORM\Column]
23 private string $duree_travail;
24 #[ORM\Column]
25 private float $salaire;
26
27 public static EntityManager $entityManager;
28
29 public function __construct(Prestation $presta = null)
30 {
31 if($presta != null)
32 {
33 $this->setPresta($presta);
34 }
35 }
36
37 // getters
38 public function getPresta(): Prestation
39 {
40 return $this->presta;
41 }
42
43 public function getAllWithWindowFields(): array
44 {
45 return [
46 "Tâche effectuée:" => $this->taches,
47 "Durée du travail:" => $this->duree_travail,
48 "Salaire:" => $this->salaire];
49 }
50
51 // setters
52 public function set(string $entry, string $input)
53 {
54 $input = $this->cleanSpecialChars($input); // possibilité que $input devienne une chaîne vide
55 switch($entry)
56 {
57 case "Tâche effectuée:":
58 $this->setTaches($input);
59 break;
60 case "Durée du travail:":
61 $this->setDureeTravail($input);
62 break;
63 case "Salaire:":
64 $this->setSalaire($input);
65 break;
66 }
67 }
68 private function setPresta(Prestation $input) // private?
69 {
70 $this->presta = $input;
71 }
72 public function setTaches(string $value)
73 {
74 $this->taches = $value;
75 return($this);
76 }
77 public function setDureeTravail(string $value)
78 {
79 $this->duree_travail = $value;
80 return($this);
81 }
82 public function setSalaire($value)
83 {
84 $value = str_replace(',', '.', $value);
85 $this->salaire = (float) $value;
86 return($this);
87 }
88
89 private function setAll(array $input) // private?
90 {
91 $this->taches = $input[0];
92 $this->duree_travail = $input[1];
93 $this->salaire = (float)$input[2];
94 }
95
96 // à mettre plus tard dans une classe mère
97 protected function cleanSpecialChars(string $data): string
98 {
99 $search = ['"'];
100 return str_replace($search, '', $data);
101 }
102 // à mettre plus tard dans une classe mère
103 public function hydrate(string $answers)
104 {
105 $answers = $this->cleanSpecialChars($answers); // possibilité que $answers devienne une chaine vide
106 if($answers == '')
107 {
108 echo "erreur de CESU::hydrate(), la chaine \$answers est vide.\n";
109 return false;
110 }
111 $data_array = explode('|', $answers); // array
112
113 $check = false;
114 if(count($data_array) === 4) // facture normale
115 {
116 $this->getPresta()->setModePaiement($data_array[3]);
117 //array_pop($data_array); // supprime la dernière case
118 unset($data_array[3]);
119 $this->setAll($data_array);
120 }
121 else
122 {
123 echo "erreur de CESU::hydrate(), le tableau \$data_array n'a pas la taille attendue.\n";
124 return false;
125 }
126
127 //self::$entityManager->persist('Prestation');
128 self::$entityManager->persist($this); // $Presta avec en cascade!
129 self::$entityManager->flush();
130 }
131}
diff --git a/src/model/entities/Client.php b/src/model/entities/Client.php
new file mode 100644
index 0000000..7dd3be6
--- /dev/null
+++ b/src/model/entities/Client.php
@@ -0,0 +1,314 @@
1<?php
2// src/entities/Client.php
3
4use Doctrine\ORM\Mapping as ORM;
5use Doctrine\ORM\EntityManager; // pour ClientManager?
6
7#[ORM\Entity]
8#[ORM\Table(name: 'clients')]
9class Client
10{
11 #[ORM\Id]
12 #[ORM\Column(type: 'integer')]
13 #[ORM\GeneratedValue]
14 private int|null $id = null;
15 #[ORM\Column]
16 private string $prenom_nom;
17 #[ORM\Column]
18 private string $code_client;
19 #[ORM\Column]
20 private string $adresse;
21 #[ORM\Column]
22 private string $code_postal;
23 #[ORM\Column]
24 private string $ville;
25 #[ORM\Column]
26 private string $telephone;
27 #[ORM\Column]
28 private string $courriel;
29 #[ORM\Column]
30 private string $apropos;
31 #[ORM\Column(options: ['default' => 'prospect'])]
32 private string $type = 'prospect'; // valeur par défaut utilisée à l'instanciation, pas par doctrine
33
34 public static EntityManager $entityManager;
35
36 /*public function __construct()
37 {
38 global $entityManager;
39 self::$entityManager = $entityManager;
40 }*/
41
42
43 // getters
44 public function getId(): int
45 {
46 return $this->id;
47 }
48 public function getPrenomNom(): string
49 {
50 return $this->prenom_nom;
51 }
52 public function getCodeClient(): string
53 {
54 return $this->code_client;
55 }
56 public function getAll(): array
57 {
58 // n'utiliser get_object_vars() qu'avec une entité parce qu'on maîtrise le nombre de propriétés
59 return get_object_vars($this);
60 }
61
62 // pour le GUI
63 public function getAllWithWindowFields(): array // différent de getAll()
64 {
65 return [
66 "Prénom Nom:" => $this->prenom_nom,
67 "Code client (J.C.Dusse):" => $this->code_client,
68 "Adresse:" => $this->adresse,
69 "Code postal:" => $this->code_postal,
70 "Ville:" => $this->ville,
71 "Telephone:" => $this->telephone,
72 "Courriel:" => $this->courriel,
73 "À propos:" => $this->apropos,
74 "Client ou Prospect?" => $this->type];
75 }
76
77 // setters
78 public function set(string $entry, string $input)
79 {
80 $input = $this->cleanSpecialChars($input); // possibilité que $input devienne une chaine vide
81 switch($entry)
82 {
83 case "Prénom Nom:":
84 $this->setPrenomNom($input);
85 break;
86 case "Code client (J.C.Dusse):":
87 $this->setCodeClient($input);
88 break;
89 case "Adresse:":
90 $this->setAdresse($input);
91 break;
92 case "Code postal:":
93 $this->setCodePostal($input);
94 break;
95 case "Ville:":
96 $this->setVille($input);
97 break;
98 case "Telephone:":
99 $this->setTelephone($input);
100 break;
101 case "Courriel:":
102 $this->setCourriel($input);
103 break;
104 case "À propos:":
105 $this->setApropos($input);
106 break;
107 case "Client ou Prospect?":
108 $this->setType($input);
109 break;
110 }
111 //self::$entityManager->flush();
112 }
113 public function setPrenomNom($value)
114 {
115 $this->prenom_nom = (string) $value;
116 return $this;
117 }
118 public function setCodeClient($value)
119 {
120 $this->code_client = (string) $value;
121 return $this;
122 }
123 public function setAdresse($value)
124 {
125 $this->adresse = (string) $value;
126 return $this;
127 }
128 public function setCodePostal($value)
129 {
130 $this->code_postal = (string) $value;
131 return $this;
132 }
133 public function setVille($value)
134 {
135 $this->ville = (string) $value;
136 return $this;
137 }
138 public function setTelephone($value)
139 {
140 // type string parce que:
141 // - zenity renvoie une chaine
142 // - permet de garder le 0 au début et d'inscrire plusieurs numéros
143 $this->telephone = (string) $value;
144 return $this;
145 }
146 public function setCourriel($value)
147 {
148 $this->courriel = (string) $value;
149 return $this;
150 }
151 public function setApropos($value)
152 {
153 $this->apropos = (string) $value;
154 return $this;
155 }
156 public function setType($value)
157 {
158 $this->type = (string) $value;
159 return $this;
160 }
161
162 public function typeToClient()
163 {
164 if($this->type != 'client')
165 {
166 $this->type = 'client';
167 }
168 }
169
170 private function setAll(array $input)
171 {
172 $this->prenom_nom = $input[0];
173 $this->code_client = $input[1];
174 $this->adresse = $input[2];
175 $this->code_postal = $input[3];
176 $this->ville = $input[4];
177 $this->telephone = $input[5];
178 $this->courriel = $input[6];
179 $this->apropos = $input[7];
180 }
181
182 // à mettre dans une classe mère Model?
183 protected function cleanSpecialChars(string $data): string
184 {
185 $search = ['"'];
186 return str_replace($search, '', $data);
187 }
188
189 // une partie du code vient de Model::hydrateFromForm()
190 // à mettre dans une classe ClientManager?
191 public function enterCustomer(ZenityForms $Form): bool
192 {
193 $input = exec($Form->get());
194 if($input == '')
195 {
196 echo "debug: annulation lors de l'enregistrement d'un nouveau client\n";
197 return false;
198 }
199
200 $data_array = explode('|', $input); // array
201 if($data_array[0] == '')
202 {
203 echo "debug: données insuffisantes, le nom du client doit au minimum être renseigné\n";
204 return false;
205 }
206 else
207 {
208 $this->setAll($data_array);
209 }
210
211 self::$entityManager->persist($this);
212 self::$entityManager->flush();
213
214 //$this->id = $this->db->lastInsertId(); // synchro automatique avec doctrine
215
216 return true;
217 }
218
219 public static function getObject(ZenityEntry $SearchCustomerForm, ZenityList $SearchCustomerResults) // renvoie un Client ou 0
220 {
221 // fenêtres
222 /*$SearchCustomerForm = new ZenityEntry(ZenitySetup::$recherche_client_text);
223 $SearchCustomerResults = new ZenityList(ZenitySetup::$resultats_recherche_client_text, []);*/
224
225 $Customer = new self; // se serait bien d'hériter d'EntityManager?
226
227 $input = exec($SearchCustomerForm->get());
228 if($input == '') // commenter ce if pour qu'une saisie vide permette d'obtenir tous les clients
229 {
230 echo "debug: recherche annulée ou saisie vide\n";
231 return 0;
232 }
233 echo "debug: recherche effectuée\n";
234
235 $MatchedObjects = self::searchCustomer($input, $Customer);
236 if(count($MatchedObjects) === 0) // si aucun client ne correspond, les prendre tous!
237 {
238 $repository = self::$entityManager->getRepository('Client');
239 $MatchedObjects = $repository->findAll();
240
241 if(count($MatchedObjects) === 0) // toujours rien
242 {
243 echo "debug: aucun client dans la base de données\n";
244 return 0;
245 }
246 }
247
248 $clients_array = [];
249 foreach($MatchedObjects as $object) // d'objets en tableaux
250 {
251 $clients_array[] = get_object_vars($object);
252 }
253
254 $SearchCustomerResults->setListRows(
255 $clients_array,
256 //count($clients_array[$id]));
257 count($clients_array[0]));
258
259 // sélection parmi les résultats
260 $input = exec($SearchCustomerResults->get()); // renvoie l'id de la table 'clients'
261 if($input == '')
262 {
263 echo "debug: client pas trouvé ou pas sélectionné\n";
264 return 0;
265 }
266
267 echo "debug: client sélectionné\n";
268 //$Customer->setId($input);
269 //$Customer->hydrate($Customer->findById());
270 $Customer = $MatchedObjects[$input];
271 //var_dump($Customer);
272
273 return $Customer;
274 }
275
276 private static function searchCustomer(string $input, Client $Customer): array
277 {
278 $input_array = explode(' ', $input); // si plusieurs mot, on les recherche tous l'un après l'autre
279 return $Customer->findByKeywords($input_array, 'prenom_nom'); // on obtient un tableau à deux dimensions avec les entrées trouvées
280 }
281
282 private function findByKeywords(array $keywords, string $field): array // renvoie un tableau d'objets
283 {
284 $results = [];
285 for($i = 0; $i < count($keywords); $i++)
286 {
287 // tableau à deux dimensions obtenu pour un mot clé
288 //$query_result = $this->execQuery('SELECT * FROM ' . $this->table . ' WHERE ' . $field . ' LIKE "%' . $keywords[$i] . '%"')->fetchAll();
289 $query = self::$entityManager->createQuery('SELECT u FROM Client u WHERE u.' . $field . ' LIKE :expression');
290 $query->setParameter('expression', '%' . $keywords[$i] . '%');
291 $query_result = $query->getResult();
292
293 foreach($query_result as $object)
294 {
295 $id = $object->getId();
296 $already_exist = false;
297 //for($j = 0; $j < count($results); $j++)
298 foreach($results as $one_result) // pour chaque tableau déjà enregistré dans le tableau $results
299 {
300 if($one_result->getId() === $id)
301 {
302 $already_exist = true;
303 }
304 }
305 if(!$already_exist)
306 {
307 $results[$id] = $object;
308 }
309 }
310 }
311 //var_dump($results);
312 return $results;
313 }
314}
diff --git a/src/model/entities/Devis.php b/src/model/entities/Devis.php
new file mode 100644
index 0000000..7383410
--- /dev/null
+++ b/src/model/entities/Devis.php
@@ -0,0 +1,241 @@
1<?php
2// src/entities/Devis.php
3
4use Doctrine\ORM\Mapping as ORM;
5use Doctrine\ORM\EntityManager;
6
7#[ORM\Entity]
8#[ORM\Table(name: 'devis')]
9class Devis
10{
11 #[ORM\Id]
12 #[ORM\Column(type: 'integer')]
13 #[ORM\GeneratedValue]
14 private int|null $id = null;
15
16 #[ORM\ManyToOne(targetEntity: Prestation::class, cascade: ['persist'])]
17 #[ORM\JoinColumn(name: 'id_presta', referencedColumnName: 'id')]
18 private Prestation|null $presta = null;
19
20 #[ORM\Column]
21 private string $taches;
22 #[ORM\Column]
23 private float $total_main_d_oeuvre;
24 #[ORM\Column]
25 private string $pieces;
26 #[ORM\Column]
27 private float $total_pieces;
28 #[ORM\Column]
29 private float $deplacement;
30 #[ORM\Column]
31 private float $prix_devis;
32 #[ORM\Column]
33 private float $total_HT;
34 #[ORM\Column]
35 private string $delai_livraison;
36 #[ORM\Column]
37 private string $validite_devis;
38 #[ORM\Column (options: ['default' => 'non'])]
39 private string $signature_devis = 'non';
40
41 public static EntityManager $entityManager;
42
43 public function __construct(Prestation $presta = null)
44 {
45 if($presta != null)
46 {
47 $this->setPresta($presta);
48 }
49 }
50
51 // getters
52 public function getPresta(): Prestation
53 {
54 return $this->presta;
55 }
56 public function getAll(): array
57 {
58 // n'utiliser get_object_vars() qu'avec une entité parce qu'on maîtrise le nombre de propriétés
59 return get_object_vars($this);
60 }
61
62 public function getAllWithWindowFields(): array
63 {
64 //~ $taches = ["Tâches:" => $this->taches];
65 //~ $champs_communs = [
66 //~ "Total Main d'oeuvre:" => $this->total_main_d_oeuvre,
67 //~ "Pièces:" => $this->pieces,
68 //~ "Total des pièces:" => $this->total_pieces,
69 //~ "Déplacement:" => $this->deplacement,
70 //~ "Total HT:" => $this->total_HT];
71 //~ $champs_devis = [
72 //~ "Delai de livraison:" => $this->delai_livraison,
73 //~ "Durée de validité:" => $this->validite_devis,
74 //~ "Devis signé:" => $this->signature_devis];
75 //~ return $champs_communs + $champs_devis;
76 return [
77 "Tâches:" => $this->taches, // JUSTE AJOUTÉ
78 "Total Main d'oeuvre:" => $this->total_main_d_oeuvre,
79 "Pièces:" => $this->pieces,
80 "Total des pièces:" => $this->total_pieces,
81 "Déplacement:" => $this->deplacement,
82 "Total HT:" => $this->total_HT,
83 "Delai de livraison:" => $this->delai_livraison,
84 "Durée de validité:" => $this->validite_devis,
85 "Devis signé:" => $this->signature_devis];
86 }
87
88 // setters
89 public function set(string $entry, string $input) // trouve la bonne méthode
90 {
91 $input = $this->cleanSpecialChars($input); // possibilité que $input devienne une chaîne vide
92 switch($entry)
93 {
94 case "Tâches:":
95 $this->setTaches($input);
96 break;
97 case "Total Main d'oeuvre:":
98 $this->setTotalMainDOeuvre($input);
99 break;
100 case "Pièces:":
101 $this->setPieces($input);
102 break;
103 case "Total des pièces:":
104 $this->setTotalPieces($input);
105 break;
106 case "Déplacement:":
107 $this->setDeplacement($input);
108 break;
109 case "Prix du devis:":
110 $this->setPrixDevis($input);
111 break;
112 case "Total HT:":
113 $this->setTotalHT($input);
114 break;
115 case "Delai de livraison:":
116 $this->setDelaiLivraison($input);
117 break;
118 case "Durée de validité:":
119 $this->setValiditedevis($input);
120 break;
121 case "Devis signé:":
122 $this->setSignatureDevis($input);
123 break;
124 }
125 }
126 private function setPresta(Prestation $input) // private?
127 {
128 $this->presta = $input;
129 }
130 public function setTaches(string $value)
131 {
132 $this->taches = $value;
133 return($this);
134 }
135 public function setTotalMainDOeuvre($value)
136 {
137 $value = str_replace(',', '.', $value);
138 $this->total_main_d_oeuvre = (float) $value; // float "nettoie" tous les caractères après le dernier chiffre trouvé (ex: 50€ => 50, abc => 0)
139 return($this);
140 }
141 public function setPieces(string $value)
142 {
143 $this->pieces = $value;
144 return($this);
145 }
146 public function setTotalPieces($value)
147 {
148 $value = str_replace(',', '.', $value);
149 $this->total_pieces = (float) $value;
150 return($this);
151 }
152 public function setDeplacement($value)
153 {
154 $value = str_replace(',', '.', $value);
155 $this->deplacement = (float) $value;
156 return($this);
157 }
158 public function setTotalHT($value)
159 {
160 $value = str_replace(',', '.', $value);
161 $this->total_HT = (float) $value;
162 return($this);
163 }
164 public function setPrixDevis($value)
165 {
166 $value = str_replace(',', '.', $value);
167 $this->prix_devis = (float) $value;
168 return($this);
169 }
170 public function setDelaiLivraison(string $value)
171 {
172 $this->delai_livraison = $value;
173 return($this);
174 }
175 public function setValiditedevis(string $value)
176 {
177 $this->validite_devis = $value;
178 return($this);
179 }
180 public function setSignatureDevis(string $value)
181 {
182 $this->signature_devis = $value;
183 return($this);
184 }
185
186 private function setAll(array $input) // private?
187 {
188 $this->taches = $input[0];
189 $this->total_main_d_oeuvre = (float)$input[1];
190 $this->pieces = $input[2];
191 $this->total_pieces = (float)$input[3];
192 $this->deplacement = (float)$input[4];
193 $this->prix_devis = (float)$input[5];
194 $this->total_HT = (float)$input[6];
195 $this->delai_livraison = $input[7];
196 $this->validite_devis = $input[8];
197
198 // $signature_devis est renseigné plus tard en modifiant le devis
199 }
200
201 // à mettre plus tard dans une classe mère
202 protected function cleanSpecialChars(string $data): string
203 {
204 $search = ['"'];
205 return str_replace($search, '', $data);
206 }
207 // à mettre plus tard dans une classe mère
208 public function hydrate(string $answers)
209 {
210 $answers = $this->cleanSpecialChars($answers); // possibilité que $answers devienne une chaine vide
211 if($answers == '')
212 {
213 echo "erreur de Devis::hydrate(), la chaine \$answers est vide.\n";
214 return false;
215 }
216 $data_array = explode('|', $answers); // array
217
218 $check = false;
219 if(count($data_array) === 9) // facture normale
220 {
221 $this->getPresta()->setModePaiement(''); // sécurité, doctrine plante si "null"
222 $this->setAll($data_array);
223 }
224 else
225 {
226 echo "erreur de Devis::hydrate(), le tableau \$data_array n'a pas la taille attendue.\n";
227 return false;
228 }
229
230 //self::$entityManager->persist('Prestation');
231 self::$entityManager->persist($this); // $Presta avec en cascade!
232 self::$entityManager->flush();
233 }
234
235 // création d'une facture à partir d'un devis
236 public static function getQuotation(Prestation $Quotation)
237 {
238 $repository = self::$entityManager->getRepository('Devis');
239 return $repository->findOneBy(['presta' => $Quotation->getId()]); // ne peut y en avoir deux
240 }
241}
diff --git a/src/model/entities/Facture.php b/src/model/entities/Facture.php
new file mode 100644
index 0000000..3a8a551
--- /dev/null
+++ b/src/model/entities/Facture.php
@@ -0,0 +1,261 @@
1<?php
2// src/entities/Facture.php
3
4use Doctrine\ORM\Mapping as ORM;
5use Doctrine\ORM\EntityManager;
6
7#[ORM\Entity]
8#[ORM\Table(name: 'factures')]
9class Facture
10{
11 #[ORM\Id]
12 #[ORM\Column(type: 'integer')]
13 #[ORM\GeneratedValue]
14 private int|null $id = null;
15
16 #[ORM\ManyToOne(targetEntity: Prestation::class, cascade: ['persist'])]
17 #[ORM\JoinColumn(name: 'id_presta', referencedColumnName: 'id')]
18 private Prestation|null $presta = null;
19
20 #[ORM\Column]
21 private string $taches;
22 #[ORM\Column]
23 private string $machine;
24 #[ORM\Column]
25 private string $OS;
26 #[ORM\Column]
27 private string $donnees;
28 #[ORM\Column]
29 private string $cles_licences;
30 #[ORM\Column]
31 private float $total_main_d_oeuvre;
32 #[ORM\Column]
33 private string $pieces;
34 #[ORM\Column]
35 private float $total_pieces;
36 #[ORM\Column]
37 private float $deplacement;
38 #[ORM\Column]
39 private float $total_HT;
40
41 public static EntityManager $entityManager;
42
43 public function __construct(Prestation $presta = null)
44 {
45 if($presta != null)
46 {
47 $this->setPresta($presta);
48 }
49 }
50
51 // getters
52 public function getPresta(): Prestation
53 {
54 return $this->presta;
55 }
56 public function getAll(): array
57 {
58 // n'utiliser get_object_vars() qu'avec une entité parce qu'on maîtrise le nombre de propriétés
59 return get_object_vars($this);
60 }
61
62 public function getAllWithWindowFields(): array
63 {
64 //~ $taches = ["Tâches:" => $this->taches];
65 //~ $champs_facture = [
66 //~ "PC:" => $this->machine,
67 //~ "OS:" => $this->OS,
68 //~ "Données:" => $this->donnees,
69 //~ "Clés de licences:" => $this->cles_licences];
70 //~ $champs_communs = [
71 //~ "Total Main d'oeuvre:" => $this->total_main_d_oeuvre,
72 //~ "Pièces:" => $this->pieces,
73 //~ "Total des pièces:" => $this->total_pieces,
74 //~ "Déplacement:" => $this->deplacement,
75 //~ "Total HT:" => $this->total_HT];
76 //return $taches + $champs_facture + $champs_communs;
77 return [
78 "Tâches:" => $this->taches,
79 "PC:" => $this->machine,
80 "OS:" => $this->OS,
81 "Données:" => $this->donnees,
82 "Clés de licences:" => $this->cles_licences,
83 "Total Main d'oeuvre:" => $this->total_main_d_oeuvre,
84 "Pièces:" => $this->pieces,
85 "Total des pièces:" => $this->total_pieces,
86 "Déplacement:" => $this->deplacement,
87 "Total HT:" => $this->total_HT];
88 }
89
90 // setters
91 public function set(string $entry, string $input) // trouve la bonne méthode
92 {
93 $input = $this->cleanSpecialChars($input); // possibilité que $input devienne une chaîne vide
94 switch($entry)
95 {
96 case "Tâches:":
97 $this->setTaches($input);
98 break;
99 case "PC:":
100 $this->setMachine($input);
101 break;
102 case "OS:":
103 $this->setOS($input);
104 break;
105 case "Données:":
106 $this->setDonnees($input);
107 break;
108 case "Clés de licences:":
109 $this->setClesLicences($input);
110 break;
111 case "Total Main d'oeuvre:":
112 $this->setTotalMainDOeuvre($input);
113 break;
114 case "Pièces:":
115 $this->setPieces($input);
116 break;
117 case "Total des pièces:":
118 $this->setTotalPieces($input);
119 break;
120 case "Déplacement:":
121 $this->setDeplacement($input);
122 break;
123 case "Total HT:":
124 $this->setTotalHT($input);
125 break;
126 }
127 }
128 public function setPresta(Prestation $input) // private?
129 {
130 $this->presta = $input;
131 }
132 public function setTaches(string $value)
133 {
134 $this->taches = $value;
135 return($this);
136 }
137 public function setMachine(string $value)
138 {
139 $this->machine = $value;
140 return($this);
141 }
142 public function setOS(string $value)
143 {
144 $this->OS = $value;
145 return($this);
146 }
147 public function setDonnees(string $value)
148 {
149 $this->donnees = $value;
150 return($this);
151 }
152 public function setClesLicences(string $value)
153 {
154 $this->cles_licences = $value;
155 return($this);
156 }
157 public function setTotalMainDOeuvre($value)
158 {
159 $value = str_replace(',', '.', $value);
160 $this->total_main_d_oeuvre = (float) $value; // float "nettoie" tous les caractères après le dernier chiffre trouvé (ex: 50€ => 50, abc => 0)
161 return($this);
162 }
163 public function setPieces(string $value)
164 {
165 $this->pieces = $value;
166 return($this);
167 }
168 public function setTotalPieces($value)
169 {
170 $value = str_replace(',', '.', $value);
171 $this->total_pieces = (float) $value;
172 return($this);
173 }
174 public function setDeplacement($value)
175 {
176 $value = str_replace(',', '.', $value);
177 $this->deplacement = (float) $value;
178 return($this);
179 }
180 public function setTotalHT($value)
181 {
182 $value = str_replace(',', '.', $value);
183 $this->total_HT = (float) $value;
184 return($this);
185 }
186
187 private function setAll(array $input) // private?
188 {
189 $this->taches = $input[0];
190 $this->machine = $input[1];
191 $this->OS = $input[2];
192 $this->donnees = $input[3];
193 $this->cles_licences = $input[4];
194 $this->total_main_d_oeuvre = (float)$input[5];
195 $this->pieces = $input[6];
196 $this->total_pieces = (float)$input[7];
197 $this->deplacement = (float)$input[8];
198 $this->total_HT = (float)$input[9];
199 }
200 private function setServiceFromQuotation(array $input) // private?
201 {
202 $this->machine = $input[0];
203 $this->OS = $input[1];
204 $this->donnees = $input[2];
205 $this->cles_licences = $input[3];
206 }
207
208 // à mettre plus tard dans une classe mère
209 protected function cleanSpecialChars(string $data): string
210 {
211 $search = ['"'];
212 return str_replace($search, '', $data);
213 }
214 // à mettre plus tard dans une classe mère
215 public function hydrate(string $answers)
216 {
217 $answers = $this->cleanSpecialChars($answers); // possibilité que $answers devienne une chaine vide
218 if($answers == '')
219 {
220 echo "erreur de Facture::hydrate(), la chaine \$answers est vide.\n";
221 return false;
222 }
223 $data_array = explode('|', $answers); // array
224
225 $check = false;
226 if(count($data_array) === 11) // facture normale
227 {
228 $this->getPresta()->setModePaiement($data_array[10]);
229 //array_pop($data_array); // supprime la dernière case
230 unset($data_array[10]);
231 $this->setAll($data_array);
232 }
233 elseif(count($data_array) === 5) // facture à partir d'un devis
234 {
235 $this->getPresta()->setModePaiement($data_array[4]);
236 unset($data_array[4]);
237 $this->setServiceFromQuotation($data_array);
238 }
239 else
240 {
241 echo "erreur de Facture::hydrate(), le tableau \$data_array n'a pas la taille attendue.\n";
242 return false;
243 }
244
245 //self::$entityManager->persist('Prestation');
246 self::$entityManager->persist($this); // $Presta avec en cascade!
247 self::$entityManager->flush();
248 }
249
250 public function hydrateWithQuotation(Devis $QuotationDetails)
251 {
252 $data = $QuotationDetails->getAll();
253 //var_dump($data);die;
254 $this->taches = $data['taches'];
255 $this->total_main_d_oeuvre = $data['total_main_d_oeuvre'];
256 $this->pieces = $data['pieces'];
257 $this->total_pieces = $data['total_pieces'];
258 $this->deplacement = $data['deplacement'];
259 $this->total_HT = $data['total_HT'];
260 }
261}
diff --git a/src/model/entities/Location.php b/src/model/entities/Location.php
new file mode 100644
index 0000000..7ce6f0d
--- /dev/null
+++ b/src/model/entities/Location.php
@@ -0,0 +1,209 @@
1<?php
2// src/entities/Location.php
3
4use Doctrine\ORM\Mapping as ORM;
5use Doctrine\ORM\EntityManager;
6
7#[ORM\Entity]
8#[ORM\Table(name: 'locations')]
9class Location
10{
11 #[ORM\Id]
12 #[ORM\Column(type: 'integer')]
13 #[ORM\GeneratedValue]
14 private int|null $id = null;
15
16 #[ORM\ManyToOne(targetEntity: Prestation::class, cascade: ['persist'])]
17 #[ORM\JoinColumn(name: 'id_presta', referencedColumnName: 'id')]
18 private Prestation|null $presta = null;
19
20 #[ORM\Column]
21 protected string $designation;
22 #[ORM\Column]
23 protected string $modele_description;
24 #[ORM\Column]
25 protected float $valeur;
26 #[ORM\Column]
27 protected string $etat_des_lieux_debut;
28 #[ORM\Column]
29 protected string $etat_des_lieux_fin = '';
30 #[ORM\Column]
31 protected string $duree_location;
32 #[ORM\Column]
33 protected float $loyer_hebdo;
34 #[ORM\Column]
35 protected int $loyers_payes;
36 #[ORM\Column]
37 protected int $caution;
38
39 public static EntityManager $entityManager;
40
41 public function __construct(Prestation $presta = null)
42 {
43 if($presta != null)
44 {
45 $this->setPresta($presta);
46 }
47 }
48
49 // getters
50 public function getPresta(): Prestation
51 {
52 return $this->presta;
53 }
54 public function getAll(): array
55 {
56 // n'utiliser get_object_vars() qu'avec une entité parce qu'on maîtrise le nombre de propriétés
57 return get_object_vars($this);
58 }
59
60 public function getAllWithWindowFields(): array
61 {
62 return [
63 "Désignation:" => $this->designation,
64 "Description du modèle:" => $this->modele_description,
65 "Valeur:" => $this->valeur,
66 "État des lieux de début:" => $this->etat_des_lieux_debut,
67 "État des lieux de fin:" => $this->etat_des_lieux_fin,
68 "Durée de la location:" => $this->duree_location,
69 "Loyer Hebdomadaire:" => $this->loyer_hebdo,
70 "Loyers Payés:" => $this->loyers_payes,
71 "Caution:" => $this->caution];
72 }
73
74 // setters
75 public function set(string $entry, string $input)
76 {
77 $input = $this->cleanSpecialChars($input); // possibilité que $input devienne une chaîne vide
78 switch($entry)
79 {
80 case "Désignation:":
81 $this->setDesignation($input);
82 break;
83 case "Description du modèle:":
84 $this->setModeleDescription($input);
85 break;
86 case "Valeur:":
87 $this->setValeur($input);
88 break;
89 case "État des lieux de début:":
90 $this->setEtatDesLieuxDebut($input);
91 break;
92 case "État des lieux de fin:":
93 $this->setEtatDesLieuxFin($input);
94 break;
95 case "Durée de la location:":
96 $this->setDureeLocation($input);
97 break;
98 case "Loyer Hebdomadaire:":
99 $this->setLoyerHebdo($input);
100 break;
101 case "Loyers Payés:":
102 $this->setLoyersPayes($input);
103 break;
104 case "Caution:":
105 $this->setCaution($input);
106 break;
107 }
108 }
109 private function setPresta(Prestation $input) // private?
110 {
111 $this->presta = $input;
112 }
113 public function setDesignation(string $value)
114 {
115 $this->designation = $value;
116 return($this);
117 }
118 public function setModeleDescription(string $value)
119 {
120 $this->modele_description = $value;
121 return($this);
122 }
123 public function setValeur($value)
124 {
125 $value = str_replace(',', '.', $value);
126 $this->valeur = (float) $value;
127 return($this);
128 }
129 public function setEtatDesLieuxDebut(string $value)
130 {
131 $this->etat_des_lieux_debut = $value;
132 return($this);
133 }
134 public function setEtatDesLieuxFin(string $value)
135 {
136 $this->etat_des_lieux_fin = $value;
137 return($this);
138 }
139 public function setDureeLocation(string $value)
140 {
141 $this->duree_location = $value;
142 return($this);
143 }
144 public function setLoyerMensuel($value)
145 {
146 $value = str_replace(',', '.', $value);
147 $this->loyer_mensuel = (float) $value;
148 return($this);
149 }
150 public function setLoyersPayes($value)
151 {
152 $value = str_replace(',', '.', $value);
153 $this->loyers_payes = (float) $value;
154 return($this);
155 }
156 public function setCaution($value)
157 {
158 $value = str_replace(',', '.', $value);
159 $this->caution = (float) $value;
160 return($this);
161 }
162
163 private function setAll(array $input) // private?
164 {
165 $this->designation = $input[0];
166 $this->modele_description = $input[1];
167 $this->valeur = (float)$input[2];
168 $this->etat_des_lieux_debut = $input[3];
169 $this->etat_des_lieux_fin = ''; // sécurité
170 $this->duree_location = $input[4];
171 $this->loyer_hebdo = (float)$input[5];
172 $this->loyers_payes = (int)$input[6];
173 $this->caution = (int)$input[7];
174 }
175
176 // à mettre plus tard dans une classe mère
177 protected function cleanSpecialChars(string $data): string
178 {
179 $search = ['"'];
180 return str_replace($search, '', $data);
181 }
182 // à mettre plus tard dans une classe mère
183 public function hydrate(string $answers)
184 {
185 $answers = $this->cleanSpecialChars($answers); // possibilité que $answers devienne une chaine vide
186 if($answers == '')
187 {
188 echo "erreur de Location::hydrate(), la chaine \$answers est vide.\n";
189 return false;
190 }
191 $data_array = explode('|', $answers); // array
192
193 $check = false;
194 if(count($data_array) === 8)
195 {
196 $this->getPresta()->setModePaiement(''); // sécurité, doctrine plante si "null"
197 $this->setAll($data_array);
198 }
199 else
200 {
201 echo "erreur de Location::hydrate(), le tableau \$data_array n'a pas la taille attendue.\n";
202 return false;
203 }
204
205 //self::$entityManager->persist('Prestation');
206 self::$entityManager->persist($this); // $Presta avec en cascade!
207 self::$entityManager->flush();
208 }
209}
diff --git a/src/model/entities/Prestation.php b/src/model/entities/Prestation.php
new file mode 100644
index 0000000..6d014d8
--- /dev/null
+++ b/src/model/entities/Prestation.php
@@ -0,0 +1,252 @@
1<?php
2// src/entities/Prestation.php
3
4use Doctrine\ORM\Mapping as ORM;
5use Doctrine\ORM\EntityManager;
6
7#[ORM\Entity]
8#[ORM\Table(name: 'prestations')]
9class Prestation
10{
11 #[ORM\Id]
12 #[ORM\Column(type: 'integer')]
13 #[ORM\GeneratedValue]
14 private int|null $id = null;
15
16 #[ORM\ManyToOne(targetEntity: Client::class, cascade: ['persist'])]
17 #[ORM\JoinColumn(name: 'id_client', referencedColumnName: 'id')]
18 private Client|null $client = null; // type int en SQL et dans la base
19
20 #[ORM\Column]
21 private string $code_presta;
22 #[ORM\Column]
23 private int $date; // timestamp unix
24 #[ORM\Column]
25 private string $type_presta;
26 #[ORM\Column]
27 private string $mode_paiement = ''; // non renseigné quand on fait un devis
28 #[ORM\Column]
29 private string $commentaires;
30
31 public static EntityManager $entityManager;
32
33
34 public function __construct(Client $client = null)
35 {
36 if($client != null)
37 {
38 $this->setClient($client);
39 }
40 }
41
42 // getters
43 public function getId(): int
44 {
45 return $this->id;
46 }
47 public function getCodePresta(): string
48 {
49 return $this->code_presta;
50 }
51 public function getDate(): int
52 {
53 return $this->date;
54 }
55 public function getTypePresta(): string
56 {
57 return $this->type_presta;
58 }
59 public function getClient(): Client
60 {
61 return $this->client;
62 }
63 public function getAll(): array
64 {
65 // n'utiliser get_object_vars() qu'avec une entité parce qu'on maîtrise le nombre de propriétés
66 return get_object_vars($this);
67 }
68
69 public function getAllWithWindowFields(): array // différent de Model::getAll() qui retourne get_object_vars($this)
70 {
71 $code_presta_tableau = explode('-', $this->code_presta);
72 $Date = new Dates($this->date);
73
74 return [
75 //"Numéro prestation:" => end($code_presta_tableau), // crée des conflits, calcul automatique par setCodePresta()
76 "Date:" => $Date->getDate(),
77 //"Type de Presta:" => $this->type_presta, // choix impossible pour le moment
78 "Mode de paiement:" => $this->mode_paiement, // non pertinent pour un devis
79 "Commentaires:" => $this->commentaires];
80 }
81
82 // setters
83 //~ public function setCodePresta(string $value)
84 //~ {
85 //~ $this->code_presta = $value;
86 //~ return $this;
87 //~ }
88 //public function setDate(int $value)
89 public function setDate(Dates $Date)
90 {
91 //$this->date = (int)$value; // attend un timestamp
92 $this->date = $Date->getTimestamp();
93 return $this;
94 /*if($set_code_presta)
95 {
96 $code_presta_tableau = explode('-', $this->code_presta);
97 $Date = new Dates($value);
98 $code_presta_tableau[0] = $Date->getYear();
99 $code_presta_tableau[1] = $Date->getMonth();
100 $code_presta_tableau[2] = $Date->getDay();
101 $this->code_presta = implode('-', $code_presta_tableau);
102 }*/
103 }
104
105 public function setTypePresta(string $value) // appelée dans la section 2 uniquement, pour la 3 on verra plus tard
106 {
107 $this->type_presta = $value;
108 return $this;
109 }
110 public function setModePaiement(string $value)
111 {
112 $this->mode_paiement = $value;
113 return $this;
114 }
115 public function setCommentaires(string $input)
116 {
117 $this->commentaires = $input;
118 }
119 /*public function setAll(array $input)
120 {
121 $this->code_presta = $input[0];
122 $this->date = $input[1];
123 $this->type_presta = $input[2];
124 $this->mode_paiement = $input[3];
125 $this->commentaires = $input[4];
126 }*/
127
128 private function setClient(Client $input) // private?
129 {
130 $this->client = $input;
131 //$input->typeToClient(); // on modifie $client ici (merci les références PHP)
132 }
133
134 public function set(string $entry, $input) // $input = chaîne ou entier
135 {
136 if(gettype($input) === 'string')
137 {
138 $input = $this->cleanSpecialChars($input); // possibilité que $input devienne une chaine vide
139 }
140 switch($entry)
141 {
142 // pas de cas "code presta" qui généré par setCodePresta, on peut modifier la date (ici) et le code client (ailleurs)
143 //~ case "Numéro prestation:":
144 //~ $this->setNumeroPresta($input);
145 //~ // modifier le code presta en conséquence
146 //~ break;
147 case "Date:": // inutile, setDate() est appelé directement après choix fenêtre calendrier
148 $this->setDate($input);
149 break;
150 //~ case "Type de Presta:": // choix impossible pour le moment
151 //~ $this->setTypePresta($input);
152 //~ break;
153 case "Mode de paiement:":
154 $this->setModePaiement($input);
155 break;
156 case "Commentaires:":
157 $this->setCommentaires($input);
158 break;
159 }
160 }
161
162 // code presta = année-mois-jour-codeclient-typedepresta-combientièmefois
163 public function setCodePresta(int $increment) // 0 pour modif, 1 pour nouvelle presta
164 {
165 $Date = new Dates($this->date);
166 $repository = self::$entityManager->getRepository('Prestation'); // prestas de tout type d'un client
167 // attention: il peut y avoir plusieurs prestations avec le même numéro au compteur, à améliorer
168 $combientieme_fois = count($repository->findBy(['client' => $this->client->getId()])) + $increment;
169 //var_dump($combientieme_fois);
170 $array_code = [$Date->getYear(), $Date->getMonth(), $Date->getDay(), $this->client->getCodeClient(), $this->type_presta, $combientieme_fois];
171 //~ $array_code[0] = $Date->getYear();
172 //~ $array_code[1] = $Date->getMonth();
173 //~ $array_code[2] = $Date->getDay();
174 //~ $array_code[3] = $this->client->getCodeClient(); // mise à jour éventuelle
175 //~ $array_code[4] = $this->type_presta;
176 $this->code_presta = implode('-', $array_code);
177 return $this;
178 }
179 // combientième fois au choix (ne fonctionne pas avec setCodePresta qui recalculera ce numéro automatiquement à la prochaine modification)
180 //~ public function setNumeroPresta($value)
181 //~ {
182 //~ // modifier le code presta, on pourrait aussi utiliser une regex
183 //~ $code_presta_tableau = explode('-', $this->code_presta);
184 //~ $code_presta_tableau[count($code_presta_tableau) - 1] = (int) $value; // dernière case du tableau
185 //~ $this->code_presta = implode('-', $code_presta_tableau);
186 //~ return $this;
187 //~ }
188
189 public static function getServices(Client $Customer, string $type = '')
190 {
191 echo "debug: recherche d'une prestation\n";
192
193 // requête DQL qui fait la même chose que le findBy plus bas
194 /*$query = self::$entityManager->createQuery('SELECT u FROM Prestation u WHERE u.client = :id_client AND u.type_presta = :type_presta');
195 $query->setParameter('id_client', $Customer->getId());
196 $query->setParameter('type_presta', $type);
197 $query_result = $query->getResult();
198 var_dump($query_result);die;*/
199
200 $repository = self::$entityManager->getRepository('Prestation');
201 $find_by = ['client' => $Customer->getId()];
202 if($type != '')
203 {
204 $find_by['type_presta'] = 'devis';
205 }
206 $PrestaList = $repository->findBy($find_by);
207
208 // le même tableau avec pour clés les id des objets
209 $PrestaListIdKeys = [];
210 foreach($PrestaList as $Presta)
211 {
212 $id = $Presta->getId();
213 $PrestaListIdKeys[$id] = $Presta;
214 }
215
216 // fenêtre
217 $entrees = [];
218 foreach($PrestaListIdKeys as $Presta)
219 {
220 $id = $Presta->getId();
221 $entrees[$id][] = $id;
222 $Date = new Dates((int)$Presta->getDate()); // envoi du timestamp, (int) est là par sécurité
223 $entrees[$id][] = $Date->getDate();
224 $entrees[$id][] = $Presta->getTypePresta();
225 $entrees[$id][] = $Presta->getCodePresta();
226 }
227
228 // pas à la bonne place, couper la fonction en deux et mettre ça ailleurs!
229 $ResultatsRecherchePresta = new ZenityList(ZenitySetup::$resultats_recherche_presta['text'], []);
230 $ResultatsRecherchePresta->setListRows($entrees, 4);
231
232 // choix de l'utilisateur
233 $input = exec($ResultatsRecherchePresta->get()); // $input est l'ID de la prestation
234 //echo "input = " . $input . "\n";
235 if($input == '')
236 {
237 echo "debug: recherche annulée ou saisie vide\n";
238 return 0;
239 }
240 else
241 {
242 return $PrestaListIdKeys[$input];
243 }
244 }
245
246 // à mettre plus tard dans une classe mère
247 private function cleanSpecialChars(string $data): string
248 {
249 $search = ['"'];
250 return str_replace($search, '', $data);
251 }
252}
diff --git a/src/model/CESU.php b/src/model/version 0.1/CESU.php
index 2768b8f..2768b8f 100644
--- a/src/model/CESU.php
+++ b/src/model/version 0.1/CESU.php
diff --git a/src/model/Clients.php b/src/model/version 0.1/Clients.php
index 32cf0c5..32cf0c5 100644
--- a/src/model/Clients.php
+++ b/src/model/version 0.1/Clients.php
diff --git a/src/model/DB.php b/src/model/version 0.1/DB.php
index 47407ba..47407ba 100644
--- a/src/model/DB.php
+++ b/src/model/version 0.1/DB.php
diff --git a/src/model/DevisFactures.php b/src/model/version 0.1/DevisFactures.php
index 06a0a59..06a0a59 100644
--- a/src/model/DevisFactures.php
+++ b/src/model/version 0.1/DevisFactures.php
diff --git a/src/model/Locations.php b/src/model/version 0.1/Locations.php
index c6b8deb..c6b8deb 100644
--- a/src/model/Locations.php
+++ b/src/model/version 0.1/Locations.php
diff --git a/src/model/Model.php b/src/model/version 0.1/Model.php
index b3d157d..b3d157d 100644
--- a/src/model/Model.php
+++ b/src/model/version 0.1/Model.php
diff --git a/src/model/Prestations.php b/src/model/version 0.1/Prestations.php
index 3a415be..18bc787 100644
--- a/src/model/Prestations.php
+++ b/src/model/version 0.1/Prestations.php
@@ -14,8 +14,7 @@ class Prestations extends Model
14 //protected $numero_presta = 0; 14 //protected $numero_presta = 0;
15 15
16 public function __construct(int $id_client) 16 public function __construct(int $id_client)
17 { 17 { $this->id_client = $id_client;
18 $this->id_client = $id_client;
19 $this->table = strtolower(__CLASS__); // prestations 18 $this->table = strtolower(__CLASS__); // prestations
20 } 19 }
21 20
@@ -30,19 +29,19 @@ class Prestations extends Model
30 } 29 }
31 public function getIdsByIdClient() // obtenir une entrée avec son id_client, comportement différent si le type est connu 30 public function getIdsByIdClient() // obtenir une entrée avec son id_client, comportement différent si le type est connu
32 { 31 {
33 $sql = 'SELECT id FROM ' . $this->table . ' WHERE id_client = ' . $this->id_client; 32 $sql = 'SELECT id FROM ' . $this->table . ' WHERE id_client = ' . $this->id_client;
34 if($this->type_presta != '') 33 if($this->type_presta != '')
35 { 34 {
36 $sql .= " AND type_presta = '" . $this->type_presta . "'"; 35 $sql .= " AND type_presta = '" . $this->type_presta . "'";
37 } 36 }
38 $data = $this->execQuery($sql)->fetchAll(); // tableau de tableaux 37 $data = $this->execQuery($sql)->fetchAll(); // tableau de tableaux
39 38
40 $IDs = []; // si $IDs reste vide, ne pas être de type NULL 39 $IDs = []; // si $IDs reste vide, ne pas être de type NULL
41 for($i = 0; $i < count($data); $i++) 40 for($i = 0; $i < count($data); $i++)
42 { 41 {
43 $IDs[$i] = $data[$i]['id']; // tableau simple 42 $IDs[$i] = $data[$i]['id']; // tableau simple
44 } 43 }
45 return($IDs); 44 return($IDs);
46 } 45 }
47 public function getCodePresta(): string 46 public function getCodePresta(): string
48 { 47 {
@@ -58,8 +57,8 @@ class Prestations extends Model
58 } 57 }
59 public function getAllWithWindowFields(): array // différent de Model::getAll() qui retourne get_object_vars($this) 58 public function getAllWithWindowFields(): array // différent de Model::getAll() qui retourne get_object_vars($this)
60 { 59 {
61 $code_presta_tableau = explode('-', $this->code_presta); 60 $code_presta_tableau = explode('-', $this->code_presta);
62 $Date = new Dates($this->date); 61 $Date = new Dates($this->date);
63 62
64 return [ 63 return [
65 "Numéro prestation:" => end($code_presta_tableau), // dernière case 64 "Numéro prestation:" => end($code_presta_tableau), // dernière case
@@ -71,7 +70,7 @@ class Prestations extends Model
71 public function set(string $entry, string $input) 70 public function set(string $entry, string $input)
72 { 71 {
73 $input = $this->cleanSpecialChars($input); // possibilité que $input devienne une chaine vide 72 $input = $this->cleanSpecialChars($input); // possibilité que $input devienne une chaine vide
74 switch($entry) 73 switch($entry)
75 { 74 {
76 case "Numéro prestation:": 75 case "Numéro prestation:":
77 $this->setNumeroPresta($input); 76 $this->setNumeroPresta($input);
@@ -94,8 +93,8 @@ class Prestations extends Model
94 // setters 93 // setters
95 public function setIdClient(int $value) 94 public function setIdClient(int $value)
96 { 95 {
97 $this->id_client = $value; 96 $this->id_client = $value;
98 return $this; 97 return $this;
99 } 98 }
100 //~ public function setCombientiemeFois(int $value) 99 //~ public function setCombientiemeFois(int $value)
101 //~ { 100 //~ {
@@ -104,62 +103,57 @@ class Prestations extends Model
104 //~ } 103 //~ }
105 public function setCodePresta(string $value) 104 public function setCodePresta(string $value)
106 { 105 {
107 $this->code_presta = $value; 106 $this->code_presta = $value;
108 return $this; 107 return $this;
109 } 108 }
110 public function setDate($value, bool $set_code_presta = false) // attend un timestamp 109 public function setDate($value, bool $set_code_presta = false) // attend un timestamp
111 { 110 {
112 $this->date = (int) $value; 111 $this->date = (int) $value;
113 112
114 if($set_code_presta) 113 if($set_code_presta)
115 { 114 {
116 $code_presta_tableau = explode('-', $this->code_presta); 115 $code_presta_tableau = explode('-', $this->code_presta);
117 $Date = new Dates($value); 116 $Date = new Dates($value);
118 $code_presta_tableau[0] = $Date->getYear(); 117 $code_presta_tableau[0] = $Date->getYear();
119 $code_presta_tableau[1] = $Date->getMonth(); 118 $code_presta_tableau[1] = $Date->getMonth();
120 $code_presta_tableau[2] = $Date->getDay(); 119 $code_presta_tableau[2] = $Date->getDay();
121 $this->code_presta = implode('-', $code_presta_tableau); 120 $this->code_presta = implode('-', $code_presta_tableau);
122 } 121 }
123 122
124 return $this; 123 return $this;
125 } 124 }
126 public function setTypePresta(string $value) 125 public function setTypePresta(string $value)
127 { 126 {
128 $this->type_presta = $value; 127 $this->type_presta = $value;
129 return $this; 128 return $this;
130 } 129 }
131 public function setModePaiement(string $value) 130 public function setModePaiement(string $value)
132 { 131 {
133 $this->mode_paiement = $value; 132 $this->mode_paiement = $value;
134 return $this; 133 return $this;
135 } 134 }
136 public function setCommentaires(string $value) 135 public function setCommentaires(string $value)
137 { 136 {
138 $this->commentaires = $this->cleanSpecialChars($value); // nettoyage ici parce que pas possible ailleurs 137 $this->commentaires = $this->cleanSpecialChars($value); // nettoyage ici parce que pas possible ailleurs
139 return $this; 138 return $this;
140 } 139 }
141 public function setNumeroPresta($value) 140 public function setNumeroPresta($value)
142 { 141 {
143 // modifier le code presta, on pourrait aussi utiliser une regex 142 // modifier le code presta, on pourrait aussi utiliser une regex
144 $code_presta_tableau = explode('-', $this->code_presta); 143 $code_presta_tableau = explode('-', $this->code_presta);
145 $code_presta_tableau[count($code_presta_tableau) - 1] = (int) $value; 144 $code_presta_tableau[count($code_presta_tableau) - 1] = (int) $value;
146 $this->code_presta = implode('-', $code_presta_tableau); 145 $this->code_presta = implode('-', $code_presta_tableau);
147 return $this; 146 return $this;
148 } 147 }
149 148
150 // code client = année-mois-jour-codeclient-typedepresta-combientièmefois 149 // code presta = année-mois-jour-codeclient-typedepresta-combientièmefois
151 public function makeCodePresta(Dates $Date, string $code_client) 150 public function makeCodePresta(Dates $Date, string $code_client)
152 { 151 {
153 // on récupère un tableau contenant toutes les prestations d'un client tous types confondus (devis, facture, cesu, location, enregistrement sans vente) 152 // on récupère un tableau contenant toutes les prestations d'un client tous types confondus (devis, facture, cesu, location, enregistrement sans vente)
154 // inconvénient: il peut y avoir plusieurs prestations avec le même numéro au compteur, à améliorer 153 // inconvénient: il peut y avoir plusieurs prestations avec le même numéro au compteur, à améliorer
155 $combientieme_fois = count($this->find(['id_client' => $this->id_client])) + 1; 154 $combientieme_fois = count($this->find(['id_client' => $this->id_client])) + 1;
156 155
157 $array_code = [$Date->getYear(), $Date->getMonth(), $Date->getDay(), $code_client, $this->type_presta, $combientieme_fois]; 156 $array_code = [$Date->getYear(), $Date->getMonth(), $Date->getDay(), $code_client, $this->type_presta, $combientieme_fois];
158 $this->code_presta = implode('-', $array_code); 157 $this->code_presta = implode('-', $array_code);
159 } 158 }
160} 159}
161
162//~ class CodePresta extends Prestations
163//~ {
164 //~ protected $numero_presta;
165//~ }
diff --git a/src/model/StructTablesDB.php b/src/model/version 0.1/StructTablesDB.php
index 303af46..303af46 100644
--- a/src/model/StructTablesDB.php
+++ b/src/model/version 0.1/StructTablesDB.php