summaryrefslogtreecommitdiff
path: root/src/model/entities/Client.php
diff options
context:
space:
mode:
Diffstat (limited to 'src/model/entities/Client.php')
-rw-r--r--src/model/entities/Client.php314
1 files changed, 314 insertions, 0 deletions
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}