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.
 
 
 
 
 
 

302 lines
9.3 KiB

<?php
namespace App\Models;
use CodeIgniter\Model;
class AutresEncaissements extends Model
{
protected $table = 'autres_encaissements';
protected $primaryKey = 'id';
protected $allowedFields = [
'type_encaissement',
'autre_type',
'montant',
'mode_paiement',
'commentaire',
'user_id',
'store_id',
'created_at',
'updated_at'
];
protected $useTimestamps = true;
protected $createdField = 'created_at';
protected $updatedField = 'updated_at';
/**
* Récupérer tous les encaissements avec les infos utilisateur et magasin
*
* @param int|null $storeId ID du magasin (optionnel)
* @return array
*/
public function getEncaissementsWithDetails($storeId = null)
{
$builder = $this->db->table($this->table);
$builder->select('
autres_encaissements.*,
CONCAT(users.firstname, " ", users.lastname) as user_name,
users.email as user_email,
stores.name as store_name
');
$builder->join('users', 'users.id = autres_encaissements.user_id', 'left');
$builder->join('stores', 'stores.id = autres_encaissements.store_id', 'left');
if ($storeId) {
$builder->where('autres_encaissements.store_id', $storeId);
}
$builder->orderBy('autres_encaissements.created_at', 'DESC');
return $builder->get()->getResultArray();
}
/**
* Récupérer un encaissement par ID avec détails
*
* @param int $id ID de l'encaissement
* @return array|null
*/
public function getTotalEncaissementsByMode($storeId = null, $startDate = null, $endDate = null)
{
$builder = $this->db->table($this->table);
$builder->select('
SUM(CASE WHEN mode_paiement = "Espèces" THEN montant ELSE 0 END) as total_espece,
SUM(CASE WHEN mode_paiement = "MVola" THEN montant ELSE 0 END) as total_mvola,
SUM(CASE WHEN mode_paiement = "Virement Bancaire" THEN montant ELSE 0 END) as total_virement
');
if ($storeId) {
$builder->where('store_id', $storeId);
}
if ($startDate) {
$builder->where('DATE(created_at) >=', $startDate);
}
if ($endDate) {
$builder->where('DATE(created_at) <=', $endDate);
}
$result = $builder->get()->getRow();
return [
'total_espece' => $result ? (float)$result->total_espece : 0,
'total_mvola' => $result ? (float)$result->total_mvola : 0,
'total_virement' => $result ? (float)$result->total_virement : 0,
];
}
public function getEncaissementById($id)
{
$builder = $this->db->table($this->table);
$builder->select('
autres_encaissements.*,
CONCAT(users.firstname, " ", users.lastname) as user_name,
users.email as user_email,
stores.name as store_name
');
$builder->join('users', 'users.id = autres_encaissements.user_id', 'left');
$builder->join('stores', 'stores.id = autres_encaissements.store_id', 'left');
$builder->where('autres_encaissements.id', $id);
return $builder->get()->getRowArray();
}
/**
* Statistiques par type d'encaissement
*
* @param int|null $storeId ID du magasin
* @param string|null $startDate Date de début (Y-m-d)
* @param string|null $endDate Date de fin (Y-m-d)
* @return array
*/
public function getStatsByType($storeId = null, $startDate = null, $endDate = null)
{
$builder = $this->db->table($this->table);
// ✅ SÉLECTION DES CHAMPS (sans commentaire dans le SELECT)
$builder->select('
type_encaissement,
mode_paiement,
COUNT(*) as total_count,
SUM(montant) as total_montant
');
if ($storeId) {
$builder->where('store_id', $storeId);
}
if ($startDate) {
$builder->where('DATE(created_at) >=', $startDate);
}
if ($endDate) {
$builder->where('DATE(created_at) <=', $endDate);
}
// ✅ GROUPER PAR type_encaissement ET mode_paiement
$builder->groupBy('type_encaissement, mode_paiement');
return $builder->get()->getResultArray();
}
/**
* Total des encaissements
*
* @param int|null $storeId ID du magasin
* @param string|null $startDate Date de début (Y-m-d)
* @param string|null $endDate Date de fin (Y-m-d)
* @return float
*/
public function getTotalEncaissements($storeId = null, $startDate = null, $endDate = null)
{
$builder = $this->db->table($this->table);
$builder->selectSum('montant', 'total');
if ($storeId) {
$builder->where('store_id', $storeId);
}
if ($startDate) {
$builder->where('DATE(created_at) >=', $startDate);
}
if ($endDate) {
$builder->where('DATE(created_at) <=', $endDate);
}
$result = $builder->get()->getRow();
return $result ? (float)$result->total : 0;
}
/**
* Nombre d'encaissements aujourd'hui
*
* @param int|null $storeId ID du magasin
* @return int
*/
public function getTodayCount($storeId = null)
{
$builder = $this->db->table($this->table);
$builder->where('DATE(created_at)', date('Y-m-d'));
if ($storeId) {
$builder->where('store_id', $storeId);
}
return $builder->countAllResults();
}
/**
* Nombre total d'encaissements
*
* @param int|null $storeId ID du magasin
* @param string|null $startDate Date de début (Y-m-d)
* @param string|null $endDate Date de fin (Y-m-d)
* @return int
*/
public function getTotalCount($storeId = null, $startDate = null, $endDate = null)
{
$builder = $this->db->table($this->table);
if ($storeId) {
$builder->where('store_id', $storeId);
}
if ($startDate) {
$builder->where('DATE(created_at) >=', $startDate);
}
if ($endDate) {
$builder->where('DATE(created_at) <=', $endDate);
}
return $builder->countAllResults();
}
/**
* Encaissements récents (7 derniers jours)
*
* @param int|null $storeId ID du magasin
* @param int $limit Nombre de résultats
* @return array
*/
public function getRecentEncaissements($storeId = null, $limit = 10)
{
$builder = $this->db->table($this->table);
$builder->select('
autres_encaissements.*,
CONCAT(users.firstname, " ", users.lastname) as user_name,
stores.name as store_name
');
$builder->join('users', 'users.id = autres_encaissements.user_id', 'left');
$builder->join('stores', 'stores.id = autres_encaissements.store_id', 'left');
if ($storeId) {
$builder->where('autres_encaissements.store_id', $storeId);
}
$builder->where('DATE(autres_encaissements.created_at) >=', date('Y-m-d', strtotime('-7 days')));
$builder->orderBy('autres_encaissements.created_at', 'DESC');
$builder->limit($limit);
return $builder->get()->getResultArray();
}
/**
* Encaissements par utilisateur
*
* @param int $userId ID de l'utilisateur
* @param string|null $startDate Date de début
* @param string|null $endDate Date de fin
* @return array
*/
public function getEncaissementsByUser($userId, $startDate = null, $endDate = null)
{
$builder = $this->db->table($this->table);
$builder->where('user_id', $userId);
if ($startDate) {
$builder->where('DATE(created_at) >=', $startDate);
}
if ($endDate) {
$builder->where('DATE(created_at) <=', $endDate);
}
$builder->orderBy('created_at', 'DESC');
return $builder->get()->getResultArray();
}
/**
* Recherche d'encaissements
*
* @param string $keyword Mot-clé de recherche
* @param int|null $storeId ID du magasin
* @return array
*/
public function searchEncaissements($keyword, $storeId = null)
{
$builder = $this->db->table($this->table);
$builder->select('
autres_encaissements.*,
CONCAT(users.firstname, " ", users.lastname) as user_name,
stores.name as store_name
');
$builder->join('users', 'users.id = autres_encaissements.user_id', 'left');
$builder->join('stores', 'stores.id = autres_encaissements.store_id', 'left');
$builder->groupStart()
->like('autres_encaissements.type_encaissement', $keyword)
->orLike('autres_encaissements.commentaire', $keyword)
->orLike('CONCAT(users.firstname, " ", users.lastname)', $keyword)
->groupEnd();
if ($storeId) {
$builder->where('autres_encaissements.store_id', $storeId);
}
$builder->orderBy('autres_encaissements.created_at', 'DESC');
return $builder->get()->getResultArray();
}
}