You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

571 lines
21 KiB

<?php
namespace App\Controllers;
use App\Models\AutresEncaissements;
use App\Models\Stores;
use App\Models\Users;
class AutresEncaissementsController extends AdminController
{
public function __construct()
{
parent::__construct();
}
private $pageTitle = 'Autres Encaissements';
/**
* Page principale - Liste des encaissements
*/
public function index()
{
$this->verifyRole('viewEncaissement');
$session = session();
$user = $session->get('user');
$data['page_title'] = $this->pageTitle;
$data['user_role'] = $user['group_name'];
$data['user_permission'] = $this->permission;
// Récupérer les magasins pour le filtre
$storeModel = new Stores();
$data['stores'] = $storeModel->getActiveStore();
return $this->render_template('autres_encaissements/index', $data);
}
/**
* Ajouter un encaissement
*/
public function create()
{
if ($this->request->getMethod() !== 'post') {
return $this->response->setJSON([
'success' => false,
'messages' => 'Méthode non autorisée'
]);
}
try {
$this->verifyRole('createEncaissement');
$session = session();
$user = $session->get('user');
// Validation des données
$validation = \Config\Services::validation();
$validation->setRules([
'type_encaissement' => 'required',
'montant' => 'required|decimal',
'mode_paiement' => 'required|in_list[Espèces,MVola,Virement Bancaire]',
'commentaire' => 'permit_empty|string'
]);
if (!$validation->withRequest($this->request)->run()) {
return $this->response->setJSON([
'success' => false,
'messages' => $validation->getErrors()
]);
}
$encaissementModel = new AutresEncaissements();
$Notification = new NotificationController();
$typeEncaissement = $this->request->getPost('type_encaissement');
$autreType = $this->request->getPost('autre_type');
// Si "Autre" est sélectionné, utiliser le champ texte
$finalType = ($typeEncaissement === 'Autre' && !empty($autreType))
? $autreType
: $typeEncaissement;
$data = [
'type_encaissement' => $finalType,
'autre_type' => $autreType,
'montant' => $this->request->getPost('montant'),
'mode_paiement' => $this->request->getPost('mode_paiement'),
'commentaire' => $this->request->getPost('commentaire'),
'user_id' => $user['id'],
'store_id' => $user['store_id']
];
if ($encaissementId = $encaissementModel->insert($data)) {
// ✅ Récupérer tous les stores pour les notifications
$db = \Config\Database::connect();
$storesQuery = $db->table('stores')->select('id')->get();
$allStores = $storesQuery->getResultArray();
$montantFormate = number_format((float)$this->request->getPost('montant'), 0, ',', ' ');
$notificationMessage = "Nouvel encaissement {$finalType} créé par {$user['firstname']} {$user['lastname']} - Montant: {$montantFormate} Ar";
// ✅ Envoyer notification à DAF, Direction et SuperAdmin de TOUS les stores
foreach ($allStores as $store) {
$storeId = (int)$store['id'];
// Notification pour DAF
$Notification->createNotification(
$notificationMessage,
"DAF",
$storeId,
'encaissements'
);
// Notification pour Direction
$Notification->createNotification(
$notificationMessage,
"Direction",
$storeId,
'encaissements'
);
// Notification pour SuperAdmin
$Notification->createNotification(
$notificationMessage,
"SuperAdmin",
$storeId,
'encaissements'
);
}
log_message('info', "✅ Encaissement {$encaissementId} créé - Notifications envoyées à DAF/Direction/SuperAdmin de tous les stores");
return $this->response->setJSON([
'success' => true,
'messages' => 'Encaissement enregistré avec succès'
]);
}
return $this->response->setJSON([
'success' => false,
'messages' => 'Erreur lors de l\'enregistrement'
]);
} catch (\Exception $e) {
log_message('error', "Erreur création encaissement: " . $e->getMessage());
return $this->response->setJSON([
'success' => false,
'messages' => 'Une erreur interne est survenue: ' . $e->getMessage()
]);
}
}
/**
* Modifier un encaissement
*/
public function update($id)
{
try {
$this->verifyRole('updateEncaissement');
$session = session();
$user = $session->get('user');
$encaissementModel = new AutresEncaissements();
$Notification = new NotificationController();
// Récupérer l'ancien encaissement pour comparaison
$oldEncaissement = $encaissementModel->find($id);
if (!$oldEncaissement) {
return $this->response->setJSON([
'success' => false,
'messages' => 'Encaissement non trouvé'
]);
}
$typeEncaissement = $this->request->getPost('type_encaissement');
$autreType = $this->request->getPost('autre_type');
$finalType = ($typeEncaissement === 'Autre' && !empty($autreType))
? $autreType
: $typeEncaissement;
$data = [
'type_encaissement' => $finalType,
'autre_type' => $autreType,
'montant' => $this->request->getPost('montant'),
'mode_paiement' => $this->request->getPost('mode_paiement'),
'commentaire' => $this->request->getPost('commentaire')
];
if ($encaissementModel->update($id, $data)) {
// ✅ Envoyer notification de modification à tous les stores
$db = \Config\Database::connect();
$storesQuery = $db->table('stores')->select('id')->get();
$allStores = $storesQuery->getResultArray();
$montantFormate = number_format((float)$this->request->getPost('montant'), 0, ',', ' ');
$ancienMontant = number_format((float)$oldEncaissement['montant'], 0, ',', ' ');
$notificationMessage = "Encaissement {$finalType} modifié par {$user['firstname']} {$user['lastname']} - Ancien montant: {$ancienMontant} Ar → Nouveau: {$montantFormate} Ar";
foreach ($allStores as $store) {
$storeId = (int)$store['id'];
$Notification->createNotification(
$notificationMessage,
"DAF",
$storeId,
'encaissements'
);
$Notification->createNotification(
$notificationMessage,
"Direction",
$storeId,
'encaissements'
);
$Notification->createNotification(
$notificationMessage,
"SuperAdmin",
$storeId,
'encaissements'
);
}
log_message('info', "✅ Encaissement {$id} modifié - Notifications envoyées");
return $this->response->setJSON([
'success' => true,
'messages' => 'Encaissement modifié avec succès'
]);
}
return $this->response->setJSON([
'success' => false,
'messages' => 'Erreur lors de la modification'
]);
} catch (\Exception $e) {
log_message('error', 'Erreur dans update(): ' . $e->getMessage());
return $this->response->setJSON([
'success' => false,
'messages' => 'Erreur serveur: ' . $e->getMessage()
]);
}
}
/**
* Supprimer un encaissement
*/
public function delete($id)
{
try {
$this->verifyRole('deleteEncaissement');
$session = session();
$user = $session->get('user');
$encaissementModel = new AutresEncaissements();
$Notification = new NotificationController();
// Récupérer l'encaissement avant suppression pour la notification
$encaissement = $encaissementModel->find($id);
if (!$encaissement) {
return $this->response->setJSON([
'success' => false,
'messages' => 'Encaissement non trouvé'
]);
}
if ($encaissementModel->delete($id)) {
// ✅ Envoyer notification de suppression à tous les stores
$db = \Config\Database::connect();
$storesQuery = $db->table('stores')->select('id')->get();
$allStores = $storesQuery->getResultArray();
$montantFormate = number_format((float)$encaissement['montant'], 0, ',', ' ');
$type = $encaissement['type_encaissement'];
$notificationMessage = "⚠️ Encaissement {$type} supprimé par {$user['firstname']} {$user['lastname']} - Montant: {$montantFormate} Ar";
foreach ($allStores as $store) {
$storeId = (int)$store['id'];
$Notification->createNotification(
$notificationMessage,
"DAF",
$storeId,
'encaissements'
);
$Notification->createNotification(
$notificationMessage,
"Direction",
$storeId,
'encaissements'
);
$Notification->createNotification(
$notificationMessage,
"SuperAdmin",
$storeId,
'encaissements'
);
}
log_message('info', "✅ Encaissement {$id} supprimé - Notifications envoyées");
return $this->response->setJSON([
'success' => true,
'messages' => 'Encaissement supprimé avec succès'
]);
}
return $this->response->setJSON([
'success' => false,
'messages' => 'Erreur lors de la suppression'
]);
} catch (\Exception $e) {
log_message('error', 'Erreur dans delete(): ' . $e->getMessage());
return $this->response->setJSON([
'success' => false,
'messages' => 'Erreur serveur: ' . $e->getMessage()
]);
}
}
/**
* Récupérer les données pour DataTables
*/
public function fetchEncaissements()
{
try {
$this->verifyRole('viewEncaissement');
$session = session();
$user = $session->get('user');
$encaissementModel = new AutresEncaissements();
// Récupérer les filtres
$startDate = $this->request->getGet('startDate');
$endDate = $this->request->getGet('endDate');
$storeId = $this->request->getGet('store_id');
// Si l'utilisateur n'est pas admin, limiter à son magasin
if (!in_array($user['group_name'], ['SuperAdmin', 'DAF', 'Direction'])) {
$storeId = $user['store_id'];
}
$encaissements = $encaissementModel->getEncaissementsWithDetails($storeId);
// Filtrer par dates
if ($startDate || $endDate) {
$encaissements = array_filter($encaissements, function($item) use ($startDate, $endDate) {
$itemDate = date('Y-m-d', strtotime($item['created_at']));
if ($startDate && $itemDate < $startDate) {
return false;
}
if ($endDate && $itemDate > $endDate) {
return false;
}
return true;
});
}
$result = [];
foreach ($encaissements as $item) {
// Construire les boutons avec permissions
$buttons = '';
if (in_array('viewEncaissement', $this->permission)) {
$buttons .= '<button class="btn btn-info btn-sm" onclick="viewDetails(' . $item['id'] . ')">
<i class="fa fa-eye"></i> Détails
</button> ';
}
if (in_array('updateEncaissement', $this->permission)) {
$buttons .= '<button class="btn btn-warning btn-sm" onclick="editEncaissement(' . $item['id'] . ')">
<i class="fa fa-edit"></i>
</button> ';
}
if (in_array('deleteEncaissement', $this->permission)) {
$buttons .= '<button class="btn btn-danger btn-sm" onclick="deleteEncaissement(' . $item['id'] . ')">
<i class="fa fa-trash"></i>
</button>';
}
// ✅ Badge coloré pour le mode de paiement
$badgeClass = match($item['mode_paiement']) {
'Espèces' => 'success',
'MVola' => 'warning',
'Virement Bancaire' => 'info',
default => 'default'
};
$modePaiementBadge = '<span class="label label-' . $badgeClass . '">' . $item['mode_paiement'] . '</span>';
$result[] = [
$item['id'],
$item['type_encaissement'],
number_format($item['montant'], 0, '.', ' ') . ' Ar',
$modePaiementBadge, // ✅ NOUVELLE COLONNE
$item['commentaire'] ?: 'Aucun',
$item['user_name'] ?: 'N/A',
$item['store_name'] ?: 'N/A',
date('d/m/Y H:i', strtotime($item['created_at'])),
$buttons
];
}
return $this->response->setJSON(['data' => $result]);
} catch (\Exception $e) {
log_message('error', 'Erreur dans fetchEncaissements(): ' . $e->getMessage());
return $this->response->setJSON(['data' => []]);
}
}
/**
* Récupérer les détails d'un encaissement
*/
public function getDetails($id)
{
try {
$this->verifyRole('viewEncaissement');
$encaissementModel = new AutresEncaissements();
$encaissement = $encaissementModel->getEncaissementById($id);
if ($encaissement) {
return $this->response->setJSON([
'success' => true,
'data' => $encaissement
]);
}
return $this->response->setJSON([
'success' => false,
'message' => 'Encaissement non trouvé'
]);
} catch (\Exception $e) {
log_message('error', 'Erreur dans getDetails(): ' . $e->getMessage());
return $this->response->setJSON([
'success' => false,
'message' => 'Erreur serveur'
]);
}
}
/**
* Récupérer un encaissement pour édition
*/
public function getEncaissement($id)
{
try {
$this->verifyRole('updateEncaissement');
$encaissementModel = new AutresEncaissements();
$encaissement = $encaissementModel->find($id);
if ($encaissement) {
return $this->response->setJSON([
'success' => true,
'data' => $encaissement
]);
}
return $this->response->setJSON([
'success' => false,
'message' => 'Encaissement non trouvé'
]);
} catch (\Exception $e) {
log_message('error', 'Erreur dans getEncaissement(): ' . $e->getMessage());
return $this->response->setJSON([
'success' => false,
'message' => 'Erreur serveur'
]);
}
}
/**
* Récupérer les statistiques
*/
public function getStatistics()
{
try {
$this->verifyRole('viewEncaissement');
$session = session();
$user = $session->get('user');
$encaissementModel = new AutresEncaissements();
$startDate = $this->request->getGet('startDate');
$endDate = $this->request->getGet('endDate');
$storeId = $this->request->getGet('store_id');
// ✅ LOG pour débogage
log_message('info', "📊 getStatistics appelé - Dates: {$startDate} à {$endDate}, Store: {$storeId}");
// Si l'utilisateur n'est pas admin, limiter à son magasin
if (!in_array($user['group_name'], ['SuperAdmin', 'DAF', 'Direction'])) {
$storeId = $user['store_id'];
}
// ✅ IMPORTANT : Convertir $storeId en NULL si vide
$storeIdFilter = (!empty($storeId) && $storeId !== '') ? (int)$storeId : null;
// Récupérer les totaux
$totalMontant = $encaissementModel->getTotalEncaissements($storeIdFilter, $startDate, $endDate);
$totalCount = $encaissementModel->getTotalCount($storeIdFilter, $startDate, $endDate);
$todayCount = $encaissementModel->getTodayCount($storeIdFilter);
// Récupérer les totaux par mode de paiement
$totauxParMode = $encaissementModel->getTotalEncaissementsByMode($storeIdFilter, $startDate, $endDate);
// Statistiques par type
$statsByType = $encaissementModel->getStatsByType($storeIdFilter, $startDate, $endDate);
// ✅ LOG pour vérifier les valeurs
log_message('info', "✅ Résultats - Total: {$totalMontant}, Count: {$totalCount}, Today: {$todayCount}");
return $this->response->setJSON([
'success' => true,
'total_montant' => number_format($totalMontant, 0, ',', ' ') . ' Ar',
'total_count' => $totalCount,
'today_count' => $todayCount,
'total_espece' => number_format($totauxParMode['total_espece'], 0, ',', ' ') . ' Ar',
'total_mvola' => number_format($totauxParMode['total_mvola'], 0, ',', ' ') . ' Ar',
'total_virement' => number_format($totauxParMode['total_virement'], 0, ',', ' ') . ' Ar',
'stats_by_type' => $statsByType,
// ✅ Ajouter ces infos pour débogage
'debug' => [
'store_id' => $storeIdFilter,
'start_date' => $startDate,
'end_date' => $endDate
]
]);
} catch (\Exception $e) {
log_message('error', '❌ Erreur dans getStatistics(): ' . $e->getMessage());
return $this->response->setJSON([
'success' => false,
'total_montant' => '0 Ar',
'total_count' => 0,
'today_count' => 0,
'total_espece' => '0 Ar',
'total_mvola' => '0 Ar',
'total_virement' => '0 Ar',
'stats_by_type' => [],
'error' => $e->getMessage()
]);
}
}
}