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.
183 lines
5.4 KiB
183 lines
5.4 KiB
<?php
|
|
|
|
namespace App\Models;
|
|
|
|
use CodeIgniter\Model;
|
|
|
|
class Historique extends Model
|
|
{
|
|
protected $table = 'historique';
|
|
protected $primaryKey = 'id';
|
|
protected $allowedFields = [
|
|
'table_name',
|
|
'action',
|
|
'row_id',
|
|
'product_name',
|
|
'sku',
|
|
'store_name',
|
|
'description',
|
|
'created_at'
|
|
];
|
|
protected $useTimestamps = false;
|
|
protected $createdField = 'created_at';
|
|
|
|
/**
|
|
* Récupérer tous les historiques avec pagination
|
|
*/
|
|
public function getHistoriqueData($limit = null, $offset = null)
|
|
{
|
|
$builder = $this->select('*')
|
|
->orderBy('created_at', 'DESC');
|
|
|
|
if ($limit !== null) {
|
|
$builder->limit($limit, $offset);
|
|
}
|
|
|
|
return $builder->get()->getResultArray();
|
|
}
|
|
|
|
/**
|
|
* Récupérer l'historique pour un produit spécifique
|
|
*/
|
|
public function getHistoriqueByProduct($productId)
|
|
{
|
|
return $this->where('row_id', $productId)
|
|
->where('table_name', 'products')
|
|
->orderBy('created_at', 'DESC')
|
|
->findAll();
|
|
}
|
|
|
|
/**
|
|
* Récupérer l'historique pour un magasin spécifique
|
|
*/
|
|
public function getHistoriqueByStore($storeName)
|
|
{
|
|
return $this->where('store_name', $storeName)
|
|
->orderBy('created_at', 'DESC')
|
|
->findAll();
|
|
}
|
|
|
|
/**
|
|
* Récupérer l'historique par type d'action
|
|
*/
|
|
public function getHistoriqueByAction($action)
|
|
{
|
|
return $this->where('action', $action)
|
|
->orderBy('created_at', 'DESC')
|
|
->findAll();
|
|
}
|
|
|
|
/**
|
|
* Récupérer les statistiques d'historique
|
|
*/
|
|
public function getHistoriqueStats()
|
|
{
|
|
$stats = [];
|
|
|
|
// Total des mouvements
|
|
$stats['total_mouvements'] = $this->countAll();
|
|
|
|
// Mouvements par action
|
|
$actions = ['CREATE', 'UPDATE', 'DELETE', 'ASSIGN_STORE', 'ENTRER', 'SORTIE'];
|
|
foreach ($actions as $action) {
|
|
$stats['mouvements_' . strtolower($action)] = $this->where('action', $action)->countAllResults();
|
|
}
|
|
|
|
// Mouvements aujourd'hui
|
|
$stats['mouvements_today'] = $this->where('DATE(created_at)', date('Y-m-d'))->countAllResults();
|
|
|
|
// Mouvements cette semaine
|
|
$stats['mouvements_week'] = $this->where('created_at >=', date('Y-m-d', strtotime('-7 days')))->countAllResults();
|
|
|
|
return $stats;
|
|
}
|
|
|
|
/**
|
|
* Enregistrer un mouvement dans l'historique
|
|
*/
|
|
public function logMovement($tableName, $action, $rowId, $productName, $sku, $storeName, $description = null)
|
|
{
|
|
$data = [
|
|
'table_name' => $tableName,
|
|
'action' => $action,
|
|
'row_id' => $rowId,
|
|
'product_name' => $productName,
|
|
'sku' => $sku,
|
|
'store_name' => $storeName,
|
|
'description' => $description,
|
|
'created_at' => date('Y-m-d H:i:s')
|
|
];
|
|
|
|
return $this->insert($data);
|
|
}
|
|
|
|
/**
|
|
* Nettoyer l'historique ancien (plus de X jours)
|
|
*/
|
|
public function cleanOldHistory($days = 365)
|
|
{
|
|
$cutoffDate = date('Y-m-d', strtotime("-{$days} days"));
|
|
return $this->where('created_at <', $cutoffDate)->delete();
|
|
}
|
|
|
|
/**
|
|
* Récupérer l'historique avec filtres
|
|
*
|
|
* @param array $filters Filtres pour la requête
|
|
* @return array
|
|
*/
|
|
public function getHistoriqueWithFilters($filters = [])
|
|
{
|
|
$builder = $this->select('*');
|
|
|
|
if (!empty($filters['action']) && $filters['action'] !== 'all') {
|
|
$builder->where('action', $filters['action']);
|
|
}
|
|
|
|
if (!empty($filters['store_name']) && $filters['store_name'] !== 'all') {
|
|
$builder->where('store_name', $filters['store_name']);
|
|
}
|
|
|
|
if (!empty($filters['product_name'])) {
|
|
$builder->like('product_name', $filters['product_name']);
|
|
}
|
|
|
|
if (!empty($filters['sku'])) {
|
|
$builder->like('sku', $filters['sku']);
|
|
}
|
|
|
|
if (!empty($filters['date_from'])) {
|
|
$builder->where('created_at >=', $filters['date_from'] . ' 00:00:00');
|
|
}
|
|
|
|
if (!empty($filters['date_to'])) {
|
|
$builder->where('created_at <=', $filters['date_to'] . ' 23:59:59');
|
|
}
|
|
|
|
return $builder->orderBy('created_at', 'DESC')->findAll();
|
|
}
|
|
|
|
/**
|
|
* Exporter l'historique en CSV
|
|
*/
|
|
public function exportHistorique($filters = [])
|
|
{
|
|
$data = $this->getHistoriqueWithFilters($filters);
|
|
|
|
$csvData = "ID,Table,Action,ID Produit,Nom Produit,SKU,Magasin,Description,Date/Heure\n";
|
|
|
|
foreach ($data as $row) {
|
|
$csvData .= '"' . $row['id'] . '",';
|
|
$csvData .= '"' . $row['table_name'] . '",';
|
|
$csvData .= '"' . $row['action'] . '",';
|
|
$csvData .= '"' . $row['row_id'] . '",';
|
|
$csvData .= '"' . str_replace('"', '""', $row['product_name']) . '",';
|
|
$csvData .= '"' . $row['sku'] . '",';
|
|
$csvData .= '"' . $row['store_name'] . '",';
|
|
$csvData .= '"' . str_replace('"', '""', $row['description'] ?? '') . '",';
|
|
$csvData .= '"' . $row['created_at'] . '"' . "\n";
|
|
}
|
|
|
|
return $csvData;
|
|
}
|
|
}
|