# CI3 → CI4 Migration Summary

## Completed

### Config & base
- **CmmConstants** (`app/Config/CmmConstants.php`) – Role IDs, date formats, app constants from CI3 `constants.php`.
- **BaseController** – Helpers `['form', 'url']` loaded for all controllers.
- **Home** – Redirects to `tp/te/login` (same behavior as CI3).

### Models (already in project)
- 131+ domain models under `App\Models` (SecuritiesModel, UtilityModel, TeacherModel, etc.).
- **SecuritiesModel**: Added `avoid_mysql_injection()`, `sanitize()`, extended `getLoginUserDetail()` for `tp` (parent), `admin`, `pp`; `authenticateLogin()` includes `user_roles.status`.
- **UtilityModel**: Added `setUserTimeZone()` for session-based timezone.

### Models added (CI3 → CI4 reference)
| CI3 model | CI4 model | Table / purpose |
|-----------|-----------|------------------|
| admin | AdminModel | users; loginRules(), forgotPasswordRules() |
| assessment | AssessmentModel | ra_students; studentAssessmentRules(), insertStudentAssessment(), baAddEditRules() |
| quest | QuestModel | assignments; createLessonRules(), docs/thumbs/images config |
| classrosters | ClassRosterModel | student_class_future; thumbs/images/documents config |
| lessonplan | LessonplanModel | monthly_lesson_plan; addEditRules(), loginRules() |
| portal | PortalModel | portals; newsletter/announcement rules, docs config |
| prospect | ProspectModel | prospect_request_tour (same as ProspectRequestTourModel) |
| common | CommonModel | pagination load_default_configuration() |
| student_enrollment | StudentEnrollmentModel | enrollment (same as EnrollmentModel) |
| Auth | — | Not a table model; Google calendar check – use Library or controller |
| default_database, crons_debug | — | Not migrated (config/cron) |

### Controllers migrated
- **My404** – 404 override, returns CI4 error_404 view.
- **Tp\Te** – Teacher login, logout, forgotPassword, newPassword (namespaced, uses model(), session(), redirect(), validation).
- **Tp\Ur** – index, chooseSchool, getClass, signin_out, dashboard (same business logic, CI4 loader replaced).
- **Tp\Pa** – Parent login (tp portal): login, logout, forgotPassword, newPassword; prospect redirect to studentEnrollment; same business logic as CI3 tp/pa.php.
- **Tp\Pp** – Parent portal: login (redirect to pa/login), loginiframe, chooseSchool, getClass (returns comma-separated class IDs), dashboard, logout, forgotPassword, forgotPasswordiframe, newPassword, changePassword; CI3 tp/pp.php.
- **Tp\StudentEnrollment** – index, ajaxData (parent/prospect student list); CI3 tp/studentEnrollment.php.
- **Tp\St** – Student assessment stub: stAssessment, baseLineAssessmentListing; full CI3 tp/st.php logic can be migrated later.

### Models (parent/student)
- **SecuritiesModel**: Added `paLogout()`, `ppLogout()`; `getLoginUserDetail('pp')` already present.
- **UtilityModel**: Added parent branch in `fronEndChooseSchool()` (schools/classes by family_id); `setUserTimeZone()` supports pp.

### Routes
- Default `/` → `Home::index`.
- 404 → `My404::index`.
- `tp/te/*` – login, logout, forgotPassword, newPassword.
- `tp/ur/*` – index, chooseSchool, getClass, signin_out, dashboard.
- `tp/pa/*` – login, logout, forgotPassword, newPassword.
- `tp/pp/*` – login, loginiframe, chooseSchool, getClass, logout, forgotPassword, forgotPasswordiframe, newPassword, changePassword, dashboard.
- `tp/studentEnrollment`, `tp/studentEnrollment/ajaxData/(:any)/(:any)`.
- `tp/st/stAssessment`, `tp/st/readinessAssessmentListing/(:any)`.
- `admin/home/dashboard` – placeholder.

### Views
- **tp/include/headScripts.php** – CI4: `<?= view(...) ?>`, `base_url()`.
- **tp/teLogin.php**, **tp/forgotPassword.php**, **tp/newPassword.php** – CI4 view syntax, `session()->getFlashdata()`, `old()`.
- **tp/urChoose.php**, **tp/urChooseSchool.php** – CI4 view includes and `base_url()`.
- **tp/urChooseSchool.php** – **jQuery `$.get()` replaced with Fetch API** for loading class options.
- **tp/urRoster.php**, **tp/urRosternew.php**, **tp/urDashboard.php** – Stub views (full content to be copied from CI3).
- **tp/paLogin.php** – Parent login form (CI4 view, Fetch-ready).
- **pp/ppLogin.php**, **pp/ppLoginiframe.php**, **pp/chooseSchool.php** (Fetch for pp/getClass), **pp/dashboard.php**, **pp/changePassword.php**, **pp/forgotPassword.php**, **pp/newPassword.php**, **pp/ppforgotPasswordiframe.php** – Parent portal views.
- **tp/studentEnrollmentList.php**, **tp/ajaxEnrollmentStudentList.php** – Student enrollment (stub).
- **tp/stAssessment.php**, **tp/readinessAssessmentListing.php** – Student assessment (stub).

### PHP 8.5
- `composer.json`: `"php": "^8.1"` (covers 8.5); optional `config.platform.php: "8.5"` for lockfile.

---

## Remaining (to migrate)

### Root controllers (CI3 → CI4)
- **Auth** – login, oauth, logout (Google calendar).
- **Main**, **Pass**, **Apperror**, **TourRequest**, **GoogleEvent**.

### Tp controllers
- **Reports**, **Rosters**, **TeacherMessage**, **InternalMessage**, **Messages**, **Incoming**, **Portals**, **Payment**, **Quests**, **Roster** (Pa, Pp, StudentEnrollment, St migrated).

### Admin controllers
- All under `application/controllers/admin/`: home, events, students, teachers, schools, users, portals, internalMessage, teacherMessage, lessonplans, classRooms, classroster, enrollment, prospects, requests, withdraws, parentConcerns, crons, emailTemplate, html, activities, studentsImport.

### API
- **api/key**, **api/example** (REST_Controller base).

### Views
- Copy remaining CI3 views from `cmmschoolold/application/views/` into `app/Views/`, replacing:
  - `$this->load->view('path')` → `<?= view('path') ?>`
  - `$this->session->flashdata('x')` → `session()->getFlashdata('x')`
  - `$this->config->item('base_url')` / `basepath` → `base_url()` or pass from controller
  - `set_value()`, `form_error()` → `old()`, validation errors passed from controller

### jQuery AJAX → Fetch API
- **urReport.php**, **urIncoming.php**, **urRoster.php**, **urRosternew.php** – Replace `$.get()`, `$.post()`, `$.ajax()` with `fetch()` (same pattern as urChooseSchool).
- **teachermessage/** (index, sendmessage, studentAjaxList) – Same replacement.

### Libraries & helpers
- **PDF** (mpdf wrapper) – Move to `app/Libraries/` or service, use CI4 autoload/namespaces.
- **REST_Controller** – Replace with CI4 API controllers and response helpers.
- **MY_form_helper**, **MY_string_helper**, **download_helper** – Move to `app/Helpers/`, add to `BaseController` or `Config/App.php` if global.

### Assets
- Copy `cmmschoolold/www/`, `cmmschoolold/tp/` (js, css, images) into `public/` (e.g. `public/assets/`, `public/tp/`) and point `base_url()` accordingly.

---

## Patterns used

| CI3 | CI4 |
|-----|-----|
| `$this->load->model('securities')` | `model(SecuritiesModel::class)` or inject in constructor |
| `$this->load->view('x', $data)` | `return view('x', $data)` |
| `$this->input->post('x')` | `$this->request->getPost('x')` |
| `$this->config->item('base_url')` | `base_url()` |
| `$this->session->set_userdata('k','v')` | `session()->set('k','v')` |
| `$this->session->flashdata('k')` | `session()->getFlashdata('k')` |
| `redirect(base_url().'path')` | `return redirect()->to(base_url('path'))` |
| `TEACHER_ROLE_ID` | `CmmConstants::TEACHER_ROLE_ID` |
| `$this->securities->session_exist_redirect('tp')` | `$this->securitiesModel->sessionExistRedirect('tp')` (returns RedirectResponse or null) |
| `$this->securities->AllowedRoles(...)` | `$this->securitiesModel->allowedRoles(...)` (returns true or RedirectResponse) |

Business logic in controllers and models was preserved; only loader, session, and request access were converted to CI4 APIs.

---

## See also

- **[Payment gateway & enrollment fees](payment-gateway.md)** — `stripe_payment` ledger, admin Cheque/Cash, parent **`tp/payment`** Stripe Checkout, `.env` keys, and webhooks (CI4 vs legacy CI3).
