NiroVera

وثيقة توثيق حقوق المؤلف — مُعدّة للهيئة السعودية للملكية الفكرية

NiroVera — NiroVera

NiroVera — Cloud HR & Workforce Management Platform

المؤلف وصاحب الحقوق

نيار عبدالله سويلم الرنياوي

Niyar Abdullah Sweilem Al-Raniawi

تاريخ إصدار الوثيقة: ١٤ ربيع الأول ١٤٤٨ هـ

فكرة البرنامج

«NiroVera» (NiroVera) منصة رقمية سحابية متكاملة لإدارة الشركات والموارد البشرية، صُممت لتمكين المؤسسات من إدارة موظفيها وفروع عملها ومهامها اليومية من مكان واحد. يقوم البرنامج على فكرة ربط الحضور الوظيفي بالموقع الجغرافي الفعلي للموظف: فلا يُقبل تسجيل الحضور إلا إذا كان الموظف داخل النطاق الجغرافي المحدد لمقر عمله، مع تحديد نطاق المسافة المسموح لكل فرع عمل على الخريطة. كما تدعم المنصة نمط «المساحة الشخصية» للأفراد، بأدوات إنتاجية شخصية وتجربة توقيع رقمي مستقلة.

أولاً: نظام الحضور والانصراف الجغرافي

حضور وانصراف مرتبط بالموقع الجغرافي (GPS) مع تحقق إلزامي من الموقع قبل القبول، وقياس المسافة عن مقر العمل بدقة الأمتار، وقبول الحضور في أي فرع مصرح بها للموظف (الأقرب أولاً). يشمل النظام: تسجيل حضور سريع بلمسة واحدة مع تهيئة مسبقة للـGPS عند فتح التطبيق، واحتساب التأخير بالدقائق مقارنة بجدول الوردية، وانصراف مبكر موثق، وأعذار معتمدة، وخرائط تفاعلية لمواقع الفروع، وتقارير شهرية وتحليلات، ومسح تلقائي يومي (Workflows) لرصد الغياب والتأخير وإرسال التنبيهات.

ثانياً: نظام المهام والأهداف

نظام مهام هرمي بمجلدات وأقسام قابلة للتخصيص لكل فرع، يدعم إسناد المهام لموظف أو لفريق فرع أو لفريق المقر الرئيسي، مع أولويات (عادي/عاجل)، وأهداف عددية بنسبة إنجاز محسوبة، وتصعيد تلقائي للمهام الحرجة عبر سلسلة الصلاحيات، وبلاغات توقف العمل، وأرشيف ذكي يصنف المهام المكتملة حسب مدتها (سنوية/نصفية/ربعية/شهرية)، وتعليقات بمرفقات ملفات وتسجيلات صوتية.

ثالثاً: الموارد البشرية والرواتب

هيكل موارد بشرية مرن بدرجات وظيفية ومستويات قابلة للتخصيص بالكامل (عدد الدرجات، المسميات، النطاقات)، يشكل سلسلة تصعيد رسمية للشكاوى والاعتراضات، مع نظام بلاغات مجهولة الهوية محمية بتشفير أحادي الاتجاه لا يمكن عكسه. وتشمل وحدة الرواتب: استيراد مسيرات الرواتب من ملفات CSV/Excel بمطابقة تلقائية عبر البريد الإلكتروني، وقوالب رواتب، وإدارة الإجازات بأنواعها وأرصدتها وطلباتها واعتمادها، وملفات موظفين شاملة (شهادات، معلومات مهنية، رسائل HR).

رابعاً: السلامة المهنية (HSE) ومركز القيادة الذكي

وحدة سلامة مهنية ترصد الحوادث والمخاطر المفتوحة وتصنف الفروع الحرجة، وتغذي «مركز القيادة الذكي» في لوحة التحكم: درجة مخاطر مُوزّنة (Weighted Risk Scoring) مستوحاة من مصفوفات المخاطر وفق ISO 45001، تجمع الغياب والتأخير وتوقف العمل والتقارير المعلقة وحوادث السلامة في نسبة استقرار واحدة، مع شفافية كاملة في طريقة الحساب وأوزان قابلة للمعايرة من مالك الشركة حسب طبيعة نشاطها، وتنبؤات مخاطر استباقية وملخصات يومية ذكية.

خامساً: التوقيع الإلكتروني الموثق

نظام توقيع إلكتروني للمستندات على مستوى احترافي: توقيع شخصي (كتابةً بخطوط فنية أو رسمًا باللمس) برقم تحقق مشفّر فريد بصيغة PWC-XXXX-XXXX-XXXX مشتق من بصمة SHA-256، وتوقيع متعدد الأطراف عبر روابط خاصة لكل موقّع دون حاجة لحساب، وتحديد موضع التوقيع بحرية على أي صفحة مع تكبير وتصغير باللمس، وختم شارة تحقق نهائية على المستند بعد اكتمال جميع التواقيع، وبصمة ملف نهائية (File Hash) تربط رقم التحقق بالملف الموقع حصراً، وصفحة تحقق عامة من صحة أي مستند.

سادساً: المساعد الذكي «نيرو» والتواصل الداخلي

مساعد ذكاء اصطناعي «نيرو» يجيب عن أسئلة الإدارة من بيانات الشركة الفعلية، ويولّد ملخصات يومية ذكية وتنبيهات استباقية واقتراحات قرارات، وينشئ ملفات ومستندات حسب الطلب. إضافة إلى نظام دردشة داخلي لكل فرع مع رسائل خاصة ومجموعات مخصصة ومرفقات ومعرض وسائط وبحث، وإشعارات بريدية عبر تكامل Gmail، ومزامنة مواعيد مع تقويم Google.

سابعاً: التقارير والتعددية اللغوية والاشتراكات

تقارير أداء ومقارنات بين الموظفين والفروع والمجموعات قابلة للتصدير PDF/Excel بهوية الشركة البصرية (شعار ولون مخصص)، ودعم 9 لغات مع اتجاه كتابة تلقائي (RTL) للعربية، ونظام اشتراكات بخطط أسعار (Starter/Professional/Enterprise) مع بوابة دفع إلكترونية Stripe وفترة تجريبية وتذكيرات تلقائية، ولوحة مالك للمنصة لإدارة المشتركين وإحصاءات الزوار.

البنية التقنية والأمان

بُني البرنامج بتقنية React مع Vite للواجهة الأمامية، وTailwind CSS لنظام التصميم، وقواعد بيانات سحابية (Supabase وBase44) للتخزين والمزامنة اللحظية، ووظائف خلفية (Backend Functions) بتقنية Deno للتكاملات الخارجية: البريد الإلكتروني عبر Gmail، وتقويم Google، وخدمات الموقع الجغرافي، وبوابة الدفع Stripe. يعتمد النظام عزلًا كاملًا لبيانات كل شركة (Multi-Tenancy)، وجلسات دخول مشفّرة برموز عشوائية منتهية الصلاحية، وتحققًا ثنائيًا إلزاميًا عبر رمز OTP بالبريد الإلكتروني لجميع الحسابات، وتخزين كلمات المرور بتجزئة PBKDF2 دون أي تخزين للنص الصريح، وسجل تدقيق (Audit Log) للعمليات الحساسة.

جرد الكود المصدري الكامل

يتكون الكود المصدري الكامل للبرنامج من أكثر من مئتين وخمسين ملفاً برمجياً، جميعها من تأليف صاحب هذه الوثيقة. فيما يلي الجرد الكامل لملفات البرنامج مصنفة حسب وحداتها:

نواة التطبيق والإعدادات

src/App.jsx · src/main.jsx · src/index.css · index.html · tailwind.config.js · vite.config.js · package.json · src/lib/query-client.js · src/lib/utils.js · src/lib/app-params.js · src/lib/PageNotFound.jsx · src/api/base44Client.js

الصفحات الرئيسية (Pages)

src/pages/Landing.jsx · src/pages/Login.jsx · src/pages/Register.jsx · src/pages/ForgotPassword.jsx · src/pages/ResetPassword.jsx · src/pages/Dashboard.jsx · src/pages/Operations.jsx · src/pages/StationChat.jsx · src/pages/Complaints.jsx · src/pages/OrgStructure.jsx · src/pages/EmployeeProfile.jsx · src/pages/HRStructureManagement.jsx · src/pages/Payroll.jsx · src/pages/Performance.jsx · src/pages/Safety.jsx · src/pages/DailyReport.jsx · src/pages/Attendance.jsx · src/pages/Files.jsx · src/pages/FileSigning.jsx · src/pages/WorkProof.jsx · src/pages/Assistant.jsx · src/pages/OwnerPanel.jsx · src/pages/Pricing.jsx · src/pages/PricingSuccess.jsx · src/pages/Verify.jsx · src/pages/PublicSign.jsx · src/pages/About.jsx · src/pages/Help.jsx · src/pages/Privacy.jsx · src/pages/Security.jsx · src/pages/Terms.jsx · src/pages/PowerCarePresentation.jsx · src/pages/CopyrightDoc.jsx · src/pages/ProjectGuideDoc.jsx

المنطق والمكتبات (Libraries)

src/lib/PowerCareAuth.jsx · src/lib/store.js · src/lib/i18n.jsx · src/lib/i18nExtra.js · src/lib/permissions.js · src/lib/hrLevels.js · src/lib/roles.js · src/lib/escalation.js · src/lib/attendance.js · src/lib/geo.js · src/lib/geocodeStations.js · src/lib/leaveTypes.js · src/lib/payroll.js · src/lib/payrollTemplate.js · src/lib/salaryImport.js · src/lib/riskWeights.js · src/lib/signPdf.js · src/lib/multiSignStamp.js · src/lib/verificationBadge.js · src/lib/fileHash.js · src/lib/signedReport.js · src/lib/exportExcelColored.js · src/lib/printReport.js · src/lib/printDocument.js · src/lib/pdfTheme.js · src/lib/assistantActions.js · src/lib/assistantContext.js · src/lib/auditLog.js · src/lib/emailAlerts.js · src/lib/notificationRoute.js · src/lib/notificationFilters.js · src/lib/planLimits.js · src/lib/trackVisit.js · src/lib/dateFormat.js · src/lib/mediaAccess.js · src/lib/navVisibility.js

مكونات لوحة التحكم ومركز القيادة

src/components/dashboard/EmployeeDashboard.jsx · src/components/dashboard/StationManagerDashboard.jsx · src/components/dashboard/HandoffCommandBoard.jsx · src/components/dashboard/OperationsModuleGrid.jsx · src/components/dashboard/DashboardPersonaBar.jsx

مكونات الحضور والجدولة

src/components/attendance/QuickCheckInCard.jsx · src/components/attendance/CheckInOutCard.jsx · src/components/attendance/AttendanceDailyDashboard.jsx · src/components/attendance/AttendanceMonthlyReport.jsx · src/components/attendance/AttendanceAnalytics.jsx · src/components/attendance/AttendanceMapDashboard.jsx · src/components/attendance/AttendanceSettingsBoard.jsx · src/components/attendance/AttendanceLeaveRequests.jsx · src/components/attendance/LocationMapModal.jsx · src/components/attendance/ScheduleTab.jsx · src/components/attendance/TimeFormatToggle.jsx · src/components/schedules/StationScheduleEditor.jsx · src/components/schedules/ScheduleCell.jsx · src/components/schedules/ScheduleStatsBar.jsx

مكونات المهام والتقارير والأداء

src/components/tasks/OpsTasksTable.jsx · src/components/tasks/OpsNewTaskModal.jsx · src/components/tasks/OpsTaskDetail.jsx · src/components/tasks/OpsToolbarStrip.jsx · src/components/tasks/CommentFiles.jsx · src/components/tasks/VoiceRecorder.jsx · src/components/reports/ReportLibraryBoard.jsx · src/components/performance/PerfScoreBoard.jsx · src/components/performance/JobObjectiveBoard.jsx · src/components/safety/StationSafetyCard.jsx

مكونات الموارد البشرية والموظفين

src/components/hr/FlexOrgTree.jsx · src/components/hr/HrDirectoryBoard.jsx · src/components/hr/OrgStructureBoard.jsx · src/components/hr/ComplianceMhrsdBoard.jsx · src/components/employees/ProfileHero.jsx · src/components/employees/ProfessionalInfoTab.jsx · src/components/employees/CertificatesTab.jsx · src/components/employees/SalaryTab.jsx · src/components/employees/LeaveTab.jsx · src/components/employees/LeaveBalanceCard.jsx · src/components/employees/LeaveTotalsEditor.jsx · src/components/employees/HRCommunicationsTab.jsx · src/components/employees/PresenceStatusPicker.jsx · src/components/employees/ContractTab.jsx · src/components/payroll/PayrollRow.jsx · src/components/payroll/PayrollTemplateCard.jsx

مكونات التوقيع الإلكتروني والملفات

src/components/files/MySignatureCard.jsx · src/components/files/SignaturePad.jsx · src/components/files/TypedSignature.jsx · src/components/files/MultiSignPlacementModal.jsx · src/components/files/MultiSignCard.jsx · src/components/files/MultiSignInbox.jsx · src/components/files/VerifyDocumentCard.jsx · src/components/files/FolderCard.jsx · src/components/files/FileRow.jsx

مكونات الدردشة والمساعد الذكي والجوال

src/components/chat/ChatBubble.jsx · src/components/chat/ChatContactList.jsx · src/components/chat/ChatGroupManager.jsx · src/components/chat/ChatMediaGallery.jsx · src/components/chat/ChatSearchPanel.jsx · src/components/chat/CompanyEmailComposer.jsx · src/components/assistant/AssistantMessage.jsx · src/components/assistant/VoiceControl.jsx · src/components/assistant/SuggestedQuestions.jsx · src/components/mobile/BottomTabBar.jsx · src/components/mobile/PullToRefresh.jsx · src/components/mobile/MobileSelect.jsx · src/components/mobile/BackButton.jsx · src/components/Layout.jsx · src/components/Logo.jsx

الوظائف الخلفية والأتمتة (Backend & Workflows)

base44/functions/supabaseAttendance/entry.ts · base44/functions/supabaseTargets/entry.ts · base44/functions/companyDirectory/entry.ts · base44/functions/signedDocs/entry.ts · base44/functions/multiSign/entry.ts · base44/functions/gmailNotify/entry.ts · base44/functions/calendarSync/entry.ts · base44/functions/googleGeolocate/entry.ts · base44/functions/stripeCheckout/entry.ts · base44/functions/subscriberEmails/entry.ts · base44/functions/subscriptionOverview/entry.ts · base44/functions/pageVisits/entry.ts · base44/functions/uiTranslations/entry.ts · base44/functions/weeklySummary/entry.ts · base44/functions/seedDemoCompany/entry.ts · base44/workflows/AttendanceAbsentSweep.jsonc · base44/workflows/AttendanceLateAlertSweep.jsonc · base44/workflows/TaskEscalationSweep.jsonc · base44/workflows/TrialReminderSweep.jsonc · base44/workflows/WeeklyOwnerSummary.jsonc

نماذج قاعدة البيانات (Entities)

CompanyAccount · CompanySession · Employee · EmployeeCredential · LoginOtp · Station · CompanyDataBlob · SignedDocument · SignatureRequest · AuditLog · SyncSignal · PageVisit · ProductFeedback · UiTranslation

الكود المصدري للبرنامج — مقتطفات جوهرية

فيما يلي مقتطفات تمثيلية من الملفات الجوهرية توضح بنية البرنامج ومنطقه البرمجي الأصيل، وجميعها من تأليف صاحب هذه الوثيقة:

1. src/App.jsx — موجّه التطبيق الرئيسي (Application Router)

import { Toaster } from "@/components/ui/toaster"
import { QueryClientProvider } from '@tanstack/react-query'
import { BrowserRouter as Router, Route, Routes, Navigate } from 'react-router-dom';
import { AuthProvider as PowerCareAuthProvider, useAuth as usePowerCareAuth } from '@/lib/PowerCareAuth';
import Layout from '@/components/Layout';
import { lazy, Suspense } from 'react';
import Landing from './pages/Landing';

const Dashboard = lazy(() => import('./pages/Dashboard'));
const Operations = lazy(() => import('./pages/Operations'));
const Attendance = lazy(() => import('./pages/Attendance'));
const FileSigning = lazy(() => import('./pages/FileSigning'));
const HRStructureManagement = lazy(() => import('./pages/HRStructureManagement'));

function RequireAuth({ children }) {
  const { session } = useNiroVeraAuth();
  if (!session) return <Navigate to="/" replace />;
  return <Layout>{children}</Layout>;
}

function AppRoutes() {
  return (
    <Suspense fallback={<PageLoader />}>
      <Routes>
        <Route path="/" element={<Landing />} />
        <Route path="/login" element={<Login />} />
        <Route path="/pricing" element={<Pricing />} />
        <Route path="/sign" element={<PublicSign />} />
        <Route path="/verify" element={<Verify />} />
        <Route path="/app" element={<RequireAuth><Dashboard /></RequireAuth>} />
        <Route path="/app/tasks" element={<RequireAuth><Operations /></RequireAuth>} />
        <Route path="/app/attendance" element={<RequireAuth><Attendance /></RequireAuth>} />
        <Route path="/app/signing" element={<RequireAuth><FileSigning /></RequireAuth>} />
        <Route path="/app/hr" element={<RequireAuth><HRStructureManagement /></RequireAuth>} />
      </Routes>
    </Suspense>
  );
}

2. src/lib/riskWeights.js — أوزان المخاطر القابلة للمعايرة (مركز القيادة الذكي)

// Configurable risk weights for the Command Center stability score.
// Owners can override these per-company (stored in data.settings.riskWeights).
export const DEFAULT_RISK_WEIGHTS = {
  absent: 8,        // absent employee today
  delayed: 12,      // delayed / due-soon task
  stoppage: 18,     // task stoppage issue
  reports: 4,       // pending daily report
  critical: 20,     // critical (red) safety station
  incidents: 15,    // safety incident in last 30 days
  hazards: 6,       // open safety hazard
};

export function getRiskWeights(data) {
  return { ...DEFAULT_RISK_WEIGHTS, ...(data?.settings?.riskWeights || {}) };
}

// Dashboard usage — weighted risk scoring (ISO 45001-style risk matrix):
const riskScore = Math.min(100, Math.round(
  (absentCount * w.absent) + (delayedTasks * w.delayed) +
  (stoppageCount * w.stoppage) + (pendingReports * w.reports) +
  (criticalStations * w.critical) + (recentIncidents * w.incidents) +
  (openHazards * w.hazards)
));
const stabilityScore = 100 - riskScore;

3. src/components/attendance/CheckInOutCard.jsx — الحضور المرتبط بالموقع الجغرافي

const handleCheckIn = async () => {
  setError("");
  setLoading(true);
  try {
    // Location is MANDATORY before check-in — no location, no check-in.
    const coords = await getAccuratePosition();
    if (!coords) {
      setError(t("locationDenied"));
      setLoading(false);
      return;
    }
    const res = await base44.functions.invoke("supabaseAttendance", {
      action: "checkIn",
      companyId: company.id,
      employeeId: currentUser.id,
      employeeName: currentUser.name,
      stationId: currentUser.stationId || null,
      lat: coords?.lat, lng: coords?.lng,
      accuracy: coords?.accuracy ?? null,
      shiftStart: shift?.start,
      stationLat: station?.lat ?? null,
      stationLng: station?.lng ?? null,
      radiusMeters: station?.radiusMeters ?? null,
    });
    const att = res?.data?.attendance;
    if (att) { setAttendance(att); onStatusChange?.(att); }
  } catch (err) {
    const code = err?.response?.data?.error;
    setError(code === "GPS_REQUIRED" ? t("locationDenied")
      : code === "OUTSIDE_STATION" ? t("outsideLocation")
      : (code || "Failed to check in"));
  } finally {
    setLoading(false);
  }
};

4. src/components/files/MySignatureCard.jsx — التوقيع الإلكتروني برقم تحقق مشفّر

// DocuSign-style unique signature ID: a non-reversible SHA-256 hash of the
// signer + timestamp, formatted as PWC-XXXX-XXXX-XXXX for verification.
async function generateSignatureId(userId) {
  const data = new TextEncoder().encode(`${userId}::${Date.now()}::${Math.random()}`);
  const hash = await crypto.subtle.digest("SHA-256", data);
  const hex = [...new Uint8Array(hash)]
    .map((b) => b.toString(16).padStart(2, "0")).join("").toUpperCase();
  return `PWC-${hex.slice(0, 4)}-${hex.slice(4, 8)}-${hex.slice(8, 12)}`;
}

const saveSignature = async (dataUrl, typedName) => {
  setSaving(true);
  try {
    const blob = dataUrlToBlob(dataUrl);
    const file = new File([blob], "signature.png", { type: "image/png" });
    const { file_url } = await base44.integrations.Core.UploadFile({ file });
    const sigId = await generateSignatureId(currentUser.id);
    const savedProfile = {
      signatureUrl: file_url,
      signatureId: sigId,
      signatureName: typedName || currentUser.name,
      signatureUpdatedAt: new Date().toISOString(),
    };
    updateEmployeeProfile(companyId, currentUser.id, savedProfile);
    onSaved?.(savedProfile);
    setEditing(false);
  } finally {
    setSaving(false);
  }
};

5. src/components/mobile/PullToRefresh.jsx — إيماءة السحب للتحديث (تجربة تطبيق أصلي)

// Native-style pull-to-refresh: swipe down from the top of the page to
// trigger onRefresh. touchmove is registered { passive: false } so
// preventDefault() suppresses the native overscroll only while dragging
// down from the very top (window.scrollY === 0).
const onTouchMove = (e) => {
  if (startY.current == null || refreshingRef.current) return;
  if (window.scrollY !== 0) { reset(); return; }
  const dy = e.touches[0].clientY - startY.current;
  if (dy > 0) {
    pulling.current = true;
    if (e.cancelable) e.preventDefault();
    setPullBoth(Math.min(dy * 0.4, 90));
  } else if (!pulling.current) {
    startY.current = null;
  }
};

const onTouchEnd = async () => {
  const finalPull = pullRef.current;
  startY.current = null;
  if (finalPull >= 45) {
    refreshingRef.current = true;
    setRefreshing(true);
    try { await onRefreshRef.current?.(); } finally {
      refreshingRef.current = false;
      setRefreshing(false);
      setPullBoth(0);
    }
  } else {
    setPullBoth(0);
  }
};

6. src/lib/sectionGuides.js — نظام الشروحات التفاعلية لكل قسم

// Per-section usage guides shown at the top of every app page.
const GUIDES = {
  "/app/attendance": {
    ar: ["سجّل حضورك بزر «تسجيل حضور» — قد يُطلب تحديد موقعك للتحقق من وجودك في المقر.",
         "من «الإعدادات» حدد مواقع المقرات على الخريطة ونطاق المسافة المسموح."],
    en: ["Check in with the Check-In button — GPS verifies you are on site.",
         "In Settings, set workplace locations and the allowed radius."],
  },
  "/app/signing": {
    ar: ["احفظ توقيعك مرة واحدة — يحصل على رقم تحقق مشفّر فريد.",
         "لتواقيع عدة أطراف استخدم «طلب تواقيع متعددة» — كل طرف يوقّع من رابط خاص به."],
    en: ["Save your signature once — it gets a unique encrypted ID.",
         "For multiple parties use Multi-Sign — each signer gets their own link."],
  },
};

export function getGuide(pathname, lang) {
  const guide = GUIDES[pathname];
  if (!guide) return null;
  return lang === "ar" ? guide.ar : guide.en;
}

إقرار الملكية

أقر أنا الموقّع أدناه، نيار عبدالله سويلم الرنياوي (Niyar Abdullah Sweilem Al-Raniawi)، بأنني المؤلف وصاحب الحقوق الفكرية الكاملة لبرنامج «NiroVera — NiroVera» بجميع مكوناته: الفكرة، والتصميم، والكود المصدري، وقواعد البيانات، والواجهات، وأن هذا العمل من إبداعي الأصيل. وقد أُعدّت هذه الوثيقة لغرض توثيق حقوق المؤلف لدى الهيئة السعودية للملكية الفكرية.

الاسم والتوقيع:

نيار عبدالله سويلم الرنياوي

التاريخ:

١٤ ربيع الأول ١٤٤٨ هـ

© 2026 Niyar Abdullah Sweilem Al-Raniawi — NiroVera. All rights reserved. جميع الحقوق محفوظة.