@ -1,4 +1,6 @@
<!-- Content Wrapper. Contains page content -->
<!-- Content Wrapper. Contains page content -->
< script src = "https://cdn.jsdelivr.net/npm/sweetalert2@11" > < / script >
< div class = "content-wrapper" >
< div class = "content-wrapper" >
< section class = "content-header" >
< section class = "content-header" >
< h1 >
< h1 >
@ -96,56 +98,51 @@
< div class = "modal-content" >
< div class = "modal-content" >
< form id = "create_avance_form" >
< form id = "create_avance_form" >
< div class = "modal-header" >
< div class = "modal-header" >
< h4 class = "modal-title" > Ajouter une avance < / h4 >
< h4 class = "modal-title" > Ajouter une avance< / h4 >
< button type = "button" class = "close" data-dismiss = "modal" > × < / button >
< button type = "button" class = "close" data-dismiss = "modal" > × < / button >
< / div >
< / div >
< div class = "modal-body" >
< div class = "modal-body" >
< div class = "row" >
< div class = "row" >
<!-- type d'avance -->
<!-- Type d'avance -->
<!-- <div class="form - group col - md - 6">
< label for = "id_product" class = "form-label" > Type d'avance< / label >
< select name = "id_product" id = "id_product" class = "form-control " required >
< option value = "" disabled selected > Sélectionnez un type d'avance < / option >
< option value = "terre" > Avance sur terre< / option >
< option value = "mere" > Avance sur mère< / option >
< / select >
< / div > -->
< div class = "form-group col-md-6" >
< div class = "form-group col-md-6" >
< label for = "type_avance" class = "form-label" > Type d'avance< / label >
< label for = "type_avance" class = "form-label" > Type d'avance< / label >
< select name = "type_avance" id = "type_avance" class = "form-control" required >
< select name = "type_avance" id = "type_avance" class = "form-control" required >
< option value = "" disabled selected > Sélectionnez un type d'avance< / option >
< option value = "" disabled selected > Sélectionnez un type d'avance< / option >
< option value = "terre" > Avance sur terre< / option >
< option value = "terre" > Avance sur terre< / option >
< option value = "mere" > Avance sur mère < / option >
< option value = "mere" > Avance sur mer< / option >
< / select >
< / select >
< / div >
< / div >
<!-- Moyen de paiement -->
< div class = "form-group col-md-6" >
< div class = "form-group col-md-6" >
< label for = "type_avance" class = "form-label" > Moyen de payment< / label >
< label for = "type_payment " class = "form-label" > Moyen de paie ment< / label >
< select class = "form-control" id = "type_payment" name = "type_payment" >
< select class = "form-control" id = "type_payment" name = "type_payment" >
< option value = "" disabled selected > Sélectionnez un moyen de pay ement< / option >
< option value = "" disabled selected > Sélectionnez un moyen de pai ement< / option >
< option value = "MVOLA" > MVOLA< / option >
< option value = "MVOLA" > MVOLA< / option >
< option value = "Virement Bancaire" > Virement Bancaire< / option >
< option value = "Virement Bancaire" > Virement Bancaire< / option >
< option value = "En espèce" > En espèce< / option >
< option value = "En espèce" > En espèce< / option >
< / select >
< / select >
< / div >
< / div >
<!-- Nom client -->
<!-- Nom client -->
< div class = "form-group col-md-6" >
< div class = "form-group col-md-6" >
< label > Nom du client< / label >
< label > Nom du client< / label >
< input type = "text" name = "customer_name_avance" id = "customer_name_avance" class = "form-control" required >
< input type = "text" name = "customer_name_avance" id = "customer_name_avance" class = "form-control" required >
< / div >
< / div >
<!-- Téléphone client -->
<!-- Téléphone client -->
< div class = "form-group col-md-6" >
< div class = "form-group col-md-6" >
< label > Téléphone du client< / label >
< label > Téléphone du client< / label >
< input type = "text" name = "customer_phone_avance" id = "customer_phone_avance" class = "form-control" required >
< input type = "text" name = "customer_phone_avance" id = "customer_phone_avance" class = "form-control" required >
< / div >
< / div >
< / div >
< div class = "row" >
<!-- Adresse client -->
<!-- Adresse client -->
< div class = "form-group col-md-6" >
< div class = "form-group col-md-6" >
< label > Adresse du client< / label >
< label > Adresse du client< / label >
< input type = "text" name = "customer_address_avance" id = "customer_address_avance" class = "form-control" required >
< input type = "text" name = "customer_address_avance" id = "customer_address_avance" class = "form-control" required >
< / div >
< / div >
<!-- CIN client -->
<!-- CIN client -->
< div class = "form-group col-md-6" >
< div class = "form-group col-md-6" >
< label > CIN du client< / label >
< label > CIN du client< / label >
@ -154,10 +151,10 @@
< / div >
< / div >
< div class = "row" >
< div class = "row" >
<!-- Produit -->
<!-- Produit avec sélection (pour "terre") -->
< div class = "form-group col-md-6" >
< div class = "form-group col-md-6" id = "product_select_container" >
< label for = "id_product" class = "form-label" > Produit< / label >
< label for = "id_product" class = "form-label" > Produit< / label >
< select name = "id_product" id = "id_product" class = "form-control" onchange = "getProductDataCreate()" required >
< select name = "id_product" id = "id_product" class = "form-control" onchange = "getProductDataCreate()" >
< option value = "" > Sélectionnez un produit< / option >
< option value = "" > Sélectionnez un produit< / option >
<?php foreach ( $products as $p ) : ?>
<?php foreach ( $products as $p ) : ?>
< option value = " <? = $p [ 'id' ] ?> " <? = $p [ 'product_sold' ] ? 'disabled' : '' ?> >
< option value = " <? = $p [ 'id' ] ?> " <? = $p [ 'product_sold' ] ? 'disabled' : '' ?> >
@ -166,10 +163,17 @@
<?php endforeach ; ?>
<?php endforeach ; ?>
< / select >
< / select >
< / div >
< / div >
<!-- Prix brut -->
<!-- Produit avec texte libre (pour "mère") -->
< div class = "form-group col-md-6" id = "product_text_container" style = "display:none;" >
< label > Produit (à compléter)< / label >
< input type = "text" name = "product_name_text" id = "product_name_text" class = "form-control" placeholder = "Entrez le nom du produit" >
< / div >
<!-- Prix du produit -->
< div class = "form-group col-md-6" >
< div class = "form-group col-md-6" >
< label > Prix du produit< / label >
< label > Prix du produit< / label >
< input type = "text" name = "gross_amount" id = "gross_amount" class = "form-control" readonly >
< input type = "number " name = "gross_amount" id = "gross_amount" class = "form-control" placeholder = "Entrez le prix" >
< / div >
< / div >
< / div >
< / div >
@ -177,15 +181,25 @@
<!-- Avance -->
<!-- Avance -->
< div class = "form-group col-md-6" >
< div class = "form-group col-md-6" >
< label > Avance< / label >
< label > Avance< / label >
< input type = "number" name = "avance_amount" id = "avance_amount" class = "form-control" onkeyup = "updateDueCreate()" required >
< input type = "number" name = "avance_amount" id = "avance_amount" class = "form-control" placeholder = "Entrez l'avance" >
< / div >
< / div >
<!-- Reste à payer -->
<!-- Reste à payer -->
< div class = "form-group col-md-6" >
< div class = "form-group col-md-6" >
< label > Reste à payer< / label >
< label > Reste à payer< / label >
< input type = "text" name = "amount_due" id = "amount_due" class = "form-control" readonly >
< input type = "text" name = "amount_due" id = "amount_due" class = "form-control" readonly >
< / div >
< / div >
< / div >
< / div >
<!-- Commentaire (affiché uniquement pour "mère") -->
< div class = "row" >
< div class = "form-group col-md-12" id = "commentaire_container" style = "display:none;" >
< label > Commentaire< / label >
< textarea name = "commentaire" id = "commentaire" class = "form-control" rows = "3" > < / textarea >
< / div >
< / div >
< / div >
< / div >
< div class = "modal-footer" >
< div class = "modal-footer" >
< button type = "submit" class = "btn btn-primary" > Enregistrer< / button >
< button type = "submit" class = "btn btn-primary" > Enregistrer< / button >
< button type = "button" class = "btn btn-default" data-dismiss = "modal" > Annuler< / button >
< button type = "button" class = "btn btn-default" data-dismiss = "modal" > Annuler< / button >
@ -196,17 +210,19 @@
< / div >
< / div >
<?php endif ; ?>
<?php endif ; ?>
<!-- Modal Modification CORRIGÉ -->
<!-- Modal Modification -->
<?php if ( in_array ( 'updateAvance' , $user_permission )) : ?>
<?php if ( in_array ( 'updateAvance' , $user_permission )) : ?>
< div class = "modal fade" id = "updateModal" tabindex = "-1" role = "dialog" >
< div class = "modal fade" id = "updateModal" tabindex = "-1" role = "dialog" >
< div class = "modal-dialog" >
< div class = "modal-dialog" >
< div class = "modal-content" >
< div class = "modal-content" >
< form id = "update_avance_form" method = "post" >
< form id = "update_avance_form" method = "post" >
< input type = "hidden" name = "id" id = "avance_id_edit" >
< input type = "hidden" name = "id" id = "avance_id_edit" >
< div class = "modal-header" >
< div class = "modal-header" >
< h4 class = "modal-title" > Modifier une avance< / h4 >
< h4 class = "modal-title" > Modifier une avance< / h4 >
< button type = "button" class = "close" data-dismiss = "modal" > × < / button >
< button type = "button" class = "close" data-dismiss = "modal" > × < / button >
< / div >
< / div >
< div class = "modal-body" >
< div class = "modal-body" >
< div class = "row" >
< div class = "row" >
<!-- Type d'avance -->
<!-- Type d'avance -->
@ -215,11 +231,11 @@
< select name = "type_avance_edit" id = "type_avance_edit" class = "form-control" required >
< select name = "type_avance_edit" id = "type_avance_edit" class = "form-control" required >
< option value = "" disabled > Sélectionnez un type d'avance< / option >
< option value = "" disabled > Sélectionnez un type d'avance< / option >
< option value = "terre" > Avance sur terre< / option >
< option value = "terre" > Avance sur terre< / option >
< option value = "mere" > Avance sur mère < / option >
< option value = "mere" > Avance sur mer < / option >
< / select >
< / select >
< / div >
< / div >
<!-- CORRECTION: ID cohérent pour le type de paiement -->
<!-- Moyen de paiement -->
< div class = "form-group col-md-6" >
< div class = "form-group col-md-6" >
< label for = "type_payment_edit" class = "form-label" > Moyen de paiement< / label >
< label for = "type_payment_edit" class = "form-label" > Moyen de paiement< / label >
< select class = "form-control" id = "type_payment_edit" name = "type_payment_edit" >
< select class = "form-control" id = "type_payment_edit" name = "type_payment_edit" >
@ -253,11 +269,13 @@
< label > CIN du client< / label >
< label > CIN du client< / label >
< input type = "text" name = "customer_cin_avance_edit" id = "customer_cin_avance_edit" class = "form-control" required >
< input type = "text" name = "customer_cin_avance_edit" id = "customer_cin_avance_edit" class = "form-control" required >
< / div >
< / div >
< / div >
<!-- Produit -->
< div class = "row" >
< div class = "form-group col-md-6" >
<!-- Produit avec sélection (pour "terre") -->
< div class = "form-group col-md-6" id = "product_select_container_edit" >
< label class = "form_label" > Produit< / label >
< label class = "form_label" > Produit< / label >
< select name = "id_product_edit" id = "id_product_edit" class = "form-control" onchange = "getProductDataUpdate()" required >
< select name = "id_product_edit" id = "id_product_edit" class = "form-control" onchange = "getProductDataUpdate()" >
< option value = "" > Sélectionnez un produit< / option >
< option value = "" > Sélectionnez un produit< / option >
<?php foreach ( $products as $p ) : ?>
<?php foreach ( $products as $p ) : ?>
< option value = " <? = $p [ 'id' ] ?> " <? = $p [ 'product_sold' ] ? 'disabled' : '' ?> >
< option value = " <? = $p [ 'id' ] ?> " <? = $p [ 'product_sold' ] ? 'disabled' : '' ?> >
@ -268,17 +286,24 @@
< / select >
< / select >
< / div >
< / div >
<!-- Produit avec texte libre (pour "mère") -->
< div class = "form-group col-md-6" id = "product_text_container_edit" style = "display:none;" >
< label > Produit (à compléter)< / label >
< input type = "text" name = "product_name_text_edit" id = "product_name_text_edit" class = "form-control" placeholder = "Entrez le nom du produit" >
< / div >
<!-- Prix du produit -->
<!-- Prix du produit -->
< div class = "form-group col-md-6" >
< div class = "form-group col-md-6" >
< label > Prix du produit< / label >
< label > Prix du produit< / label >
< input type = "text" name = "gross_amount_edit" id = "gross_amount_edit" class = "form-control" readonly >
< input type = "number" name = "gross_amount_edit" id = "gross_amount_edit" class = "form-control" placeholder = "Entrez le prix" >
< / div >
< / div >
< / div >
< div class = "row" >
<!-- Avance -->
<!-- Avance -->
< div class = "form-group col-md-6" >
< div class = "form-group col-md-6" >
< label > Avance< / label >
< label > Avance< / label >
< input type = "number" name = "avance_amount_edit" id = "avance_amount_edit" class = "form-control" onkeyup = "updateDueEdit()" required >
< input type = "number" name = "avance_amount_edit" id = "avance_amount_edit" class = "form-control" placeholder = "Entrez l'avance" >
< / div >
< / div >
<!-- Reste à payer -->
<!-- Reste à payer -->
@ -287,6 +312,14 @@
< input type = "text" name = "amount_due_edit" id = "amount_due_edit" class = "form-control" readonly >
< input type = "text" name = "amount_due_edit" id = "amount_due_edit" class = "form-control" readonly >
< / div >
< / div >
< / div >
< / div >
<!-- Commentaire (affiché uniquement pour "mère") -->
< div class = "row" >
< div class = "form-group col-md-12" id = "commentaire_container_edit" style = "display:none;" >
< label > Commentaire< / label >
< textarea name = "commentaire_edit" id = "commentaire_edit" class = "form-control" rows = "3" > < / textarea >
< / div >
< / div >
< / div >
< / div >
< div class = "modal-footer" >
< div class = "modal-footer" >
@ -367,10 +400,26 @@ $(document).ready(function() {
// 🔄 FONCTION DE MISE À JOUR DYNAMIQUE DE LA DATATABLE
// 🔄 FONCTION DE MISE À JOUR DYNAMIQUE DE LA DATATABLE
function refreshDataTable() {
function refreshDataTable() {
if (typeof manageTable !== 'undefined' & & manageTable) {
if (typeof manageTable !== 'undefined' & & manageTable) {
manageTable.ajax.reload(null, false); // Recharger seulement les données de la table
manageTable.ajax.reload(null, false);
}
}
}
}
// ✅ INITIALISATION : Définir "terre" par défaut au chargement du modal création
$('#createModal').on('show.bs.modal', function() {
$('#create_avance_form')[0].reset();
// Par défaut : mode "terre"
$('#product_select_container').show();
$('#id_product').prop('required', true);
$('#product_text_container').hide();
$('#product_name_text').prop('required', false);
$('#gross_amount').prop('readonly', true).prop('type', 'text');
$('#commentaire_container').hide();
// Réattacher les événements
$('#avance_amount').off('keyup').on('keyup', updateDueCreate);
});
<?php if ( $isAdmin ) : ?>
<?php if ( $isAdmin ) : ?>
var adminColumns = [
var adminColumns = [
{ title: "Client" },
{ title: "Client" },
@ -386,18 +435,18 @@ $(document).ready(function() {
<?php endif ; ?>
<?php endif ; ?>
];
];
var manageTable = initAvanceTable('fetchAvanceData', adminColumns);
var manageTable = initAvanceTable(base_url + 'avances/ fetchAvanceData', adminColumns);
$('#avance_order').on('click', function () {
$('#avance_order').on('click', function () {
manageTable = initAvanceTable('fetchAvanceBecameOrder', adminColumns);
manageTable = initAvanceTable(base_url + 'avances/ fetchAvanceBecameOrder', adminColumns);
});
});
$('#avance_expired').on('click', function () {
$('#avance_expired').on('click', function () {
manageTable = initAvanceTable('fetchExpiredAvance', adminColumns);
manageTable = initAvanceTable(base_url + 'avances/ fetchExpiredAvance', adminColumns);
});
});
$('#avance_no_order').on('click', function () {
$('#avance_no_order').on('click', function () {
manageTable = initAvanceTable('fetchAvanceData', adminColumns);
manageTable = initAvanceTable(base_url + 'avances/ fetchAvanceData', adminColumns);
});
});
<?php endif ; ?>
<?php endif ; ?>
@ -424,70 +473,159 @@ $(document).ready(function() {
});
});
<?php endif ; ?>
<?php endif ; ?>
// =====================================================
// 🔥 GESTION DU TYPE D'AVANCE - CRÉATION
// =====================================================
$('#type_avance').on('change', function() {
var typeAvance = $(this).val();
if (typeAvance === 'mere') {
// MASQUER le select de produit
$('#product_select_container').hide();
$('#id_product').prop('required', false).val('');
// AFFICHER le champ texte pour produit
$('#product_text_container').show();
$('#product_name_text').prop('required', true);
// RENDRE le prix modifiable ET changer en type="number"
$('#gross_amount').prop('readonly', false).prop('type', 'number').val('').prop('required', true);
// AFFICHER le commentaire
$('#commentaire_container').show();
// Calcul simple : Prix - Avance
$('#avance_amount, #gross_amount').off('keyup').on('keyup', function() {
var prix = parseFloat($('#gross_amount').val()) || 0;
var avance = parseFloat($('#avance_amount').val()) || 0;
var reste = prix - avance;
$('#amount_due').val(reste >= 0 ? reste.toFixed(0) : 0);
});
} else if (typeAvance === 'terre') {
// AFFICHER le select de produit
$('#product_select_container').show();
$('#id_product').prop('required', true);
// MASQUER le champ texte
$('#product_text_container').hide();
$('#product_name_text').prop('required', false).val('');
// RENDRE le prix readonly ET en type="text"
$('#gross_amount').prop('readonly', true).prop('type', 'text').prop('required', false);
// MASQUER le commentaire
$('#commentaire_container').hide();
$('#commentaire').val('');
// Restaurer le comportement normal avec validation 25%
$('#avance_amount').off('keyup').on('keyup', updateDueCreate);
$('#gross_amount').off('keyup');
}
// Réinitialiser les champs
$('#gross_amount').val('');
$('#avance_amount').val('');
$('#amount_due').val('');
});
// =====================================================
// 🔥 GESTION DU TYPE D'AVANCE - ÉDITION
// =====================================================
$('#type_avance_edit').on('change', function() {
var typeAvance = $(this).val();
if (typeAvance === 'mere') {
$('#product_select_container_edit').hide();
$('#id_product_edit').prop('required', false).val('');
$('#product_text_container_edit').show();
$('#product_name_text_edit').prop('required', true);
$('#gross_amount_edit').prop('readonly', false).prop('type', 'number').prop('required', true);
$('#commentaire_container_edit').show();
$('#avance_amount_edit, #gross_amount_edit').off('keyup').on('keyup', function() {
var prix = parseFloat($('#gross_amount_edit').val()) || 0;
var avance = parseFloat($('#avance_amount_edit').val()) || 0;
var reste = prix - avance;
$('#amount_due_edit').val(reste >= 0 ? reste.toFixed(0) : 0);
});
} else if (typeAvance === 'terre') {
$('#product_select_container_edit').show();
$('#id_product_edit').prop('required', true);
$('#product_text_container_edit').hide();
$('#product_name_text_edit').prop('required', false).val('');
$('#gross_amount_edit').prop('readonly', true).prop('type', 'text').prop('required', false);
$('#commentaire_container_edit').hide();
$('#commentaire_edit').val('');
$('#avance_amount_edit').off('keyup').on('keyup', updateDueEdit);
$('#gross_amount_edit').off('keyup');
}
});
// ✅ CRÉATION avec actualisation automatique
// ✅ CRÉATION avec actualisation automatique
$('#create_avance_form').on('submit', function(e) {
$('#create_avance_form').on('submit', function(e) {
e.preventDefault();
e.preventDefault();
const $form = $(this);
const $form = $(this);
var typeAvance = $('#type_avance').val();
var brut = parseFloat($('#gross_amount').val()) || 0;
var brut = parseFloat($('#gross_amount').val()) || 0;
var avance = parseFloat($('#avance_amount').val()) || 0;
var avance = parseFloat($('#avance_amount').val()) || 0;
var minAvance = brut * 0.25;
if (typeAvance === 'terre') {
var minAvance = brut * 0.25;
if (avance < minAvance ) {
if (avance < minAvance ) {
$("#messages").html(`
Swal.fire({
< div class = "alert alert-danger alert-dismissible" role = "alert" >
icon: 'error',
< button type = "button" class = "close" data-dismiss = "alert" aria-label = "Close" >
title: 'Avance insuffisante',
< span aria-hidden = "true" > × < / span >
html: `L'avance doit être au minimum de < b > 25%< / b > du prix du produit (< b > ${minAvance.toFixed(2)} Ar< / b > ).`,
< / button >
confirmButtonText: 'OK',
< strong > < span class = "glyphicon glyphicon-exclamation-sign" > < / span > < / strong >
confirmButtonColor: '#d33'
L'avance doit être au minimum de 25% du prix du produit (${minAvance.toFixed(2)} Ar).
});
< / div >
`);
return;
return;
}
}
}
// Désactiver le bouton de soumission
// Validation pour "mère"
if (typeAvance === 'mere') {
if (!$('#product_name_text').val() || brut === 0 || avance === 0) {
Swal.fire({
icon: 'warning',
title: 'Champs manquants',
text: 'Veuillez remplir tous les champs : produit, prix et avance.'
});
return;
}
}
$form.find('button[type="submit"]').prop('disabled', true).text('Enregistrement...');
$form.find('button[type="submit"]').prop('disabled', true).text('Enregistrement...');
$.post('/avances/createAvance', $form.serialize(), function(res) {
$.post('/avances/createAvance', $form.serialize(), function(res) {
if (res.success === true) {
if (res.success === true) {
$("#messages").html(`
Swal.fire({
< div class = "alert alert-success alert-dismissible" role = "alert" >
icon: 'success',
< button type = "button" class = "close" data-dismiss = "alert" aria-label = "Close" >
title: 'Succès',
< span aria-hidden = "true" > × < / span >
text: res.messages,
< / button >
timer: 1500,
< strong > < span class = "glyphicon glyphicon-ok-sign" > < / span > < / strong > ${res.messages}
showConfirmButton: false
< / div >
}).then(() => {
`);
$("#createModal").modal('hide');
$("#createModal").modal('hide');
$form[0].reset(); // Reset le formulaire
$form[0].reset();
// 🔄 MISE À JOUR DYNAMIQUE après ajout
setTimeout(function() {
location.reload();
location.reload();
}, 500); // petit délai pour voir le message
});
// Auto-masquer le message après 3 secondes
setTimeout(function() {
$("#messages .alert").fadeOut();
}, 3000);
} else {
} else {
$("#createModal").modal('hide');
Swal.fire({
$("#messages").html(`
icon: 'error',
< div class = "alert alert-warning alert-dismissible" role = "alert" >
title: 'Erreur',
< button type = "button" class = "close" data-dismiss = "alert" aria-label = "Close" >
text: res.messages
< span aria-hidden = "true" > × < / span >
});
< / button >
< strong > < span class = "glyphicon glyphicon-exclamation-sign" > < / span > < / strong > ${res.messages}
< / div >
`);
// Réactiver le bouton en cas d'erreur
$form.find('button[type="submit"]').prop('disabled', false).text('Enregistrer');
$form.find('button[type="submit"]').prop('disabled', false).text('Enregistrer');
}
}
}, 'json');
}, 'json');
});
});
// 🔥 SUPPRESSION
// 🔥 SUPPRESSION avec actualisation automatique
window.removeFunc = function(id, product_id) {
window.removeFunc = function(id, product_id) {
$('#removeModal').modal('show');
$('#removeModal').modal('show');
$('#removeForm input[name="avance_id"]').val(id);
$('#removeForm input[name="avance_id"]').val(id);
@ -496,11 +634,9 @@ $(document).ready(function() {
$('#removeForm').on('submit', function(e) {
$('#removeForm').on('submit', function(e) {
e.preventDefault();
e.preventDefault();
var form = $(this);
var form = $(this);
var submitButton = form.find('button[type="submit"]');
var submitButton = form.find('button[type="submit"]');
// Désactiver le bouton
submitButton.prop('disabled', true).text('Suppression...');
submitButton.prop('disabled', true).text('Suppression...');
$.ajax({
$.ajax({
@ -521,10 +657,8 @@ $(document).ready(function() {
< / div >
< / div >
`);
`);
// 🔄 MISE À JOUR DYNAMIQUE après suppression
refreshDataTable();
refreshDataTable();
// Auto-masquer le message après 3 secondes
setTimeout(function() {
setTimeout(function() {
$("#messages .alert").fadeOut();
$("#messages .alert").fadeOut();
location.reload();
location.reload();
@ -542,19 +676,6 @@ $(document).ready(function() {
`);
`);
}
}
},
},
error: function(xhr, status, error) {
console.log('Erreur AJAX:', error);
$('#removeModal').modal('hide');
$("#messages").html(`
< div class = "alert alert-danger alert-dismissible" role = "alert" >
< button type = "button" class = "close" data-dismiss = "alert" aria-label = "Close" >
< span aria-hidden = "true" > × < / span >
< / button >
< strong > < span class = "glyphicon glyphicon-exclamation-sign" > < / span > < / strong > Une erreur est survenue lors de la suppression.
< / div >
`);
},
complete: function() {
complete: function() {
submitButton.prop('disabled', false).text('Oui');
submitButton.prop('disabled', false).text('Oui');
}
}
@ -563,12 +684,6 @@ $(document).ready(function() {
return false;
return false;
});
});
// Réinitialiser le modal à la fermeture
$('#removeModal').on('hidden.bs.modal', function() {
$('#removeForm')[0].reset();
$('#removeForm button[type="submit"]').prop('disabled', false).text('Oui');
});
}); // Fin document.ready
}); // Fin document.ready
// --- Fonctions utilitaires ---
// --- Fonctions utilitaires ---
@ -585,19 +700,17 @@ function getProductDataCreate() {
var avance25 = brutCreate * 0.25;
var avance25 = brutCreate * 0.25;
$('#avance_amount').val(avance25.toFixed(0));
$('#avance_amount').val(avance25.toFixed(0));
$('#amount_due').val((brutCreate - avance25).toFixed(0));
$('#amount_due').val((brutCreate - avance25).toFixed(0));
updateDueCreate();
}, 'json');
}, 'json');
}
}
function updateDueCreate() {
function updateDueCreate() {
var av = parseFloat($('#avance_amount').val()) || 0;
var av = parseFloat($('#avance_amount').val()) || 0;
var brutAmount = parseFloat($('#gross_amount').val()) || 0;
var brutAmount = parseFloat($('#gross_amount').val()) || 0;
$('#amount_due').val(Math.max(brutAmount - av, 0));
$('#amount_due').val(Math.max(brutAmount - av, 0).toFixed(0) );
}
}
function getProductDataUpdate() {
function getProductDataUpdate() {
var id = $('#id_product_edit').val();
var id = $('#id_product_edit').val();
console.log('getProductDataUpdate appelée avec ID:', id); // Pour déboguer
if (!id) {
if (!id) {
brutEdit = 0;
brutEdit = 0;
@ -611,32 +724,22 @@ function getProductDataUpdate() {
data: { product_id: id },
data: { product_id: id },
dataType: 'json',
dataType: 'json',
success: function(r) {
success: function(r) {
console.log('Données produit reçues:', r); // Pour déboguer
brutEdit = parseFloat(r.prix_vente) || 0;
brutEdit = parseFloat(r.prix_vente) || 0;
$('#gross_amount_edit').val(brutEdit.toFixed(0));
$('#gross_amount_edit').val(brutEdit.toFixed(0));
var avance25 = brutEdit * 0.25;
var avance25 = brutEdit * 0.25;
$('#avance_amount_edit').val(avance25.toFixed(0));
$('#avance_amount_edit').val(avance25.toFixed(0));
$('#amount_due_edit').val((brutEdit - avance25).toFixed(0));
$('#amount_due_edit').val((brutEdit - avance25).toFixed(0));
updateDueEdit();
},
error: function(xhr, status, error) {
console.log('Erreur lors de la récupération des données produit:', error);
}
}
});
});
}
}
function updateDueEdit() {
function updateDueEdit() {
var av = parseFloat($('#avance_amount_edit').val()) || 0;
var av = parseFloat($('#avance_amount_edit').val()) || 0;
$('#amount_due_edit').val(Math.max(brutEdit - av, 0).toFixed(2 ));
$('#amount_due_edit').val(Math.max(brutEdit - av, 0).toFixed(0 ));
}
}
// ✅ MODIFICATION avec mise à jour dynamique - CORRIGÉ
// ✅ MODIFICATION
// ✅ MODIFICATION avec mise à jour dynamique - VERSION CORRIGÉE
function editFunc(id) {
function editFunc(id) {
console.log('editFunc appelée avec ID:', id);
// Réinitialiser d'abord le formulaire
$('#update_avance_form')[0].reset();
$('#update_avance_form')[0].reset();
$.ajax({
$.ajax({
@ -644,71 +747,53 @@ function editFunc(id) {
type: 'GET',
type: 'GET',
dataType: 'json',
dataType: 'json',
success: function(r) {
success: function(r) {
console.log('Données récupérées:', r);
// Pré-remplir le formulaire de modification avec les BONS IDs
$('#avance_id_edit').val(r.id || id);
$('#avance_id_edit').val(r.id || id);
$('#customer_name_avance_edit').val(r.customer_name || '');
$('#customer_name_avance_edit').val(r.customer_name || '');
$('#customer_phone_avance_edit').val(r.customer_phone || '');
$('#customer_phone_avance_edit').val(r.customer_phone || '');
$('#customer_address_avance_edit').val(r.customer_address || r.customer_adress || '');
$('#customer_address_avance_edit').val(r.customer_address || r.customer_adress || '');
$('#customer_cin_avance_edit').val(r.customer_cin || '');
$('#customer_cin_avance_edit').val(r.customer_cin || '');
$('#type_avance_edit').val(r.type_avance || '');
$('#type_avance_edit').val(r.type_avance || '');
$('#type_payment_edit').val(r.type_payment || '');
$('#gross_amount_edit').val(r.gross_amount || '');
$('#gross_amount_edit').val(r.gross_amount || '');
$('#avance_amount_edit').val(r.avance_amount || '');
$('#avance_amount_edit').val(r.avance_amount || '');
$('#amount_due_edit').val(r.amount_due || '');
$('#amount_due_edit').val(r.amount_due || '');
$('#commentaire_edit').val(r.commentaire || '');
// CORRECTION 1: ID correct pour le type de paiement
// Gérer le produit selon le type
$('#type_payment_edit').val(r.type_payment || '');
if (r.type_avance === 'mere' & & r.product_name) {
$('#product_name_text_edit').val(r.product_name);
// Récupérer l'ID du produit avec toutes les variantes possibles
}
var productId = r.product_id || r.id_product || r.productId || r.idProduct;
console.log('Product ID trouvé:', productId);
var productId = r.product_id || r.id_product;
brutEdit = parseFloat(r.gross_amount || 0);
brutEdit = parseFloat(r.gross_amount || 0);
// Réinitialiser le bouton
$('#update_avance_form button[type="submit"]').prop('disabled', false).text('Modifier');
// Ouvrir le modal
$('#updateModal').modal('show');
$('#updateModal').modal('show');
// CORRECTION 2: Sélection du produit après ouverture complète du modal
$('#updateModal').on('shown.bs.modal', function(e) {
$('#updateModal').on('shown.bs.modal', function(e) {
if (productId) {
// Déclencher le change pour afficher les bons champs
console.log('Tentative de sélection du produit ID:', productId );
$('#type_avance_edit').trigger('change' );
// Méthode robuste de sélection
if (productId & & r.type_avance === 'terre') {
setTimeout(function() {
setTimeout(function() {
// Vérifier d'abord si l'option existe
$('#id_product_edit').val(productId).trigger('change');
var optionExists = $('#id_product_edit option[value="' + productId + '"]').length > 0;
}, 100);
console.log('Option produit existe:', optionExists);
if (optionExists) {
$('#id_product_edit').val(productId);
console.log('Produit sélectionné:', $('#id_product_edit').val());
// Déclencher l'événement change pour mettre à jour les prix si nécessaire
$('#id_product_edit').trigger('change');
} else {
console.log('Attention: Produit ID ' + productId + ' non trouvé dans les options');
}
}, 100); // Petit délai pour s'assurer que le modal est complètement chargé
}
}
// Détacher l'événement pour éviter les appels multiples
$(this).off('shown.bs.modal');
$(this).off('shown.bs.modal');
});
});
// CORRECTION 3: Gestion du formulaire de soumission améliorée
$('#update_avance_form').off('submit').on('submit', function(e) {
$('#update_avance_form').off('submit').on('submit', function(e) {
e.preventDefault();
e.preventDefault();
var $form = $(this);
var $form = $(this);
var $submitBtn = $form.find('button[type="submit"]');
var $submitBtn = $form.find('button[type="submit"]');
var typeAvance = $('#type_avance_edit').val();
var avance = parseFloat($('#avance_amount_edit').val()) || 0;
var avance = parseFloat($('#avance_amount_edit').val()) || 0;
var minAvance = brutEdit * 0.25 ;
var brut = parseFloat($('#gross_amount_edit').val()) || 0 ;
// Validation 25%
// Validation pour "terre"
if (typeAvance === 'terre') {
var minAvance = brutEdit * 0.25;
if (avance < minAvance ) {
if (avance < minAvance ) {
$("#messages").html(`
$("#messages").html(`
< div class = "alert alert-danger alert-dismissible" role = "alert" >
< div class = "alert alert-danger alert-dismissible" role = "alert" >
@ -721,27 +806,35 @@ function editFunc(id) {
`);
`);
return;
return;
}
}
}
// Désactiver le bouton pendant l'opération
// Validation pour "mère"
$submitBtn.prop('disabled', true).text('Modification...');
if (typeAvance === 'mere') {
if (!$('#product_name_text_edit').val() || brut === 0 || avance === 0) {
$("#messages").html(`
< div class = "alert alert-danger alert-dismissible" role = "alert" >
< button type = "button" class = "close" data-dismiss = "alert" aria-label = "Close" >
< span aria-hidden = "true" > × < / span >
< / button >
< strong > < span class = "glyphicon glyphicon-exclamation-sign" > < / span > < / strong >
Veuillez remplir tous les champs requis.
< / div >
`);
return;
}
}
// CORRECTION 4: Données du formulaire avec vérifications
$submitBtn.prop('disabled', true).text('Modification...');
var formData = $form.serialize();
console.log('Données envoyées:', formData);
$.ajax({
$.ajax({
url: base_url + 'avances/updateAvance/' + id,
url: base_url + 'avances/updateAvance/' + id,
type: 'POST',
type: 'POST',
data: formData,
data: $form.serialize() ,
dataType: 'json',
dataType: 'json',
success: function(res) {
success: function(res) {
console.log('Réponse serveur:', res);
if (res.success === true) {
if (res.success === true) {
// Fermer le modal
$('#updateModal').modal('hide');
$('#updateModal').modal('hide');
// Message de succès
$("#messages").html(`
$("#messages").html(`
< div class = "alert alert-success alert-dismissible" role = "alert" >
< div class = "alert alert-success alert-dismissible" role = "alert" >
< button type = "button" class = "close" data-dismiss = "alert" aria-label = "Close" >
< button type = "button" class = "close" data-dismiss = "alert" aria-label = "Close" >
@ -751,15 +844,12 @@ function editFunc(id) {
< / div >
< / div >
`);
`);
// Mise à jour de la DataTable
if (typeof manageTable !== 'undefined' & & manageTable) {
if (typeof manageTable !== 'undefined' & & manageTable) {
manageTable.ajax.reload(null, false);
manageTable.ajax.reload(null, false);
}
}
// Auto-masquer le message
setTimeout(function() {
setTimeout(function() {
location.reload();
location.reload();
$("#messages .alert").fadeOut();
}, 1000);
}, 1000);
} else {
} else {
@ -773,47 +863,13 @@ function editFunc(id) {
`);
`);
}
}
},
},
error: function(xhr, status, error) {
console.log('Erreur AJAX:', error);
console.log('Réponse complète:', xhr.responseText);
$("#messages").html(`
< div class = "alert alert-danger alert-dismissible" role = "alert" >
< button type = "button" class = "close" data-dismiss = "alert" aria-label = "Close" >
< span aria-hidden = "true" > × < / span >
< / button >
< strong > < span class = "glyphicon glyphicon-exclamation-sign" > < / span > < / strong > Erreur lors de la modification.
< / div >
`);
},
complete: function() {
complete: function() {
// Réactiver le bouton dans tous les cas
$submitBtn.prop('disabled', false).text('Modifier');
$submitBtn.prop('disabled', false).text('Modifier');
}
}
});
});
});
});
},
error: function(xhr, status, error) {
console.log('Erreur lors du chargement des données:', error);
console.log('Réponse:', xhr.responseText);
$("#messages").html(`
< div class = "alert alert-danger alert-dismissible" role = "alert" >
< button type = "button" class = "close" data-dismiss = "alert" aria-label = "Close" >
< span aria-hidden = "true" > × < / span >
< / button >
< strong > < span class = "glyphicon glyphicon-exclamation-sign" > < / span > < / strong > Erreur lors du chargement des données.
< / div >
`);
}
}
});
});
// Réinitialiser le modal à la fermeture
$('#updateModal').on('hidden.bs.modal', function() {
$('#update_avance_form')[0].reset();
$('#update_avance_form button[type="submit"]').prop('disabled', false).text('Modifier');
// Détacher les événements pour éviter les conflits
$('#update_avance_form').off('submit');
});
}
}
< / script >
< / script >