Add hiring, AI parser+admin, OTP auth, employer dashboard, profit-share pay

- Hiring (استخدام) listings: JobOpening + /Jobs browse/detail + home section
- Heuristic Persian listing-parser + admin queue (/Admin) → publish shift/job
- Phone-OTP cookie auth + visitor-history linking + profile; Admin role gate
- Employer side: self-serve facility registration, dashboard, post/manage shifts & jobs, applicants list with contact
- Compensation models: fixed / hourly / profit-share (درصدی) / negotiable / choice (به انتخاب شما); SharePercent + JalaliDate.PayLabel; parser + filter

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
soroush.asadi
2026-06-03 06:26:54 +03:30
parent 2fb86a435e
commit 563a40d1f4
30 changed files with 1761 additions and 27 deletions
+17 -1
View File
@@ -43,6 +43,10 @@ Then open the URL printed in the console (e.g. http://localhost:5020).
| `/Account/Profile` | پروفایل: شیفت‌ها/موقعیت‌های ذخیره‌شده و اعلام تمایل‌ها |
| `/Admin` | پنل مدیریت (نقش Admin): صف آگهی‌های خام |
| `/Admin/Review/{id}` | بررسی خودکار (پارسر) و انتشار آگهی به‌صورت شیفت یا استخدام |
| `/Employer` | **پنل کارفرما**: مراکز من + شمار شیفت/استخدام/متقاضی |
| `/Employer/RegisterFacility` | ثبت مرکز درمانی (خودسرویس → نقش FacilityAdmin) |
| `/Employer/PostShift`، `/PostJob` | انتشار شیفت یا موقعیت استخدامی |
| `/Employer/Listings` | مدیریت آگهی‌ها (بستن/بازگشایی/حذف) + لیست متقاضیان با تماس |
## How recommendations work (Stage 1 — pattern engine)
`RecommendationService` scores open shifts against (a) explicit `UserPreferences` and (b) recent
@@ -56,7 +60,19 @@ Done: multi-role domain model, Postgres + migrations, RTL shell, browse/filter (
district, near-me), weekly Jalali calendar, shift detail + interest handoff, interest tracking +
pattern-engine recommendation feed + preferences, self-hosted Vazirmatn + teal/coral palette,
**hiring (استخدام) listings**, **admin queue + heuristic listing-parser** (raw channel post →
structured shift/job), **phone-OTP auth + visitor-history linking + profile**, Tehran seed data.
structured shift/job), **phone-OTP auth + visitor-history linking + profile**, **employer side** (self-serve facility
registration → FacilityAdmin role, post/manage shifts & jobs, applicants list with contact),
Tehran seed data.
Both sides of the marketplace now work end-to-end: an employer self-registers a facility, posts a
shift, it appears publicly, a logged-in user applies, and the employer sees that applicant's
phone in their dashboard.
### Compensation models
Shifts support fixed (مقطوع), hourly (ساعتی), **profit-share (درصدی / سهم درآمد)**, توافقی, or a
**choice** between a fixed amount and a share % ("… یا … به انتخاب شما"). `JalaliDate.PayLabel`
centralizes the display; `Shift.SharePercent` holds the percentage; the listing-parser detects
"۵۰٪ / درصد / سهم" from raw posts; and `/Shifts` has a "سهم درآمد" filter.
### Listing parser (Stage 1)
`IListingParser` / `HeuristicListingParser` extracts kind (shift vs hire), role, shift type,