Skip to main content

COP - Retrait auto des points de permis

Nous rejoindre sur Discord

Incompatible avec les versions antérieures à 2.3.0

Sujet : Retrait automatiquement les points sur le permis en fonction du délit

  • Liste des fichiers :
    • intranet-cop/routes/insert.php
    • intranet-cop/routes/edit.php
    • intranet-cop/routes/recherhe.php
    • intranet-cop/routes/delit-routier.php
    • intranet-cop/routes/civil.php
    • intranet-cop/assets/script/event_saisie.js
    • intranet-cop/page/administration/ajout_système.twig
    • intranet-cop/page/administration/modification_systeme.twig
    • intranet-cop/page/fiche/detail_route.twig
    • intranet-cop/page/fiche/montant_amende.twig
    • intranet-cop/page/add/add_delit_route.php
    • intranet-cop/entity/route.php
    • intranet-cop/src/insertion.php
    • site-cop/views/liste-amendes.twig

Application des modifications

Cette mise à jour va vous permettre dans un premier temps de définir un nombre de points par délit. Ensuite, lorsque vous fermerez un délit du type routier, les points seront automatiquement retirés sur le permis du conducteur.

Une fois que vous aurez terminé les modifications. Vous pouvez soit définir le nombre de points par délit depuis la base de données ou alors avec le menu d'administration avec la section modification.

Modification dans la base de données

Nous allons ajouter une colonne dans la déclaration des délits :

ALTER TABLE lspd_delit ADD `retrait` INTEGER DEFAULT NULL;

Reconstruction de la view info_route:

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.temps_prison AS prison, lspd_delit.retrait AS retrait, 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;

Cette requête permet de mettre la valeur de retrait des points de permis à 0 pour tous les délits routier.

UPDATE lspd_delit SET retrait = 0 WHERE `type_delit` = '0' AND `retrait` IS NULL; 

Modification de l'ajout des délits depuis l'administration

Fichier : intranet-cop/page/administration/ajout_système.twig

Remplacez (ligne ~64) :

<div>
  <label for="delit_prison">Temps de prison (mois) :</label>
  <input type="number" name="delit_prison" id="tps_delit" min="0" placeholder="Temps en mois">
</div>

<div>
  <label>Type de délit :</label>

  <select name="delit_type" id="type_delit">
    <option value="0">Délit Routier</option>
    <option value="1">Délit Léger</option>
    <option value="2">Délit Moyen</option>
    <option value="3">Délit Grave</option>
  </select>
</div>

Par :

<div>
  <label for="delit_prison">Temps de prison (mois) :</label>
  <input type="number" name="delit_prison" id="tps_delit" min="0" placeholder="Temps en mois">
</div>

<div id="visibleRetrait">
  <label for="retrait_point">Retrait des points :</label>
  <input type="number" name="retrait_point" id="point_retrait" min="0" placeholder="Nombre de points à retirer">
</div>

<div>
  <label>Type de délit :</label>

  <select name="delit_type" id="type_delit" onchange="afficheRetraitPermis();">
    <option value="0">Délit Routier</option>
    <option value="1">Délit Léger</option>
    <option value="2">Délit Moyen</option>
    <option value="3">Délit Grave</option>
  </select>
</div>

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

À la fin du fichier, ajoutez la fonction suivante :

/* Afficher la visibilité des retraits de points */
function afficheRetraitPermis() {
  var delit = document.getElementById("type_delit").value;

  if (delit === "0") {
    document.getElementById("visibleRetrait").style.display = "block";
  }
  else {
    document.getElementById("visibleRetrait").style.display = "none";
  }
}

Au niveau de la ligne 225, remplacez la fonction AddDelitAdmin() { ... } par :

/* Ajouter un délit dans la BDD */
function AddDelitAdmin() {
  event.preventDefault(); // Arret du formulaire

  let var_tab = ['nom', 'amende', 'temps', 'retrait', 'type'];
  let var_tab2 = ['name_delit', 'amd_delit', 'tps_delit', 'point_retrait', 'type_delit'];
  const data = createData(var_tab, var_tab2);

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

  document.getElementById("confirm_admin_delit").style.display = "block";
  for (var i = 0; i < (var_tab2.length - 1); i++) {
    document.getElementById(var_tab2[i]).value = "";
  }
}

Fichier : intranet-cop/routes/insert.php

Au niveau de la ligne ~57, remplacez le Flight::route('/insert/delit', function() { ... }); par :

Flight::route('/insert/delit', function() {
  verif_connecter();
  verif_admin();

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

  if ($retrait == 0) { $retrait = null; }

  $agent = Agent::getInfoAgent();
  addDelit($nom, $montant, $prison, $type, $retrait);
  addHistorique($agent->matricule, "0¤1¤" . ($type+1) . "¤" . $nom);
});

Fichier : intranet-cop/src/insertion.php

Au niveau de la ligne ~33, remplacez la fonction addDelit($nom, $montant, $prison, $type) { ... } par :

function addDelit($nom, $montant, $prison, $type, $retrait) {
  $casier = Model::factory('Delit')->create();
  $casier->set(array(
    'intitule' => $nom,
    'amende' => $montant,
    'temps_prison' => $prison,
    'type_delit' => $type,
    'retrait' => $retrait
  )
              );
  $casier->save();
}

Update pour la modification des délits depuis l'administration

Fichier : intranet-cop/routes/recherche.php

Au niveau de la ligne ~67 dans Flight::route('/recherche/info_delit', function(), remplacez :

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

Par :

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

Fichier : intranet-cop/routes/edit.php

Au niveau de la ligne ~139, remplacez le Flight::route('/delit/edit/value', function() { ... }); par :

Flight::route('/delit/edit/value', function() {
  verif_connecter();
  verif_admin();

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

  if ($retrait == 0) { $retrait = null; }

  $info = Delit::getinfoDelit($id);

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

  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);
  }

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

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

Au niveau de la ligne ~288, dans la fonction AfficheMenuModDelit(), à la fin de :

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("visibleRetrait").style.display = "none";

Au niveau de la ligne ~322, remplacer la fonction EditMenuModDelit(value_this) { ... } par :

/* Aficher les informations en fonction du délit */
function EditMenuModDelit(value_this) {
  if (value_this == 0) {
  document.getElementById("dtls_amende").style.display = "none";
  document.getElementById("dtls_prison").style.display = "none";
  document.getElementById("confirm_edit_delit").style.display = "none";
  document.getElementById("amd_delit").value = '';
  document.getElementById("tps_delit").value = '';
  document.getElementById("button_delit").style.display = "none";
  document.getElementById("visibleRetrait").style.display = "none";
  return;
  }

  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";

  if (document.getElementById("list_route").style.display != "none") {
    document.getElementById("visibleRetrait").style.display = "block";
  }

  // On met en forme les données
  const data = new FormData();
  data.append('id_delit', value_this);

  // 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);
    document.getElementById("amd_delit").placeholder = resultat.amende;
    document.getElementById("tps_delit").placeholder = resultat.prison;

    if (resultat.retrait) {
      document.getElementById("point_retrait").placeholder = resultat.retrait;
    }
    else {
      document.getElementById("point_retrait").placeholder = 0;
    }
  }
}

Au niveau de la ligne ~372, dans la fonction updateDelitAdmin() à la fin de :

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('retrait', document.getElementById('point_retrait').value);

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

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

<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>

<div id="dtls_prison">
  <label for="delit_prison">Temps de prison (mois) :</label>
  <input class="short" type="number" name="delit_prison" id="tps_delit" min="0" placeholder="Temps en mois">
</div>

Ajoutez :

<div id="visibleRetrait">
  <label for="retrait_point">Retrait des points :</label>
  <input type="number" name="retrait_point" id="point_retrait" min="0" placeholder="Nombre de points à retirer">
</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("visibleRetrait").style.display = "none";

Fichier : intranet-cop/src/edit.php Au niveau de la ligne ~88, en dessous de la fonction editDelitPrison($id, $tps_delit), ajoutez :

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

Fichier : intranet-cop/src/historique.php : Au niveau de la ligne ~73, remplacez :

// 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;

Par :

// 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;
case '0¤3¤2':
  return "ADMIN : Modification Délit n°" . $code[3] . " - Point retiré : " . $code[4] . " >>> " . $code[5];
  break;

Affichage du nombre de point sur la fiche

Fichier : intranet-cop/page/fiche/detail_route.twig

En dessous de (ligne ~38) :

<p><strong>Amende :</strong>{{ delit.amende|number_format(2, ',', ' ') }} $</p>

Ajoutez :

<p><strong>Point(s) :</strong>{{ delit.retrait }} point(s)</p>

Protocole de retrait de permis

Fichier : intranet-cop/route/delit-routier.php

Au niveau de la ligne ~95, remplacez Flight::route('/delit-routier/@id_delit/@etat', function($id_delit, $etat) { ... }); par :

Flight::route('/delit-routier/@id_delit/@etat', function($id_delit, $etat) {
  verif_connecter();
  $agent = Agent::getInfoAgent();

  if ($agent->editer == 0) {
    Flight::redirect("/delit-routier/$id_delit");
    exit();
  }
  closeRoute($id_delit, $etat, $agent->lspd_id);

  /* Protocole de perte de point pour le civil */
  if ($etat == 2) {
    /* Action sur le permis */
    $MyDelit = Route::getRoute($id_delit); // Récupération du délit
    $civil = Personne::getinfoPersonne($MyDelit->conducteur_id);
    $diff = $civil->permis - $MyDelit->retrait;
    if ($diff < 0) { $diff = 0; } // On ne va pas dans le négatif
    editCivil2($civil->id, $civil->phone, $diff, time());
  }

  addHistorique($agent->matricule, "5¤0¤1¤" . $id_delit . "¤" . $etat);

  Flight::redirect("/delit-routier/$id_delit");
});

Protocole Calculer l'amende

Fichier : intranet-cop/routes/civil.php

Au niveau de la ligne ~37 remplacez Flight::route('/civil/@id_citoyen/calcul-amende', function($id_citoyen) { ... }); par :

Flight::route('/civil/@id_citoyen/calcul-amende', function($id_citoyen) {
  verif_connecter();
  $civil = Personne::getinfoPersonne($id_citoyen);
  $amendeCasier = Casier::getAmende($id_citoyen);
  $amendeRoute = route::getAmende($id_citoyen);
  $retraitRoute = route::getRetrait($id_citoyen);
  $prisonCasier = Casier::getPrison($id_citoyen);
  $prisonRoute = route::getPrison($id_citoyen);
  $total = traitement_amende($amendeCasier, $amendeRoute, $prisonCasier, $prisonRoute);

  // Traitement de l'information date
  if ($civil->permis == 0) {
    $value = traitementDate($civil->date_permis);
    $civil->date_permis = $value[0]; // On modifie la valeur de date permis
    $civil->date_trad = $value[1];
  }

  Flight::view()->display('fiche/montant_amende.twig', array(
    'civil' => $civil,
    'prison' => $total[1],
    'amende' => $total[0],
    'prisonAnnée' => $total[2],
    'prisonAnnée2' => $total[3],
    'retrait' => $retraitRoute
  ));
});

Au niveau de la ligne ~64 remplacez Flight::route('/civil/@id_citoyen/close-casiers', function($id_citoyen) { ... }); par :

Flight::route('/civil/@id_citoyen/close-casiers', function($id_citoyen) {
  verif_connecter();
  $agent = Agent::getInfoAgent();

  if ($agent->editer == 0) {
    Flight::redirect("/civil/$id_citoyen/calcul-amende");
    exit();
  }

  $Casier = Casier::getCasierEnCours($id_citoyen);
  $Route = Route::getRouteEnCours($id_citoyen);
  foreach ($Casier as $variable) {
    closeCasier($variable->id_delit, 3, $agent->lspd_id);
    addHistorique($agent->matricule, "5¤0¤0¤" . $variable->id_delit . "¤" . 2);
  }

  foreach ($Route as $variable) {
    closeRoute($variable->delit_id, 3, $agent->lspd_id);

    /* Protocole de perte de point pour le civil */
    $MyDelit = Route::getRoute($variable->delit_id); // Récupération du délit
    $civil = Personne::getinfoPersonne($MyDelit->conducteur_id);
    $diff = $civil->permis - $MyDelit->retrait;
    if ($diff < 0) { $diff = 0; } // On ne va pas dans le négatif
    editCivil2($civil->id, $civil->phone, $diff, time());

    addHistorique($agent->matricule, "5¤0¤1¤" . $variable->delit_id . "¤" . 2);
  }
  Flight::redirect("/civil/$id_citoyen");
});

Fichier : intranet-cop/page/fiche/montant_amende.twig

En dessous de (ligne ~33) :

<p><strong>Temps de prison : </strong>{{ prisonAnnée }}</p>

Ajoutez :

{% if retrait < civil.permis %}
  <p><strong>Retrait point : </strong>{{ retrait }} point(s)</p>
{% else %}
  <p><strong>Retrait point : </strong>Permis Retiré</p>
{% endif %}

Fichier : intranet-cop/entity/route.php

Dans la class Route (ligne ~42) en dessous :

public static function getAmende($id) {
  return Route::where(array('conducteur_id' => $id, 'etat' => '0'))
              ->sum('amende');
}

Ajoutez :

public static function getRetrait($id) {
  return Route::where(array('conducteur_id' => $id, 'etat' => '0'))
              ->sum('retrait');
}

Modification de l'affichage lors de la saisie d'un délit routier

Fichier : intranet-cop/page/add/add_delit_route.php

Au niveau de la ligne ~39, remplacez :

<option value="{{ personne.id }}">{{ personne.nom|capitalize }} {{ personne.prenom|capitalize }}</option>

Par :

<option value="{{ personne.id }}">{{ personne.nom|capitalize }} {{ personne.prenom|capitalize }} - {{ personne.permis }} point(s)</option>

Au niveau de la ligne ~52, remplacez :

<option value="{{ route.id }}">{{ route.intitule|capitalize }} - {{ route.amende|number_format(2, ',', ' ') }} $</option>

Par :

<option value="{{ route.id }}">{{ route.intitule|capitalize }} - {{ route.amende|number_format(2, ',', ' ') }} $ - {{ route.retrait}} point(s)</option>

Modification sur le site vitrine

Pour afficher le nombre de points dans la liste des amendes vous devez modifier le fichier site-cop/views/liste_amendes.twig au niveau de la ligne ~30, remplacez :

<p><stong>{{ delit.intitule }} : </strong>{{ delit.amende }}$ - {{delit.temps_prison}} mois</p>

Par :

<p><stong>{{ delit.intitule }} : </strong>{{ delit.amende }}$ - {{delit.temps_prison}} mois - {{delit.retrait}} point(s)</p>

Vider le cache

Une fois que vous avez terminé les modifications, supprimez le répertoire cache de votre site intranet et vitrine.