|
|
|
@ -119,6 +119,15 @@ |
|
|
|
<option value="mere">Avance sur mère</option> |
|
|
|
</select> |
|
|
|
</div> |
|
|
|
<div class="form-group col-md-6"> |
|
|
|
<label for="type_avance" class="form-label">Moyen de payment</label> |
|
|
|
<select class="form-control" id="type_payment" name="type_payment"> |
|
|
|
<option value="" disabled selected>Sélectionnez un moyen de payement</option> |
|
|
|
<option value="MVOLA">MVOLA</option> |
|
|
|
<option value="Virement Bancaire">Virement Bancaire</option> |
|
|
|
<option value="En espèce">En espèce</option> |
|
|
|
</select> |
|
|
|
</div> |
|
|
|
<!-- Nom client --> |
|
|
|
<div class="form-group col-md-6"> |
|
|
|
<label>Nom du client</label> |
|
|
|
@ -152,7 +161,7 @@ |
|
|
|
<option value="">Sélectionnez un produit</option> |
|
|
|
<?php foreach($products as $p): ?> |
|
|
|
<option value="<?= $p['id'] ?>" <?= $p['product_sold'] ? 'disabled' : '' ?>> |
|
|
|
<?= esc($p['name']) ?> <?= $p['product_sold'] ? '(Rupture)' : '' ?> |
|
|
|
<?= esc($p['name']) ?>|<?= esc($p['sku']) ?> <?= $p['product_sold'] ? '(Rupture)' : '' ?> |
|
|
|
</option> |
|
|
|
<?php endforeach; ?> |
|
|
|
</select> |
|
|
|
@ -187,7 +196,7 @@ |
|
|
|
</div> |
|
|
|
<?php endif; ?> |
|
|
|
|
|
|
|
<!-- Modal Modification --> |
|
|
|
<!-- Modal Modification CORRIGÉ --> |
|
|
|
<?php if (in_array('updateAvance', $user_permission)): ?> |
|
|
|
<div class="modal fade" id="updateModal" tabindex="-1" role="dialog"> |
|
|
|
<div class="modal-dialog"> |
|
|
|
@ -210,6 +219,17 @@ |
|
|
|
</select> |
|
|
|
</div> |
|
|
|
|
|
|
|
<!-- CORRECTION: ID cohérent pour le type de paiement --> |
|
|
|
<div class="form-group col-md-6"> |
|
|
|
<label for="type_payment_edit" class="form-label">Moyen de paiement</label> |
|
|
|
<select class="form-control" id="type_payment_edit" name="type_payment_edit"> |
|
|
|
<option value="" disabled>Sélectionnez un moyen de paiement</option> |
|
|
|
<option value="MVOLA">MVOLA</option> |
|
|
|
<option value="Virement Bancaire">Virement Bancaire</option> |
|
|
|
<option value="En espèce">En espèce</option> |
|
|
|
</select> |
|
|
|
</div> |
|
|
|
|
|
|
|
<!-- Nom client --> |
|
|
|
<div class="form-group col-md-6"> |
|
|
|
<label>Nom du client</label> |
|
|
|
@ -241,12 +261,14 @@ |
|
|
|
<option value="">Sélectionnez un produit</option> |
|
|
|
<?php foreach($products as $p): ?> |
|
|
|
<option value="<?= $p['id'] ?>" <?= $p['product_sold'] ? 'disabled' : '' ?>> |
|
|
|
<?= esc($p['name']) ?> <?= $p['product_sold'] ? '(Rupture)' : '' ?> |
|
|
|
<?= esc($p['sku']) ?> | <?= esc($p['name']) ?> | <?= esc($p['numero_de_moteur']) ?> | <?= esc($p['puissance']) ?> |
|
|
|
<?= $p['product_sold'] ? ' (Rupture)' : '' ?> |
|
|
|
</option> |
|
|
|
<?php endforeach; ?> |
|
|
|
</select> |
|
|
|
</div> |
|
|
|
|
|
|
|
|
|
|
|
<!-- Prix du produit --> |
|
|
|
<div class="form-group col-md-6"> |
|
|
|
<label>Prix du produit</label> |
|
|
|
@ -277,7 +299,6 @@ |
|
|
|
</div> |
|
|
|
<?php endif;?> |
|
|
|
|
|
|
|
|
|
|
|
<?php if (in_array('deleteAvance', $user_permission)): ?> |
|
|
|
<!-- remove brand modal --> |
|
|
|
<div class="modal fade" tabindex="-1" role="dialog" id="removeModal"> |
|
|
|
@ -440,7 +461,9 @@ $(document).ready(function() { |
|
|
|
$form[0].reset(); // Reset le formulaire |
|
|
|
|
|
|
|
// 🔄 MISE À JOUR DYNAMIQUE après ajout |
|
|
|
refreshDataTable(); |
|
|
|
setTimeout(function() { |
|
|
|
location.reload(); |
|
|
|
}, 500); // petit délai pour voir le message |
|
|
|
|
|
|
|
// Auto-masquer le message après 3 secondes |
|
|
|
setTimeout(function() { |
|
|
|
@ -503,6 +526,7 @@ $(document).ready(function() { |
|
|
|
// Auto-masquer le message après 3 secondes |
|
|
|
setTimeout(function() { |
|
|
|
$("#messages .alert").fadeOut(); |
|
|
|
location.reload(); |
|
|
|
}, 3000); |
|
|
|
|
|
|
|
} else { |
|
|
|
@ -556,10 +580,10 @@ function getProductDataCreate() { |
|
|
|
} |
|
|
|
$.post(base_url + 'orders/getProductValueById', { product_id: id }, function(r) { |
|
|
|
brutCreate = parseFloat(r.prix_vente) || 0; |
|
|
|
$('#gross_amount').val(brutCreate.toFixed(2)); |
|
|
|
$('#gross_amount').val(brutCreate.toFixed(0)); |
|
|
|
var avance25 = brutCreate * 0.25; |
|
|
|
$('#avance_amount').val(avance25.toFixed(2)); |
|
|
|
$('#amount_due').val((brutCreate - avance25).toFixed(2)); |
|
|
|
$('#avance_amount').val(avance25.toFixed(0)); |
|
|
|
$('#amount_due').val((brutCreate - avance25).toFixed(0)); |
|
|
|
updateDueCreate(); |
|
|
|
}, 'json'); |
|
|
|
} |
|
|
|
@ -589,10 +613,10 @@ function getProductDataUpdate() { |
|
|
|
console.log('Données produit reçues:', r); // Pour déboguer |
|
|
|
|
|
|
|
brutEdit = parseFloat(r.prix_vente) || 0; |
|
|
|
$('#gross_amount_edit').val(brutEdit.toFixed(2)); |
|
|
|
$('#gross_amount_edit').val(brutEdit.toFixed(0)); |
|
|
|
var avance25 = brutEdit * 0.25; |
|
|
|
$('#avance_amount_edit').val(avance25.toFixed(2)); |
|
|
|
$('#amount_due_edit').val((brutEdit - avance25).toFixed(2)); |
|
|
|
$('#avance_amount_edit').val(avance25.toFixed(0)); |
|
|
|
$('#amount_due_edit').val((brutEdit - avance25).toFixed(0)); |
|
|
|
updateDueEdit(); |
|
|
|
}, |
|
|
|
error: function(xhr, status, error) { |
|
|
|
@ -607,163 +631,188 @@ function updateDueEdit() { |
|
|
|
} |
|
|
|
|
|
|
|
// ✅ MODIFICATION avec mise à jour dynamique - CORRIGÉ |
|
|
|
// ✅ MODIFICATION avec mise à jour dynamique - VERSION CORRIGÉE |
|
|
|
function editFunc(id) { |
|
|
|
console.log('editFunc appelée avec ID:', id); |
|
|
|
|
|
|
|
// Réinitialiser d'abord le formulaire |
|
|
|
$('#update_avance_form')[0].reset(); |
|
|
|
|
|
|
|
$.getJSON(base_url + 'avances/fetchSingleAvance/' + id, function(r) { |
|
|
|
console.log('Données récupérées:', r); // Pour déboguer |
|
|
|
$.ajax({ |
|
|
|
url: base_url + 'avances/fetchSingleAvance/' + id, |
|
|
|
type: 'GET', |
|
|
|
dataType: 'json', |
|
|
|
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); // Le champ caché pour l'ID |
|
|
|
$('#customer_name_avance_edit').val(r.customer_name || ''); |
|
|
|
$('#customer_phone_avance_edit').val(r.customer_phone || ''); |
|
|
|
$('#customer_address_avance_edit').val(r.customer_address || r.customer_adress || ''); |
|
|
|
$('#customer_cin_avance_edit').val(r.customer_cin || ''); |
|
|
|
$('#type_avance_edit').val(r.type_avance || ''); |
|
|
|
$('#gross_amount_edit').val(r.gross_amount || ''); |
|
|
|
$('#avance_amount_edit').val(r.avance_amount || ''); |
|
|
|
$('#amount_due_edit').val(r.amount_due || ''); |
|
|
|
// Pré-remplir le formulaire de modification avec les BONS IDs |
|
|
|
$('#avance_id_edit').val(r.id || id); |
|
|
|
$('#customer_name_avance_edit').val(r.customer_name || ''); |
|
|
|
$('#customer_phone_avance_edit').val(r.customer_phone || ''); |
|
|
|
$('#customer_address_avance_edit').val(r.customer_address || r.customer_adress || ''); |
|
|
|
$('#customer_cin_avance_edit').val(r.customer_cin || ''); |
|
|
|
$('#type_avance_edit').val(r.type_avance || ''); |
|
|
|
$('#gross_amount_edit').val(r.gross_amount || ''); |
|
|
|
$('#avance_amount_edit').val(r.avance_amount || ''); |
|
|
|
$('#amount_due_edit').val(r.amount_due || ''); |
|
|
|
|
|
|
|
// 🔥 CORRECTION PRINCIPALE - Sélection 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); |
|
|
|
console.log('Options disponibles:', $('#id_product_edit option').length); |
|
|
|
// CORRECTION 1: ID correct pour le type de paiement |
|
|
|
$('#type_payment_edit').val(r.type_payment || ''); |
|
|
|
|
|
|
|
brutEdit = parseFloat(r.gross_amount || 0); // Utiliser gross_amount directement |
|
|
|
// 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); |
|
|
|
|
|
|
|
// Réinitialiser le bouton |
|
|
|
$('#update_avance_form button[type="submit"]').prop('disabled', false).text('Modifier'); |
|
|
|
brutEdit = parseFloat(r.gross_amount || 0); |
|
|
|
|
|
|
|
// Ouvrir le modal |
|
|
|
$('#updateModal').modal('show'); |
|
|
|
// Réinitialiser le bouton |
|
|
|
$('#update_avance_form button[type="submit"]').prop('disabled', false).text('Modifier'); |
|
|
|
|
|
|
|
// 🔥 SÉLECTION DU PRODUIT après ouverture complète du modal |
|
|
|
$('#updateModal').on('shown.bs.modal', function() { |
|
|
|
if (productId) { |
|
|
|
console.log('Tentative de sélection du produit ID:', productId); |
|
|
|
// Ouvrir le modal |
|
|
|
$('#updateModal').modal('show'); |
|
|
|
|
|
|
|
// Méthode 1: Sélection standard |
|
|
|
$('#id_product_edit').val(productId); |
|
|
|
console.log('Après sélection standard:', $('#id_product_edit').val()); |
|
|
|
// CORRECTION 2: Sélection du produit après ouverture complète du modal |
|
|
|
$('#updateModal').on('shown.bs.modal', function(e) { |
|
|
|
if (productId) { |
|
|
|
console.log('Tentative de sélection du produit ID:', productId); |
|
|
|
|
|
|
|
// Méthode 2: Si la sélection standard ne marche pas |
|
|
|
if ($('#id_product_edit').val() != productId) { |
|
|
|
$('#id_product_edit option').each(function() { |
|
|
|
if ($(this).val() == productId) { |
|
|
|
$(this).prop('selected', true); |
|
|
|
console.log('Produit sélectionné via boucle:', $(this).val(), $(this).text()); |
|
|
|
// Méthode robuste de sélection |
|
|
|
setTimeout(function() { |
|
|
|
// Vérifier d'abord si l'option existe |
|
|
|
var optionExists = $('#id_product_edit option[value="' + productId + '"]').length > 0; |
|
|
|
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éclencher l'événement change pour mettre à jour le prix |
|
|
|
$('#id_product_edit').trigger('change'); |
|
|
|
console.log('Valeur finale du select:', $('#id_product_edit').val()); |
|
|
|
} |
|
|
|
|
|
|
|
// Détacher l'événement pour éviter les appels multiples |
|
|
|
$('#updateModal').off('shown.bs.modal'); |
|
|
|
}); |
|
|
|
|
|
|
|
// 🔥 Détacher tous les anciens événements et attacher le nouveau |
|
|
|
$('#update_avance_form').off('submit').on('submit', function(e) { |
|
|
|
e.preventDefault(); |
|
|
|
|
|
|
|
var $form = $(this); |
|
|
|
var $submitBtn = $form.find('button[type="submit"]'); |
|
|
|
var avance = parseFloat($('#avance_amount_edit').val()) || 0; |
|
|
|
var minAvance = brutEdit * 0.25; |
|
|
|
|
|
|
|
// Validation 25% |
|
|
|
if (avance < minAvance) { |
|
|
|
$("#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> |
|
|
|
L'avance doit être au minimum de 25% du prix du produit (${minAvance.toFixed(2)} Ar). |
|
|
|
</div> |
|
|
|
`); |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
// Désactiver le bouton pendant l'opération |
|
|
|
$submitBtn.prop('disabled', true).text('Modification...'); |
|
|
|
// Détacher l'événement pour éviter les appels multiples |
|
|
|
$(this).off('shown.bs.modal'); |
|
|
|
}); |
|
|
|
|
|
|
|
$.ajax({ |
|
|
|
url: base_url + 'avances/updateAvance/' + id, |
|
|
|
type: 'POST', |
|
|
|
data: $form.serialize(), |
|
|
|
dataType: 'json', |
|
|
|
success: function(res) { |
|
|
|
if (res.success === true) { |
|
|
|
// Fermer le modal |
|
|
|
$('#updateModal').modal('hide'); |
|
|
|
// CORRECTION 3: Gestion du formulaire de soumission améliorée |
|
|
|
$('#update_avance_form').off('submit').on('submit', function(e) { |
|
|
|
e.preventDefault(); |
|
|
|
|
|
|
|
// Message de succès |
|
|
|
$("#messages").html(` |
|
|
|
<div class="alert alert-success 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-ok-sign"></span></strong> ${res.messages} |
|
|
|
</div> |
|
|
|
`); |
|
|
|
var $form = $(this); |
|
|
|
var $submitBtn = $form.find('button[type="submit"]'); |
|
|
|
var avance = parseFloat($('#avance_amount_edit').val()) || 0; |
|
|
|
var minAvance = brutEdit * 0.25; |
|
|
|
|
|
|
|
// 🔄 MISE À JOUR IMMÉDIATE de la DataTable |
|
|
|
refreshDataTable(); |
|
|
|
// Validation 25% |
|
|
|
if (avance < minAvance) { |
|
|
|
$("#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> |
|
|
|
L'avance doit être au minimum de 25% du prix du produit (${minAvance.toFixed(2)} Ar). |
|
|
|
</div> |
|
|
|
`); |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
// Auto-masquer le message |
|
|
|
setTimeout(function() { |
|
|
|
$("#messages .alert").fadeOut(); |
|
|
|
}, 3000); |
|
|
|
// Désactiver le bouton pendant l'opération |
|
|
|
$submitBtn.prop('disabled', true).text('Modification...'); |
|
|
|
|
|
|
|
// CORRECTION 4: Données du formulaire avec vérifications |
|
|
|
var formData = $form.serialize(); |
|
|
|
console.log('Données envoyées:', formData); |
|
|
|
|
|
|
|
$.ajax({ |
|
|
|
url: base_url + 'avances/updateAvance/' + id, |
|
|
|
type: 'POST', |
|
|
|
data: formData, |
|
|
|
dataType: 'json', |
|
|
|
success: function(res) { |
|
|
|
console.log('Réponse serveur:', res); |
|
|
|
|
|
|
|
if (res.success === true) { |
|
|
|
// Fermer le modal |
|
|
|
$('#updateModal').modal('hide'); |
|
|
|
|
|
|
|
// Message de succès |
|
|
|
$("#messages").html(` |
|
|
|
<div class="alert alert-success 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-ok-sign"></span></strong> ${res.messages} |
|
|
|
</div> |
|
|
|
`); |
|
|
|
|
|
|
|
// Mise à jour de la DataTable |
|
|
|
if (typeof manageTable !== 'undefined' && manageTable) { |
|
|
|
manageTable.ajax.reload(null, false); |
|
|
|
} |
|
|
|
|
|
|
|
// Auto-masquer le message |
|
|
|
setTimeout(function() { |
|
|
|
location.reload(); |
|
|
|
$("#messages .alert").fadeOut(); |
|
|
|
}, 1000); |
|
|
|
|
|
|
|
} else { |
|
|
|
$("#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> ${res.messages} |
|
|
|
</div> |
|
|
|
`); |
|
|
|
} |
|
|
|
}, |
|
|
|
error: function(xhr, status, error) { |
|
|
|
console.log('Erreur AJAX:', error); |
|
|
|
console.log('Réponse complète:', xhr.responseText); |
|
|
|
|
|
|
|
} else { |
|
|
|
$("#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> ${res.messages} |
|
|
|
<strong><span class="glyphicon glyphicon-exclamation-sign"></span></strong> Erreur lors de la modification. |
|
|
|
</div> |
|
|
|
`); |
|
|
|
}, |
|
|
|
complete: function() { |
|
|
|
// Réactiver le bouton dans tous les cas |
|
|
|
$submitBtn.prop('disabled', false).text('Modifier'); |
|
|
|
} |
|
|
|
}, |
|
|
|
error: function(xhr, status, error) { |
|
|
|
console.log('Erreur lors de la modification:', error); |
|
|
|
$("#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() { |
|
|
|
// Réactiver le bouton dans tous les cas |
|
|
|
$submitBtn.prop('disabled', false).text('Modifier'); |
|
|
|
} |
|
|
|
}); |
|
|
|
}); |
|
|
|
}); |
|
|
|
}).fail(function() { |
|
|
|
console.log('Erreur lors du chargement des données'); |
|
|
|
$("#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> |
|
|
|
`); |
|
|
|
}, |
|
|
|
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> |