Skip to main content

COP - Amende 2.0

Nous rejoindre sur Discord : lien discord

Sujet : Ajouter à vos amendes un montant forfaitaire, un montant maximal ainsi qu'une description

(Ce plugin est compatible avec le retrait automatique des points sur le permis)

  • Liste des fichiers concernés :
    • intranet-cop/page/administration/ajout_systeme.twig
    • intranet-cop/page/administration/modification_systeme.twig
    • intranet-cop/page/add/delit_route.add_delit_route.twig
    • intranet-cop/page/add/add_casier.twig
    • intranet-cop/routes/insert.php
    • intranet-cop/src/insertion.php
    • intranet-cop/routes/recherche.php
    • intranet-cop/routes/edit.php
    • intranet-cop/src/edit.php
    • intranet-cop/src/historique.php
    • intranet-cop/assets/script/event_saisie.js
    • intranet-cop/assets/styles/global/contenu.css

Update de la base de données

Dans votre base de données, exécutez la requêtes sql suivante :

ALTER TABLE lspd_delit ADD amende_max INT;
ALTER TABLE lspd_delit ADD description TEXT;

CREATE OR REPLACE VIEW info_casier AS
  SELECT
  		lspd_casier.id AS id_delit, lspd_casier.personne AS id_personne, lspd_delit.intitule AS nom, lspd_delit.type_delit AS type_d, lspd_delit.amende AS amende, lspd_delit.amende_max AS amende_max, lspd_delit.temps_prison AS prison, lspd_delit.description AS description, lspd_casier.enregistrer_par AS enregistrer_par, lspd_casier.enregistrer_name AS enregistrer_name, lspd_casier.enregistrer_le AS enregistrer_le, lspd_casier.acquite AS etat, lspd_casier.acquite_par AS acquite_par, lspd_casier.acquite_name AS acquite_name, lspd_casier.acquite_le AS acquite_le, lspd_casier.remarque AS remarque
  	FROM
  		lspd_casier, lspd_delit
  	WHERE
  		lspd_casier.numero_delit = lspd_delit.id;

CREATE OR REPLACE VIEW info_route AS
  SELECT
  		lspd_route.id AS delit_id, lspd_route.vehicule AS v_id, lspd_route.conducteur AS conducteur_id, lspd_delit.intitule AS nom, lspd_delit.amende AS amende, lspd_delit.amende_max AS amende_max, lspd_delit.temps_prison AS prison, lspd_delit.description AS description, lspd_delit.id AS delit_ref, lspd_route.enregistrer_par AS enregistreur_id, lspd_route.enregistrer_name AS enregistreur_name, lspd_route.acquite AS etat, lspd_route.enregistrer_le AS date_enregistre, lspd_route.acquite_par AS acquite_par, lspd_route.acquite_name AS acquite_name, lspd_route.acquite_le AS acquite_le, lspd_route.remarque AS remarque
  	FROM
  		lspd_route, lspd_delit
  	WHERE
  		lspd_route.numero_delit = lspd_delit.id;

Attention, si vous utilisez le plugin des points de permis, exécutez cette requête en plus :

CREATE OR REPLACE VIEW info_route AS
  SELECT
  		lspd_route.id AS delit_id, lspd_route.vehicule AS v_id, lspd_route.conducteur AS conducteur_id, lspd_delit.intitule AS nom, lspd_delit.amende AS amende, lspd_delit.amende_max AS amende_max, lspd_delit.temps_prison AS prison, lspd_delit.retrait AS retrait, lspd_delit.description AS description, lspd_delit.id AS delit_ref, lspd_route.enregistrer_par AS enregistreur_id, lspd_route.enregistrer_name AS enregistreur_name, lspd_route.acquite AS etat, lspd_route.enregistrer_le AS date_enregistre, lspd_route.acquite_par AS acquite_par, lspd_route.acquite_name AS acquite_name, lspd_route.acquite_le AS acquite_le, lspd_route.remarque AS remarque
  	FROM
  		lspd_route, lspd_delit
  	WHERE
  		lspd_route.numero_delit = lspd_delit.id;

Modification fichier twig

Emplacement : intranet-cop/page/administration/ajout_systeme.twig

Au niveau de la ligne ~54, remplacez :

<div>
  <label for="delit_amende">Entrer le montant de l'amende :</label>
  <input type="number" name="delit_amende" id="amd_delit" min="0" placeholder="Montant Amende">
</div>

Par :

<div>
  <label for="delit_description">Entrer une description au delit :</label>
  <textarea type="text" name="delit_description" id="description_delit" placeholder="Description du délit"></textarea>
</div>

<div>
  <label for="delit_amende">Entrer le montant de l'amende forfaitaire :</label>
  <input class="short" type="number" name="delit_amende" id="amd_delit" min="0" placeholder="Montant Amende" required>
</div>

<div>
  <label for="delit_amende_max">Entrer le montant de l'amende maximal :</label>
  <input class="short" type="number" name="delit_amende_max" id="amd_delit_max" min="0" placeholder="Montant Amende Maximum">
</div>

Emplacement : intranet-cop/page/administration/modification_systeme.twig

Au niveau de la ligne ~151, remplacez :

<div id="dtls_amende">
  <label for="delit_amende">Entrer le montant de l'amende :</label>
  <input class="short" type="number" name="delit_amende" id="amd_delit" min="0" placeholder="Montant Amende" required>
</div>

Par :

<div id="dtls_description">
  <label for="delit_description">Entrer une description au delit :</label>
  <textarea type="text" name="delit_description" id="description_delit" placeholder="Description du délit"></textarea>
</div>

<div id="dtls_amende">
  <label for="delit_amende">Entrer le montant de l'amende forfaitaire :</label>
  <input class="short" type="number" name="delit_amende" id="amd_delit" min="0" placeholder="Montant Amende" required>
</div>

<div id="dtls_amende_max">
  <label for="delit_amende_max">Entrer le montant de l'amende maximal :</label>
  <input class="short" type="number" name="delit_amende_max" id="amd_delit_max" min="0" placeholder="Montant Amende Maximum">
</div>

À la fin du fichier, à la suite de :

document.getElementById("confirm_edit_mdp").style.display = "none";
document.getElementById("confirm_edit_delit").style.display = "none";
document.getElementById("list_route").style.display = "none";
document.getElementById("list_leger").style.display = "none";
document.getElementById("list_moyen").style.display = "none";
document.getElementById("list_grave").style.display = "none";
document.getElementById("dtls_amende").style.display = "none";
document.getElementById("dtls_prison").style.display = "none";
document.getElementById("button_delit").style.display = "none";

Ajoutez :

document.getElementById("dtls_description").style.display = "none";
document.getElementById("dtls_amende_max").style.display = "none";

Emplacement : intranet-cop/page/add/delit_route.add_delit_route.twig

Au niveau de la ligne ~65, remplacez la ligne :

{% for i in 1..50 %}
<div id="saisie_route_{{ i }}">
  <label>Délit :</label>
  <select id="route_value_{{ i }}" name="delit_name" onchange="affiche_suite('saisie_route_{{ i }}', 'route_value_{{ i }}', 'saisie_route_{{ i + 1 }}');">
    <option value="NULL">Sélectionner un délit</option>
    {% for route in routes %}
    <option value="{{ route.id }}">{{ route.intitule }} - {{ route.amende|number_format(2, ',', ' ') }} {{ _Devise }}</option>
    {% else %}
    {% set __nbdelit = false %}
    <option>Aucun délit déclaré</option>
    {% endfor %}
  </select>
</div>
{% endfor %}

Par :

{% for i in 1..50 %}
<div id="saisie_route_{{ i }}">
  <label>Délit :</label>
  <select id="route_value_{{ i }}" name="delit_name" onchange="affiche_suite('{{ i }}', 'saisie_route_{{ i }}', 'route_value_{{ i }}', 'saisie_route_{{ i + 1 }}', '{{ _Devise }}');">
    <option value="NULL">Sélectionner un délit</option>
    {% for route in routes %}
    <option value="{{ route.id }}">{{ route.intitule }} - {{ route.amende|number_format(2, ',', ' ') }} {{ _Devise }}/{{ route.amende_max|number_format(2, ',', ' ') }} {{ _Devise }} - {{ route.retrait}} point{% if route.retrait > 1 %}s{% endif %}</option>
    {% else %}
    {% set __nbdelit = false %}
    <option>Aucun délit déclaré</option>
    {% endfor %}
  </select>
  <span class="description" id="route_description_{{ i }}"></span>
</div>
{% endfor %}

Emplacement : intranet-cop/page/add/add_casier.twig

Au niveau de la ligne ~57, remplacez la ligne :

{% for i in 1..50 %}
<div id="saisie_casier_{{ i }}">
  <label>Délit :</label>
  <select id="casier_value_{{ i }}" name="delit_name_{{ i }}" onchange="affiche_suite('saisie_casier_{{ i }}', 'casier_value_{{ i }}', 'saisie_casier_{{ i + 1 }}');">
    <option value="NULL">Sélectionner un délit</option>
    {% for __superItem in __superVar %}
    <option value="NULL">{{ __superItem.name }}</option>
    {% for delit in __superItem.content %}
    {% set __nbdelit  = true %}
    <option value="{{ delit.id }}">{{ delit.intitule|capitalize }} - {{ delit.amende|number_format(2, ',', ' ') }} {{ _Devise }}</option>
    {% endfor %}
    {% endfor %}
  </select>
</div>
{% endfor %}

Par :

{% for i in 1..50 %}
<div id="saisie_casier_{{ i }}">
  <label>Délit :</label>
  <select id="casier_value_{{ i }}" name="delit_name_{{ i }}" onchange="affiche_suite('{{ i }}', 'saisie_casier_{{ i }}', 'casier_value_{{ i }}', 'saisie_casier_{{ i + 1 }}', '{{ _Devise }}');">
    <option value="NULL">Sélectionner un délit</option>
    {% for __superItem in __superVar %}
    <option value="NULL">{{ __superItem.name }}</option>
    {% for delit in __superItem.content %}
    {% set __nbdelit  = true %}
    <option value="{{ delit.id }}">{{ delit.intitule }} - {{ delit.amende|number_format(2, ',', ' ') }} {{ _Devise }}/{{ delit.amende_max|number_format(2, ',', ' ') }} {{ _Devise }}</option>
    {% endfor %}
    {% endfor %}
  </select>
  <span class="description" id="description_{{ i }}"></span>
</div>
{% endfor %}

Modification fichiers php

Emplacement : intranet-cop/routes/insert.php

Au niveau de la ligne ~61, dans la fonction Flight::route('/insert/delit', function() {...}, à la suite de :

$nom = $_POST['nom'];
$montant = $_POST['amende'];
$prison = $_POST['temps'];
$type = $_POST['type'];

Ajoutez :

$montantMax = $_POST['amende_max'];
$description = $_POST['description'];

if  ($montantMax < $montant) {
  $montantMax = $montant;
}

Dans l'appel de la fonction addDelit(...);, ajoutez les paramètres : , $montantMax, $description.

addDelit($nom, $montant, $prison, $type); // Avant
addDelit($nom, $montant, $prison, $type, $montantMax, $description); // Après

Emplacement : intranet-cop/src/insertion.php

Au niveau de la ligne ~33, dans l'appel de la fonction function addDelit(...) {...}, ajoutez les paramètres : , $montantMax, $description.

function addDelit($nom, $montant, $prison, $type) {...} // Avant
function addDelit($nom, $montant, $prison, $type, $montantMax, $description) {...} // Après

Dans le tableau présent dans $casier->set(array(...));, ajoutez :

'amende_max' => $montantMax,
'description' => $description,

Exemple avant :

$casier->set(array(
  'intitule' => $nom,
  'amende' => $montant,
  'temps_prison' => $prison,
  'type_delit' => $type,
));

Exemple après :

$casier->set(array(
  'intitule' => $nom,
  'amende' => $montant,
  'temps_prison' => $prison,
  'type_delit' => $type,
  'amende_max' => $montantMax,
  'description' => $description,
));

Emplacement : intranet-cop/routes/recherche.php

Au niveau de la ligne ~74, dans la fonction Flight::route('/recherche/info_delit', function() {...}, dans le tableau présent dans $data = [...];, ajoutez :

'amende_max' => $info->amende_max,
'description' => $info->description,

Exemple avant :

$data = [
  'amende' => $info->amende,
  'prison' => $info->temps_prison,
];

Exemple après :

$data = [
  'amende' => $info->amende,
  'prison' => $info->temps_prison,
  'amende_max' => $info->amende_max,
  'description' => $info->description,
];

Emplacement : intranet-cop/routes/edit.php

Au niveau de la ligne ~146, dans la fonction Flight::route('/delit/edit/value', function() {...}, à la suite de :

$id = $_POST['id_delit'];
$amd_delit = $_POST['amd_delit'];
$tps_delit = $_POST['tps_delit'];

Ajoutez :

$description_delit = $_POST['description_delit'];
$amd_delit_max = $_POST['amd_delit_max'];

À la suite de (~161) :

if (($info->temps_prison != $tps_delit) and ($amd_delit != '')) {
  editDelitPrison($id, $tps_delit);
  addHistorique(Agent::getInfoAgent()->matricule, "0¤3¤1¤" . $id . "¤" . $info->temps_prison . "¤" . $tps_delit);
}

Ajoutez :

if (($info->description != $description_delit) and ($description_delit != '')) {
  editDelitDescription($id, $description_delit);
  if ($info->retrait == null) { $info->retrait = 0; }
  addHistorique(Agent::getInfoAgent()->matricule, "0¤3¤3¤" . $id . "¤" . $info->description . "¤" . $description_delit);
}

if (($info->amende_max != $amd_delit_max) and ($amd_delit_max != '')) {
  editDelitAmendeMax($id, $amd_delit_max);
  if ($info->retrait == null) { $info->retrait = 0; }
  addHistorique(Agent::getInfoAgent()->matricule, "0¤3¤4¤" . $id . "¤" . $info->amende_max . "¤" . $amd_delit_max);
}

Emplacement : intranet-cop/src/edit.php

À la fin du fichier, avant ?>, ajoutez le code suivant :

function editDelitDescription($id, $description) {
  $delit = Model::factory('Delit')->where('id', $id)->find_one();
  $delit->set('description', $description);
  $delit->save();
}

function editDelitAmendeMax($id, $amendeMax) {
  $delit = Model::factory('Delit')->where('id', $id)->find_one();
  $delit->set('amende_max', $amendeMax);
  $delit->save();
}

Emplacement : intranet-cop/src/historique.php

Au niveau de la ligne ~73, à la suite de :

// Modification Délit
case '0¤3¤0':
  return "ADMIN : Modification Délit n°" . $code[3] . " - Amende : " . $code[4] . " >>> " . $code[5];
  break;
case '0¤3¤1':
  return "ADMIN : Modification Délit n°" . $code[3] . " - Temps prison : " . $code[4] . " >>> " . $code[5];
  break;

Ajoutez :

case '0¤3¤3':
  return "ADMIN : Modification Délit n°" . $code[3] . " - Description : " . $code[4] . " >>> " . $code[5];
  break;
case '0¤3¤4':
  return "ADMIN : Modification Délit n°" . $code[3] . " - Amende Max : " . $code[4] . " >>> " . $code[5];
  break;

(L'indicatif 0¤3¤2 étant déjà utilisé par le retrait de point)

Modification fichiers event_saisie.js

Emplacement : intranet-cop/assets/script/event_saisie.js

Au niveau de la ligne ~226, dans la fonction function AddDelitAdmin() {...} :

  • À la fin du tableau de la variable var_tab, ajoutez : , 'amende_max', 'description'.
  • À la fin du tableau de la variable var_tab2, ajoutez : , 'amd_delit_max', 'description_delit'.

Exemple avant :

let var_tab = ['nom', 'amende', 'temps', 'type'];
let var_tab2 = ['name_delit', 'amd_delit', 'tps_delit', 'type_delit'];

Exemple après :

let var_tab = ['nom', 'amende', 'temps', 'type', 'amende_max', 'description'];
let var_tab2 = ['name_delit', 'amd_delit', 'tps_delit', 'type_delit', 'amd_delit_max', 'description_delit'];

Au niveau de la ligne ~288 dans la fonction function AfficheMenuModDelit() {...} :

À la suite :

document.getElementById("list_route").style.display = "none";
document.getElementById("list_leger").style.display = "none";
document.getElementById("list_moyen").style.display = "none";
document.getElementById("list_grave").style.display = "none";
document.getElementById("dtls_amende").style.display = "none";
document.getElementById("dtls_prison").style.display = "none";
document.getElementById("confirm_edit_delit").style.display = "none";
document.getElementById("button_delit").style.display = "none";

Ajoutez :

document.getElementById("dtls_description").style.display = "none";
document.getElementById("dtls_amende_max").style.display = "none";

Au niveau de la ligne ~322 dans la fonction function AfficheMenuModDelit() {...} :

Dans la première condition if (value_this == 0) {...} avant le return;, ajoutez :

document.getElementById("dtls_description").style.display = "none";
document.getElementById("dtls_amende_max").style.display = "none";

À la suite de (~333) :

document.getElementById("dtls_amende").style.display = "block";
document.getElementById("dtls_prison").style.display = "block";
document.getElementById("confirm_edit_delit").style.display = "none";
document.getElementById("amd_delit").value = '';
document.getElementById("tps_delit").value = '';
document.getElementById("button_delit").setAttribute('value', value_this);
document.getElementById("button_delit").style.display = "initial";
document.getElementById("dtls_description").style.display = "block";
document.getElementById("dtls_amende_max").style.display = "block";

Ajoutez :

document.getElementById("dtls_description").style.display = "block";
document.getElementById("dtls_amende_max").style.display = "block";

À la suite de (~354) :

document.getElementById("amd_delit").placeholder = resultat.amende;
document.getElementById("tps_delit").placeholder = resultat.prison;

Ajoutez :

document.getElementById("amd_delit_max").placeholder = resultat.amende_max;
if (resultat.description != "") {
  document.getElementById("description_delit").placeholder = resultat.description;
}

Au niveau de la ligne ~360 dans la fonction function updateDelitAdmin() {...} :

À la suite de (~364) :

data.append('id_delit', document.getElementById('button_delit').value);
data.append('amd_delit', document.getElementById('amd_delit').value);
data.append('tps_delit', document.getElementById('tps_delit').value);

Ajoutez :

data.append('description_delit', document.getElementById('description_delit').value);
data.append('amd_delit_max', document.getElementById('amd_delit_max').value);

Modification fichier css

Emplacement : intranet-cop/assets/styles/global/contenu.css

À la fin du fichier, ajoutez :

.contenu div .description {
  display: block;
  margin-left: 20%;
  width: 100%;
  text-align: justify;
  color: var(--profilDescription);
  font-style: italic;
}

Au niveau de la ligne ~433, remplacez la fonction affiche_suite(actuel, contentValue, suivant) {...} par :

function affiche_suite(id, actuel, contentValue, suivant, devise) {
  getDescription(id, contentValue, devise);
  var act = document.getElementById(actuel);
  var actValue = document.getElementById(contentValue);
  if (act && actValue) {
    if (actValue.value) {
      var next = document.getElementById(suivant);
      if (next) {
        next.style.display = "block";
      }
    }
  }
}

À la fin du fichier, ajoutez :

/* Récupérer la description d'un délit */
function getDescription(id, contentValue, devise) {
  // On met en forme les données
  const data = new FormData();
  data.append('id_delit', document.getElementById(contentValue).value);

  // On envoi le modèle
  const requeteAjax = new XMLHttpRequest();
  requeteAjax.open('POST', '/recherche/info_delit');
  requeteAjax.send(data);

  // On récupère le résultat de la requête
  requeteAjax.onload = function() {
    const resultat = JSON.parse(requeteAjax.responseText);
    console.log(resultat);
    document.getElementById(`description_${id}`).innerHTML = `Amende forfaitaire : ${resultat.amende} ${devise}<br/>Amende maximale : ${resultat.amende_max} ${devise}<br/>Note(s) : ${resultat.description}`;
  }
}

Modification fichier css

Emplacement : intranet-cop/assets/styles/global/contenu.css

À la fin du fichier, ajoutez :

.contenu div .description {
  display: block;
  margin-left: 20%;
  width: 100%;
  text-align: justify;
  color: var(--profilDescription);
  font-style: italic;
}