Commit 17799573 authored by unknown's avatar unknown

Restauration complète du projet

parent 40dc8f18
# Documentation des améliorations - Gestion des Structures et Classes
## Vue d'ensemble
Ce document décrit les améliorations apportées au système de gestion des structures et des classes dans l'application.
---
## 🎯 Améliorations principales
### 1. **Affectation de l'Opérateur aux Structures validées**
#### Nouveau bouton d'affectation
- **Localisation**: Tableau des structures, colonne Actions
- **Condition d'affichage**: Uniquement pour les structures avec l'état "❌ Valide" ou "❌ Ouvert"
- **Icon**: 🤝 Handshake (assignation d'opérateur)
- **Couleur**: Bleu primaire
#### Nouvel endpoint API
- **Route**: `POST /structures/assignOperator`
- **Paramètres**:
- `code_str`: Code de la structure
- `id_operateur`: ID de l'opérateur à affecter
- `csrf_token`: Token CSRF
#### Modal d'assignation
- **ID**: `#assign-operator-modal`
- **Titre**: "Affecter un Opérateur"
- **Fonctionnalités**:
- Sélection facile de l'opérateur
- Message informatif surle rôle de l'opérateur
- Suggestion: L'opérateur peut créer des classes et assigner des facilitateurs
#### Contrôleur: `C_structure::assignOperator()`
```php
public function assignOperator()
{
// Valide que:
// 1. code_str et id_operateur sont fournis
// 2. La structure existe
// 3. La structure est "valide" ou "ouvert"
// 4. Met à jour id_operateur dans la structure
}
```
---
### 2. **Interface améliorée de création de classes**
#### Structure du formulaire en 3 étapes
Le modal de création de classe est maintenant organisé en 3 sections claires:
**ÉTAPE 1: Structure** 🏢
- Sélection de la structure (obligatoire)
- Affiche le code de la structure pour confirmation
**ÉTAPE 2: Informations de la classe** ℹ️
- Nom de la classe (ex: "6ème A")
- Capacité en places (nombre d'apprenants)
- **Date d'ouverture** - Clairement identifiée comme: **"Début des apprenants"**
- Icon: 📅 Calendrier
- Couleur: Succès (vert)
- Texte descriptif: "Date d'ouverture (Début des apprenants)"
**ÉTAPE 3: Enseignant et Niveau** 🎓
- Sélection du facilitateur/enseignant
- Sélection du niveau d'étude
- Icons explicites:
- 👨‍🎓 Chalkboard-user pour le facilitateur
- 📈 Level-up pour le niveau
#### Améliorations visuelles
- Couleurs par étape: Primaire → Info → Avertissement
- Icons pour une meilleure reconnaissance visuelle
- Messages clairs en français
- Espacement et groupement logique des champs
---
### 3. **Tableau des classes amélioré**
#### Nouvelles colonnes
- **Colonne "Facilitateur"**: Affiche maintenant "Facilitateur (Enseignant)" pour clarifier le rôle
- **Colonne "Niveau"**: Badge de couleur bleue pour meilleure visibilité
- **Colonne "📅 Ouverture"**: Nouvelle colonne affichant la date d'ouverture
- Format: JJ/MM/AAAA
- Icon: 📅 Calendrier
- Texte grisé (muted) pour discrétion
#### En-têtes améliorés
- Headers clairs et descriptifs
- Icons pour une reconnaissance rapide
---
### 4. **Flux de travail pour une structure validée**
#### Scénario typique:
1. ✅ Structure créée et passe par les étapes de validation
2. ✅ État structure: **"Valide"**
3. 🎯 **Gestionnaire affecte l'opérateur**
- Clique sur le bouton 🤝 "Assigner opérateur"
- Sélectionne l'opérateur responsable
- Confirmé avec succès
4. 👥 **L'opérateur peut maintenant créer des classes**
- Clique sur le bouton 🎓 "Créer une classe"
- Remplit les 3 étapes du formulaire
- Sélectionne le facilitateur (enseignant)
- Sélectionne le niveau
- Spécifie la date d'ouverture (début des apprenants)
5. 📚 **Les apprenants commencent à partir de la date d'ouverture**
---
## 📝 Fichiers modifiés
### 1. **V_structure.php** (Vue)
- Ajout du bouton d'assignation d'opérateur (ligne ~143)
- Ajout du modal `assign-operator-modal` (avant `#info-modal`)
- Ajout du code JavaScript pour gérer l'assignation
### 2. **C_structure.php** (Contrôleur)
- Nouvelle méthode: `assignOperator()` (fin du fichier)
- Gère la logique d'affectation de l'opérateur à une structure
### 3. **V_classes.php** (Vue)
- Modal créer classe: Réorganisé en 3 étapes colorées
- Modal éditer classe: Même structure pour cohérence
- Tableau: Nouvelle colonne "📅 Ouverture"
- Amélioration des labels et descriptions
---
## 🔑 Points clés
### Date d'ouverture = Début des apprenants
- Clairement marquée dans les formulaires
- Affichée dans le tableau des classes
- Utilisée comme référence pour le démarrage des activités pédagogiques
### Facilité de navigation
- Sélecteur d'opérateur directement accessible
- Création de classe en 3 étapes claires
- Boutons intuitifs avec icons
### Validations
- L'opérateur ne peut être assigné que si l'état est "valide" ou "ouvert"
- Les champs obligatoires sont clairement marqués
---
## 🚀 Utilisation
### Pour assigner un opérateur à une structure validée:
1. Allez sur la page "Gestion des Structures"
2. Trouvez la structure avec l'état "Valide"
3. Cliquez sur le bouton 🤝 (Assigner opérateur)
4. Sélectionnez l'opérateur responsable
5. Cliquez sur "Affecter"
### Pour créer une classe:
1. Allez sur la page "Gestion des Classes"
2. Cliquez sur le bouton "+ Ajouter"
3. **Étape 1**: Sélectionnez la structure
4. **Étape 2**: Remplissez les informations de la classe
5. **Étape 3**: Sélectionnez l'enseignant et le niveau
6. Cliquez sur "Créer la classe"
---
## 📊 Technologie utilisée
- **Frontend**: Bootstrap 5, jQuery, SweetAlert2
- **Backend**: CodeIgniter 4
- **Database**: MySQL (structure table, classes table)
- **API**: REST endpoints
---
## ✅ Checklist de vérification
- [x] Bouton d'assignation d'opérateur visible pour structures validées
- [x] Modal d'assignation fonctionnel
- [x] Endpoint d'assignation implémenté
- [x] Interface de création de classe en 3 étapes
- [x] Date d'ouverture clairement identifiée
- [x] Tableau des classes affiche la date d'ouverture
- [x] Validation des états de structure
- [x] Messages d'erreur explicites
- [x] Messages de succès avec rechargement
---
**Version**: 1.0
**Date**: 13 Avril 2026
**Auteur**: Système
......@@ -7,7 +7,7 @@ use CodeIgniter\Config\BaseConfig;
class Email extends BaseConfig
{
public string $fromEmail = '';
public string $fromName = '';
public string $fromName = 'Classe Passerelle';
public string $recipients = '';
/**
......@@ -18,7 +18,7 @@ class Email extends BaseConfig
/**
* The mail sending protocol: mail, sendmail, smtp
*/
public string $protocol = 'mail';
public string $protocol = 'smtp';
/**
* The server path to Sendmail.
......@@ -28,7 +28,7 @@ class Email extends BaseConfig
/**
* SMTP Server Hostname
*/
public string $SMTPHost = '';
public string $SMTPHost = 'smtp.gmail.com';
/**
* SMTP Username
......@@ -38,12 +38,12 @@ class Email extends BaseConfig
/**
* SMTP Password
*/
public string $SMTPPass = '';
public string $SMTPPass = 'mot_de_passe_application';
/**
* SMTP Port
*/
public int $SMTPPort = 25;
public int $SMTPPort = 587;
/**
* SMTP Timeout (in seconds)
......@@ -77,7 +77,7 @@ class Email extends BaseConfig
/**
* Type of mail, either 'text' or 'html'
*/
public string $mailType = 'text';
public string $mailType = 'html';
/**
* Character set (utf-8, iso-8859-1, etc.)
......
......@@ -6,9 +6,13 @@ use CodeIgniter\Router\RouteCollection;
* @var RouteCollection $routes
*/
// $routes->get('/', 'Home::index');
// authentification
// authentification inscrire
$routes->get('/', 'C_connexion::index');
$routes->post('/login', 'C_connexion::login');
$routes->get('/reset', 'C_connexion::reset');
//
$routes->get('/inscrire', 'C_connexion::inscrire');
$routes->post('/inscrire/store', 'C_connexion::inscription');
$routes->get('/deconnexion', 'C_connexion::deconnexion');
$routes->get('/Dashboard', 'Dashboard::index');
$routes->get('/tableaubordre', 'Dashboard::tableaubordre');
......@@ -37,7 +41,6 @@ $routes->post('roles/savePermissions', 'Securite\C_sys_profil::savePermissions')
$routes->get('roles/getPermissions(:num)', 'Securite\C_sys_profil::getSousMenusWithPermissions/$1');
$routes->post('roles/getDroits', 'Securite\C_sys_profil::getDroits');
$routes->post('roles/updateDroit', 'Securite\C_sys_profil::updateDroit');
// user
$routes->get('user','Securite\C_sys_user::index');
$routes->get('user/edit/(:num)','Securite\C_sys_user::edit/$1');
......@@ -47,4 +50,93 @@ $routes->get('user/recherche','Securite\C_sys_user::getIENInfo');
$routes->post('users/Status','Securite\C_sys_user::toggleStatus');
$routes->get('user/getIEFByIA/(:num)','Securite\C_sys_user::getIEFByIA/$1');
$routes->post('user/delete/(:num)','Securite\C_sys_user::delete/$1');
// authentification
\ No newline at end of file
// type offre
$routes->get('typeoffre','C_typeoffre::index');
$routes->post('typeoffre/store','C_typeoffre::store');
$routes->get('typeoffre/edit/(:num)','C_typeoffre::edit/$1');
$routes->post('typeoffre/update/(:num)','C_typeoffre::update/$1');
$routes->post('typeoffre/delete/(:num)','C_typeoffre::delete/$1');
// personnel
$routes->get('personnel','C_personnel::index');
$routes->post('personnel/store','C_personnel::store');
$routes->get('personnel/edit/(:num)','C_personnel::edit/$1');
$routes->post('personnel/update/(:num)','C_personnel::update/$1');
$routes->post('personnel/delete/(:num)','C_personnel::delete/$1');
$routes->post('personnel/archive/(:num)', 'C_personnel::archive/$1');
$routes->get('personnel/liste', 'C_personnel::liste');
$routes->get('personnel/archives', 'C_personnel::archives');
$routes->post('personnel/restore/(:num)', 'C_personnel::restore/$1');
// structure
$routes->get('structure','C_structure::index');
$routes->post('structures/store/', 'C_structure::save');
$routes->get('structure/edit/(:num)','C_structure::edit/$1');
$routes->get('structure/info/(:num)','C_structure::info/$1');
$routes->post('structure/update/(:num)','C_structure::update/$1');
$routes->get('structures/getIEFByIA/(:num)', 'C_structure::getIAs/$1');
$routes->get('structures/getIEFWithEEByIA/(:num)', 'C_structure::getIEFWithEEByIA/$1');
$routes->get('structures/getCommunesByIEF/(:num)', 'C_structure::getIEF/$1');
$routes->get('structures/getEtablissementsByIef/(:num)', 'C_structure::getEtablissements/$1');
$routes->post('structure/generateCode', 'C_structure::generateCode');
$routes->post('structure/changeEtat', 'C_structure::changeEtat');
$routes->get('atlas/etablissements', 'C_structure::fetchEtablissements');
// $routes->get('getIefByIa/(:num)', 'C_structure::getIefByIa/$1');
// $routes->get('getEtablissementByIef/(:num)', 'C_structure::getEtablissementByIef/$1');
$routes->get('structures/getEtablissementsByCommune/(:num)', 'C_structure::getEtablissementsByCommune/$1');
// source financement
$routes->get('source','C_source::index');
$routes->post('source/store/', 'C_source::store');
$routes->get('source/edit/(:num)','C_source::edit/$1');
$routes->get('source/update/(:num)','C_source::update/$1');
$routes->post('source/delete/(:num)','C_source::delete/$1');
// site structure
$routes->get('site','C_site::index');
$routes->post('site/store/', 'C_site::store');
$routes->get('site/edit/(:num)','C_site::edit/$1');
$routes->post('site/update/(:num)','C_site::update/$1');
$routes->post('site/delete/(:num)','C_site::delete/$1');
// promoteur
$routes->get('promoteur','C_promoteurs::index');
$routes->post('promoteur/store/', 'C_promoteurs::store');
$routes->get('promoteur/edit/(:num)','C_promoteurs::edit/$1');
$routes->post('promoteur/update/(:num)','C_promoteurs::update/$1');
$routes->post('promoteur/delete/(:num)','C_promoteurs::delete/$1');
// statut occupation
$routes->get('statut','C_statut::index');
$routes->post('statut/store/', 'C_statut::store');
$routes->get('statut/edit/(:num)','C_statut::edit/$1');
$routes->post('statut/update/(:num)','C_statut::update/$1');
$routes->post('statut/delete/(:num)','C_statut::delete/$1');
// operateur
$routes->get('operateur','C_operateur::index');
$routes->post('operateur/store/', 'C_operateur::store');
$routes->get('operateur/edit/(:num)','C_operateur::edit/$1');
$routes->post('operateur/update/(:num)','C_operateur::update/$1');
$routes->post('operateur/delete/(:num)','C_operateur::delete/$1');
// faculitateur
$routes->get('facilitateur','C_faculitateur::index');
$routes->post('facilitateur/store/', 'C_faculitateur::store');
$routes->get('facilitateur/edit/(:num)','C_faculitateur::edit/$1');
$routes->post('facilitateur/update/(:num)','C_faculitateur::update/$1');
$routes->post('facilitateur/delete/(:num)','C_faculitateur::delete/$1');
// enfant
$routes->get('enfant','C_enfant::index');
$routes->post('enfant/store/', 'C_enfant::store');
$routes->get('enfant/edit/(:num)','C_enfant::edit/$1');
$routes->post('enfant/update/(:num)','C_enfant::update/$1');
$routes->post('enfant/delete/(:num)','C_enfant::delete/$1');
$routes->post('/enfant/import', 'C_enfant::import');
$routes->get('enfant/view/(:num)', 'C_enfant::view/$1');
// critere
$routes->get('critere','C_critere::index');
$routes->post('critere/store/', 'C_critere::store');
$routes->get('critere/edit/(:num)','C_critere::edit/$1');
$routes->post('critere/update/(:num)','C_critere::update/$1');
$routes->post('critere/delete/(:num)','C_critere::delete/$1');
// enfant selectionne
$routes->get('enfantselectionne','C_enfantselectionne::index');
$routes->post('enfantselectionne/store/', 'C_enfantselectionne::store');
$routes->get('enfantselectionne/edit/(:num)','C_enfantselectionne::edit/$1');
$routes->post('enfantselectionne/update/(:num)','C_enfantselectionne::update/$1');
$routes->post('enfantselectionne/delete/(:num)','C_enfantselectionne::delete/$1');
$routes->get('enfantselectionne/view/(:num)', 'C_enfantselectionne::view/$1');
// 404
\ No newline at end of file
<?php
namespace App\Controllers;
use App\Models\M_apprenants;
use App\Models\M_classes;
use App\Models\M_enfant;
class C_apprenant extends BaseController
{
public function index()
{
$model = new M_apprenants();
$modelenfant = new M_enfant();
$modelclasse= new M_classes();
$data['apprenants'] = $model->getApprenantsAvecDetails();
$code_str = $this->request->getPost('code_str'); // ID du critère à utiliser pour la sélection
$id_type_offre = $this->request->getPost('id_type_offre'); // ID du type d'offre à utiliser pour la sélection
$data['enfants'] = $modelenfant->getEnfantsEligibles($code_str, $id_type_offre);
$data['classes'] = $modelclasse->findAll();
return view("V_apprenants", $data);
}
public function listeParClasse($code_classe)
{
$modelApprenant = new M_apprenants();
// On récupère uniquement les élèves de cette classe
$data['apprenants'] = $modelApprenant->where('code_classe', $code_classe)->findAll();
$data['classe_actuelle'] = $code_classe;
return view('V_apprenants', $data);
}
public function store()
{
$model = new M_apprenants();
$data = [
'id_enfant' => $this->request->getPost('id_enfant'),
'date_inscription' => $this->request->getPost('date_inscription'),
'id_classe' => $this->request->getPost('id_classe'),
'date_sortir' => $this->request->getPost('date_sortir'),
];
if ($model->save($data)) {
return $this->response->setJSON(['status' => 'success']);
} else {
return $this->response->setJSON(['status' => 'error']);
}
}
public function edit ($id)
{
$model = new M_apprenants();
$data = $model->find($id);
return $this->response->setJSON($data);
}
public function update($id)
{
$model = new M_apprenants();
$data = [
'id_enfant' => $this->request->getPost('id_enfant'),
'date_inscription' => $this->request->getPost('date_inscription'),
'id_classe' => $this->request->getPost('id_classe'),
'date_sortir' => $this->request->getPost('date_sortir'),
];
if ($model->update($id, $data)) {
return redirect()->to('/apprenants')->with('success', 'Apprenant mis à jour avec succès');
} else {
return redirect()->back()->withInput()->with('error', 'Erreur lors de la mise à jour de l\'apprenant');
}
}
public function delete($id)
{
$model = new M_apprenants();
if ($model->delete($id)) {
return $this->response->setJSON(['success' => 'true']);
} else {
return $this->response->setJSON(['success' => 'false']);
}
}
// public function liste_par_classe($id_classe)
// {
// try {
// $db = \Config\Database::connect();
// $builder = $db->table('apprenant a'); // Vérifiez si c'est 'apprenant' ou 'apprenants'
// $builder->select('e.nom as nom_complet,e.prenom as prenom_complet, p.note, a.date_inscription');
// $builder->join('enfant e', 'e.id_enfant = a.id_enfant');
// // ATTENTION : vérifiez si votre table s'appelle 'pretest' ou 'pretexte'
// $builder->join('pretexte p', 'p.id_enfant = a.id_enfant', 'left');
// $builder->where('a.id_classe', $id_classe);
// $resultat = $builder->get()->getResultArray();
// return $this->response->setJSON($resultat);
// } catch (\Exception $e) {
// // En cas d'erreur, on renvoie l'erreur en JSON pour débugger
// return $this->response->setStatusCode(500)->setJSON(['error' => $e->getMessage()]);
// }
// }
public function liste_par_classe($id_classe)
{
try {
$db = \Config\Database::connect();
$builder = $db->table('apprenant a');
// Ajout de la date et du lieu de naissance dans le select
$builder->select('e.nom, e.prenom, e.date_naissance, e.lieu_naissance, n.nom as niveau_nom');
$builder->join('enfant e', 'e.id_enfant = a.id_enfant');
$builder->join('niveaux n', 'n.id_niveau = a.id_classe');
$builder->where('a.id_classe', $id_classe);
$resultat = $builder->get()->getResultArray();
return $this->response->setJSON($resultat);
} catch (\Exception $e) {
return $this->response->setStatusCode(500)->setJSON(['error' => $e->getMessage()]);
}
}
}
<?php
namespace App\Controllers;
use App\Models\M_classes;
use App\Models\M_faculitateur;
use App\Models\M_structure;
use App\Models\M_niveau;
use App\Models\securite\M_user;
use App\Controllers\BaseController;
use App\Controllers\session;
class C_classes extends BaseController
{
public function __construct()
{
helper(['codification']);
helper(['form', 'url']);
}
public function index()
{
$model = new M_classes();
$modelstructures = new M_structure();
$modelniveaux = new M_niveau();
$modelfacilitateur = new M_faculitateur();
$code_str = $this->request->getGet('code_str');
$code_classe= $this->request->getGet('code_classe');
$data['structures'] = $modelstructures->findAll();
$data['classes'] = $model->getClassesAvecDetails($code_str);
$data['niveaux'] = $modelniveaux->findAll();
$data['facilitateurs'] = $modelfacilitateur->findAll();
return view('V_classes', $data);
}
// Nouvelle méthode AJAX pour récupérer facilitateurs par structure
public function getFacilitateurs($code_str)
{
$model = new M_faculitateur();
// $data = $model->getFacilitateurs($code_str);
$data = $model->getFacilitateursByCodeStr($code_str);
return $this->response->setJSON($data);
}
public function getByOperateur($id_operateur = null)
{
if (!$id_operateur) {
return $this->response->setJSON([]);
}
$model = new M_faculitateur();
$data = $model
->where('id_operateur', $id_operateur)
->where('etat', 1)
->orderBy('prenom', 'ASC')
->findAll();
return $this->response->setJSON($data);
}
public function getClassesDisponibles($idFac)
{
$model = new M_classes();
$classes = $model->getClassesByFacilitateur($idFac);
return view('classes/partial_list', [
'classes' => $classes
]);
}
public function detail($id_classe)
{
$model = new M_classes();
$classe = $model->getClasseDetail($id_classe);
return view('partials/classes_details', [
'classe' => $classe
]);
}
public function store()
{
$classeModel = new M_classes();
$facilitateurModel = new M_faculitateur();
$structureModel = new M_structure();
$id_facilitateur = $this->request->getPost('id_facilitateur');
$code_str = $this->request->getPost('code_str');
$structure = $structureModel->find($code_str);
$facilitateur = $facilitateurModel->find($id_facilitateur);
if (!$structure) {
return redirect()->back()->withInput()->with('error', 'Structure invalide.');
}
if (!$facilitateur) {
return redirect()->back()->withInput()->with('error', 'Facilitateur invalide.');
}
$data = [
'code_classe' => generateCodeClasse($code_str), // Génère CAF1, ECB1, etc.
'nom_classe' => $this->request->getPost('nom_classe'),
'code_str' => $this->request->getPost('code_str'),
'nombre_place' => $this->request->getPost('nombre_place'),
'date_ouverture' => $this->request->getPost('date_ouverture'),
'id_facilitateur'=> $id_facilitateur,
'id_niveau' => $this->request->getPost('id_niveau'),
];
if ($classeModel->insert($data)) {
return redirect()->to('/classes')
->with('success', 'Classe ajoutée avec succès. Code: ' . $data['code_classe']);
} else {
return redirect()->back()
->withInput()
->with('error', 'Erreur lors de l\'ajout de la classe');
}
}
public function facilitateurbyStructure()
{
$code_str = $this->request->getGet('code_str');
$model = new M_faculitateur();
return $this->response->setJSON(
$model->where('code_str', $code_str)->findAll()
);
}
public function affecter()
{
$model = new M_classes();
$id_classe = $this->request->getPost('id_classe');
$id_facilitateur = $this->request->getPost('id_facilitateur');
// 1. Vérifier si la classe a déjà un facilitateur
$classe = $model->find($id_classe);
if (!empty($classe['id_facilitateur'])) {
return redirect()->to('classes')
->with('error', 'Cette classe a déjà un facilitateur affecté !');
}
// 2. Vérifier si le facilitateur est déjà affecté à une autre classe
$dejaAffecte = $model->where('id_facilitateur', $id_facilitateur)
->first();
if (!empty($dejaAffecte)) {
return redirect()->to('classes')
->with('error', 'Ce facilitateur est déjà affecté à la classe : ' . $dejaAffecte['nom_classe']);
}
// 3. Affecter
$model->update($id_classe, [
'id_facilitateur' => $id_facilitateur
]);
return redirect()->to('classes')
->with('success', 'Facilitateur affecté avec succès !');
}
public function byStructure($code_str)
{
try {
$model = new M_classes();
$data['classes'] = $model->getClassesAvecDetail($code_str);
return view('classes/liste', $data);
} catch (\Throwable $e) {
return $this->response->setJSON([
'error' => $e->getMessage()
]);
}
}
public function edit($id)
{
$model = new M_classes();
$classe = $model->find($id);
return $this->response->setJSON($classe);
}
public function update($id)
{
$model = new M_classes();
$data = [
'code_str' => $this->request->getPost('code_str'),
'code_classe' => generateCodeClasse($this->request->getPost('code_str')),
'nom_classe' => $this->request->getPost('nom_classe'),
'nombre_place' => $this->request->getPost('nombre_place'),
'date_ouverture' => $this->request->getPost('date_ouverture'),
'id_facilitateur'=> $this->request->getPost('id_facilitateur'),
'id_niveau' => $this->request->getPost('id_niveau'),
];
if ($model->update($id, $data)) {
return redirect()->to('/classes')->with('success', 'Classe mise à jour avec succès');
} else {
return redirect()->back()->withInput()->with('error', 'Erreur lors de la mise à jour de la classe');
}
}
public function delete($id)
{
$model = new M_classes();
$session=session();
if ($model->delete($id)) {
return $this->response->setJSON(['success' => 'true']);
} else {
return $this->response->setJSON(['success' => 'false']);
}
}
}
\ No newline at end of file
This diff is collapsed.
<?php
namespace App\Controllers;
use App\Models\M_critere;
use App\Models\M_typeoffre;
use App\Controllers\session;
class C_critere extends BaseController
{
public function index()
{
$model = new M_critere();
$typeoffreModel = new M_typeoffre();
$data['critères'] = $model->getCriteresWithOffre();
$data['typeoffres'] = $typeoffreModel->findAll();
return view("configuration/V_critere", $data);
}
public function store()
{
$session = session();
$model = new M_critere();
$data = [
'age_min' => $this->request->getPost('age_min'),
'age_max' => $this->request->getPost('age_max'),
'date_ref' => date('Y-m-d'),
'id_type_offre' => $this->request->getPost('id_type_offre')
];
$model->save($data);
return redirect()->to(base_url('critere'))->with('success', 'Critère ajouté avec succès');
}
public function edit($id)
{
$model = new M_critere();
$typeoffreModel = new M_typeoffre();
$critere = $model->find($id);
$typeoffres = $typeoffreModel->findAll();
return $this->response->setJSON(['criteres' => $critere, 'typeoffres' => $typeoffres]);
}
public function update($id)
{
$model = new M_critere();
$data = [
'age_min' => $this->request->getPost('age_min'),
'age_max' => $this->request->getPost('age_max'),
'date_ref' => date('Y-m-d'),
'id_type_offre' => $this->request->getPost('id_type_offre')
];
$model->update($id, $data);
return redirect()->to(base_url('critere'))->with('success', 'Critère mis à jour avec succès');
}
public function delete($id)
{
$model = new M_critere();
if ($model->delete($id)) {
return $this->response->setJSON(['success' => true]);
} else {
return $this->response->setJSON(['success' => false]);
}
}
}
This diff is collapsed.
<?php
namespace App\Controllers;
use App\Models\M_enfantselectionne;
use App\Models\M_parent;
use App\Models\M_enfant;
class C_enfantselectionne extends BaseController
{
public function index()
{
$model = new M_enfant();
$selectionModel = new M_enfantselectionne();
// $data['enfants_selectionnes'] = $selectionModel->findAll();
$data['enfants_selectionnes'] = $selectionModel->getEnfantsEligibles();
return view("V_enfantselectionne",$data);
}
public function view($id)
{
$enfantModel = new M_enfant();
$parentModel = new M_parent();
$enfant = $enfantModel->find($id);
if (!$enfant) {
return $this->response->setStatusCode(404)->setJSON([
'error' => 'Enfant non trouvé'
]);
}
$parent = $parentModel->find($enfant['id_parent']);
return $this->response->setJSON([
'enfant' => $enfant,
'parent' => $parent
]);
}
}
<?php
namespace App\Controllers;
use App\Models\M_faculitateur;
class C_faculitateur extends BaseController
{
// public function index()
// {
// $session = session();
// $model = new M_faculitateur();
// // 1. Récupérer l'ID de l'opérateur connecté (stocké lors du Login)
// $idSession = $session->get('user_id');
// // Sécurité : Si l'utilisateur n'est pas connecté, on redirige vers le login
// if (!$idSession) {
// return redirect()->to('login')->with('error', 'Veuillez vous connecter.');
// }
// // 2. Appeler la fonction du modèle avec l'ID de session
// // Si idSession = 1, il ne ramènera que les lignes où id_operateur = 1
// $data['faculitateurs'] = $model->getMesFacilitateurs($idSession);
// // $data['faculitateurs'] = $model->findAll();
// // 3. Charger la vue avec les données filtrées
// return view("V_faculitateur", $data);
// }
public function index()
{
$session = session();
$model = new M_faculitateur();
$idSession = $session->get('user_id');
$profil = $session->get('id_type_profil'); // 👈 ici
if (!$idSession) {
return redirect()->to('login')->with('error', 'Veuillez vous connecter.');
}
// ✅ Si administrateur (ex: 1)
if ($profil == 26) {
$data['faculitateurs'] = $model->findAll();
} else {
// ✅ Sinon filtrer
$data['faculitateurs'] = $model->getMesFacilitateurs($idSession);
}
return view("V_faculitateur", $data);
}
public function store()
{
$model = new M_faculitateur();
$idConnecte = session()->get('user_id');
$data = [
'matricule' => $this->request->getPost('matricule'),
'prenom' => $this->request->getPost('prenom'),
'nom' => $this->request->getPost('nom'),
'email_pro' => $this->request->getPost('email_pro'),
'telephone' => $this->request->getPost('telephone'),
// C'EST CETTE LIGNE QUI EMPÊCHE L'ERREUR :
'id_operateur' => $idConnecte,
];
$model->insert($data);
return redirect()->to('/facilitateur')->with('success', 'Facilitateur ajouté avec succès !');
}
public function edit($id)
{
$Model=new M_faculitateur();
$session=session();
$data = $Model->find($id);
return $this->response->setJSON($data);
}
public function update($id)
{
$Model=new M_faculitateur();
$data = [
'matricule' => $this->request->getPost('matricule'),
'email_pro' => $this->request->getPost('email_pro'),
'adresse' => $this->request->getPost('adresse'),
'telephone' => $this->request->getPost('telephone'),
'nom' => $this->request->getPost('nom'),
'prenom' => $this->request->getPost('prenom'),
];
if ($Model->update($id, $data)) {
return redirect()->to('/facilitateur')->with('success', 'faculitateur modifié avec succès');
} else {
return redirect()->back()->withInput()->with('error', 'Échec de la modification de faculitateur');
}
}
public function delete($id) {
$model = new M_faculitateur();
if ($model->delete($id)) {
return $this->response->setJSON(['success' => true, 'message' => 'Supprimé avec succès']);
}
return $this->response->setJSON(['success' => false, 'message' => 'Erreur lors de la suppression']);
}
}
<?php
namespace App\Controllers;
use App\Models\M_seuil;
use App\Models\M_niveau;
use App\Controllers\BaseController;
use App\Controllers\session;
class C_niveau extends BaseController
{
public function index()
{
$model = new M_niveau();
$data['niveaux'] = $model->findAll();
return view("configuration/V_niveau", $data);
}
public function store()
{
$session = session();
$model = new M_seuil();
$model = new M_niveau();
$data = [
'nom' => $this->request->getPost('nom'),
'etape' => $this->request->getPost('etape'),
];
// Affiche les données pour le débogage
// var_dump($data);exit;
$model->insert($data);
$session->setFlashdata('success', 'Niveau ajouté avec succès.');
return redirect()->to('/niveau');
}
public function edit($id)
{
$model = new M_niveau();
$data = $model->find($id);
return $this->response->setJSON(['niveaux' => $data]);
}
public function update($id)
{
$model = new M_niveau();
$data = [
'nom' => $this->request->getPost('nom'),
'etape' => $this->request->getPost('etape'),
];
$model->update($id, $data);
return redirect()->to('/niveau')->with('success', 'Niveau mis à jour avec succès.');
}
public function delete($id)
{
$model = new M_niveau();
$model->delete($id);
return redirect()->to('/niveau')->with('success', 'Niveau supprimé avec succès.');
}
}
\ No newline at end of file
<?php
namespace App\Controllers;
use App\Models\M_operateur;
use App\Models\M_faculitateur;
use App\Controllers\session;
class C_operateur extends BaseController
{
public function index()
{
$session=session();
$model= new M_operateur();
$data['operateurs']= $model->findAll();
return view("V_operateur",$data);
}
public function store()
{
$operateurModel =new M_operateur();
$session=session();
$data = [
'type_operateur' => $this->request->getPost('type_operateur'),
'denomination' => $this->request->getPost('denomination'),
'email_pro' => $this->request->getPost('email_pro'),
'adresse' => $this->request->getPost('adresse'),
'telephone' => $this->request->getPost('telephone'),
'numero_agreement' => $this->request->getPost('numero_agreement'),
'nom' => $this->request->getPost('nom'),
'prenom' => $this->request->getPost('prenom'),
];
if ($operateurModel->insert($data)) {
return redirect()->to('/operateur')->with('success', 'Opérateur ajouté avec succès');
} else {
return redirect()->back()->withInput()->with('error', 'Échec de l\'ajout de l\'opérateur');
}
}
public function edit($id)
{
$operateurModel=new M_operateur();
$session=session();
$data = $operateurModel->find($id);
// $data = $operateurModel->where('id_operateur', $id)->first();
return $this->response->setJSON($data);
}
public function update($id)
{
$operateurModel=new M_operateur();
$data = [
'type_operateur' => $this->request->getPost('type_operateur'),
'denomination' => $this->request->getPost('denomination'),
'email_pro' => $this->request->getPost('email_pro'),
'adresse' => $this->request->getPost('adresse'),
'telephone' => $this->request->getPost('telephone'),
'numero_agreement' => $this->request->getPost('numero_agreement'),
'nom' => $this->request->getPost('nom'),
'prenom' => $this->request->getPost('prenom'),
];
if ($operateurModel->update($id, $data)) {
return redirect()->to('/operateur')->with('success', 'Opérateur modifié avec succès');
} else {
return redirect()->back()->withInput()->with('error', 'Échec de la modification de l\'opérateur');
}
}
public function delete($id) {
$model = new M_Operateur();
if ($model->delete($id)) {
return $this->response->setJSON(['success' => true, 'message' => 'Supprimé avec succès']);
}
return $this->response->setJSON(['success' => false, 'message' => 'Erreur lors de la suppression']);
}
}
<?php
namespace App\Controllers;
use App\Controllers\BaseController;
use App\Models\M_personnel;
class C_personnel extends BaseController
{
public function index()
{
$session=session();
$model = new M_personnel();
$data['personnels'] = $model->findAll();
$data['total_personnels'] = $model->countAll();
$data['total_archives'] = $model->where(['statut' => '-1'])->countAllResults();
$data['total_actif'] = $model->where(['statut' => '1'])->countAllResults();
$data['structures'] = $model-> getPersonnelWithStructure();
return view("V_personnel", $data);
}
// ajouter une nouvelle personnel
public function store(){
$session = session();
$model = new M_personnel();
$data=[
'nom' => $this->request->getPost('nom'),
'prenom' => $this->request->getPost('prenom'),
'adresse' => $this->request->getPost('adresse'),
'numero_telephone' => $this->request->getPost('numero_telephone'),
'email_pro' => $this->request->getPost('email_pro'),
'sexe' => $this->request->getPost('sexe'),
'ien' => $this->request->getPost('ien'),
'CODE_ADMINISTRATIF' => $this->request->getPost('CODE_ADMINISTRATIF'),
'nom_structure' => $this->request->getPost('nom_structure'),
'statut' => $this->request->getPost('statut'),
];
if ($model->insert($data)) {
$session->setFlashdata('success', 'Personnel ajouté avec succès !');
return redirect()->to('/personnel/liste');
} else {
$session->setFlashdata('error', 'Erreur lors de l\'ajout du personnel.');
return redirect()->to('/personnel/liste');
}
}
public function edit($id){
$model = new M_personnel();
$data['personnel']= $model->find($id);
return $this->response->setJSON($data);
}
public function update($id){
$session =session();
$model = new M_personnel();
$data=[
'nom_pers' => $this->request->getPost('nom_pers'),
'prenom_pers' => $this->request->getPost('prenom_pers'),
'adresse_pers' => $this->request->getPost('adresse_pers'),
'numero_telephone' => $this->request->getPost('numero_telephone'),
'email_pro' => $this->request->getPost('email_pro'),
'sexe' => $this->request->getPost('sexe'),
'ien' => $this->request->getPost('ien'),
'CODE_ADMINISTRATIF' => $this->request->getPost('CODE_ADMINISTRATIF'),
'nom_structure' => $this->request->getPost('nom_structure'),
'statut' => $this->request->getPost('statut'),
];
if ($model->update($id,$data)) {
$session->setFlashdata('success', 'Personnel mis à jour avec succès !');
return redirect()->to('/personnel/liste');
} else {
$session->setFlashdata('error', 'Erreur lors de la mise à jour du personnel.');
return redirect()->to('/personnel/liste');
}
}
// liste des personnels
public function liste()
{
$model = new M_personnel();
$data['personnels'] = $model->getPersonnelActif();
$data['structures'] = $model-> getPersonnelWithStructure();
return view("V_personnelListe", $data);
}
// ✅ Archiver un personnel
public function archive($id)
{
$model = new M_personnel();
if ($model->update($id, ['statut' => '-1'])) {
return $this->response->setJSON([
'status' => 'success',
'message' => 'Personnel archivé avec succès'
]);
}
return $this->response->setJSON([
'status' => 'error',
'message' => 'Erreur lors de l\'archivage'
]);
}
public function archives()
{
$model = new M_personnel();
// Récupérer seulement les archivés (statut = '-1')
$data['personnels'] = $model->getPersonnelArchive();
// var_dump($data);exit;
return view('V_personnelarchives', $data);
}
public function restore($id)
{
$model = new M_personnel();
if ($model->restaurer($id)) {
return $this->response->setJSON([
'status' => 'success',
'message' => 'Personnel restauré avec succès'
]);
}
return $this->response->setJSON([
'status' => 'error',
'message' => 'Erreur lors de la restauration'
]);
}
}
\ No newline at end of file
<?php
namespace App\Controllers;
use App\Models\M_enfantselectionne;
use App\Models\M_pretest;
use App\Models\M_classes;
use App\Models\M_apprenants;
use App\Controllers\BaseController;
class C_pretest extends BaseController
{
public function index()
{
$model = new M_pretest();
$modelenfant = new M_enfant();
$data['pretestes'] = $model->getPretestes();
$data['enfants'] = $modelenfant->getEnfantsEligible();
return view("V_pretest", $data);
}
public function store()
{
$model = new M_pretest();
$id_enfant = $this->request->getPost('id_enfant');
// Vérifier si l'enfant a déjà un prétest
$existe = $model->where('id_enfant', $id_enfant)->first();
if ($existe) {
return redirect()->back()->with('error', 'Cet enfant a déjà un prétest.');
}
$data = [
'note' => $this->request->getPost('note'),
'date_test' => $this->request->getPost('date_test'),
'id_enfant' => $id_enfant,
];
$model->save($data);
return redirect()->to('/enfant')->with('success', 'Pretest enregistré avec succès.');
}
public function affecter($id_enfant, $note)
{
$model = new M_pretest();
try {
$model->affecterEnfant($id_enfant, $note);
// Si c'est une requête AJAX, on répond en JSON
if ($this->request->isAJAX()) {
return $this->response->setJSON([
'status' => 'success',
'message' => 'Enfant affecté avec succès.'
]);
}
// Sinon, on garde la redirection classique
return redirect()->back()->with('success', 'Enfant affecté avec succès.');
} catch (\Exception $e) {
if ($this->request->isAJAX()) {
return $this->response->setJSON([
'status' => 'error',
'message' => $e->getMessage()
])->setStatusCode(500);
}
return redirect()->back()->with('error', $e->getMessage());
}
}
public function edit($id)
{
$model = new M_pretest();
$data = $model->find($id);
return $this->response->setJSON(['pretestes' => $data]);
}
// public function update($id)
// {
// $model = new M_pretest();
// $data = [
// 'note' => $this->request->getPost('note'),
// 'date_test' => $this->request->getPost('date_test'),
// 'id_enfant' => $this->request->getPost('id_enfant'),
// ];
// var_dump( $data);exit;
// $model->update($id, $data);
// return redirect()->to('/enfant')->with('success', 'Pretest mis à jour avec succès.');
// }
public function update()
{
$id = $this->request->getPost('id');
$note= $this->request->getPost('note');
$date = $this->request->getPost('date_test');
if (!$id) {
return $this->response->setJSON(['status' => 'error', 'message' => 'ID manquant']);
}
$model = new M_pretest();
$model->update($id, [
'note' => $note,
'date_test' => $date
]);
return $this->response->setJSON(['status' => 'success']);
}
}
\ No newline at end of file
<?php
namespace App\Controllers;
use App\Controllers\session;
use App\Models\M_promoteurs;
class C_promoteurs extends BaseController
{
public function index()
{
$session=session();
$model = new M_promoteurs();
$data['promoteurs'] = $model->findAll();
return view("configuration/V_promoteurs", $data);
}
// ajouter une nouvelle offre
public function store(){
$session=session();
$model = new M_promoteurs();
$data['libelle'] = $this->request->getPost('libelle');
if($model->insert($data)){
return redirect()->to('/promoteur')->with('success', 'progmme ajouter avec succès');
} else {
return redirect()->back()->withInput()->with('error', 'Échec ');
}
}
// afficher les données d'une offre pour modification
public function edit($id)
{
$model = new M_promoteurs();
$data = $model->find($id);
return $this->response->setJSON($data);
}
// modifier une offre
public function update(){
$model = new M_promoteurs();
$id = $this->request->getPost('id_promoteur');
$data['libelle'] = $this->request->getPost('libelle');
if($model->update($id, $data)){
return redirect()->to('/promoteur')->with('success', 'programme modifié avec succès');
} else {
return redirect()->back()->withInput()->with('error', 'Échec de la modification');
}
}
public function delete($id=null)
{
$model = new M_promoteurs();
$session=session();
if ($model->delete($id)) {
return $this->response->setJSON(['success' => true]);
} else {
return $this->response->setJSON(['success' => false]);
}
}
}
<?php
namespace App\Controllers;
use App\Models\M_seuil;
use App\Models\M_niveau;
use App\Controllers\BaseController;
use App\Controllers\session;
class C_seuil extends BaseController
{
public function index()
{
$model = new M_seuil();
$niveauModel = new M_niveau();
$data['seuils'] = $model->getSeuilsAvecNiveau();
$data['niveaux'] = $niveauModel->findAll();
return view("configuration/V_seuil", $data);
}
public function store()
{
$session = session();
$model = new M_seuil();
$data = [
'id_niveau' => $this->request->getPost('id_niveau'),
'note_min' => $this->request->getPost('note_min'),
'note_max' => $this->request->getPost('note_max'),
];
// Affiche les données pour le débogage
$model->insert($data);
$session->setFlashdata('success', 'Seuil ajouté avec succès.');
return redirect()->to('/seuil');
}
public function edit($id)
{
$model = new M_seuil();
$data = $model->find($id);
return $this->response->setJSON(['seuils' => $data]);
}
public function update($id)
{
$model = new M_seuil();
$data = [
'id_niveau' => $this->request->getPost('id_niveau'),
'note_min' => $this->request->getPost('note_min'),
'note_max' => $this->request->getPost('note_max'),
];
$model->update($id, $data);
return redirect()->to('/seuil')->with('success', 'Seuil mis à jour avec succès.');
}
public function delete($id)
{
$model = new M_seuil();
$model->delete($id);
return redirect()->to('/seuil')->with('success', 'Seuil supprimé avec succès.');
}
}
\ No newline at end of file
<?php
namespace App\Controllers;
use App\Controllers\session;
use App\Models\M_site;
class C_site extends BaseController
{
public function index()
{
$session=session();
$model = new M_site();
$data['sites'] = $model->findAll();
return view("configuration/V_site", $data);
}
// ajouter une nouvelle offre
public function store(){
$session=session();
$model = new M_site();
$data['libelle'] = $this->request->getPost('libelle');
if($model->insert($data)){
return redirect()->to('/site')->with('success', 'site ajouter avec succès');
} else {
return redirect()->back()->withInput()->with('error', 'Échec ');
}
}
// afficher les données d'une offre pour modification
public function edit($id)
{
$model = new M_site();
$data = $model->find($id);
return $this->response->setJSON($data);
}
// modifier une offre
public function update(){
$model = new M_site();
$id = $this->request->getPost('id_site');
$data['libelle'] = $this->request->getPost('libelle');
if($model->update($id, $data)){
return redirect()->to('/site')->with('success', 'site modifié avec succès');
} else {
return redirect()->back()->withInput()->with('error', 'Échec de la modification');
}
}
public function delete($id=null)
{
$model = new M_site();
$session=session();
if ($model->delete($id)) {
return $this->response->setJSON(['success' => true]);
} else {
return $this->response->setJSON(['success' => false]);
}
}
}
<?php
namespace App\Controllers;
use App\Controllers\BaseController;
use App\Controllers\session;
use App\Models\M_source;
class C_source extends BaseController
{
public function index()
{
$session=session();
$model = new M_source();
$data['sources'] = $model->findAll();
return view("configuration/V_source", $data);
}
// ajouter une nouvelle offre
public function store(){
$session=session();
$model = new M_source();
$data['libelle'] = $this->request->getPost('libelle');
if($model->insert($data)){
return redirect()->to('/source')->with('success', 'source ajouter avec succès');
} else {
return redirect()->back()->withInput()->with('error', 'Échec ');
}
}
// afficher les données d'une offre pour modification
public function edit($id)
{
$model = new M_source();
$session=session();
$data = $model->find($id);
return $this->response->setJSON($data);
}
// modifier une offre
public function update(){
$model = new M_source();
$id = $this->request->getPost('id_source');
$data['libelle'] = $this->request->getPost('libelle');
if($model->update($id, $data)){
return redirect()->to('/source')->with('success', 'source modifié avec succès');
} else {
return redirect()->back()->withInput()->with('error', 'Échec de la modification');
}
}
public function delete($id=null)
{
$model = new M_source();
$session=session();
if ($model->delete($id)) {
return $this->response->setJSON(['success' => true]);
} else {
return $this->response->setJSON(['success' => false]);
}
}
}
\ No newline at end of file
<?php
namespace App\Controllers;
use App\Controllers\session;
use App\Models\M_statut;
class C_statut extends BaseController
{
public function index()
{
$session=session();
$model = new M_statut();
$data['statuts'] = $model->findAll();
return view("configuration/V_statut", $data);
}
// ajouter une nouvelle offre
public function store(){
$session=session();
$model = new M_statut();
$data['libelle'] = $this->request->getPost('libelle');
if($model->insert($data)){
return redirect()->to('/statut')->with('success', 'statut_occupation ajouter avec succès');
} else {
return redirect()->back()->withInput()->with('error', 'Échec ');
}
}
// afficher les données d'une offre pour modification
public function edit($id)
{
$model = new M_statut();
$session=session();
$data = $model->find($id);
return $this->response->setJSON($data);
}
// modifier une offre
public function update(){
$model = new M_statut();
$id = $this->request->getPost('id_statut_occupation');
$data['libelle'] = $this->request->getPost('libelle');
if($model->update($id, $data)){
return redirect()->to('/statut')->with('success', 'statut modifié avec succès');
} else {
return redirect()->back()->withInput()->with('error', 'Échec de la modification');
}
}
public function delete($id=null)
{
$model = new M_statut();
$session=session();
if ($model->delete($id)) {
return $this->response->setJSON(['success' => true]);
} else {
return $this->response->setJSON(['success' => false]);
}
}
}
This diff is collapsed.
<?php
namespace App\Controllers;
use App\Controllers\BaseController;
use App\Controllers\session;
use App\Models\M_typeoffre;
class C_typeoffre extends BaseController
{
public function index()
{
$session=session();
$model = new M_typeoffre();
$data['typeoffres'] = $model->findAll();
return view("configuration/V_typeoffer", $data);
}
// ajouter une nouvelle offre
public function store(){
$session=session();
$model = new M_typeoffre();
$data['nom_type'] = $this->request->getPost('nom_type');
$data['code_typeoffre'] = $this->request->getPost('code_typeoffre');
if($model->insert($data)){
return redirect()->to('/typeoffre')->with('success', 'typeoffrer ajouter avec succès');
} else {
return redirect()->back()->withInput()->with('error', 'Échec ');
}
}
// afficher les données d'une offre pour modification
public function edit($id)
{
$model = new M_typeoffre();
$session=session();
$data = $model->find($id);
return $this->response->setJSON(['typeoffres' => $data]);
}
// modifier une offre
public function update(){
$model = new M_typeoffre();
$id = $this->request->getPost('id_typeoffre');
$data['nom_type'] = $this->request->getPost('nom_type');
$data['code_typeoffre'] = $this->request->getPost('code_typeoffre');
if($model->update($id, $data)){
return redirect()->to('/typeoffre')->with('success', 'typeoffrer modifié avec succès');
} else {
return redirect()->back()->withInput()->with('error', 'Échec de la modification');
}
}
public function delete($id=null)
{
$model = new M_typeoffre();
$session=session();
if ($model->delete($id)) {
return $this->response->setJSON(['success' => true]);
} else {
return $this->response->setJSON(['success' => false]);
}
}
}
\ No newline at end of file
......@@ -7,13 +7,10 @@ class Dashboard extends BaseController
{
public function index()
{
$session=session();
// 🔒 Vérification simple de connexion
if (!session()->get('logged_in')) {
return redirect()->to('/');
}
return view('template/layout');
}
public function tableaubordre()
{
return view('template/tableaubordre');
......
......@@ -4,16 +4,18 @@ namespace App\Controllers\Securite;
use App\Controllers\BaseController;
use App\Models\securite\M_menu;
use CodeIgniter\API\ResponseTrait;
use App\Controllers\session;
class C_sys_menu extends BaseController
{
public function index()
{
$session=session();
$Modelmenu = new M_menu();
$data['menus']= $Modelmenu->findAll();
return view("securite/V_menu",$data);
}
public function store(){
$session=session();
$Modelmenu = new M_menu();
$data=[
'libelle'=>$this->request->getPost('libelle'),
......@@ -28,6 +30,7 @@ class C_sys_menu extends BaseController
}
}
public function edit($id){
$session=session();
$Modelmenu = new M_menu();
$data['menus']= $Modelmenu->find($id);
return $this->response->setJSON($data);
......@@ -42,7 +45,7 @@ class C_sys_menu extends BaseController
];
if($Modelmenu->update($id,$data)){
return redirect()->to('/menu')->with('success', 'performances ajouter avec succès');
return redirect()->to('/menu')->with('success', 'Menu modifier avec succès');
} else {
return redirect()->back()->withInput()->with('error', 'Échec ');
}
......@@ -50,6 +53,7 @@ class C_sys_menu extends BaseController
public function delete($id=null)
{
$Modelmenu = new M_menu();
$session=session();
if ($Modelmenu->delete($id)) {
return $this->response->setJSON(['success' => true]);
} else {
......
......@@ -6,15 +6,18 @@ use App\Models\securite\M_profil;
use App\Models\securite\M_menu;
use App\Models\securite\M_sous_menu;
use App\Models\securite\M_action;
use App\Controllers\session;
class C_sys_profil extends BaseController
{
public function index()
{
$session=session();
$modelprofil=new M_profil();
$data['profils']=$modelprofil->findAll();
return view("securite/V_profil",$data);
}
public function store(){
$session=session();
$modelprofil=new M_profil();
$data=[
'libelle_type_profil'=>$this->request->getPost('libelle_type_profil'),
......@@ -29,6 +32,7 @@ class C_sys_profil extends BaseController
}
// modification
public function edit($id){
$session=session();
$modelprofil=new M_profil();
$data['profils']= $modelprofil->find($id);
return $this->response->setJSON($data);
......@@ -48,6 +52,7 @@ class C_sys_profil extends BaseController
public function delete($id=null)
{
$modelprofil=new M_profil();
$session=session();
if ($modelprofil->delete($id)) {
return $this->response->setJSON(['success' => true]);
} else {
......@@ -63,81 +68,6 @@ class C_sys_profil extends BaseController
return $this->response->setJSON($menus);
}
// public function getSousMenus($id_menu)
// {
// $idProfil = $this->request->getGet('id_type_profil') ?? 1;
// $db = \Config\Database::connect();
// $subMenus = $db->table('sys_sous_menu sm')
// ->select('sm.id_sous_menu, sm.libelle_sous_menu, sm.id_menu, a.d_read, a.d_add, a.d_upd, a.d_del')
// ->join('sys_type_action a', "a.id_sous_menu = sm.id_sous_menu AND a.id_type_profil = ".intval($idProfil), 'left')
// ->where('sm.id_menu', $id_menu)
// ->orderBy('sm.id_sous_menu', 'ASC')
// ->get()
// ->getResultArray();
// if (count($subMenus) === 0) {
// $actions = $db->table('sys_type_action')
// ->select('d_read, d_add, d_upd, d_del')
// ->where('id_type_profil', $idProfil)
// ->limit(1)
// ->get()
// ->getRowArray();
// $subMenus[] = [
// 'id_menu' => $id_menu,
// 'id_sous_menu' => -1 * $id_menu, // id unique par menu
// 'libelle_sous_menu' => 'Menu principal',
// 'd_read' => 0, // ⚡ ne coche rien par défaut
// 'd_add' => 0,
// 'd_upd' => 0,
// 'd_del' => 0
// ];
// }
// return $this->response->setJSON($subMenus);
// }
// la bon fonction
// public function getSousMenus($id_menu)
// {
// $idProfil = $this->request->getGet('id_type_profil') ?? 1;
// $db = \Config\Database::connect();
// // 1️⃣ Récupération des sous-menus existants
// $subMenus = $db->table('sys_sous_menu sm')
// ->select('sm.id_sous_menu, sm.libelle_sous_menu, sm.id_menu, a.d_read, a.d_add, a.d_upd, a.d_del')
// ->join('sys_type_action a', "a.id_sous_menu = sm.id_sous_menu AND a.id_type_profil = ".intval($idProfil), 'left')
// ->where('sm.id_menu', $id_menu)
// ->orderBy('sm.id_sous_menu', 'ASC')
// ->get()
// ->getResultArray();
// // 2️⃣ Récupérer le menu principal dans sys_type_action
// $menuPrincipal = $db->table('sys_type_action')
// ->select('id_type_profil, d_read, d_add, d_upd, d_del, id_menu, id_sous_menu')
// ->where('id_type_profil', $idProfil)
// ->where('id_menu', $id_menu)
// ->where('id_sous_menu <', 0) // menu principal a id_sous_menu négatif
// ->get()
// ->getRowArray();
// if($menuPrincipal){
// // Ajouter le menu principal au début
// array_unshift($subMenus, [
// 'id_menu' => $menuPrincipal['id_menu'],
// 'id_sous_menu' => $menuPrincipal['id_sous_menu'],
// 'libelle_sous_menu' => 'Menu principal',
// 'd_read' => $menuPrincipal['d_read'] ?? 0,
// 'd_add' => $menuPrincipal['d_add'] ?? 0,
// 'd_upd' => $menuPrincipal['d_upd'] ?? 0,
// 'd_del' => $menuPrincipal['d_del'] ?? 0
// ]);
// }
// return $this->response->setJSON($subMenus);
// }
public function getSousMenus($id_menu)
{
......@@ -152,9 +82,10 @@ class C_sys_profil extends BaseController
public function savePermissions()
{
$session = session();
$idProfil = (int) $this->request->getPost('id_type_profil');
$idMenu = (int) $this->request->getPost('id_menu');
$idSous = (int) ($this->request->getPost('id_sous_menu') ?? 0);
$idSous = (int) ($this->request->getPost('id_sous_menu') ?? -1);
$typeAction = $this->request->getPost('type_action');
$value = (int) $this->request->getPost('value');
......@@ -188,43 +119,6 @@ class C_sys_profil extends BaseController
]);
}
// public function savePermissions()
// {
// $db = \Config\Database::connect();
// $idProfil = $this->request->getPost('id_type_profil');
// $idMenu = $this->request->getPost('id_menu');
// $idSous = $this->request->getPost('id_sous_menu');
// $typeAction = $this->request->getPost('type_action');
// $value = $this->request->getPost('value');
// if (!$idProfil || !$idMenu || !$typeAction) {
// return $this->response->setJSON(['status'=>'error','message'=>'Paramètres manquants']);
// }
// $builder = $db->table('sys_type_action');
// $existing = $builder->where('id_type_profil', $idProfil)
// ->where('id_menu', $idMenu)
// ->where('id_sous_menu', $idSous)
// ->get()->getRow();
// if ($existing) {
// $builder->where('id_actions', $existing->id_actions)
// ->update([$typeAction => $value, 'date_modification'=>date('Y-m-d H:i:s')]);
// } else {
// $builder->insert([
// 'id_type_profil' => $idProfil,
// 'id_menu' => $idMenu,
// 'id_sous_menu' => $idSous,
// $typeAction => $value,
// 'date_creation' => date('Y-m-d H:i:s')
// ]);
// }
// return $this->response->setJSON(['status'=>'success']);
// }
}
\ No newline at end of file
......@@ -4,10 +4,12 @@ namespace App\Controllers\Securite;
use App\Controllers\BaseController;
use App\Models\securite\M_sous_menu;
use App\Models\securite\M_menu;
use App\Controllers\session;
class C_sys_smenu extends BaseController
{
public function index()
{
$session=session();
$modelsousmenu=new M_sous_menu();
$Modelmenu=new M_menu();
$data['smenus']=$modelsousmenu->getSousMenusAvecMenu();
......@@ -16,6 +18,7 @@ class C_sys_smenu extends BaseController
}
public function store(){
$modelsousmenu=new M_sous_menu();
$session=session();
$data=[
'libelle_sous_menu'=>$this->request->getPost('libelle_sous_menu'),
'id_menu'=>$this->request->getPost('id_menu'),
......@@ -32,6 +35,7 @@ class C_sys_smenu extends BaseController
public function edit($id){
$modelsousmenu=new M_sous_menu();
$session=session();
$data['smenus']= $modelsousmenu->find($id);
return $this->response->setJSON($data);
......@@ -46,14 +50,15 @@ class C_sys_smenu extends BaseController
];
// var_dump($data);exit;
if( $modelsousmenu->update($id,$data)){
return redirect()->to('/sousmenu')->with('success', 'performances ajouter avec succès');
return redirect()->to('/sousmenu')->with('success', 'Sous_menu modifier avec succès');
} else {
return redirect()->back()->withInput()->with('error', 'Échec ');
}
}
public function delete($id=null)
{
$modelsousmenu=new M_sous_menu();
$modelsousmenu=new M_sous_menu();
$session=session();
if ($modelsousmenu->delete($id)) {
return $this->response->setJSON(['success' => true]);
} else {
......
This diff is collapsed.
<?php
use App\Models\M_structure;
use App\Models\M_classes
;
function codificationCreerClasse($code_str)
{
$structureModel = new M_structure();
$structure = $structureModel->select('structure.*, type_offre.nom_type as nom_offre')
->join('type_offre', 'type_offre.id_type_offre = structure.id_type_offre')
->where('structure.code_str', $code_str)
->first();
$libelle = strtoupper($structure['nom_offre']);
$codeTypeOffre = "";
// Application stricte de la nomenclature I.2.3.3
if ($libelle == "ECOLE COMMUNAUTAIRE DE BASE" || $libelle == "ECB") {
$codeTypeOffre = "ECB";
} elseif ($libelle == "CLASSE PASSERELLE") {
$codeTypeOffre = "CLASSE-PASSERELLE";
} elseif ($libelle == "CLASSES D’ALPHABÉTISATION FONCTIONNELLE" || $libelle == "CAF") {
$codeTypeOffre = "CAF";
} else {
// Nettoyage générique pour les autres cas
$codeTypeOffre = str_replace([' ', '’', '\''], '-', $libelle);
}
$classeModel = new M_classes();
$numOrdre = $classeModel->where('code_str', $code_str)->countAllResults() + 1;
return $codeTypeOffre . $numOrdre;
}
function generateCodeClasse($code_str)
{
$db = \Config\Database::connect();
// 1. Récupérer le type d'offre lié à cette structure
$structure = $db->table('structure')
->select('type_offre.code_typeoffre')
->join('type_offre', 'type_offre.id_type_offre = structure.id_type_offre')
->where('structure.code_str', $code_str)
->get()
->getRow();
if (!$structure) {
throw new \Exception("Structure non trouvée pour le code : " . $code_str);
}
// 2. Déterminer le préfixe textuel (Nomenclature I.2.3.3)
$prefixe = $structure->code_typeoffre;
// Note : Si code_typeoffre est "DAARA COM", on peut le transformer en "DAARA-COM"
$prefixe = str_replace(' ', '-', strtoupper($prefixe));
// 3. Compter le nombre de classes existantes pour cette structure précise
// Cela permet de générer le numéro d'ordre (1, 2, 3...)
$numOrdre = $db->table('classes')
->where('code_str', $code_str)
->countAllResults() + 1;
// 4. Assemblage final (Exemple : CAF1, ECB2, CLASSE-PASSERELLE1)
$codeClasse = $prefixe . $numOrdre;
// 5. Sécurité : Vérifier si ce code de classe est vraiment unique dans la table classes
// (Utile si des classes ont été supprimées ou renommées manuellement)
$exists = $db->table('classes')->where('code_classe', $codeClasse)->countAllResults();
if ($exists > 0) {
// Si par hasard le code existe (ex: CAF1 existe déjà),
// on incrémente jusqu'à trouver un numéro libre
while ($db->table('classes')->where('code_classe', $prefixe . $numOrdre)->countAllResults() > 0) {
$numOrdre++;
}
$codeClasse = $prefixe . $numOrdre;
}
return $codeClasse;
}
//
\ No newline at end of file
<?php namespace App\Models;
use CodeIgniter\Model;
class M_apprenants extends Model
{
protected $table = 'apprenant';
protected $primaryKey = 'id_apprenant';
protected $allowedFields = [
'id_enfant', 'id_classe', 'date_inscription', 'date_sortie',
];
protected $useTimestamps = true;
protected $createdField = 'created_at';
protected $updatedField = 'updated_at';
protected $deletedField = 'date_suppression';
// public function getApprenantsAvecDetails()
// {
// return $this->db->table('apprenant a')
// ->join('enfant e', 'a.id_enfant = e.id_enfant', 'left') // infos enfant
// ->join('classes c', 'a.id_classe = c.id_classe', 'left') // infos classe
// ->join('facilitateurs f', 'c.id_facilitateur = f.id_facilitateur', 'left') // infos facilitateur
// ->select('a.*,
// e.nom as nom_enfant, e.prenom as prenom_enfant, e.date_naissance,,
// c.code_classe as code_classe, c.nom_classe as nom_classe, c.code_str as code_str, c.nombre_place, c.id_niveau as niveau,
// f.nom as nom_facilitateur, f.prenom as prenom_facilitateur')
// ->get()
// ->getResultArray();
// }
public function getApprenantsAvecDetails()
{
return $this->db->table('apprenant a')
->join('enfant e', 'a.id_enfant = e.id_enfant', 'left') // infos enfant
->join('classes c', 'a.id_classe = c.id_classe', 'left') // infos classe
->join('facilitateurs f', 'c.id_facilitateur = f.id_facilitateur', 'left')
->join('niveaux n', 'c.id_niveau = n.id_niveau', 'left') // infos niveau
->select([
'a.id_apprenant',
'a.id_enfant',
'a.id_classe',
'a.date_inscription',
'e.nom as nom_enfant',
'e.prenom as prenom_enfant',
'e.lieu_naissance as lieu_naissance',
'e.date_naissance as date_naissance',
'c.nom_classe',
'c.code_classe',
'c.code_str as structure',
'c.id_niveau as niveau',
'n.nom as nom_niveau',
'c.nombre_place',
'f.nom as nom_facilitateur',
'f.prenom as prenom_facilitateur'
])
->get()
->getResultArray();
}
// Exemple de fonction dans votre Modèle
public function getApprenantsParNiveau($id_classe, $niveau) {
return $this->db->table('apprenants')
->select('apprenants.*, classes.nom_classe, facilitateurs.nom as nom_facilitateur, facilitateurs.prenom as prenom_facilitateur')
->join('classes', 'classes.id_classe = apprenants.id_classe')
->join('facilitateurs', 'facilitateurs.id_facilitateur = classes.id_facilitateur')
->where('apprenants.id_classe', $id_classe)
->where('apprenants.niveau', $niveau) // Le filtre est ici
->get()
->getResultArray();
}
}
\ No newline at end of file
<?php
namespace App\Models;
use CodeIgniter\Model;
class M_classes extends Model
{
protected $table = 'classes';
protected $primaryKey = 'id_classe';
protected $useAutoIncrement = true;
protected $returnType = 'array';
protected $useSoftDeletes = false;
protected $allowedFields = ['code_classe', 'nom_classe', 'langue_utilise', 'nombre_place','date_ouverture', 'id_facilitateur', 'id_niveau', 'code_str'];
protected $useTimestamps = true;
protected $createdField = 'date_creation';
protected $updatedField = 'date_modification';
protected $deletedField = 'date_suppression';
// public function getClassesAvecDetails($code_str)
// {
// return $this->db->table('classes c')
// ->select('c.*,
// n.nom as niveau_nom,
// f.nom as facilitateur_nom,
// f.prenom as facilitateur_prenom')
// ->join('niveaux n', 'n.id_niveau = c.id_niveau', 'left')
// ->join('facilitateurs f', 'f.id_facilitateur = c.id_facilitateur', 'left') // 👈 left join car peut être NULL
// ->where('c.code_str', $code_str)
// ->get()
// ->getResultArray();
// }
public function getClassesAvecDetails()
{
return $this->db->table('classes c')
->join('facilitateurs f', 'f.id_facilitateur = c.id_facilitateur', 'left')
->join('niveaux n', 'n.id_niveau = c.id_niveau', 'left')
->join('structure s', 's.code_str = c.code_str', 'left')
->select('c.*,
f.nom as facilitateur_nom,
f.prenom as facilitateur_prenom,
n.nom AS niveau,
s.nom_structure AS nom_structure')
->get()
->getResultArray();
}
// public function getClassesAvecDetails($code_str)
// {
// return $this->db->table('classes c')
// ->select('
// c.id_classe,
// c.nom_classe,
// c.code_classe,
// c.nombre_place,
// c.date_ouverture,
// c.code_str,
// n.nom AS niveau,
// f.nom AS nom_facilitateur,
// f.prenom AS prenom_facilitateur
// ')
// ->join('facilitateurs f', 'f.id_facilitateur = c.id_facilitateur', 'left')
// ->join('niveaux n', 'n.id_niveau = c.id_niveau', 'left')
// ->where('c.code_str', $code_str)
// ->get()
// ->getResultArray();
// }
public function getClassesByFacilitateur($idFac)
{
return $this->db->table('classes c')
->select('
c.*,
f.nom AS nom_facilitateur,
f.prenom AS prenom_facilitateur,
n.nom AS niveau
')
->join('facilitateurs f', 'f.id_facilitateur = c.id_facilitateur', 'left')
->join('niveaux n', 'n.id_niveau = c.id_niveau', 'left')
->where('c.id_facilitateur', $idFac)
->get()
->getResultArray();
}
// ✅ Affecter facilitateur
public function affecter($id_classe, $id_facilitateur)
{
return $this->update($id_classe, [
'id_facilitateur' => $id_facilitateur
]);
}
public function getClassesAvecDetail($code_str)
{
return $this->db->table('classes c')
->select('
c.*,
f.nom AS nom_facilitateur,
f.prenom AS prenom_facilitateur,
n.nom AS niveau,
s.nom_structure AS structure
')
->join('facilitateurs f', 'f.id_facilitateur = c.id_facilitateur', 'left')
->join('niveaux n', 'n.id_niveau = c.id_niveau', 'left')
->join('structure s', 's.code_str = c.code_str', 'left')
->where('c.code_str', $code_str)
->get()
->getResultArray();
}
public function getStructureByFacilitateur($idFac)
{
return $this->db->table('facilitateurs f')
->select('f.id_facilitateur, f.id_operateur')
->where('f.id_facilitateur', $idFac)
->get()
->getRowArray();
}
public function getClasseDetail($id_classe)
{
$db = \Config\Database::connect();
return $db->table('classes c')
->select('
c.*,
n.nom as niveau_nom,
f.nom as facilitateur_nom,
f.prenom as facilitateur_prenom,
s.nom_structure,
COUNT(a.id_apprenant) as nb_apprenants
')
->join('niveaux n', 'n.id_niveau = c.id_niveau', 'left')
->join('facilitateurs f', 'f.id_facilitateur = c.id_facilitateur', 'left')
->join('structure s', 's.code_str = c.code_str', 'left')
->join('apprenant a', 'a.id_classe = c.id_classe', 'left')
->where('c.id_classe', $id_classe)
->get()
->getRowArray();
}
}
\ No newline at end of file
<?php
namespace App\Models;
use CodeIgniter\Model;
class M_cours extends Model
{
protected $table = 'cours';
protected $primaryKey = 'id_cours';
protected $useAutoIncrement = true;
protected $returnType = 'array';
protected $useSoftDeletes = false;
protected $allowedFields = ['nom_cours','id_niveau'];
protected $useTimestamps = true;
protected $createdField = 'date_creation';
protected $updatedField = 'date_modification';
protected $deletedField = 'date_suppression';
protected $validationRules = [];
protected $validationMessages = [];
protected $skipValidation = false;
}
\ No newline at end of file
<?php
namespace App\Models;
use CodeIgniter\Model;
class M_critere extends Model
{
protected $table = 'critere';
protected $primaryKey = 'id_critere';
protected $allowedFields = ['age_min', 'age_max','date_ref', 'id_type_offre'];
protected $useTimestamps = true;
protected $createdField = 'date_creation';
protected $updatedField = 'date_modification';
protected $deletedField = 'date_supprission';
public function getCriteresWithOffre()
{
return $this->select('critere.*, type_offre.nom_type') // Vérifiez bien que c'est 'nom_type' en base
->join('type_offre', 'type_offre.id_type_offre = critere.id_type_offre')
->findAll();
}
}
\ No newline at end of file
<?php
namespace App\Models;
use CodeIgniter\Model;
class M_emploi extends Model
{
protected $table = 'emplois';
protected $primaryKey = 'id_emploi';
protected $useAutoIncrement = true;
protected $returnType = 'array';
protected $useSoftDeletes = false;
protected $allowedFields = ['heure_debut','heure_fin','jour','id_cours'];
protected $useTimestamps = true;
protected $createdField = 'date_creation';
protected $updatedField = 'date_modification';
protected $deletedField = 'date_suppression';
protected $validationRules = [];
protected $validationMessages = [];
protected $skipValidation = false;
}
\ No newline at end of file
This diff is collapsed.
<?php
namespace App\Models;
use CodeIgniter\Model;
class M_enfantselectionne extends Model
{
protected $table = 'enfants_selectionnes';
protected $primaryKey = 'id_selection';
protected $allowedFields = ['id_enfant', 'id_critere','date_selection','statut','rang_priorite'];
protected $useTimestamps = true;
protected $createdField = 'date_creation';
protected $updatedField = 'date_modification';
protected $deletedField = 'date_supprission';
public function getEnfantsEligibles()
{
$builder = $this->db->table('enfant e');
$builder->select("
e.*,
TIMESTAMPDIFF(YEAR, e.date_naissance, c.date_ref) AS age_actuel
");
$builder->join('critere c', 'c.id_critere = 5');
$builder->where("
TIMESTAMPDIFF(YEAR, e.date_naissance, c.date_ref)
BETWEEN c.age_min AND c.age_max
");
$builder->groupStart()
->where('e.situation_scolaire', 'descolaire')
->orWhere('e.situation_scolaire', 'non_scolaire')
->groupEnd();
$builder->where('e.date_naissance IS NOT NULL');
$builder->where('e.date_naissance !=', '0000-00-00');
$builder->where('e.date_naissance !=', '1970-01-01');
// ORDER BY personnalisé
$builder->orderBy("CASE WHEN e.handicap = 'oui' THEN 1 ELSE 2 END", '', false);
$builder->orderBy("
CASE
WHEN e.situation_familiale = 'orphelin' THEN 1
WHEN e.situation_familiale = 'parents_divorces' THEN 2
WHEN e.situation_familiale = 'sous_tutorat' THEN 3
ELSE 4
END
", '', false);
$builder->orderBy("CASE WHEN e.sexe = 'F' THEN 1 ELSE 2 END", '', false);
$builder->orderBy("
CASE
WHEN TIMESTAMPDIFF(YEAR, e.date_naissance, c.date_ref) < 12
THEN TIMESTAMPDIFF(YEAR, e.date_naissance, c.date_ref) * -1
ELSE TIMESTAMPDIFF(YEAR, e.date_naissance, c.date_ref)
END
", '', false);
return $builder->get()->getResultArray();
}
}
\ No newline at end of file
<?php
namespace App\Models;
use CodeIgniter\Model;
class M_faculitateur extends Model
{
protected $table = 'facilitateurs';
protected $primaryKey = 'id_facilitateur';
protected $allowedFields = ['id_facilitateur','nom','prenom','matricule','id_operateur','email_pro','telephone'];
protected $useTimestamps = true;
protected $createdField = 'date_creation';
protected $updatedField = 'date_modification';
protected $deletedField = 'date_supprission';
// FacilitateurModel.php
public function getMesFacilitateurs($id)
{
// Remplacez 'id_operateur' par le nom EXACT de la colonne dans votre table SQL
return $this->where('id_operateur', $id)->findAll();
}
// public function getMesFacilitateurs($idOperateur)
// {
// return $this->where('id_operateur', $idOperateur)
// ->findAll();
// }
}
\ No newline at end of file
<?php
namespace App\Models;
use CodeIgniter\Model;
class M_niveau extends Model
{
protected $table = 'niveaux';
protected $primaryKey = 'id_niveau';
protected $useAutoIncrement = true;
protected $returnType = 'array';
protected $useSoftDeletes = false;
protected $allowedFields = ['nom', 'etape'];
protected $useTimestamps = true;
protected $createdField = 'date_creation';
protected $updatedField = 'date_modification';
protected $deletedField = 'date_suppression';
protected $validationRules = [];
protected $validationMessages = [];
protected $skipValidation = false;
public function getSeuilsAvecNiveau()
{
return $this->db->table('seuil s')
->join('niveaux n', 'n.id_niveau = s.id_niveau')
->select('s.*, n.nom AS niveau')
->get()
->getResultArray();
}
}
\ No newline at end of file
<?php
namespace App\Models;
use CodeIgniter\Model;
class M_operateur extends Model
{
protected $table = 'operateurs';
protected $primaryKey = 'id_operateur';
protected $allowedFields = ['id_operateur','nom','prenom','type_operateur','email_pro','denomination','adresse','telephone','numero_agreement'];
protected $useTimestamps = true;
protected $createdField = 'date_creation';
protected $updatedField = 'date_modification';
protected $deletedField = 'date_supprission';
}
\ No newline at end of file
<?php
namespace App\Models;
use CodeIgniter\Model;
class M_parent extends Model
{
protected $table = 'parents';
protected $primaryKey = 'id_parent';
protected $allowedFields = ['prenom_parent', 'nom_parent', 'telephone_parent', 'lien_parente','profession_parent'];
protected $useTimestamps = true;
protected $createdField = 'date_creation';
protected $updatedField = 'date_modification';
protected $deletedField = 'date_supprission';
protected $validationRules = [];
protected $validationMessages = [];
protected $skipValidation = false;
}
\ No newline at end of file
<?php
namespace App\Models;
use CodeIgniter\Model;
class M_personnel extends Model
{
protected $table = 'personnels';
protected $primaryKey = 'id_personnel';
protected $allowedFields = ['nom', 'prenom', 'email_pro', 'sexe','ien','CODE_ADMINISTRATIF','nom_structure','statut','numero_agreement','matricule'];
protected $useTimestamps = true;
protected $createdField = 'date_creation';
protected $updatedField = 'date_modification';
protected $deletedField = 'date_supprission';
public function getPersonnelWithStructure()
{
return $this->db->table('cod_structure')
->select('NOM_STRUCTURE, CODE_ADMINISTRATIF')
// Le CASE pour mettre le 129 en premier
->orderBy("CASE WHEN CODE_ADMINISTRATIF LIKE '129%' THEN 0 ELSE 1 END", "ASC", false)
->orderBy('NOM_STRUCTURE', 'ASC')
->get()
->getResultArray();
}
// fonction pour l'api
// public function getPersonnelByIEN($ien)
// {
// return $this->db->table('personnels p')
// ->select('p.nom, p.prenom, p.email_pro, p.ien AS ien_pers, p.CODE_ADMINISTRATIF AS code_str, c.NOM_STRUCTURE')
// ->join('cod_structure c', 'p.CODE_ADMINISTRATIF = c.ID_STRUCTURE', 'left')
// ->where('p.ien', $ien)
// ->get()
// ->getRowArray();
// }
public function getPersonnelByIEN($ien)
{
$ien = strtoupper(trim($ien));
return $this->db->table('personnels p')
->select('p.nom, p.prenom, p.email_pro, p.ien AS ien_pers, p.CODE_ADMINISTRATIF AS CODE_ADMINISTRATIF, p.nom_structure')
->where('UPPER(p.ien)', $ien)
->get()
->getRowArray();
}
// archive d'un personnel
// public function archiver($id)
// {
// return $this->where('statut', '1')->findAll();
// }
// Archiver le personnel
public function archiverPersonnel($id)
{
return $this->update($id, ['statut' => '-1']);
}
// Restaurer le personnel
public function restaurer($id)
{
return $this->update($id, ['statut' => '1']);
}
// Récupérer les actifs
public function getPersonnelActif()
{
return $this->where('statut', '1')->findAll();
}
// Récupérer les archivés
public function getPersonnelArchive()
{
return $this->where('statut', '-1')->findAll();
}
}
\ No newline at end of file
<?php
namespace App\Models;
use CodeIgniter\Model;
class M_pretest extends Model
{
protected $table = 'pretexte';
protected $primaryKey = 'id_pretexte';
protected $allowedFields = ['note', 'date_test', 'id_enfant'];
protected $useTimestamps = true;
protected $createdField = 'date_creation';
protected $updatedField = 'date_modification';
protected $deletedField = 'date_supprission';
public function affecterEnfant($id_enfant, $note)
{
$db = \Config\Database::connect();
// 1. Trouver le niveau/classe correspondant à la note
$builder = $db->table('niveaux n');
$builder->select('n.id_niveau, n.nom');
$builder->join('seuil s', 'n.id_niveau = s.id_niveau');
$builder->where('s.note_min <=', $note);
$builder->where('s.note_max >=', $note);
$resultat = $builder->get()->getRow();
$id_classe = $resultat ? $resultat->id_niveau : null;
$nom_niveau = $resultat ? $resultat->nom : "Non défini";
// 2. Mise à jour de la table 'pretexte' (historique du test)
$existingTest = $this->where('id_enfant', $id_enfant)->first();
$dataPretest = [
'id_enfant' => $id_enfant,
'note' => $note,
'date_test' => date('Y-m-d')
];
if ($existingTest) {
$this->update($existingTest['id_pretexte'], $dataPretest);
} else {
$this->insert($dataPretest);
}
// 3. Insertion ou Mise à jour de la table 'apprenant'
$builderApprenant = $db->table('apprenant');
$existingApprenant = $builderApprenant->where('id_enfant', $id_enfant)->get()->getRow();
$dataApprenant = [
'id_enfant' => $id_enfant,
'id_classe' => $id_classe, // Correspond à l'id_niveau trouvé
'date_inscription' => date('Y-m-d'),
'date_creation' => date('Y-m-d H:i:s'),
'date_modification' => date('Y-m-d H:i:s')
];
if ($existingApprenant) {
// Si l'enfant existe déjà, on met à jour sa classe et la date de modif
unset($dataApprenant['date_creation']); // On garde la date de création originale
$builderApprenant->where('id_enfant', $id_enfant)->update($dataApprenant);
} else {
// Nouvel apprenant
$builderApprenant->insert($dataApprenant);
}
return $nom_niveau;
}
// ── Détermine le niveau selon échelon + note ──────────
public function determinerNiveau($note, $echelon)
{
return $this->db->query("
SELECT
s.id_niveau,
s.note_min,
s.note_max,
n.nom AS nom_niveau,
n.etape
FROM seuil s
JOIN niveaux n ON n.id_niveau = s.id_niveau
WHERE s.note_min <= ?
AND s.note_max >= ?
AND n.etape = ?
LIMIT 1
", [$note, $note, 'etape'.($echelon === 1 ? '1' : '2')])
->getRowArray();
}
public function getPretestes()
{
return $this->db->query("
SELECT
p.*,
e.prenom, e.nom, e.sexe,
n.nom AS nom_niveau,
n.etape
FROM pretexte p
JOIN enfant e ON e.id_enfant = p.id_enfant
LEFT JOIN niveaux n ON n.id_niveau = p.id_niveau
ORDER BY p.date_test DESC
")->getResultArray();
}
}
\ No newline at end of file
<?php
namespace App\Models;
use CodeIgniter\Model;
class M_promoteurs extends Model
{
protected $table = 'promoteur';
protected $primaryKey = 'id_promoteur';
protected $allowedFields = ['libelle'];
protected $useTimestamps = true;
protected $createdField = 'date_creation';
protected $updatedField = 'date_modification';
protected $deletedField = 'date_supprission';
}
\ No newline at end of file
<?php
namespace App\Models;
use CodeIgniter\Model;
class M_seuil extends Model
{
protected $table = 'seuil';
protected $primaryKey = 'id_seuil';
protected $allowedFields = ['id_niveau', 'note_min', 'note_max'];
protected $useTimestamps = true;
protected $createdField = 'date_creation';
protected $updatedField = 'date_modification';
protected $deletedField = 'date_supprission';
public function getSeuilsAvecNiveau()
{
return $this->db->table('seuil s')
->join('niveaux n', 'n.id_niveau = s.id_niveau')
->select('s.*, n.nom AS niveau')
->get()
->getResultArray();
}
}
\ No newline at end of file
<?php
namespace App\Models;
use CodeIgniter\Model;
class M_site extends Model
{
protected $table = 'site';
protected $primaryKey = 'id_site';
protected $allowedFields = ['libelle'];
protected $useTimestamps = true;
protected $createdField = 'date_creation';
protected $updatedField = 'date_modification';
protected $deletedField = 'date_supprission';
}
\ No newline at end of file
<?php
namespace App\Models;
use CodeIgniter\Model;
class M_source extends Model
{
protected $table = 'source';
protected $primaryKey = 'id_source';
protected $allowedFields = ['libelle'];
protected $useTimestamps = true;
protected $createdField = 'date_creation';
protected $updatedField = 'date_modification';
protected $deletedField = 'date_supprission';
}
\ No newline at end of file
<?php
namespace App\Models;
use CodeIgniter\Model;
class M_statut extends Model
{
protected $table = 'statut_occupation';
protected $primaryKey = 'id_statut_occupation';
protected $allowedFields = ['libelle'];
protected $useTimestamps = true;
protected $createdField = 'date_creation';
protected $updatedField = 'date_modification';
protected $deletedField = 'date_supprission';
}
\ No newline at end of file
This diff is collapsed.
<?php
namespace App\Models;
use CodeIgniter\Model;
class M_superviseur extends Model
{
protected $table = 'superviseurs';
protected $primaryKey = 'id_superviseur';
protected $allowedFields = ['nom','prenom','email','adresse','telephone','profession'];
protected $useTimestamps = true;
protected $createdField = 'date_creation';
protected $updatedField = 'date_modification';
protected $deletedField = 'date_supprission';
}
\ No newline at end of file
<?php
namespace App\Models;
use CodeIgniter\Model;
class M_typeoffre extends Model
{
protected $table = 'type_offre';
protected $primaryKey = 'id_type_offre';
protected $allowedFields = ['nom_type', 'code_typeoffre'];
protected $useTimestamps = true;
protected $createdField = 'date_creation';
protected $updatedField = 'date_modification';
protected $deletedField = 'date_supprission';
}
\ No newline at end of file
......@@ -17,7 +17,7 @@ class M_action extends Model
protected $deletedField = 'date_supprission';
public function getActionsByProfil($profil_id)
{
......
......@@ -8,7 +8,7 @@ class M_user extends Model
{
protected $table = 'sys_users';
protected $primaryKey = 'id';
protected $allowedFields = ['prenom','nom','nom_structure','email_pro','statut','IEN','password','id_type_profil','code_str','ia','ief'];
protected $allowedFields = ['prenom','nom','nom_structure','email_pro','statut','ien','password','id_type_profil','code_str','sexe'];
protected $useTimestamps = true;
......@@ -123,13 +123,11 @@ public function getFilteredMenus()
return $filteredMenus;
}
public function toggleStatus($userId, $statut)
public function toggleStatus($userId, $statut)
{
return $this->update($userId, [
'statut' => $statut,
'date_modification' => date('Y-m-d H:i:s')
]);
return $this->update($userId, ['statut' => $statut]);
}
// model pour la table atlas
public function getAllIA()
{
......@@ -192,14 +190,9 @@ public function getFilteredMenus()
->get()
->getRowArray();
}
//
public function getPersonnelByIEN($ien)
{
return $this->db->table('personnel')
->where('ien_pers', $ien)
->get()
->getRowArray();
}
}
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>Moltran - Responsive Bootstrap 4 Admin Dashboard Template</title>
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta content="A fully featured admin theme which can be used to build CRM, CMS, etc." name="description" />
<meta content="Coderthemes" name="author" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<link rel="shortcut icon" href="assets/images/favicon_1.ico">
<!-- Custom Files -->
<link href="<?=base_url()?>assets/css/bootstrap.min.css" rel="stylesheet" type="text/css" />
<link href="<?=base_url()?>assets/css/icons.css" rel="stylesheet" type="text/css" />
<link href="<?=base_url()?>assets/css/style.css" rel="stylesheet" type="text/css" />
<script src="<?=base_url()?>assets/js/modernizr.min.js"></script>
</head>
<body>
<div class="wrapper-page">
<div class="card card-pages">
<div class="card-header bg-img">
<div class="bg-overlay"></div>
<h3 class="text-center m-t-10 text-white"> Reset Password </h3>
</div>
<div class="card-body">
<form method="post" action="#" class="text-center">
<div class="alert alert-info alert-dismissible">
<button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
Enter your <b>Email</b> and instructions will be sent to you!
</div>
<div class="form-group m-b-0">
<div class="input-group">
<input type="email" class="form-control" placeholder="Enter Email" required="">
<span class="input-group-append"> <button type="submit" class="btn btn-primary waves-effect waves-light">Reset</button> </span>
</div>
</div>
</form>
</div>
</div>
</div>
<script>
var resizefunc = [];
</script>
<!-- Main -->
<script src="<?=base_url()?>assets/js/jquery.min.js"></script>
<script src="<?=base_url()?>assets/js/bootstrap.bundle.min.js"></script>
<script src="<?=base_url()?>assets/js/detect.js"></script>
<script src="<?=base_url()?>assets/js/fastclick.js"></script>
<script src="<?=base_url()?>assets/js/jquery.slimscroll.js"></script>
<script src="<?=base_url()?>assets/js/jquery.blockUI.js"></script>
<script src="<?=base_url()?>assets/js/waves.js"></script>
<script src="<?=base_url()?>assets/js/wow.min.js"></script>
<script src="<?=base_url()?>assets/js/jquery.nicescroll.js"></script>
<script src="<?=base_url()?>assets/js/jquery.scrollTo.min.js"></script>
<script src="<?=base_url()?>assets/js/jquery.app.js"></script>
</body>
</html>
\ No newline at end of file
......@@ -60,8 +60,18 @@
</div>
</div>
<div class="form-group">
<div class="col-12">
<!-- <div class="checkbox checkbox-primary">
<input id="checkbox-signup" type="checkbox">
<label for="checkbox-signup">
Remember me
</label>
</div> -->
</div>
</div>
<div class="form-group text-center m-t-40">
<div class="col-12">
<button class="btn btn-primary btn-lg w-lg waves-effect waves-light"
......@@ -69,6 +79,17 @@
</div>
</div>
<div class="form-group row m-t-30">
<div class="col-sm-7">
<a href="<?= site_url('reset') ?>"><i class="fa fa-lock m-r-5"></i>Mot de passe oublié?</a>
</div>
<div class="col-sm-5 text-right">
<a href="<?= site_url('inscrire') ?>">Crèe un compte</a>
</div>
</div>
</form>
</div>
......@@ -82,18 +103,18 @@
</script>
<!-- Main -->
<script src="assets/js/jquery.min.js"></script>
<script src="assets/js/bootstrap.bundle.min.js"></script>
<script src="assets/js/detect.js"></script>
<script src="assets/js/fastclick.js"></script>
<script src="assets/js/jquery.slimscroll.js"></script>
<script src="assets/js/jquery.blockUI.js"></script>
<script src="assets/js/waves.js"></script>
<script src="assets/js/wow.min.js"></script>
<script src="assets/js/jquery.nicescroll.js"></script>
<script src="assets/js/jquery.scrollTo.min.js"></script>
<script src="assets/js/jquery.app.js"></script>
<script src="<?=base_url()?>assets/js/jquery.min.js"></script>
<script src="<?=base_url()?>assets/js/bootstrap.bundle.min.js"></script>
<script src="<?=base_url()?>assets/js/detect.js"></script>
<script src="<?=base_url()?>assets/js/fastclick.js"></script>
<script src="<?=base_url()?>assets/js/jquery.slimscroll.js"></script>
<script src="<?=base_url()?>assets/js/jquery.blockUI.js"></script>
<script src="<?=base_url()?>assets/js/waves.js"></script>
<script src="<?=base_url()?>assets/js/wow.min.js"></script>
<script src="<?=base_url()?>assets/js/jquery.nicescroll.js"></script>
<script src="<?=base_url()?>assets/js/jquery.scrollTo.min.js"></script>
<script src="<?=base_url()?>assets/js/jquery.app.js"></script>
</body>
......
<?php if (!empty($classes)) : ?>
<table class="table table-striped">
<thead>
<tr>
<th>Code</th>
<th>Nom</th>
<th>Capacité</th>
<th>Niveau</th>
<th>Structure</th>
<th>Action</th>
</tr>
</thead>
<tbody>
<?php foreach($classes as $classe): ?>
<tr>
<td><?= esc($classe['code_classe']) ?></td>
<td><?= esc($classe['nom_classe']) ?></td>
<td><?= esc($classe['nombre_place']) ?></td>
<td><?= esc($classe['niveau']) ?></td>
<td><?= esc($classe['structure'] ?? $classe['nom_structure'] ?? '-') ?></td>
<td></td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
<?php else: ?>
<p class="text-center">Aucune classe trouvée</p>
<?php endif; ?>
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
......@@ -3,21 +3,32 @@
<head>
<meta charset="utf-8" />
<title>Moltran - Responsive Bootstrap 4 Admin Dashboard Template</title>
<title>Classe_passerelle</title>
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta content="A fully featured admin theme which can be used to build CRM, CMS, etc." name="description" />
<meta content="Coderthemes" name="author" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<link rel="shortcut icon" href="<?=base_url()?>assets/images/favicon_1.ico">
<link href="../plugins/sweetalert2/sweetalert2.css" rel="stylesheet" type="text/css">
<link href="<?=base_url()?>assets/plugins/sweetalert2/sweetalert2.css" rel="stylesheet" type="text/css">
<link href="<?=base_url()?>assets/css/style.css" rel="stylesheet">
<!-- Custom Files -->
<link href="<?=base_url()?>assets/css/bootstrap.min.css" rel="stylesheet" type="text/css" />
<link href="<?=base_url()?>assets/css/icons.css" rel="stylesheet" type="text/css" />
<link href="<?=base_url()?>assets/css/style.css" rel="stylesheet" type="text/css" />
<!-- DataTables -->;
<!-- Bootstrap 4 DataTables CSS -->
<link href="<?=base_url()?>assets/plugins/datatables/jquery.dataTables.min.css" rel="stylesheet" type="text/css" />
<link href="<?=base_url()?>assets/plugins/datatables/buttons.bootstrap4.min.css" rel="stylesheet" type="text/css" />
<link href="<?=base_url()?>assets/plugins/datatables/fixedHeader.bootstrap4.min.css" rel="stylesheet"
type="text/css" />
<link href="<?=base_url()?>assets/plugins/datatables/responsive.bootstrap4.min.css" rel="stylesheet"
type="text/css" />
<link href="<?=base_url()?>assets/plugins/datatables/dataTables.bootstrap4.min.css" rel="stylesheet"
type="text/css" />
<link href="<?=base_url()?>assets/plugins/datatables/scroller.bootstrap4.min.css" rel="stylesheet"
type="text/css" />
<script src="<?=base_url()?>assets/js/modernizr.min.js"></script>
</head>
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment