ڈیٹا ماڈل
سندھ آئی ٹی پورٹل — سہولت ڈیسک (SITP) کا مستند منطقی اسکیما: ہر جدول، اس کے کالم، پابندیاں، تعلقات، انڈیکسنگ، آرکائیول، مائیگریشن، اور ڈیٹا درجہ بندی کے قواعد، جو MariaDB 10.11 کو ہدف بناتے ہوئے Prisma (بطور ORM) کے ساتھ مرتب کیے گئے ہیں۔
| فیلڈ | قدر |
|---|---|
| دستاویز آئی ڈی | 05 |
| حیثیت | مسودہ |
| مالک | S&ITD / MAAHIR |
| زبانیں | EN (مرجع) · UR · SD |
| ڈیٹا بیس | MariaDB 10.11.14 (InnoDB، utf8mb4) — PostgreSQL نہیں |
| ORM | Prisma (MySQL/MariaDB ڈرائیور) |
| تلاش | Meilisearch (کثیر لسانی مکمل متن) |
| متعلقہ دستاویزات | /specs/ur/04-roles-permissions/ · /specs/ur/06-ticket-workflow/ · 09-ai-ocr-spec/en.md · /specs/ur/11-security-compliance/ · /specs/ur/12-api-contract/ · /specs/ur/15-tech-architecture/ · /specs/ur/21-mom-meetings/ |
1. دائرہ کار اور اس دستاویز کو پڑھنے کا طریقہ
یہ دستاویز SITP کا منطقی ڈیٹا ماڈل متعین کرتی ہے۔ یہ جدول کے ناموں، کالموں، اقسام، پابندیوں، اور تعلقات کے لیے واحد مستند ماخذ ہے۔ اسے درج ذیل استعمال کرتے ہیں:
- انجینئرنگ (Engineering) —
schema.prismaاور Prisma مائیگریشن مرتب کرنے کے لیے۔ - انضمام (Integrations) — ہر ایڈاپٹر (NADRA/SECP/FBR/SRB/PSEB/e-Office) ان جدولوں کے ذریعے پڑھتا/لکھتا ہے۔
- تجزیات (Analytics) — Metabase ماڈلز اور عوامی شفافیت ڈیش بورڈ ان جدولوں کو مجموعی شکل دیتے ہیں۔
- سیکیورٹی جائزہ — §9 ذاتی شناختی معلومات (PII) کو درجہ بند کرتا ہے اور
/specs/ur/11-security-compliance/سے حوالہ دیتا ہے۔
یہ ماڈل دس ڈومینز میں تقسیم کیا گیا ہے۔ ہر ڈومین میں (الف) ایک Mermaid erDiagram، (ب) تحریری وضاحت، اور (ج) ہر جدول کے لیے ایک ذیلی سیکشن شامل ہے۔ سیکشن §4 تمام جدول کی تعریفیں رکھتا ہے؛ §5 سب سے اہم کراس-ٹیبل تعلقات واضح کرتا ہے؛ §6 تا §9 انڈیکسنگ، آرکائیول، مائیگریشن، اور ڈیٹا درجہ بندی کا احاطہ کرتے ہیں۔
جدول کی تعداد: 10 ڈومینز میں 74 جداول۔
ڈایاگرام کی تعداد: 10 Mermaid erDiagram بلاکس (ہر ڈومین کے لیے ایک)۔
2. ضابطے
یہ ضابطے یکساں طور پر لاگو ہوتے ہیں۔ انہیں ہر کالم پر دہرایا نہیں جاتا۔
2.1 اسٹوریج انجن اور کریکٹر سیٹ
| پہلو | قاعدہ |
|---|---|
| انجن | ہر جدول پر InnoDB (ٹرانزیکشنز، FK پابندیاں، قطار-سطح لاکنگ)۔ MyISAM کبھی استعمال نہیں ہوتا۔ |
| کریکٹر سیٹ | ڈیٹا بیس، ہر جدول، ہر متن کالم، اور کنکشن (Prisma ڈیٹاسورس URL + MariaDB صارف ڈیفالٹ) پر utf8mb4۔ روایتی 3-بائٹ utf8 ممنوع ہے — یہ تمام سندھی/اردو عربی رسم الخط کے کوڈ پوائنٹس محفوظ نہیں کر سکتا۔ |
| کولیشن | utf8mb4_unicode_ci دستاویزی ڈیفالٹ ہے۔ پروڈکشن میں UCA-بنیاد utf8mb4_unicode_520_ci تجویز کیا جاتا ہے (/specs/ur/15-tech-architecture/ §5.4 کے مطابق) تاکہ اردو/سندھی ترتیب زیادہ درست رہے؛ دونوں قابلِ قبول ہیں، ایک بار منتخب کر کے مستقل طور پر لاگو کریں۔ |
| سرور سیٹنگز | character_set_server=utf8mb4، collation_server=utf8mb4_unicode_ci (یا _520_ci)۔ |
2.2 شناخت کنندے اور متبادل کلیدیں
- ہر جدول میں ایک متبادل
idکالم ہوتا ہے:BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY(کثیف، جواینٹ کے لیے موزوں، ترتیب دینے کے قابل)۔ - بامعنی کاروباری شناخت کنندے (ٹکٹ
tracking_id = SITP-YYYY-<DEPT>-<NNNNNN>، CNIC، NTN، SECP رجسٹریشن نمبر) ثانوی منفرد کالم ہیں، بنیادی کلید کبھی نہیں، تاکہ ضم/تقسیم/دوبارہ نمبر دینا اور مستقبل میں شارڈنگ ممکن رہے۔ - UUIDs (عوامی ٹوکنز، ویب ہوک راز، QR تصدیقی کوڈز)
CHAR(36)کے طور پر محفوظ ہوتے ہیں اور MariaDB کےUUID()فنکشن یا ایپلیکیشن-سائڈ UUIDv7 کے ذریعے پیدا کیے جاتے ہیں؛ MariaDB میں کوئی built-inUUIDقسم موجود نہیں۔
2.3 معیاری آڈٹ کالم
ہر جدول بلا استثنا ان کالموں کو رکھتا ہے۔ ذیلی جدول کے کالم فہرستوں میں انہیں ایک واحد قطار کے طور پر مختصر کیا گیا ہے جو اس سیکشن کا حوالہ دیتی ہے تاکہ فہرستیں پڑھنے میں آسان رہیں۔
| کالم | قسم | پابندیاں | نوٹس |
|---|---|---|---|
id |
BIGINT UNSIGNED |
NOT NULL AUTO_INCREMENT PRIMARY KEY |
متبادل بنیادی کلید۔ |
created_at |
DATETIME(6) |
NOT NULL DEFAULT CURRENT_TIMESTAMP(6) |
UTC داخلہ وقت، مائیکرو سیکنڈ درستگی۔ |
updated_at |
DATETIME(6) |
NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6) |
UTC آخری تحریر وقت۔ |
created_by |
BIGINT UNSIGNED |
NULL، FK → users.id |
وہ اداکار جس نے قطار بنائی۔ سسٹم/سیڈ قطاروں کے لیے NULL۔ |
updated_by |
BIGINT UNSIGNED |
NULL، FK → users.id |
وہ اداکار جس نے قطار میں آخری تحریر کی۔ |
deleted_at |
DATETIME(6) |
NULL |
نرم حذف کا نشان۔ صارف کے سامنے آنے والے، آڈٹ کے قابل، اور PII رکھنے والے جدولوں پر موجود؛ صرف اضافہ (append-only) یا خالص تلاش (lookup) والے جدولوں پر غیر موجود (جہاں ایسا ہو واضح طور پر نوٹ کیا گیا)۔ |
2.4 نام رکھنے کے اصول
- تمام شناخت کنندے
snake_caseہیں۔ جدول جمع اسماء ہیں (tickets،representatives)۔ کالم مفرد ہیں (status،due_at)۔ - ٹائم اسٹیمپس
_atپر ختم ہوتے ہیں (created_at،resolved_at،sla_due_at)؛ بولین کے لیےis_،has_، یاrequires_سابقہ لگایا جاتا ہے (is_confidential،requires_approval)۔ - غیر ملکی کلیدیں
<مفرد_entity>_idہیں (org_id،dept_id،rep_id)۔ مرتب FK دونوں کرداروں کے نام رکھتے ہیں (source_ticket_id،target_ticket_id)۔ - Enums MariaDB
ENUM(...)کے طور پر محفوظ ہوتے ہیں (free VARCHAR نہیں) ان status/state/type/category کالموں کے لیے جن کا ڈومین بند اور چھوٹا ہو۔ نئی قدریں مائیگریشن کے طور پر آتی ہیں۔ - رقم
BIGINTمیں عددی معمولی اکائیوں (PKR پیسہ) کے طور پر محفوظ ہوتی ہے، کبھی فلوٹنگ پوائنٹ نہیں، کالم کمنٹ میں واضح سیلی کے ساتھ (/specs/ur/15-tech-architecture/§5.3 کے مطابق)۔ SITP زیادہ تر فیس-فری ہے، اس لیے رقم کے کالم نایاب ہیں۔ - JSON کو
LONGTEXTکے طور پر ماڈل کیا جاتا ہے اور ضرورت پڑنے پر Prisma$queryRawکے ذریعے MariaDBJSON_*فنکشنز سے تصدیق کی جاتی ہے (Prisma MariaDB JSON کی خامیوں کی خودکار شناخت نہیں کرتا؛ tech-arch §5.2 کی تنبیہ دیکھیں)۔
2.5 ماڈیول کے سابقے (اختیاری، schema.prisma میں لاگو)
/specs/ur/15-tech-architecture/ §5.3 کے مطابق، تعینات اسکیما جدولوں کو ماڈیول کے سابقے سے شروع کر سکتا ہے (org_، usr_، tkt_، sla_، fil_، ai_، com_، not_، mtg_، ofc_، kb_، trn_، sys_، aud_، int_) تاکہ ماڈیول کی ملکیت ڈیٹا بیس کو تقسیم کیے بغیر ظاہر ہو۔ یہ دستاویز پڑھنے کی سہولت کے لیے غیر-سابقہ شدہ منطقی نام استعمال کرتی ہے (جیسا کہ بریف میں شمار کیے گئے)؛ سابقہ ایک نفاذ کی تفصیل ہے جو schema.prisma میں مستقل طور پر لاگو ہوتی ہے اور تعلقات کو تبدیل نہیں کرتا۔
2.6 غیر ملکی کلیدیں اور انڈیکسنگ
- تمام FK تعلقات
FOREIGN KEY ... REFERENCES ... ON DELETE RESTRICT ON UPDATE CASCADEکے طور پر بیان کیے جاتے ہیں جہاں تک الگ سے نوٹ نہ کیا گیا ہو (کیسکیڈ حذف نایاب اور ہمیشہ واضح ہوتے ہیں)۔ - ہر FK کالم ایک واضح ثانوی انڈیکس رکھتا ہے (MariaDB صرف FK چائلڈ سائڈ کو خود-انڈیکس کرتا ہے؛ many-to-many جواینٹ جدول دونوں سائڈز کو انڈیکس کرتے ہیں، اکثر مرتب
UNIQUEکے طور پر)۔ - نرم حذف شدہ قطاریں (
deleted_at IS NOT NULL) ایپلیکیشن استفسارات اور Prisma مڈل ویئر کے ذریعے خارج کی جاتی ہیں (MariaDB فلٹرڈ انڈیکس محدود ہیں)۔
2.7 ORM اور تلاش
- ORM = Prisma MariaDB ڈرائیور پر۔
schema.prismaاس دستاویز سے اخذ کیا جاتا ہے؛ ایکdatasourceبلاک جس میںprovider = "mysql"۔ مائیگریشن صرف آگے کی طرف (forward-only) ہوتے ہیں اور CI-گیٹڈ ہیں (§8 دیکھیں)۔ - مکمل متن کی تلاش Meilisearch کو سونپی گئی ہے، MariaDB
FULLTEXTکو نہیں۔ MariaDBFULLTEXTصرف ایک لاطینی رسم الخط کے فل بیک کے طور پر استعمال ہوتا ہے ایڈمن کے exact-phrase استفسارات کے لیے۔ کثیر لسانی (اردو/سندھی) ٹوکنائزیشن، درجہ بندی، اور مماثلت سب Meilisearch میں چلتی ہیں (tech-arch §5.5 اور §8 کے مطابق)۔ ایک سرچ-انڈیکسر ورکر ڈومین ایونٹس کو سنتا ہے اور redacted، locale-ٹیگ شدہ دستاویزات Meilisearch کو بھیجتا ہے؛ رازداری/VIP ٹکٹس کو انڈیکسنگ سے پہلے خارج یا ماسک کیا جاتا ہے۔
3. اعلیٰ سطحی ERD (بذریعہ ڈومین)
یہ ماڈل دس Mermaid erDiagram بلاکس میں تقسیم کیا گیا ہے تاکہ ہر ایک پڑھنے میں آسان رہے۔ کراس-ڈومین غیر ملکی کلیدیوں کا ذکر تحریری وضاحتوں میں کیا گیا ہے اور جہاں وہ ڈومین کے لیے مرکزی حیثیت رکھتی ہیں وہاں دکھائی گئی ہیں۔
3.1 شناخت اور ادارہ (کمپنیاں، نمائندے، تصدیق)
تحریری وضاحت۔ ایک organization (پانچ entity اقسام میں سے ایک — SECP کمپنی، انفرادی مالک/شراکت، فری لینسر، غیر ملکی شاخ، ابتدائی اسٹارٹ اپ) ایک یا زیادہ representatives اور ایک یا زیادہ organization_locations کا مالک ہوتا ہے۔ بالکل ایک نمائندہ بنیادی مجاز نمائندہ کا کردار رکھتا ہے (ایپلیکیشن پرت کے ساتھ ساتھ rep_role_assignments پر partial unique انڈیکس جہاں role = Primary ہو، کے ذریعے نافذ)۔ ہر نمائندہ لاگ ان شناخت کے لیے ایک users قطار سے 1:1 میپ ہوتا ہے۔ رجسٹریشن فائل-فرسٹ ہے: ایک organization کو verification_status = provisional، kyc_level = 0 کے ساتھ بنایا جاتا ہے، اور یہ فوراً ٹکٹ دائر کر سکتا ہے؛ بیک گراؤنڈ چیکس verification_jobs کے طور پر چلتے ہیں (ہر فراہم کنندہ کے لیے ایک: SECP، FBR/NTN، SRB، PSEB، NADRA، domain-email) جو verification_documents استعمال کرتے ہیں۔ تمام چیکس کامیاب ہونے پر ادارہ verified کی طرف بڑھتا ہے اور kyc_level بڑھ جاتا ہے؛ ناکامی پر یہ on_hold کی طرف بڑھتا ہے اور اپیل دائر کی جا سکتی ہے۔ consents ادارے کی ڈیٹا پروسیسنگ اور ہر انضمام لوک اپ کے لیے رضامندی ریکارڈ کرتا ہے۔
3.2 محکمات (حکومتی تنظیمی درخت، اوقات، چھٹیاں)
تحریری وضاحت۔ departments parent_id کے ذریعے ایک خود-حوالہ درخت ہے: اعلیٰ سطح کا نوڈ ایک محکمہ (لیبر، خزانہ، S&ITD، …) ہے؛ اس کے نیچے کوئی بھی نوڈ ایک سیکشن / ذیلی محکمہ ہے اور کسی بھی گہرائی میں آزادانہ طور پر نسٹ کر سکتا ہے۔ department_sections ان leaf یونٹس کے لیے ایک سہولت پروجیکشن ہے جو آزادانہ طور پر تفویض کے قابل ہوں۔ مالک محکمہ S&ITD کو is_owner_dept = 1 سے نشان زد کیا گیا ہے۔ holiday_calendar سندھ کی عوامی چھٹیاں رکھتا ہے (SLA کو روکنے کے لیے استعمال ہوتا ہے — _context.md §5 دیکھیں)؛ department_holidays کسی محکمے کو اوور رائڈ کرنے کی اجازت دیتا ہے (اضافی چھٹی منانا یا فہرست شدہ چھٹی کو چھوڑنا)۔ business_hours ہر محکمے کے لیے ہر ہفتے کے دن کے کام کے اوقات متعین کرتا ہے؛ SLA ٹائمرز صرف کام کے دنوں میں کام کے اوقات کے اندر چلتے ہیں۔
3.3 صارفین، کردار اور عہدیداروں کا CMS
تحریری وضاحت۔ users متحدہ لاگ ان شناخت ہے۔ حکومتی عملے کے پاس ایک dept_id ہوتا ہے؛ کمپنی کے نمائندوں کے پاس ایک rep_id (1:1 to representatives) ہوتا ہے۔ ہر صارف کے پاس ایک یا زیادہ user_role_assignments ہوتے ہیں جو ایک roles ٹیمپلیٹ کا حوالہ دیتے ہیں (SUPER_ADMIN، SITD_FACILITATION_OFFICER، DEPT_ADMIN، OFFICER، DG، SECRETARY، MINISTER، READONLY_AUDITOR، PRIMARY_REP، ADMIN_REP، FILER، VIEWER، NOTIFY_ONLY، CITIZEN، SERVICE_ACCOUNT)۔ کردار ٹیمپلیٹ role_template_permissions کے ذریعے ایک بنیادی لائن دیتا ہے؛ فی صارف گرانٹس یا منسوخیاں user_permission_overrides میں محفوظ ہوتی ہیں (دقیق-اوور رائڈ پرت، /specs/ur/04-roles-permissions/ §6 تا §7 دیکھیں)۔ عہدیداروں کا CMS (officials، official_terms، media_library) وزیر/SACM، سیکریٹری، اور DG کی date-scoped ریکارڈز رکھتا ہے تاکہ سرکاری خطوط اور ڈیش بورڈز خط جاری ہونے کی تاریخ کے لیے درست نام دکھائیں — تاریخی درستگی official_terms.effective_from/effective_to پر جواینٹ کرنے سے نافذ کی جاتی ہے۔
3.4 ٹکٹ اور ورک فلو
تحریری وضاحت۔ ایک ticket مرکزی وجود ہے۔ اس کا tracking_id (SITP-2026-LBR-000123) صارف کے سامنے آنے والا شناخت کنندہ ہے؛ متبادل id جواینٹ کلید ہے۔ ایک ٹکٹ ایک organization (فائلر) سے تعلق رکھتا ہے، ایک department اور اختیاری طور پر ایک section کی طرف روٹ ہوتا ہے، ایک ticket_category سے درجہ بند ہوتا ہے، اور ایک representative (filer_rep_id) کی طرف سے دائر کیا جاتا ہے۔ ایک ٹکٹ کے دو ticket_threads ہوتے ہیں: ایک public (کمپنی کو نظر آنے والا) اور ایک internal (صرف حکومت کے لیے)؛ ہر تھریڈ ticket_messages رکھتا ہے جن کا source انٹیک چینل (web، email، SMS، WhatsApp، IVR) ریکارڈ کرتا ہے۔ ticket_subtasks تقسیم شدہ ٹکٹس کو ماڈل کرتے ہیں؛ ticket_links ضم/تقسیم/متعلقہ/نقل/بلاکنگ تعلقات ماڈل کرتے ہیں (ایک قطار source_ticket_id اور target_ticket_id دونوں کا حوالہ ایک link_type کے ساتھ دیتی ہے)۔ ticket_watchers CC/اسکیلیشن میں شامل کردہ سامعین کو ریکارڈ کرتا ہے۔ ہر حالت تبدیل کرنے والا ایونٹ ticket_history میں شامل کیا جاتا ہے (فی ٹکٹ آڈٹ؛ عالمی آڈٹ audit_logs ہے)۔ حل کے لیے resolution_evidence (حل کے ثبوت کا گیٹ) درکار ہوتا ہے؛ اپیلز اور CSAT لائف سائیکل کو بند کرتے ہیں۔
3.5 SLA، اسکیلیشن اور حل
تحریری وضاحت۔ sla_definitions ہر (department, category, priority) کے لیے پہلے جواب اور حل کے اہداف متعین کرتا ہے؛ پلیٹ فارم ڈیفالٹس 2/5/10 دن ہیں (_context.md §5 دیکھیں)، جو یہاں مکمل طور پر اوور رائڈ کے قابل ہیں۔ escalation_rules ہر محکمے کے لیے ٹیئر لیڈر متعین کرتا ہے — بالعموم ٹیئر 1 → دن 2 پر DG، ٹیئر 2 → دن 7 پر سیکریٹری (2+5)، ٹیئر 3 → دن 17 پر وزیر/SACM (2+5+10)، ہر ایک ایک target_role اور ایک mode (notify یا notify+action، /specs/ur/04-roles-permissions/ §9 میں تشکیل کے قابل نگرانی کے اختیارات کا عکس) کی نشاندہی کرتا ہے۔ جب کوئی ٹیئر چلتا ہے، ایک escalation_events قطار لکھی جاتی ہے اور ہدف صارف کو بطور watcher شامل کر دیا جاتا ہے۔ sla_pause_events ہر SLA گھڑی کے روکنے/دوبارہ شروع کرنے (await-company، ویک اینڈ، سندھ عوامی چھٹی، دستی) کو مدت کے ساتھ ریکارڈ کرتا ہے تاکہ مؤثر SLA کو فارنسیکل طریقے سے دوبارہ تشکیل دیا جا سکے۔ resolution_evidence ثبوت کے گیٹ کو نافذ کرتا ہے؛ appeals اور csat_responses ٹکٹ سے منسلک ہیں (§3.4 میں دکھائے گئے)۔
3.6 اے آئی
تحریری وضاحت۔ ai_engine_configs پلگ ایبل انجن رجسٹری ہے: 11 اے آئی صلاحیتوں (+ transcription) میں سے ہر ایک کے لیے، ایک یا زیادہ (provider, model, is_cloud) قطاریں تشکیل دی جاتی ہیں، ہر ایک کو ڈیٹا-حساسیت کے اس طبقے سے ٹیگ کیا جاتا ہے جس کی خدمت کرنے کی اسے اجازت ہے (کلاؤڈ انجنز کبھی restricted/confidential خام PII کی خدمت نہیں کرتے — /specs/ur/15-tech-architecture/ §6 دیکھیں)۔ ai_runs ہر اے آئی اطلاق کو ریکارڈ کرتا ہے: فیچر، حل شدہ انجن، ایک redacted ان پٹ اسنیپ شاٹ، ساختی آؤٹ پٹ، ٹوکن گنتی، لاگت، لیٹنسی، حیثیت (ok/fallback/failed/redacted)، اور ایک was_redacted پرچم۔ extracted_action_items MoM ایکشن-آئٹم نکالنے کا ساختی آؤٹ پٹ رکھتا ہے (مالک متن + حل شدہ صارف، تاریخِ واجب الادا، ایکشن متن، حیثیت)؛ جب کوئی افسر کسی آئٹم کی تصدیق کرتا ہے، تو اسے ایک ticket_subtasks قطار میں تبدیل کر دیا جاتا ہے اور status converted ہو جاتی ہے۔
3.7 مواصلات اور اطلاعات
تحریری وضاحت۔ 3-ٹیئر اندرونی مواصلات کا ماڈل دو جدول خاندانوں سے میپ ہوتا ہے: DMs اور گروپ DMs messages (org-wide inbox، سادہ) استعمال کرتے ہیں، اور مکمل چینل-بنیاد چیٹ (channels، channel_memberships، channel_messages) تھریڈڈ جوابات (threaded_replies، channel_messages کے parent_message_id کی خود-حوالہ کاری کے طور پر ماڈل) اور پڑھنے کی رسیدوں (message_reads) کے ساتھ۔ اطلاعات کی پائپ لائن الگ ہے: notification_templates event_key + locale + channel کے ذریعے کلیدی شدہ کثیر لسانی ٹیمپلیٹس رکھتا ہے؛ notifications ہر باہر جانے والی اطلاع فی صارف/چینل کے ساتھ ترسیل کی حیثیت ریکارڈ کرتا ہے؛ notification_preferences فی صارف ترجیحات کا مرکز ہے (چینل آپٹ-ان، ڈائجسٹ کی رفتار، خاموش اوقات)۔ inbound_replies دو طرفہ جوابات (Mailjet inbound parse کے ذریعے email، ویب ہوک کے ذریعے WhatsApp، SMS) کو پکڑتا ہے، انہیں اصل ticket میں پارس کرتا ہے اور بطور ticket_message ظاہر کرتا ہے۔
3.8 میٹنگز، TRI اور MoM
تحریری وضاحت۔ ایک meeting کسی رکے ہوئے ticket سے متحرک ہوتی ہے (TRI = کمپنی + S&ITD فیسلیٹیٹر + متعلقہ محکمہ)، یا ایک سماعت یا اندرونی میٹنگ کے طور پر شیڈول ہوتی ہے۔ طریقہ virtual/physical/hybrid ہے؛ virtual/hybrid کے لیے video_provider (Zoom/Meet/Teams) اور وقت-محدود join_url محفوظ کیے جاتے ہیں۔ ہر میٹنگ بالکل ایک mom (1:1) پیدا کرتی ہے، جو ورژن شدہ ہے (version ترمیم پر بڑھتا ہے) اور draft → approved → published تک منتقل ہوتا ہے۔ حساس/VIP ٹکٹس کے لیے sensitive_requires_approval پرچم شائع سے پہلے چیئر/DG کی ایک mom_approvals قطار لازمی کرتا ہے؛ عام ٹکٹس کے لیے اپلوڈر براہ راست شائع کرتا ہے۔ شائع کرنے پر، mom_distributions ہر چینل شیئر (email + in-app + SMS/WhatsApp) ریکارڈ کرتا ہے اور mom_acknowledgments ٹریک کرتا ہے کس نے تسلیم کیا۔ meeting_recordings ریکارڈنگ blob اور یہ کہ اس کی تحریر بندی کی گئی یا نہیں، سے منسلک کرتا ہے۔ MoM اپلوڈ-فرسٹ ہے (PDF/Word/تصاویر)؛ اپلوڈ پر، OCR + اے آئی نکالنے (ai_runs، feature = mom_extract) extracted_action_items پیدا کرتے ہیں جس کی افسر ticket_subtasks میں تصدیق کرتا ہے (§3.6 دیکھیں)۔
3.9 عہدیدار و میڈیا، علم، مواد اور تربیت
تحریری وضاحت۔ علم کا قاعدہ (kb_articles) ورژن شدہ اور تین لسانی ہے (title_en/body_en/.../_sd)، فی department ملکیت ہے، اور draft → review → published → archived سے گزرتا ہے۔ sop_documents، service_catalog_entries، circulars، اور عام documents ذخیرہ (forms، SOPs، circulars، ڈاؤن لوڈ قابل repository آئٹمز) ماڈیول J (KB + SOPs) اور ماڈیول N (تجاویز و مواد پورٹل) کا احاطہ کرتے ہیں۔ تربیتی LMS-lite (training_courses، course_enrollments، training_exams، exam_attempts، certifications) امتحان-گیٹڈ سرٹیفکیشن (ماڈیول O) کو نافذ کرتا ہے جو تمام حکومتی عملے کو users.is_certified پرچم لگنے اور لائیو ٹکٹ تک رسائی کھلنے سے پہلے پاس کرنا ضروری ہے (/specs/ur/04-roles-permissions/ §14 دیکھیں)۔ سرٹیفکیشنز میں issued_on/expires_on بار بار دوبارہ سرٹیفکیشن کے لیے ہیں (بالعموم سالانہ)۔ media_library مشترکہ اثاثہ اسٹور ہے (MinIO میں اپلوڈز میٹا ڈیٹا کے ساتھ) جس کا حوالہ عہدیداروں، KB، اور ان لائن آرٹیکل تصاویر دیتی ہیں۔
3.10 نظام اور تشکیل
تحریری وضاحت۔ feature_flags رن ٹائم ٹوگل جدول ہے؛ ایک فلیگ کی مؤثر قدر چین platform-default → department-override → env-override → user-segment-override → off (پہلا میچ جیتتا ہے) سے حل کی جاتی ہے، Redis میں کیش ہوتی ہے اور تبدیلی پر آڈٹ-لاگ ہوتی ہے (/specs/ur/15-tech-architecture/ §11 دیکھیں)۔ audit_logs صرف اضافہ (append-only) عالمی آڈٹ ہے (کبھی UPDATE یا DELETE نہیں؛ ماہانہ تقسیم — §7 دیکھیں)؛ ہر حالت تبدیل کرنے والا مراعات والا عمل before/after JSON، اداکار، IP، اور درخواست id کے ساتھ ایک قطار لکھتا ہے تاکہ مربوط بنایا جا سکے۔ integrations_configs NADRA/SECP/FBR/SRB/PSEB/NITB e-Office/OIDC/Mailjet/SMS/WhatsApp کے لیے فی-فراہم کنندہ سیٹنگز رکھتا ہے، رازات صرف vault_ref راہ کے طور پر رکھے جاتے ہیں — راز خود کبھی نہیں۔ webhooks باہر جانے والے ویب ہوک سبسکرپشنز (HMAC-سائن شدہ) متعین کرتا ہے۔ open_data_exports ہر شفافیت-ڈیش بورڈ / اوپن ڈیٹا ایکسپورٹ blob ریکارڈ کرتا ہے۔ qr_verifiable_documents ایک پیدا کردہ سرکاری خط (documents) کو QR ٹوکن + مواد ہیش سے باندھتا ہے تاکہ عوام خط کی اصالت کی تصدیق کر سکے اور جعلسازی کا پتہ چل سکے۔ system_settings عام key-value اسٹور ہے (SMTP، Mailjet، SMS گیٹ وے، WhatsApp، برانڈنگ) جس میں is_secret ان قطاروں کو نشان زد کرتا ہے جن کی قدر صرف والٹ میں رہتی ہے۔
4. جدول کی تعریفیں
نوٹیشن: ہر جدول معیاری آڈٹ کالم (§2.3) شامل کرتا ہے۔ ہر جدول میں _(standard audit)_ قطار اس بلاک کا حوالہ دیتی ہے تاکہ فہرستیں پڑھنے میں آسان رہیں۔ FK = غیر ملکی کلید؛ UQ = منفرد؛ NN = not null؛ PK = بنیادی کلید۔
4.1 شناخت اور ادارہ
organizations
مقصد: ایک رجسٹرڈ وجود (کمپنی/فرد) جو ٹکٹ دائر کرتا ہے۔ پانچ entity اقسام ایک مشروط فارم چلاتی ہیں؛ فائل-فرسٹ، متوازی تصدیق کا لائف سائیکل۔
| کالم | قسم | پابندیاں | نوٹس |
|---|---|---|---|
id |
BIGINT UNSIGNED |
PK, NN, AUTO_INCREMENT |
متبادل۔ |
entity_type |
ENUM('secp_company','sole_proprietor','freelancer','foreign_branch','early_startup') |
NN |
مشروط کالم چلاتا ہے۔ |
legal_name |
VARCHAR(255) |
NN |
رجسٹرڈ نام۔ |
trading_name |
VARCHAR(255) |
NULL |
اختیاری DBA۔ |
secp_registration_no |
VARCHAR(32) |
NULL, UQ |
صرف SECP کمپنیوں کے لیے۔ |
ntn |
VARCHAR(20) |
NULL, UQ |
FBR نیشنل ٹیکس نمبر۔ |
srb_tax_id |
VARCHAR(32) |
NULL |
سندھ ریونیو بورڈ۔ |
pseb_membership_no |
VARCHAR(32) |
NULL |
PSEB ممبرشپ۔ |
domain_email_domain |
VARCHAR(255) |
NULL |
نمائندے کے email ثبوت کے لیے تصدیق شدہ ڈومین۔ |
verification_status |
ENUM('provisional','verified','on_hold','suspended','dissolved') |
NN DEFAULT 'provisional' |
لائف سائیکل۔ |
kyc_level |
TINYINT UNSIGNED |
NN DEFAULT 0 |
کامیاب چیکس کی گہرائی۔ |
primary_rep_id |
BIGINT UNSIGNED |
NULL, FK → representatives.id |
غیر معیاری شدہ بالکل-ایک پوائنٹر؛ منتقلی پر برقرار رکھا جاتا ہے۔ |
locale |
CHAR(3) |
NN DEFAULT 'en' |
en/ur/sd۔ |
registered_at |
DATETIME(6) |
NN |
جب ادارے کا اکاؤنٹ بنا۔ |
re_atted_due_at |
DATE |
NULL |
اگلی دورانیاتی دوبارہ تصدیق۔ |
| (standard audit) | — | §2.3 دیکھیں | +deleted_at (نرم حذف)۔ |
organization_locations
مقصد: ہر ادارے کے لیے ایک یا زیادہ طبعی پتے۔
| کالم | قسم | پابندیاں | نوٹس |
|---|---|---|---|
id |
BIGINT UNSIGNED |
PK, NN, AUTO_INCREMENT |
|
org_id |
BIGINT UNSIGNED |
NN, FK → organizations.id, indexed |
|
label |
VARCHAR(64) |
NULL |
مثلاً "ہیڈ آفس"، "کراچی شاخ"۔ |
address_line1 |
VARCHAR(255) |
NN |
|
address_line2 |
VARCHAR(255) |
NULL |
|
city |
VARCHAR(64) |
NN |
|
district |
VARCHAR(64) |
NULL |
GIS ہیٹ میپ کے لیے۔ |
province |
VARCHAR(64) |
NN DEFAULT 'Sindh' |
|
postal_code |
VARCHAR(16) |
NULL |
|
country |
VARCHAR(64) |
NN DEFAULT 'Pakistan' |
|
geo_lat |
DECIMAL(10,7) |
NULL |
اختیاری پن۔ |
geo_lng |
DECIMAL(10,7) |
NULL |
اختیاری پن۔ |
is_primary |
TINYINT(1) |
NN DEFAULT 0 |
ہر ادارے کے لیے ایک بنیادی۔ |
| (standard audit) | — | §2.3 دیکھیں | +deleted_at۔ |
representatives
مقصد: ہر ادارے کے لیے متعدد مجاز نمائندے؛ ایک بنیادی لازمی۔ ہر ایک ایک لاگ ان users قطار سے 1:1 میپ ہوتا ہے۔
| کالم | قسم | پابندیاں | نوٹس |
|---|---|---|---|
id |
BIGINT UNSIGNED |
PK, NN, AUTO_INCREMENT |
|
org_id |
BIGINT UNSIGNED |
NN, FK → organizations.id, indexed |
|
user_id |
BIGINT UNSIGNED |
NULL, UQ, FK → users.id |
لاگ ان شناخت (1:1)۔ |
cnic |
CHAR(15) |
NULL |
13-ہندسی + فارمیٹ؛ PII — مرموز (§9 دیکھیں)۔ |
full_name |
VARCHAR(255) |
NN |
|
designation |
VARCHAR(128) |
NULL |
عنوان۔ |
role_at_company |
VARCHAR(128) |
NULL |
فعلی کردار، آزاد متن۔ |
email |
VARCHAR(255) |
NN, UQ |
جہاں قابلِ اطلاق ہو ڈومین تصدیق شدہ۔ |
mobile_e164 |
VARCHAR(16) |
NN |
E.164۔ |
whatsapp_e164 |
VARCHAR(16) |
NULL |
اختیاری، WhatsApp چینل کے لیے۔ |
locale |
CHAR(3) |
NN DEFAULT 'en' |
|
two_fa_method |
ENUM('totp','sms','none') |
NN DEFAULT 'totp' |
|
status |
ENUM('invited','active','revoked','transferred') |
NN DEFAULT 'invited' |
|
is_primary |
TINYINT(1) |
NN DEFAULT 0 |
تیز چیکس کے لیے کردار تفویض کا عکس۔ |
accepted_at |
DATETIME(6) |
NULL |
|
| (standard audit) | — | §2.3 دیکھیں | +deleted_at۔ |
rep_role_assignments
مقصد: ایک نمائندے کو کمپنی-سائڈ کردار ٹیمپلیٹ (Primary/Admin/Filer/Viewer/Notify) سے باندھتا ہے۔
| کالم | قسم | پابندیاں | نوٹس |
|---|---|---|---|
id |
BIGINT UNSIGNED |
PK, NN, AUTO_INCREMENT |
|
rep_id |
BIGINT UNSIGNED |
NN, FK → representatives.id, indexed |
|
role_id |
BIGINT UNSIGNED |
NN, FK → roles.id |
کمپنی-سائڈ ٹیمپلیٹ۔ |
assigned_by |
BIGINT UNSIGNED |
NULL, FK → users.id |
|
assigned_at |
DATETIME(6) |
NN |
|
revoked_at |
DATETIME(6) |
NULL |
|
reason_code |
VARCHAR(64) |
NULL |
آڈٹ وجہ۔ |
| (standard audit) | — | §2.3 دیکھیں |
rep_permission_overrides
مقصد: فی نمائندہ انفرادی صلاحیتوں پر دقیق grant/revoke (کردار دستاویز §7 دیکھیں)۔
| کالم | قسم | پابندیاں | نوٹس |
|---|---|---|---|
id |
BIGINT UNSIGNED |
PK, NN, AUTO_INCREMENT |
|
rep_id |
BIGINT UNSIGNED |
NN, FK → representatives.id, indexed |
|
capability_key |
VARCHAR(64) |
NN |
مثلاً ticket.file، company.export۔ |
effect |
ENUM('grant','revoke') |
NN |
|
scope_json |
LONGTEXT |
NULL |
اختیاری scope باریکی۔ |
reason |
VARCHAR(255) |
NULL |
آڈٹ بنیاد۔ |
| (standard audit) | — | §2.3 دیکھیں |
verification_jobs
مقصد: کسی ادارے یا نمائندے کے خلاف ایک بیک گراؤنڈ تصدیقی لوک اپ (SECP/FBR/SRB/PSEB/NADRA/domain-email)۔
| کالم | قسم | پابندیاں | نوٹس |
|---|---|---|---|
id |
BIGINT UNSIGNED |
PK, NN, AUTO_INCREMENT |
|
org_id |
BIGINT UNSIGNED |
NN, FK → organizations.id, indexed |
|
rep_id |
BIGINT UNSIGNED |
NULL, FK → representatives.id |
نمائندے پر NADRA CNIC چیکس کے لیے۔ |
provider |
ENUM('secp','fbr','srb','pseb','nadra','domain_email') |
NN |
|
status |
ENUM('queued','running','passed','failed','error') |
NN DEFAULT 'queued' |
|
result_json |
LONGTEXT |
NULL |
معیاری شدہ نتیجہ (redacted PII)۔ |
raw_payload |
LONGTEXT |
NULL |
خام ردِعمل (مرموز؛ PII — §9 دیکھیں)۔ |
provider_reference |
VARCHAR(128) |
NULL |
بیرونی ٹرانزیکشن id۔ |
started_at |
DATETIME(6) |
NULL |
|
finished_at |
DATETIME(6) |
NULL |
|
error_message |
TEXT |
NULL |
|
| (standard audit) | — | §2.3 دیکھیں |
verification_documents
مقصد: رجسٹریشن / دوبارہ تصدیق کے دوران ثبوت کے طور پر جمع کردہ دستاویزات (مثلاً SECP سرٹیفکیٹ، بینک خط)۔
| کالم | قسم | پابندیاں | نوٹس |
|---|---|---|---|
id |
BIGINT UNSIGNED |
PK, NN, AUTO_INCREMENT |
|
org_id |
BIGINT UNSIGNED |
NN, FK → organizations.id, indexed |
|
verification_job_id |
BIGINT UNSIGNED |
NULL, FK → verification_jobs.id |
اگر کسی چیک سے منسلک ہو۔ |
media_id |
BIGINT UNSIGNED |
NN, FK → media_library.id |
اپلوڈ شدہ blob حوالہ۔ |
doc_type |
VARCHAR(64) |
NN |
مثلاً secp_certificate، bank_proof۔ |
status |
ENUM('pending','verified','rejected') |
NN DEFAULT 'pending' |
|
notes |
TEXT |
NULL |
|
| (standard audit) | — | §2.3 دیکھیں | +deleted_at۔ |
consents
مقصد: فی ادارہ/نمائندہ رضامندی (ڈیٹا پروسیسنگ، انضمام لوک اپس، مارکیٹنگ) ریکارڈ کرتا ہے، ٹائم اسٹیمپ اور ورژن کے ساتھ۔
| کالم | قسم | پابندیاں | نوٹس |
|---|---|---|---|
id |
BIGINT UNSIGNED |
PK, NN, AUTO_INCREMENT |
|
org_id |
BIGINT UNSIGNED |
NULL, FK → organizations.id |
|
rep_id |
BIGINT UNSIGNED |
NULL, FK → representatives.id |
|
consent_type |
VARCHAR(64) |
NN |
مثلاً data_processing، nadra_lookup، marketing۔ |
granted |
TINYINT(1) |
NN |
1=دی گئی، 0=واپس لی گئی۔ |
policy_version |
VARCHAR(32) |
NN |
پرائیویسی پالیسی ورژن۔ |
consented_at |
DATETIME(6) |
NN |
|
withdrawn_at |
DATETIME(6) |
NULL |
|
| (standard audit) | — | §2.3 دیکھیں |
4.2 محکمات
departments
مقصد: حکومتی تنظیمی درخت۔ اعلیٰ سطح = محکمہ؛ نسٹ شدہ = سیکشن/ذیلی محکمہ۔
| کالم | قسم | پابندیاں | نوٹس |
|---|---|---|---|
id |
BIGINT UNSIGNED |
PK, NN, AUTO_INCREMENT |
|
parent_id |
BIGINT UNSIGNED |
NULL, FK → departments.id, indexed |
NULL = اعلیٰ سطح محکمہ۔ |
code |
VARCHAR(8) |
NN, UQ |
مختصر کوڈ مثلاً LBR، SITD، FIN۔ |
name_en |
VARCHAR(255) |
NN |
|
name_ur |
VARCHAR(255) |
NULL |
|
name_sd |
VARCHAR(255) |
NULL |
|
description |
TEXT |
NULL |
|
is_owner_dept |
TINYINT(1) |
NN DEFAULT 0 |
S&ITD کے لیے 1۔ |
depth |
TINYINT UNSIGNED |
NN DEFAULT 0 |
درخت گہرائی کیش۔ |
path |
VARCHAR(512) |
NULL |
مادی راہ /1/4/9/ ذیلی درخت استفسارات کے لیے۔ |
status |
ENUM('active','inactive') |
NN DEFAULT 'active' |
|
sort_order |
INT |
NN DEFAULT 0 |
|
| (standard audit) | — | §2.3 دیکھیں | +deleted_at۔ |
department_sections
مقصد: کسی محکمے کے تحت leaf تفویض کے قابل سیکشنز کے لیے سہولت پروجیکشن / واضح میٹا ڈیٹا۔
| کالم | قسم | پابندیاں | نوٹس |
|---|---|---|---|
id |
BIGINT UNSIGNED |
PK, NN, AUTO_INCREMENT |
|
dept_id |
BIGINT UNSIGNED |
NN, FK → departments.id, indexed |
والد محکمہ۔ |
section_dept_id |
BIGINT UNSIGNED |
NN, FK → departments.id |
ذیلی-نوڈ قطار خود۔ |
code |
VARCHAR(16) |
NULL |
سیکشن کوڈ۔ |
name_en |
VARCHAR(255) |
NN |
|
parent_section_id |
BIGINT UNSIGNED |
NULL, FK → department_sections.id |
|
is_assignable |
TINYINT(1) |
NN DEFAULT 1 |
ٹکٹ وصول کر سکتا ہے۔ |
| (standard audit) | — | §2.3 دیکھیں |
holiday_calendar
مقصد: سندھ عوامی چھٹیاں (اور قومی) جو SLA روکنے کے لیے استعمال ہوتی ہیں۔
| کالم | قسم | پابندیاں | نوٹس |
|---|---|---|---|
id |
BIGINT UNSIGNED |
PK, NN, AUTO_INCREMENT |
|
holiday_date |
DATE |
NN |
|
name_en |
VARCHAR(128) |
NN |
|
name_ur |
VARCHAR(128) |
NULL |
|
name_sd |
VARCHAR(128) |
NULL |
|
region |
VARCHAR(64) |
NN DEFAULT 'Sindh' |
|
holiday_type |
ENUM('public','bank','optional') |
NN DEFAULT 'public' |
|
| (standard audit) | — | §2.3 دیکھیں |
department_holidays
مقصد: مشترکہ چھٹی کیلنڈر کا فی-محکمہ اوور رائڈ۔
| کالم | قسم | پابندیاں | نوٹس |
|---|---|---|---|
id |
BIGINT UNSIGNED |
PK, NN, AUTO_INCREMENT |
|
dept_id |
BIGINT UNSIGNED |
NN, FK → departments.id, indexed |
|
holiday_id |
BIGINT UNSIGNED |
NULL, FK → holiday_calendar.id |
مشترکہ کیلنڈر کا حوالہ۔ |
override_date |
DATE |
NULL |
محکمہ-مخصوص تاریخ۔ |
observes |
TINYINT(1) |
NN DEFAULT 1 |
1=مناتا ہے، 0=واضح طور پر چھوڑتا ہے۔ |
| (standard audit) | — | §2.3 دیکھیں |
business_hours
مقصد: ہر محکمے کے لیے ہر ہفتے کے دن کام کے اوقات؛ SLA گھڑی صرف ان ونڈوز کے اندر چلتی ہے۔
| کالم | قسم | پابندیاں | نوٹس |
|---|---|---|---|
id |
BIGINT UNSIGNED |
PK, NN, AUTO_INCREMENT |
|
dept_id |
BIGINT UNSIGNED |
NN, FK → departments.id, indexed |
|
weekday |
TINYINT UNSIGNED |
NN |
0=اتوار … 6=ہفتہ۔ |
opens_at |
TIME |
NULL |
|
closes_at |
TIME |
NULL |
|
is_working_day |
TINYINT(1) |
NN DEFAULT 1 |
|
timezone |
VARCHAR(32) |
NN DEFAULT 'Asia/Karachi' |
|
| (standard audit) | — | §2.3 دیکھیں |
4.3 صارفین، کردار اور عہدیدار
users
مقصد: تمام اداکاروں (حکومتی عملہ، کمپنی نمائندے، شہری، سروس اکاؤنٹس) کے لیے متحدہ لاگ ان شناخت۔
| کالم | قسم | پابندیاں | نوٹس |
|---|---|---|---|
id |
BIGINT UNSIGNED |
PK, NN, AUTO_INCREMENT |
|
keycloak_sub |
CHAR(36) |
NN, UQ |
OIDC subject UUID۔ |
display_name |
VARCHAR(255) |
NN |
|
email |
VARCHAR(255) |
NULL, UQ |
سروس اکاؤنٹس کے لیے NULL۔ |
mobile_e164 |
VARCHAR(16) |
NULL |
|
locale |
CHAR(3) |
NN DEFAULT 'en' |
|
two_fa_method |
ENUM('totp','sms','none') |
NN DEFAULT 'totp' |
|
status |
ENUM('active','suspended','training','deactivated') |
NN DEFAULT 'active' |
|
is_certified |
TINYINT(1) |
NN DEFAULT 0 |
لائیو ٹکٹ گیٹ (ماڈیول O)۔ |
dept_id |
BIGINT UNSIGNED |
NULL, FK → departments.id, indexed |
صرف حکومتی عملہ۔ |
rep_id |
BIGINT UNSIGNED |
NULL, UQ, FK → representatives.id |
صرف کمپنی سائڈ (1:1)۔ |
is_service_account |
TINYINT(1) |
NN DEFAULT 0 |
انضمام/ملازمتیں۔ |
last_login_at |
DATETIME(6) |
NULL |
|
| (standard audit) | — | §2.3 دیکھیں | +deleted_at۔ |
roles
مقصد: کردار ٹیمپلیٹس (حکومت، کمپنی، نگرانی، دیگر)۔
| کالم | قسم | پابندیاں | نوٹس |
|---|---|---|---|
id |
BIGINT UNSIGNED |
PK, NN, AUTO_INCREMENT |
|
code |
VARCHAR(64) |
NN, UQ |
مثلاً SUPER_ADMIN، OFFICER، PRIMARY_REP۔ |
side |
ENUM('gov','company','oversight','other') |
NN |
|
name_en |
VARCHAR(128) |
NN |
|
name_ur |
VARCHAR(128) |
NULL |
|
name_sd |
VARCHAR(128) |
NULL |
|
description |
TEXT |
NULL |
|
is_system |
TINYINT(1) |
NN DEFAULT 0 |
سیڈ شدہ، غیر-قابلِ حذف۔ |
| (standard audit) | — | §2.3 دیکھیں |
role_template_permissions
مقصد: ایک کردار ٹیمپلیٹ کے ذریعے دی گئی بنیادی صلاحیتیں (کردار دستاویز §8 کی میٹرکس)۔
| کالم | قسم | پابندیاں | نوٹس |
|---|---|---|---|
id |
BIGINT UNSIGNED |
PK, NN, AUTO_INCREMENT |
|
role_id |
BIGINT UNSIGNED |
NN, FK → roles.id, indexed |
|
capability_key |
VARCHAR(64) |
NN |
مثلاً ticket.file، sla.override۔ |
effect |
ENUM('allow','conditional') |
NN DEFAULT 'allow' |
conditional = میٹرکس میں ◐۔ |
| (standard audit) | — | §2.3 دیکھیں | |
| منفرد | (role_id, capability_key) |
UNIQUE |
user_role_assignments
مقصد: ایک صارف کو ایک یا زیادہ کردار ٹیمپلیٹس سے باندھتا ہے (scope/محکمہ کے ساتھ)۔
| کالم | قسم | پابندیاں | نوٹس |
|---|---|---|---|
id |
BIGINT UNSIGNED |
PK, NN, AUTO_INCREMENT |
|
user_id |
BIGINT UNSIGNED |
NN, FK → users.id, indexed |
|
role_id |
BIGINT UNSIGNED |
NN, FK → roles.id |
|
scope_dept_id |
BIGINT UNSIGNED |
NULL, FK → departments.id |
DA/Officer/DG/Sec کے لیے محکمہ scope۔ |
assigned_at |
DATETIME(6) |
NN |
|
revoked_at |
DATETIME(6) |
NULL |
|
assigned_by |
BIGINT UNSIGNED |
NULL, FK → users.id |
|
| (standard audit) | — | §2.3 دیکھیں |
user_permission_overrides
مقصد: فی صارف انفرادی صلاحیتوں پر دقیق grant/revoke۔
| کالم | قسم | پابندیاں | نوٹس |
|---|---|---|---|
id |
BIGINT UNSIGNED |
PK, NN, AUTO_INCREMENT |
|
user_id |
BIGINT UNSIGNED |
NN, FK → users.id, indexed |
|
capability_key |
VARCHAR(64) |
NN |
|
effect |
ENUM('grant','revoke') |
NN |
|
scope_dept_id |
BIGINT UNSIGNED |
NULL, FK → departments.id |
اختیاری محکمہ-محدود اوور رائڈ۔ |
reason |
VARCHAR(255) |
NULL |
|
| (standard audit) | — | §2.3 دیکھیں | |
| منفرد | (user_id, capability_key, scope_dept_id) |
UNIQUE |
officials
مقصد: برانڈ و عہدیداروں کے CMS ریکارڈز (وزیر/SACM، سیکریٹری، DG/ڈائریکٹر) جو سائٹ، خطوط، ڈیش بورڈز پر دکھائے جاتے ہیں۔
| کالم | قسم | پابندیاں | نوٹس |
|---|---|---|---|
id |
BIGINT UNSIGNED |
PK, NN, AUTO_INCREMENT |
|
title |
ENUM('minister','sacm','secretary','dg','director') |
NN |
|
full_name_en |
VARCHAR(255) |
NN |
|
full_name_ur |
VARCHAR(255) |
NULL |
|
full_name_sd |
VARCHAR(255) |
NULL |
|
dept_id |
BIGINT UNSIGNED |
NULL, FK → departments.id |
منسلک محکمہ۔ |
portrait_media_id |
BIGINT UNSIGNED |
NULL, FK → media_library.id |
|
message_en |
LONGTEXT |
NULL |
عوامی پیغام۔ |
message_ur |
LONGTEXT |
NULL |
|
message_sd |
LONGTEXT |
NULL |
|
is_current |
TINYINT(1) |
NN DEFAULT 1 |
سہولت پرچم۔ |
| (standard audit) | — | §2.3 دیکھیں | +deleted_at۔ |
official_terms
مقصد: تاریخی درستگی کے لیے date-scoped مدت (خطوط جاری کرنے کی تاریخ کے لیے درست عہدیدار رینڈر کرتے ہیں)۔
| کالم | قسم | پابندیاں | نوٹس |
|---|---|---|---|
id |
BIGINT UNSIGNED |
PK, NN, AUTO_INCREMENT |
|
official_id |
BIGINT UNSIGNED |
NN, FK → officials.id, indexed |
|
designation |
VARCHAR(128) |
NN |
مثلاً "سیکریٹری S&ITD"۔ |
effective_from |
DATE |
NN |
|
effective_to |
DATE |
NULL |
NULL = کھلا / موجودہ۔ |
metadata_json |
LONGTEXT |
NULL |
اضافی حقائق (اطلاع حوالہ)۔ |
| (standard audit) | — | §2.3 دیکھیں |
media_library
مقصد: مشترکہ اثاثہ رجسٹری (MinIO blobs: تصاویر، KB امیجز، منسلکات، پیدا کردہ دستاویزات، ایکسپورٹس)۔
| کالم | قسم | پابندیاں | نوٹس |
|---|---|---|---|
id |
BIGINT UNSIGNED |
PK, NN, AUTO_INCREMENT |
|
bucket |
VARCHAR(64) |
NN |
uploads/generated-docs/moms/avatars/exports۔ |
object_key |
VARCHAR(255) |
NN |
MinIO کلید۔ |
mime_type |
VARCHAR(128) |
NN |
|
size_bytes |
BIGINT UNSIGNED |
NN |
|
checksum_sha256 |
CHAR(64) |
NULL |
ڈیڈپ / سالمیت۔ |
av_status |
ENUM('pending','clean','infected','error') |
NN DEFAULT 'pending' |
ClamAV اسکین۔ |
is_encrypted |
TINYINT(1) |
NN DEFAULT 1 |
at-rest مرموز کاری پرچم۔ |
extracted_text |
LONGTEXT |
NULL |
OCR آؤٹ پٹ (انڈیکسنگ کے لیے)۔ |
owner_user_id |
BIGINT UNSIGNED |
NULL, FK → users.id |
اپلوڈر۔ |
expires_at |
DATETIME(6) |
NULL |
retention-محصول purge۔ |
| (standard audit) | — | §2.3 دیکھیں | +deleted_at۔ |
4.4 ٹکٹ اور ورک فلو
tickets
مقصد: مرکزی وجود؛ SLA، اسکیلیشن، رازداری، اور حل کے گیٹ کے ساتھ مکمل لائف سائیکل۔
| کالم | قسم | پابندیاں | نوٹس |
|---|---|---|---|
id |
BIGINT UNSIGNED |
PK, NN, AUTO_INCREMENT |
متبادل جواینٹ کلید۔ |
tracking_id |
VARCHAR(32) |
NN, UQ |
SITP-YYYY-DEPT-NNNNNN۔ |
title |
VARCHAR(255) |
NN |
|
description |
LONGTEXT |
NN |
|
status |
ENUM('new','triaged','assigned','in_progress','resolved','closed','reopened','appealed','withdrawn') |
NN DEFAULT 'new' |
|
priority |
ENUM('low','normal','high','urgent','vip') |
NN DEFAULT 'normal' |
|
category_id |
BIGINT UNSIGNED |
NULL, FK → ticket_categories.id, indexed |
|
dept_id |
BIGINT UNSIGNED |
NULL, FK → departments.id, indexed |
|
section_id |
BIGINT UNSIGNED |
NULL, FK → department_sections.id, indexed |
|
assigned_user_id |
BIGINT UNSIGNED |
NULL, FK → users.id |
حل کرنے والا افسر۔ |
org_id |
BIGINT UNSIGNED |
NN, FK → organizations.id, indexed |
دائر کرنے والی کمپنی۔ |
filer_rep_id |
BIGINT UNSIGNED |
NN, FK → representatives.id |
دائر کرنے والا نمائندہ۔ |
filer_user_id |
BIGINT UNSIGNED |
NULL, FK → users.id |
دائر کرنے والا لاگ ان صارف۔ |
locale |
CHAR(3) |
NN DEFAULT 'en' |
|
is_confidential |
TINYINT(1) |
NN DEFAULT 0 |
ABAC گیٹ۔ |
is_vip |
TINYINT(1) |
NN DEFAULT 0 |
VIP بندش گیٹ۔ |
is_anonymous |
TINYINT(1) |
NN DEFAULT 0 |
وہسٹل بلوور چینل۔ |
is_rti |
TINYINT(1) |
NN DEFAULT 0 |
RTI قانونی آخری تاریخ۔ |
sla_due_at |
DATETIME(6) |
NULL, indexed |
مؤثر آخری تاریخ۔ |
sla_paused_until |
DATETIME(6) |
NULL |
فعال روک کا اختتام۔ |
first_response_at |
DATETIME(6) |
NULL |
|
resolved_at |
DATETIME(6) |
NULL |
|
closed_at |
DATETIME(6) |
NULL |
|
resolution_note |
TEXT |
NULL |
حل پر لازمی۔ |
merged_into_ticket_id |
BIGINT UNSIGNED |
NULL, FK → tickets.id |
اگر ضم کیا گیا ہو۔ |
| (standard audit) | — | §2.3 دیکھیں | +deleted_at (نایاب؛ قانونی ہولڈ)۔ |
ticket_categories
مقصد: درجہ بندی ٹیکسونومی (فی محکمہ، نسٹ کے قابل)۔
| کالم | قسم | پابندیاں | نوٹس |
|---|---|---|---|
id |
BIGINT UNSIGNED |
PK, NN, AUTO_INCREMENT |
|
parent_id |
BIGINT UNSIGNED |
NULL, FK → ticket_categories.id |
درخت۔ |
dept_id |
BIGINT UNSIGNED |
NULL, FK → departments.id, indexed |
|
code |
VARCHAR(32) |
NN |
|
name_en |
VARCHAR(255) |
NN |
|
name_ur |
VARCHAR(255) |
NULL |
|
name_sd |
VARCHAR(255) |
NULL |
|
default_sla_definition_id |
BIGINT UNSIGNED |
NULL, FK → sla_definitions.id |
|
is_rti_category |
TINYINT(1) |
NN DEFAULT 0 |
|
sort_order |
INT |
NN DEFAULT 0 |
|
| (standard audit) | — | §2.3 دیکھیں |
ticket_threads
مقصد: کسی ٹکٹ پر گفتگو کا کنٹینر (عوامی بمقابلہ اندرونی)۔
| کالم | قسم | پابندیاں | نوٹس |
|---|---|---|---|
id |
BIGINT UNSIGNED |
PK, NN, AUTO_INCREMENT |
|
ticket_id |
BIGINT UNSIGNED |
NN, FK → tickets.id, indexed |
|
visibility |
ENUM('public','internal') |
NN |
|
| (standard audit) | — | §2.3 دیکھیں | |
| منفرد | (ticket_id, visibility) |
UNIQUE |
ticket_messages
مقصد: کسی تھریڈ میں انفرادی پیغامات (web، email، SMS، WhatsApp، IVR مآخذ)۔
| کالم | قسم | پابندیاں | نوٹس |
|---|---|---|---|
id |
BIGINT UNSIGNED |
PK, NN, AUTO_INCREMENT |
|
thread_id |
BIGINT UNSIGNED |
NN, FK → ticket_threads.id, indexed |
|
author_user_id |
BIGINT UNSIGNED |
NULL, FK → users.id |
inbound/system کے لیے NULL۔ |
author_display |
VARCHAR(255) |
NULL |
بیرونی/گمنام کے لیے۔ |
body |
LONGTEXT |
NN |
رینڈر شدہ markdown/HTML سینیٹائزڈ۔ |
body_plain |
LONGTEXT |
NULL |
SMS/تلاش کے لیے اسٹرپ شدہ۔ |
source |
ENUM('web','email','sms','whatsapp','ivr','system','api') |
NN DEFAULT 'web' |
|
source_ref |
VARCHAR(128) |
NULL |
بیرونی پیغام id۔ |
is_internal_note |
TINYINT(1) |
NN DEFAULT 0 |
|
is_redacted |
TINYINT(1) |
NN DEFAULT 0 |
PII redaction لاگو۔ |
sent_at |
DATETIME(6) |
NULL |
|
| (standard audit) | — | §2.3 دیکھیں |
ticket_attachments
مقصد: کسی ٹکٹ پیغام (یا براہ راست ٹکٹ) سے منسلک فائلیں۔
| کالم | قسم | پابندیاں | نوٹس |
|---|---|---|---|
id |
BIGINT UNSIGNED |
PK, NN, AUTO_INCREMENT |
|
ticket_id |
BIGINT UNSIGNED |
NN, FK → tickets.id, indexed |
|
message_id |
BIGINT UNSIGNED |
NULL, FK → ticket_messages.id |
اگر کسی پیغام سے منسلک ہو۔ |
media_id |
BIGINT UNSIGNED |
NN, FK → media_library.id |
blob۔ |
display_name |
VARCHAR(255) |
NN |
|
uploaded_by_user_id |
BIGINT UNSIGNED |
NULL, FK → users.id |
|
is_evidence |
TINYINT(1) |
NN DEFAULT 0 |
ثبوت گیٹ میں شمار ہوتا ہے۔ |
visibility |
ENUM('public','internal') |
NN DEFAULT 'public' |
|
| (standard audit) | — | §2.3 دیکھیں |
ticket_watchers
مقصد: کسی ٹکٹ پر CC / اسکیلیشن میں شامل کردہ سامعین۔
| کالم | قسم | پابندیاں | نوٹس |
|---|---|---|---|
id |
BIGINT UNSIGNED |
PK, NN, AUTO_INCREMENT |
|
ticket_id |
BIGINT UNSIGNED |
NN, FK → tickets.id, indexed |
|
user_id |
BIGINT UNSIGNED |
NN, FK → users.id |
|
added_by_user_id |
BIGINT UNSIGNED |
NULL, FK → users.id |
|
reason |
ENUM('cc','escalation','triage','break_glass','manual') |
NN DEFAULT 'manual' |
|
added_at |
DATETIME(6) |
NN |
|
removed_at |
DATETIME(6) |
NULL |
|
| (standard audit) | — | §2.3 دیکھیں | |
| منفرد | (ticket_id, user_id) |
UNIQUE |
ticket_subtasks
مقصد: ایک والد ٹکٹ کی تقسیم سے پیدا شدہ چائلڈ ٹکٹ (یا کسی تصدیق شدہ MoM ایکشن آئٹم سے)۔
| کالم | قسم | پابندیاں | نوٹس |
|---|---|---|---|
id |
BIGINT UNSIGNED |
PK, NN, AUTO_INCREMENT |
|
parent_ticket_id |
BIGINT UNSIGNED |
NN, FK → tickets.id, indexed |
|
child_ticket_id |
BIGINT UNSIGNED |
NN, UQ, FK → tickets.id |
ذیلی ٹکٹ۔ |
extracted_action_item_id |
BIGINT UNSIGNED |
NULL, FK → extracted_action_items.id |
اگر MoM سے ہو۔ |
title |
VARCHAR(255) |
NN |
|
due_date |
DATE |
NULL |
|
status |
ENUM('open','in_progress','done','cancelled') |
NN DEFAULT 'open' |
|
| (standard audit) | — | §2.3 دیکھیں |
ticket_links
مقصد: دو ٹکٹوں کے درمیان ٹائپ شدہ تعلقات (ضم، تقسیم، متعلقہ، نقل، blocks)۔
| کالم | قسم | پابندیاں | نوٹس |
|---|---|---|---|
id |
BIGINT UNSIGNED |
PK, NN, AUTO_INCREMENT |
|
source_ticket_id |
BIGINT UNSIGNED |
NN, FK → tickets.id, indexed |
|
target_ticket_id |
BIGINT UNSIGNED |
NN, FK → tickets.id, indexed |
|
link_type |
ENUM('merge','split','relate','duplicate','blocks') |
NN |
|
note |
VARCHAR(255) |
NULL |
|
| (standard audit) | — | §2.3 دیکھیں | |
| منفرد | (source_ticket_id, target_ticket_id, link_type) |
UNIQUE |
ticket_history
مقصد: صرف اضافہ (append-only) فی ٹکٹ ایونٹ لاگ (حالت، تفویض، SLA، ترجیح کی تبدیلیاں)۔
| کالم | قسم | پابندیاں | نوٹس |
|---|---|---|---|
id |
BIGINT UNSIGNED |
PK, NN, AUTO_INCREMENT |
|
ticket_id |
BIGINT UNSIGNED |
NN, FK → tickets.id, indexed |
|
actor_user_id |
BIGINT UNSIGNED |
NULL, FK → users.id |
سسٹم کے لیے NULL۔ |
event_type |
VARCHAR(64) |
NN |
مثلاً status.changed، sla.paused۔ |
from_value |
VARCHAR(255) |
NULL |
|
to_value |
VARCHAR(255) |
NULL |
|
metadata_json |
LONGTEXT |
NULL |
|
occurred_at |
DATETIME(6) |
NN |
4.5 SLA، اسکیلیشن اور حل
sla_definitions
مقصد: فی (محکمہ، زمرہ، ترجیح) قابلِ تشکیل SLA۔
| کالم | قسم | پابندیاں | نوٹس |
|---|---|---|---|
id |
BIGINT UNSIGNED |
PK, NN, AUTO_INCREMENT |
|
dept_id |
BIGINT UNSIGNED |
NN, FK → departments.id, indexed |
|
category_id |
BIGINT UNSIGNED |
NULL, FK → ticket_categories.id |
NULL = محکمہ-وسیع ڈیفالٹ۔ |
priority |
ENUM('low','normal','high','urgent','vip') |
NN |
|
first_response_hours |
INT UNSIGNED |
NN |
کام-اوقات گھڑی۔ |
resolution_hours |
INT UNSIGNED |
NN |
کام-اوقات گھڑی۔ |
pauses_on_await |
TINYINT(1) |
NN DEFAULT 1 |
کمپنی کے انتظار میں روکیں۔ |
pauses_on_weekend |
TINYINT(1) |
NN DEFAULT 1 |
|
pauses_on_holiday |
TINYINT(1) |
NN DEFAULT 1 |
سندھ کیلنڈر۔ |
is_active |
TINYINT(1) |
NN DEFAULT 1 |
|
| (standard audit) | — | §2.3 دیکھیں | |
| منفرد | (dept_id, category_id, priority) |
UNIQUE |
escalation_rules
مقصد: فی محکمہ 2/5/10-دن کا ٹیئر لیڈر، ہدف کردار، اور mode۔
| کالم | قسم | پابندیاں | نوٹس |
|---|---|---|---|
id |
BIGINT UNSIGNED |
PK, NN, AUTO_INCREMENT |
|
dept_id |
BIGINT UNSIGNED |
NN, FK → departments.id, indexed |
|
tier |
TINYINT UNSIGNED |
NN |
1=DG(2د)، 2=Sec(7د)، 3=Min(17د)۔ |
days_after_open |
INT UNSIGNED |
NN |
مجموعی دن۔ |
target_role_id |
BIGINT UNSIGNED |
NN, FK → roles.id |
نگرانی کردار۔ |
mode |
ENUM('notify','notify_plus_action') |
NN DEFAULT 'notify' |
نگرانی اختیارات کا عکس۔ |
is_active |
TINYINT(1) |
NN DEFAULT 1 |
|
| (standard audit) | — | §2.3 دیکھیں |
escalation_events
مقصد: کسی ٹکٹ پر ہر اسکیلیشن ٹیئر کے چلنے کا ریکارڈ۔
| کالم | قسم | پابندیاں | نوٹس |
|---|---|---|---|
id |
BIGINT UNSIGNED |
PK, NN, AUTO_INCREMENT |
|
ticket_id |
BIGINT UNSIGNED |
NN, FK → tickets.id, indexed |
|
rule_id |
BIGINT UNSIGNED |
NN, FK → escalation_rules.id |
|
target_user_id |
BIGINT UNSIGNED |
NULL, FK → users.id |
حل شدہ ہدف۔ |
fired_at |
DATETIME(6) |
NN |
|
outcome |
VARCHAR(64) |
NULL |
مثلاً notified، watcher_added۔ |
| (standard audit) | — | §2.3 دیکھیں |
sla_pause_events
مقصد: ہر SLA گھڑی کا روکنا/دوبارہ شروع کرنا، تاکہ مؤثر SLA فارنسیکل طریقے سے دوبارہ تشکیل دیا جا سکے۔
| کالم | قسم | پابندیاں | نوٹس |
|---|---|---|---|
id |
BIGINT UNSIGNED |
PK, NN, AUTO_INCREMENT |
|
ticket_id |
BIGINT UNSIGNED |
NN, FK → tickets.id, indexed |
|
reason |
ENUM('await_company','weekend','holiday','manual','tri_meeting') |
NN |
|
paused_at |
DATETIME(6) |
NN |
|
resumed_at |
DATETIME(6) |
NULL |
NULL = ابھی بھی روکا ہوا۔ |
paused_seconds |
INT UNSIGNED |
NULL |
دوبارہ شروع کرنے پر کمپیوٹڈ۔ |
note |
VARCHAR(255) |
NULL |
|
actor_user_id |
BIGINT UNSIGNED |
NULL, FK → users.id |
resolution_evidence
مقصد: حل کے ثبوت کا گیٹ — resolved تک منتقلی کے لیے کم از کم ایک قطار لازمی۔
| کالم | قسم | پابندیاں | نوٹس |
|---|---|---|---|
id |
BIGINT UNSIGNED |
PK, NN, AUTO_INCREMENT |
|
ticket_id |
BIGINT UNSIGNED |
NN, FK → tickets.id, indexed |
|
attachment_id |
BIGINT UNSIGNED |
NULL, FK → ticket_attachments.id |
ثبوت فائل۔ |
note |
TEXT |
NN |
حل کا نوٹ۔ |
submitted_by_user_id |
BIGINT UNSIGNED |
NN, FK → users.id |
|
submitted_at |
DATETIME(6) |
NN |
|
approval_status |
ENUM('pending','approved','rejected','auto') |
NN DEFAULT 'auto' |
حساس/VIP کے لیے approved درکار۔ |
approved_by_user_id |
BIGINT UNSIGNED |
NULL, FK → users.id |
VIP کے لیے چیئر/DG۔ |
approved_at |
DATETIME(6) |
NULL |
|
| (standard audit) | — | §2.3 دیکھیں |
appeals
مقصد: کمپنی یا شہری کی طرف سے کسی حل یا رد کے خلاف اپیل۔
| کالم | قسم | پابندیاں | نوٹس |
|---|---|---|---|
id |
BIGINT UNSIGNED |
PK, NN, AUTO_INCREMENT |
|
ticket_id |
BIGINT UNSIGNED |
NN, FK → tickets.id, indexed |
|
appealed_by_user_id |
BIGINT UNSIGNED |
NN, FK → users.id |
|
reason |
TEXT |
NN |
|
tier |
TINYINT UNSIGNED |
NN DEFAULT 1 |
اپیل ٹیئر (CPGRAMS انداز)۔ |
status |
ENUM('filed','under_review','upheld','rejected','escalated') |
NN DEFAULT 'filed' |
|
reviewer_user_id |
BIGINT UNSIGNED |
NULL, FK → users.id |
|
decision_note |
TEXT |
NULL |
|
decided_at |
DATETIME(6) |
NULL |
|
| (standard audit) | — | §2.3 دیکھیں |
csat_responses
مقصد: حل کے بعد صارف اطمینان کی درجہ بندی۔
| کالم | قسم | پابندیاں | نوٹس |
|---|---|---|---|
id |
BIGINT UNSIGNED |
PK, NN, AUTO_INCREMENT |
|
ticket_id |
BIGINT UNSIGNED |
NN, UQ, FK → tickets.id |
ہر ٹکٹ کے لیے ایک۔ |
submitted_by_user_id |
BIGINT UNSIGNED |
NN, FK → users.id |
|
rating |
TINYINT UNSIGNED |
NN |
1..5۔ |
comment |
TEXT |
NULL |
|
submitted_at |
DATETIME(6) |
NN |
4.6 اے آئی
ai_engine_configs
مقصد: 11 اے آئی صلاحیتوں + transcription کے لیے پلگ ایبل انجن رجسٹری۔
| کالم | قسم | پابندیاں | نوٹس |
|---|---|---|---|
id |
BIGINT UNSIGNED |
PK, NN, AUTO_INCREMENT |
|
feature |
VARCHAR(48) |
NN |
ocr،summary،routing،urgency،draft_reply،translation،duplicate،chatbot،redaction،trends،mom_extract،transcribe۔ |
provider |
ENUM('azure','google','aws','ollama_vllm','tesseract','whisper') |
NN |
|
model |
VARCHAR(64) |
NULL |
مثلاً gpt-4o، llama3-70b۔ |
api_endpoint |
VARCHAR(255) |
NULL |
|
is_cloud |
TINYINT(1) |
NN |
کلاؤڈ بمقابلہ آن-پریمائز۔ |
sensitivity_class |
ENUM('public','internal','confidential','restricted') |
NN DEFAULT 'internal' |
زیادہ سے زیادہ ڈیٹا طبقہ جس کی خدمت کر سکے۔ |
priority |
TINYINT UNSIGNED |
NN DEFAULT 100 |
کمتر = ترجیحی۔ |
enabled |
TINYINT(1) |
NN DEFAULT 1 |
|
env |
ENUM('dev','staging','prod') |
NN DEFAULT 'prod' |
|
config_json |
LONGTEXT |
NULL |
اضافی پیرامیٹرز (temperature، وغیرہ)۔ |
| (standard audit) | — | §2.3 دیکھیں |
ai_runs
مقصد: ہر اے آئی اطلاق کا آڈٹ (انجن، ٹوکنز، لاگت، لیٹنسی، redaction)۔
| کالم | قسم | پابندیاں | نوٹس |
|---|---|---|---|
id |
BIGINT UNSIGNED |
PK, NN, AUTO_INCREMENT |
|
engine_config_id |
BIGINT UNSIGNED |
NN, FK → ai_engine_configs.id, indexed |
|
feature |
VARCHAR(48) |
NN |
استفسار کے لیے غیر معیاری شدہ۔ |
input_ref_type |
VARCHAR(32) |
NULL |
ticket،mom،message،kb، وغیرہ۔ |
input_ref_id |
BIGINT UNSIGNED |
NULL |
|
input_summary |
LONGTEXT |
NULL |
redacted اسنیپ شاٹ۔ |
output_json |
LONGTEXT |
NULL |
ساختی نتیجہ۔ |
prompt_tokens |
INT UNSIGNED |
NULL |
|
completion_tokens |
INT UNSIGNED |
NULL |
|
cost_usd |
DECIMAL(12,4) |
NULL |
USD مائیکرو-لاگت میں۔ |
latency_ms |
INT UNSIGNED |
NULL |
|
status |
ENUM('ok','fallback','failed','redacted') |
NN |
|
was_redacted |
TINYINT(1) |
NN DEFAULT 0 |
|
error_message |
TEXT |
NULL |
|
started_at |
DATETIME(6) |
NN |
|
finished_at |
DATETIME(6) |
NULL |
|
| (standard audit) | — | §2.3 دیکھیں |
extracted_action_items
مقصد: MoM ایکشن-آئٹم نکالنے کا ساختی آؤٹ پٹ؛ ذیلی ٹاسکس میں تصدیق شدہ۔
| کالم | قسم | پابندیاں | نوٹس |
|---|---|---|---|
id |
BIGINT UNSIGNED |
PK, NN, AUTO_INCREMENT |
|
ai_run_id |
BIGINT UNSIGNED |
NN, FK → ai_runs.id, indexed |
|
mom_id |
BIGINT UNSIGNED |
NULL, FK → mom.id |
|
action_text |
TEXT |
NN |
|
owner_text |
VARCHAR(255) |
NULL |
جیسا نکالا گیا مالک۔ |
owner_user_id |
BIGINT UNSIGNED |
NULL, FK → users.id |
حل شدہ افسر۔ |
due_date |
DATE |
NULL |
|
priority |
ENUM('low','normal','high','urgent') |
NULL |
|
status |
ENUM('proposed','confirmed','converted','rejected') |
NN DEFAULT 'proposed' |
|
subtask_id |
BIGINT UNSIGNED |
NULL, FK → ticket_subtasks.id |
تبدیل ہونے پر سیٹ۔ |
confirmed_by_user_id |
BIGINT UNSIGNED |
NULL, FK → users.id |
|
confirmed_at |
DATETIME(6) |
NULL |
|
| (standard audit) | — | §2.3 دیکھیں |
4.7 مواصلات
channels
مقصد: 3-ٹیئر اندرونی مواصلات کے لیے DM/گروپ/چینل کنٹینرز۔
| کالم | قسم | پابندیاں | نوٹس |
|---|---|---|---|
id |
BIGINT UNSIGNED |
PK, NN, AUTO_INCREMENT |
|
code |
VARCHAR(64) |
NULL |
|
type |
ENUM('dm','group','channel') |
NN |
|
name_en |
VARCHAR(255) |
NULL |
|
dept_id |
BIGINT UNSIGNED |
NULL, FK → departments.id |
محدود چینل۔ |
is_private |
TINYINT(1) |
NN DEFAULT 0 |
|
last_message_at |
DATETIME(6) |
NULL |
|
| (standard audit) | — | §2.3 دیکھیں | +deleted_at۔ |
channel_memberships
مقصد: صارفین کی چینلز میں ممبرشپ (کردار کے ساتھ: ممبر/ایڈمن/مالک)۔
| کالم | قسم | پابندیاں | نوٹس |
|---|---|---|---|
id |
BIGINT UNSIGNED |
PK, NN, AUTO_INCREMENT |
|
channel_id |
BIGINT UNSIGNED |
NN, FK → channels.id, indexed |
|
user_id |
BIGINT UNSIGNED |
NN, FK → users.id, indexed |
|
role |
ENUM('member','admin','owner') |
NN DEFAULT 'member' |
|
joined_at |
DATETIME(6) |
NN |
|
left_at |
DATETIME(6) |
NULL |
|
muted_until |
DATETIME(6) |
NULL |
|
| (standard audit) | — | §2.3 دیکھیں | |
| منفرد | (channel_id, user_id) |
UNIQUE |
channel_messages
مقصد: کسی چینل میں پیغامات (parent_message_id کے ذریعے تھریڈڈ جوابات سمیت)۔
| کالم | قسم | پابندیاں | نوٹس |
|---|---|---|---|
id |
BIGINT UNSIGNED |
PK, NN, AUTO_INCREMENT |
|
channel_id |
BIGINT UNSIGNED |
NN, FK → channels.id, indexed |
|
author_user_id |
BIGINT UNSIGNED |
NN, FK → users.id |
|
parent_message_id |
BIGINT UNSIGNED |
NULL, FK → channel_messages.id |
تھریڈ روٹ۔ |
body |
LONGTEXT |
NN |
|
is_pinned |
TINYINT(1) |
NN DEFAULT 0 |
|
edited_at |
DATETIME(6) |
NULL |
|
sent_at |
DATETIME(6) |
NN |
|
| (standard audit) | — | §2.3 دیکھیں | +deleted_at۔ |
messages
مقصد: DM اور گروپ-DM انباکس پیغامات (org-wide، سادہ راستہ)۔
| کالم | قسم | پابندیاں | نوٹس |
|---|---|---|---|
id |
BIGINT UNSIGNED |
PK, NN, AUTO_INCREMENT |
|
from_user_id |
BIGINT UNSIGNED |
NN, FK → users.id, indexed |
|
to_user_id |
BIGINT UNSIGNED |
NULL, FK → users.id |
DM وصول کنندہ۔ |
channel_id |
BIGINT UNSIGNED |
NULL, FK → channels.id |
گروپ/DM چینل۔ |
body |
LONGTEXT |
NN |
|
sent_at |
DATETIME(6) |
NN |
|
read_at |
DATETIME(6) |
NULL |
|
| (standard audit) | — | §2.3 دیکھیں | +deleted_at۔ |
threaded_replies
مقصد: چینل پیغامات پر واضح تھریڈ جواب میٹا ڈیٹا (خود-حوالہ کے علاوہ)۔
| کالم | قسم | پابندیاں | نوٹس |
|---|---|---|---|
id |
BIGINT UNSIGNED |
PK, NN, AUTO_INCREMENT |
|
root_message_id |
BIGINT UNSIGNED |
NN, FK → channel_messages.id, indexed |
|
reply_message_id |
BIGINT UNSIGNED |
NN, UQ, FK → channel_messages.id |
message_reads
مقصد: فی صارف فی چینل پیغام پڑھنے کی رسیدیں۔
| کالم | قسم | پابندیاں | نوٹس |
|---|---|---|---|
id |
BIGINT UNSIGNED |
PK, NN, AUTO_INCREMENT |
|
channel_message_id |
BIGINT UNSIGNED |
NN, FK → channel_messages.id, indexed |
|
user_id |
BIGINT UNSIGNED |
NN, FK → users.id, indexed |
|
read_at |
DATETIME(6) |
NN |
|
| منفرد | (channel_message_id, user_id) |
UNIQUE |
4.8 اطلاعات
notifications
مقصد: ترسیل کی حیثیت کے ساتھ فی صارف/چینل باہر جانے والی اطلاع۔
| کالم | قسم | پابندیاں | نوٹس |
|---|---|---|---|
id |
BIGINT UNSIGNED |
PK, NN, AUTO_INCREMENT |
|
user_id |
BIGINT UNSIGNED |
NN, FK → users.id, indexed |
|
template_id |
BIGINT UNSIGNED |
NULL, FK → notification_templates.id |
|
channel |
ENUM('email','sms','whatsapp','in_app') |
NN |
|
event_key |
VARCHAR(64) |
NN, indexed |
مثلاً ticket.escalated.tier2۔ |
entity_type |
VARCHAR(32) |
NULL |
|
entity_id |
BIGINT UNSIGNED |
NULL |
|
payload_json |
LONGTEXT |
NULL |
رینڈر ویری ایبلز۔ |
locale |
CHAR(3) |
NN DEFAULT 'en' |
|
subject |
VARCHAR(255) |
NULL |
رینڈر شدہ۔ |
body |
LONGTEXT |
NULL |
رینڈر شدہ۔ |
status |
ENUM('queued','sent','delivered','failed','suppressed') |
NN DEFAULT 'queued' |
|
provider_message_id |
VARCHAR(128) |
NULL |
|
sent_at |
DATETIME(6) |
NULL |
|
delivered_at |
DATETIME(6) |
NULL |
|
error_message |
TEXT |
NULL |
|
| (standard audit) | — | §2.3 دیکھیں |
notification_templates
مقصد: event + locale + channel کے ذریعے کلیدی شدہ کثیر لسانی ٹیمپلیٹس۔
| کالم | قسم | پابندیاں | نوٹس |
|---|---|---|---|
id |
BIGINT UNSIGNED |
PK, NN, AUTO_INCREMENT |
|
event_key |
VARCHAR(64) |
NN, indexed |
|
locale |
CHAR(3) |
NN |
|
channel |
ENUM('email','sms','whatsapp','in_app') |
NN |
|
subject |
VARCHAR(255) |
NULL |
SMS کے لیے نہیں۔ |
body |
LONGTEXT |
NN |
Handlebars/Mustache۔ |
is_active |
TINYINT(1) |
NN DEFAULT 1 |
|
| (standard audit) | — | §2.3 دیکھیں | |
| منفرد | (event_key, locale, channel) |
UNIQUE |
notification_preferences
مقصد: فی صارف ترجیحات کا مرکز (چینل آپٹ-ان، ڈائجسٹس، خاموش اوقات)۔
| کالم | قسم | پابندیاں | نوٹس |
|---|---|---|---|
id |
BIGINT UNSIGNED |
PK, NN, AUTO_INCREMENT |
|
user_id |
BIGINT UNSIGNED |
NN, UQ, FK → users.id |
|
email_enabled |
TINYINT(1) |
NN DEFAULT 1 |
|
sms_enabled |
TINYINT(1) |
NN DEFAULT 1 |
|
whatsapp_enabled |
TINYINT(1) |
NN DEFAULT 1 |
|
in_app_enabled |
TINYINT(1) |
NN DEFAULT 1 |
|
digest_frequency |
ENUM('immediate','hourly','daily','weekly','off') |
NN DEFAULT 'immediate' |
|
quiet_hours_start |
TIME |
NULL |
مقامی وقت۔ |
quiet_hours_end |
TIME |
NULL |
|
muted_event_keys_json |
LONGTEXT |
NULL |
خاموش ایونٹس کی صف۔ |
| (standard audit) | — | §2.3 دیکھیں |
inbound_replies
مقصد: دو طرفہ آنے والے جوابات (email/WA/SMS) جو کسی ٹکٹ میں پارس واپس کیے جاتے ہیں۔
| کالم | قسم | پابندیاں | نوٹس |
|---|---|---|---|
id |
BIGINT UNSIGNED |
PK, NN, AUTO_INCREMENT |
|
source |
ENUM('email','whatsapp','sms') |
NN |
|
from_address |
VARCHAR(255) |
NN |
بھیجنے والا۔ |
external_message_id |
VARCHAR(128) |
NULL |
فراہم کنندہ id۔ |
ticket_id |
BIGINT UNSIGNED |
NN, FK → tickets.id, indexed |
حل شدہ ہدف۔ |
subject |
VARCHAR(255) |
NULL |
|
body |
LONGTEXT |
NN |
|
created_message_id |
BIGINT UNSIGNED |
NULL, FK → ticket_messages.id |
نتیجے میں پیغام۔ |
received_at |
DATETIME(6) |
NN |
|
| (standard audit) | — | §2.3 دیکھیں |
4.9 میٹنگز، TRI اور MoM
meetings
مقصد: کسی ٹکٹ سے متحرک TRI / سماعت / اندرونی میٹنگز، virtual/physical/hybrid۔
| کالم | قسم | پابندیاں | نوٹس |
|---|---|---|---|
id |
BIGINT UNSIGNED |
PK, NN, AUTO_INCREMENT |
|
ticket_id |
BIGINT UNSIGNED |
NULL, FK → tickets.id, indexed |
محرک۔ |
type |
ENUM('tri','hearing','internal') |
NN |
|
modality |
ENUM('virtual','physical','hybrid') |
NN |
|
video_provider |
ENUM('zoom','meet','teams') |
NULL |
|
join_url |
VARCHAR(512) |
NULL |
وقت-محدود presigned۔ |
location_address |
VARCHAR(255) |
NULL |
طبعی کے لیے۔ |
dept_id |
BIGINT UNSIGNED |
NULL, FK → departments.id |
متعلقہ محکمہ۔ |
scheduled_at |
DATETIME(6) |
NN |
|
started_at |
DATETIME(6) |
NULL |
|
ended_at |
DATETIME(6) |
NULL |
|
status |
ENUM('scheduled','in_progress','completed','cancelled') |
NN DEFAULT 'scheduled' |
|
agenda_json |
LONGTEXT |
NULL |
اے آئی ڈرافٹ شدہ ایجنڈا۔ |
| (standard audit) | — | §2.3 دیکھیں | +deleted_at۔ |
meeting_attendees
مقصد: فی میٹنگ شرکاء (اندرونی صارفین + بیرونی فریقین)۔
| کالم | قسم | پابندیاں | نوٹس |
|---|---|---|---|
id |
BIGINT UNSIGNED |
PK, NN, AUTO_INCREMENT |
|
meeting_id |
BIGINT UNSIGNED |
NN, FK → meetings.id, indexed |
|
user_id |
BIGINT UNSIGNED |
NULL, FK → users.id |
اندرونی۔ |
name |
VARCHAR(255) |
NULL |
بیرونی شرکاء۔ |
party |
ENUM('company','sitd','department','external') |
NN |
|
role |
VARCHAR(64) |
NULL |
مثلاً "چیئر"۔ |
attendance_status |
ENUM('invited','accepted','declined','attended','absent') |
NN DEFAULT 'invited' |
|
| (standard audit) | — | §2.3 دیکھیں |
mom
مقصد: اجلاس کی روداد، ورژن شدہ، حساس-تصدیق گیٹنگ کے ساتھ۔
| کالم | قسم | پابندیاں | نوٹس |
|---|---|---|---|
id |
BIGINT UNSIGNED |
PK, NN, AUTO_INCREMENT |
|
meeting_id |
BIGINT UNSIGNED |
NN, UQ, FK → meetings.id |
1:1۔ |
version |
INT UNSIGNED |
NN DEFAULT 1 |
|
status |
ENUM('draft','approved','published','revised') |
NN DEFAULT 'draft' |
|
sensitive_requires_approval |
TINYINT(1) |
NN DEFAULT 0 |
تصدیق لازمی کرتا ہے۔ |
source_media_id |
BIGINT UNSIGNED |
NULL, FK → media_library.id |
اپلوڈ شدہ MoM فائل۔ |
body_en |
LONGTEXT |
NULL |
|
body_ur |
LONGTEXT |
NULL |
|
body_sd |
LONGTEXT |
NULL |
|
summary_ai |
TEXT |
NULL |
اے آئی خلاصہ۔ |
uploaded_by_user_id |
BIGINT UNSIGNED |
NULL, FK → users.id |
|
published_at |
DATETIME(6) |
NULL |
|
| (standard audit) | — | §2.3 دیکھیں | +deleted_at۔ |
mom_approvals
مقصد: حساس/VIP MoM کے لیے شائع سے پہلے چیئر/DG تصدیقات لازمی۔
| کالم | قسم | پابندیاں | نوٹس |
|---|---|---|---|
id |
BIGINT UNSIGNED |
PK, NN, AUTO_INCREMENT |
|
mom_id |
BIGINT UNSIGNED |
NN, FK → mom.id, indexed |
|
approver_user_id |
BIGINT UNSIGNED |
NN, FK → users.id |
|
decision |
ENUM('approved','rejected','changes_requested') |
NN |
|
note |
TEXT |
NULL |
|
decided_at |
DATETIME(6) |
NN |
mom_distributions
مقصد: MoM شائع کرنے پر ہر چینل شیئر کا ریکارڈ۔
| کالم | قسم | پابندیاں | نوٹس |
|---|---|---|---|
id |
BIGINT UNSIGNED |
PK, NN, AUTO_INCREMENT |
|
mom_id |
BIGINT UNSIGNED |
NN, FK → mom.id, indexed |
|
recipient_user_id |
BIGINT UNSIGNED |
NULL, FK → users.id |
|
recipient_address |
VARCHAR(255) |
NULL |
بیرونی رابطہ۔ |
channel |
ENUM('email','sms','whatsapp','in_app') |
NN |
|
notification_id |
BIGINT UNSIGNED |
NULL, FK → notifications.id |
|
sent_at |
DATETIME(6) |
NN |
mom_acknowledgments
مقصد: ٹریک کریں کس نے شائع شدہ MoM تسلیم کیا۔
| کالم | قسم | پابندیاں | نوٹس |
|---|---|---|---|
id |
BIGINT UNSIGNED |
PK, NN, AUTO_INCREMENT |
|
mom_id |
BIGINT UNSIGNED |
NN, FK → mom.id, indexed |
|
user_id |
BIGINT UNSIGNED |
NN, FK → users.id |
|
acknowledged_at |
DATETIME(6) |
NN |
|
| منفرد | (mom_id, user_id) |
UNIQUE |
meeting_recordings
مقصد: فی میٹنگ ریکارڈنگ blobs، transcription پرچم کے ساتھ۔
| کالم | قسم | پابندیاں | نوٹس |
|---|---|---|---|
id |
BIGINT UNSIGNED |
PK, NN, AUTO_INCREMENT |
|
meeting_id |
BIGINT UNSIGNED |
NN, FK → meetings.id, indexed |
|
media_id |
BIGINT UNSIGNED |
NN, FK → media_library.id |
|
duration_seconds |
INT UNSIGNED |
NULL |
|
transcribed |
TINYINT(1) |
NN DEFAULT 0 |
|
transcript_media_id |
BIGINT UNSIGNED |
NULL, FK → media_library.id |
|
| (standard audit) | — | §2.3 دیکھیں |
4.10 علم اور مواد
kb_articles
مقصد: ورژن شدہ، تین لسانی علم-قاعدہ مضامین۔
| کالم | قسم | پابندیاں | نوٹس |
|---|---|---|---|
id |
BIGINT UNSIGNED |
PK, NN, AUTO_INCREMENT |
|
slug |
VARCHAR(255) |
NN |
|
version |
INT UNSIGNED |
NN DEFAULT 1 |
|
status |
ENUM('draft','review','published','archived') |
NN DEFAULT 'draft' |
|
title_en |
VARCHAR(255) |
NN |
|
title_ur |
VARCHAR(255) |
NULL |
|
title_sd |
VARCHAR(255) |
NULL |
|
body_en |
LONGTEXT |
NULL |
|
body_ur |
LONGTEXT |
NULL |
|
body_sd |
LONGTEXT |
NULL |
|
summary |
TEXT |
NULL |
|
dept_id |
BIGINT UNSIGNED |
NULL, FK → departments.id |
|
category |
VARCHAR(64) |
NULL |
|
is_featured |
TINYINT(1) |
NN DEFAULT 0 |
|
helpful_count |
INT |
NN DEFAULT 0 |
"کیا یہ مددگار تھا"۔ |
not_helpful_count |
INT |
NN DEFAULT 0 |
|
published_at |
DATETIME(6) |
NULL |
|
| (standard audit) | — | §2.3 دیکھیں | +deleted_at۔ |
sop_documents
مقصد: فی محکمہ ورژن شدہ معیاری آپریٹنگ طریقہ کار دستاویزات۔
| کالم | قسم | پابندیاں | نوٹس |
|---|---|---|---|
id |
BIGINT UNSIGNED |
PK, NN, AUTO_INCREMENT |
|
dept_id |
BIGINT UNSIGNED |
NN, FK → departments.id |
|
title_en |
VARCHAR(255) |
NN |
|
version |
VARCHAR(32) |
NN |
مثلاً "2.1"۔ |
status |
ENUM('draft','review','published','archived') |
NN DEFAULT 'draft' |
|
doc_id |
BIGINT UNSIGNED |
NULL, FK → documents.id |
فائل۔ |
effective_from |
DATE |
NULL |
|
effective_to |
DATE |
NULL |
|
| (standard audit) | — | §2.3 دیکھیں |
service_catalog_entries
مقصد: ہر محکمے کی طرف سے پیش کردہ خدمات کی فہرست (ڈیفالٹ SLA کے ساتھ)۔
| کالم | قسم | پابندیاں | نوٹس |
|---|---|---|---|
id |
BIGINT UNSIGNED |
PK, NN, AUTO_INCREMENT |
|
dept_id |
BIGINT UNSIGNED |
NN, FK → departments.id |
|
code |
VARCHAR(32) |
NN |
|
name_en |
VARCHAR(255) |
NN |
|
name_ur |
VARCHAR(255) |
NULL |
|
name_sd |
VARCHAR(255) |
NULL |
|
description |
TEXT |
NULL |
|
default_sla_definition_id |
BIGINT UNSIGNED |
NULL, FK → sla_definitions.id |
|
default_category_id |
BIGINT UNSIGNED |
NULL, FK → ticket_categories.id |
|
form_doc_id |
BIGINT UNSIGNED |
NULL, FK → documents.id |
|
is_active |
TINYINT(1) |
NN DEFAULT 1 |
|
| (standard audit) | — | §2.3 دیکھیں |
circulars
مقصد: تجاویز و مواد پورٹل پر شائع کردہ اعلانات / سرکولرز۔
| کالم | قسم | پابندیاں | نوٹس |
|---|---|---|---|
id |
BIGINT UNSIGNED |
PK, NN, AUTO_INCREMENT |
|
title_en |
VARCHAR(255) |
NN |
|
title_ur |
VARCHAR(255) |
NULL |
|
title_sd |
VARCHAR(255) |
NULL |
|
body_en |
LONGTEXT |
NULL |
|
body_ur |
LONGTEXT |
NULL |
|
body_sd |
LONGTEXT |
NULL |
|
dept_id |
BIGINT UNSIGNED |
NULL, FK → departments.id |
|
is_pinned |
TINYINT(1) |
NN DEFAULT 0 |
|
published_at |
DATETIME(6) |
NULL |
|
| (standard audit) | — | §2.3 دیکھیں | +deleted_at۔ |
documents
مقصد: عام دستاویز ذخیرہ (forms، SOPs، circulars، repository آئٹمز، سرکاری خطوط)۔
| کالم | قسم | پابندیاں | نوٹس |
|---|---|---|---|
id |
BIGINT UNSIGNED |
PK, NN, AUTO_INCREMENT |
|
kind |
ENUM('form','sop','circular','repository','letter','other') |
NN |
|
title |
VARCHAR(255) |
NN |
|
media_id |
BIGINT UNSIGNED |
NN, FK → media_library.id |
|
version |
VARCHAR(32) |
NULL |
|
checksum_sha256 |
CHAR(64) |
NULL |
|
is_public |
TINYINT(1) |
NN DEFAULT 0 |
|
description |
TEXT |
NULL |
|
| (standard audit) | — | §2.3 دیکھیں | +deleted_at۔ |
suggestion_submissions
مقصد: عوامی تجویز باکس جمع کردہ۔
| کالم | قسم | پابندیاں | نوٹس |
|---|---|---|---|
id |
BIGINT UNSIGNED |
PK, NN, AUTO_INCREMENT |
|
submitter_user_id |
BIGINT UNSIGNED |
NULL, FK → users.id |
اگر گمنام ہو تو NULL۔ |
submitter_name |
VARCHAR(255) |
NULL |
|
submitter_email |
VARCHAR(255) |
NULL |
|
subject |
VARCHAR(255) |
NN |
|
body |
LONGTEXT |
NN |
|
category |
VARCHAR(64) |
NULL |
|
status |
ENUM('submitted','under_review','accepted','rejected','implemented') |
NN DEFAULT 'submitted' |
|
is_public |
TINYINT(1) |
NN DEFAULT 0 |
|
| (standard audit) | — | §2.3 دیکھیں |
4.11 تربیت اور سرٹیفکیشن
training_courses
مقصد: حکومتی عملے کے لیے LMS-lite کورس فہرست۔
| کالم | قسم | پابندیاں | نوٹس |
|---|---|---|---|
id |
BIGINT UNSIGNED |
PK, NN, AUTO_INCREMENT |
|
code |
VARCHAR(32) |
NN, UQ |
|
title_en |
VARCHAR(255) |
NN |
|
title_ur |
VARCHAR(255) |
NULL |
|
title_sd |
VARCHAR(255) |
NULL |
|
description |
TEXT |
NULL |
|
duration_minutes |
INT UNSIGNED |
NN |
|
target_roles_json |
LONGTEXT |
NULL |
کردار کوڈز کی صف۔ |
is_required |
TINYINT(1) |
NN DEFAULT 0 |
سرٹیفکیشن گیٹ۔ |
| (standard audit) | — | §2.3 دیکھیں |
course_enrollments
مقصد: پیش رفت کے ساتھ کسی کورس میں صارف کی انرولمنٹ۔
| کالم | قسم | پابندیاں | نوٹس |
|---|---|---|---|
id |
BIGINT UNSIGNED |
PK, NN, AUTO_INCREMENT |
|
course_id |
BIGINT UNSIGNED |
NN, FK → training_courses.id, indexed |
|
user_id |
BIGINT UNSIGNED |
NN, FK → users.id, indexed |
|
progress_pct |
TINYINT UNSIGNED |
NN DEFAULT 0 |
|
status |
ENUM('enrolled','in_progress','completed','dropped') |
NN DEFAULT 'enrolled' |
|
completed_at |
DATETIME(6) |
NULL |
|
| (standard audit) | — | §2.3 دیکھیں | |
| منفرد | (course_id, user_id) |
UNIQUE |
training_exams
مقصد: کسی کورس سے منسلک امتحان کی تعریف (سرٹیفکیشن گیٹ)۔
| کالم | قسم | پابندیاں | نوٹس |
|---|---|---|---|
id |
BIGINT UNSIGNED |
PK, NN, AUTO_INCREMENT |
|
course_id |
BIGINT UNSIGNED |
NN, FK → training_courses.id |
|
title_en |
VARCHAR(255) |
NN |
|
pass_threshold_pct |
TINYINT UNSIGNED |
NN DEFAULT 70 |
|
time_limit_minutes |
INT UNSIGNED |
NULL |
|
max_attempts |
TINYINT UNSIGNED |
NULL |
|
questions_json |
LONGTEXT |
NULL |
سوال بینک۔ |
| (standard audit) | — | §2.3 دیکھیں |
exam_attempts
مقصد: کسی صارف کا امتحان میں کوشش، اسکور اور نتیجے کے ساتھ۔
| کالم | قسم | پابندیاں | نوٹس |
|---|---|---|---|
id |
BIGINT UNSIGNED |
PK, NN, AUTO_INCREMENT |
|
exam_id |
BIGINT UNSIGNED |
NN, FK → training_exams.id, indexed |
|
user_id |
BIGINT UNSIGNED |
NN, FK → users.id, indexed |
|
score_pct |
TINYINT UNSIGNED |
NULL |
|
result |
ENUM('pass','fail','incomplete') |
NN DEFAULT 'incomplete' |
|
answers_json |
LONGTEXT |
NULL |
|
started_at |
DATETIME(6) |
NN |
|
finished_at |
DATETIME(6) |
NULL |
certifications
مقصد: جاری (اور ختم ہونے والی) سرٹیفکیشنز جو لائیو ٹکٹ تک رسائی کھولتی ہیں۔
| کالم | قسم | پابندیاں | نوٹس |
|---|---|---|---|
id |
BIGINT UNSIGNED |
PK, NN, AUTO_INCREMENT |
|
user_id |
BIGINT UNSIGNED |
NN, FK → users.id, indexed |
|
course_id |
BIGINT UNSIGNED |
NN, FK → training_courses.id |
|
attempt_id |
BIGINT UNSIGNED |
NN, FK → exam_attempts.id |
کامیاب کوشش۔ |
certificate_code |
VARCHAR(64) |
NN, UQ |
عوامی کوڈ۔ |
issued_on |
DATE |
NN |
|
expires_on |
DATE |
NULL |
NULL = کوئی میعاد نہیں۔ |
is_valid |
TINYINT(1) |
NN DEFAULT 1 |
|
| (standard audit) | — | §2.3 دیکھیں |
4.12 نظام اور تشکیل
feature_flags
مقصد: رن ٹائم صلاحیت ٹوگلز، platform/dept/env/user-segment کے ذریعے محدود۔
| کالم | قسم | پابندیاں | نوٹس |
|---|---|---|---|
id |
BIGINT UNSIGNED |
PK, NN, AUTO_INCREMENT |
|
flag_key |
VARCHAR(128) |
NN, UQ |
مثلاً ai.enabled، mom.transcription۔ |
scope |
ENUM('platform','dept','env','user_segment') |
NN DEFAULT 'platform' |
|
dept_id |
BIGINT UNSIGNED |
NULL, FK → departments.id |
جب scope = dept ہو۔ |
env |
ENUM('dev','staging','prod') |
NULL |
جب scope = env ہو۔ |
enabled |
TINYINT(1) |
NN DEFAULT 0 |
اس scope پر مؤثر قدر۔ |
default_value |
TINYINT(1) |
NN DEFAULT 0 |
پلیٹ فارم بنیادی لائن۔ |
description |
VARCHAR(255) |
NULL |
|
| (standard audit) | — | §2.3 دیکھیں |
audit_logs
مقصد: ہر حالت تبدیل کرنے والے مراعات والے عمل کا صرف اضافہ (append-only) عالمی آڈٹ۔
| کالم | قسم | پابندیاں | نوٹس |
|---|---|---|---|
id |
BIGINT UNSIGNED |
PK, NN, AUTO_INCREMENT |
|
actor_user_id |
BIGINT UNSIGNED |
NULL, FK → users.id |
NULL = سسٹم۔ |
action |
VARCHAR(64) |
NN, indexed |
مثلاً role.override.created۔ |
entity_type |
VARCHAR(32) |
NN |
|
entity_id |
BIGINT UNSIGNED |
NULL |
|
before_json |
LONGTEXT |
NULL |
|
after_json |
LONGTEXT |
NULL |
|
ip_address |
VARCHAR(45) |
NULL |
IPv4/IPv6۔ |
user_agent |
VARCHAR(255) |
NULL |
|
request_id |
CHAR(36) |
NULL |
مربوطگی۔ |
step_up_auth |
TINYINT(1) |
NN DEFAULT 0 |
عمل کے وقت دوبارہ تصدیق۔ |
occurred_at |
DATETIME(6) |
NN |
کبھی
UPDATEیاDELETEنہ کریں۔ ماہانہ تقسیم کیا گیا (§7 دیکھیں)۔
integrations_configs
مقصد: فی-فراہم کنندہ انضمام سیٹنگز؛ رازات صرف vault حوالوں کے طور پر۔
| کالم | قسم | پابندیاں | نوٹس |
|---|---|---|---|
id |
BIGINT UNSIGNED |
PK, NN, AUTO_INCREMENT |
|
provider |
ENUM('nadra','secp','fbr','srb','pseb','eoffice','oidc','mailjet','sms','whatsapp','video') |
NN |
|
base_url |
VARCHAR(255) |
NULL |
|
api_version |
VARCHAR(32) |
NULL |
|
vault_ref |
VARCHAR(255) |
NN |
راز والٹ میں راہ — راز کبھی نہیں۔ |
timeout_ms |
INT UNSIGNED |
NN DEFAULT 30000 |
|
retry_max |
TINYINT UNSIGNED |
NN DEFAULT 3 |
|
enabled |
TINYINT(1) |
NN DEFAULT 0 |
|
env |
ENUM('dev','staging','prod') |
NN DEFAULT 'prod' |
|
config_json |
LONGTEXT |
NULL |
غیر-رازی پیرامیٹرز۔ |
| (standard audit) | — | §2.3 دیکھیں | |
| منفرد | (provider, env) |
UNIQUE |
webhooks
مقصد: باہر جانے والے ویب ہوک سبسکرپشنز (HMAC-سائن شدہ)۔
| کالم | قسم | پابندیاں | نوٹس |
|---|---|---|---|
id |
BIGINT UNSIGNED |
PK, NN, AUTO_INCREMENT |
|
event_key |
VARCHAR(64) |
NN, indexed |
|
target_url |
VARCHAR(512) |
NN |
|
secret_hash |
CHAR(64) |
NN |
HMAC راز کا sha256۔ |
content_type |
VARCHAR(64) |
NN DEFAULT 'application/json' |
|
enabled |
TINYINT(1) |
NN DEFAULT 1 |
|
last_status |
VARCHAR(16) |
NULL |
|
last_fired_at |
DATETIME(6) |
NULL |
|
| (standard audit) | — | §2.3 دیکھیں |
open_data_exports
مقصد: شفافیت-ڈیش بورڈ اور اوپن ڈیٹا ایکسپورٹ موجودات۔
| کالم | قسم | پابندیاں | نوٹس |
|---|---|---|---|
id |
BIGINT UNSIGNED |
PK, NN, AUTO_INCREMENT |
|
dataset |
VARCHAR(64) |
NN |
مثلاً tickets_public،moms_public،officials،sla_perf۔ |
format |
ENUM('csv','xlsx','json','pdf') |
NN |
|
period_from |
DATE |
NULL |
|
period_to |
DATE |
NULL |
|
media_id |
BIGINT UNSIGNED |
NN, FK → media_library.id |
ایکسپورٹ blob۔ |
generated_at |
DATETIME(6) |
NN |
|
row_count |
INT UNSIGNED |
NULL |
|
hash_sha256 |
CHAR(64) |
NULL |
|
| (standard audit) | — | §2.3 دیکھیں |
qr_verifiable_documents
مقصد: سرکاری خطوط کے لیے QR-ٹوکن باندھنا (جعلسازی-رود عوامی تصدیق)۔
| کالم | قسم | پابندیاں | نوٹس |
|---|---|---|---|
id |
BIGINT UNSIGNED |
PK, NN, AUTO_INCREMENT |
|
document_id |
BIGINT UNSIGNED |
NN, FK → documents.id, indexed |
|
qr_token |
CHAR(36) |
NN, UQ |
عوامی تصدیق ٹوکن۔ |
payload_hash |
CHAR(64) |
NN |
خط کے مواد کا sha256۔ |
issued_by_user_id |
BIGINT UNSIGNED |
NULL, FK → users.id |
|
issued_at |
DATETIME(6) |
NN |
|
expires_at |
DATETIME(6) |
NULL |
|
revoked |
TINYINT(1) |
NN DEFAULT 0 |
|
revoked_at |
DATETIME(6) |
NULL |
system_settings
مقصد: عام key-value تشکیل (SMTP، Mailjet، SMS، WhatsApp، برانڈنگ)۔
| کالم | قسم | پابندیاں | نوٹس |
|---|---|---|---|
id |
BIGINT UNSIGNED |
PK, NN, AUTO_INCREMENT |
|
setting_key |
VARCHAR(128) |
NN, UQ |
|
value |
LONGTEXT |
NULL |
|
category |
ENUM('smtp','mailjet','sms','whatsapp','general','branding','security') |
NN |
|
is_secret |
TINYINT(1) |
NN DEFAULT 0 |
1 ⇒ قدر صرف والٹ میں رہتی ہے۔ |
description |
VARCHAR(255) |
NULL |
|
| (standard audit) | — | §2.3 دیکھیں |
5. اہم تعلقات
سب سے اہم تعلقات، سادہ زبان میں:
-
ٹکٹ ↔ کمپنی / محکمہ / سیکشن / عملہ۔ ایک
ticketsقطار فائلر (org_id+filer_rep_id) کو حل کرنے والے راستے (dept_id→section_id→assigned_user_id) سے باندھتی ہے۔ پروڈکٹ میں ہر قطار — "میرا کام"، "محکمہ قطار"، "کمپنی ورک اسپیس"، "اسکیلیشن انباکس" — ان چاروں FKs اورstatusکی ایک فلٹرڈ پروجیکشن ہے۔tracking_idصارف کے سامنے آنے والا شناخت کنندہ ہے؛ متبادلidاندرونی طور پر استعمال ہونے والی واحد جواینٹ کلید ہے تاکہ ضم/تقسیم/دوبارہ نمبر دینا ممکن رہے۔ -
اسکیلیشن چین۔
escalation_rulesفی-محکمہ ٹیئر لیڈر متعین کرتا ہے؛ ایک شیڈول شدہ BullMQ ورکرtickets WHERE status NOT IN (resolved,closed,withdrawn) AND sla_due_at < NOW()کو سکین کرتا ہے اور، فیescalation_rules.days_after_open،escalation_eventsلکھتا ہے، ہدف صارف کو بطورticket_watchersقطار شامل کرتا ہے، اور اطلاعات بھیجتا ہے۔sla_pause_eventsاورholiday_calendar/business_hoursمؤثر گھڑی کو ایڈجسٹ کرتے ہیں تاکہ سکین کام کی آخری تاریخوں کا استعمال کرے، wall-clock نہیں۔ -
عہدیدار-مدت کی تاریخ-آگاہی برائے خطوط۔ جب نظام کوئی سرکاری خط رینڈر کرتا ہے، تو یہ
officialsکو براہ راست نہیں پڑھتا؛ یہofficial_terms WHERE effective_from <= :issue_date AND (effective_to IS NULL OR effective_to >= :issue_date)سے جواینٹ کرتا ہے تاکہ 2024 کا مؤرخ خط 2025 کی منتقلی کے بعد بھی 2024 کا سیکریٹری دکھائے۔ یہ/specs/ur/04-roles-permissions/§3 اور_context.md§5 کا تاریخی درستگی کا تقاضا ہے۔ یہی تاریخ-آگاہ جواینٹ طے کرتی ہے کہ کس عہدیدار کی تصویر/نام کسی رپورٹنگ مدت کے ڈیش بورڈ پر ظاہر ہوگا۔ -
MoM ↔ میٹنگ ↔ ٹکٹ ↔ ایکشن آئٹمز ↔ ذیلی ٹاسکس۔ ایک رکا ہوا
ticketsقطار ایکmeetingsقطار (typetri) پیدا کرتی ہے۔ میٹنگ بالکل ایکmom(1:1) پیدا کرتی ہے۔ MoM اپلوڈ پر، ایکai_runsقطار (featuremom_extract)extracted_action_itemsخارج کرتا ہے۔ افسر ہر آئٹم کی تصدیق کرتا ہے؛ تصدیق پر، ایکticket_subtasksقطار بنائی جاتی ہے (چائلڈ ٹکٹ کو والد سے منسلک کرتے ہوئے)،extracted_action_items.subtask_idسیٹ ہو جاتا ہے، اورstatusconvertedہو جاتی ہے۔ یہ چین مکمل طور پر قابلِ تتبع ہے ٹکٹ → میٹنگ → mom → ai_run → action_item → subtask۔ -
صارف ↔ کردار ↔ اوور رائڈ ↔ صلاحیت۔ اجازت
users→user_role_assignments→roles→role_template_permissionsکے ذریعے بنیادی لائن کے لیے حل ہوتی ہے، پھرuser_permission_overrides(اور کمپنی سائڈ کے لیےrep_permission_overrides) فی-صارف گرانٹس/منسوخیوں کے لیے، پھرtickets.is_confidential/is_vipکے لیے ایک ABAC گیٹ۔ نتیجہ فی درخواست کیش ہوتا ہے۔ آئینہ جدولrepresentatives→rep_role_assignments→rolesکمپنی سائڈ پر یکساں پیٹرن رکھتے ہیں۔ -
تصدیق ↔ ادارے کا لائف سائیکل۔
organizations.verification_statusتب ہیprovisional → verifiedمنتقل ہوتا ہے جب تمام لازمیverification_jobs(فی entity قسم فی فراہم کنندہ ایک)passedرپورٹ کریں؛ کوئی بھیfailedاسےon_holdمنتقل کرتا ہے اور ایکappealsقطار دائر کی جا سکتی ہے۔consentsیہ گیٹ کرتا ہے کہ کون سے فراہم کنندگان استفسار کیے جا سکتے ہیں۔organizations.kyc_levelکامیاب چیکس کی گہرائی کے ساتھ بڑھتا ہے؛ چھوٹا ہواre_atted_due_atverified → provisional → suspended کی تخفیف کرتا ہے (کردار دستاویز §11.4 کے مطابق)۔ -
فائلیں ↔ ریکارڈز ↔ retention۔ ہر blob ایک
media_libraryقطار ہے (bucket، key، checksum، AV حیثیت، میعاد)۔ مواد ریکارڈز FK کے ذریعے اس کا حوالہ دیتے ہیں (ticket_attachments.media_id،verification_documents.media_id،mom.source_media_id،documents.media_id،meeting_recordings.media_id،officials.portrait_media_id،open_data_exports.media_id)۔ ایک شیڈول شدہ صفائی ورکرmedia_library.expires_atاور ڈیٹا-کلاس retention پالیسی (§9) استعمال کرتا ہے تاکہ لنکس منسوخ کرے اور MinIO سے آبجیکٹ purge کرے، جبکہ میٹا ڈیٹا قطاریں آڈٹ تسلسل کے لیے برقرار رکھے۔ -
فیچر فلیگز ↔ ہر صلاحیت۔ کوئی صلاحیت بغیر گیٹ کے شائع نہیں ہوتی۔ کوڈ پاتھs
feature_flagsسے ایک پتلے کلائنٹ (Redis میں کیش) کے ذریعے مشورہ کرتے ہیں؛ ریزولوشن چین (platform → dept → env → user_segment → off) سپر ایڈمن کو بغیر ری ڈیپلائے کسی بھی ماحول کے لیے کچھ بھی ٹوگل کرنے دیتی ہے۔ تبدیلیاںaudit_logsمیں آڈٹ-لاگ ہوتی ہیں۔
6. انڈیکسنگ حکمتِ عملی
MariaDB صرف FK کے چائلڈ سائڈ کو خود-انڈیکس کرتا ہے؛ ہم ہر FK پر اور ہر ہاٹ ایکسیس پاتھ پر واضح ثانوی انڈیکس کا اعلان کرتے ہیں۔ انڈیکس کا季度ی جائزہ EXPLAIN ANALYZE کے ذریعے لیا جاتا ہے۔
6.1 منفرد کاروباری شناخت کنندے (مساوات لوک اپس)
| جدول | کالم(ز) | انڈیکس |
|---|---|---|
tickets |
tracking_id |
UNIQUE |
users |
keycloak_sub، email |
UNIQUE (دو) |
organizations |
secp_registration_no، ntn |
UNIQUE (partial — NULL کی اجازت) |
representatives |
email، user_id |
UNIQUE |
roles |
code |
UNIQUE |
feature_flags |
flag_key |
UNIQUE |
system_settings |
setting_key |
UNIQUE |
certifications |
certificate_code |
UNIQUE |
qr_verifiable_documents |
qr_token |
UNIQUE |
media_library |
checksum_sha256 |
non-unique (ڈیڈپ اسکین) |
6.2 ٹکٹ قطار ہاٹ پاتھس (مرتب)
| جدول | مرتب انڈیکس | خدمت کرتا ہے |
|---|---|---|
tickets |
(status, dept_id, sla_due_at) |
محکمہ قطار + اسکیلیشن سکین۔ |
tickets |
(org_id, status, updated_at) |
کمپنی ورک اسپیس ("میرے ٹکٹس")۔ |
tickets |
(assigned_user_id, status) |
کسی افسر کے لیے "میرا کام" قطار۔ |
tickets |
(dept_id, priority, status) |
نگرانی ڈیش بورڈ (DG/سیکریٹری)۔ |
tickets |
(is_confidential, dept_id) |
ABAC رازدارانہ فلٹرنگ۔ |
tickets |
(sla_due_at) |
اسٹینڈ ایلون اسکیلیشن/اوور ڈو cron سکین۔ |
6.3 غیر ملکی کلید ثانوی انڈیکسز
§4 میں ہر FK کالم جو "indexed" درج ہے وہ ایک واضح INDEX رکھتا ہے۔ نمایاں اعلیٰ-cardinality والے: ticket_messages.thread_id، ticket_attachments.ticket_id، notifications.user_id، notifications.event_key، audit_logs.action، ai_runs.engine_config_id، meeting_attendees.meeting_id، channel_messages.channel_id، sla_pause_events.ticket_id، escalation_events.ticket_id۔
6.4 locale / کثیر لسانی
tickets.locale،users.locale،representatives.locale،notification_templates.localeکم-cardinality کالم ہیں جو استفسار فلٹرز کے طور پر استعمال ہوتے ہیں اور انڈیکس ہیں؛ یہ مکمل متن اردو/سندھی تلاش کے لیے Meilisearch کی جگہ نہیں لیتے۔- تین لسانی متن کالم (
name_en/ur/sd،body_en/ur/sd،title_en/ur/sd) علیحدہ طبعی کالم کے طور پر محفوظ ہیں (JSON نہیں)، اس لیے ایپلیکیشن براہ راست locale-مخصوص کالم منتخب کرتی ہے — ہاٹ پاتھ پر فی-قطار JSON پارسنگ نہیں۔
6.5 مکمل متن کی تلاش
- بنیادی پاتھ = Meilisearch۔ ایک سرچ-انڈیکسر ورکر ہر ڈومین ایونٹ پر معیاری، redacted، locale-ٹیگ شدہ دستاویزات Meilisearch کو بھیجتا ہے؛ رازداری/VIP ٹکٹس کو انڈیکسنگ سے پہلے خارج یا ماسک کیا جاتا ہے۔
- MariaDB
FULLTEXTصرفkb_articles.body_en،tickets.title+tickets.description، اورdocuments.titleپر بنایا جاتا ہے، ایڈمن ٹولز کے لیے لاطینی رسم الخط کے exact-phrase فل بیک کے طور پر۔ اردو/سندھی مکمل متن MariaDB پر نہیں کیا جاتا۔
7. تقسیم اور آرکائیول
تین جدولوں کا ڈیزائن کے مطابق بے تحاشا اضافہ ہوتا ہے اور انہیں §9 کی retention پالیسی اور _context.md §6 میں حوالہ شدہ سندھ آرکائیوز قواعد کے مطابق واضح تقسیم + آرکائیول منصوبے کی ضرورت ہے۔
| جدول | اضافہ | حکمتِ عملی |
|---|---|---|
ticket_messages |
زیادہ (ہر جواب، آنے والا email/WA/SMS شامل) | created_at پر RANGE کے ذریعے تقسیم (ماہانہ)۔ ایکٹو ونڈو سے پرانی پارٹیشنز (مثلاً 18 ماہ) سستی اسٹوریج پر archive ٹیبل اسپیس میں منتقل کی جاتی ہیں اور/یا Metabase ہسٹری کے لیے MinIO میں Parquet کے طور پر ایکسپورٹ کی جاتی ہیں؛ قطاریں قابلِ استفسار رہتی ہیں مگر ہاٹ پارٹیشنز سے باہر۔ OPTIMIZE PARTITION سارانی چلتا ہے۔ |
audit_logs |
صرف اضافہ، کبھی UPDATE/DELETE نہیں | occurred_at پر RANGE کے ذریعے تقسیم (ماہانہ)۔ آن لائن retention (مثلاً 36 ماہ) سے پرانی پارٹیشنز آف-ہوسٹ آبجیکٹ اسٹوریج میں ایکسپورٹ کی جاتی ہیں (خاموشی پیمائش کے لیے ہیش-چین شدہ، tech-arch §16 کے مطابق) اور پھر DROP PARTITION۔ آرکائیو سندھ آرکائیوز قواعد کے مطابق برقرار رکھی جاتی ہے۔ |
ai_runs |
زیادہ (ہر اے آئی کال ایک قطار لکھتی ہے) | started_at پر RANGE کے ذریعے تقسیم (ماہانہ)۔ لاگت/ٹوکن کالمز کو ڈیش بورڈز کے لیے روزانہ ai_cost_daily مجموعی (materilized view) میں بھی رول کیا جاتا ہے؛ 12 ماہ سے پرانی خام قطاریں MinIO میں آرکائیو اور ڈراپ کی جاتی ہیں۔ |
ticket_history، sla_pause_events، escalation_events، notifications |
درمیانہ | ان کے ٹائم اسٹیمپ (occurred_at / paused_at / fired_at / sent_at) پر ماہانہ RANGE تقسیم؛ ویسا ہی archive-and-drop رفتار، فارنسیکل جدولوں (ticket_history، sla_pause_events) کے لیے لمبی retention۔ |
channel_messages، message_reads |
درمیانہ-زیادہ | sent_at / read_at پر ماہانہ RANGE تقسیم؛ نرم حذف کے ساتھ 24-ماہ آن لائن ونڈو قبل از آرکائیول۔ |
آرکائیول پائپ لائن۔ ایک شیڈول شدہ BullMQ ملازمت (فی جدول) ونڈو سے پرانی قطاریں MinIO میں کمپریسڈ Parquet کے طور پر (اسکیما شامل) منتقل کرتی ہے، ایک open_data_exports انداز کی manifest قطار لکھتی ہے، پھر سورس پارٹیشن ڈراپ کرتی ہے۔ بحالیاں (RTI / آڈٹ / قانونی ہولڈ) Parquet کو عارضی جدول میں دوبارہ لوڈ کرتی ہیں۔ retention نمبرز §9 اور سیکیورٹی دستاویز کی ڈیٹا-درجہ بندی پالیسی کے خلاف تصدیق شدہ ہیں۔
8. مائیگریشن کا طریقہ
8.1 Prisma مائیگریشنز
- صرف آگے کی طرف، CI-گیٹڈ۔ ہر اسکیما تبدیقی ایک نمبر شدہ Prisma مائیگریشن ہے جو ریپو میں کمٹ ہوتی ہے؛ مائیگریشنز CI میں ایک pre-deploy، گیٹڈ اسٹیپ کے طور پر چلتے ہیں (
dev→staging→prod، prod سے پہلے دستی توثیق)۔ رول بیک ایک دانستہ، جائزہ لی گئی مائیگریشن ہے — کبھی خودکار ریورٹ نہیں (tech-arch §19 کے مطابق)۔ schema.prismaاس دستاویز سے اخذ کیا جاتا ہے۔ ایکdatasourceبلاک (provider = "mysql"،url = env("DATABASE_URL"))؛ ایکgeneratorبلاک (provider = "prisma-client-js")۔ جدولوں کو// <-- module -->کمنٹس (Auth، Org، Tickets، Files، Notifications، AI، Comms، Analytics، Integrations، System) کے تحت منظم کیا جاتا ہے۔ اختیاری ماڈیول سابقے (§2.5)@@map("tkt_tickets")انداز میپنگز کے ذریعے مستقل طور پر لاگو کیے جاتے ہیں تاکہ SQL پڑھنے میں آسان رہے جبکہ Prisma ماڈل نام صاف رہیں۔- backward-compatible تبدیلی کا ضابطہ۔ اضافی تبدیلیاں (نیا کالم
NULL/ڈیفالٹ، نیا جدول،ALGORITHM=INPLACE LOCK=NONEکے ساتھ نیا انڈیکس) آزادانہ شائع ہوتی ہیں۔ تباہ کن تبدیلیاں (نام تبدیل، ڈراپ، قسم تنگ) ایک کثیر-مرحلی مائیگریشن کے طور پر شائع ہوتی ہیں: نیا اضافہ → dual-write → backfill → reads سوئچ → پرانا ڈراپ، ہر مرحلہ اپنی تعیناتی۔ENUMکو چوڑا کرنا آن لائن-محفوظ ہے؛ تنگ کرنے میں احتیاط درکار ہے۔ - بڑی آن لائن مائیگریشنز (کثیر-ملین قطار
ticketsپر نیا انڈیکس)pt-online-schema-changeیا MariaDB کے native online DDL استعمال کرتی ہیں، DBA کے ذریعے رابطہ کردہ، Prisma کے ڈیفالٹALTERنہیں۔
8.2 سیڈ ڈیٹا
درج ذیل lookup/bootstrap قطاریں مائیگریشنز اور prisma db seed کے ذریعے سیڈ کی جاتی ہیں، idempotent اور version-controlled:
| سیڈ سیٹ | مثالیں |
|---|---|
roles |
SUPER_ADMIN، SITD_FACILITATION_OFFICER، DEPT_ADMIN، OFFICER، DG، SECRETARY، MINISTER، SACM، READONLY_AUDITOR، PRIMARY_REP، ADMIN_REP، FILER، VIEWER، NOTIFY_ONLY، CITIZEN، SERVICE_ACCOUNT۔ |
role_template_permissions |
/specs/ur/04-roles-permissions/ §8 کی 67-صلاحیت میٹرکس، (role_code, capability_key, effect) کے طور پر انکوڈڈ۔ |
departments |
مالک محکمہ S&ITD (code='SITD'، is_owner_dept=1) اس کے ساتھ بڑے GoS محکمے (لیبر LBR، انویسٹمنٹ، خزانہ FIN، ایکسائز و ٹیکسیشن، ریونیو، بورڈ آف ریونیو، وغیرہ)، ہر ایک نسٹ کے لیے تیار اعلیٰ سطح نوڈ کے طور پر سیڈ۔ |
ticket_categories |
فی محکمہ ایک اسٹارٹر ٹیکسونومی (RTI، عدمِ تسکین، سروس درخواست، معلومات، سہولت)۔ |
sla_definitions |
فی ترجیح پلیٹ فارم ڈیفالٹس: 2-دن پہلا جواب / 5-دن / 10-دن حل ٹیئرز، S&ITD اور ہر سیڈ شدہ محکمے سے میپ۔ |
escalation_rules |
2/5/10-دن ٹیئر لیڈر (ٹیئر 1 → DG @ 2د، ٹیئر 2 → سیکریٹری @ 7د، ٹیئر 3 → وزیر/SACM @ 17د) فی محکمہ، mode='notify'۔ |
holiday_calendar |
موجودہ اور اگلے گریگوری/Hijri سال کے لیے سندھ عوامی چھٹیاں (GoS نوٹیفکیشن سے سیڈ؛ سپر ایڈمن کے ذریعے قابلِ ترمیم)۔ |
business_hours |
ڈیفالٹ 09:00–17:00 پیر–جمعہ، Asia/Karachi، فی سیڈ شدہ محکمہ۔ |
feature_flags |
بوٹسٹریپ فلیگز (مثلاً ai.enabled=true، mom.transcription=false، inbound.email=true، inbound.whatsapp=false) فی ماحول ایک معروف ڈیفالٹ حالت میں۔ |
notification_templates |
بنیادی ایونٹ کلیدز (ticket.created، ticket.assigned، ticket.escalated.tier1/2/3، ticket.resolved، mom.published، verification.passed/failed) تینوں locales (en/ur/sd) اور تمام چار چینلز میں۔ |
integrations_configs |
تمام فراہم کنندگان سیڈ enabled=0 ایک پلیس ہولڈر vault_ref کے ساتھ؛ آپریٹر کے ذریعے فی ماحول enabled + vault راہ سیٹ۔ |
system_settings |
برانڈنگ ڈیفالٹس (پورٹل نام، ٹیگ لائن، فوٹر لائن) _context.md §1 کے مطابق؛ SMTP/Mailjet/SMS/WhatsApp سیڈ is_secret=1 والٹ بھرنے کا انتظار۔ |
ai_engine_configs |
فی فیچر ایک اسٹارٹر سیٹ (کلاؤڈ-ترجیحی + آن-پریمائز فل بیک)، تمام enabled=0 یہاں تک کہ آپریٹر انہیں ڈیٹا-درجہ بندی پالیسی کے مطابق آن کرے۔ |
8.3 ماحول بوٹسٹریپنگ
ایک تازہ ماحول چلاتا ہے (1) prisma migrate deploy (تمام مائیگریشنز)، پھر (2) prisma db seed (اوپر کا سیڈ سیٹ)، پھر (3) ایک آپریٹر رن بک integrations_configs.vault_ref اور رازات والٹ کو بھرنے، مطلوبہ feature_flags کو فعال کرنے، اور پہلا SUPER_ADMIN صارف بنانے کے لیے۔ کوئی راز کبھی کمٹ نہیں ہوتا؛ سیڈ صرف غیر-رازی ڈیفالٹس اور والٹ حوالے لکھتا ہے۔
9. ڈیٹا کی درجہ بندی
ہر جدول کو ایک ڈیٹا طبقے (Public / Internal / Confidential / Restricted) کے ساتھ ٹیگ کیا جاتا ہے (/specs/ur/15-tech-architecture/ §16 کے مطابق)۔ یہ طبقہ مرموز کاری، اے آئی-انجن روٹنگ، Meilisearch انڈیکسنگ، retention، اور رسائی لاگنگ چلاتا ہے۔ تفصیلی کنٹرولز /specs/ur/11-security-compliance/ میں ہیں؛ یہ سیکشن ان سے حوالہ دیتا ہے۔
9.1 PII-رکھنے والے جدول (اعلیٰ حساسیت)
| جدول | PII کالم | طبقہ | سلوک |
|---|---|---|---|
representatives |
cnic، email، mobile_e164، whatsapp_e164، full_name |
Restricted | cnic اور موبائلز کے لیے کالم-سطح مرموز کاری؛ رسائی لاگڈ؛ Meilisearch کے ذریعے کبھی انڈیکس نہیں؛ SELECT صرف خود، اسی ادارے کے Primary/Admin Rep، S&ITD فیسلیٹیشن، سپر ایڈمن تک محدود (ABAC)۔ CNIC فارمیٹ-تصدیق شدہ؛ خام قدر مرموز، logs میں صرف آخری-4۔ |
organizations |
secp_registration_no، ntn، srb_tax_id، pseb_membership_no، domain_email_domain |
Confidential | ٹیکس IDs کو رازدارانہ سمجھا جاتا ہے؛ ادارے کے نمائندوں، تفویض شدہ محکمہ عملے، سپر ایڈمن کو نظر انداز۔ |
users |
email، mobile_e164، keycloak_sub |
Confidential | Email/موبائل رازدارانہ؛ keycloak_sub مستحکم شناخت ہے (راز نہیں)۔ |
verification_jobs |
raw_payload (NADRA/SECP/FBR ردِعمل) |
Restricted | raw_payload at-rest مرموز؛ تجزیات کے لیے redacted result_json استعمال؛ کلاؤڈ اے آئی کو کبھی نہیں بھیجا؛ خام PII کے لیے صرف آن-پریمائز انجنز۔ |
verification_documents |
اپلوڈ کردہ CNIC/بینک ثبوت | Restricted | MinIO SSE-مرموز blob؛ AV-اسکین شدہ؛ صرف presigned URLs؛ retention پالیسی کے مطابق پھر purge۔ |
media_library |
اپلوڈ کردہ دستاویزات (CNIC اسکینز، ثبوت) | Restricted/Confidential | at-rest مرموز؛ av_status='clean' قبل AV اسکین؛ رازدارانہ/VIP ٹکٹ منسلکات Meilisearch extracted-text انڈیکسنگ سے خارج۔ |
inbound_replies |
from_address |
Confidential | ٹکٹ حل کرنے کے لیے استعمال؛ پتا کبھی کراس-ٹیننٹ ظاہر نہیں۔ |
notification_preferences، consents |
فی-صارف سیٹنگز | Confidential | صرف مالک + سپر ایڈمن۔ |
9.2 ٹکٹ مواد (سیاق و سباق-منحصر)
| جدول | حساسیت کا محرک | طبقہ | سلوک |
|---|---|---|---|
tickets |
is_confidential، is_vip، is_anonymous پرچم |
بالعموم Internal؛ فلگ ہونے پر Confidential/VIP/Restricted | ABAC مرئیت گیٹ؛ رازدارانہ/VIP کو ڈیفالٹ محکمہ reads اور کراس-محکمہ ڈیش بورڈز سے خارج؛ گمنام وہسٹل بلوور ٹکٹس میں کوئی cleartext رپورٹر شناخت محفوظ نہیں۔ |
ticket_messages، ticket_attachments |
ٹکٹ پرچم وراثت | Internal → Restricted | کسی بھی کلاؤڈ اے آئی کال سے پہلے باڈی redacted (is_redacted=1)؛ رازدارانہ ٹکٹس پر منسلکات کبھی آن-پریمائز اسٹوریج/اے آئی سے باہر نہیں۔ |
9.3 آپریشنل / آڈٹ (سالمیت-حساس)
| جدول | طبقہ | سلوک |
|---|---|---|
audit_logs |
Confidential (پلیٹ فارم) | صرف اضافہ؛ ہیش-چین شدہ؛ ماہانہ تقسیم؛ آف-ہوسٹ ایکسپورٹ؛ رسائی صرف Read-only Auditor + سپر ایڈمن۔ |
ticket_history، sla_pause_events، escalation_events |
Internal | صرف اضافہ؛ آرکائیول منصوبے کے مطابق retention (§7)۔ |
integrations_configs، system_settings (is_secret=1)، webhooks.secret_hash |
Restricted | کوئی رازی قدر کبھی DB میں محفوظ نہیں — صرف vault_ref یا ہیش؛ رازات والٹ واحد ماخذ ہے۔ |
ai_runs |
Confidential | input_summary صرف redacted اسنیپ شاٹ ہے؛ خام ان پٹس یہاں کبھی محفوظ نہیں؛ لاگت/ٹوکن ڈیٹا تجزیات کے لیے Internal ہے۔ |
9.4 عوامی / کم-حساسیت
| جدول | طبقہ | سلوک |
|---|---|---|
departments، holiday_calendar، business_hours، ticket_categories، service_catalog_entries، circulars، kb_articles (شائع شدہ)، officials، official_terms |
Public/Internal | عوامی سائٹ اور شفافیت ڈیش بورڈ پر دکھانا محفوظ؛ عہدیدار مدتیں تاریخی خط درستگی کے لیے ضروری۔ |
open_data_exports |
Public (مجموعی) | صرف گمنام مجموعی؛ کوئی PII نہیں؛ خاموشی پیمائش کے لیے ہیش-شائع۔ |
9.5 retention (سیکیورٹی دستاویز 11 کراس-ریفرنس)
retention ونڈوز /specs/ur/11-security-compliance/ میں حتمی ہوتی ہیں اور سندھ آرکائیوز قواعد (_context.md §6) کے مطابق ہیں۔ وہ ڈیفالٹس جو §7 آرکائیول پائپ لائن چلاتے ہیں:
- ایکٹو ٹکٹ ڈیٹا (ٹکٹس، پیغامات، منسلکات، ثبوت): ایکٹو ونڈو کے لیے آن لائن، پھر آرکائیو؛ ٹکٹ میٹا ڈیٹا طویل مدتی برقرار (آڈٹ/RTI)؛ رازدارانہ/VIP ٹکٹ مواد قانونی ہولڈ کے تحت رہا ہونے تک برقرار۔
- PII (CNIC، رابطہ): آخری ٹکٹ/تعلق کے بعد قانونی مدت کے لیے برقرار، پھر ہاٹ اسٹوریج سے purge (مرموز آرکائیو قانون کے مطابق برقرار)۔
- آڈٹ لاگز: کم از کم 36 ماہ آن لائن، لامحدود آرکائیو۔
- اے آئی رن لاگز: 12 ماہ آن لائن، مجموعی لاگت ڈیٹا طویل مدتی برقرار۔
- تصدیقی خام payloads: سب سے مختمل عملی retention (دوبارہ تصدیق دوبارہ لاتی ہے)؛ redacted
result_jsonادارے کے لائف سائیکل کے لیے برقرار۔
تمام purge ملازمتیں خود آڈٹ-لاگ (audit_logs، action data.purged) قطار گنتی اور لاگو retention قاعدے کے ساتھ ہوتی ہیں، تاکہ ریکارڈز کی تباہی RTI اور آڈٹ کے لیے قابلِ ثبوت ہو۔
*دستاویز کا اختتام۔