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)
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/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 %}
Emplacement : intranet-cop/page/fiche/detail_casier.twig
En dessous de :
<p><strong>Nom :</strong>{{ delit.nom }}</p>
Ajoutez :
<p><strong>Description :</strong>{{ delit.description }}</p>
Et remplacez :
<p><strong>Amende :</strong>{{ delit.amende|number_format(2, ',', ' ') }} {{ _Devise }}</p>
Ajoutez :
<p><strong>Amende forfaitaire:</strong>{{ delit.amende|number_format(2, ',', ' ') }} {{ _Devise }}</p>
<p><strong>Amende maximal:</strong>{{ delit.amende_max|number_format(2, ',', ' ') }} {{ _Devise }}</p>
Emplacement : intranet-cop/page/fiche/detail_route.twig
En dessous de :
<p><strong>Nom Delit :</strong>{{ delit.nom }}</p>
Ajoutez :
<p><strong>Description :</strong>{{ delit.description }}</p>
Et remplacez :
<p><strong>Amende :</strong>{{ delit.amende|number_format(2, ',', ' ') }} {{ _Devise }}</p>
Ajoutez :
<p><strong>Amende forfaitaire:</strong>{{ delit.amende|number_format(2, ',', ' ') }} {{ _Devise }}</p>
<p><strong>Amende maximal:</strong>{{ delit.amende_max|number_format(2, ',', ' ') }} {{ _Devise }}</p>
Emplacement : intranet-cop/page/fiche/montant_amende.twig
Au niveau de la ligne ~31, remplacez :
<p><strong>Montant de l'amende : </strong>{{ amende|number_format(2, ',', ' ') }} {{ _Devise }}</p>
Par :
<p><strong>Montant total de l'amende forfaitaire :</strong> {{ amende|number_format(2, ',', ' ') }} {{ _Devise }}</p>
<p><strong>Montant maximal de l'amende : </strong>{{ amende_max|number_format(2, ',', ' ') }} {{ _Devise }}</p>
Et niveau de la ligne ~45, remplacez :
<p><strong>Montant de l'amende : </strong>{{ (amende / _divAmende)|number_format(2, ',', ' ') }} {{ _Devise }}</p>
Par :
<p><strong>Montant total de l'amende forfaitaire :</strong> {{ (amende / _divAmende)|number_format(2, ',', ' ') }} {{ _Devise }}</p>
<p><strong>Montant maximal de l'amende :</strong> {{ (amende_max / _divAmende)|number_format(2, ',', ' ') }} {{ _Devise }}</p>
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)
Emplacement : intranet-cop/routes/civil.php
Au niveau de la ligne ~38, dans la fonction Flight::route('/civil/@id_citoyen/calcul-amende', function($id_citoyen) {...}
, remplacez :
$total = traitement_amende($amendeCasier, $amendeRoute, $prisonCasier, $prisonRoute);
Par :
$amendeMaxCasier = Casier::getAmendeMax($id_citoyen);
$amendeMaxRoute = route::getAmendeMax($id_citoyen);
$total = traitement_amende($amendeCasier, $amendeRoute, $prisonCasier, $prisonRoute, $amendeMaxCasier, $amendeMaxRoute);
Au niveau de la ligne ~55, dans le tableau présent dans Flight::view()->display('fiche/montant_amende.twig', array(...));
, ajoutez :
'amende_max' => $total[4],
Exemple avant :
Flight::view()->display('fiche/montant_amende.twig', array(
'civil' => $civil,
'prison' => $total[1],
'amende' => $total[0],
'prisonAnnée' => $total[2],
'prisonAnnée2' => $total[3],
));
Exemple après :
Flight::view()->display('fiche/montant_amende.twig', array(
'civil' => $civil,
'prison' => $total[1],
'amende' => $total[0],
'amende_max' => $total[4],
'prisonAnnée' => $total[2],
'prisonAnnée2' => $total[3],
));
Emplacement : intranet-cop/src/functions.php
Au niveau de la ligne ~100, remplacez la fonction traitement_amende($ac, $ar, $pc, $pr) {...}
par :
function traitement_amende($ac, $ar, $pc, $pr, $amc, $amr) {
$info[0] = $ac + $ar; // Montant de l'amende totale
$info[1] = $pc + $pr; // Temps de prison total
$info[2] = ($info[1] - ($info[1]%12))/12 . " ans et " . $info[1]%12 . " mois"; // Temps de prison en années
$info[3] = ($info[1] - ($info[1]%12))/6 . " ans et " . ($info[1]%12)*serveurIni('PRISON', 'multiplicateur_prison') . " mois"; // Temps de prison en années
$info[4] = $amc + $amr; // Montant de l'amende totale maximale
return $info;
}
Emplacement : intranet-cop/entity/casier.php
En dessous de :
public static function getAmende($id) {
return Casier::where(array('id_personne' => $id, 'etat' => '0'))
->sum('amende');
}
Ajoutez la fonction suivante :
public static function getAmendeMax($id) {
return Casier::where(array('id_personne' => $id, 'etat' => '0'))
->sum('amende_max');
}
Emplacement : intranet-cop/entity/route.php
En dessous de :
public static function getAmende($id) {
return Route::where(array('conducteur_id' => $id, 'etat' => '0'))
->sum('amende');
}
Ajoutez la fonction suivante :
public static function getAmendeMax($id) { // Récuparatoin de l'ID d'une personne enfonction de son nom et prénom
return Route::where(array('conducteur_id' => $id, 'etat' => '0'))
->sum('amende_max');
}
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;
}