This commit is contained in:
KONE SOREL 2026-04-09 09:29:47 +00:00
parent ae852627e9
commit d3fb51a941
4 changed files with 202 additions and 3 deletions

View File

@ -92694,4 +92694,192 @@ function retour_bereme_initial()
{
detail_baremepriseencharge(idBaremePriseEnCharge);
}
}
/**
* Contrôle la validité chronologique de la date d'effet pour une Lettre Clé
*/
function validiteDateEffetBaremeLettreCle() {
// 1. Collecte des informations
const racineWeb = $("#racineWeb").val();
const dateEffetSaisieStr = $("#dateEffetActe").val();
const dateJourSystemeStr = $("#datejour_C").val(); // Format YYYY-MM-DD
const donneesControle = {
idBaremePriseEnCharge: $("#idBaremePriseEnCharge").val(),
lettreCle: $("#lettreCle").val()
};
// Validation immédiate : Lettre clé obligatoire
if (!donneesControle.lettreCle || donneesControle.lettreCle.trim() === "") {
alert_ebene("Veuillez sélectionner une lettre clé !", "Please select a key letter !");
return;
}
// Validation immédiate : Date obligatoire
if (!dateEffetSaisieStr || dateEffetSaisieStr.trim() === "") {
alert_ebene("Veuillez entrer une date d'effet !", "Please enter an effective date !");
$("#dateEffetActe").focus();
return;
}
// 2. Préparation des objets Date
const parts = dateEffetSaisieStr.split('/');
const dateEffetSaisie = new Date(parts[2], parts[1] - 1, parts[0]);
const dateJourSysteme = new Date(dateJourSystemeStr);
// 3. Appel AJAX de contrôle
$.ajax({
url: racineWeb + "Ajaxbaremelettrecle/controle/",
type: 'post',
data: donneesControle,
success: function(data) {
// Injection du champ hidden maxDateEffetActeBareme retourné par le serveur
$('#div_maxdateeffetactebareme').html(data);
const maxDateBaseStr = $("#maxDateEffetActeBareme").val();
// Calcul des timestamps en jours (pour une comparaison fiable)
const dte = Math.round(dateEffetSaisie.getTime() / (1000 * 3600 * 24));
const dtj = Math.round(dateJourSysteme.getTime() / (1000 * 3600 * 24));
// 4. Logique de validation chronologique
if (dte < dtj && maxDateBaseStr) {
const maxDateBase = new Date(maxDateBaseStr);
const dtm = Math.round(maxDateBase.getTime() / (1000 * 3600 * 24));
if (dte < dtm) {
// Date invalide car antérieure à la dernière modification connue
alert_ebene(
"Date d'effet invalide ! Elle ne peut être antérieure à la dernière mise à jour de cette lettre clé.",
"Invalid effective date ! It cannot be earlier than the last update of this key letter."
);
$("#dateEffetActe").val('').focus();
return;
}
}
// 5. Validation réussie : Passage à l'insertion
if (typeof inserer_bareme_lettre_cle === 'function') {
inserer_bareme_lettre_cle();
}
},
error: function() {
alert_ebene("Erreur lors de la vérification de la date.", "Error during date verification.");
}
});
}
/**
* Insère une nouvelle ligne de barème pour une lettre clé après confirmation
*/
function inserer_bareme_lettre_cle() {
// 1. Récupération des éléments d'environnement
const racineWeb = $("#racineWeb").val();
const codeLangue = $("#codeLangue").val();
const $conteneurDetail = $("#div_detail_bareme");
// 2. Collecte et nettoyage des données
const donnees = {
idBaremePriseEnCharge: $("#idBaremePriseEnCharge").val(),
lettreCle: $("#lettreCle").val(),
dateEffetActe: $("#dateEffetActe").val(),
forfaitPlafondActe: $("#forfaitPlafondActe").val().replace(/\s/g, ""), // Supprime tous les types d'espaces
ticketModerateurActe: $("#ticketModerateurActe").val()
};
// 3. Validations de saisie
if (!donnees.lettreCle || donnees.lettreCle.trim() === "") {
alert_ebene("Veuillez entrer une lettre clé !", "Please enter a key letter !");
$("#lettreCle").focus();
return;
}
if (!donnees.dateEffetActe || donnees.dateEffetActe.trim() === "") {
alert_ebene("Veuillez entrer une date d'effet !", "Please enter an effective date !");
$("#dateEffetActe").focus();
return;
}
// Validation du montant (doit être supérieur à 0)
if (parseFloat(donnees.forfaitPlafondActe) <= 0 || donnees.forfaitPlafondActe === "") {
alert_ebene("Veuillez entrer un montant valide !", "Please enter a valid amount !");
$("#forfaitPlafondActe").focus();
return;
}
// 4. Processus de confirmation et envoi
confirm_ebene("Confirmez-vous cette opération ?", "Do you confirm this transaction ?")
.then((isConfirmed) => {
if (isConfirmed) {
// Affichage du loader (SaaS UX)
const loadingTxt = (codeLangue === "en_US") ? "Processing..." : "Traitement en cours...";
$conteneurDetail.html(`
<div class="d-flex flex-column align-items-center justify-content-center p-5 text-primary">
<div class="spinner-border" role="status" style="width: 4rem; height: 4rem;"></div>
<h5 class="mt-3 fw-bold text-uppercase">${loadingTxt}</h5>
</div>
`);
// Appel AJAX
$.ajax({
url: racineWeb + "Ajaxbaremelettrecle/ajouter/",
type: 'post',
data: donnees, // Envoi sous forme d'objet (plus propre)
success: function(response) {
// Actualisation de l'historique (table de détail)
if (typeof actualiser_bareme_acte_lettre_cle === 'function') {
actualiser_bareme_acte_lettre_cle();
}
},
error: function() {
alert_ebene("Erreur lors de l'enregistrement.", "Error during saving.");
}
});
}
});
}
/**
* Actualise l'historique des barèmes par lettres clés
*/
function actualiser_bareme_acte_lettre_cle() {
// 1. Initialisation des variables d'environnement
const racineWeb = $("#racineWeb").val();
const codeLangue = $("#codeLangue").val();
const $conteneur = $('#div_detail_bareme');
const donnees = {
idBaremePriseEnCharge: $("#idBaremePriseEnCharge").val()
};
// 2. Feedback visuel de mise à jour (SaaS UX)
// On affiche un spinner discret pour indiquer le rafraîchissement
const refreshMsg = (codeLangue === "en_US") ? "Updating history..." : "Mise à jour de l'historique...";
$conteneur.html(`
<div class="text-center py-4">
<div class="spinner-border spinner-border-sm text-primary" role="status"></div>
<span class="ms-2 small text-muted text-uppercase fw-bold">${refreshMsg}</span>
</div>
`);
// 3. Appel AJAX
$.ajax({
url: racineWeb + "Ajaxbaremelettrecle/",
type: 'post',
data: donnees,
success: function(data) {
// Injection du nouveau contenu avec une transition fluide
$conteneur.hide().html(data).fadeIn(200);
},
error: function(xhr, status, error) {
$conteneur.html(`
<div class="alert alert-warning border-0 small shadow-sm m-2">
<i class="fas fa-exclamation-triangle me-2"></i>
${(codeLangue === "en_US") ? "Error refreshing data." : "Erreur lors du rafraîchissement des données."}
</div>
`);
}
});
}

View File

@ -1750,4 +1750,15 @@ class Garantiesbaremepriseencharge extends Modele {
return $resultat->fetchAll(PDO::FETCH_ASSOC);
}
public function getMaxDateEffetBaremeInitialLette($idBaremePriseEnCharge, $lettreCle){
$sql="SELECT MAX(dateEffet) AS maxDateEffet FROM actesbaremeinitiallettrecle
WHERE idBaremePriseEnCharge = ? AND lettreCle = ?
AND supprime !='1' AND DATE(dateEffet) <= CURDATE();";
$resultat = $this->executerRequete($sql, array($idBaremePriseEnCharge, $lettreCle))->fetch(PDO::FETCH_ASSOC);
return $resultat['maxDateEffet'];
}
}

View File

@ -55,7 +55,7 @@
<tr class="<?= ($supprime == '1') ? 'table-danger opacity-50' : ''; ?>">
<td class="ps-3 fw-bold text-dark small border-end"><?= $libelle ?></td>
<td class="text-center text-nowrap"><?= dateLang($this->nettoyer($v['dateEffet']), $_SESSION['lang']); ?></td>
<td class="text-center text-nowrap"><?= Lang($this->nettoydateer($v['dateEffet']), $_SESSION['lang']); ?></td>
<td class="text-center fw-bold text-primary border-start"><?= $plafondFamille; ?></td>
<td class="text-center text-muted small"><?= $periodicitePlafondFamille;?></td>

View File

@ -2,11 +2,11 @@
$idBareme = $_SESSION['idBaremePriseEnCharge'];
$libelleBareme = $_SESSION['libelleBareme'];
$adminSin = $_SESSION['adminSin'];
$adminProd = $_SESSION['adminProd'];
?>
<input type="hidden" id="idBaremePriseEnCharge" name="idBaremePriseEnCharge" value="<?= $_SESSION['idBaremePriseEnCharge'] ?>">
<input type="hidden" id="adminSin" name="adminSin" value="<?= $adminSin; ?>">
<input type="hidden" id="adminProd" name="adminProd" value="<?= $adminProd; ?>">
<input type="hidden" id="masquerActe" name="masquerActe" value="1">
<div id="div_entete_bareme" class="page-content animate__animated animate__fadeIn">