aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/EmailService.php2
-rw-r--r--src/controller/ContactFormController.php9
-rw-r--r--src/model/Model.php16
-rw-r--r--src/model/entities/Email.php30
-rw-r--r--src/model/entities/NodeData.php38
-rw-r--r--src/router.php3
-rw-r--r--src/view/FormBuilder.php3
-rw-r--r--src/view/templates/form.php2
-rw-r--r--src/view/templates/form_admin.php10
9 files changed, 68 insertions, 45 deletions
diff --git a/src/EmailService.php b/src/EmailService.php
index 5d1b2eb..c6d97b4 100644
--- a/src/EmailService.php
+++ b/src/EmailService.php
@@ -67,7 +67,7 @@ class EmailService
67 67
68 // copie en BDD 68 // copie en BDD
69 if(!$test_email && ($form_data->getData()['keep_emails'] ?? self::KEEP_EMAILS_DEFAULT)){ 69 if(!$test_email && ($form_data->getData()['keep_emails'] ?? self::KEEP_EMAILS_DEFAULT)){
70 $db_email = new Email($name, $email, Config::$email_dest, $message); 70 $db_email = new Email($name, $email, Config::$email_dest, $message, $form_data);
71 $entityManager->persist($db_email); 71 $entityManager->persist($db_email);
72 self::updateLastContactDate($entityManager, $email); 72 self::updateLastContactDate($entityManager, $email);
73 $entityManager->flush(); 73 $entityManager->flush();
diff --git a/src/controller/ContactFormController.php b/src/controller/ContactFormController.php
index 243740f..0724401 100644
--- a/src/controller/ContactFormController.php
+++ b/src/controller/ContactFormController.php
@@ -16,6 +16,15 @@ class ContactFormController
16 echo json_encode(['success' => true, 'checked' => $json['checked']]); 16 echo json_encode(['success' => true, 'checked' => $json['checked']]);
17 die; 17 die;
18 } 18 }
19 static public function setEmailsRetentionPeriod(EntityManager $entityManager, array $json): void
20 {
21 $form_data = $entityManager->find('App\Entity\NodeData', $json['id']);
22 $form_data->updateData('retention_period', (int)$json['months']);
23 $entityManager->persist($form_data);
24 $entityManager->flush();
25 echo json_encode(['success' => true, 'months' => $json['months']]);
26 die;
27 }
19 static public function setEmailParam(EntityManager $entityManager, array $json): void 28 static public function setEmailParam(EntityManager $entityManager, array $json): void
20 { 29 {
21 $form = new FormValidation($json, 'email_params'); 30 $form = new FormValidation($json, 'email_params');
diff --git a/src/model/Model.php b/src/model/Model.php
index de391ff..1054d57 100644
--- a/src/model/Model.php
+++ b/src/model/Model.php
@@ -65,8 +65,11 @@ class Model
65 } 65 }
66 66
67 // emails 67 // emails
68 if($parent_block->getName() === 'show_emails'){ 68 if($parent_block->getName() === 'show_emails'){ // show_emails = l'afficheur
69 $parent_block->getNodeData()->setEmails($this->getAllEmails()); 69 $parent_block->getNodeData()->setEmails($this->getAllEmails());
70
71 // aller chercher les formulaires à la place (future MAJ?)
72 //$this->getFormsNodeData();
70 } 73 }
71 } 74 }
72 } 75 }
@@ -294,8 +297,15 @@ class Model
294 $dql = 'SELECT e FROM App\Entity\Email e'; 297 $dql = 'SELECT e FROM App\Entity\Email e';
295 return $this->entityManager 298 return $this->entityManager
296 ->createQuery($dql) 299 ->createQuery($dql)
297 //->setParameter('page', $this->page)
298 ->getResult(); 300 ->getResult();
299 } 301 }
300 //private function getEmails(string $sender): array 302 /*private function getFormsNodeData(): array
303 {
304 $dql = 'SELECT fd FROM App\Entity\NodeData fd WHERE node.name_node = form';
305 return $this->entityManager
306 ->createQuery($dql)
307 //->setParameter('page', $this->page)
308 ->getResult();
309 }*/
310 //private function getEmailsBySender(string $sender): array
301} 311}
diff --git a/src/model/entities/Email.php b/src/model/entities/Email.php
index c66625f..d54b3cc 100644
--- a/src/model/entities/Email.php
+++ b/src/model/entities/Email.php
@@ -12,8 +12,8 @@ use Doctrine\ORM\Mapping as ORM;
12class Email 12class Email
13{ 13{
14 // en mois 14 // en mois
15 const LEGAL_RETENTION_PERIOD = 36; // 3 ans, justification = prospection, durée "glissante", date de suppression remise à jour à chaque nouvel e-mail 15 const DEFAULT_RETENTION_PERIOD = 36; // 3 ans, justification = prospection, durée "glissante", date de suppression remise à jour à chaque nouvel e-mail
16 const LEGAL_RETENTION_PERIOD_SENSITIVE = 60; // 5 ans pour données sensibles ou litige, durée de preuve légale, durée non glissante 16 const DEFAULT_RETENTION_PERIOD_SENSITIVE = 60; // 5 ans pour données sensibles ou litige, durée de preuve légale, durée non glissante
17 17
18 #[ORM\Id] 18 #[ORM\Id]
19 #[ORM\GeneratedValue] 19 #[ORM\GeneratedValue]
@@ -48,13 +48,18 @@ class Email
48 #[ORM\Column(type: 'datetime', nullable: true)] 48 #[ORM\Column(type: 'datetime', nullable: true)]
49 private ?\DateTime $is_sensitive_since; 49 private ?\DateTime $is_sensitive_since;
50 50
51 public function __construct(string $sender_name, string $sender_address, string $recipient, string $content, bool $sensitive = false){ 51 #[ORM\ManyToOne(targetEntity: NodeData::class)]
52 #[ORM\JoinColumn(name: "node_data_id", referencedColumnName: "id_node_data", nullable: true)]
53 private ?NodeData $node_data;
54
55 public function __construct(string $sender_name, string $sender_address, string $recipient, string $content, NodeData $node_data, bool $sensitive = false){
52 $this->sender_name = strtolower($sender_name); 56 $this->sender_name = strtolower($sender_name);
53 $this->sender_address = strtolower($sender_address); 57 $this->sender_address = strtolower($sender_address);
54 $this->recipient = strtolower($recipient); 58 $this->recipient = strtolower($recipient);
55 $this->content = $content; 59 $this->content = $content;
56 $this->date_time = new \DateTime; 60 $this->date_time = new \DateTime;
57 $this->last_contact_date = new \DateTime; 61 $this->last_contact_date = new \DateTime;
62 $this->node_data = $node_data;
58 $this->makeSensitive($sensitive); 63 $this->makeSensitive($sensitive);
59 } 64 }
60 65
@@ -108,10 +113,23 @@ class Email
108 $this->last_contact_date = new \DateTime; 113 $this->last_contact_date = new \DateTime;
109 } 114 }
110 115
116 // la durée de conservation $period est propre au bloc formulaire (NodeData)
117 // la date de dernier contact
111 public function getDeletionDate(): \DateTime 118 public function getDeletionDate(): \DateTime
112 { 119 {
113 return $this->is_sensitive // oui durée 5 ans, non durée 3 ans "glissante" 120 // deux tests:
114 ? (clone $this->is_sensitive_since)->modify('+ ' . (string)self::LEGAL_RETENTION_PERIOD_SENSITIVE . ' month') // erreur si vrai mais sans date (pas censé arriver) 121 // => e-mail associé à un formulaire?
115 : (clone $this->last_contact_date)->modify('+ ' . (string)self::LEGAL_RETENTION_PERIOD . ' month'); 122 // => ce formulaire dispose d'une durée de stockage spécifique?
123 $period = $this->node_data === null ? null : ($this->node_data->getData()['retention_period'] ?? null);
124
125 $period = (int)$period;
126 if($period === null || $period <= 0){
127 $period = $this->is_sensitive ? self::DEFAULT_RETENTION_PERIOD_SENSITIVE : self::DEFAULT_RETENTION_PERIOD;
128 }
129
130 $date = $this->is_sensitive ? (clone $this->is_sensitive_since) : (clone $this->last_contact_date); // oui durée 5 ans, non durée 3 ans "glissante"
131 // erreur si "sensible" mais sans date disponible (pas censé arriver)
132
133 return $date->modify('+ ' . (string)$period . ' month');
116 } 134 }
117} \ No newline at end of file 135} \ No newline at end of file
diff --git a/src/model/entities/NodeData.php b/src/model/entities/NodeData.php
index 4c07a69..d2f10ba 100644
--- a/src/model/entities/NodeData.php
+++ b/src/model/entities/NodeData.php
@@ -44,8 +44,11 @@ class NodeData
44 #[ORM\OneToMany(mappedBy: 'node_data', targetEntity: NodeDataAsset::class, cascade: ['persist', 'remove'])] 44 #[ORM\OneToMany(mappedBy: 'node_data', targetEntity: NodeDataAsset::class, cascade: ['persist', 'remove'])]
45 private Collection $nda_collection; 45 private Collection $nda_collection;
46 46
47 /*#[ORM\OneToMany(mappedBy: 'node_data', targetEntity: Email::class, cascade: ['persist', 'remove'])] // => noeud "form", inutilisé et conflit avec le tableau $emails
48 private Collection $emails;*/
49
47 private int $nb_pages = 1; 50 private int $nb_pages = 1;
48 private array $emails = []; // noeud show_emails uniquement 51 private array $emails = []; // => noeud "show_emails"
49 52
50 public function __construct(array $data, Node $node, Collection $nda_collection = new ArrayCollection, ?string $presentation = null, ?bool $chrono_order = null) 53 public function __construct(array $data, Node $node, Collection $nda_collection = new ArrayCollection, ?string $presentation = null, ?bool $chrono_order = null)
51 { 54 {
@@ -70,7 +73,7 @@ class NodeData
70 { 73 {
71 $this->data = $data; 74 $this->data = $data;
72 }*/ 75 }*/
73 public function updateData(string $key, string|bool|array $value = ''): void 76 public function updateData(string $key, string|int|bool|array $value = ''): void
74 { 77 {
75 if($value !== ''){ 78 if($value !== ''){
76 $this->data[$key] = $value; 79 $this->data[$key] = $value;
@@ -153,39 +156,12 @@ class NodeData
153 } 156 }
154 return $nda->getAsset() ?? null; 157 return $nda->getAsset() ?? null;
155 } 158 }
156 /*public function addNodeDataAsset(NodeDataAsset $nda): self
157 {
158 if(!$this->nda_collection->contains($nda)){ // sécurité contrainte UNIQUE
159 $this->nda_collection->add($nda);
160 }
161 return $this;
162 }*/
163 /*public function removeNodeDataAsset(NodeDataAsset $nda): self // inutile on peut faire: $node_data->getNodeDataAssets()->removeElement($nda);
164 {
165 $this->nda_collection->removeElement($nda);
166 // pas de synchro dans NodeDataAsset, les champs de cette table ne sont pas nullables
167 return $this;
168 }*/
169
170 // LE setter, sélectionne l'asset à utiliser en remplaçant l'entrée dans NodeDataAsset en fonction du rôle
171 // à mettre théoriquement dans une classe metier dans "service"
172 /*public function replaceAssetForRole(string $role, Asset $asset): void
173 {
174 foreach($this->nda_collection as $nda){
175 if($nda->getRole() === $role){
176 $this->removeNodeDataAsset($nda);
177 break;
178 }
179 }
180 $this->new_nda = new NodeDataAsset($this, $asset, $role);
181 $this->addNodeDataAsset($this->new_nda);
182 }*/
183 159
184 public function getEmails(): array 160 public function getEmails(): array // appelée dans ShowEmailsBuilder
185 { 161 {
186 return $this->emails; 162 return $this->emails;
187 } 163 }
188 public function setEmails(array $emails): void 164 public function setEmails(array $emails): void // appelée dans Model
189 { 165 {
190 $this->emails = $emails; 166 $this->emails = $emails;
191 } 167 }
diff --git a/src/router.php b/src/router.php
index 228fae2..7348f2b 100644
--- a/src/router.php
+++ b/src/router.php
@@ -115,6 +115,9 @@ elseif($request->getMethod() === 'POST'){
115 elseif($_GET['action'] === 'keep_emails'){ 115 elseif($_GET['action'] === 'keep_emails'){
116 ContactFormController::keepEmails($entityManager, $json); 116 ContactFormController::keepEmails($entityManager, $json);
117 } 117 }
118 elseif($_GET['action'] === 'set_retention_period'){
119 ContactFormController::setEmailsRetentionPeriod($entityManager, $json);
120 }
118 elseif($_GET['action'] === 'set_email_param'){ 121 elseif($_GET['action'] === 'set_email_param'){
119 ContactFormController::setEmailParam($entityManager, $json); 122 ContactFormController::setEmailParam($entityManager, $json);
120 } 123 }
diff --git a/src/view/FormBuilder.php b/src/view/FormBuilder.php
index 7952357..e2389b0 100644
--- a/src/view/FormBuilder.php
+++ b/src/view/FormBuilder.php
@@ -24,10 +24,13 @@ class FormBuilder extends AbstractBuilder
24 $_SESSION['captcha'] = self::$captcha->getSolution(); 24 $_SESSION['captcha'] = self::$captcha->getSolution();
25 } 25 }
26 26
27 // données stockées en vrac dans du JSON et récupérées avec extract => changer ça un jour
27 $smtp_host = $smtp_host ?? Config::$smtp_host; 28 $smtp_host = $smtp_host ?? Config::$smtp_host;
28 $smtp_secure = $smtp_secure ?? Config::$smtp_secure; 29 $smtp_secure = $smtp_secure ?? Config::$smtp_secure;
29 $smtp_username = $smtp_username ?? Config::$smtp_username; 30 $smtp_username = $smtp_username ?? Config::$smtp_username;
30 $email_dest = $email_dest ?? Config::$email_dest; 31 $email_dest = $email_dest ?? Config::$email_dest;
32 $keep_emails = (bool)$keep_emails ?? false; // (bool) est inutile mais plus clair
33 $retention_period = (int)($retention_period ?? App\Entity\Email::DEFAULT_RETENTION_PERIOD); // (int) est nécessaire à cause du stockage JSON
31 34
32 $admin_content = ''; 35 $admin_content = '';
33 if($_SESSION['admin']) 36 if($_SESSION['admin'])
diff --git a/src/view/templates/form.php b/src/view/templates/form.php
index 54dcd02..8fb4735 100644
--- a/src/view/templates/form.php
+++ b/src/view/templates/form.php
@@ -31,7 +31,7 @@
31 <p class="send_email_success_<?= $node->getNodeData()->getId() ?> full_width_column"></p> 31 <p class="send_email_success_<?= $node->getNodeData()->getId() ?> full_width_column"></p>
32 </div> 32 </div>
33 <p id="form_warning_<?= $node->getNodeData()->getId() ?>" class="form_warning <?= ($keep_emails ?? false) ? '' : 'hidden' ?>"><i> 33 <p id="form_warning_<?= $node->getNodeData()->getId() ?>" class="form_warning <?= ($keep_emails ?? false) ? '' : 'hidden' ?>"><i>
34 Une copie de votre e-mail (nom, adresse et message) sera conservée dans notre base de données dans le but de pouvoir répondre à votre demande et et éventuellement dans un but de prospection. Ces données seront traitées automatiquement par notre serveur et conservées pendant au maximum 3 ans à compter de votre dernier message.<br> 34 Une copie de votre e-mail (nom, adresse et message) sera conservée dans notre base de données dans le but de pouvoir répondre à votre demande et éventuellement dans un but de prospection. Ces données seront traitées automatiquement par notre serveur et conservées pendant au maximum 3 ans à compter de votre dernier message.<br>
35 Ce traitement repose sur votre consentement. Vous pouvez consulter, modifier ou supprimer vos données en base de données sur simple demande. 35 Ce traitement repose sur votre consentement. Vous pouvez consulter, modifier ou supprimer vos données en base de données sur simple demande.
36 </i></p> 36 </i></p>
37</section> \ No newline at end of file 37</section> \ No newline at end of file
diff --git a/src/view/templates/form_admin.php b/src/view/templates/form_admin.php
index bf281b5..457f770 100644
--- a/src/view/templates/form_admin.php
+++ b/src/view/templates/form_admin.php
@@ -6,9 +6,13 @@ declare(strict_types=1);
6<div class="admin_form"> 6<div class="admin_form">
7 <p> 7 <p>
8 <label for="keep_emails_<?= $node->getNodeData()->getId() ?>">Conserver les e-mails en base de données</label> 8 <label for="keep_emails_<?= $node->getNodeData()->getId() ?>">Conserver les e-mails en base de données</label>
9 <input type="checkbox" id="keep_emails_<?= $node->getNodeData()->getId() ?>" <?= ($keep_emails ?? false) ? 'checked' : '' ?> onclick="keepEmails(<?= $node->getNodeData()->getId() ?>)"> 9 <input type="checkbox" id="keep_emails_<?= $node->getNodeData()->getId() ?>" <?= $keep_emails ? 'checked' : '' ?> onclick="keepEmails(<?= $node->getNodeData()->getId() ?>)">
10 </p> 10 </p>
11 <p><i>Notez que ces enregistrements sont des données personnelles et sont concernés par le RGPD.</i></p> 11 <p><i>Notez que ces enregistrements sont des données personnelles et sont concernés par le RGPD.</i></p>
12 <p>
13 <label for="retention_period_<?= $node->getNodeData()->getId() ?>">Durée de conservation (en mois)</label>
14 <input type="number" id="retention_period_<?= $node->getNodeData()->getId() ?>" min="0" value="<?= $retention_period ?>" size="2" onchange="setEmailsRetentionPeriod(<?= $node->getNodeData()->getId() ?>)">
15 </p>
12 <p><a href="<?= new URL(['page' => 'emails']) ?>"><button>Consulter les e-mails enregistrés</button></a></p> 16 <p><a href="<?= new URL(['page' => 'emails']) ?>"><button>Consulter les e-mails enregistrés</button></a></p>
13</div> 17</div>
14<div class="admin_form"> 18<div class="admin_form">
@@ -23,8 +27,8 @@ declare(strict_types=1);
23 <label for="smtp_secure_<?= $node->getNodeData()->getId() ?>">Chiffrement</label> 27 <label for="smtp_secure_<?= $node->getNodeData()->getId() ?>">Chiffrement</label>
24 <select id="smtp_secure_<?= $node->getNodeData()->getId() ?>" name="smtp_secure" onchange="setEmailParam('smtp_secure', <?= $node->getNodeData()->getId() ?>)"> 28 <select id="smtp_secure_<?= $node->getNodeData()->getId() ?>" name="smtp_secure" onchange="setEmailParam('smtp_secure', <?= $node->getNodeData()->getId() ?>)">
25 <option value="plain_text" >Aucun (port 25)</option> 29 <option value="plain_text" >Aucun (port 25)</option>
26 <option value="tls" <?php echo htmlspecialchars($smtp_secure) === 'tls' ? 'selected' : '' ?>>StartTLS (port 587)</option> 30 <option value="tls" <?= htmlspecialchars($smtp_secure) === 'tls' ? 'selected' : '' ?>>StartTLS (port 587)</option>
27 <option value="ssl" <?php echo htmlspecialchars($smtp_secure) === 'ssl' ? 'selected' : '' ?>>SSL (port 465)</option> 31 <option value="ssl" <?= htmlspecialchars($smtp_secure) === 'ssl' ? 'selected' : '' ?>>SSL (port 465)</option>
28 </select> 32 </select>
29 <input type="hidden" id="smtp_secure_hidden_<?= $node->getNodeData()->getId() ?>" value=""> 33 <input type="hidden" id="smtp_secure_hidden_<?= $node->getNodeData()->getId() ?>" value="">
30 </p> 34 </p>