PESO-Link MisOr is an Android-focused mobile employment facilitation system for PESO Misamis Oriental. It is a BSIT capstone prototype built with React Native Expo, Node.js Express, and MySQL.
The app centralizes job seeker registration, NSRP-based profile encoding, optional OCR-assisted NSRP form prefill, employer job posting, job browsing, application tracking, notifications, and PESO admin monitoring.
The submitted system is:
- Android-focused mobile app using Expo React Native.
- REST API backend using Node.js, Express, JWT authentication, and MySQL.
- Local or LAN-demo runnable prototype for PIT/demo.
- OCR-assisted NSRP encoding using Tesseract.js as the emerging technology.
The submitted system is not:
- A replacement for official PESO, PEIS, PhilJobNet, or NSRP processing.
- A hiring decision system.
- An AI screening, ranking, or recommendation system.
- A chat, payment, GPS, biometric login, interview scheduling, or external government database integration system.
- Register and log in.
- Create and update an NSRP-based job seeker profile.
- Optionally scan NSRP form page 1 and page 2 using OCR.
- Review and edit all OCR-filled fields before saving.
- Save selected skills for rule-based job comparison.
- View PESO Review Requirements before submitting the profile.
- Submit completed NSRP profile for PESO admin review.
- Browse active job postings.
- Search and filter jobs by keyword and job type.
- View job details, requirements, application instructions, employer details, and skill comparison.
- Submit an application only after the NSRP profile is marked PESO Referral-Ready.
- Track submitted applications.
- View notifications.
- Log in using a PESO Admin-created or approved employer account.
- View employer dashboard and notifications.
- Create job postings.
- Update job postings.
- Encode requirements/application instructions.
- Select required skills for rule-based comparison.
- Soft-close job postings while keeping records for monitoring.
- View applicants for own job postings.
- View applicant NSRP profile summary, contact information, PESO review status, matched skills, missing required skills, and application status.
- Manually update application tracking status.
- Log in using admin credentials.
- View dashboard statistics.
- Create employer accounts.
- Approve or reject employer accounts when applicable.
- View and manage employer accounts.
- View job seeker accounts.
- Deactivate/reactivate job seeker accounts.
- Review job seeker NSRP profile readiness.
- Mark profiles as PESO Referral-Ready or Needs Revision.
- Monitor job postings.
- Soft-close job postings.
- Monitor application records.
- View system notifications through the affected user accounts.
The app uses a two-track model:
-
NSRP Profile Review Track
- The job seeker completes an NSRP-based profile.
- The job seeker submits the profile for PESO review.
- PESO Admin reviews the profile and marks it as:
draftsubmittedneeds_revisionreferral_ready
referral_readymeans the NSRP profile was reviewed for employment facilitation support. It is not a hiring decision.
-
Job Application Tracking Track
- After the profile is
referral_ready, the job seeker can apply to job postings. - Employers can review applicants and update the application tracking status.
- Application statuses are:
submittedpendingfor_reviewfor_interviewhiredrejectedclosed
- These statuses are manually updated for tracking. They are not automated decisions.
- After the profile is
This keeps PESO profile readiness separate from employer application outcomes.
OCR is optional and assistive only.
- Job seeker opens Upload NSRP.
- Job seeker selects or captures an NSRP form image.
- Backend runs OCR using Tesseract.js.
- Parsed values are placed into editable review fields.
- Job seeker checks and edits the fields.
- Job seeker taps Confirm and Save.
- Only then are values saved to the NSRP profile.
Rules:
- OCR never auto-saves.
- OCR output is always editable.
- OCR does not validate identity.
- OCR does not rank, screen, recommend, or decide.
- If OCR fails, the user can still manually encode the NSRP profile.
Skill comparison is rule-based only.
- Employer selects required skills in the job post.
- Job seeker selects skills in the NSRP/profile screen.
- The system compares skill IDs.
- The system displays:
- matched skills
- missing required skills
- counts
The comparison does not produce scores, rankings, recommendations, or automated hiring decisions.
Notifications are stored in the database and shown in app notification screens.
Notification examples:
- Employer account created or approved.
- NSRP profile marked referral-ready or needs revision.
- New job posted by an approved employer.
- New application received by employer.
- Application status updated.
- Job post soft-closed by PESO Admin.
- Account deactivated/reactivated.
These are in-app notification records, not native Android push notifications.
pes-main/
backend/
routes/ Express API routes
services/ Shared backend services
scripts/ Utility scripts, including OCR smoke test
tests/ Backend regression tests
db.js MySQL connection pool
init-db.js Creates schema from schema.sql
schema.sql MySQL tables and indexes
seed.js Demo accounts and seed data
server.js Main Express server
frontend/
app/ Expo Router screens by role
src/api/ Axios API client
src/components/ Shared UI components
src/constants/ Colors, spacing, status labels
src/context/ Authentication context
docs/
PRD.md Product requirements and current behavior
PAPER_ALIGNMENT_NOTES.md Paper/defense wording notes
samples/
nsrp-ocr/ Sample NSRP images for OCR demo and smoke testing
The samples/nsrp-ocr folder contains the two NSRP images that should be kept in GitHub for OCR demo and testing.
Use these files when demonstrating Upload NSRP Form (OCR):
samples/nsrp-ocr/nsrp-page-1-sample.jpgsamples/nsrp-ocr/nsrp-page-2-sample.jpg
These images are used for:
- Demonstrating the Upload NSRP OCR feature.
- Running the backend OCR smoke test.
- Giving group members a consistent test input.
The figma-reference folder can still be used locally for prototype exports, paper files, and PIT instruction files, but it is ignored by Git because those files are large and are not required for the app to run.
Recommended OCR demo flow using the samples:
- Start the backend.
- Start the frontend in Expo.
- Log in as a job seeker.
- Open Upload NSRP Form (OCR).
- Upload
samples/nsrp-ocr/nsrp-page-1-sample.jpg. - Review the extracted editable fields.
- Upload
samples/nsrp-ocr/nsrp-page-2-sample.jpgto merge education, training, work experience, and skills. - Review/edit the combined fields.
- Tap Confirm and Save only after checking the data.
Install these before running the project:
- Node.js LTS
- npm
- MySQL Server
- Expo Go app on Android phone, or Android Emulator
- Git, if cloning from a repository
Optional:
- Python and pytest, only if running the Python backend regression tests.
- Download the project ZIP.
- Extract it.
- Open the extracted folder:
cd C:\Users\user\Downloads\pes-main\pes-maingit clone <repository-url>
cd pes-mainUse the folder that contains both backend and frontend.
Open Command Prompt or PowerShell in the project root.
cd backend
npm installCreate or check backend/.env:
DB_HOST=localhost
DB_PORT=3306
DB_USER=root
DB_PASSWORD=your_mysql_password
DB_NAME=peso_link_misor
PORT=8001
JWT_SECRET=replace_with_any_long_secret
JWT_EXPIRES_IN=7dInitialize and seed the database:
node init-db.js
node seed.jsStart the backend:
npm startExpected output:
[DB] Connected to MySQL database: peso_link_misor
[Server] PESO-Link MisOr backend running on http://0.0.0.0:8001
Health check:
http://localhost:8001/api/health
Expected response:
{
"status": "ok",
"service": "PESO-Link MisOr Backend"
}Open a second terminal.
cd frontend
npm installIf using Android Emulator, start Expo:
npm run androidFind the laptop IP address:
ipconfigLook for the active IPv4 address, for example:
192.168.18.71
Set the backend URL and Expo host before starting Expo:
set REACT_NATIVE_PACKAGER_HOSTNAME=192.168.18.71
set EXPO_PUBLIC_BACKEND_URL=http://192.168.18.71:8001
npx.cmd expo start --lan -cThe QR code should show an Expo URL similar to:
exp://192.168.18.71:8081
If it shows 127.0.0.1 or localhost, the phone will not connect.
If LAN mode fails because of Wi-Fi/router/firewall restrictions:
set EXPO_PUBLIC_BACKEND_URL=http://192.168.18.71:8001
npx.cmd expo start --tunnel -cTunnel mode is slower but often works when LAN mode is blocked.
These are created by node seed.js.
| Role | Password | Notes | |
|---|---|---|---|
| PESO Admin | admin@peso.gov.ph |
Admin@123 |
Main admin account |
| Job Seeker | juan.cruz@example.com |
Test@123 |
Complete seeker profile |
| Job Seeker | maria.santos@example.com |
Test@123 |
Existing application data |
| Job Seeker | pedro.reyes@example.com |
Test@123 |
Trade/electrical profile |
| Employer | hr@techcorp.ph |
Test@123 |
Approved employer |
| Employer | hr@northstar.ph |
Test@123 |
Approved employer |
| Employer | hr@bluemountain.ph |
Test@123 |
Pending employer account |
- Log in as
admin@peso.gov.ph. - Show dashboard statistics.
- Open employer management.
- Show admin-created employer account flow.
- Open job seeker management.
- Show NSRP profile referral status controls.
- Open monitor jobs and explain soft close.
- Open monitor applications.
- Log in as a job seeker.
- Open dashboard.
- Open profile.
- Show PESO Review Requirements checklist.
- Show selected skills.
- Open Upload NSRP.
- Scan page 1 or page 2 sample if demonstrating OCR.
- Show editable OCR review fields.
- Open jobs.
- Search/filter jobs.
- Open job details.
- Show rule-based matched/missing skills.
- Submit application if account is referral-ready.
- Open My Applications.
- Open Notifications.
- Log in as approved employer.
- Open dashboard.
- Open manage jobs.
- Create or edit a job post.
- Add requirements/application instructions.
- Select required skills.
- Open applicants.
- Show applicant NSRP profile summary.
- Show PESO Referral-Ready label.
- Show matched/missing skills.
- Update application status.
- Open notifications.
Authentication:
POST /api/auth/registerPOST /api/auth/loginGET /api/auth/me
Job seeker:
GET /api/job-seeker/profilePOST /api/job-seeker/profilePOST /api/job-seeker/profile/submit-referralPOST /api/job-seeker/skillsDELETE /api/job-seeker/skills/:skillId
NSRP OCR:
POST /api/nsrp/uploadPOST /api/nsrp/extractPOST /api/nsrp/confirm
Jobs:
GET /api/jobsGET /api/jobs/:idGET /api/jobs/:id/match
Applications:
POST /api/applicationsGET /api/applications/my-applicationsGET /api/applications/:id
Employer:
GET /api/employer/profilePOST /api/employer/profileGET /api/employer/jobsPOST /api/employer/jobsPUT /api/employer/jobs/:idPUT /api/employer/jobs/:id/closeGET /api/employer/jobs/:id/applicantsPUT /api/employer/applications/:id/status
PESO Admin:
GET /api/admin/statsGET /api/admin/employersPOST /api/admin/employersPUT /api/admin/employers/:id/approvePUT /api/admin/employers/:id/rejectGET /api/admin/job-seekersPUT /api/admin/job-seekers/:id/deactivatePUT /api/admin/job-seekers/:id/reactivatePUT /api/admin/job-seekers/:id/referral-statusGET /api/admin/jobsPUT /api/admin/jobs/:id/closeGET /api/admin/applications
Shared:
GET /api/skillsPOST /api/skillsGET /api/notificationsPUT /api/notifications/:id/readPUT /api/notifications/read-all
Main tables:
usersjob_seekersemployerspeso_adminsskillsjob_seeker_skillsjob_postsjob_required_skillsjob_applicationsapplication_status_historynotificationsuploaded_nsrp_forms
Important behavior:
- Job posts are soft-closed by setting
status='closed'. - Job applications are retained for tracking.
- OCR uploads require explicit confirmation before profile save.
- Employer accounts are controlled by PESO Admin.
Backend syntax:
node -c backend\routes\nsrp.js
node -c backend\services\nsrpOcr.js
node -c backend\routes\jobSeeker.js
node -c backend\services\nsrpProfileValidation.js
node -c backend\routes\applications.js
node -c backend\routes\employer.jsOCR smoke:
cd backend
npm.cmd run ocr:smoke -- ..\samples\nsrp-ocr\nsrp-page-1-sample.jpg
npm.cmd run ocr:smoke -- ..\samples\nsrp-ocr\nsrp-page-2-sample.jpgFrontend lint and type check:
cd frontend
npm.cmd run lint
npx.cmd tsc --noEmitBackend live health check:
curl http://localhost:8001/api/healthBackend regression tests, if Python and pytest are installed:
set PESO_LINK_BASE_URL=http://localhost:8001
python -m pytest backend\testsCheck the Expo URL printed in the terminal.
Bad for physical phone:
exp://127.0.0.1:8081
exp://localhost:8081
Good for physical phone:
exp://192.168.x.x:8081
Fix:
set REACT_NATIVE_PACKAGER_HOSTNAME=your_laptop_ip
set EXPO_PUBLIC_BACKEND_URL=http://your_laptop_ip:8001
npx.cmd expo start --lan -cThe frontend is probably pointing to the wrong backend URL.
Set:
set EXPO_PUBLIC_BACKEND_URL=http://your_laptop_ip:8001Then restart Expo with cache clear:
npx.cmd expo start --lan -cCheck:
- MySQL service is running.
backend/.envhas correct DB credentials.- Database exists.
node init-db.jsandnode seed.jswere run.
Find the process:
netstat -ano | findstr :8081
netstat -ano | findstr :8001Stop the process if it is a stale development server:
taskkill /PID <PID> /FUse these statements during demo:
- OCR is the emerging technology integration.
- OCR is assistive and user-confirmed.
- NSRP profile review is separate from employer application tracking.
- Skill comparison is rule-based matched/missing comparison only.
- PESO Referral-Ready is not a hiring decision.
- Job posts are soft-closed, not deleted.
- Notifications are in-app alerts.
The app intentionally does not include:
- Automated applicant ranking.
- Automated hiring recommendations.
- AI screening.
- Chat or real-time messaging.
- Interview scheduling module.
- GPS tracking.
- Payment processing.
- Biometric login.
- External government database integration.
- Native push notification service.