A Laravel 12+ package for scraping, cleaning, and importing practitioner data from the Kenya Medical Practitioners and Dentists Council (KMPDC) master register.
# 🩺 KMPDC Seeder
A **Laravel 12+ package** for scraping, cleaning, and importing practitioner data from the **Kenya Medical Practitioners and Dentists Council (KMPDC)** master register.
This package is designed for:
- 🧑🏫 Teaching structured data ingestion and seeding in Laravel
---
## 🚀 Features
✅ Scrapes KMPDC register HTML into structured CSVs
✅ Extracts & normalizes:
- Practitioner details, qualifications, degrees, institutions
✅ Imports structured data into related tables
✅ Works seamlessly with Eloquent models
---
## 📦 Installation
```bash
composer require thibitisha/kmpdc-seeder:^0.0.47-alpha
````
---
## 🧩 Database Schema
The package models relationships between practitioners, qualifications, degrees, institutions, and related entities.
```mermaid
erDiagram
practitioners ||--|| statuses : has
practitioners ||--|| specialities : belongs_to
practitioners }o--|| sub_specialities : may_specialize_in
practitioners ||--o{ qualifications : holds
practitioners ||--o{ contacts : has
practitioners ||--o{ licenses : issued
practitioners ||--o{ practitioner_documents : uploads
qualifications }|--|| degrees : is_type
qualifications }|--|| institutions : awarded_by
sub_specialities }|--|| specialities : under
licenses ||--o{ payments : renewed_via
users ||--|| roles : assigned_role
verification_logs }o--|| practitioners : attempts_to_verify
practitioners {
BIGINT id PK
VARCHAR registration_number UK
VARCHAR full_name
VARCHAR profile_photo_url "nullable"
BIGINT status_id FK
BIGINT speciality_id FK "nullable"
BIGINT sub_speciality_id FK "nullable"
DATE date_of_registration "nullable"
TIMESTAMP created_at
TIMESTAMP updated_at
}
sub_specialities {
BIGINT id PK
VARCHAR name
BIGINT speciality_id FK
}
```
> 📝 **Notes**
> * All inserts and relationships are handled via **Eloquent models**
---
### 🧩 **Model Setup & Relationships**
Before running the import commands, ensure that all **Eloquent models** and their respective **relationships** are correct …