diff --git a/.env.bak_qa b/.env.bak_qa new file mode 100644 index 0000000..b58e8c7 --- /dev/null +++ b/.env.bak_qa @@ -0,0 +1,68 @@ +# Django Settings +DEBUG=True +SECRET_KEY=your-secret-key-here-change-in-production +ALLOWED_HOSTS=localhost,127.0.0.1 + +# Database +DATABASE_URL=postgres://px360:px360@localhost:5433/px360 + +# Celery +CELERY_BROKER_URL=redis://localhost:6379/0 +CELERY_RESULT_BACKEND=redis://localhost:6379/0 +CELERY_TASK_ALWAYS_EAGER=False + +# Email Configuration +EMAIL_BACKEND=django.core.mail.backends.smtp.EmailBackend +EMAIL_HOST=smtp-mail.outlook.com +EMAIL_PORT=587 +EMAIL_USE_TLS=True +EMAIL_HOST_USER=px360@hh.med.sa +EMAIL_HOST_PASSWORD=A-Za-z0-9!@#$%^&* +DEFAULT_FROM_EMAIL=px360@hh.med.sa + +# AI Configuration (LiteLLM with OpenRouter) +OPENROUTER_API_KEY=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 +AI_MODEL=openrouter/google/gemini-2.5-flash-lite +# AI_MODEL=z-ai/glm-4.5-air:free +AI_TEMPERATURE=0.3 +AI_MAX_TOKENS=500 + +# Notification Channels +SMS_ENABLED=False +SMS_PROVIDER=mshastra +WHATSAPP_ENABLED=False +WHATSAPP_PROVIDER=console +EMAIL_ENABLED=True +EMAIL_PROVIDER=smtp + +# Admin URL (change in production) +ADMIN_URL=admin/ + +# Integration APIs (Stubs - Replace with actual credentials) +HIS_API_URL=https://his.alhammadi.med.sa/SSRCE/API/FetchPatientVisitTimeStamps +# HIS_API_URL=http://localhost:8000/api/simulator/generate-visit/ +HIS_RATINGS_API_URL=https://his.alhammadi.med.sa/SSRCE/API/FetchDoctorRatingMAPI +HIS_API_USERNAME=AlhhSUNZHippo +# HIS_API_PASSWORD is set in config/settings/base.py (contains special characters) +MOH_API_URL= +MOH_API_KEY= +CHI_API_URL= +CHI_API_KEY= + +EMAIL_API_ENABLED=false +SMS_API_ENABLED=false +EMAIL_API_URL=http://localhost:8000/api/simulator/send-email/ +SMS_API_URL=http://localhost:8000/api/simulator/send-sms/ +EMAIL_API_KEY=simulator-test-keyrom +SMS_API_KEY=simulator-test-key + +# Dev SMS Recipient - all SMS redirected to this number in development +DEV_SMS_RECIPIENT=+966566703794 + +# Session Settings - prevent logout on server reload +SESSION_EXPIRE_AT_BROWSER_CLOSE=False + +# Mshastra SMS API +MSHASTRA_USERNAME=M556999091 +MSHASTRA_PASSWORD=4bpem6su +MSHASTRA_SENDER_ID=M556999091 diff --git a/.gitignore b/.gitignore index 4ad2ed8..aedc945 100644 --- a/.gitignore +++ b/.gitignore @@ -18,6 +18,10 @@ lib/ lib64/ parts/ sdist/ + +# Database backups +backups/*.dump +backups/*.tar.gz var/ wheels/ pip-wheel-metadata/ diff --git a/.mimocode/plans/1782056018571-stellar-garden.md b/.mimocode/plans/1782056018571-stellar-garden.md new file mode 100644 index 0000000..df270ca --- /dev/null +++ b/.mimocode/plans/1782056018571-stellar-garden.md @@ -0,0 +1,17 @@ +# Fix: Hospital select not visible on /config/users/create/ + +## Problem +The `HospitalFieldMixin` in `apps/core/form_mixins.py:44` sets `hospital_field.widget = forms.HiddenInput()`, hiding the hospital field. This mixin is designed for forms where hospital is auto-set from user context, but for user creation we need a visible dropdown. + +## Fix +Remove `HospitalFieldMixin` from `UserCreateForm` and `UserEditForm` in `apps/accounts/forms.py`. Keep `DepartmentFieldMixin` for department filtering. + +The forms already define `hospital` as a `ModelChoiceField` with a `Select` widget — removing the mixin will let it render normally. + +## Files to modify +- `apps/accounts/forms.py` — Remove `HospitalFieldMixin` from both form classes, adjust `__init__` to not pop `request`/`user` kwargs (since `HospitalFieldMixin` no longer handles that) + +## Verification +- Navigate to `/config/users/create/` — hospital dropdown should be visible +- PX Admin sees all active hospitals +- Hospital Admin sees only their hospital (can pre-set it in the view) diff --git a/apps/accounts/forms.py b/apps/accounts/forms.py new file mode 100644 index 0000000..9f8fe41 --- /dev/null +++ b/apps/accounts/forms.py @@ -0,0 +1,238 @@ +""" +Accounts forms - User create/edit for config console +""" + +from django import forms +from django.contrib.auth.models import Group +from django.utils.translation import gettext_lazy as _ + +from apps.accounts.models import User +from apps.organizations.models import Hospital, Department +from apps.core.form_mixins import DepartmentFieldMixin + + +class UserCreateForm(DepartmentFieldMixin, forms.ModelForm): + """Form for creating a new user in the config console""" + + email = forms.EmailField( + label=_("Email"), + widget=forms.EmailInput(attrs={ + "class": "w-full px-4 py-3 border border-slate-200 rounded-xl focus:outline-none focus:ring-2 focus:ring-navy focus:border-transparent transition bg-white text-sm", + "placeholder": "user@example.com", + }), + ) + first_name = forms.CharField( + label=_("First Name"), + widget=forms.TextInput(attrs={ + "class": "w-full px-4 py-3 border border-slate-200 rounded-xl focus:outline-none focus:ring-2 focus:ring-navy focus:border-transparent transition bg-white text-sm", + }), + ) + last_name = forms.CharField( + label=_("Last Name"), + widget=forms.TextInput(attrs={ + "class": "w-full px-4 py-3 border border-slate-200 rounded-xl focus:outline-none focus:ring-2 focus:ring-navy focus:border-transparent transition bg-white text-sm", + }), + ) + phone = forms.CharField( + label=_("Phone"), + required=False, + widget=forms.TextInput(attrs={ + "class": "w-full px-4 py-3 border border-slate-200 rounded-xl focus:outline-none focus:ring-2 focus:ring-navy focus:border-transparent transition bg-white text-sm", + "placeholder": "+966501234567", + }), + ) + employee_id = forms.CharField( + label=_("Employee ID"), + required=False, + widget=forms.TextInput(attrs={ + "class": "w-full px-4 py-3 border border-slate-200 rounded-xl focus:outline-none focus:ring-2 focus:ring-navy focus:border-transparent transition bg-white text-sm", + }), + ) + hospital = forms.ModelChoiceField( + queryset=Hospital.objects.filter(status="active"), + label=_("Hospital"), + required=False, + widget=forms.Select(attrs={ + "class": "w-full px-4 py-3 border border-slate-200 rounded-xl focus:outline-none focus:ring-2 focus:ring-navy focus:border-transparent transition bg-white text-sm", + }), + ) + department = forms.ModelChoiceField( + queryset=Department.objects.none(), + label=_("Department"), + required=False, + widget=forms.Select(attrs={ + "class": "w-full px-4 py-3 border border-slate-200 rounded-xl focus:outline-none focus:ring-2 focus:ring-navy focus:border-transparent transition bg-white text-sm", + }), + ) + groups = forms.ModelMultipleChoiceField( + queryset=Group.objects.all(), + label=_("Roles"), + required=False, + widget=forms.CheckboxSelectMultiple(attrs={ + "class": "role-checkbox", + }), + ) + password = forms.CharField( + label=_("Password"), + required=False, + widget=forms.PasswordInput(attrs={ + "class": "w-full px-4 py-3 border border-slate-200 rounded-xl focus:outline-none focus:ring-2 focus:ring-navy focus:border-transparent transition bg-white text-sm", + "placeholder": _("Leave blank to generate random password"), + }), + ) + password_confirm = forms.CharField( + label=_("Confirm Password"), + required=False, + widget=forms.PasswordInput(attrs={ + "class": "w-full px-4 py-3 border border-slate-200 rounded-xl focus:outline-none focus:ring-2 focus:ring-navy focus:border-transparent transition bg-white text-sm", + }), + ) + is_active = forms.BooleanField( + label=_("Active"), + initial=True, + required=False, + widget=forms.CheckboxInput(attrs={ + "class": "w-5 h-5 text-navy border-slate-300 rounded focus:ring-navy", + }), + ) + + class Meta: + model = User + fields = [ + "email", "first_name", "last_name", "phone", "employee_id", + "hospital", "department", "groups", "is_active", + ] + + def __init__(self, *args, **kwargs): + self.request = kwargs.pop("request", None) + self.user = kwargs.pop("user", None) or (self.request.user if self.request else None) + super().__init__(*args, **kwargs) + self.fields["groups"].queryset = Group.objects.all().order_by("name") + if self.user and self.user.is_hospital_admin() and self.user.hospital: + self.fields["hospital"].initial = self.user.hospital + self.fields["hospital"].queryset = Hospital.objects.filter(id=self.user.hospital.id) + + def clean_email(self): + email = self.cleaned_data.get("email") + if User.objects.filter(email=email).exists(): + raise forms.ValidationError(_("A user with this email already exists.")) + return email + + def clean(self): + cleaned_data = super().clean() + password = cleaned_data.get("password") + password_confirm = cleaned_data.get("password_confirm") + if password and password_confirm and password != password_confirm: + self.add_error("password_confirm", _("Passwords do not match.")) + return cleaned_data + + def save(self, commit=True): + import secrets + import string + + user = super().save(commit=False) + password = self.cleaned_data.get("password") + + if not password: + alphabet = string.ascii_letters + string.digits + "!@#$%^&*" + password = ''.join(secrets.choice(alphabet) for _ in range(16)) + self._generated_password = password + + user.set_password(password) + if commit: + user.save() + selected_groups = self.cleaned_data.get("groups") + if selected_groups: + user.groups.set(selected_groups) + return user + + +class UserEditForm(DepartmentFieldMixin, forms.ModelForm): + """Form for editing an existing user in the config console""" + + first_name = forms.CharField( + label=_("First Name"), + widget=forms.TextInput(attrs={ + "class": "w-full px-4 py-3 border border-slate-200 rounded-xl focus:outline-none focus:ring-2 focus:ring-navy focus:border-transparent transition bg-white text-sm", + }), + ) + last_name = forms.CharField( + label=_("Last Name"), + widget=forms.TextInput(attrs={ + "class": "w-full px-4 py-3 border border-slate-200 rounded-xl focus:outline-none focus:ring-2 focus:ring-navy focus:border-transparent transition bg-white text-sm", + }), + ) + phone = forms.CharField( + label=_("Phone"), + required=False, + widget=forms.TextInput(attrs={ + "class": "w-full px-4 py-3 border border-slate-200 rounded-xl focus:outline-none focus:ring-2 focus:ring-navy focus:border-transparent transition bg-white text-sm", + "placeholder": "+966501234567", + }), + ) + employee_id = forms.CharField( + label=_("Employee ID"), + required=False, + widget=forms.TextInput(attrs={ + "class": "w-full px-4 py-3 border border-slate-200 rounded-xl focus:outline-none focus:ring-2 focus:ring-navy focus:border-transparent transition bg-white text-sm", + }), + ) + hospital = forms.ModelChoiceField( + queryset=Hospital.objects.filter(status="active"), + label=_("Hospital"), + required=False, + widget=forms.Select(attrs={ + "class": "w-full px-4 py-3 border border-slate-200 rounded-xl focus:outline-none focus:ring-2 focus:ring-navy focus:border-transparent transition bg-white text-sm", + }), + ) + department = forms.ModelChoiceField( + queryset=Department.objects.none(), + label=_("Department"), + required=False, + widget=forms.Select(attrs={ + "class": "w-full px-4 py-3 border border-slate-200 rounded-xl focus:outline-none focus:ring-2 focus:ring-navy focus:border-transparent transition bg-white text-sm", + }), + ) + groups = forms.ModelMultipleChoiceField( + queryset=Group.objects.all(), + label=_("Roles"), + required=False, + widget=forms.CheckboxSelectMultiple(attrs={ + "class": "role-checkbox", + }), + ) + is_active = forms.BooleanField( + label=_("Active"), + initial=True, + required=False, + widget=forms.CheckboxInput(attrs={ + "class": "w-5 h-5 text-navy border-slate-300 rounded focus:ring-navy", + }), + ) + + class Meta: + model = User + fields = [ + "first_name", "last_name", "phone", "employee_id", + "hospital", "department", "groups", "is_active", + ] + + def __init__(self, *args, **kwargs): + self.request = kwargs.pop("request", None) + self.user = kwargs.pop("user", None) or (self.request.user if self.request else None) + super().__init__(*args, **kwargs) + self.fields["groups"].queryset = Group.objects.all().order_by("name") + if self.instance and self.instance.pk: + self.fields["groups"].initial = self.instance.groups.all() + if self.instance.hospital: + self.fields["hospital"].initial = self.instance.hospital + self.fields["hospital"].queryset = Hospital.objects.filter(id=self.instance.hospital.id) + + def save(self, commit=True): + user = super().save(commit=False) + if commit: + user.save() + selected_groups = self.cleaned_data.get("groups") + if selected_groups is not None: + user.groups.set(selected_groups) + return user diff --git a/apps/analytics/kpi_pdf_service.py b/apps/analytics/kpi_pdf_service.py new file mode 100644 index 0000000..7163182 --- /dev/null +++ b/apps/analytics/kpi_pdf_service.py @@ -0,0 +1,220 @@ +""" +Server-side PDF generation service for KPI Reports. + +Uses matplotlib for chart rendering and WeasyPrint for HTML-to-PDF conversion. +No browser/JS required — works in Celery tasks and behind firewalls. +""" + +import base64 +import io +import logging +from datetime import datetime + +from django.template.loader import render_to_string + +logger = logging.getLogger(__name__) + + +def _render_trend_chart(monthly_data, target, threshold): + """ + Render the monthly performance trend chart as a base64-encoded PNG. + + Args: + monthly_data: list of 12 KPIReportMonthlyData instances (or None) + target: target percentage (float) + threshold: threshold percentage (float) + + Returns: + base64-encoded PNG string, or empty string on failure + """ + try: + import matplotlib + matplotlib.use("Agg") + import matplotlib.pyplot as plt + except ImportError: + logger.warning("matplotlib not available — skipping trend chart") + return "" + + months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"] + values = [] + for m in monthly_data: + if m and m.percentage is not None: + values.append(float(m.percentage)) + else: + values.append(None) + + fig, ax = plt.subplots(figsize=(14, 6.5)) + fig.patch.set_facecolor("white") + + non_none = [(i, v) for i, v in enumerate(values) if v is not None] + if non_none: + x_indices = [i for i, _ in non_none] + y_values = [v for _, v in non_none] + ax.plot(range(12), values, color="#005696", linewidth=2, marker="o", markersize=5, zorder=3) + ax.scatter(x_indices, y_values, color="#005696", s=40, zorder=4) + + below = [(i, v) for i, v in non_none if v < threshold] + if below: + bx = [i for i, _ in below] + by = [v for _, v in below] + ax.scatter(bx, by, color="#dc2626", s=60, zorder=5, edgecolors="white", linewidths=1) + + ax.axhline(y=target, color="#16a34a", linestyle="--", linewidth=1.2, alpha=0.7, label=f"Target ({target:.0f}%)") + ax.axhline(y=threshold, color="#dc2626", linestyle="--", linewidth=1.2, alpha=0.7, label=f"Threshold ({threshold:.0f}%)") + + ax.set_ylim(0, 105) + ax.set_xticks(range(12)) + ax.set_xticklabels(months, fontsize=8) + ax.set_ylabel("Percentage (%)", fontsize=9) + ax.set_title("Monthly Performance Trend", fontsize=11, fontweight="bold", color="#005696", pad=12) + ax.legend(loc="lower right", fontsize=7, framealpha=0.9) + ax.grid(True, axis="y", alpha=0.3, linestyle="-") + ax.spines["top"].set_visible(False) + ax.spines["right"].set_visible(False) + + plt.tight_layout() + buf = io.BytesIO() + plt.savefig(buf, format="png", dpi=200, bbox_inches="tight") + plt.close() + buf.seek(0) + return base64.b64encode(buf.getvalue()).decode("utf-8") + + +def _render_source_chart(source_breakdowns): + """ + Render the complaints-by-source donut chart as a base64-encoded PNG. + + Args: + source_breakdowns: QuerySet of KPIReportSourceBreakdown + + Returns: + base64-encoded PNG string, or empty string on failure + """ + try: + import matplotlib + matplotlib.use("Agg") + import matplotlib.pyplot as plt + except ImportError: + logger.warning("matplotlib not available — skipping source chart") + return "" + + sources = list(source_breakdowns) + if not sources: + return "" + + labels = [s.source_name for s in sources] + sizes = [float(s.percentage) for s in sources] + counts = [s.complaint_count for s in sources] + + colors = ["#005696", "#007bbd", "#3b82f6", "#f59e0b", "#10b981", "#8b5cf6", "#ef4444", "#6b7280"] + + fig, ax = plt.subplots(figsize=(8, 7)) + fig.patch.set_facecolor("white") + + wedges, texts, autotexts = ax.pie( + sizes, + labels=None, + autopct=lambda pct: f"{pct:.0f}%" if pct > 5 else "", + colors=colors[: len(sources)], + startangle=90, + pctdistance=0.80, + wedgeprops=dict(width=0.4, edgecolor="white", linewidth=2), + ) + + for autotext in autotexts: + autotext.set_color("white") + autotext.set_fontsize(8) + autotext.set_fontweight("bold") + + total_count = sum(counts) + ax.text(0, 0.05, f"{total_count}", ha="center", va="center", fontsize=20, fontweight="bold", color="#005696") + ax.text(0, -0.15, "Total", ha="center", va="center", fontsize=8, color="#64748b") + + ax.legend( + wedges, + [f"{l} ({c})" for l, c in zip(labels, counts)], + loc="center left", + bbox_to_anchor=(1, 0.5), + fontsize=8, + frameon=False, + ) + + ax.set_title("Complaints by Source", fontsize=11, fontweight="bold", color="#005696", pad=12) + + plt.tight_layout() + buf = io.BytesIO() + plt.savefig(buf, format="png", dpi=200, bbox_inches="tight") + plt.close() + buf.seek(0) + return base64.b64encode(buf.getvalue()).decode("utf-8") + + +def _get_logo_base64(): + """ + Load the hospital logo, thumbnail it, and return as a base64 data URI. + + Returns: + base64 data URI string, or empty string on failure + """ + try: + import io + from django.conf import settings + from PIL import Image as PILImage + + logo_path = settings.BASE_DIR / "static" / "img" / "hh-logo.png" + logo_img = PILImage.open(logo_path) + logo_img.thumbnail((500, 500), PILImage.LANCZOS) + buf = io.BytesIO() + logo_img.save(buf, format="PNG", optimize=True) + return "data:image/png;base64," + base64.b64encode(buf.getvalue()).decode("utf-8") + except Exception as e: + logger.warning(f"Could not load logo for KPI PDF: {e}") + return "" + + +def generate_kpi_report_pdf(report): + """ + Generate a PDF for a KPI Report using WeasyPrint. + + Args: + report: KPIReport instance with related data loaded + + Returns: + PDF file contents as bytes + """ + from weasyprint import HTML + + monthly_data_qs = report.monthly_data.filter(month__gt=0).order_by("month") + total_data = report.monthly_data.filter(month=0).first() + + monthly_data_dict = {m.month: m for m in monthly_data_qs} + monthly_data = [monthly_data_dict.get(i) for i in range(1, 13)] + + source_breakdowns = report.source_breakdowns.all() + department_breakdowns = report.department_breakdowns.all() + location_breakdowns = report.location_breakdowns.all() + + target = float(report.target_percentage) if report.target_percentage else 95.0 + threshold = float(report.threshold_percentage) if report.threshold_percentage else 90.0 + + trend_chart_b64 = _render_trend_chart(monthly_data, target, threshold) + source_chart_b64 = _render_source_chart(source_breakdowns) + + ai_analysis = report.ai_analysis or {} + + context = { + "report": report, + "monthly_data": monthly_data, + "total_data": total_data, + "source_breakdowns": source_breakdowns, + "department_breakdowns": department_breakdowns, + "location_breakdowns": location_breakdowns, + "trend_chart": trend_chart_b64, + "source_chart": source_chart_b64, + "ai_analysis": ai_analysis, + "logo_path": _get_logo_base64(), + "generated_at": datetime.now().strftime("%Y-%m-%d %H:%M"), + } + + html_string = render_to_string("analytics/kpi_report_weasyprint.html", context) + return HTML(string=html_string).write_pdf() diff --git a/apps/analytics/kpi_views.py b/apps/analytics/kpi_views.py index 84329de..df2ff42 100644 --- a/apps/analytics/kpi_views.py +++ b/apps/analytics/kpi_views.py @@ -348,11 +348,14 @@ def kpi_report_regenerate(request, report_id): @login_required def kpi_report_pdf(request, report_id): """ - Generate PDF version of KPI report + Generate and download a server-side PDF for a KPI report. - Returns HTML page with print-friendly styling and - html2pdf.js for client-side PDF generation. + Uses WeasyPrint + matplotlib for high-quality, consistent PDF output + without requiring browser JavaScript or external CDNs. """ + from .kpi_pdf_service import generate_kpi_report_pdf + from django.http import HttpResponse + user = request.user report = get_object_or_404(KPIReport.objects.select_related("hospital", "generated_by"), id=report_id) @@ -362,55 +365,17 @@ def kpi_report_pdf(request, report_id): messages.error(request, _("You do not have permission to view this report.")) return redirect("analytics:kpi_report_list") - # Get monthly data (1-12) - monthly_data_qs = report.monthly_data.filter(month__gt=0).order_by("month") - total_data = report.monthly_data.filter(month=0).first() + try: + pdf_bytes = generate_kpi_report_pdf(report) + except Exception as e: + logger.error(f"Failed to generate KPI PDF for report {report_id}: {e}", exc_info=True) + messages.error(request, _("Failed to generate PDF. Please try again.")) + return redirect("analytics:kpi_report_detail", report_id=report_id) - # Build monthly data array ensuring 12 months - monthly_data_dict = {m.month: m for m in monthly_data_qs} - monthly_data = [monthly_data_dict.get(i) for i in range(1, 13)] - - # Get source breakdowns for pie chart - source_breakdowns = report.source_breakdowns.all() - source_chart_data = { - "labels": [s.source_name for s in source_breakdowns] or ["No Data"], - "data": [float(s.percentage) for s in source_breakdowns] or [100], - } - - # Get department breakdowns - department_breakdowns = report.department_breakdowns.all() - - # Get location breakdowns - location_breakdowns = report.location_breakdowns.all() - - # Prepare trend chart data - ensure we have 12 values - trend_data_values = [] - for m in monthly_data: - if m: - trend_data_values.append(float(m.percentage)) - else: - trend_data_values.append(0.0) - - trend_chart_data = { - "labels": ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], - "data": trend_data_values, - "target": float(report.target_percentage) if report.target_percentage else 95.0, - "threshold": float(report.threshold_percentage) if report.threshold_percentage else 90.0, - } - - context = { - "report": report, - "monthly_data": monthly_data, - "total_data": total_data, - "source_breakdowns": source_breakdowns, - "department_breakdowns": department_breakdowns, - "location_breakdowns": location_breakdowns, - "source_chart_data_json": json.dumps(source_chart_data), - "trend_chart_data_json": json.dumps(trend_chart_data), - "is_pdf": True, - } - - return render(request, "analytics/kpi_report_pdf.html", context) + response = HttpResponse(pdf_bytes, content_type="application/pdf") + filename = f"KPI_{report.kpi_id}_{report.year}_{report.month:02d}.pdf" + response["Content-Disposition"] = f'attachment; filename="{filename}"' + return response @login_required diff --git a/apps/analytics/management/commands/send_px_digest.py b/apps/analytics/management/commands/send_px_digest.py index d176db8..dd319d2 100644 --- a/apps/analytics/management/commands/send_px_digest.py +++ b/apps/analytics/management/commands/send_px_digest.py @@ -123,7 +123,7 @@ class Command(BaseCommand): "early_warnings": early_warnings, "recommendations": recommendations, "dashboard_url": f"{getattr(settings, 'SITE_URL', '')}/analytics/dashboard/", - "command_center_url": f"{getattr(settings, 'SITE_URL', '')}/analytics/command-center/", + "command_center_url": f"{getattr(settings, 'SITE_URL', '')}/", } html_content = render_to_string("emails/px_digest_weekly.html", context) diff --git a/apps/analytics/tasks_digest.py b/apps/analytics/tasks_digest.py index 8013b68..38f1b72 100644 --- a/apps/analytics/tasks_digest.py +++ b/apps/analytics/tasks_digest.py @@ -128,7 +128,7 @@ def _send_digest(task, period="weekly", days=7): "early_warnings": early_warnings, "recommendations": recommendations, "dashboard_url": f"{getattr(settings, 'SITE_URL', '')}/analytics/dashboard/", - "command_center_url": f"{getattr(settings, 'SITE_URL', '')}/analytics/command-center/", + "command_center_url": f"{getattr(settings, 'SITE_URL', '')}/", } html_content = render_to_string("emails/px_digest_weekly.html", context) diff --git a/apps/analytics/ui_views.py b/apps/analytics/ui_views.py index ab9f7a4..fd2bce2 100644 --- a/apps/analytics/ui_views.py +++ b/apps/analytics/ui_views.py @@ -7,8 +7,7 @@ from datetime import datetime from django.contrib.auth.decorators import login_required from django.core.cache import cache from django.core.paginator import Paginator -from django.db.models import Avg, Count, F, Q, Value -from django.db.models.functions import Concat +from django.db.models import Avg, Count, F, Q from django.http import JsonResponse from django.shortcuts import render @@ -16,10 +15,8 @@ from apps.complaints.models import Complaint from apps.organizations.models import Department, Hospital from apps.px_action_center.models import PXAction from apps.surveys.models import SurveyInstance -from apps.physicians.models import PhysicianMonthlyRating -from .models import KPI, KPIValue -from .services import UnifiedAnalyticsService, ExportService +from .models import KPI from .services.ai_analytics import ( ExecutiveSummaryGenerator, EarlyWarningSystem, @@ -923,498 +920,3 @@ def kpi_list(request): } return render(request, "analytics/kpi_list.html", context) - - -@block_source_user -@login_required -def command_center(request): - """ - PX Command Center - Unified Dashboard - - Comprehensive dashboard showing all PX360 metrics: - - Complaints, Surveys, Actions KPIs - - Interactive charts with ApexCharts - - Department and Physician rankings - - Export to Excel/PDF - """ - user = request.user - - # Get filter parameters - filters = { - "date_range": request.GET.get("date_range", "30d"), - "hospital": request.GET.get("hospital", ""), - "department": request.GET.get("department", ""), - "kpi_category": request.GET.get("kpi_category", ""), - "custom_start": request.GET.get("custom_start", ""), - "custom_end": request.GET.get("custom_end", ""), - } - - # Get hospitals for filter - hospitals = Hospital.objects.filter(status="active") - if not user.is_px_admin() and user.hospital: - hospitals = hospitals.filter(id=user.hospital.id) - - # Get departments for filter - departments = Department.objects.filter(status="active") - if filters.get("hospital"): - departments = departments.filter(hospital_id=filters["hospital"]) - elif not user.is_px_admin() and user.hospital: - departments = departments.filter(hospital=user.hospital) - - # Get initial KPIs - custom_start = None - custom_end = None - if filters["custom_start"] and filters["custom_end"]: - custom_start = datetime.strptime(filters["custom_start"], "%Y-%m-%d") - custom_end = datetime.strptime(filters["custom_end"], "%Y-%m-%d") - - kpis = UnifiedAnalyticsService.get_all_kpis( - user=user, - date_range=filters["date_range"], - hospital_id=filters["hospital"] if filters["hospital"] else None, - department_id=filters["department"] if filters["department"] else None, - custom_start=custom_start, - custom_end=custom_end, - ) - - # Initial AI data for server-side render - from .services.ai_analytics import ( - ExecutiveSummaryGenerator, - EarlyWarningSystem, - ComplaintVolumeForecaster, - SLABreachPredictor, - ActionRecommendationEngine, - ) - - hospital_id = filters["hospital"] if filters["hospital"] else None - department_id = filters["department"] if filters["department"] else None - - if not hospital_id and (user.is_px_admin() or user.is_executive()): - tenant = getattr(request, "tenant_hospital", None) - if not tenant: - tenant = getattr(user, "hospital", None) - if tenant: - hospital_id = str(tenant.id) - - # Trigger async refresh - from .tasks import generate_executive_summary_task, generate_action_recommendations_task - - generate_executive_summary_task.delay( - user_id=str(user.id), hospital_id=hospital_id, department_id=department_id, period=filters["date_range"] - ) - generate_action_recommendations_task.delay( - user_id=str(user.id), hospital_id=hospital_id, department_id=department_id - ) - - # Read AI analytics from cache ONLY (never block request with LLM calls) - exec_summary = cache.get(ExecutiveSummaryGenerator._cache_key(hospital_id, department_id, filters["date_range"])) - if not exec_summary: - exec_summary = { - "summary_en": "Executive summary is being computed in the background...", - "summary_ar": "جاري حساب الملخص التنفيذي في الخلفية...", - "key_findings_en": [], - "key_findings_ar": [], - "recommendations_en": [], - "recommendations_ar": [], - "risk_level": "medium", - "_data": {}, - } - - early_warnings = cache.get(EarlyWarningSystem._cache_key(hospital_id, 5)) - if early_warnings is None: - early_warnings = [] - - complaint_forecast = cache.get(ComplaintVolumeForecaster._cache_key(hospital_id, 30)) - if not complaint_forecast: - complaint_forecast = ComplaintVolumeForecaster._insufficient_data_response(30) - - sla_breach_predictions = cache.get(SLABreachPredictor._cache_key(hospital_id, 10)) - if sla_breach_predictions is None: - sla_breach_predictions = [] - - action_recommendations = cache.get(ActionRecommendationEngine._cache_key(hospital_id, department_id, 5)) - if not action_recommendations: - action_recommendations = ActionRecommendationEngine._no_data_response() - - context = { - "filters": filters, - "departments": departments, - "kpis": kpis, - "exec_summary": exec_summary, - "early_warnings": early_warnings, - "complaint_forecast": complaint_forecast, - "sla_breach_predictions": sla_breach_predictions, - "action_recommendations": action_recommendations, - } - - return render(request, "analytics/command_center.html", context) - - -@block_source_user -@login_required -def command_center_api(request): - """ - API endpoint for Command Center data - - Returns JSON data for KPIs, charts, and tables based on filters. - Used by JavaScript to dynamically update dashboard. - """ - if request.method != "GET": - return JsonResponse({"error": "Only GET requests allowed"}, status=405) - - user = request.user - - # Get filter parameters - date_range = request.GET.get("date_range", "30d") - hospital_id = request.GET.get("hospital") - department_id = request.GET.get("department") - kpi_category = request.GET.get("kpi_category") - custom_start_str = request.GET.get("custom_start") - custom_end_str = request.GET.get("custom_end") - - # Parse custom dates - custom_start = None - custom_end = None - if custom_start_str and custom_end_str: - try: - custom_start = datetime.strptime(custom_start_str, "%Y-%m-%d") - custom_end = datetime.strptime(custom_end_str, "%Y-%m-%d") - except ValueError: - pass - - # Handle hospital_id (can be integer or UUID string) - hospital_id = hospital_id if hospital_id else None - - # Handle department_id (UUID string) - department_id = department_id if department_id else None - - if not hospital_id and (user.is_px_admin() or user.is_executive()): - tenant = getattr(request, "tenant_hospital", None) - if not tenant: - tenant = getattr(user, "hospital", None) - if tenant: - hospital_id = str(tenant.id) - - # Get KPIs - kpis = UnifiedAnalyticsService.get_all_kpis( - user=user, - date_range=date_range, - hospital_id=hospital_id, - department_id=department_id, - kpi_category=kpi_category, - custom_start=custom_start, - custom_end=custom_end, - ) - - # Ensure numeric KPIs are proper Python types for JSON serialization - numeric_kpis = [ - "total_complaints", - "open_complaints", - "overdue_complaints", - "high_severity_complaints", - "resolved_complaints", - "reopened_complaints", - "escalated_ovr_complaints", - "total_actions", - "open_actions", - "overdue_actions", - "escalated_actions", - "resolved_actions", - "total_surveys", - "negative_surveys", - "avg_survey_score", - "negative_social_mentions", - "low_call_ratings", - "total_sentiment_analyses", - ] - - for key in numeric_kpis: - if key in kpis: - value = kpis[key] - if value is None: - kpis[key] = 0.0 if key == "avg_survey_score" else 0 - elif isinstance(value, (int, float)): - # Already a number - ensure floats for specific fields - if key == "avg_survey_score": - kpis[key] = float(value) - else: - # Try to convert to number - try: - kpis[key] = float(value) - except (ValueError, TypeError): - kpis[key] = 0.0 if key == "avg_survey_score" else 0 - - # Handle nested trend data - if "complaints_trend" in kpis and isinstance(kpis["complaints_trend"], dict): - trend = kpis["complaints_trend"] - trend["current"] = int(trend.get("current", 0)) - trend["previous"] = int(trend.get("previous", 0)) - trend["percentage_change"] = float(trend.get("percentage_change", 0)) - - # Get chart data - chart_types = [ - "complaints_trend", - "complaints_by_category", - "survey_satisfaction_trend", - "survey_distribution", - "department_performance", - "physician_leaderboard", - ] - - charts = {} - for chart_type in chart_types: - charts[chart_type] = UnifiedAnalyticsService.get_chart_data( - user=user, - chart_type=chart_type, - date_range=date_range, - hospital_id=hospital_id, - department_id=department_id, - custom_start=custom_start, - custom_end=custom_end, - ) - - # Get table data - tables = {} - - # Overdue complaints table - complaints_qs = Complaint.objects.filter(is_overdue=True) - if hospital_id: - complaints_qs = complaints_qs.filter(hospital_id=hospital_id) - if department_id: - complaints_qs = complaints_qs.filter(department_id=department_id) - - # Apply role-based filtering - if not user.is_px_admin() and user.hospital: - complaints_qs = complaints_qs.filter(hospital=user.hospital) - if user.is_department_manager() and user.department: - complaints_qs = complaints_qs.filter(department=user.department) - - tables["overdue_complaints"] = list( - complaints_qs.select_related("hospital", "department", "patient", "source") - .order_by("due_at")[:20] - .values( - "id", - "title", - "severity", - "due_at", - "complaint_source_type", - hospital_name=F("hospital__name"), - department_name=F("department__name"), - patient_full_name=Concat("patient__first_name", Value(" "), "patient__last_name"), - source_name=F("source__name_en"), - assigned_to_full_name=Concat("assigned_to__first_name", Value(" "), "assigned_to__last_name"), - ) - ) - - # Physician leaderboard table - physician_data = charts.get("physician_leaderboard", {}).get("metadata", []) - tables["physician_leaderboard"] = [ - { - "physician_id": p["physician_id"], - "name": p["name"], - "specialization": p["specialization"], - "department": p["department"], - "rating": float(p["rating"]) if p["rating"] is not None else 0.0, - "surveys": int(p["surveys"]) if p["surveys"] is not None else 0, - "positive": int(p["positive"]) if p["positive"] is not None else 0, - "neutral": int(p["neutral"]) if p["neutral"] is not None else 0, - "negative": int(p["negative"]) if p["negative"] is not None else 0, - } - for p in physician_data - ] - - # ============ AI-POWERED ANALYTICS ============ - from .services.ai_analytics import ( - ExecutiveSummaryGenerator, - EarlyWarningSystem, - ComplaintVolumeForecaster, - SLABreachPredictor, - ActionRecommendationEngine, - ) - - # Trigger async Celery tasks for background refresh - from .tasks import ( - generate_executive_summary_task, - generate_action_recommendations_task, - ) - - generate_executive_summary_task.delay( - user_id=str(user.id), - hospital_id=hospital_id, - department_id=department_id, - period=date_range.replace("d", "") if date_range.endswith("d") else "30d", - ) - generate_action_recommendations_task.delay( - user_id=str(user.id), hospital_id=hospital_id, department_id=department_id - ) - - # AI features — read from cache ONLY (never block request with LLM calls) - exec_summary = cache.get(ExecutiveSummaryGenerator._cache_key(hospital_id, department_id, date_range)) - if not exec_summary: - exec_summary = { - "summary_en": "Executive summary is being computed in the background...", - "summary_ar": "جاري حساب الملخص التنفيذي في الخلفية...", - "key_findings_en": [], - "key_findings_ar": [], - "recommendations_en": [], - "recommendations_ar": [], - "risk_level": "medium", - "_data": {}, - } - - early_warnings = cache.get(EarlyWarningSystem._cache_key(hospital_id, 5)) - if early_warnings is None: - early_warnings = [] - - complaint_forecast = cache.get(ComplaintVolumeForecaster._cache_key(hospital_id, 30)) - if not complaint_forecast: - complaint_forecast = ComplaintVolumeForecaster._insufficient_data_response(30) - - sla_breach_predictions = cache.get(SLABreachPredictor._cache_key(hospital_id, 10)) - if sla_breach_predictions is None: - sla_breach_predictions = [] - - action_recommendations = cache.get(ActionRecommendationEngine._cache_key(hospital_id, department_id, 5)) - if not action_recommendations: - action_recommendations = ActionRecommendationEngine._no_data_response() - - ai_data = { - "executive_summary": exec_summary, - "early_warnings": early_warnings, - "complaint_forecast": complaint_forecast, - "sla_breach_predictions": sla_breach_predictions, - "action_recommendations": action_recommendations, - } - - return JsonResponse({"kpis": kpis, "charts": charts, "tables": tables, "ai": ai_data}) - - -@block_source_user -@login_required -def export_command_center(request, export_format): - """ - Export Command Center data to Excel or PDF - - Args: - export_format: 'excel' or 'pdf' - - Returns: - HttpResponse with file download - """ - if export_format not in ["excel", "pdf"]: - return JsonResponse({"error": "Invalid export format"}, status=400) - - user = request.user - - # Get filter parameters - date_range = request.GET.get("date_range", "30d") - hospital_id = request.GET.get("hospital") - department_id = request.GET.get("department") - kpi_category = request.GET.get("kpi_category") - custom_start_str = request.GET.get("custom_start") - custom_end_str = request.GET.get("custom_end") - - # Parse custom dates - custom_start = None - custom_end = None - if custom_start_str and custom_end_str: - try: - custom_start = datetime.strptime(custom_start_str, "%Y-%m-%d") - custom_end = datetime.strptime(custom_end_str, "%Y-%m-%d") - except ValueError: - pass - - # Handle hospital_id and department_id (can be integer or UUID string) - hospital_id = hospital_id if hospital_id else None - department_id = department_id if department_id else None - - # Get all data - kpis = UnifiedAnalyticsService.get_all_kpis( - user=user, - date_range=date_range, - hospital_id=hospital_id, - department_id=department_id, - kpi_category=kpi_category, - custom_start=custom_start, - custom_end=custom_end, - ) - - chart_types = [ - "complaints_trend", - "complaints_by_category", - "survey_satisfaction_trend", - "survey_distribution", - "department_performance", - "physician_leaderboard", - ] - - charts = {} - for chart_type in chart_types: - charts[chart_type] = UnifiedAnalyticsService.get_chart_data( - user=user, - chart_type=chart_type, - date_range=date_range, - hospital_id=hospital_id, - department_id=department_id, - custom_start=custom_start, - custom_end=custom_end, - ) - - # Get table data - tables = {} - - # Overdue complaints - complaints_qs = Complaint.objects.filter(is_overdue=True) - if hospital_id: - complaints_qs = complaints_qs.filter(hospital_id=hospital_id) - if department_id: - complaints_qs = complaints_qs.filter(department_id=department_id) - - if not user.is_px_admin() and user.hospital: - complaints_qs = complaints_qs.filter(hospital=user.hospital) - if user.is_department_manager() and user.department: - complaints_qs = complaints_qs.filter(department=user.department) - - tables["overdue_complaints"] = { - "headers": ["ID", "Title", "Patient", "Severity", "Hospital", "Department", "Due Date"], - "rows": list( - complaints_qs.select_related("hospital", "department", "patient") - .order_by("due_at")[:100] - .annotate( - patient_full_name=Concat("patient__first_name", Value(" "), "patient__last_name"), - hospital_name=F("hospital__name"), - department_name=F("department__name"), - ) - .values_list("id", "title", "patient_full_name", "severity", "hospital_name", "department_name", "due_at") - ), - } - - # Physician leaderboard - physician_data = charts.get("physician_leaderboard", {}).get("metadata", []) - tables["physician_leaderboard"] = { - "headers": ["Name", "Specialization", "Department", "Rating", "Surveys", "Positive", "Neutral", "Negative"], - "rows": [ - [ - p["name"], - p["specialization"], - p["department"], - str(p["rating"]), - str(p["surveys"]), - str(p["positive"]), - str(p["neutral"]), - str(p["negative"]), - ] - for p in physician_data - ], - } - - # Prepare export data - export_data = ExportService.prepare_dashboard_data(user=user, kpis=kpis, charts=charts, tables=tables) - - # Export based on format - if export_format == "excel": - return ExportService.export_to_excel(export_data) - elif export_format == "pdf": - return ExportService.export_to_pdf(export_data) - - return JsonResponse({"error": "Export failed"}, status=500) diff --git a/apps/analytics/urls.py b/apps/analytics/urls.py index dfb5aaa..b00f497 100644 --- a/apps/analytics/urls.py +++ b/apps/analytics/urls.py @@ -1,4 +1,5 @@ -from django.urls import path +from django.urls import path, reverse_lazy +from django.views.generic import RedirectView from . import ui_views, kpi_views, ask_views app_name = 'analytics' @@ -9,10 +10,8 @@ urlpatterns = [ path('kpis/', ui_views.kpi_list, name='kpi_list'), path('ask-your-data/', ask_views.ask_your_data, name='ask_your_data'), - # Command Center - Unified Dashboard - path('command-center/', ui_views.command_center, name='command_center'), - path('api/command-center/', ui_views.command_center_api, name='command_center_api'), - path('api/command-center/export//', ui_views.export_command_center, name='command_center_export'), + # Command Center now lives at the dashboard app (homepage). Redirect old links. + path('command-center/', RedirectView.as_view(url=reverse_lazy('dashboard:command-center'), permanent=False), name='command_center'), # AI Analytics API path('api/ai-analytics/refresh/', ui_views.refresh_ai_analytics, name='refresh_ai_analytics'), diff --git a/apps/appreciation/ui_views.py b/apps/appreciation/ui_views.py index 211c434..dde9080 100644 --- a/apps/appreciation/ui_views.py +++ b/apps/appreciation/ui_views.py @@ -117,6 +117,16 @@ def appreciation_detail(request, pk): categories = AppreciationCategory.objects.filter(is_active=True).order_by("order", "name_en") + # Users + departments for the shared "Send to Department" modal + send_to_users = User.objects.filter(is_active=True) + hospital_departments = [] + if appreciation.hospital: + send_to_users = send_to_users.filter(hospital=appreciation.hospital) + hospital_departments = Department.objects.filter( + hospital=appreciation.hospital, status="active" + ).order_by("name") + send_to_users = send_to_users.select_related("department").order_by("first_name", "last_name") + from django.contrib.contenttypes.models import ContentType appreciation_ct = ContentType.objects.get_for_model(appreciation) generic_notes = appreciation.notes.select_related("created_by").all() @@ -127,6 +137,8 @@ def appreciation_detail(request, pk): "staff_list": staff_queryset, "departments": departments, "categories": categories, + "send_to_users": send_to_users, + "hospital_departments": hospital_departments, "can_activate": appreciation.status == AppreciationStatus.DRAFT, "can_send": appreciation.status in (AppreciationStatus.ACTIVATED, AppreciationStatus.AI_ANALYZED), "is_recipient": False, @@ -292,6 +304,186 @@ def appreciation_send(request, pk): return redirect("appreciation:appreciation_detail", pk=pk) +@login_required +@require_http_methods(["POST"]) +def appreciation_send_to(request, pk): + """Unified AJAX endpoint to send an appreciation to a person or department. + + Mirrors the inquiry/complaint send-to flow used by the shared modal + (components/send_to_modal.html). Requires the appreciation to be activated + first; advances it to SENT on success. + """ + appreciation = get_object_or_404(Appreciation, pk=pk) + user = request.user + + # Permission + if not ( + user.is_px_admin() or user.is_hospital_admin() + or user.is_department_manager() + or user.is_px_management() or user.is_px_employee() + ): + return JsonResponse( + {"success": False, "error": str(_("You don't have permission to send this appreciation."))}, + status=403, + ) + + # Must be activated before it can be sent + if appreciation.status not in (AppreciationStatus.ACTIVATED, AppreciationStatus.AI_ANALYZED): + return JsonResponse( + {"success": False, "error": str(_("Activate this appreciation before sending it to a department."))}, + status=400, + ) + + recipient_type = request.POST.get("recipient_type", "department") + note = request.POST.get("note", "").strip() + email_subject = request.POST.get("email_subject", "").strip() + email_body = request.POST.get("email_body", "").strip() + + try: + from apps.notifications.services import NotificationService, get_email_header_html + + if recipient_type == "person": + person_id = request.POST.get("person_id") + if not person_id: + return JsonResponse( + {"success": False, "error": str(_("Please select a person."))}, status=400 + ) + try: + person = User.objects.get(id=person_id) + except User.DoesNotExist: + return JsonResponse( + {"success": False, "error": str(_("User not found."))}, status=400 + ) + + if person.email: + send_subject = email_subject or f"Appreciation Shared - {appreciation.reference_number}" + send_body = email_body or ( + f"An appreciation ({appreciation.reference_number}) has been shared with you." + ) + NotificationService.send_email( + email=person.email, + subject=send_subject, + message=send_body, + html_message=f""" +
+ {get_email_header_html()} +
+

Appreciation Shared With You

+

An appreciation #{appreciation.reference_number} has been shared with you.

+

Message: {appreciation.message_en or 'N/A'}

+ {f'

Note: {note}

' if note else ''} +

View Appreciation

+
+
+ """, + related_object=appreciation, + ) + message = f"Appreciation sent to {person.get_full_name()}." + + else: # department + department_id = request.POST.get("department_id") + if not department_id: + return JsonResponse( + {"success": False, "error": str(_("Please select a department."))}, status=400 + ) + try: + department = Department.objects.get(id=department_id, status="active") + except Department.DoesNotExist: + return JsonResponse( + {"success": False, "error": str(_("Department not found."))}, status=400 + ) + + # Auto-target the department's champion and manager (no contact-person picker) + from apps.organizations.department_contacts import get_champion_and_manager + + targets = get_champion_and_manager(department) + if not targets: + return JsonResponse( + {"success": False, + "error": str(_(f"Cannot send to {department.get_localized_name()}. This department has no champion or manager assigned. Please assign one before sending."))}, + status=400, + ) + + # Route to the chosen department + appreciation.department = department + appreciation.send_to_department = True + if note: + appreciation.custom_message = note + + # Notify champion + manager (email + SMS) + notified = [] + link = f"https://{request.get_host()}/appreciation/detail/{appreciation.pk}/" + for target in targets: + display_name = ( + target["staff"].get_full_name() if target.get("staff") + else (target["user"].get_full_name() if target.get("user") else target["label"]) + ) + if target.get("email"): + send_subject = email_subject or f"Appreciation Sent to Department - {appreciation.reference_number}" + send_body = email_body or ( + f"Appreciation #{appreciation.reference_number} has been sent to your department ({department.name})." + ) + NotificationService.send_email( + email=target["email"], + subject=send_subject, + message=send_body + f"\n\n{link}", + html_message=f""" +
+ {get_email_header_html()} +
+

Appreciation Sent to Department

+

Appreciation #{appreciation.reference_number} has been sent to your department ({department.name}).

+

Message: {appreciation.message_en or 'N/A'}

+ {f'

Note: {note}

' if note else ''} +

Role: {target['label']}

+

View Appreciation

+
+
+ """, + related_object=appreciation, + ) + if target.get("phone"): + try: + NotificationService.send_sms( + target["phone"], + f"PX360: Appreciation #{appreciation.reference_number} sent to {department.name}. {link}", + related_object=appreciation, + ) + except Exception: + pass + notified.append(f"{display_name} ({target['label']})") + message = f"Appreciation sent to {department.name} — {', '.join(notified)}." + + # Advance to SENT (validates status is ACTIVATED/AI_ANALYZED) + appreciation.send() + + StaffActivityService.log_from_request( + request, + activity_type="send", + description=f"Sent appreciation {appreciation.pk} to {recipient_type}", + content_object=appreciation, + module="appreciation", + ) + AuditService.log_event( + event_type="appreciation_sent", + description=f"Appreciation {appreciation.pk} sent to {recipient_type}", + user=user, + content_object=appreciation, + metadata={"recipient_type": recipient_type}, + ) + + return JsonResponse({"success": True, "message": message}) + + except Exception as e: + import logging + + logging.getLogger(__name__).error(f"Error in appreciation_send_to: {e}") + return JsonResponse( + {"success": False, "error": str(_("An error occurred while sending the appreciation."))}, + status=500, + ) + + # ============================================================================ # ACKNOWLEDGE # ============================================================================ @@ -1086,3 +1278,13 @@ def public_appreciation_submit(request): except Exception as e: logger.exception("ERROR in public_appreciation_submit") return JsonResponse({"success": False, "message": str(e)}, status=500) + +@login_required +def appreciation_pdf(request, pk): + from apps.core.pdf_utils import generate_letterhead_pdf + obj = get_object_or_404(Appreciation, id=pk) + return generate_letterhead_pdf( + 'appreciation/appreciation_pdf.html', + {'object': obj}, + f'appreciation_{obj.reference_number}.pdf', + ) diff --git a/apps/appreciation/urls.py b/apps/appreciation/urls.py index e5f25aa..258e15b 100644 --- a/apps/appreciation/urls.py +++ b/apps/appreciation/urls.py @@ -34,6 +34,7 @@ urlpatterns = [ path('detail//', ui_views.appreciation_detail, name='appreciation_detail'), path('detail//activate/', ui_views.appreciation_activate, name='appreciation_activate'), path('detail//send/', ui_views.appreciation_send, name='appreciation_send'), + path('detail//send-to/', ui_views.appreciation_send_to, name='appreciation_send_to'), path('acknowledge//', ui_views.appreciation_acknowledge, name='appreciation_acknowledge'), path('leaderboard/', ui_views.leaderboard_view, name='leaderboard_view'), path('badges/', ui_views.my_badges_view, name='my_badges_view'), @@ -62,4 +63,5 @@ urlpatterns = [ # Public submission (no auth required) path('public/submit/', ui_views.public_appreciation_submit, name='public_appreciation_submit'), + path('detail//pdf/', ui_views.appreciation_pdf, name='appreciation_pdf'), ] diff --git a/apps/complaints/management/commands/backfill_complaint_sources.py b/apps/complaints/management/commands/backfill_complaint_sources.py new file mode 100644 index 0000000..5cbbc35 --- /dev/null +++ b/apps/complaints/management/commands/backfill_complaint_sources.py @@ -0,0 +1,213 @@ +""" +Backfill source (PXSource FK) for complaints that were imported without one. + +Handles two import batches: +1. historical_excel_2022: metadata.source contains the Arabic source value +2. 2025_excel: metadata has no source — re-reads the Excel file to extract it + +Usage: + # Preview what would change + python manage.py backfill_complaint_sources --dry-run + + # Execute the backfill + python manage.py backfill_complaint_sources + + # Only process one batch + python manage.py backfill_complaint_sources --batch=historical_excel_2022 + python manage.py backfill_complaint_sources --batch=2025_excel +""" + +import logging + +from django.core.management.base import BaseCommand +from django.db import transaction + +from apps.complaints.models import Complaint +from apps.complaints.management.commands.complaint_source_mapping import ( + resolve_px_source, + get_complaint_source_type, +) + +logger = logging.getLogger(__name__) + +EXCEL_2025_PATH = "data/Complaints Report - 2025.xlsx" + +# Header aliases for 2025 Excel column detection +HEADER_ALIASES_2025 = { + "complaint_num": ["رقم الشكوى"], + "source": ["جهة الشكوى"], +} + + +class Command(BaseCommand): + help = "Backfill PXSource for complaints imported without one." + + def add_arguments(self, parser): + parser.add_argument("--dry-run", action="store_true", help="Preview without saving") + parser.add_argument( + "--batch", + choices=["historical_excel_2022", "2025_excel"], + default=None, + help="Only process a specific import batch", + ) + parser.add_argument( + "--excel-file", + default=EXCEL_2025_PATH, + help=f"Path to 2025 Excel file (default: {EXCEL_2025_PATH})", + ) + + def handle(self, *args, **options): + self.dry_run = options["dry_run"] + self.excel_file = options["excel_file"] + batch_filter = options["batch"] + + stats = {"total": 0, "updated": 0, "unmapped": 0, "no_source_value": 0, "skipped_2026": 0} + + no_source_qs = Complaint.objects.filter(source__isnull=True) + + if batch_filter: + no_source_qs = no_source_qs.filter(metadata__import_source=batch_filter) + + self.stdout.write(f"\nFound {no_source_qs.count()} complaints with no source.") + if self.dry_run: + self.stdout.write(self.style.WARNING("DRY RUN — no changes will be saved.\n")) + + # Build 2025 Excel lookup if needed + excel_lookup = {} + needs_excel = not batch_filter or batch_filter == "2025_excel" + if needs_excel: + self.stdout.write("Reading 2025 Excel for source column...") + excel_lookup = self._build_2025_excel_lookup() + self.stdout.write(f" Built lookup with {len(excel_lookup)} entries.\n") + + for complaint in no_source_qs.iterator(): + stats["total"] += 1 + + # Skip 2026 test data + if complaint.created_at.year == 2026: + stats["skipped_2026"] += 1 + continue + + import_source = complaint.metadata.get("import_source", "") + source_value = None + + if import_source == "historical_excel_2022": + source_value = complaint.metadata.get("source") + + elif import_source == "2025_excel": + complaint_num = complaint.metadata.get("complaint_num") + original_sheet = complaint.metadata.get("original_sheet", "") + lookup_key = (complaint_num, original_sheet) + source_value = excel_lookup.get(lookup_key) + + else: + # Unknown import source — try metadata.source as fallback + source_value = complaint.metadata.get("source") + + if not source_value: + stats["no_source_value"] += 1 + continue + + px_source = resolve_px_source(source_value) + + if px_source is None: + stats["unmapped"] += 1 + self.stdout.write( + self.style.WARNING( + f" UNMAPPED: Ref={complaint.reference_number} source_value=\"{source_value}\"" + ) + ) + continue + + if not self.dry_run: + with transaction.atomic(): + complaint.source = px_source + complaint.complaint_source_type = get_complaint_source_type(px_source) + complaint.save(update_fields=["source", "complaint_source_type"]) + + # Store source in metadata for 2025_excel if missing + if import_source == "2025_excel" and "source" not in complaint.metadata: + complaint.metadata["source"] = source_value + complaint.save(update_fields=["metadata"]) + + stats["updated"] += 1 + + self._print_report(stats) + + def _build_2025_excel_lookup(self): + """Read all sheets from 2025 Excel and build (complaint_num, sheet) → source_value map.""" + import openpyxl + + try: + wb = openpyxl.load_workbook(self.excel_file, read_only=True, data_only=True) + except FileNotFoundError: + self.stdout.write(self.style.ERROR(f"Excel file not found: {self.excel_file}")) + return {} + + lookup = {} + + for sheet_name in wb.sheetnames: + if sheet_name == "DropDown": + continue + + ws = wb[sheet_name] + col_map = self._detect_columns(ws) + + if "complaint_num" not in col_map or "source" not in col_map: + self.stdout.write(self.style.WARNING(f" Sheet '{sheet_name}': could not detect columns, skipping")) + continue + + complaint_col = col_map["complaint_num"] + source_col = col_map["source"] + + for row in ws.iter_rows(min_row=3, values_only=True): + comp_num = row[complaint_col - 1] if complaint_col - 1 < len(row) else None + source_val = row[source_col - 1] if source_col - 1 < len(row) else None + + if comp_num and source_val: + normalized_source = str(source_val).strip() + if normalized_source and not normalized_source.replace(".", "", 1).isdigit(): + lookup[(comp_num, sheet_name)] = normalized_source + + wb.close() + return lookup + + def _detect_columns(self, ws): + """Scan first 10 rows to find header row and map columns.""" + mapping = {} + for r in range(1, 11): + row_values = {} + for c in range(1, 80): + val = ws.cell(r, c).value + if val: + if val not in row_values: + row_values[val] = c + + if "رقم الشكوى" in row_values: + for field, aliases in HEADER_ALIASES_2025.items(): + for alias in aliases: + if alias in row_values: + mapping[field] = row_values[alias] + break + break + + return mapping + + def _print_report(self, stats): + self.stdout.write(f"\n{'=' * 60}") + self.stdout.write(self.style.SUCCESS("Backfill Report")) + self.stdout.write(f"{'=' * 60}") + self.stdout.write(f"Total complaints scanned: {stats['total']}") + self.stdout.write(f"Updated: {stats['updated']}") + self.stdout.write(f"Unmapped source value: {stats['unmapped']}") + self.stdout.write(f"No source value found: {stats['no_source_value']}") + self.stdout.write(f"Skipped (2026 test data): {stats['skipped_2026']}") + + if stats["updated"] > 0: + if self.dry_run: + self.stdout.write(self.style.WARNING("\nDry run complete — no changes saved.")) + else: + self.stdout.write(self.style.SUCCESS(f"\nSuccessfully updated {stats['updated']} complaints.")) + + if stats["unmapped"] > 0: + self.stdout.write(self.style.WARNING(f"\n{stats['unmapped']} complaints had source values that could not be mapped.")) diff --git a/apps/complaints/management/commands/complaint_source_mapping.py b/apps/complaints/management/commands/complaint_source_mapping.py index f6fe566..125cd7a 100644 --- a/apps/complaints/management/commands/complaint_source_mapping.py +++ b/apps/complaints/management/commands/complaint_source_mapping.py @@ -14,9 +14,9 @@ SOURCE_CODE_MAP = { "المراجع": "PATIENT", "ذوي المراجع": "FAMILY", "مجلس الضمان الصحي": "CHI", + "شركة تأمين": "INSURANCE", # English / code sources "moh": "MOH", - "cchi": "CCHI", "chi": "CHI", "patients": "PATIENT", "patient": "PATIENT", @@ -30,8 +30,7 @@ SOURCE_CODE_MAP = { "social media": "SOCIAL-MEDIA", "social-media": "SOCIAL-MEDIA", "public form": "PUBL-FORM", - "insurance company": None, - "شركة تأمين": None, + "insurance company": "INSURANCE", } @@ -70,13 +69,13 @@ def resolve_px_source(source_value: str) -> "PXSource | None": return None -EXTERNAL_SOURCE_CODES = {"MOH", "CCHI", "CHI"} +EXTERNAL_SOURCE_CODES = {"MOH", "CHI", "INSURANCE"} def get_complaint_source_type(px_source) -> str: """ Determine complaint_source_type based on PXSource. - Only MOH/CHI/CCHI are external; everything else is internal. + Only MOH/CHI/INSURANCE are external; everything else is internal. """ if px_source and px_source.code in EXTERNAL_SOURCE_CODES: return "external" diff --git a/apps/complaints/management/commands/dedup_historical_complaints.py b/apps/complaints/management/commands/dedup_historical_complaints.py new file mode 100644 index 0000000..b929438 --- /dev/null +++ b/apps/complaints/management/commands/dedup_historical_complaints.py @@ -0,0 +1,205 @@ +""" +Deduplicate historical complaints created by repeated Excel imports. + +The importers (import_historical_complaints / import_2025_complaints_basic) +build reference numbers of the form ``CMP-YYYY-MM-NNNN``. When re-run, the +existing dedup logic appended letter suffixes (-A, -B, ... -H) instead of +skipping, producing duplicate rows with byte-identical content. + +A wrinkle: the same ``complaint_num`` (column 3) is occasionally reused across +genuinely distinct complaints, so a single base reference (e.g. +``CMP-2025-10-5112``) can map to several different complaints that were each +re-imported. To handle this safely, dedup is done by +**base reference + content signature**: + + 1. Group every complaint (base + suffixed) by its stripped base ref. + 2. Within each group, cluster by (title, description, created_at). + 3. In each cluster, keep ONE representative - preferring the no-suffix base + if it is in that cluster, else the lowest-suffix copy. + 4. Delete the rest. ComplaintUpdate rows on the deleted copies are removed + too (they are re-import artifacts). + +Usage: + # Dry run (default) - no writes + python manage.py dedup_historical_complaints + python manage.py dedup_historical_complaints --year 2025 + python manage.py dedup_historical_complaints --hospital-code HH-N + + # Actually delete (requires explicit --confirm) + python manage.py dedup_historical_complaints --confirm +""" + +import re + +from django.core.management.base import BaseCommand +from django.db import transaction + +from apps.complaints.models import Complaint, ComplaintUpdate +from apps.organizations.models import Hospital + +# Anchored pattern: CMP-YYYY-MM-NNNN optionally followed by a single uppercase +# letter suffix. Base refs always end in 4 digits, so the suffixed branch is +# never matched on a legitimate base. +REF_RE = re.compile(r"^(?PCMP-\d{4}-\d{2}-\d{4})(?:-(?P[A-Z]))?$") + + +def _content_signature(c): + return (c.title or "", c.description or "", c.created_at) + + +def _rank(c): + """Lower rank = preferred keeper. No-suffix base ranks first (0), then -A (1), -B (2)...""" + m = REF_RE.match(c.reference_number or "") + suffix = m.group("suffix") if m and m.group("suffix") else "" + return (0 if suffix == "" else ord(suffix), str(c.id)) + + +class Command(BaseCommand): + help = "Deduplicate historical complaints that were re-imported with letter suffixes" + + def add_arguments(self, parser): + parser.add_argument("--year", type=int, help="Scope to a single year (e.g. 2025)") + parser.add_argument( + "--hospital-code", + type=str, + default="HH-N", + help="Hospital code to scope (default: HH-N)", + ) + parser.add_argument( + "--confirm", + action="store_true", + help="Actually perform the deletion. Without it, the command only reports.", + ) + + def handle(self, *args, **options): + year = options.get("year") + hospital_code = options["hospital_code"] + confirm = options["confirm"] + + # Validate hospital (but don't hard-fail if it doesn't exist; just don't filter) + hospital = None + try: + hospital = Hospital.objects.get(code=hospital_code) + except Hospital.DoesNotExist: + self.stdout.write(self.style.WARNING( + f"Hospital code '{hospital_code}' not found - running across all hospitals." + )) + + qs = Complaint.objects.all() + if hospital: + qs = qs.filter(hospital=hospital) + if year: + qs = qs.filter(created_at__year=year) + + # Pull every complaint whose reference matches the base-or-suffixed pattern, + # plus group them by their stripped base ref. We include the no-suffix base + # itself so that content-collision groups are handled correctly. + all_rows = list( + qs.only("id", "reference_number", "created_at", "title", "description") + .filter(reference_number__regex=r"^CMP-\d{4}-\d{2}-\d{4}(?:-[A-Z])?$") + ) + + from collections import defaultdict + + by_base = defaultdict(list) + for c in all_rows: + m = REF_RE.match(c.reference_number or "") + if not m: + continue + by_base[m.group("base")].append(c) + + candidate_suffixed = 0 + for c in all_rows: + m = REF_RE.match(c.reference_number or "") + if m and m.group("suffix"): + candidate_suffixed += 1 + + self.stdout.write(self.style.SUCCESS("=" * 70)) + if confirm: + self.stdout.write(self.style.SUCCESS("DEDUP - CONFIRM MODE (deletions will run)")) + else: + self.stdout.write(self.style.SUCCESS("DEDUP - DRY RUN (no writes)")) + self.stdout.write(self.style.SUCCESS("=" * 70)) + scope = f"hospital={hospital_code}" + (f", year={year}" if year else ", all years") + self.stdout.write(f"Scope: {scope}") + self.stdout.write(f"Complaints matching reference pattern: {len(all_rows)}") + self.stdout.write(f" of which suffixed (-A/-B/...): {candidate_suffixed}") + self.stdout.write(f"Distinct base refs: {len(by_base)}") + self.stdout.write("") + + # Content-aware clustering: within each base group, cluster by content. + # Keep one representative per cluster, delete the rest. + to_delete_ids = [] + true_unique = 0 + pure_dup_groups = 0 # base refs whose rows are all identical content + collision_groups = 0 # base refs with >1 distinct content + per_year_deleted = {} + collisions_detail = [] + + for base_ref, items in by_base.items(): + clusters = defaultdict(list) + for c in items: + clusters[_content_signature(c)].append(c) + + if len(clusters) == 1: + pure_dup_groups += 1 + else: + collision_groups += 1 + collisions_detail.append((base_ref, len(items), len(clusters))) + + for _sig, members in clusters.items(): + true_unique += 1 + members_sorted = sorted(members, key=_rank) + for v in members_sorted[1:]: + y = v.created_at.year if v.created_at else 0 + per_year_deleted[y] = per_year_deleted.get(y, 0) + 1 + to_delete_ids.append(v.id) + + # Count updates attached to the to-be-deleted complaints + updates_to_delete_ids = list( + ComplaintUpdate.objects.filter( + complaint_id__in=to_delete_ids + ).values_list("id", flat=True) + ) if to_delete_ids else [] + + # Report + self.stdout.write(self.style.SUCCESS("Plan summary")) + self.stdout.write("-" * 70) + self.stdout.write(f"Base refs - pure re-import dups: {pure_dup_groups}") + self.stdout.write(f"Base refs - content collisions (>1 text): {collision_groups}") + self.stdout.write(f"TRUE unique complaints to keep: {true_unique}") + self.stdout.write(f"Duplicate complaints to delete: {len(to_delete_ids)}") + self.stdout.write(f"ComplaintUpdate rows to delete: {len(updates_to_delete_ids)}") + self.stdout.write("") + self.stdout.write("Per-year complaints to delete:") + for y in sorted(per_year_deleted): + self.stdout.write(f" {y}: {per_year_deleted[y]}") + + if collision_groups: + self.stdout.write("") + self.stdout.write(self.style.WARNING( + f"{collision_groups} base refs contain >1 distinct complaint " + f"(reference collision). One copy of EACH distinct text is kept." + )) + for base_ref, n_rows, n_clusters in collisions_detail[:15]: + self.stdout.write(f" {base_ref}: {n_rows} rows -> {n_clusters} distinct complaints kept") + + if not confirm: + self.stdout.write("") + self.stdout.write(self.style.WARNING("DRY RUN - no changes made. Re-run with --confirm to delete.")) + return + + # Execute + self.stdout.write("") + self.stdout.write(self.style.SUCCESS("Executing deletion in a single transaction...")) + with transaction.atomic(): + deleted_updates, _ = ComplaintUpdate.objects.filter( + id__in=updates_to_delete_ids + ).delete() + deleted_complaints, _ = Complaint.objects.filter( + id__in=to_delete_ids + ).delete() + + self.stdout.write(self.style.SUCCESS("Done.")) + self.stdout.write(f"Deleted ComplaintUpdate rows: {deleted_updates}") + self.stdout.write(f"Deleted Complaint rows: {deleted_complaints}") diff --git a/apps/complaints/management/commands/import_2025_complaints_basic.py b/apps/complaints/management/commands/import_2025_complaints_basic.py index 59757da..233f655 100644 --- a/apps/complaints/management/commands/import_2025_complaints_basic.py +++ b/apps/complaints/management/commands/import_2025_complaints_basic.py @@ -298,6 +298,7 @@ class Command(BaseCommand): "import_source": "2025_excel", "original_sheet": self.sheet_name, "complaint_num": row_data.get("complaint_num"), + "source": row_data.get("source"), }, sent_to_department=bool(dept), sent_to_department_at=created_at if dept else None, diff --git a/apps/complaints/migrations/0022_complaint_primary_dept_involved_removed_and_more.py b/apps/complaints/migrations/0022_complaint_primary_dept_involved_removed_and_more.py new file mode 100644 index 0000000..6729752 --- /dev/null +++ b/apps/complaints/migrations/0022_complaint_primary_dept_involved_removed_and_more.py @@ -0,0 +1,25 @@ +# Generated by Django 6.0.1 on 2026-06-21 17:26 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('complaints', '0021_inquiry_satisfaction_inquiry_satisfaction_set_at'), + ('organizations', '0014_remove_department_manager_1st'), + ] + + operations = [ + migrations.AddField( + model_name='complaint', + name='primary_dept_involved_removed', + field=models.ForeignKey(blank=True, help_text='Tracks the primary department whose involved record the user explicitly removed; ensure_involved_records() will skip auto-recreation while this matches complaint.department.', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='complaints_primary_dept_removed', to='organizations.department'), + ), + migrations.AddField( + model_name='complaint', + name='primary_staff_involved_removed', + field=models.ForeignKey(blank=True, help_text='Tracks the primary staff whose involved record the user explicitly removed; ensure_involved_records() will skip auto-recreation while this matches complaint.staff.', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='complaints_primary_staff_removed', to='organizations.staff'), + ), + ] diff --git a/apps/complaints/migrations/0023_investigation_question_response.py b/apps/complaints/migrations/0023_investigation_question_response.py new file mode 100644 index 0000000..f059b06 --- /dev/null +++ b/apps/complaints/migrations/0023_investigation_question_response.py @@ -0,0 +1,19 @@ +# Generated by Django 6.0.1 on 2026-06-23 13:00 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('complaints', '0022_complaint_primary_dept_involved_removed_and_more'), + ] + + operations = [ + migrations.AddField( + model_name='investigationquestion', + name='response', + field=models.ForeignKey(blank=True, help_text='When set, this question is specific to this staff response (per-staff questions).', null=True, on_delete=django.db.models.deletion.CASCADE, related_name='questions', to='complaints.investigationresponse'), + ), + ] diff --git a/apps/complaints/migrations/0024_investigation_attachments.py b/apps/complaints/migrations/0024_investigation_attachments.py new file mode 100644 index 0000000..7b2a532 --- /dev/null +++ b/apps/complaints/migrations/0024_investigation_attachments.py @@ -0,0 +1,54 @@ +# Generated by Django 6.0.1 on 2026-06-25 14:57 + +import django.db.models.deletion +import uuid +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('complaints', '0023_investigation_question_response'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='InvestigationAttachment', + fields=[ + ('created_at', models.DateTimeField(auto_now_add=True, db_index=True)), + ('updated_at', models.DateTimeField(auto_now=True)), + ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), + ('file', models.FileField(upload_to='investigation_attachments/%Y/%m/%d/')), + ('filename', models.CharField(max_length=500)), + ('file_type', models.CharField(blank=True, max_length=100)), + ('file_size', models.IntegerField(help_text='File size in bytes')), + ('investigation', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='attachments', to='complaints.championinvestigation')), + ('uploaded_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='investigation_attachments', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'verbose_name': 'Investigation Attachment', + 'verbose_name_plural': 'Investigation Attachments', + 'ordering': ['-created_at'], + }, + ), + migrations.CreateModel( + name='InvestigationResponseAttachment', + fields=[ + ('created_at', models.DateTimeField(auto_now_add=True, db_index=True)), + ('updated_at', models.DateTimeField(auto_now=True)), + ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), + ('file', models.FileField(upload_to='investigation_response_attachments/%Y/%m/%d/')), + ('filename', models.CharField(max_length=500)), + ('file_type', models.CharField(blank=True, max_length=100)), + ('file_size', models.IntegerField(help_text='File size in bytes')), + ('response', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='attachments', to='complaints.investigationresponse')), + ], + options={ + 'verbose_name': 'Investigation Response Attachment', + 'verbose_name_plural': 'Investigation Response Attachments', + 'ordering': ['-created_at'], + }, + ), + ] diff --git a/apps/complaints/migrations/0025_investigation_question_type.py b/apps/complaints/migrations/0025_investigation_question_type.py new file mode 100644 index 0000000..a4286ff --- /dev/null +++ b/apps/complaints/migrations/0025_investigation_question_type.py @@ -0,0 +1,18 @@ +# Generated by Django 6.0.1 on 2026-06-27 21:37 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('complaints', '0024_investigation_attachments'), + ] + + operations = [ + migrations.AddField( + model_name='investigationquestion', + name='question_type', + field=models.CharField(choices=[('text', 'Text'), ('yes_no', 'Yes/No')], default='text', max_length=10), + ), + ] diff --git a/apps/complaints/migrations/0026_champion_investigation_otp.py b/apps/complaints/migrations/0026_champion_investigation_otp.py new file mode 100644 index 0000000..976d427 --- /dev/null +++ b/apps/complaints/migrations/0026_champion_investigation_otp.py @@ -0,0 +1,23 @@ +# Generated by Django 6.0.1 on 2026-06-27 22:09 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('complaints', '0025_investigation_question_type'), + ] + + operations = [ + migrations.AddField( + model_name='championinvestigation', + name='otp_code', + field=models.CharField(blank=True, default='', max_length=10), + ), + migrations.AddField( + model_name='championinvestigation', + name='otp_sent_at', + field=models.DateTimeField(blank=True, null=True), + ), + ] diff --git a/apps/complaints/migrations/0027_investigation_findings.py b/apps/complaints/migrations/0027_investigation_findings.py new file mode 100644 index 0000000..24e88dd --- /dev/null +++ b/apps/complaints/migrations/0027_investigation_findings.py @@ -0,0 +1,33 @@ +# Generated by Django 6.0.1 on 2026-06-28 09:32 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('complaints', '0026_champion_investigation_otp'), + ] + + operations = [ + migrations.AddField( + model_name='championinvestigation', + name='improvement_project_note', + field=models.TextField(blank=True, default=''), + ), + migrations.AddField( + model_name='championinvestigation', + name='negligence_finding', + field=models.CharField(blank=True, default='', max_length=3), + ), + migrations.AddField( + model_name='championinvestigation', + name='policy_issue_finding', + field=models.CharField(blank=True, default='', max_length=3), + ), + migrations.AddField( + model_name='championinvestigation', + name='requires_improvement_project', + field=models.CharField(blank=True, default='', max_length=3), + ), + ] diff --git a/apps/complaints/migrations/0028_complaint_satisfaction_lock.py b/apps/complaints/migrations/0028_complaint_satisfaction_lock.py new file mode 100644 index 0000000..e82831a --- /dev/null +++ b/apps/complaints/migrations/0028_complaint_satisfaction_lock.py @@ -0,0 +1,23 @@ +# Generated by Django 6.0.1 on 2026-06-29 11:13 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('complaints', '0027_investigation_findings'), + ] + + operations = [ + migrations.AddField( + model_name='complaint', + name='satisfaction_locked_at', + field=models.DateTimeField(blank=True, null=True), + ), + migrations.AddField( + model_name='complaint', + name='satisfaction_locked_by_patient', + field=models.BooleanField(db_index=True, default=False), + ), + ] diff --git a/apps/complaints/migrations/0029_investigationstatus_direct_reply.py b/apps/complaints/migrations/0029_investigationstatus_direct_reply.py new file mode 100644 index 0000000..31bdc9d --- /dev/null +++ b/apps/complaints/migrations/0029_investigationstatus_direct_reply.py @@ -0,0 +1,18 @@ +# Generated by Django 6.0.1 on 2026-06-30 08:22 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('complaints', '0028_complaint_satisfaction_lock'), + ] + + operations = [ + migrations.AlterField( + model_name='championinvestigation', + name='status', + field=models.CharField(choices=[('questions_sent', 'Questions Sent'), ('answers_received', 'Answers Received'), ('reply_submitted', 'Reply Submitted'), ('direct_reply_in_progress', 'Direct Reply In Progress')], default='questions_sent', max_length=30), + ), + ] diff --git a/apps/complaints/models.py b/apps/complaints/models.py index 23419d8..a825b95 100644 --- a/apps/complaints/models.py +++ b/apps/complaints/models.py @@ -272,6 +272,24 @@ class Complaint(UUIDModel, TimeStampedModel, SoftDeleteModel): staff = models.ForeignKey( "organizations.Staff", on_delete=models.SET_NULL, null=True, blank=True, related_name="complaints" ) + primary_dept_involved_removed = models.ForeignKey( + "organizations.Department", + on_delete=models.SET_NULL, + null=True, + blank=True, + related_name="complaints_primary_dept_removed", + help_text="Tracks the primary department whose involved record the user explicitly removed; " + "ensure_involved_records() will skip auto-recreation while this matches complaint.department.", + ) + primary_staff_involved_removed = models.ForeignKey( + "organizations.Staff", + on_delete=models.SET_NULL, + null=True, + blank=True, + related_name="complaints_primary_staff_removed", + help_text="Tracks the primary staff whose involved record the user explicitly removed; " + "ensure_involved_records() will skip auto-recreation while this matches complaint.staff.", + ) location_type = models.CharField( max_length=20, choices=LocationType.choices, @@ -571,6 +589,12 @@ class Complaint(UUIDModel, TimeStampedModel, SoftDeleteModel): ) satisfaction_set_at = models.DateTimeField(null=True, blank=True, help_text="When satisfaction was last set") + # Patient lock — once the patient submits satisfaction via the public tracking + # page, the value becomes authoritative and can no longer be edited by anyone + # (neither patient nor PX-team). + satisfaction_locked_by_patient = models.BooleanField(default=False, db_index=True) + satisfaction_locked_at = models.DateTimeField(null=True, blank=True) + # External references moh_reference = models.CharField(max_length=100, blank=True, help_text="Ministry of Health reference number") moh_reference_date = models.DateField(null=True, blank=True, help_text="MOH reference date") @@ -3761,6 +3785,7 @@ class InvestigationStatus(models.TextChoices): QUESTIONS_SENT = "questions_sent", "Questions Sent" ANSWERS_RECEIVED = "answers_received", "Answers Received" REPLY_SUBMITTED = "reply_submitted", "Reply Submitted" + DIRECT_REPLY_IN_PROGRESS = "direct_reply_in_progress", "Direct Reply In Progress" class ChampionInvestigation(UUIDModel, TimeStampedModel): @@ -3791,11 +3816,17 @@ class ChampionInvestigation(UUIDModel, TimeStampedModel): related_name="investigation", ) status = models.CharField( - max_length=20, + max_length=30, choices=InvestigationStatus.choices, default=InvestigationStatus.QUESTIONS_SENT, ) final_reply = models.TextField(blank=True) + otp_code = models.CharField(max_length=10, blank=True, default="") + otp_sent_at = models.DateTimeField(null=True, blank=True) + negligence_finding = models.CharField(max_length=3, blank=True, default="") + policy_issue_finding = models.CharField(max_length=3, blank=True, default="") + requires_improvement_project = models.CharField(max_length=3, blank=True, default="") + improvement_project_note = models.TextField(blank=True, default="") class Meta: verbose_name = "Champion Investigation" @@ -3816,7 +3847,20 @@ class InvestigationQuestion(UUIDModel, TimeStampedModel): on_delete=models.CASCADE, related_name="questions", ) + response = models.ForeignKey( + "InvestigationResponse", + on_delete=models.CASCADE, + null=True, + blank=True, + related_name="questions", + help_text="When set, this question is specific to this staff response (per-staff questions).", + ) question_text = models.TextField() + question_type = models.CharField( + max_length=10, + choices=[("text", "Text"), ("yes_no", "Yes/No")], + default="text", + ) order = models.PositiveIntegerField(default=0) class Meta: @@ -3873,3 +3917,57 @@ class InvestigationAnswer(UUIDModel, TimeStampedModel): def __str__(self): return f"A: {self.answer_text[:80]}" + + +class InvestigationAttachment(UUIDModel, TimeStampedModel): + """Context document attached by the champion when composing investigation questions.""" + + investigation = models.ForeignKey( + ChampionInvestigation, + on_delete=models.CASCADE, + related_name="attachments", + ) + + file = models.FileField(upload_to="investigation_attachments/%Y/%m/%d/") + filename = models.CharField(max_length=500) + file_type = models.CharField(max_length=100, blank=True) + file_size = models.IntegerField(help_text="File size in bytes") + + uploaded_by = models.ForeignKey( + "accounts.User", + on_delete=models.SET_NULL, + null=True, + blank=True, + related_name="investigation_attachments", + ) + + class Meta: + ordering = ["-created_at"] + verbose_name = "Investigation Attachment" + verbose_name_plural = "Investigation Attachments" + + def __str__(self): + return f"{self.investigation} - {self.filename}" + + +class InvestigationResponseAttachment(UUIDModel, TimeStampedModel): + """File attached by a staff member when submitting their investigation response.""" + + response = models.ForeignKey( + InvestigationResponse, + on_delete=models.CASCADE, + related_name="attachments", + ) + + file = models.FileField(upload_to="investigation_response_attachments/%Y/%m/%d/") + filename = models.CharField(max_length=500) + file_type = models.CharField(max_length=100, blank=True) + file_size = models.IntegerField(help_text="File size in bytes") + + class Meta: + ordering = ["-created_at"] + verbose_name = "Investigation Response Attachment" + verbose_name_plural = "Investigation Response Attachments" + + def __str__(self): + return f"{self.response} - {self.filename}" diff --git a/apps/complaints/services/complaint_service.py b/apps/complaints/services/complaint_service.py index 535c87e..30dc049 100644 --- a/apps/complaints/services/complaint_service.py +++ b/apps/complaints/services/complaint_service.py @@ -980,24 +980,25 @@ This is an automated message from PX360 Complaint Management System.""" @staticmethod def ensure_involved_records(complaint): - """Ensure the complaint's primary department and staff exist as involved records. + """Ensure the complaint's primary staff exists as an involved record. Called lazily from the complaint detail view. Uses get_or_create so it's idempotent — only creates records that don't exist yet. + + Note: Department involvement is NOT auto-created. The AI suggestion lives + on complaint.department itself; the user must explicitly confirm it via + the "Confirm" button in the Departments tab (confirm_ai_department_suggestion + view) or add a different department via the "Add" button. This prevents + AI guesses (often "Patient Experience" for vague complaints) from silently + becoming the primary involved department. + + Skips recreation when the user has explicitly removed the primary staff + involvement (tracked via primary_staff_involved_removed). If complaint.staff + later changes to a different record, auto-recreation resumes. """ - from apps.complaints.models import ComplaintInvolvedDepartment, ComplaintInvolvedStaff + from apps.complaints.models import ComplaintInvolvedStaff - if complaint.department_id: - ComplaintInvolvedDepartment.objects.get_or_create( - complaint=complaint, - department=complaint.department, - defaults={ - "role": "primary", - "is_primary": True, - }, - ) - - if complaint.staff_id: + if complaint.staff_id and complaint.primary_staff_involved_removed_id != complaint.staff_id: ComplaintInvolvedStaff.objects.get_or_create( complaint=complaint, staff=complaint.staff, diff --git a/apps/complaints/signals.py b/apps/complaints/signals.py index 0ba0d4d..cbe5769 100644 --- a/apps/complaints/signals.py +++ b/apps/complaints/signals.py @@ -1,18 +1,19 @@ """ -Complaint signals - Automatic SMS notifications on status changes +Complaint signals. -This module handles automatic SMS notifications to complainants when: -1. Complaint is created (confirmation) -2. Complaint status changes to resolved or closed -3. Auto-sync department from staff when staff is assigned +Heavy notification work (SMS/email to complainants and champions) has been moved +off these signals into Celery tasks (see ``apps.complaints.tasks``) so it never +blocks the request. The signals below now just dispatch those tasks. + +The pre_save department-sync and the ComplaintUpdate logging remain inline +(they are cheap, in-process work). """ import logging -from django.db.models.signals import pre_save, post_save +from django.db.models.signals import post_save, pre_save from django.dispatch import receiver -from django.contrib.sites.shortcuts import get_current_site -from .models import Complaint, ComplaintUpdate, ComplaintInvolvedDepartment +from .models import Complaint, ComplaintInvolvedDepartment, ComplaintUpdate logger = logging.getLogger(__name__) @@ -21,12 +22,11 @@ logger = logging.getLogger(__name__) def sync_department_from_staff(sender, instance, **kwargs): """ Automatically set complaint.department from staff.department when staff is assigned. - - This ensures the department is always in sync with the assigned staff member, - regardless of how the complaint is saved (API, admin, forms, etc.). + + Ensures the department stays in sync with the assigned staff member regardless + of how the complaint is saved (API, admin, forms, etc.). """ if instance.staff: - # If staff is assigned, set department from staff's department staff_department = instance.staff.department if staff_department and instance.department_id != staff_department.id: instance.department = staff_department @@ -35,200 +35,66 @@ def sync_department_from_staff(sender, instance, **kwargs): f"from staff '{instance.staff.name}'" ) elif instance.pk: - # If staff is being removed (set to None), check if we should clear department - # Only clear if the department was originally from a staff member - # We keep the department if it was manually set + # Staff being removed (set to None); department kept as-is. pass @receiver(post_save, sender=Complaint) def send_complaint_creation_sms(sender, instance, created, **kwargs): - """ - Send SMS notification when complaint is created. - - Only sends for public complaints (those with contact_phone). - """ + """Dispatch the complaint-received SMS task when a complaint is created.""" if not created: return - - # Only send SMS if phone number is provided if not instance.contact_phone: logger.info(f"Complaint #{instance.id} created but no phone number provided. Skipping SMS.") return - - # Send SMS notification try: - from apps.notifications.services import NotificationService - - # Get tracking URL - tracking_url = instance.get_tracking_url() - - # Bilingual SMS messages - messages = { - 'en': f"PX360: Your complaint #{instance.reference_number} has been received. Track: {tracking_url}", - 'ar': f"PX360: تم استلام شكوتك #{instance.reference_number}. تتبع الشكوى: {tracking_url}" - } - - # Default to English (can be enhanced to detect language) - sms_message = messages['en'] - - # Send SMS - notification_log = NotificationService.send_sms( - phone=instance.contact_phone, - message=sms_message, - related_object=instance, - metadata={ - 'notification_type': 'complaint_created', - 'reference_number': instance.reference_number, - 'tracking_url': tracking_url, - 'language': 'en' # Default to English - } - ) - - logger.info(f"Creation SMS sent to {instance.contact_phone} for complaint #{instance.id}") - - # Create complaint update to track SMS - ComplaintUpdate.objects.create( - complaint=instance, - update_type='communication', - message=f"SMS notification sent to complainant: Your complaint has been received", - metadata={ - 'notification_type': 'complaint_created', - 'notification_log_id': str(notification_log.id) if notification_log else None - } - ) - + from .tasks import send_complaint_creation_sms_task + + send_complaint_creation_sms_task.delay(str(instance.id)) except Exception as e: # Log error but don't fail the complaint save - logger.error(f"Failed to send creation SMS for complaint #{instance.id}: {str(e)}") + logger.error(f"Failed to dispatch creation SMS for complaint #{instance.id}: {e}") @receiver(post_save, sender=Complaint) def send_complaint_status_change_sms(sender, instance, created, **kwargs): - """ - Send SMS notification when complaint status changes to resolved or closed. - - Uses update_fields to detect actual status changes (not just re-saves). - """ - # Skip on creation (handled by creation signal) + """Dispatch SMS/email when a complaint status changes to resolved or closed.""" + # Skip on creation (handled by the creation signal) if created: return - - # Check if this is a status change to resolved or closed - # Use update_fields to detect actual status changes - if not hasattr(instance, '_status_was'): + + # Detect an actual status change using the in-memory previous-status set in Complaint.save() + if not hasattr(instance, "_status_was"): return - + old_status = instance._status_was new_status = instance.status - - # Only send SMS for resolved or closed status changes - if new_status not in ['resolved', 'closed']: + + if new_status not in ("resolved", "closed"): return - - # Only send if status actually changed if old_status == new_status: return - - # Only send if phone or email is provided if not instance.contact_phone and not instance.contact_email: - logger.info(f"Complaint #{instance.id} status changed to {new_status} but no contact info. Skipping notification.") - return - - # Send SMS + email notification - try: - from apps.notifications.services import NotificationService, get_email_header_html - from apps.core.utils import build_public_track_url - - track_url = build_public_track_url("complaint", instance.reference_number) - - status_label = "resolved" if new_status == "resolved" else "closed" - sms_message = f"PX360: Your complaint #{instance.reference_number} has been {status_label}. View response: {track_url}" - - if instance.contact_phone: - notification_log = NotificationService.send_sms( - phone=instance.contact_phone, - message=sms_message, - related_object=instance, - metadata={ - 'notification_type': 'complaint_status_change', - 'reference_number': instance.reference_number, - 'old_status': old_status, - 'new_status': new_status, - 'language': 'en' - } - ) - - logger.info(f"Status change SMS sent to {instance.contact_phone} for complaint #{instance.id}: {old_status} -> {new_status}") - - if instance.contact_email: - email_subject = f"PX360: Your complaint #{instance.reference_number} has been {status_label}" - email_body = ( - f"Dear Valued Patient,\n\n" - f"Your complaint #{instance.reference_number} has been {status_label}.\n\n" - f"To view the full response, please visit:\n{track_url}\n\n" - f"Thank you for your feedback.\n\n" - f"Reference: {instance.reference_number}\n" - f"This is an automated message from PX 360." - ) - NotificationService.send_email( - email=instance.contact_email, - subject=email_subject, - message=email_body, - html_message=f""" -
- {get_email_header_html()} -
-

Complaint Update: {status_label.title()}

-

Dear Valued Patient,

-

Your complaint #{instance.reference_number} has been {status_label}.

-

To view the full response, please click the link below:

- -

Reference: {instance.reference_number}

-
-
-""", - related_object=instance, - metadata={ - 'notification_type': 'complaint_status_change_email', - 'reference_number': instance.reference_number, - } - ) - logger.info(f"Status change email sent to {instance.contact_email} for complaint #{instance.id}") - - ComplaintUpdate.objects.create( - complaint=instance, - update_type='communication', - message=f"Notification sent to complainant: Status changed to {new_status} (SMS: {bool(instance.contact_phone)}, Email: {bool(instance.contact_email)})", - metadata={ - 'notification_type': 'complaint_status_change', - 'old_status': old_status, - 'new_status': new_status, - } + logger.info( + f"Complaint #{instance.id} status changed to {new_status} but no contact info. Skipping notification." ) - + return + + try: + from .tasks import send_complaint_status_change_task + + send_complaint_status_change_task.delay(str(instance.id), old_status, new_status) except Exception as e: # Log error but don't fail the complaint save - logger.error(f"Failed to send status change SMS for complaint #{instance.id}: {str(e)}") + logger.error(f"Failed to dispatch status change notification for complaint #{instance.id}: {e}") -# Hook into ComplaintUpdate to track SMS sent manually via API @receiver(post_save, sender=ComplaintUpdate) def track_manual_sms(sender, instance, created, **kwargs): - """ - Track manually sent SMS notifications. - - This ensures that SMS sent via API endpoints (like send_resolution_notification) - are also properly tracked. - """ + """Track manually sent SMS notifications recorded as ComplaintUpdate rows.""" if not created: return - - # Check if this update was for a communication/notification - if instance.update_type == 'communication': - # Log tracking info + if instance.update_type == "communication": logger.info( f"Manual communication update created for complaint #{instance.complaint.id}: " f"{instance.message[:50]}..." @@ -237,18 +103,16 @@ def track_manual_sms(sender, instance, created, **kwargs): @receiver(post_save, sender=ComplaintInvolvedDepartment) def notify_champion_on_department_assignment(sender, instance, created, **kwargs): - """ - Send email notification to department champion when a complaint is assigned to their department. - """ + """Dispatch the champion-notification email when a complaint is sent to a department.""" if not created: return - - # Only notify when this department is actually being sent to (not just added to involvement list) + # Only notify when this department is actually being sent to (not just added) if not instance.sent: return - - # Only notify if the department has a respondent (champion) with email - if not instance.department.champion or not instance.department.champion.user or not instance.department.champion.user.email: + # Only notify if the department champion has a user with an email + champion = instance.department.champion + champion_user = champion.user if champion else None + if not champion_user or not champion_user.email: logger.info( f"ComplaintInvolvedDepartment #{instance.id}: No respondent email configured for department " f"'{instance.department.name}'. Skipping notification." @@ -256,63 +120,8 @@ def notify_champion_on_department_assignment(sender, instance, created, **kwargs return try: - from apps.notifications.services import NotificationService, get_email_header_html - from django.contrib.sites.models import Site - - champion = instance.department.champion.user - complaint = instance.complaint - department = instance.department - - # Build response URL - current_site = Site.objects.get_current() - domain = current_site.domain if current_site else "px360.tenhal.sa" - department_url = f"https://{domain}/organizations/departments/{department.pk}/" - - # Send email - NotificationService.send_email( - recipient=champion.email, - subject=f"New Complaint Assigned - {complaint.reference_number}", - message=f"""A new complaint has been assigned to your department ({department.name}). - -Complaint Reference: {complaint.reference_number} -Title: {complaint.title or 'No title'} -Patient: {complaint.patient_name if hasattr(complaint, 'patient_name') else 'N/A'} - -Please review and respond through your department page: -{department_url} - -Best regards, -PX360 Team""", - html_message=f""" -
- {get_email_header_html()} -
-

New Complaint Assigned

-

A new complaint has been assigned to your department {department.name}.

-
-

Reference: {complaint.reference_number}

-

Title: {complaint.title or 'No title'}

-

Patient: {complaint.patient_name if hasattr(complaint, 'patient_name') else 'N/A'}

-
-

Please review and respond through your department page:

- View Department Page -

Best regards,
PX360 Team

-
-
- """, - related_object=complaint, - metadata={ - 'notification_type': 'complaint_department_assigned', - 'complaint_id': str(complaint.id), - 'department_id': str(department.id), - 'champion_email': champion.email, - } - ) - - logger.info( - f"Notification sent to champion {champion.email} for complaint " - f"#{complaint.reference_number} assigned to department {department.name}" - ) + from .tasks import notify_champion_on_dept_assignment_task + notify_champion_on_dept_assignment_task.delay(str(instance.id)) except Exception as e: - logger.error(f"Failed to send champion notification for ComplaintInvolvedDepartment #{instance.id}: {str(e)}") \ No newline at end of file + logger.error(f"Failed to dispatch champion notification for ComplaintInvolvedDepartment #{instance.id}: {e}") diff --git a/apps/complaints/tasks.py b/apps/complaints/tasks.py index 8a0c6ef..8e53a75 100644 --- a/apps/complaints/tasks.py +++ b/apps/complaints/tasks.py @@ -3798,3 +3798,249 @@ def send_inquiry_dept_response_reminders(): "first_reminder_count": first_reminder_count, "second_reminder_count": second_reminder_count, } + + +# ─── Patient linking (backgrounded to avoid blocking submit on slow HIS) ─── + + +@shared_task +def link_complaint_patient(complaint_id, national_id=None, phone=None): + """Background patient linking for a complaint (local DB first, then HIS). + + Replaces the synchronous ``find_or_link_patient`` call that used to block the + public/internal complaint submit when the HIS endpoint is slow or unreachable. + Idempotent: only fills the patient if it is still empty. + """ + from apps.complaints.models import Complaint + from apps.organizations.patient_lookup import find_or_link_patient + + complaint = Complaint.objects.filter(pk=complaint_id).select_related("hospital").first() + if not complaint or complaint.patient_id: + return + patient = find_or_link_patient(national_id=national_id, phone=phone, hospital=complaint.hospital) + if patient: + Complaint.objects.filter(pk=complaint_id, patient__isnull=True).update(patient=patient) + + +@shared_task +def link_inquiry_patient(inquiry_id, phone=None): + """Background patient linking for an inquiry (local DB first, then HIS). Idempotent.""" + from apps.complaints.models import Inquiry + from apps.organizations.patient_lookup import find_or_link_patient + + inquiry = Inquiry.objects.filter(pk=inquiry_id).select_related("hospital").first() + if not inquiry or inquiry.patient_id: + return + patient = find_or_link_patient(phone=phone, hospital=inquiry.hospital) + if patient: + Inquiry.objects.filter(pk=inquiry_id, patient__isnull=True).update(patient=patient) + + +# ─── Notification tasks (moved off the synchronous post_save signals) ─── + + +@shared_task +def send_complaint_creation_sms_task(complaint_id): + """Send the complaint-received SMS (backgrounded from send_complaint_creation_sms).""" + from apps.complaints.models import Complaint, ComplaintUpdate + from apps.notifications.services import NotificationService + + instance = Complaint.objects.filter(pk=complaint_id).first() + if not instance or not instance.contact_phone: + return + try: + tracking_url = instance.get_tracking_url() + sms_message = ( + f"PX360: Your complaint #{instance.reference_number} has been received. " + f"Track: {tracking_url}" + ) + notification_log = NotificationService.send_sms( + phone=instance.contact_phone, + message=sms_message, + related_object=instance, + metadata={ + "notification_type": "complaint_created", + "reference_number": instance.reference_number, + "tracking_url": tracking_url, + "language": "en", + }, + ) + logger.info(f"Creation SMS sent to {instance.contact_phone} for complaint #{instance.id}") + ComplaintUpdate.objects.create( + complaint=instance, + update_type="communication", + message="SMS notification sent to complainant: Your complaint has been received", + metadata={ + "notification_type": "complaint_created", + "notification_log_id": str(notification_log.id) if notification_log else None, + }, + ) + except Exception as e: + logger.error(f"Failed to send creation SMS for complaint #{instance.id}: {e}") + + +@shared_task +def send_complaint_status_change_task(complaint_id, old_status, new_status): + """Send SMS + email when a complaint moves to resolved/closed (off the signal).""" + from apps.complaints.models import Complaint, ComplaintUpdate + from apps.core.utils import build_public_track_url + from apps.notifications.services import NotificationService, get_email_header_html + + instance = Complaint.objects.filter(pk=complaint_id).first() + if not instance: + return + if new_status not in ("resolved", "closed"): + return + if old_status == new_status: + return + if not instance.contact_phone and not instance.contact_email: + return + try: + track_url = build_public_track_url("complaint", instance.reference_number) + status_label = "resolved" if new_status == "resolved" else "closed" + sms_message = ( + f"PX360: Your complaint #{instance.reference_number} has been {status_label}. " + f"View response: {track_url}" + ) + if instance.contact_phone: + NotificationService.send_sms( + phone=instance.contact_phone, + message=sms_message, + related_object=instance, + metadata={ + "notification_type": "complaint_status_change", + "reference_number": instance.reference_number, + "old_status": old_status, + "new_status": new_status, + "language": "en", + }, + ) + logger.info(f"Status change SMS sent for complaint #{instance.id}: {old_status} -> {new_status}") + if instance.contact_email: + email_subject = f"PX360: Your complaint #{instance.reference_number} has been {status_label}" + email_body = ( + f"Dear Valued Patient,\n\n" + f"Your complaint #{instance.reference_number} has been {status_label}.\n\n" + f"To view the full response, please visit:\n{track_url}\n\n" + f"Thank you for your feedback.\n\n" + f"Reference: {instance.reference_number}\n" + f"This is an automated message from PX 360." + ) + NotificationService.send_email( + email=instance.contact_email, + subject=email_subject, + message=email_body, + html_message=f""" +
+ {get_email_header_html()} +
+

Complaint Update: {status_label.title()}

+

Dear Valued Patient,

+

Your complaint #{instance.reference_number} has been {status_label}.

+

To view the full response, please click the link below:

+ +

Reference: {instance.reference_number}

+
+
+""", + related_object=instance, + metadata={ + "notification_type": "complaint_status_change_email", + "reference_number": instance.reference_number, + }, + ) + logger.info(f"Status change email sent to {instance.contact_email} for complaint #{instance.id}") + + ComplaintUpdate.objects.create( + complaint=instance, + update_type="communication", + message=( + f"Notification sent to complainant: Status changed to {new_status} " + f"(SMS: {bool(instance.contact_phone)}, Email: {bool(instance.contact_email)})" + ), + metadata={ + "notification_type": "complaint_status_change", + "old_status": old_status, + "new_status": new_status, + }, + ) + except Exception as e: + logger.error(f"Failed to send status change notification for complaint #{instance.id}: {e}") + + +@shared_task +def notify_champion_on_dept_assignment_task(involved_department_id): + """Email the department champion when a complaint is sent to their department (off the signal).""" + from django.contrib.sites.models import Site + + from apps.complaints.models import ComplaintInvolvedDepartment + from apps.notifications.services import NotificationService, get_email_header_html + + instance = ( + ComplaintInvolvedDepartment.objects.select_related("department__champion__user", "complaint") + .filter(pk=involved_department_id) + .first() + ) + if not instance: + return + if not instance.sent: + return + champion = instance.department.champion + champion_user = champion.user if champion else None + if not champion_user or not champion_user.email: + return + + try: + complaint = instance.complaint + department = instance.department + current_site = Site.objects.get_current() + domain = current_site.domain if current_site else "px360.tenhal.sa" + department_url = f"https://{domain}/organizations/departments/{department.pk}/" + + NotificationService.send_email( + recipient=champion_user.email, + subject=f"New Complaint Assigned - {complaint.reference_number}", + message=f"""A new complaint has been assigned to your department ({department.name}). + +Complaint Reference: {complaint.reference_number} +Title: {complaint.title or 'No title'} +Patient: {complaint.patient_name if hasattr(complaint, 'patient_name') else 'N/A'} + +Please review and respond through your department page: +{department_url} + +Best regards, +PX360 Team""", + html_message=f""" +
+ {get_email_header_html()} +
+

New Complaint Assigned

+

A new complaint has been assigned to your department {department.name}.

+
+

Reference: {complaint.reference_number}

+

Title: {complaint.title or 'No title'}

+

Patient: {complaint.patient_name if hasattr(complaint, 'patient_name') else 'N/A'}

+
+

Please review and respond through your department page:

+ View Department Page +

Best regards,
PX360 Team

+
+
+ """, + related_object=complaint, + metadata={ + "notification_type": "complaint_department_assigned", + "complaint_id": str(complaint.id), + "department_id": str(department.id), + "champion_email": champion_user.email, + }, + ) + logger.info( + f"Notification sent to champion {champion_user.email} for complaint " + f"#{complaint.reference_number} assigned to department {department.name}" + ) + except Exception as e: + logger.error(f"Failed to send champion notification for ComplaintInvolvedDepartment #{instance.id}: {e}") diff --git a/apps/complaints/ui_views.py b/apps/complaints/ui_views.py index b04ec7f..321b64c 100644 --- a/apps/complaints/ui_views.py +++ b/apps/complaints/ui_views.py @@ -4,6 +4,8 @@ Complaints UI views - Server-rendered templates for complaints console import logging +from .workflow_log import build_workflow_log + from django.contrib import messages from django.contrib.auth.decorators import login_required from django.core.paginator import Paginator @@ -461,7 +463,10 @@ def complaint_list(request): hospitals = hospitals.filter(id=user.hospital.id) departments = Department.objects.filter(status="active") - if not user.is_px_admin() and user.hospital: + if user.is_px_admin(): + if selected_hospital: + departments = departments.filter(hospital=selected_hospital) + elif user.hospital: departments = departments.filter(hospital=user.hospital) # Get assignable users @@ -704,12 +709,31 @@ def complaint_detail(request, pk): or user.is_px_employee() ), "is_active_status": complaint.is_active_status, + "workflow_steps": { + "activated": complaint.activated_at is not None, + "sent_to_department": complaint.sent_to_department or complaint.forwarded_to_dept_at is not None, + "department_responded": ( + complaint.explanations.filter(is_used=True).exists() + or complaint.involved_departments.filter(response_submitted=True).exists() + ), + "resolved": complaint.status in ("resolved", "closed"), + "cancelled": complaint.status == "cancelled", + }, + "can_collect_feedback": bool( + complaint.department + and complaint.is_active_status + and ( + (complaint.department.champion_id and complaint.department.champion.user_id == user.id) + or complaint.department.manager_id == user.id + ) + ), "ai_department_suggested": ( bool(complaint.department) and not complaint.involved_departments.filter(department=complaint.department).exists() ), "hospital_departments": hospital_departments, "involved_department_form": ComplaintInvolvedDepartmentForm(complaint=complaint, user=user), + "workflow_log": build_workflow_log(complaint), "involved_staff_form": ComplaintInvolvedStaffForm(complaint=complaint, user=user), "explanation": explanation, "explanations": explanations, @@ -758,7 +782,9 @@ def complaint_detail(request, pk): context["notes"] = complaint.notes.select_related("created_by").all() context["notes_count"] = context["notes"].count() - return render(request, "complaints/complaint_detail.html", context) + # Datastar variant for testing: /complaints//?ds=1 renders complaint_detail_ds.html + template = "complaints/complaint_detail_ds.html" if request.GET.get("ds") else "complaints/complaint_detail.html" + return render(request, template, context) @login_required @@ -874,6 +900,15 @@ def complaint_create(request): complaint.save() reference_number = complaint.reference_number + # Background patient linking (local DB first, then HIS) — avoids blocking the + # submit when HIS is slow/unreachable. + if not complaint.patient_id: + from .tasks import link_complaint_patient + + link_complaint_patient.delay( + str(complaint.id), complaint.national_id, complaint.contact_phone + ) + comm_req_id = request.POST.get("comm_req") if comm_req_id: try: @@ -935,6 +970,53 @@ def complaint_create(request): return render(request, "complaints/complaint_form.html", context) +@login_required +@require_http_methods(["POST"]) +def collect_feedback_start(request, pk): + """Authenticated entry to 'Collect Feedback' for the dept champion or manager. + + Bootstraps a ComplaintExplanation token for the acting user and redirects to + the compose page (same one the emailed token link opens), reusing the per-staff + question flow. + """ + import secrets + from .models import ComplaintExplanation + + complaint = get_object_or_404(Complaint.objects.select_related("department"), pk=pk) + dept = complaint.department + user = request.user + + if not dept: + messages.error(request, _("This complaint has no department assigned.")) + return redirect("complaints:complaint_detail", pk=pk) + + # Permission: department champion or manager only + is_champion = bool(dept.champion_id) and dept.champion.user_id == user.id + is_manager = dept.manager_id == user.id + if not (is_champion or is_manager): + messages.error(request, _("Only the department champion or manager can collect feedback.")) + return redirect("complaints:complaint_detail", pk=pk) + + # Resolve the Staff to attach the explanation to + staff = dept.champion if is_champion else getattr(dept.manager, "staff_profile", None) or dept.champion + if staff is None: + messages.error(request, _("No staff profile available to collect feedback.")) + return redirect("complaints:complaint_detail", pk=pk) + + token = secrets.token_urlsafe(32) + ComplaintExplanation.objects.update_or_create( + complaint=complaint, + staff=staff, + defaults={ + "token": token, + "is_used": False, + "requested_by": user, + "submitted_via": "direct", + }, + ) + return redirect("complaints:champion_start_investigation", complaint_id=complaint.id, token=token) + + @login_required @require_http_methods(["POST"]) def complaint_send_to(request, pk): @@ -1028,28 +1110,17 @@ def complaint_send_to(request, pk): "error": str(_("Department not found.")), }, status=400) - if not department.champion and not department.manager: + # Auto-target the department's champion and manager (no contact-person picker) + from apps.organizations.department_contacts import get_champion_and_manager + import secrets + + targets = get_champion_and_manager(department) + if not targets: return JsonResponse({ "success": False, - "error": str(_(f"Cannot send to {department.get_localized_name()}. This department has no champion or manager assigned.")), + "error": str(_(f"Cannot send to {department.get_localized_name()}. This department has no champion or manager assigned. Please assign one before sending.")), }, status=400) - contact_person_id = request.POST.get("contact_person_id") - if not contact_person_id: - return JsonResponse({ - "success": False, - "error": str(_("Please select a contact person.")), - }, status=400) - - contact_info = department.is_valid_contact_person(contact_person_id) - if not contact_info: - return JsonResponse({ - "success": False, - "error": str(_("Selected person is not a role holder in this department.")), - }, status=400) - - contact_person = contact_info["staff"] - now = timezone.now() if complaint.department_id == department.pk: @@ -1082,31 +1153,105 @@ def complaint_send_to(request, pk): complaint.explanation_requested = True complaint.explanation_requested_at = complaint.explanation_requested_at or now - contact_email = contact_person.email or (contact_person.user.email if contact_person.user else None) - if complaint.department_id == department.pk and contact_email: - send_subject = email_subject or f"Complaint Sent to Department - {complaint.reference_number}" - send_body = email_body or f"Complaint #{complaint.reference_number} has been sent to your department ({department.name})." - NotificationService.send_email( - email=contact_email, - subject=send_subject, - message=send_body, - html_message=f""" -
- {get_email_header_html()} -
-

Complaint Sent to Department

-

Complaint #{complaint.reference_number} has been sent to your department ({department.name}).

-

Title: {complaint.title or 'N/A'}

- {f'

Note: {note}

' if note else ''} -

Assigned to: {contact_person.get_full_name()} ({contact_info['role_label']})

-

View Department Page

-
-
- """, - related_object=complaint, - ) + # Notify each recipient (champion + manager): token link + email + SMS + notified = [] + host = request.get_host() + for target in targets: + email = target.get("email") or "" + phone = target.get("phone") or "" + staff = target.get("staff") + tuser = target.get("user") + label = target.get("label") - message = f"Complaint sent to {department.name} — {contact_person.get_full_name()} ({contact_info['role_label']})." + # Personal no-login explanation link (token) — create for any target with a Staff profile + link = None + effective_staff = staff + if effective_staff is None and tuser is not None: + effective_staff = getattr(tuser, "staff_profile", None) + if effective_staff is not None: + token = secrets.token_urlsafe(32) + exp_obj, _ = ComplaintExplanation.objects.update_or_create( + complaint=complaint, + staff=effective_staff, + defaults={ + "token": token, + "is_used": False, + "requested_by": user, + "request_message": note, + "email_sent_at": timezone.now(), + "submitted_via": "email_link", + }, + ) + link = f"https://{host}/complaints/{complaint.id}/explain/{token}/" + + # Save PX-team attachments against this explanation + from .models import ExplanationAttachment + for f in request.FILES.getlist("px_attachments"): + ExplanationAttachment.objects.create( + explanation=exp_obj, + file=f, + filename=f.name, + file_type=f.content_type, + file_size=f.size, + ) + + display_name = ( + staff.get_full_name() if staff is not None + else (tuser.get_full_name() if tuser else label) + ) + fallback_link = f"https://{host}/complaints/{complaint.pk}/" + review_link = link or fallback_link + + if email: + send_subject = email_subject or f"Complaint Sent to Department - {complaint.reference_number}" + send_body = email_body or ( + f"Complaint #{complaint.reference_number} has been sent to your department ({department.name})." + ) + NotificationService.send_email( + email=email, + subject=send_subject, + message=send_body + f"\n\n{review_link}", + html_message=f""" +
+ {get_email_header_html()} +
+

Complaint Sent to Department

+

Complaint #{complaint.reference_number} has been sent to your department ({department.name}).

+

Title: {complaint.title or 'N/A'}

+ {f'

Note: {note}

' if note else ''} +

Role: {label}

+

Review / Respond

+
+
+ """, + related_object=complaint, + ) + if phone: + try: + NotificationService.send_sms( + phone, + f"PX360: Complaint #{complaint.reference_number} sent to {department.name}. Review: {review_link}", + related_object=complaint, + ) + except Exception: + pass + + notified.append(f"{display_name} ({label})") + + message = f"Complaint sent to {department.name} — {', '.join(notified)}." + + # Optionally record a selected staff member as involved (NOT notified; + # notification target remains champion/manager only). + staff_id = request.POST.get("staff_id", "").strip() + if staff_id: + from .models import ComplaintInvolvedStaff + staff_member = Staff.objects.filter(pk=staff_id, department=department).first() + if staff_member: + ComplaintInvolvedStaff.objects.get_or_create( + complaint=complaint, + staff=staff_member, + defaults={"added_by": user}, + ) # Set forwarded timestamp and update tracking fields if active now = timezone.now() @@ -1203,6 +1348,13 @@ def update_satisfaction(request, pk): messages.error(request, _("You don't have permission to update satisfaction.")) return redirect("complaints:complaint_detail", pk=pk) + if complaint.satisfaction_locked_by_patient: + messages.error( + request, + _("Satisfaction is locked because the patient has submitted their feedback and cannot be changed."), + ) + return redirect("complaints:complaint_detail", pk=pk) + satisfaction = request.POST.get("satisfaction", "") valid_choices = ["satisfied", "neutral", "dissatisfied", "no_response"] if satisfaction and satisfaction not in valid_choices: @@ -2692,6 +2844,12 @@ def inquiry_create(request): inquiry.save() + # Background patient linking (local DB first, then HIS). + if not inquiry.patient_id: + from .tasks import link_inquiry_patient + + link_inquiry_patient.delay(str(inquiry.id), inquiry.contact_phone) + comm_req_id = request.POST.get("comm_req") if comm_req_id: try: @@ -3583,24 +3741,15 @@ def inquiry_send_to(request, pk): "error": str(_("Department not found.")), }, status=400) - if not department.champion and not department.manager: - return JsonResponse({ - "success": False, - "error": str(_(f"Cannot send to {department.get_localized_name()}. This department has no champion or manager assigned.")), - }, status=400) + # Auto-target the department's champion and manager (no contact-person picker) + from apps.organizations.department_contacts import get_champion_and_manager + from apps.notifications.services import NotificationService - contact_person_id = request.POST.get("contact_person_id") - if not contact_person_id: + targets = get_champion_and_manager(department) + if not targets: return JsonResponse({ "success": False, - "error": str(_("Please select a contact person.")), - }, status=400) - - contact_info = department.is_valid_contact_person(contact_person_id) - if not contact_info: - return JsonResponse({ - "success": False, - "error": str(_("Selected person is not a role holder in this department.")), + "error": str(_(f"Cannot send to {department.get_localized_name()}. This department has no champion or manager assigned. Please assign one before sending.")), }, status=400) # Transfer to department @@ -3623,7 +3772,36 @@ def inquiry_send_to(request, pk): inquiry.dept_response_second_reminder_sent_at = None inquiry.dept_response_escalated_at = None - message = f"Inquiry sent to {department.get_localized_name()} — {contact_info['name']} ({contact_info['role_label']})." + # Notify champion + manager (email + SMS) with the inquiry link + notified = [] + link = f"https://{request.get_host()}/inquiries/{inquiry.pk}/" + for target in targets: + display_name = ( + target["staff"].get_full_name() if target.get("staff") + else (target["user"].get_full_name() if target.get("user") else target["label"]) + ) + if target.get("email"): + try: + NotificationService.send_email( + email=target["email"], + subject=f"Inquiry Sent to Department - {inquiry.reference_number}", + message=f"Inquiry #{inquiry.reference_number} has been sent to your department ({department.name}).\n\n{link}", + related_object=inquiry, + ) + except Exception: + pass + if target.get("phone"): + try: + NotificationService.send_sms( + target["phone"], + f"PX360: Inquiry #{inquiry.reference_number} sent to {department.name}. Review: {link}", + related_object=inquiry, + ) + except Exception: + pass + notified.append(f"{display_name} ({target['label']})") + + message = f"Inquiry sent to {department.get_localized_name()} — {', '.join(notified)}." # Set contact_status if open if inquiry.status in ("open",): @@ -3640,16 +3818,6 @@ def inquiry_send_to(request, pk): created_by=user, ) - # Send department notification if applicable - if recipient_type == "department": - try: - from apps.notifications.settings_service import NotificationServiceWithSettings - NotificationServiceWithSettings.send_inquiry_department_assigned( - department, inquiry, context_note_en=note, context_note_ar="", - ) - except Exception as e: - logger.warning(f"Failed to send department notification: {e}") - return JsonResponse({ "success": True, "message": message, @@ -3859,7 +4027,6 @@ def inquiry_review_dept_response(request, pk): related_object=inquiry, ) except Exception: - import logging logging.getLogger(__name__).exception("Failed to send inquiry dept response rejection email") InquiryUpdate.objects.create( @@ -4245,7 +4412,9 @@ def public_complaint_submit(request): # Reference number generated by Complaint.save() (unified CMP-YYYYMM-HOSP-NNNN) - # Create complaint with location hierarchy and all form fields + # Create complaint with location hierarchy and all form fields. + # Patient linking is backgrounded (local DB first, then HIS) so a slow/unreachable + # HIS never blocks the public submission. complaint = Complaint.objects.create( patient=None, hospital=hospital, @@ -4276,11 +4445,12 @@ def public_complaint_submit(request): message="Complaint submitted via public form. AI analysis running in background.", ) - # Trigger AI analysis in the background using Celery - from .tasks import analyze_complaint_with_ai, notify_staff_new_item + # Trigger AI analysis + patient linking in the background using Celery + from .tasks import analyze_complaint_with_ai, link_complaint_patient, notify_staff_new_item analyze_complaint_with_ai.delay(str(complaint.id)) notify_staff_new_item.delay("complaint", str(complaint.id)) + link_complaint_patient.delay(str(complaint.id), national_id, mobile_number) # If form was submitted via AJAX, return JSON if request.headers.get("x-requested-with") == "XMLHttpRequest": @@ -4345,10 +4515,28 @@ def public_complaint_track(request): - Show basic information (status, category, submission date, last update) - Timeline of public updates (without exposing internal notes) - SLA deadline information + - Patient satisfaction submission (locks the field once submitted). + The picker is available for 5 days after resolution/closure, matching the + unified tracker expiry in core/views.py. """ + from datetime import timedelta + + from django.utils import timezone + complaint = None error_message = None + info_message = None + satisfaction_just_submitted = False reference_number = request.GET.get("reference", "").strip() + tracking_expired = False + + def _compute_tracking_expired(comp): + if not comp: + return False + expiry_base = comp.resolved_at or comp.closed_at + if not expiry_base: + return False + return timezone.now() > expiry_base + timedelta(days=5) if request.method == "POST": reference_number = request.POST.get("reference_number", "").strip() @@ -4370,6 +4558,36 @@ def public_complaint_track(request): except Complaint.DoesNotExist: error_message = _("No complaint found with this reference number. Please check and try again.") + tracking_expired = _compute_tracking_expired(complaint) + + # Handle patient satisfaction submission (separate from reference search) + satisfaction_value = request.POST.get("satisfaction", "").strip() + if satisfaction_value and complaint is not None: + valid_choices = ["satisfied", "neutral", "dissatisfied"] + if satisfaction_value not in valid_choices: + error_message = _("Invalid satisfaction value.") + elif complaint.status not in ("resolved", "closed"): + error_message = _("Satisfaction can only be submitted after the complaint is resolved.") + elif tracking_expired: + error_message = _("This tracking link has expired. Satisfaction feedback can no longer be submitted.") + elif complaint.satisfaction_locked_by_patient: + info_message = _("You have already submitted your feedback. Thank you!") + else: + complaint.satisfaction = satisfaction_value + complaint.satisfaction_set_at = timezone.now() + complaint.satisfaction_locked_by_patient = True + complaint.satisfaction_locked_at = timezone.now() + complaint.save( + update_fields=[ + "satisfaction", + "satisfaction_set_at", + "satisfaction_locked_by_patient", + "satisfaction_locked_at", + "updated_at", + ] + ) + satisfaction_just_submitted = True + elif reference_number: # GET request with reference parameter try: @@ -4385,6 +4603,8 @@ def public_complaint_track(request): except Complaint.DoesNotExist: error_message = _("No complaint found with this reference number. Please check and try again.") + tracking_expired = _compute_tracking_expired(complaint) + public_status = None public_updates = [] if complaint: @@ -4418,6 +4638,9 @@ def public_complaint_track(request): "public_status": public_status, "public_updates": public_updates, "error_message": error_message, + "info_message": info_message, + "satisfaction_just_submitted": satisfaction_just_submitted, + "tracking_expired": tracking_expired, "reference_number": reference_number, } @@ -4491,6 +4714,8 @@ def public_inquiry_submit(request): from datetime import datetime # Reference number generated by Inquiry.save() (unified INQ-YYYYMM-HOSP-NNNN) + # Patient linking is backgrounded (local DB first, then HIS) so a slow HIS + # never blocks the public inquiry submission. inquiry = Inquiry.objects.create( patient=None, hospital=hospital, @@ -4508,10 +4733,11 @@ def public_inquiry_submit(request): ) reference_number = inquiry.reference_number - from apps.complaints.tasks import analyze_inquiry_with_ai, notify_staff_new_item + from apps.complaints.tasks import analyze_inquiry_with_ai, link_inquiry_patient, notify_staff_new_item analyze_inquiry_with_ai.delay(str(inquiry.id)) notify_staff_new_item.delay("inquiry", str(inquiry.id)) + link_inquiry_patient.delay(str(inquiry.id), phone) AuditService.log_event( event_type="inquiry_created_public", @@ -5652,6 +5878,14 @@ def involved_department_remove(request, pk): messages.error(request, _("You don't have permission to manage this complaint.")) return redirect("complaints:complaint_detail", pk=complaint.pk) + # If the user is removing the complaint's primary department involvement, + # record it so ensure_involved_records() does not auto-recreate it on the + # next detail-view render. Stored as the dept id; if complaint.department + # later changes to a different dept, auto-recreation resumes automatically. + if involved_dept.department_id == complaint.department_id and complaint.department_id is not None: + complaint.primary_dept_involved_removed_id = complaint.department_id + complaint.save(update_fields=["primary_dept_involved_removed"]) + involved_dept.delete() # Log the update @@ -5731,13 +5965,8 @@ def involved_department_response(request, pk): involved_dept.response_notes_ar = response_notes_ar involved_dept.response_submitted = True involved_dept.response_submitted_at = timezone.now() - involved_dept.acceptance_status = "pending" - involved_dept.accepted_by = None - involved_dept.accepted_at = None - involved_dept.acceptance_notes = "" - involved_dept.manager_review_status = "pending" - involved_dept.manager_reviewed_by = None - involved_dept.manager_reviewed_at = None + involved_dept.acceptance_status = "acceptable" + involved_dept.accepted_at = timezone.now() involved_dept.save() ComplaintUpdate.objects.create( @@ -5769,40 +5998,6 @@ def involved_department_response(request, pk): except Exception as e: logger.warning(f"Failed to send complainant notification: {e}") - dept = involved_dept.department - if dept.manager and dept.manager.email: - try: - from apps.notifications.services import NotificationService, get_email_header_html - review_url = request.build_absolute_uri( - reverse("organizations:department_manager_review", kwargs={"pk": dept.pk, "idept_pk": involved_dept.pk}) - ) - NotificationService.send_email( - dept.manager.email, - subject=f"Champion Response Requires Your Review - {complaint.reference_number}", - message=( - f"A champion response for complaint {complaint.reference_number} " - f"from {involved_dept.department.name} requires your review and approval.\n\n" - f"Please review at: {review_url}" - ), - html_message=f""" -
- {get_email_header_html()} -
-

Champion Response Requires Your Review

-

A champion from {involved_dept.department.name} has submitted a response - for complaint {complaint.reference_number}.

-

Your review and approval is required before it is forwarded to the PX team.

-

- Review Response -

-
-
- """, - related_object=complaint, - ) - except Exception as e: - logger.error(f"Failed to send manager review notification: {e}") - if request.headers.get('X-Requested-With') == 'XMLHttpRequest': redirect_url = reverse("organizations:department_detail", kwargs={"pk": user.department.pk}) if user.department else reverse("complaints:complaint_detail", kwargs={"pk": complaint.pk}) return JsonResponse({ @@ -6064,6 +6259,14 @@ def involved_staff_remove(request, pk): messages.error(request, _("You don't have permission to manage this complaint.")) return redirect("complaints:complaint_detail", pk=complaint.pk) + # If the user is removing the complaint's primary staff (accused) involvement, + # record it so ensure_involved_records() does not auto-recreate it on the + # next detail-view render. Stored as the staff id; if complaint.staff later + # changes to a different staff, auto-recreation resumes automatically. + if involved_staff.staff_id == complaint.staff_id and complaint.staff_id is not None: + complaint.primary_staff_involved_removed_id = complaint.staff_id + complaint.save(update_fields=["primary_staff_involved_removed"]) + involved_staff.delete() # Log the update diff --git a/apps/complaints/ui_views_explanation.py b/apps/complaints/ui_views_explanation.py deleted file mode 100644 index 31f796f..0000000 --- a/apps/complaints/ui_views_explanation.py +++ /dev/null @@ -1,246 +0,0 @@ -from django.contrib import messages -from django.contrib.auth.decorators import login_required -from django.http import HttpResponseForbidden -from django.shortcuts import get_object_or_404, redirect, render -from django.utils import timezone -from django.utils.translation import gettext as _ -from django.views.decorators.http import require_http_methods - -from apps.core.services import AuditService -from apps.organizations.models import Staff - -from .models import Complaint, ComplaintExplanation, ComplaintStatus -from .services.complaint_service import ComplaintService, ComplaintServiceError - - -@login_required -@require_http_methods(["GET", "POST"]) -def send_to_department_form(request, pk): - complaint = get_object_or_404( - Complaint.objects.prefetch_related( - "involved_staff__staff__department", - "involved_staff__staff__report_to", - "involved_departments__department__champion", - "involved_departments__department__manager", - ), - pk=pk, - ) - - user = request.user - can_request = ( - user.is_px_admin() - or user.is_hospital_admin() - or (user.is_department_manager() and complaint.department == user.department) - or (complaint.hospital == user.hospital) - ) - - if not can_request: - return HttpResponseForbidden(_("You don't have permission to request explanations.")) - - if not complaint.is_active_status: - messages.error( - request, - _( - "Cannot request explanation for complaint with status '{}'. Complaint must be Open, In Progress, or Partially Resolved." - ).format(complaint.get_status_display()), - ) - return redirect("complaints:complaint_detail", pk=complaint.pk) - - # Must be activated (in_progress) before it can be sent to a department - if complaint.status == "open": - messages.error(request, _("Activate this complaint before sending it to a department.")) - return redirect("complaints:complaint_detail", pk=complaint.pk) - - involved_staff = complaint.involved_staff.select_related( - "staff", "staff__department", "staff__report_to" - ).all() - - department_groups = {} - ungrouped_staff = [] - - # Build department groups from involved_departments first - involved_departments = complaint.involved_departments.select_related( - "department__champion", "department__manager" - ).all() - - for dept_inv in involved_departments: - dept = dept_inv.department - if not dept: - continue - - dept_key = str(dept.id) - if dept_key not in department_groups: - champion = dept.champion - champion_email = champion.email or (champion.user.email if champion and champion.user else None) if champion else None - dept_manager = dept.manager - department_groups[dept_key] = { - "department_id": dept_key, - "department_name": dept.get_localized_name(), - "champion": champion, - "champion_id": str(champion.id) if champion else None, - "champion_name": champion.get_full_name() if champion else None, - "champion_email": champion_email, - "dept_manager": dept_manager, - "dept_manager_id": str(dept_manager.id) if dept_manager else None, - "dept_manager_name": dept_manager.get_full_name() if dept_manager else None, - "dept_manager_email": dept_manager.email if dept_manager else None, - "staff_list": [], - } - - # Add involved staff to their department groups - for staff_inv in involved_staff: - staff = staff_inv.staff - dept = staff.department - entry = { - "staff_inv": staff_inv, - "staff": staff, - "staff_id": str(staff.id), - "staff_name": staff.get_full_name(), - "staff_email": staff.email or (staff.user.email if staff.user else None), - "role": staff_inv.get_role_display(), - } - - if dept: - dept_key = str(dept.id) - if dept_key in department_groups: - department_groups[dept_key]["staff_list"].append(entry) - else: - champion = dept.champion - champion_email = champion.email or (champion.user.email if champion and champion.user else None) if champion else None - dept_manager = dept.manager - department_groups[dept_key] = { - "department_id": dept_key, - "department_name": dept.get_localized_name(), - "champion": champion, - "champion_id": str(champion.id) if champion else None, - "champion_name": champion.get_full_name() if champion else None, - "champion_email": champion_email, - "dept_manager": dept_manager, - "dept_manager_id": str(dept_manager.id) if dept_manager else None, - "dept_manager_name": dept_manager.get_full_name() if dept_manager else None, - "dept_manager_email": dept_manager.email if dept_manager else None, - "staff_list": [entry], - } - else: - ungrouped_staff.append(entry) - - if not department_groups and not involved_staff.exists(): - if not involved_departments.exists(): - messages.error(request, _("No departments are involved in this complaint. Please add a department first.")) - return redirect("complaints:complaint_detail", pk=complaint.pk) - - if request.method == "POST": - action = request.POST.get("action", "send") - selected_dept_ids = request.POST.getlist("selected_departments") - request_message = request.POST.get("request_message", "").strip() - - if not selected_dept_ids: - messages.error(request, _("Please select at least one department.")) - return render( - request, - "complaints/send_to_department_form.html", - { - "complaint": complaint, - "department_groups": department_groups, - "ungrouped_staff": ungrouped_staff, - }, - ) - - if action == "preview": - preview_depts = [] - for dept_id in selected_dept_ids: - dept_info = department_groups.get(dept_id) - if dept_info: - contact_person_id = request.POST.get(f"contact_person_{dept_id}", "") - if contact_person_id: - from apps.organizations.models import Department as DeptModel - dept_obj = DeptModel.objects.filter(pk=dept_id).first() - if dept_obj: - cinfo = dept_obj.is_valid_contact_person(contact_person_id) - if cinfo: - dept_info["contact_person_id"] = contact_person_id - dept_info["contact_person_name"] = cinfo["name"] - dept_info["contact_person_role"] = cinfo["role_label"] - dept_info["contact_person_email"] = cinfo["email"] - dept_info["contact_person_staff"] = cinfo["staff"] - preview_depts.append(dept_info) - - contact_person_map = { - d["department_id"]: d.get("contact_person_id", "") - for d in preview_depts - if d.get("contact_person_id") - } - - return render( - request, - "complaints/send_to_department_preview.html", - { - "complaint": complaint, - "preview_depts": preview_depts, - "selected_dept_ids": selected_dept_ids, - "request_message": request_message, - "contact_person_map": contact_person_map, - }, - ) - - from django.contrib.sites.shortcuts import get_current_site - - contact_person_map = {} - for dept_id in selected_dept_ids: - cp_id = request.POST.get(f"contact_person_{dept_id}", "") - if cp_id: - contact_person_map[dept_id] = cp_id - - site = get_current_site(request) - results = ComplaintService.send_to_department( - complaint, - department_groups, - selected_dept_ids, - request_message, - request.user, - site.domain, - request=request, - contact_person_map=contact_person_map, - ) - - if not complaint.forwarded_to_dept_at: - complaint.forwarded_to_dept_at = timezone.now() - complaint.save(update_fields=["forwarded_to_dept_at"]) - - if results["champion_count"] == 0 and results["manager_count"] == 0: - if results["skipped_no_email"] > 0: - messages.warning( - request, - _( - "No explanation requests were sent. {} department(s) have champions without email addresses." - ).format(results["skipped_no_email"]), - ) - else: - messages.warning( - request, _("No explanation requests were sent. Please check department champion configuration.") - ) - elif results["champion_count"] == 0 and results["manager_count"] > 0: - messages.warning( - request, - _( - "Only department manager notifications were sent ({}). Champion explanation requests could not be sent." - ).format(results["manager_count"]), - ) - else: - messages.success( - request, - _("Explanation requests sent! Champions: {}, Department managers notified: {}.").format( - results["champion_count"], results["manager_count"] - ), - ) - return redirect("complaints:complaint_detail", pk=complaint.pk) - - return render( - request, - "complaints/send_to_department_form.html", - { - "complaint": complaint, - "department_groups": department_groups, - "ungrouped_staff": ungrouped_staff, - }, - ) diff --git a/apps/complaints/urls.py b/apps/complaints/urls.py index 62a9e0d..b2f2a8f 100644 --- a/apps/complaints/urls.py +++ b/apps/complaints/urls.py @@ -8,16 +8,20 @@ from .views import ( ComplaintViewSet, InquiryViewSet, complaint_explanation_form, + complaint_explanation_pdf, + complaint_review_pdf, champion_start_investigation, + staff_search_for_investigation, staff_investigation_form, champion_review_answers, generate_complaint_pdf, + inquiry_pdf, api_locations, api_sections, api_subsections, api_departments, ) -from . import ui_views, ui_views_explanation, ui_views_oncall, ui_views_templates +from . import ui_views, ui_views_oncall, ui_views_templates app_name = "complaints" @@ -136,7 +140,10 @@ urlpatterns = [ path("public/api/hospitals//departments/", api_departments, name="api_departments"), # Public Explanation Form (No Authentication Required) path("/explain//", complaint_explanation_form, name="complaint_explanation_form"), + path("/explain//pdf/", complaint_explanation_pdf, name="complaint_explanation_pdf"), + path("/investigate/review//pdf/", complaint_review_pdf, name="complaint_review_pdf"), path("/investigate//", champion_start_investigation, name="champion_start_investigation"), + path("/investigate//search-staff/", staff_search_for_investigation, name="staff_search_for_investigation"), path("/investigate/respond//", staff_investigation_form, name="staff_investigation_form"), path("/investigate/review//", champion_review_answers, name="champion_review_answers"), # Patient Complaint Portal (No Authentication Required) @@ -159,6 +166,7 @@ urlpatterns = [ ), # PDF Export path("/pdf/", generate_complaint_pdf, name="complaint_pdf"), + path("inquiries//pdf/", inquiry_pdf, name="inquiry_pdf"), # Involved Departments Management path("/departments/add/", ui_views.involved_department_add, name="involved_department_add"), path( @@ -170,12 +178,10 @@ urlpatterns = [ path("departments//remove/", ui_views.involved_department_remove, name="involved_department_remove"), path("departments//response/", ui_views.involved_department_response, name="involved_department_response"), path("departments//review-response/", ui_views.involved_department_review_response, name="involved_department_review_response"), - # Send to Department Form - path( - "/send-to-department/", ui_views_explanation.send_to_department_form, name="send_to_department_form" - ), # Unified Send To (Person or Department) - AJAX path("/send-to/", ui_views.complaint_send_to, name="complaint_send_to"), + # Collect Feedback (champion/manager compose questions for staff) + path("/collect-feedback/", ui_views.collect_feedback_start, name="collect_feedback_start"), # Involved Staff Management path("/staff/add/", ui_views.involved_staff_add, name="involved_staff_add"), path("staff//edit/", ui_views.involved_staff_edit, name="involved_staff_edit"), diff --git a/apps/complaints/views.py b/apps/complaints/views.py index b5469cb..32b02e1 100644 --- a/apps/complaints/views.py +++ b/apps/complaints/views.py @@ -4,6 +4,8 @@ Complaints views and viewsets import logging +from django.contrib.auth.decorators import login_required +from django.conf import settings from django.db.models import Q from django.shortcuts import get_object_or_404, render, redirect from django.urls import reverse @@ -1776,8 +1778,19 @@ Always provide valid JSON output with both resolution_en and resolution_ar field # Parse the JSON response import json + import re + + try: + resolution_data = json.loads(ai_response) + except json.JSONDecodeError: + # AI returned malformed JSON — try to extract fields via regex + en_match = re.search(r'"resolution_en"\s*:\s*"((?:[^"\\]|\\.)*)"', ai_response, re.DOTALL) + ar_match = re.search(r'"resolution_ar"\s*:\s*"((?:[^"\\]|\\.)*)"', ai_response, re.DOTALL) + resolution_data = { + "resolution_en": en_match.group(1).replace("\\n", "\n").replace('\\"', '"') if en_match else ai_response, + "resolution_ar": ar_match.group(1).replace("\\n", "\n").replace('\\"', '"') if ar_match else "", + } - resolution_data = json.loads(ai_response) resolution_en = resolution_data.get("resolution_en", "").strip() resolution_ar = resolution_data.get("resolution_ar", "").strip() @@ -2079,41 +2092,9 @@ Generate a JSON response with: dept_response_parts.append(complaint.action_taken_by_dept[:600]) dept_response_text = "\n".join(dept_response_parts) or "No department response recorded." - resolution_text = complaint.resolution or complaint.recommendation_action_plan or "" - prompt = f"""You are a healthcare complaint report writer. Generate your response entirely in Modern Standard Arabic (Fusha). - -COMPLAINT: -- Title: {complaint.title} -- Description: {complaint.description[:2000]} - -DEPARTMENT RESPONSE / ACTIONS TAKEN: -{dept_response_text} - -RESOLUTION: -{resolution_text[:600] or 'No resolution recorded.'} - -Generate JSON with exactly these fields: -- "content_summary": 2-3 paragraph professional summary of the complaint content. -- "department_response_summary": 1-2 paragraph summary of the department response and actions taken.""" - - from apps.core.ai_service import AIService - - result = AIService.chat_completion( - prompt=prompt, - response_format="json_object", - temperature=0.3, - max_tokens=1500, - ) - parsed = json.loads(result) - - content_summary = parsed.get( - "content_summary", complaint.description[:500] if complaint.description else "" - ) - dept_response_summary = parsed.get( - "department_response_summary", - complaint.action_taken_by_dept[:500] if complaint.action_taken_by_dept else "", - ) + content_summary = complaint.description or "" + dept_response_summary = dept_response_text ComplaintPdfSummary.objects.update_or_create( complaint=complaint, @@ -2240,7 +2221,7 @@ Generate JSON with exactly these fields: import io from PIL import Image as PILImage - _logo_img = PILImage.open(settings.BASE_DIR / "static" / "img" / "HH_P_V_Logo(hospital)_.png") + _logo_img = PILImage.open(settings.BASE_DIR / "static" / "img" / "HH_P_ICON.png") _logo_img.thumbnail((600, 600), PILImage.LANCZOS) _logo_buf = io.BytesIO() _logo_img.save(_logo_buf, format="PNG", optimize=True) @@ -3713,6 +3694,128 @@ def api_departments(request, hospital_id): ) +def complaint_explanation_pdf(request, complaint_id, token): + """Token-based PDF download for the explanation page (no login required).""" + from .models import ComplaintExplanation + + complaint = get_object_or_404(Complaint, id=complaint_id) + explanation = get_object_or_404(ComplaintExplanation, complaint=complaint, token=token) + + import io + import base64 + from PIL import Image as PILImage + from django.conf import settings + from django.template.loader import render_to_string + from weasyprint import HTML + + logo_path = None + try: + logo_img = PILImage.open(settings.BASE_DIR / "static" / "img" / "HH_P_ICON.png") + logo_img.thumbnail((600, 600), PILImage.LANCZOS) + buf = io.BytesIO() + logo_img.save(buf, format="PNG", optimize=True) + logo_path = "data:image/png;base64," + base64.b64encode(buf.getvalue()).decode() + except Exception: + pass + + staff_name = explanation.staff.get_full_name() if explanation.staff else "" + staff_title = explanation.staff.job_title if explanation.staff else "" + dept_name = "" + if explanation.staff and explanation.staff.department: + dept_name = ( + explanation.staff.department.name_ar + or explanation.staff.department.name_en + or explanation.staff.department.name + ) + + from datetime import datetime + + html_string = render_to_string( + "complaints/complaint_explanation_pdf.html", + { + "complaint": complaint, + "logo_path": logo_path, + "staff_name": staff_name, + "staff_title": staff_title, + "department_name": dept_name, + "sent_date": (explanation.email_sent_at or complaint.created_at).strftime("%Y/%m/%d %I:%M %p") if (explanation.email_sent_at or complaint.created_at) else "—", + }, + ) + + pdf_file = HTML(string=html_string, base_url=str(settings.BASE_DIR / "static")).write_pdf() + + from django.http import HttpResponse + + response = HttpResponse(pdf_file, content_type="application/pdf") + response["Content-Disposition"] = f'attachment; filename="complaint_{complaint.reference_number}.pdf"' + return response + + +def complaint_review_pdf(request, complaint_id, token): + """Token-based PDF download for the review page — shows staff Q&A (no login required).""" + from .models import ComplaintExplanation, ChampionInvestigation, InvestigationAnswer + + complaint = get_object_or_404(Complaint, id=complaint_id) + explanation = get_object_or_404(ComplaintExplanation, complaint=complaint, token=token) + investigation = ChampionInvestigation.objects.filter( + explanation=explanation + ).prefetch_related( + "responses__staff", "responses__answers__question" + ).first() + + if not investigation: + from django.http import HttpResponseNotFound + return HttpResponseNotFound("No investigation found.") + + import io + import base64 + from PIL import Image as PILImage + from django.conf import settings + from django.template.loader import render_to_string + from weasyprint import HTML + + logo_path = None + try: + logo_img = PILImage.open(settings.BASE_DIR / "static" / "img" / "HH_P_ICON.png") + logo_img.thumbnail((600, 600), PILImage.LANCZOS) + buf = io.BytesIO() + logo_img.save(buf, format="PNG", optimize=True) + logo_path = "data:image/png;base64," + base64.b64encode(buf.getvalue()).decode() + except Exception: + pass + + staff_data = [] + for resp in investigation.responses.all().select_related("staff"): + qa_pairs = [] + for ans in resp.answers.all().select_related("question"): + qa_pairs.append({ + "question": ans.question.question_text, + "question_type": ans.question.question_type, + "answer": ans.answer_text, + }) + staff_data.append({ + "staff": resp.staff, + "is_completed": resp.is_completed, + "completed_at": resp.completed_at, + "qa_pairs": qa_pairs, + }) + + html_string = render_to_string("complaints/complaint_review_pdf.html", { + "complaint": complaint, + "logo_path": logo_path, + "investigation": investigation, + "staff_data": staff_data, + }) + + pdf_file = HTML(string=html_string, base_url=str(settings.BASE_DIR / "static")).write_pdf() + + from django.http import HttpResponse + + response = HttpResponse(pdf_file, content_type="application/pdf") + response["Content-Disposition"] = f'attachment; filename="review_{complaint.reference_number}.pdf"' + return response + + def complaint_explanation_form(request, complaint_id, token): """ Public-facing form for staff to submit explanation. @@ -3720,6 +3823,7 @@ def complaint_explanation_form(request, complaint_id, token): This view does NOT require authentication. Validates token and checks if it's still valid (not used). """ + from django.utils.translation import gettext as _ from .models import ComplaintExplanation, ExplanationAttachment from apps.notifications.services import NotificationService, get_email_header_html from django.contrib.sites.shortcuts import get_current_site @@ -3755,141 +3859,286 @@ def complaint_explanation_form(request, complaint_id, token): ) if request.method == "POST": - # Handle form submission + from .models import ( + ChampionInvestigation, + InvestigationStatus, + ) + + action = request.POST.get("action", "") explanation_text = request.POST.get("explanation", "").strip() + consent_checked = request.POST.get("consent") == "on" + negligence_finding = request.POST.get("negligence_finding", "").strip() + policy_issue_finding = request.POST.get("policy_issue_finding", "").strip() + requires_improvement_project = request.POST.get("requires_improvement_project", "").strip() + improvement_project_note = request.POST.get("improvement_project_note", "").strip() - if not explanation_text: - return render( - request, - "complaints/explanation_form.html", - { - "complaint": complaint, - "explanation": explanation, - "original_explanation": original_explanation, - "error": "Please provide your explanation.", - }, - ) + # Shared base context for re-rendering the form + base_ctx = { + "complaint": complaint, + "explanation": explanation, + "original_explanation": original_explanation, + "final_reply": explanation_text, + "consent_checked": consent_checked, + "negligence_finding": negligence_finding, + "policy_issue_finding": policy_issue_finding, + "requires_improvement_project": requires_improvement_project, + "improvement_project_note": improvement_project_note, + "investigate_url": request.build_absolute_uri( + reverse("complaints:champion_start_investigation", kwargs={ + "complaint_id": complaint.id, + "token": explanation.token, + }) + ), + } - # Save explanation - explanation.explanation = explanation_text - explanation.is_used = True - explanation.responded_at = timezone.now() - explanation.save() + # --- Step 1: Send verification code --- + if action == "send_code": + if not explanation_text: + return render(request, "complaints/explanation_form.html", { + **base_ctx, "error": _("Please write your response first."), + }) + if not consent_checked: + return render(request, "complaints/explanation_form.html", { + **base_ctx, "error": _("Please check the acknowledgment box."), + }) + if requires_improvement_project == "yes" and not improvement_project_note: + return render(request, "complaints/explanation_form.html", { + **base_ctx, "consent_checked": True, + "error": _("Please describe the required improvement project."), + }) - # Handle file attachments - files = request.FILES.getlist("attachments") - for uploaded_file in files: - ExplanationAttachment.objects.create( + # Get champion/manager contact info + actor = explanation.staff + phone = "" + email = "" + if actor: + phone = actor.phone or "" + email = actor.email or "" + if actor.user: + phone = phone or (actor.user.phone or "") + email = email or (actor.user.email or "") + + if not phone and not email: + return render(request, "complaints/explanation_form.html", { + **base_ctx, "consent_checked": True, + "error": _("No phone or email on file. Please contact the PX team."), + }) + + # Get-or-create a ChampionInvestigation to hold the OTP + assessment fields + investigation, _ = ChampionInvestigation.objects.get_or_create( explanation=explanation, - file=uploaded_file, - filename=uploaded_file.name, - file_type=uploaded_file.content_type, - file_size=uploaded_file.size, - ) - - # Populate the linked ComplaintInvolvedDepartment response for manager review - from apps.complaints.models import ComplaintInvolvedDepartment - involved_dept = ComplaintInvolvedDepartment.objects.filter( - complaint=complaint, - department=explanation.staff.department, - sent=True, - ).first() - - if involved_dept: - involved_dept.response_notes = explanation_text - involved_dept.response_notes_en = explanation_text - involved_dept.response_submitted = True - involved_dept.response_submitted_at = timezone.now() - involved_dept.manager_review_status = "pending" - involved_dept.manager_reviewed_by = None - involved_dept.manager_reviewed_at = None - involved_dept.acceptance_status = "pending" - involved_dept.accepted_by = None - involved_dept.accepted_at = None - involved_dept.acceptance_notes = "" - involved_dept.save() - - ComplaintUpdate.objects.create( complaint=complaint, - update_type="note", - message=f"Champion response submitted by {explanation.staff} from {involved_dept.department.name} — awaiting manager review", - metadata={ - "explanation_id": str(explanation.id), - "staff_id": str(explanation.staff.id) if explanation.staff else None, - }, - ) - else: - ComplaintUpdate.objects.create( - complaint=complaint, - update_type="communication", - message=f"Explanation submitted by {explanation.staff}", - metadata={ - "explanation_id": str(explanation.id), - "staff_id": str(explanation.staff.id) if explanation.staff else None, + defaults={ + "champion": actor, + "status": InvestigationStatus.DIRECT_REPLY_IN_PROGRESS, + "final_reply": explanation_text, }, ) + investigation.final_reply = explanation_text + investigation.status = InvestigationStatus.DIRECT_REPLY_IN_PROGRESS - # Fallback: notify PX Admin for explanations without linked InvolvedDepartment - if complaint.assigned_to and complaint.assigned_to.email: - site = get_current_site(request) - complaint_url = f"https://{site.domain}/complaints/{complaint.id}/" + import random + + code = f"{random.randint(0, 999999):06d}" + investigation.otp_code = code + investigation.otp_sent_at = timezone.now() + investigation.save(update_fields=[ + "final_reply", "status", "otp_code", "otp_sent_at", + ]) + + sent_channels = [] + if phone: + try: + NotificationService.send_sms( + phone, + f"PX360: Your verification code is {code}. Enter this to submit your response for complaint #{complaint.reference_number}.", + ) + sent_channels.append("phone") + except Exception: + pass + if email: try: NotificationService.send_email( - email=complaint.assigned_to.email, - subject=f"New Explanation Received - Complaint #{complaint.reference_number}", - message=f"An explanation has been submitted for complaint {complaint.reference_number}.\n\nView: {complaint_url}", + email=email, + subject=f"Verification Code - Complaint #{complaint.reference_number}", + message=f"Your verification code is: {code}\n\nEnter this code to submit your response.", + related_object=complaint, + ) + sent_channels.append("email") + except Exception: + pass + + return render(request, "complaints/explanation_form.html", { + **base_ctx, "consent_checked": True, + "otp_sent": True, + "otp_phone": "phone" in sent_channels, + "otp_email": "email" in sent_channels, + }) + + # --- Step 2: Verify code + submit --- + if action == "verify_submit": + entered_code = request.POST.get("otp_code", "").strip() + + if not consent_checked: + return render(request, "complaints/explanation_form.html", { + **base_ctx, "otp_sent": True, + "error": _("Please check the acknowledgment box."), + }) + + try: + investigation = ChampionInvestigation.objects.get( + explanation=explanation, + status=InvestigationStatus.DIRECT_REPLY_IN_PROGRESS, + ) + except ChampionInvestigation.DoesNotExist: + return render(request, "complaints/explanation_form.html", { + **base_ctx, "consent_checked": True, + "error": _("No verification code was sent. Please request a new code."), + }) + + if not investigation.otp_code or not investigation.otp_sent_at: + return render(request, "complaints/explanation_form.html", { + **base_ctx, "consent_checked": True, + "error": _("No verification code was sent. Please request a new code."), + }) + + from datetime import timedelta + + expiry = investigation.otp_sent_at + timedelta(minutes=10) + if timezone.now() > expiry: + return render(request, "complaints/explanation_form.html", { + **base_ctx, "consent_checked": True, + "error": _("Verification code expired. Please request a new code."), + }) + + if entered_code != investigation.otp_code: + return render(request, "complaints/explanation_form.html", { + **base_ctx, "consent_checked": True, "otp_sent": True, + "error": _("Incorrect verification code. Please try again."), + }) + + # --- Code verified — finalize the submission --- + investigation.final_reply = explanation_text + investigation.status = InvestigationStatus.REPLY_SUBMITTED + investigation.otp_code = "" + investigation.negligence_finding = negligence_finding + investigation.policy_issue_finding = policy_issue_finding + investigation.requires_improvement_project = requires_improvement_project + investigation.improvement_project_note = improvement_project_note + investigation.save(update_fields=[ + "final_reply", "status", "otp_code", + "negligence_finding", "policy_issue_finding", + "requires_improvement_project", "improvement_project_note", + ]) + + explanation.explanation = explanation_text + explanation.is_used = True + explanation.responded_at = timezone.now() + explanation.save(update_fields=["explanation", "is_used", "responded_at"]) + + # Save attachments + files = request.FILES.getlist("attachments") + for uploaded_file in files: + ExplanationAttachment.objects.create( + explanation=explanation, + file=uploaded_file, + filename=uploaded_file.name, + file_type=uploaded_file.content_type, + file_size=uploaded_file.size, + ) + + # Mark ALL other explanations for this complaint as used (first responder wins) + ComplaintExplanation.objects.filter( + complaint=complaint, + is_used=False, + ).update(is_used=True) + + # Update the linked ComplaintInvolvedDepartment + from apps.complaints.models import ComplaintInvolvedDepartment + involved_dept = investigation.involved_department + if not involved_dept: + if explanation.staff and explanation.staff.department: + involved_dept = ComplaintInvolvedDepartment.objects.filter( + complaint=complaint, + department=explanation.staff.department, + sent=True, + ).first() + if not involved_dept: + involved_dept = ComplaintInvolvedDepartment.objects.filter( + complaint=complaint, sent=True, + ).first() + + if involved_dept: + involved_dept.response_notes = explanation_text + involved_dept.response_notes_en = explanation_text + involved_dept.response_submitted = True + involved_dept.response_submitted_at = timezone.now() + involved_dept.acceptance_status = "acceptable" + involved_dept.accepted_at = timezone.now() + involved_dept.save() + + ComplaintUpdate.objects.create( + complaint=complaint, + update_type="note", + message=f"Department response submitted (verified) from {involved_dept.department.name}", + metadata={ + "explanation_id": str(explanation.id), + "staff_id": str(explanation.staff.id) if explanation.staff else None, + "investigation_id": str(investigation.id), + "flow": "direct_reply", + }, + ) + else: + ComplaintUpdate.objects.create( + complaint=complaint, + update_type="communication", + message=f"Explanation submitted by {explanation.staff}", + metadata={ + "explanation_id": str(explanation.id), + "staff_id": str(explanation.staff.id) if explanation.staff else None, + }, + ) + + if requires_improvement_project == "yes": + ComplaintUpdate.objects.create( + complaint=complaint, + update_type="note", + message=f"Improvement project recommended: {improvement_project_note}", + metadata={ + "investigation_id": str(investigation.id), + "flag": "improvement_project", + "negligence": negligence_finding, + "policy_issue": policy_issue_finding, + "note": improvement_project_note, + }, + ) + + # Notify PX team + if complaint.assigned_to and complaint.assigned_to.email: + try: + notify_msg = f"A response has been submitted for complaint {complaint.reference_number}." + if requires_improvement_project == "yes": + notify_msg += f"\n\n*** IMPROVEMENT PROJECT RECOMMENDED ***\n{improvement_project_note}" + NotificationService.send_email( + email=complaint.assigned_to.email, + subject=f"Department Response Received - Complaint #{complaint.reference_number}", + message=notify_msg, related_object=complaint, - metadata={ - "notification_type": "explanation_submitted", - "explanation_id": str(explanation.id), - "staff_id": str(explanation.staff.id) if explanation.staff else None, - }, ) except Exception: pass - # Notify department manager to review (NOT the PX Admin) - if involved_dept: - dept = involved_dept.department - if dept.manager and dept.manager.email: - try: - review_url = request.build_absolute_uri( - reverse("organizations:department_manager_review", kwargs={"pk": dept.pk, "idept_pk": involved_dept.pk}) - ) - NotificationService.send_email( - dept.manager.email, - subject=f"Champion Response Requires Your Review - {complaint.reference_number}", - message=( - f"A champion response for complaint {complaint.reference_number} " - f"from {dept.name} requires your review and approval.\n\n" - f"Please review at: {review_url}" - ), - html_message=f""" -
- {get_email_header_html()} -
-

Champion Response Requires Your Review

-

A champion from {dept.name} has submitted a response - for complaint {complaint.reference_number}.

-

Your review and approval is required before it is forwarded to the PX team.

-

- Review Response -

-
-
- """, - related_object=complaint, - ) - except Exception as e: - import logging - logging.getLogger(__name__).error(f"Failed to send manager review notification: {e}") + return render( + request, + "complaints/explanation_success.html", + {"complaint": complaint, "explanation": explanation, "attachment_count": len(files)}, + ) - # Redirect to success page - return render( - request, - "complaints/explanation_success.html", - {"complaint": complaint, "explanation": explanation, "attachment_count": len(files)}, - ) + # Unknown / missing action — show form with error + return render(request, "complaints/explanation_form.html", { + **base_ctx, + "error": _("Invalid request."), + }) # GET request - display form from apps.complaints.models import ComplaintInvolvedStaff @@ -3906,6 +4155,19 @@ def complaint_explanation_form(request, complaint_id, token): explanation=explanation ).select_related("champion").first() + # Auto-show OTP entry if a direct-reply OTP is still valid (e.g., user reloaded page) + otp_sent_on_get = False + if not explanation.is_used: + from apps.complaints.models import ChampionInvestigation, InvestigationStatus + from datetime import timedelta + existing = ChampionInvestigation.objects.filter( + explanation=explanation, + status=InvestigationStatus.DIRECT_REPLY_IN_PROGRESS, + otp_code__isnull=False, + ).exclude(otp_code="").first() + if existing and existing.otp_sent_at and timezone.now() <= existing.otp_sent_at + timedelta(minutes=10): + otp_sent_on_get = True + return render( request, "complaints/explanation_form.html", @@ -3915,6 +4177,7 @@ def complaint_explanation_form(request, complaint_id, token): "original_explanation": original_explanation, "accused_staff": accused_staff, "existing_investigation": existing_investigation, + "otp_sent": otp_sent_on_get, "investigate_url": request.build_absolute_uri( reverse("complaints:champion_start_investigation", kwargs={ "complaint_id": complaint.id, @@ -3931,7 +4194,7 @@ def champion_start_investigation(request, complaint_id, token): ChampionInvestigation, InvestigationQuestion, InvestigationResponse, InvestigationAnswer, ComplaintUpdate, ) - from apps.notifications.services import NotificationService + from apps.notifications.services import NotificationService, get_email_header_html complaint = get_object_or_404(Complaint, id=complaint_id) explanation = get_object_or_404( @@ -3939,16 +4202,38 @@ def champion_start_investigation(request, complaint_id, token): complaint=complaint, token=token, ) - if explanation.is_used: - return render(request, "complaints/explanation_already_submitted.html", { - "complaint": complaint, "explanation": explanation, + # Check if there's an investigation still in progress + in_progress = ChampionInvestigation.objects.filter( + explanation=explanation, + status__in=["questions_sent", "answers_received"], + ).first() + + if in_progress: + # An investigation is active — check if the explanation was marked used + # (shouldn't be, but reset just in case so the champion can access it) + if explanation.is_used: + explanation.is_used = False + explanation.save(update_fields=["is_used"]) + return render(request, "complaints/investigation_already_started.html", { + "complaint": complaint, "investigation": in_progress, }) - existing = ChampionInvestigation.objects.filter(explanation=explanation).first() - if existing: - return render(request, "complaints/investigation_already_started.html", { - "complaint": complaint, "investigation": existing, - }) + # If the explanation was used (by a direct reply or a completed investigation round), + # but all investigations are complete (reply_submitted), allow starting a new round. + if explanation.is_used: + # Was it used by a completed investigation? If so, reset for a new round. + completed_investigations = ChampionInvestigation.objects.filter( + explanation=explanation, + status="reply_submitted", + ) + if completed_investigations.exists(): + explanation.is_used = False + explanation.save(update_fields=["is_used"]) + else: + # Used by a direct reply (not investigation) — stay submitted + return render(request, "complaints/explanation_already_submitted.html", { + "complaint": complaint, "explanation": explanation, + }) accused_staff = list( ComplaintInvolvedStaff.objects.filter( @@ -3956,28 +4241,49 @@ def champion_start_investigation(request, complaint_id, token): ).select_related("staff") ) + # Note: we no longer fall back to showing same-department staff when + # ComplaintInvolvedStaff is empty. The champion must explicitly search + # and add staff via the token-authenticated search endpoint below. + + search_url = request.build_absolute_uri( + reverse("complaints:staff_search_for_investigation", kwargs={ + "complaint_id": complaint.id, + "token": explanation.token, + }) + ) + if request.method == "POST": import secrets - questions = request.POST.getlist("questions[]") - questions = [q.strip() for q in questions if q.strip()] - selected_staff_ids = request.POST.getlist("accused_staff[]") - selected_staff_ids = [sid for sid in selected_staff_ids if sid] + selected_staff_ids = [sid for sid in request.POST.getlist("accused_staff[]") if sid] - if not questions: - return render(request, "complaints/investigation_questions.html", { - "complaint": complaint, - "explanation": explanation, - "accused_staff": accused_staff, - "error": "Please add at least one question.", - }) + # Per-staff questions: field name questions__[] -> list of (text, type) pairs + per_staff_questions = {} + for sid in selected_staff_ids: + qs = [q.strip() for q in request.POST.getlist(f"questions__{sid}[]") if q.strip()] + q_types = request.POST.getlist(f"question_types__{sid}[]") + if qs: + per_staff_questions[sid] = [ + (qs[i], q_types[i] if i < len(q_types) else "text") + for i in range(len(qs)) + ] if not selected_staff_ids: return render(request, "complaints/investigation_questions.html", { "complaint": complaint, "explanation": explanation, "accused_staff": accused_staff, - "error": "Please select at least one accused staff member.", + "search_url": search_url, + "error": "Please select at least one staff member.", + }) + + if not per_staff_questions: + return render(request, "complaints/investigation_questions.html", { + "complaint": complaint, + "explanation": explanation, + "accused_staff": accused_staff, + "search_url": search_url, + "error": "Please add at least one question for each selected staff member.", }) involved_dept = explanation.linked_involved_department @@ -3990,27 +4296,50 @@ def champion_start_investigation(request, complaint_id, token): status="questions_sent", ) - for i, q_text in enumerate(questions): - InvestigationQuestion.objects.create( + # Champion context attachments (shown to staff when they respond) + from .models import InvestigationAttachment + for f in request.FILES.getlist("context_attachments"): + InvestigationAttachment.objects.create( investigation=investigation, - question_text=q_text, - order=i + 1, + file=f, + filename=f.name, + file_type=f.content_type, + file_size=f.size, + uploaded_by=request.user if request.user.is_authenticated else None, ) domain = request.get_host() staff_count = 0 for sid in selected_staff_ids: + qs = per_staff_questions.get(sid) or [] + if not qs: + continue + staff_qs = accused_staff matched = next((s for s in staff_qs if str(s.staff_id) == sid), None) if not matched: try: from apps.organizations.models import Staff + staff_obj = Staff.objects.get(id=sid) matched = type('obj', (), {'staff': staff_obj, 'staff_id': staff_obj.id})() except Exception: continue staff_member = matched.staff if hasattr(matched, 'staff') else matched + + # Persist selected staff to ComplaintInvolvedStaff so they appear on + # the complaint detail page's involved-staff list going forward. + # Idempotent via get_or_create — no duplicates if already involved. + ComplaintInvolvedStaff.objects.get_or_create( + complaint=complaint, + staff=staff_member, + defaults={ + "role": ComplaintInvolvedStaff.RoleChoices.ACCUSED, + "notes": "Added during investigation by champion/manager", + }, + ) + resp_token = secrets.token_urlsafe(32) inv_response = InvestigationResponse.objects.create( investigation=investigation, @@ -4018,7 +4347,15 @@ def champion_start_investigation(request, complaint_id, token): token=resp_token, ) - for q in investigation.questions.all(): + # Create THIS staff member's own questions on their response (per-staff) + for i, (q_text, q_type) in enumerate(qs): + q = InvestigationQuestion.objects.create( + investigation=investigation, + response=inv_response, + question_text=q_text, + question_type=q_type, + order=i + 1, + ) InvestigationAnswer.objects.get_or_create( response=inv_response, question=q, defaults={"answer_text": ""} ) @@ -4028,14 +4365,19 @@ def champion_start_investigation(request, complaint_id, token): staff_user = staff_member.user if hasattr(staff_member, 'user') and staff_member.user else None staff_email = staff_member.email or (staff_user.email if staff_user else None) + # DEV: print the no-login feedback link so it's visible in the console (debug only) + from django.conf import settings as _settings + if _settings.DEBUG: + print(f"[investigation link] {staff_member.get_full_name()} ({staff_email or 'no email'}) -> {respond_url}") + if staff_email: try: NotificationService.send_email( email=staff_email, - subject=f"Investigation Questions - Complaint #{complaint.reference_number}", + subject=f"Feedback Request - Complaint #{complaint.reference_number}", message=( f"Dear {staff_member.get_full_name()},\n\n" - f"You have been requested to answer investigation questions " + f"You have been requested to provide feedback " f"for complaint #{complaint.reference_number}.\n\n" f"Please respond at: {respond_url}\n\n" f"Note: This link can only be used once." @@ -4044,13 +4386,13 @@ def champion_start_investigation(request, complaint_id, token):
{get_email_header_html()}
-

Investigation Questions

+

Feedback Request

Dear {staff_member.get_full_name()},

-

You have been requested to answer investigation questions for complaint +

You have been requested to provide feedback for complaint #{complaint.reference_number}.

The department champion would like your response before proceeding.

- Answer Questions + Provide Feedback

Note: This link can only be used once.

@@ -4079,8 +4421,8 @@ def champion_start_investigation(request, complaint_id, token): if staff_phone: try: NotificationService.send_sms( - to=staff_phone, - message=f"You have investigation questions for complaint #{complaint.reference_number}. Please respond at: {respond_url}", + staff_phone, + f"You have feedback to provide for complaint #{complaint.reference_number}. Please respond at: {respond_url}", ) inv_response.sms_sent_at = timezone.now() inv_response.save(update_fields=["sms_sent_at"]) @@ -4104,6 +4446,7 @@ def champion_start_investigation(request, complaint_id, token): "complaint": complaint, "explanation": explanation, "accused_staff": accused_staff, + "search_url": search_url, "success": f"Investigation started. Questions sent to {staff_count} staff member(s).", }) @@ -4111,9 +4454,66 @@ def champion_start_investigation(request, complaint_id, token): "complaint": complaint, "explanation": explanation, "accused_staff": accused_staff, + "search_url": search_url, }) +def staff_search_for_investigation(request, complaint_id, token): + """ + Public (token-authenticated) staff search for the investigation compose page. + + GET /complaints//investigate//search-staff/?q= + + Returns active staff in the complaint's hospital matching name/employee_id. + Marks staff already linked to the complaint via ComplaintInvolvedStaff so + the JS can render them as already-added (greyed out). + """ + from django.db.models import Q + from django.http import JsonResponse + + complaint = get_object_or_404(Complaint, id=complaint_id) + explanation = get_object_or_404( + ComplaintExplanation, complaint=complaint, token=token + ) + if explanation.is_used: + return JsonResponse({"results": [], "error": "token expired"}, status=400) + + q = request.GET.get("q", "").strip() + if len(q) < 2: + return JsonResponse({"results": []}) + + from apps.organizations.models import Staff + from .models import ComplaintInvolvedStaff + + already_linked = set( + ComplaintInvolvedStaff.objects.filter(complaint=complaint) + .values_list("staff_id", flat=True) + ) + + qs = ( + Staff.objects.filter(hospital=complaint.hospital, status="active") + .filter( + Q(first_name__icontains=q) + | Q(last_name__icontains=q) + | Q(name__icontains=q) + | Q(name_ar__icontains=q) + | Q(employee_id__icontains=q) + ) + .select_related("department")[:20] + ) + + results = [ + { + "id": str(s.id), + "name": s.get_full_name(), + "department_name": s.department.get_localized_name() if s.department else "", + "already_added": s.id in already_linked, + } + for s in qs + ] + return JsonResponse({"results": results}) + + def staff_investigation_form(request, complaint_id, token): from .models import ( InvestigationResponse, InvestigationAnswer, @@ -4139,9 +4539,26 @@ def staff_investigation_form(request, complaint_id, token): "complaint": complaint, "inv_response": inv_response, }) - questions = list(inv_response.investigation.questions.all().order_by("order")) + # Per-staff questions: prefer questions tied to this response; fall back to shared questions + questions = list(inv_response.questions.all().order_by("order")) + if not questions: + questions = list(inv_response.investigation.questions.all().order_by("order")) if request.method == "POST": + if request.POST.get("consent") != "on": + question_answer_pairs = [] + for q in questions: + question_answer_pairs.append({ + "question": q, + "existing_answer": "", + }) + return render(request, "complaints/investigation_respond.html", { + "complaint": complaint, + "inv_response": inv_response, + "question_answer_pairs": question_answer_pairs, + "error": _("Please check the acknowledgment box before submitting."), + }) + for q in questions: answer_text = request.POST.get(f"question_{q.id}", "").strip() InvestigationAnswer.objects.update_or_create( @@ -4154,6 +4571,17 @@ def staff_investigation_form(request, complaint_id, token): inv_response.completed_at = timezone.now() inv_response.save(update_fields=["is_completed", "completed_at"]) + # Staff attachments + from .models import InvestigationResponseAttachment + for f in request.FILES.getlist("attachments"): + InvestigationResponseAttachment.objects.create( + response=inv_response, + file=f, + filename=f.name, + file_type=f.content_type, + file_size=f.size, + ) + investigation = inv_response.investigation if investigation.all_responses_received: investigation.status = "answers_received" @@ -4233,6 +4661,7 @@ def staff_investigation_form(request, complaint_id, token): "complaint": complaint, "inv_response": inv_response, "question_answer_pairs": question_answer_pairs, + "context_attachments": inv_response.investigation.attachments.all(), }) @@ -4252,7 +4681,7 @@ def champion_review_answers(request, complaint_id, token): investigation = ChampionInvestigation.objects.filter( explanation=explanation ).prefetch_related( - "questions", "responses__staff", "responses__answers__question" + "questions", "responses__staff", "responses__answers__question", "responses__attachments", "attachments" ).first() if not investigation: @@ -4266,7 +4695,8 @@ def champion_review_answers(request, complaint_id, token): }) responses = list(investigation.responses.all().select_related("staff")) - questions = list(investigation.questions.all().order_by("order")) + # Shared questions (legacy / when not per-staff); each response may override with its own set + questions = list(investigation.questions.filter(response__isnull=True).order_by("order")) answer_lookup = {} from .models import InvestigationAnswer @@ -4278,8 +4708,10 @@ def champion_review_answers(request, complaint_id, token): staff_data = [] for resp in responses: + # Per-staff questions: prefer this response's own questions; fall back to shared + resp_questions = list(resp.questions.all().order_by("order")) or questions qa_pairs = [] - for q in questions: + for q in resp_questions: key = (str(resp.id), str(q.id)) qa_pairs.append({ "question": q, @@ -4292,110 +4724,227 @@ def champion_review_answers(request, complaint_id, token): "qa_pairs": qa_pairs, }) - if request.method == "POST": - final_reply = request.POST.get("final_reply", "").strip() - if not final_reply: - return render(request, "complaints/investigation_review.html", { - "complaint": complaint, - "explanation": explanation, - "investigation": investigation, - "questions": questions, - "staff_data": staff_data, - "error": "Please provide your final reply.", - }) - - investigation.final_reply = final_reply - investigation.status = InvestigationStatus.REPLY_SUBMITTED - investigation.save(update_fields=["final_reply", "status"]) - - explanation.explanation = final_reply - explanation.is_used = True - explanation.responded_at = timezone.now() - explanation.save(update_fields=["explanation", "is_used", "responded_at"]) - - involved_dept = investigation.involved_department or explanation.linked_involved_department - if involved_dept: - involved_dept.response_notes = final_reply - involved_dept.response_notes_en = final_reply - involved_dept.response_submitted = True - involved_dept.response_submitted_at = timezone.now() - involved_dept.manager_review_status = "pending" - involved_dept.manager_reviewed_by = None - involved_dept.manager_reviewed_at = None - involved_dept.acceptance_status = "pending" - involved_dept.accepted_by = None - involved_dept.accepted_at = None - involved_dept.acceptance_notes = "" - involved_dept.save() - - dept = involved_dept.department - if dept and dept.manager and dept.manager.email: - try: - review_url = request.build_absolute_uri( - reverse("organizations:department_manager_review", kwargs={ - "pk": dept.pk, - "idept_pk": involved_dept.pk, - }) - ) - NotificationService.send_email( - dept.manager.email, - subject=f"Champion Response Requires Your Review - {complaint.reference_number}", - message=( - f"A champion response for complaint {complaint.reference_number} " - f"from {dept.name} requires your review and approval.\n\n" - f"Please review at: {review_url}" - ), - html_message=f""" -
- {get_email_header_html()} -
-

Champion Response Requires Review

-

A champion response for complaint {complaint.reference_number} from {dept.name} requires your review and approval.

- -
-
-""", - related_object=complaint, - ) - except Exception as e: - import logging - logging.getLogger(__name__).error(f"Failed to send manager review notification: {e}") - - files = request.FILES.getlist("attachments") - from apps.complaints.models import ExplanationAttachment - for f in files: - ExplanationAttachment.objects.create( - explanation=explanation, - file=f, - filename=f.name, - file_type=f.content_type, - file_size=f.size, - ) - - ComplaintUpdate.objects.create( - complaint=complaint, - update_type="note", - message=f"Champion {explanation.staff.get_full_name()} submitted final reply after investigation — awaiting manager review", - metadata={ - "investigation_id": str(investigation.id), - "response_count": len(responses), - }, - ) - - return render(request, "complaints/explanation_success.html", { - "complaint": complaint, - "explanation": explanation, - "attachment_count": len(files), - }) - - return render(request, "complaints/investigation_review.html", { + base_ctx = { "complaint": complaint, "explanation": explanation, "investigation": investigation, "questions": questions, "staff_data": staff_data, + } + + if request.method == "POST": + action = request.POST.get("action", "") + final_reply = request.POST.get("final_reply", "").strip() + consent_checked = request.POST.get("consent") == "on" + negligence_finding = request.POST.get("negligence_finding", "").strip() + policy_issue_finding = request.POST.get("policy_issue_finding", "").strip() + requires_improvement_project = request.POST.get("requires_improvement_project", "").strip() + improvement_project_note = request.POST.get("improvement_project_note", "").strip() + + # --- Step 1: Send verification code --- + if action == "send_code": + if not final_reply: + return render(request, "complaints/investigation_review.html", { + **base_ctx, "final_reply": final_reply, "error": "Please write your final reply first.", + }) + if not consent_checked: + return render(request, "complaints/investigation_review.html", { + **base_ctx, "final_reply": final_reply, "error": _("Please check the acknowledgment box."), + }) + if requires_improvement_project == "yes" and not improvement_project_note: + return render(request, "complaints/investigation_review.html", { + **base_ctx, "final_reply": final_reply, "consent_checked": True, + "error": _("Please describe the required improvement project."), + }) + + # Get champion contact info + champion = explanation.staff + phone = "" + email = "" + if champion: + phone = champion.phone or "" + email = champion.email or "" + if champion.user: + phone = phone or (champion.user.phone or "") + email = email or (champion.user.email or "") + + if not phone and not email: + return render(request, "complaints/investigation_review.html", { + **base_ctx, "final_reply": final_reply, "consent_checked": True, + "error": "No phone or email on file. Please contact the PX team.", + }) + + import random + + code = f"{random.randint(0, 999999):06d}" + investigation.otp_code = code + investigation.otp_sent_at = timezone.now() + investigation.save(update_fields=["otp_code", "otp_sent_at"]) + + sent_channels = [] + if phone: + try: + NotificationService.send_sms( + phone, + f"PX360: Your verification code is {code}. Enter this to submit your response for complaint #{complaint.reference_number}.", + ) + sent_channels.append("phone") + except Exception: + pass + if email: + try: + NotificationService.send_email( + email=email, + subject=f"Verification Code - Complaint #{complaint.reference_number}", + message=f"Your verification code is: {code}\n\nEnter this code to submit your response.", + related_object=complaint, + ) + sent_channels.append("email") + except Exception: + pass + + return render(request, "complaints/investigation_review.html", { + **base_ctx, "final_reply": final_reply, "consent_checked": True, + "otp_sent": True, + "otp_phone": "phone" in sent_channels, + "otp_email": "email" in sent_channels, + }) + + # --- Step 2: Verify code + submit --- + if action == "verify_submit": + entered_code = request.POST.get("otp_code", "").strip() + + if not consent_checked: + return render(request, "complaints/investigation_review.html", { + **base_ctx, "final_reply": final_reply, "otp_sent": True, + "error": _("Please check the acknowledgment box."), + }) + + # Validate code + if not investigation.otp_code or not investigation.otp_sent_at: + return render(request, "complaints/investigation_review.html", { + **base_ctx, "final_reply": final_reply, "consent_checked": True, + "error": "No verification code was sent. Please request a new code.", + }) + + # Check expiry (10 minutes) + from datetime import timedelta + + expiry = investigation.otp_sent_at + timedelta(minutes=10) + if timezone.now() > expiry: + return render(request, "complaints/investigation_review.html", { + **base_ctx, "final_reply": final_reply, "consent_checked": True, + "error": "Verification code expired. Please request a new code.", + }) + + if entered_code != investigation.otp_code: + return render(request, "complaints/investigation_review.html", { + **base_ctx, "final_reply": final_reply, "consent_checked": True, + "otp_sent": True, + "error": "Incorrect verification code. Please try again.", + }) + + # --- Code verified — process the submission --- + investigation.final_reply = final_reply + investigation.status = InvestigationStatus.REPLY_SUBMITTED + investigation.otp_code = "" + investigation.negligence_finding = negligence_finding + investigation.policy_issue_finding = policy_issue_finding + investigation.requires_improvement_project = requires_improvement_project + investigation.improvement_project_note = improvement_project_note + investigation.save(update_fields=[ + "final_reply", "status", "otp_code", + "negligence_finding", "policy_issue_finding", + "requires_improvement_project", "improvement_project_note", + ]) + + explanation.explanation = final_reply + explanation.is_used = True + explanation.responded_at = timezone.now() + explanation.save(update_fields=["explanation", "is_used", "responded_at"]) + + # Save champion's attachments from the review form + from .models import ExplanationAttachment + for f in request.FILES.getlist("attachments"): + ExplanationAttachment.objects.create( + explanation=explanation, + file=f, + filename=f.name, + file_type=f.content_type, + file_size=f.size, + ) + + ComplaintExplanation.objects.filter( + complaint=complaint, + is_used=False, + ).update(is_used=True) + + involved_dept = investigation.involved_department or explanation.linked_involved_department + if involved_dept: + involved_dept.response_notes = final_reply + involved_dept.response_notes_en = final_reply + involved_dept.response_submitted = True + involved_dept.response_submitted_at = timezone.now() + involved_dept.acceptance_status = "acceptable" + involved_dept.accepted_at = timezone.now() + involved_dept.save() + + if complaint.assigned_to and complaint.assigned_to.email: + try: + notify_msg = f"A response has been submitted for complaint {complaint.reference_number}." + if requires_improvement_project == "yes": + notify_msg += f"\n\n*** IMPROVEMENT PROJECT RECOMMENDED ***\n{improvement_project_note}" + NotificationService.send_email( + email=complaint.assigned_to.email, + subject=f"Department Response Received - Complaint #{complaint.reference_number}", + message=notify_msg, + related_object=complaint, + ) + except Exception: + pass + + ComplaintUpdate.objects.create( + complaint=complaint, + update_type="note", + message=f"Department response submitted (verified) from {explanation.staff.get_full_name()}", + metadata={"investigation_id": str(investigation.id), "response_count": len(responses)}, + ) + + if requires_improvement_project == "yes": + ComplaintUpdate.objects.create( + complaint=complaint, + update_type="note", + message=f"Improvement project recommended: {improvement_project_note}", + metadata={ + "investigation_id": str(investigation.id), + "flag": "improvement_project", + "negligence": negligence_finding, + "policy_issue": policy_issue_finding, + "note": improvement_project_note, + }, + ) + + return render(request, "complaints/explanation_success.html", { + "complaint": complaint, "explanation": explanation, "attachment_count": 0, + }) + + # Unknown action + return render(request, "complaints/investigation_review.html", { + **base_ctx, "final_reply": final_reply, + "error": "Invalid action.", + }) + + # GET: show review page (auto-show code entry if OTP was previously sent and still valid) + from datetime import timedelta + + show_otp = bool( + investigation.otp_code + and investigation.otp_sent_at + and timezone.now() <= investigation.otp_sent_at + timedelta(minutes=10) + ) + return render(request, "complaints/investigation_review.html", { + **base_ctx, + "otp_sent": show_otp, }) @@ -4435,6 +4984,21 @@ def generate_complaint_pdf(request, pk): # Render HTML template with comprehensive data from django.template.loader import render_to_string + # Load logo for the letterhead + import io + import base64 + from PIL import Image as PILImage + + logo_path = None + try: + logo_img = PILImage.open(settings.BASE_DIR / "static" / "img" / "HH_P_ICON.png") + logo_img.thumbnail((600, 600), PILImage.LANCZOS) + _buf = io.BytesIO() + logo_img.save(_buf, format="PNG", optimize=True) + logo_path = "data:image/png;base64," + base64.b64encode(_buf.getvalue()).decode() + except Exception: + pass + # Get explanations with their acceptance status explanations = complaint.explanations.all().select_related("staff", "accepted_by").prefetch_related("attachments") @@ -4456,10 +5020,7 @@ def generate_complaint_pdf(request, pk): "timeline": timeline, "px_actions": px_actions, "generated_at": timezone.now(), - "css_system_name": _("PX360 Complaint Management"), - "css_page_label": _("Page"), - "css_of_label": _("of"), - "css_generated_label": _("Generated"), + "logo_path": logo_path, }, ) @@ -4467,7 +5028,7 @@ def generate_complaint_pdf(request, pk): try: from weasyprint import HTML - pdf_file = HTML(string=html_string).write_pdf() + pdf_file = HTML(string=html_string, base_url=str(settings.BASE_DIR / "static")).write_pdf() # Create response response = HttpResponse(pdf_file, content_type="application/pdf") @@ -4651,3 +5212,17 @@ Generate JSON with "summary_en" and "summary_ar".""" return render(request, "complaints/inquiry_response_success_token.html", {"inquiry": inquiry}) return render(request, "complaints/inquiry_response_form_token.html", {"inquiry": inquiry}) + + +@login_required +def inquiry_pdf(request, pk): + """Generate a PDF for an inquiry.""" + from .models import Inquiry + from apps.core.pdf_utils import generate_letterhead_pdf + + obj = get_object_or_404(Inquiry, id=pk) + return generate_letterhead_pdf( + "complaints/inquiry_pdf.html", + {"object": obj}, + f"inquiry_{obj.reference_number}.pdf", + ) diff --git a/apps/complaints/workflow_log.py b/apps/complaints/workflow_log.py new file mode 100644 index 0000000..ed01201 --- /dev/null +++ b/apps/complaints/workflow_log.py @@ -0,0 +1,130 @@ +""" +Workflow timeline builder for the complaint department-response flow. + +Assembles a chronological list of events from ComplaintInvolvedDepartment, +ComplaintExplanation, ChampionInvestigation, InvestigationResponse, +InvestigationAnswer, and ComplaintUpdate — so the template can render +a visual timeline of the entire workflow. +""" + +from datetime import datetime + + +def build_workflow_log(complaint): + """Return a chronologically sorted list of workflow events for a complaint.""" + events = [] + + # 1. Sent to department(s) + for idept in complaint.involved_departments.select_related("department", "added_by").all(): + ts = idept.forwarded_at or idept.sent_at + if ts: + events.append({ + "type": "sent_to_dept", + "timestamp": ts, + "actor": idept.added_by.get_full_name() if idept.added_by else "PX Team", + "department": idept.department.get_localized_name() if hasattr(idept.department, 'get_localized_name') else (idept.department.name if idept.department else ""), + "is_primary": idept.is_primary, + }) + + # 2. Explanations (direct replies + investigations) + for exp in complaint.explanations.select_related("staff", "staff__department", "requested_by").all(): + champion_name = exp.staff.get_full_name() if exp.staff else "Department" + + # Email sent timestamp + if exp.email_sent_at: + note = getattr(exp, "request_message", "") or "" + events.append({ + "type": "explanation_sent", + "timestamp": exp.email_sent_at, + "actor": "PX Team", + "recipient": champion_name, + "note": note, + "attachment_count": exp.attachments.count(), + }) + + # Investigations linked to this explanation + investigations = list( + exp.investigation.select_related("champion", "champion__department").all() + ) + + if investigations: + for inv in investigations: + inv_ts = inv.created_at + events.append({ + "type": "investigation_started", + "timestamp": inv_ts, + "actor": inv.champion.get_full_name() if inv.champion else champion_name, + "status": inv.status, + }) + + # Per-staff: questions sent + responses + for resp in inv.responses.select_related("staff", "staff__department").all(): + staff_name = resp.staff.get_full_name() if resp.staff else "Unknown" + + # Questions sent to this staff + q_sent_ts = resp.email_sent_at or inv_ts + questions = list(resp.questions.order_by("order").all()) + events.append({ + "type": "questions_sent", + "timestamp": q_sent_ts, + "actor": inv.champion.get_full_name() if inv.champion else champion_name, + "staff": staff_name, + "question_count": len(questions), + "questions": [ + {"text": q.question_text, "type": q.question_type} + for q in questions + ], + }) + + # Staff responded + if resp.is_completed and resp.completed_at: + qa_pairs = [] + for ans in resp.answers.select_related("question").all(): + qa_pairs.append({ + "question": ans.question.question_text, + "question_type": ans.question.question_type, + "answer": ans.answer_text, + }) + events.append({ + "type": "staff_responded", + "timestamp": resp.completed_at, + "actor": staff_name, + "investigator": inv.champion.get_full_name() if inv.champion else "Department Champion", + "qa_pairs": qa_pairs, + }) + else: + events.append({ + "type": "staff_pending", + "timestamp": q_sent_ts, + "actor": staff_name, + "question_count": len(questions), + }) + + # Final reply submitted + if inv.status == "reply_submitted" and exp.responded_at: + events.append({ + "type": "reply_submitted", + "timestamp": exp.responded_at, + "actor": inv.champion.get_full_name() if inv.champion else champion_name, + "final_reply": inv.final_reply, + "negligence": inv.negligence_finding, + "policy_issue": inv.policy_issue_finding, + "improvement_project": inv.requires_improvement_project, + "improvement_note": inv.improvement_project_note, + "attachment_count": exp.attachments.count(), + }) + else: + # Direct reply (no investigation) + if exp.is_used and exp.responded_at: + events.append({ + "type": "direct_reply", + "timestamp": exp.responded_at, + "actor": champion_name, + "reply": exp.explanation, + "attachment_count": exp.attachments.count(), + }) + + # Sort by timestamp (None timestamps go last) + events.sort(key=lambda e: e.get("timestamp") or datetime.max) + + return events diff --git a/apps/core/ai_service.py b/apps/core/ai_service.py index c4d2dca..65b8cdc 100644 --- a/apps/core/ai_service.py +++ b/apps/core/ai_service.py @@ -158,6 +158,10 @@ class AIService: with httpx.Client(timeout=timeout) as client: resp = client.post(url, headers=headers, json=payload) + + if resp.status_code in (401, 402): + cls._notify_ai_failure(resp.status_code, resp.text) + resp.raise_for_status() data = resp.json() @@ -165,6 +169,102 @@ class AIService: logger.info(f"AI Response: length={len(content)}") return content + @classmethod + def _notify_ai_failure(cls, status_code, error_body=""): + """Notify PX Admins when AI service fails due to credits or auth issues. + + Debounced via Django cache — only fires once per hour. + """ + try: + from django.core.cache import cache + cache_key = "ai_service_failure_notified" + if cache.get(cache_key): + return + + cache.set(cache_key, True, timeout=3600) + + from apps.accounts.models import User + from apps.notifications.services import NotificationService + + px_admins = User.objects.filter(groups__name="PX Admin", is_active=True) + if not px_admins.exists(): + logger.warning("No PX Admin users found to notify about AI failure") + return + + timestamp = timezone.now().strftime("%Y-%m-%d %H:%M:%S") + + if status_code == 402: + subject = f"🚨 AI Service Unavailable — Credits Exhausted ({timestamp})" + severity = "Credits Exhausted" + action = ( + "Top up credits at https://openrouter.ai/credits " + "or update OPENROUTER_API_KEY with a funded account." + ) + impact = ( + "AI complaint classification, survey analysis, observation analysis, " + "executive summaries, and analytics are all degraded. " + "New complaints will default to severity=medium, priority=medium until resolved." + ) + else: + subject = f"🚨 AI Service Error — Authentication Failed ({timestamp})" + severity = "Authentication Failed" + action = ( + "Check the OPENROUTER_API_KEY in settings or the hardcoded key in ai_service.py. " + "The API key may be invalid or revoked." + ) + impact = "All AI-powered features are unavailable until the API key is fixed." + + body_preview = error_body[:500] if error_body else "No response body" + + plain_text = ( + f"AI Service Failure — {severity}\n" + f"Timestamp: {timestamp}\n" + f"HTTP Status: {status_code}\n" + f"Response: {body_preview}\n\n" + f"Impact: {impact}\n\n" + f"Action required: {action}\n" + ) + + red = "#dc2626" if status_code == 402 else "#ea580c" + html_message = f""" +
+
+

🚨 AI Service — {severity}

+

{timestamp}

+
+
+

HTTP Status: {status_code}

+
+
{body_preview}
+
+
+

Impact: {impact}

+
+
+

Action required: {action}

+
+
+
+ """ + + for admin in px_admins: + try: + NotificationService.send_email( + email=admin.email, + subject=subject, + message=plain_text, + html_message=html_message, + user=admin, + notification_type="system", + ) + except Exception: + logger.error(f"Failed to send AI failure notification to {admin.email}") + + logger.warning(f"AI service failure notification sent to {px_admins.count()} PX Admins (status {status_code})") + + except Exception as e: + logger.error(f"Failed to send AI failure notification: {e}") + @classmethod def _get_model(cls) -> str: """Get AI model from settings""" diff --git a/apps/core/config_urls.py b/apps/core/config_urls.py index 8a46ad7..fae505a 100644 --- a/apps/core/config_urls.py +++ b/apps/core/config_urls.py @@ -13,6 +13,8 @@ urlpatterns = [ path("sla/", config_views.sla_config_list, name="sla_config_list"), path("routing/", config_views.routing_rules_list, name="routing_rules_list"), path("users/", config_views.hospital_users_list, name="hospital_users_list"), + path("users/create/", config_views.user_create, name="user_create"), + path("users//edit/", config_views.user_edit, name="user_edit"), path("users//reset-password/", config_views.reset_user_password, name="reset_user_password"), path("users//toggle-active/", config_views.toggle_user_active, name="toggle_user_active"), path("test/", config_views.test, name="test"), diff --git a/apps/core/config_views.py b/apps/core/config_views.py index 689e09e..9c738a8 100644 --- a/apps/core/config_views.py +++ b/apps/core/config_views.py @@ -199,6 +199,117 @@ def hospital_users_list(request): return render(request, "config/hospital_users.html", context) +@admin_required +def user_create(request): + """Create a new user from the config console""" + from apps.accounts.forms import UserCreateForm + + if not request.user.is_px_admin() and not request.user.is_hospital_admin(): + from django.http import HttpResponseForbidden + return HttpResponseForbidden(_("You don't have permission to create users.")) + + if request.method == "POST": + form = UserCreateForm(request.POST, request=request) + if form.is_valid(): + user = form.save() + generated_password = getattr(form, '_generated_password', None) + + staff_id = request.POST.get("staff_id") + if staff_id: + from apps.organizations.models import Staff + try: + staff = Staff.objects.get(pk=staff_id, user__isnull=True) + staff.user = user + staff.save(update_fields=["user"]) + messages.success(request, _("User '{}' created and linked to staff '{}'.").format( + user.get_full_name(), staff.first_name + " " + staff.last_name + )) + except Staff.DoesNotExist: + messages.success(request, _("User '{}' created successfully.").format(user.get_full_name())) + else: + messages.success(request, _("User '{}' created successfully.").format(user.get_full_name())) + + try: + base_url = f"{request.scheme}://{request.get_host()}" + reset_token = PasswordResetTokenService.create_reset_token(user) + reset_url = PasswordResetTokenService.build_reset_url(base_url, reset_token) + + if generated_password: + html_message = render_to_string( + "config/emails/user_created_email.html", + {"user": user, "reset_url": reset_url, "temp_password": generated_password}, + request=request, + ) + plain_message = ( + f"Dear {user.get_full_name()},\n\n" + f"An account has been created for you on PX360.\n\n" + f"Your temporary password: {generated_password}\n\n" + f"For security, please set your own password using the link below:\n{reset_url}\n\n" + f"This link expires in 24 hours." + ) + subject = _("Your PX360 Account Has Been Created") + else: + html_message = render_to_string( + "config/emails/reset_password_email.html", + {"user": user, "reset_url": reset_url}, + request=request, + ) + plain_message = ( + f"Dear {user.get_full_name()},\n\n" + f"An account has been created for you on PX360.\n\n" + f"Use the link below to set your password:\n{reset_url}\n\n" + f"This link expires in 24 hours." + ) + subject = _("Your PX360 Account Has Been Created") + + NotificationService.send_email( + email=user.email, + subject=subject, + message=plain_message, + html_message=html_message, + user=user, + notification_type="system", + ) + if generated_password: + messages.info(request, _("Credentials sent to {}.").format(user.email)) + else: + messages.info(request, _("Password setup link sent to {}.").format(user.email)) + except Exception as e: + messages.warning(request, _("User created but email sending failed: {}").format(str(e))) + + return redirect("config:hospital_users_list") + else: + form = UserCreateForm(request=request) + + context = {"form": form} + return render(request, "config/user_form.html", context) + + +@admin_required +def user_edit(request, user_id): + """Edit an existing user from the config console""" + from apps.accounts.forms import UserEditForm + + target_user = get_object_or_404(User, pk=user_id, is_superuser=False, is_provisional=False) + + if not request.user.is_px_admin(): + if request.tenant_hospital and target_user.hospital != request.tenant_hospital: + from django.http import HttpResponseForbidden + return HttpResponseForbidden(_("You can only edit users in your hospital.")) + + if request.method == "POST": + form = UserEditForm(request.POST, instance=target_user, request=request) + if form.is_valid(): + form.save() + messages.success(request, _("User '{}' updated successfully.").format(target_user.get_full_name())) + return redirect("config:hospital_users_list") + else: + form = UserEditForm(instance=target_user, request=request) + + context = {"form": form, "edit_user": target_user} + return render(request, "config/user_form.html", context) + + @admin_required def reset_user_password(request, user_id): """Reset a user's password and send them the new credentials via email.""" diff --git a/apps/core/context_processors.py b/apps/core/context_processors.py index de02cea..2b95914 100644 --- a/apps/core/context_processors.py +++ b/apps/core/context_processors.py @@ -113,7 +113,7 @@ def hospital_context(request): hospitals_list = list( Hospital.objects.filter(status="active") .order_by("name") - .values("id", "name", "display_name", "display_name_ar", "code") + .values("id", "name", "name_ar", "display_name", "display_name_ar", "code") ) # Source user context diff --git a/apps/core/decorators.py b/apps/core/decorators.py index 747dd59..4d46c1d 100644 --- a/apps/core/decorators.py +++ b/apps/core/decorators.py @@ -32,7 +32,7 @@ def px_admin_required(view_func): def _wrapped_view(request, *args, **kwargs): if not request.user.is_px_admin(): messages.error(request, _("Access denied. PX Admin privileges required.")) - return redirect("analytics:command_center") + return redirect("dashboard:command-center") return view_func(request, *args, **kwargs) @@ -54,7 +54,7 @@ def hospital_admin_required(view_func): def _wrapped_view(request, *args, **kwargs): if not (request.user.is_px_admin() or request.user.is_hospital_admin()): messages.error(request, _("Access denied. Hospital Admin privileges required.")) - return redirect("analytics:command_center") + return redirect("dashboard:command-center") return view_func(request, *args, **kwargs) @@ -76,7 +76,7 @@ def admin_required(view_func): def _wrapped_view(request, *args, **kwargs): if not (request.user.is_px_admin() or request.user.is_hospital_admin() or request.user.is_department_manager()): messages.error(request, _("Access denied. Admin privileges required.")) - return redirect("analytics:command_center") + return redirect("dashboard:command-center") return view_func(request, *args, **kwargs) @@ -103,7 +103,7 @@ def px_employee_required(view_func): user.is_px_admin() or user.is_hospital_admin() or user.is_department_manager() or user.is_px_management() or user.is_px_employee() ): messages.error(request, _("Access denied. PX Management privileges required.")) - return redirect("analytics:command_center") + return redirect("dashboard:command-center") return view_func(request, *args, **kwargs) diff --git a/apps/core/pdf_utils.py b/apps/core/pdf_utils.py new file mode 100644 index 0000000..fd83cbe --- /dev/null +++ b/apps/core/pdf_utils.py @@ -0,0 +1,39 @@ +""" +Shared PDF generation helper for any model using the hospital letterhead. +""" + +import io +import base64 + +from django.conf import settings +from django.template.loader import render_to_string +from weasyprint import HTML + + +def _get_logo_data_uri(): + """Load the HH_P_ICON as a base64 data URI for embedding in PDF.""" + try: + from PIL import Image as PILImage + + logo_img = PILImage.open(settings.BASE_DIR / "static" / "img" / "HH_P_ICON.png") + logo_img.thumbnail((600, 600), PILImage.LANCZOS) + buf = io.BytesIO() + logo_img.save(buf, format="PNG", optimize=True) + return "data:image/png;base64," + base64.b64encode(buf.getvalue()).decode() + except Exception: + return None + + +def generate_letterhead_pdf(template_name, context, filename): + """Render a template with the hospital letterhead and return an HttpResponse with the PDF.""" + from django.http import HttpResponse + + logo_path = _get_logo_data_uri() + full_context = {**context, "logo_path": logo_path} + + html_string = render_to_string(template_name, full_context) + pdf_file = HTML(string=html_string, base_url=str(settings.BASE_DIR / "static")).write_pdf() + + response = HttpResponse(pdf_file, content_type="application/pdf") + response["Content-Disposition"] = f'attachment; filename="{filename}"' + return response diff --git a/apps/core/views.py b/apps/core/views.py index ba3fbb0..6e40602 100644 --- a/apps/core/views.py +++ b/apps/core/views.py @@ -215,7 +215,13 @@ def public_inquiry_submit(request): section = Section.objects.filter(id=section_id).first() if section_id else None area = Area.objects.filter(id=area_id).first() if area_id else None + # Auto-link patient by phone (local first, then HIS). Never blocks creation. + from apps.organizations.patient_lookup import find_or_link_patient + + linked_patient = find_or_link_patient(phone=phone, hospital=hospital) + inquiry = Inquiry.objects.create( + patient=linked_patient, hospital=hospital, contact_name=name, contact_email=email, @@ -295,7 +301,7 @@ def api_hospitals(request): """ from apps.organizations.models import Hospital - hospitals = Hospital.objects.all().order_by("name").values("id", "name") + hospitals = Hospital.objects.all().order_by("name").values("id", "name", "name_ar") return JsonResponse({"success": True, "hospitals": list(hospitals)}) @@ -527,6 +533,8 @@ def _track_complaint(reference): "response": response, "satisfaction": complaint.satisfaction or "", "satisfaction_set_at": complaint.satisfaction_set_at.strftime("%Y-%m-%d %H:%M") if complaint.satisfaction_set_at else None, + "satisfaction_locked_by_patient": complaint.satisfaction_locked_by_patient, + "satisfaction_locked_at": complaint.satisfaction_locked_at.strftime("%Y-%m-%d %H:%M") if complaint.satisfaction_locked_at else None, }) @@ -790,8 +798,21 @@ def public_set_satisfaction(request): if obj.status not in ("resolved", "closed"): return JsonResponse({"success": False, "error": "Satisfaction can only be set for resolved items."}, status=400) + # Refuse if patient has already locked satisfaction (complaints only). + if hasattr(obj, "satisfaction_locked_by_patient") and obj.satisfaction_locked_by_patient: + return JsonResponse({"success": False, "error": "Satisfaction has already been submitted and locked."}, status=400) + obj.satisfaction = satisfaction obj.satisfaction_set_at = timezone.now() - obj.save(update_fields=["satisfaction", "satisfaction_set_at", "updated_at"]) + + update_fields = ["satisfaction", "satisfaction_set_at", "updated_at"] + + # Lock satisfaction on complaints (patient submission is authoritative). + if hasattr(obj, "satisfaction_locked_by_patient"): + obj.satisfaction_locked_by_patient = True + obj.satisfaction_locked_at = timezone.now() + update_fields += ["satisfaction_locked_by_patient", "satisfaction_locked_at"] + + obj.save(update_fields=update_fields) return JsonResponse({"success": True, "satisfaction": obj.satisfaction}) diff --git a/apps/executive_summary/templates/executive/dashboard.html b/apps/executive_summary/templates/executive/dashboard.html index 8834db1..a944fdc 100644 --- a/apps/executive_summary/templates/executive/dashboard.html +++ b/apps/executive_summary/templates/executive/dashboard.html @@ -26,7 +26,7 @@ {% endif %} diff --git a/apps/executive_summary/templates/executive/insights.html b/apps/executive_summary/templates/executive/insights.html index 9afe362..1fa2c7a 100644 --- a/apps/executive_summary/templates/executive/insights.html +++ b/apps/executive_summary/templates/executive/insights.html @@ -84,7 +84,7 @@
diff --git a/apps/feedback/urls.py b/apps/feedback/urls.py index 82e5f35..94b66df 100644 --- a/apps/feedback/urls.py +++ b/apps/feedback/urls.py @@ -20,6 +20,7 @@ urlpatterns = [ path("/assign/", views.feedback_assign, name="feedback_assign"), path("/change-status/", views.feedback_change_status, name="feedback_change_status"), path("/send-to-department/", views.feedback_send_to_department, name="feedback_send_to_department"), + path("/send-to/", views.feedback_send_to, name="feedback_send_to"), path("/add-response/", views.feedback_add_response, name="feedback_add_response"), # Toggle actions path("/toggle-featured/", views.feedback_toggle_featured, name="feedback_toggle_featured"), diff --git a/apps/feedback/views.py b/apps/feedback/views.py index f8ff0fd..ccf11b7 100644 --- a/apps/feedback/views.py +++ b/apps/feedback/views.py @@ -250,6 +250,9 @@ def feedback_detail(request, pk): "timeline": timeline, "attachments": attachments, "assignable_users": assignable_users, + "departments": Department.objects.filter( + hospital=feedback.hospital, status="active" + ).order_by("name"), "status_choices": FeedbackStatus.choices, "can_edit": ( user.is_px_admin() @@ -258,6 +261,12 @@ def feedback_detail(request, pk): or user.is_px_employee() ), "can_admin": user.is_px_admin() or user.is_hospital_admin(), + "can_send_to_department": ( + user.is_px_admin() + or user.is_hospital_admin() + or user.is_px_management() + or user.is_px_employee() + ), "linked_rcas": linked_rcas, "content_type_id": feedback_ct.pk, "object_id": feedback.pk, @@ -310,7 +319,13 @@ def feedback_create(request): try: hospital = Hospital.objects.get(id=hospital_id) + # Auto-link patient by phone (local first, then HIS). Never blocks creation. + from apps.organizations.patient_lookup import find_or_link_patient + + linked_patient = find_or_link_patient(phone=contact_phone, hospital=hospital) + feedback = Feedback( + patient=linked_patient, hospital=hospital, feedback_type=FeedbackType.SUGGESTION, title=title, @@ -958,7 +973,13 @@ def public_suggestion_submit(request): "other": FeedbackCategory.OTHER, } + # Auto-link patient by phone (local first, then HIS). Never blocks creation. + from apps.organizations.patient_lookup import find_or_link_patient + + linked_patient = find_or_link_patient(phone=contact_phone, hospital=hospital) + feedback = Feedback( + patient=linked_patient, hospital=hospital, feedback_type=FeedbackType.SUGGESTION, title=title, @@ -1110,3 +1131,166 @@ def feedback_send_to_department(request, pk): messages.success(request, f"Suggestion sent to {dept.name}.") return redirect("feedback:feedback_detail", pk=pk) + + +@login_required +@require_http_methods(["POST"]) +def feedback_send_to(request, pk): + """ + Unified AJAX endpoint to send feedback/suggestion to a department. + Awareness-only: no response required from the department. + """ + import logging + + from apps.notifications.services import NotificationService + + logger = logging.getLogger(__name__) + + feedback = get_object_or_404(Feedback, pk=pk, is_deleted=False) + user = request.user + + if not ( + user.is_px_admin() + or user.is_hospital_admin() + or user.is_px_management() + or user.is_px_employee() + ): + return JsonResponse( + {"success": False, "error": "You don't have permission to send this feedback."}, + status=403, + ) + + recipient_type = request.POST.get("recipient_type", "department") + note = request.POST.get("note", "").strip() + + try: + if recipient_type == "person": + person_id = request.POST.get("person_id") + if not person_id: + return JsonResponse( + {"success": False, "error": "Please select a person."}, + status=400, + ) + + try: + person = User.objects.get(id=person_id) + except User.DoesNotExist: + return JsonResponse( + {"success": False, "error": "User not found."}, + status=400, + ) + + feedback.assigned_to = person + feedback.assigned_at = timezone.now() + feedback.save(update_fields=["assigned_to", "assigned_at"]) + + if person.email: + try: + NotificationService.send_email( + email=person.email, + subject=f"Feedback Assigned - {feedback.title or 'Untitled'}", + message=( + f"Dear {person.get_full_name()},\n\n" + f"You have been assigned to the following feedback:\n\n" + f"Title: {feedback.title or 'Untitled'}\n" + f"Type: {feedback.get_feedback_type_display()}\n" + f"Message: {feedback.message[:500]}\n\n" + f"{'Additional note: ' + note if note else ''}" + ), + related_object=feedback, + user=person, + ) + except Exception as e: + logger.warning(f"Failed to send feedback assignment email: {e}") + + response_msg = f"Feedback sent to {person.get_full_name()}." + + else: # department + department_id = request.POST.get("department_id") + if not department_id: + return JsonResponse( + {"success": False, "error": "Please select a department."}, + status=400, + ) + + try: + department = Department.objects.select_related("champion", "manager").get( + pk=department_id, status="active" + ) + except Department.DoesNotExist: + return JsonResponse( + {"success": False, "error": "Department not found."}, + status=400, + ) + + # Auto-target the department's champion and manager (no contact-person picker) + from apps.organizations.department_contacts import get_champion_and_manager + + targets = get_champion_and_manager(department) + if not targets: + return JsonResponse( + { + "success": False, + "error": f"Cannot send to {department.get_localized_name()}. This department has no champion or manager assigned. Please assign one before sending.", + }, + status=400, + ) + + # Link department to feedback (awareness-only, no response required) + feedback.department = department + feedback.save(update_fields=["department", "updated_at"]) + + # Notify champion + manager (email + SMS) + notified = [] + link = f"https://{request.get_host()}/suggestions/{feedback.pk}/" + for target in targets: + display_name = ( + target["staff"].get_full_name() if target.get("staff") + else (target["user"].get_full_name() if target.get("user") else target["label"]) + ) + if target.get("email"): + try: + NotificationService.send_email( + email=target["email"], + subject=f"Feedback Notification - {feedback.title or 'Untitled'}", + message=( + f"The following feedback has been logged for your department ({department.name}):\n\n" + f"Title: {feedback.title or 'Untitled'}\n" + f"Type: {feedback.get_feedback_type_display()}\n" + f"Message: {feedback.message[:500]}\n\n" + f"This is for your awareness. No response is required.\n\n" + f"{'Additional note: ' + note if note else ''}\n\n{link}" + ), + related_object=feedback, + ) + except Exception as e: + logger.warning(f"Failed to send feedback department notification: {e}") + if target.get("phone"): + try: + NotificationService.send_sms( + target["phone"], + f"PX360: Feedback '{feedback.title or 'Untitled'}' logged for {department.name}. {link}", + related_object=feedback, + ) + except Exception: + pass + notified.append(f"{display_name} ({target['label']})") + + response_msg = f"Feedback sent to {department.get_localized_name()} — {', '.join(notified)}." + + FeedbackResponse.objects.create( + feedback=feedback, + response_type="note", + message=response_msg, + created_by=user, + is_internal=False, + ) + + return JsonResponse({"success": True, "message": response_msg}) + + except Exception as e: + logger.error(f"Error in feedback_send_to: {str(e)}") + return JsonResponse( + {"success": False, "error": "An error occurred while sending the feedback."}, + status=500, + ) diff --git a/apps/integrations/tasks.py b/apps/integrations/tasks.py index b7b6dab..acf9fc7 100644 --- a/apps/integrations/tasks.py +++ b/apps/integrations/tasks.py @@ -15,6 +15,78 @@ from django.utils import timezone logger = logging.getLogger("apps.integrations") +def _notify_his_fetch_failure(result): + """Send email notification to PX Admins when HIS survey fetch fails.""" + try: + from apps.accounts.models import User + from apps.notifications.services import NotificationService + + px_admins = User.objects.filter(groups__name="PX Admin", is_active=True) + if not px_admins.exists(): + logger.warning("No PX Admin users found to notify about HIS fetch failure") + return + + error_list = "\n".join(f" • {e}" for e in result.get("errors", [])) + details = result.get("details", []) + failed_clients = [d for d in details if d.get("errors")] + client_summary = "\n".join( + f" • {d['config']}: {'; '.join(d['errors'])}" for d in failed_clients + ) if failed_clients else "See errors above." + + timestamp = timezone.now().strftime("%Y-%m-%d %H:%M:%S") + subject = f"⚠️ HIS Survey Fetch Failed — PX360 ({timestamp})" + + plain_text = ( + f"HIS Survey Fetch Task — Failure Report\n" + f"Timestamp: {timestamp}\n\n" + f"Clients processed: {result.get('clients_processed', 0)}\n" + f"Total errors: {len(result.get('errors', []))}\n\n" + f"Errors:\n{error_list or 'None'}\n\n" + f"Failed clients:\n{client_summary}\n\n" + f"Action required: Check HIS API credentials, network connectivity, " + f"and IntegrationConfig status.\n" + ) + + html_message = f""" +
+
+

⚠️ HIS Survey Fetch Failed

+

{timestamp}

+
+
+

Clients processed: {result.get('clients_processed', 0)}

+

Total errors: {len(result.get('errors', []))}

+

Errors:

+
+
{error_list or 'None'}
+
+
+

+ Action required: Check HIS API credentials, network connectivity, + and IntegrationConfig status in the PX360 admin panel. +

+
+
+
+ """ + + for admin in px_admins: + try: + NotificationService.send_email( + email=admin.email, + subject=subject, + message=plain_text, + html_message=html_message, + user=admin, + notification_type="system", + ) + except Exception: + logger.error(f"Failed to send HIS failure notification to {admin.email}") + + except Exception as e: + logger.error(f"Failed to send HIS fetch failure notification: {e}") + + # ============================================================================= # HIS Survey Fetching Tasks # ============================================================================= @@ -170,6 +242,9 @@ def fetch_his_surveys(from_date_str=None, to_date_str=None): logger.error(error_msg, exc_info=True) result["errors"].append(error_msg) + if result["errors"]: + _notify_his_fetch_failure(result) + return result diff --git a/apps/notifications/views.py b/apps/notifications/views.py index 535648a..27b5ed8 100644 --- a/apps/notifications/views.py +++ b/apps/notifications/views.py @@ -301,7 +301,7 @@ def notification_settings_update(request, hospital_id=None): if request.headers.get("X-Requested-With") == "XMLHttpRequest": return JsonResponse({"success": False, "error": "No hospital assigned"}, status=400) messages.error(request, "No hospital assigned. Please contact your administrator.") - return redirect("analytics:command_center") + return redirect("dashboard:command-center") settings = HospitalNotificationSettings.get_for_hospital(hospital.id) @@ -364,7 +364,7 @@ def update_quiet_hours(request, hospital_id=None): hospital = _get_notification_hospital(request, hospital_id) if not hospital: messages.error(request, "No hospital assigned. Please contact your administrator.") - return redirect("analytics:command_center") + return redirect("dashboard:command-center") settings = HospitalNotificationSettings.get_for_hospital(hospital.id) @@ -389,7 +389,7 @@ def test_notification(request, hospital_id=None): hospital = _get_notification_hospital(request, hospital_id) if not hospital: messages.error(request, "No hospital assigned. Please contact your administrator.") - return redirect("analytics:command_center") + return redirect("dashboard:command-center") settings = HospitalNotificationSettings.get_for_hospital(hospital.id) channel = request.POST.get("channel", "email") diff --git a/apps/observations/models.py b/apps/observations/models.py index 1870900..66d22c0 100644 --- a/apps/observations/models.py +++ b/apps/observations/models.py @@ -17,6 +17,7 @@ from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelatio from django.contrib.contenttypes.models import ContentType from django.db import models from django.utils import timezone +from django.utils.translation import gettext_lazy as _ from apps.core.models import SoftDeleteModel, TimeStampedModel, UUIDModel from apps.organizations.models import LocationType @@ -33,19 +34,19 @@ def generate_tracking_code(): class ObservationSeverity(models.TextChoices): """Observation severity choices.""" - LOW = "low", "Low" - MEDIUM = "medium", "Medium" - HIGH = "high", "High" - CRITICAL = "critical", "Critical" + LOW = "low", _("Low") + MEDIUM = "medium", _("Medium") + HIGH = "high", _("High") + CRITICAL = "critical", _("Critical") class ObservationStatus(models.TextChoices): """Observation status choices.""" - OPEN = "open", "Open" - IN_PROGRESS = "in_progress", "In Progress" - RESOLVED = "resolved", "Resolved" - CLOSED = "closed", "Closed" + OPEN = "open", _("Open") + IN_PROGRESS = "in_progress", _("In Progress") + RESOLVED = "resolved", _("Resolved") + CLOSED = "closed", _("Closed") VALID_OBSERVATION_TRANSITIONS = { diff --git a/apps/observations/urls.py b/apps/observations/urls.py index 7b956b9..9b0ffad 100644 --- a/apps/observations/urls.py +++ b/apps/observations/urls.py @@ -94,4 +94,5 @@ urlpatterns = [ # ========================================================================== path("/delete/", views.observation_soft_delete, name="observation_soft_delete"), path("/restore/", views.observation_restore, name="observation_restore"), + path("/pdf/", views.observation_pdf, name="observation_pdf"), ] diff --git a/apps/observations/views.py b/apps/observations/views.py index 60c0ce5..664891a 100644 --- a/apps/observations/views.py +++ b/apps/observations/views.py @@ -1518,24 +1518,15 @@ def observation_send_to(request, pk): "error": str(_("Department not found.")), }, status=400) - if not department.champion and not department.manager: - return JsonResponse({ - "success": False, - "error": str(_(f"Cannot send to {department.get_localized_name()}. This department has no champion or manager assigned.")), - }, status=400) + # Auto-target the department's champion and manager (no contact-person picker) + from apps.organizations.department_contacts import get_champion_and_manager + from apps.notifications.services import NotificationService - contact_person_id = request.POST.get("contact_person_id") - if not contact_person_id: + targets = get_champion_and_manager(department) + if not targets: return JsonResponse({ "success": False, - "error": str(_("Please select a contact person.")), - }, status=400) - - contact_info = department.is_valid_contact_person(contact_person_id) - if not contact_info: - return JsonResponse({ - "success": False, - "error": str(_("Selected person is not a role holder in this department.")), + "error": str(_(f"Cannot send to {department.get_localized_name()}. This department has no champion or manager assigned. Please assign one before sending.")), }, status=400) # Send to department @@ -1553,7 +1544,36 @@ def observation_send_to(request, pk): observation.dept_response_second_reminder_sent_at = None observation.dept_response_escalated_at = None - message = f"Observation sent to {department.get_localized_name()} — {contact_info['name']} ({contact_info['role_label']})." + # Notify champion + manager (email + SMS) with the observation link + notified = [] + link = f"https://{request.get_host()}/observations/{observation.pk}/" + for target in targets: + display_name = ( + target["staff"].get_full_name() if target.get("staff") + else (target["user"].get_full_name() if target.get("user") else target["label"]) + ) + if target.get("email"): + try: + NotificationService.send_email( + email=target["email"], + subject=f"Observation Sent to Department - {observation.reference_number}", + message=f"Observation #{observation.reference_number} has been sent to your department ({department.name}).\n\n{link}", + related_object=observation, + ) + except Exception: + pass + if target.get("phone"): + try: + NotificationService.send_sms( + target["phone"], + f"PX360: Observation #{observation.reference_number} sent to {department.name}. Review: {link}", + related_object=observation, + ) + except Exception: + pass + notified.append(f"{display_name} ({target['label']})") + + message = f"Observation sent to {department.get_localized_name()} — {', '.join(notified)}." old_status_before_send = observation.status observation.contact_status = "contacted" @@ -1569,16 +1589,6 @@ def observation_send_to(request, pk): is_internal=True, ) - # Send department notification if applicable - if recipient_type == "department": - try: - from apps.notifications.settings_service import NotificationServiceWithSettings - NotificationServiceWithSettings.send_observation_department_assigned( - department, observation, context_note_en=note, context_note_ar="", - ) - except Exception as e: - logger.warning(f"Failed to send department notification: {e}") - return JsonResponse({ "success": True, "message": message, @@ -2174,3 +2184,13 @@ Generate JSON with "summary_en" and "summary_ar".""" return render(request, "observations/response_success_token.html", {"observation": observation}) return render(request, "observations/response_form_token.html", {"observation": observation}) + +@login_required +def observation_pdf(request, pk): + from apps.core.pdf_utils import generate_letterhead_pdf + obj = get_object_or_404(Observation, id=pk) + return generate_letterhead_pdf( + 'observations/observation_pdf.html', + {'object': obj}, + f'observation_{obj.tracking_code}.pdf', + ) diff --git a/apps/organizations/department_contacts.py b/apps/organizations/department_contacts.py new file mode 100644 index 0000000..8eaa141 --- /dev/null +++ b/apps/organizations/department_contacts.py @@ -0,0 +1,80 @@ +""" +Department contact resolution helpers. + +Used by the "Send to Department" flow across modules to auto-target a +department's champion and manager (instead of asking the user to pick a +contact person). Each target is returned with the contact channels available. +""" + +import logging + +logger = logging.getLogger(__name__) + + +def _staff_contact(staff): + """Return (email, phone) for a Staff instance, with user fallbacks.""" + email = staff.email or "" + phone = staff.phone or "" + user_id = getattr(staff, "user_id", None) + if user_id: + user = getattr(staff, "user", None) + if user: + email = email or (user.email or "") + phone = phone or (getattr(user, "phone", "") or "") + return email, phone + + +def get_champion_and_manager(department): + """Return a list of contact targets for a department's champion and manager. + + Each item is a dict: + { + "label": "Champion" | "Manager", + "email": str, # may be "" + "phone": str, # may be "" + "staff": |None, # present for the champion + "user": |None, # present for the manager + } + + Only targets that actually exist (the role FK is set) are included. + De-duplicates the case where the champion and manager are the same person. + """ + targets = [] + seen_emails = set() + + # Champion (a Staff) + champion = getattr(department, "champion", None) + if champion is not None: + email, phone = _staff_contact(champion) + email = email or (getattr(department, "champion_email", "") or "") + key = (email or "").lower() + if key not in seen_emails: + seen_emails.add(key) + targets.append( + {"label": "Champion", "email": email, "phone": phone, "staff": champion, "user": None} + ) + + # Manager (a User) + manager = getattr(department, "manager", None) + if manager is not None: + email = manager.email or "" + phone = getattr(manager, "phone", "") or "" + # If the manager also has a linked Staff profile, prefer its contact details. + staff_profile = getattr(manager, "staff_profile", None) + if staff_profile: + s_email, s_phone = _staff_contact(staff_profile) + email = email or s_email + phone = phone or s_phone + key = (email or "").lower() + if key and key not in seen_emails: + seen_emails.add(key) + targets.append( + {"label": "Manager", "email": email, "phone": phone, "staff": None, "user": manager} + ) + + return targets + + +def has_contact_target(department): + """True if the department has at least a champion or a manager to notify.""" + return bool(get_champion_and_manager(department)) diff --git a/apps/organizations/management/commands/set_department_arabic_names.py b/apps/organizations/management/commands/set_department_arabic_names.py new file mode 100644 index 0000000..ae4f563 --- /dev/null +++ b/apps/organizations/management/commands/set_department_arabic_names.py @@ -0,0 +1,175 @@ +""" +Populate the `name_ar` (Arabic name) field on Department rows from a +hard-coded English -> Arabic mapping. + +The mapping covers every department name present in the database. Keys are +normalized (case-insensitive, trailing "department" stripped, whitespace +collapsed) so that "Surgery", "Surgery Department" and "surgery department" +all resolve to the same Arabic value. + +Arabic terms are cross-referenced with +apps/complaints/management/commands/arabic_dept_mapping.py to keep the +project's Arabic vocabulary consistent. + +Usage: + python manage.py set_department_arabic_names # fill empties + python manage.py set_department_arabic_names --dry-run # preview only + python manage.py set_department_arabic_names --overwrite # re-translate all + python manage.py set_department_arabic_names --hospital-code HH-N +""" + +import re + +from django.core.management.base import BaseCommand +from django.db import transaction + +from apps.organizations.models import Department + +ENGLISH_TO_ARABIC = { + "laboratory": "قسم المختبر", + "icu": "وحدة العناية المركزة", + "security": "قسم الأمن", + "maintenance": "قسم الصيانة", + "housekeeping": "قسم النظافة", + "medical reports": "قسم التقارير الطبية", + "reception": "الاستقبال", + "administration": "الإدارة", + "surgery": "قسم الجراحة", + "cardiology": "قسم القلب", + "orthopedics": "قسم جراحة العظام", + "orthopedic": "قسم جراحة العظام", + "nursing": "قسم التمريض", + "pharmacy": "قسم الصيدلية", + "pediatrics": "قسم الأطفال", + "pediatric": "قسم الأطفال", + "emergency": "قسم الطوارئ", + "anesthesia": "قسم التخدير", + "biomedical": "قسم الهندسة الطبية الحيوية", + "contact center": "قسم مركز الاتصال", + "critical care": "قسم العناية المركزة", + "dental": "قسم الأسنان", + "dermatology": "قسم الجلدية", + "emergency administrative": "إدارة الطوارئ", + "emergency medicine": "قسم طب الطوارئ", + "executive administration": "الإدارة التنفيذية", + "facility management & maintenance": "قسم إدارة المرافق والصيانة", + "financial collection & claims": "قسم المالية والتحصيل والمطالبات", + "food services": "قسم خدمات الطعام", + "hr": "قسم الموارد البشرية", + "housekeeping & hospitality": "قسم النظافة والضيافة", + "ivf": "قسم أطفال الأنابيب", + "infection control": "قسم مكافحة العدوى", + "information technology": "قسم تقنية المعلومات", + "inpatient": "قسم التنويم", + "internal medicine": "قسم الباطنية", + "laundry": "قسم الغسيل", + "medical administration": "الإدارة الطبية", + "medical ancillary services": "قسم الخدمات الطبية المساندة", + "medical approvals": "قسم الموافقات الطبية", + "medical records": "قسم السجلات الطبية", + "oncology": "قسم الأورام", + "obstetrics & gynecology": "قسم النساء والولادة", + "operating rooms": "قسم غرف العمليات", + "operating rooms (or)": "قسم غرف العمليات", + "ophthalmology": "قسم العيون", + "outpatient": "قسم العيادات الخارجية", + "patient affairs": "قسم علاقات المرضى", + "patient experience": "قسم تجربة المريض", + "radiology": "قسم الأشعة", + "support services": "قسم الخدمات المساندة", +} + +_DEPT_SUFFIX_RE = re.compile(r"\s+department$", re.IGNORECASE) +_WS_RE = re.compile(r"\s+") + + +def _normalize_en(value: str) -> str: + """Normalize an English department name for mapping lookup.""" + if not value: + return "" + value = _DEPT_SUFFIX_RE.sub("", str(value).strip()) + value = _WS_RE.sub(" ", value).strip() + return value.lower() + + +class Command(BaseCommand): + help = "Populate Department.name_ar from a hard-coded English -> Arabic mapping" + + def add_arguments(self, parser): + parser.add_argument( + "--dry-run", + action="store_true", + help="Preview changes without writing to the database", + ) + parser.add_argument( + "--overwrite", + action="store_true", + help="Re-translate even departments that already have name_ar set", + ) + parser.add_argument( + "--hospital-code", + type=str, + help="Limit to a single hospital code (default: all hospitals)", + ) + + def handle(self, *args, **options): + dry_run = options["dry_run"] + overwrite = options["overwrite"] + hospital_code = options["hospital_code"] + + qs = Department.objects.select_related("hospital").order_by("hospital__code", "name_en", "name") + if hospital_code: + qs = qs.filter(hospital__code=hospital_code) + if not overwrite: + qs = qs.filter(name_ar="") + + self.stdout.write(self.style.MIGRATE_HEADING( + f"Department Arabic names (hospital={hospital_code or 'ALL'}, " + f"overwrite={overwrite}, dry_run={dry_run})" + )) + + updated = 0 + skipped = 0 + unmapped = [] + + with transaction.atomic(): + for dept in qs.iterator(): + key = _normalize_en(dept.name_en) or _normalize_en(dept.name) + arabic = ENGLISH_TO_ARABIC.get(key) + + if not arabic: + unmapped.append((dept, key)) + skipped += 1 + continue + + if dept.name_ar == arabic: + skipped += 1 + continue + + label = f"[{dept.hospital.code if dept.hospital else '-'}] {dept.code}: " \ + f"{dept.name_en or dept.name!r}" + if dry_run: + self.stdout.write(f" ~ {label} -> {arabic}") + else: + dept.name_ar = arabic + dept.save(update_fields=["name_ar"]) + self.stdout.write(self.style.SUCCESS(f" + {label} -> {arabic}")) + updated += 1 + + self.stdout.write("") + self.stdout.write(self.style.SUCCESS( + f"Done: {updated} {'would be ' if dry_run else ''}updated, {skipped} skipped" + )) + + if unmapped: + self.stdout.write(self.style.WARNING( + f"\n{len(unmapped)} department(s) had no mapping (left unchanged):" + )) + for dept, key in unmapped: + self.stdout.write(self.style.WARNING( + f" - [{dept.hospital.code if dept.hospital else '-'}] {dept.code}: " + f"{dept.name_en or dept.name!r} (key={key!r})" + )) + self.stdout.write(self.style.WARNING( + "\nAdd the missing keys to ENGLISH_TO_ARABIC and re-run." + )) diff --git a/apps/organizations/models.py b/apps/organizations/models.py index d72cf47..7371f58 100644 --- a/apps/organizations/models.py +++ b/apps/organizations/models.py @@ -132,7 +132,7 @@ class Hospital(UUIDModel, TimeStampedModel): verbose_name_plural = "Hospitals" def __str__(self): - return self.get_display_name() + return self.get_localized_name() def get_localized_name(self): from django.utils.translation import get_language diff --git a/apps/organizations/patient_lookup.py b/apps/organizations/patient_lookup.py new file mode 100644 index 0000000..13ba3df --- /dev/null +++ b/apps/organizations/patient_lookup.py @@ -0,0 +1,106 @@ +""" +Patient auto-link service. + +Given a national ID and/or phone number, try to find an existing Patient — first +locally, then via HIS — and return it so the calling record (complaint, inquiry, +suggestion) can link to it. Never creates a Patient from typed-only data; only +links an existing local patient or creates one from real HIS demographics. + +This function never raises: on any failure (HIS unreachable, config missing, +unexpected error) it returns None, so record creation always proceeds with +patient = NULL rather than failing. +""" + +import logging + +logger = logging.getLogger(__name__) + + +def find_or_link_patient(national_id=None, phone=None, hospital=None): + """Return a Patient that matches the given identifiers, or None. + + Lookup order: + 1. Local Patient table — by national_id_hash (exact), then by phone (exact). + 2. HIS — if not found locally, query HIS by SSN/MobileNo; if a match is + returned, materialize it as a local Patient via HISAdapter and link it. + 3. None — if neither local nor HIS yields a match (or HIS is unavailable). + + Args: + national_id (str|None): Patient national ID / Iqama. + phone (str|None): Patient phone number. + hospital: Optional Hospital instance (used when creating from HIS data). + + Returns: + Patient instance or None. + """ + + national_id = (national_id or "").strip() + phone = (phone or "").strip() + + if not national_id and not phone: + return None + + # 1. Local lookup + patient = _lookup_local(national_id, phone) + if patient is not None: + return patient + + # 2. HIS lookup (only if integration is configured and reachable) + patient = _lookup_his(national_id, phone, hospital) + return patient # may be None + + +def _lookup_local(national_id, phone): + from apps.core.encryption import compute_national_id_hash + from apps.organizations.models import Patient + + if national_id: + nid_hash = compute_national_id_hash(national_id) + if nid_hash: + patient = Patient.objects.filter(national_id_hash=nid_hash, status="active").first() + if patient: + return patient + + if phone: + patient = Patient.objects.filter(phone=phone, status="active").first() + if patient: + return patient + + return None + + +def _lookup_his(national_id, phone, hospital): + """Query HIS and, on a hit, materialize a local Patient from the demographics.""" + try: + from apps.integrations.models import IntegrationConfig + from apps.integrations.services.his_adapter import HISAdapter + from apps.integrations.services.his_client import HISClient + except Exception: + # Integrations app unavailable — not configured. + return None + + config = IntegrationConfig.objects.filter(source_system__in=["his", "other"]).first() + if not config: + return None + + try: + client = HISClient(config) + patients = client.fetch_patient_by_identifier(ssn=national_id or None, mobile_no=phone or None) + except Exception as e: + logger.info("HIS patient lookup failed (network/config): %s", e) + return None + + if not patients: + return None + + # Use the first HIS match to get-or-create a local Patient. + his_patient = patients[0] + try: + his_hospital = HISAdapter.get_or_create_hospital(his_patient) + target_hospital = hospital or his_hospital + if target_hospital is None: + return None + return HISAdapter.get_or_create_patient(his_patient, target_hospital) + except Exception as e: + logger.warning("HIS patient materialization failed: %s", e) + return None diff --git a/apps/organizations/ui_views.py b/apps/organizations/ui_views.py index e7c7080..30644b1 100644 --- a/apps/organizations/ui_views.py +++ b/apps/organizations/ui_views.py @@ -2036,6 +2036,32 @@ def department_detail(request, pk): ).select_related("complaint").order_by("-forwarded_at") for pc in pending_complaint_dept_responses: is_rejected = pc.acceptance_status == "not_acceptable" + needs_resubmit = is_rejected or pc.manager_review_status == "rejected" + explanation_url = "#" + explanation = ComplaintExplanation.objects.filter( + complaint_id=pc.complaint_id, + staff__department=department, + ).first() + if not explanation and department.champion: + import secrets as _secrets + explanation = ComplaintExplanation.objects.create( + complaint=pc.complaint, + staff=department.champion, + token=_secrets.token_urlsafe(32), + explanation="", + is_used=False, + ) + if explanation: + if explanation.is_used and needs_resubmit: + import secrets + explanation.is_used = False + explanation.token = secrets.token_urlsafe(32) + explanation.save(update_fields=["is_used", "token"]) + if not explanation.is_used: + explanation_url = reverse( + "complaints:complaint_explanation_form", + kwargs={"complaint_id": pc.complaint_id, "token": explanation.token}, + ) pending_actions.append({ "type": "complaint_department_response", "type_label": _("Complaint Response (Re-submit)") if is_rejected else _("Complaint Response"), @@ -2044,6 +2070,7 @@ def department_detail(request, pk): "sla_due_at": None, "is_overdue": False, "url": "#", + "explanation_url": explanation_url, "badge_color": "red" if is_rejected else "orange", "item_id": str(pc.pk), "item_type": "complaint_involved_department", @@ -2560,6 +2587,40 @@ def department_complaint_detail(request, pk, cpk): complaint_ct = ContentType.objects.get_for_model(Complaint) notes = complaint.notes.select_related("created_by").order_by("-created_at") + explanation_url = None + if can_respond and involved_dept: + from apps.complaints.models import ComplaintExplanation + explanation = ComplaintExplanation.objects.filter( + complaint=complaint, + staff__department=department, + ).first() + if not explanation and department.champion: + import secrets as _secrets + explanation = ComplaintExplanation.objects.create( + complaint=complaint, + staff=department.champion, + token=_secrets.token_urlsafe(32), + explanation="", + is_used=False, + ) + if explanation: + needs_resubmit = ( + involved_dept.acceptance_status == "not_acceptable" + or involved_dept.manager_review_status == "rejected" + ) + if explanation.is_used and needs_resubmit: + import secrets + explanation.is_used = False + explanation.token = secrets.token_urlsafe(32) + explanation.save(update_fields=["is_used", "token"]) + if not explanation.is_used: + explanation_url = reverse( + "complaints:complaint_explanation_form", + kwargs={"complaint_id": complaint.id, "token": explanation.token}, + ) + + from apps.complaints.workflow_log import build_workflow_log + context = { "department": department, "complaint": complaint, @@ -2569,9 +2630,11 @@ def department_complaint_detail(request, pk, cpk): "can_respond": can_respond, "can_manager_review": can_manager_review, "involved_dept": involved_dept, + "explanation_url": explanation_url, "notes": notes, "content_type_id": complaint_ct.pk, "object_id": complaint.pk, + "workflow_log": build_workflow_log(complaint), } return render(request, "organizations/department_complaint_detail.html", context) @@ -3973,6 +4036,19 @@ def department_manager_review(request, pk, idept_pk): return redirect("organizations:department_detail", pk=department.pk) complaint = involved_dept.complaint + + # Ensure default manager review questions exist for this hospital + defaults = [ + ("Is there negligence resulting from carelessness?", "هل يوجد تقصير ناتج عن إهمال؟", "yes_no", 1), + ("Is it resulting from policies or regulations?", "هل هو ناتج عن سياسات أو تنظيمات؟", "yes_no", 2), + ("Radical action taken for this issue", "الإجراء المتخذ لهذا الموضوع جذرياً", "textarea", 3), + ] + for text_en, text_ar, qtype, order in defaults: + ManagerReviewQuestion.objects.get_or_create( + hospital=department.hospital, text_en=text_en, + defaults={"text_ar": text_ar, "question_type": qtype, "order": order, "is_active": True}, + ) + questions = ManagerReviewQuestion.objects.filter( hospital=department.hospital, is_active=True, ).order_by("order", "created_at") @@ -4140,11 +4216,36 @@ def department_manager_review(request, pk, idept_pk): return redirect("organizations:department_detail", pk=department.pk) + # Fetch investigation Q&A if one exists for this involved department + investigation = involved_dept.investigations.prefetch_related( + "questions", "responses__staff", "responses__answers__question" + ).first() + investigation_staff_data = [] + if investigation: + inv_questions = list(investigation.questions.all().order_by("order")) + for resp in investigation.responses.all(): + qa_pairs = [] + for q in inv_questions: + answer_text = "" + for ans in resp.answers.all(): + if ans.question_id == q.id: + answer_text = ans.answer_text + break + qa_pairs.append({"question": q, "answer": answer_text}) + investigation_staff_data.append({ + "staff": resp.staff, + "is_completed": resp.is_completed, + "completed_at": resp.completed_at, + "qa_pairs": qa_pairs, + }) + context = { "department": department, "involved_dept": involved_dept, "complaint": complaint, "questions": questions, + "investigation": investigation, + "investigation_staff_data": investigation_staff_data, } return render(request, "organizations/department_manager_review.html", context) diff --git a/apps/organizations/urls.py b/apps/organizations/urls.py index 05df917..85ed89b 100644 --- a/apps/organizations/urls.py +++ b/apps/organizations/urls.py @@ -13,6 +13,7 @@ from .views import ( StaffViewSet, api_areas_by_hospital, api_department_contacts, + api_department_staff, api_departments_by_category, api_main_section_list, api_sections_by_department, @@ -147,6 +148,7 @@ urlpatterns = [ path("dropdowns/areas/", api_areas_by_hospital, name="api_areas_by_hospital"), path("dropdowns/staff-by-department//", api_staff_by_department, name="api_staff_by_department"), path("dropdowns/department-contacts//", api_department_contacts, name="api_department_contacts"), + path("dropdowns/department-staff//", api_department_staff, name="api_department_staff"), # Staff Hierarchy API (for D3 visualization) path("api/staff/hierarchy/", api_staff_hierarchy, name="api_staff_hierarchy"), path( diff --git a/apps/organizations/views.py b/apps/organizations/views.py index 7e03644..d58e546 100644 --- a/apps/organizations/views.py +++ b/apps/organizations/views.py @@ -905,6 +905,54 @@ def api_department_contacts(request, department_id): return JsonResponse(serializable_holders, safe=False) +@api_view(["GET"]) +@permission_classes([]) +def api_department_staff(request, department_id): + """Return all active Staff in the given department. + + Broader than `api_department_contacts` (which only returns the 6 role-holder + slots). For each staff member, `role_label` is the role-holder slot label if + they occupy one, otherwise their `job_title` (falling back to "Member"). + Output shape matches `api_department_contacts` so the same client-side code + can consume either endpoint. + """ + dept = Department.objects.filter(pk=department_id, status="active").first() + if not dept: + return JsonResponse({"error": "Department not found"}, status=404) + + role_field_by_staff_pk = {} + for field_name, role_label in dept.ROLE_FIELDS: + holder = getattr(dept, field_name, None) + if holder is not None: + role_field_by_staff_pk[str(holder.pk)] = (field_name, role_label) + + staff_qs = ( + Staff.objects.select_related("user") + .filter(department=dept, hospital_id=dept.hospital_id, user__is_active=True) + .order_by("first_name", "last_name") + ) + + result = [] + for staff in staff_qs: + role_field, role_label = role_field_by_staff_pk.get(str(staff.pk), (None, staff.job_title or "Member")) + result.append( + { + "staff": { + "id": str(staff.id), + "name": staff.get_full_name(), + "email": staff.email, + "employee_id": staff.employee_id, + }, + "staff_id": str(staff.id), + "name": staff.get_full_name(), + "email": staff.email or (staff.user.email if staff.user else None), + "role_field": role_field, + "role_label": role_label, + } + ) + return JsonResponse(result, safe=False) + + @api_view(["GET"]) @permission_classes([]) def ajax_departments(request): @@ -1163,7 +1211,7 @@ def api_staff_search(request): URL: /api/staffs/search/?q=&active=true """ q = request.query_params.get("q", "").strip() - queryset = Staff.objects.filter(status="active") + queryset = Staff.objects.select_related("department", "user").filter(status="active") # Filter by user's hospital if not admin user = request.user @@ -1180,7 +1228,49 @@ def api_staff_search(request): ) queryset = queryset[:20] data = [ - {"id": s.id, "first_name": s.first_name, "last_name": s.last_name, "employee_id": s.employee_id} + { + "id": s.id, + "first_name": s.first_name, + "last_name": s.last_name, + "employee_id": s.employee_id, + "department": {"id": s.department_id, "name": s.department.name if s.department else None}, + "has_contact": bool( + s.email + or s.phone + or (s.user_id and s.user and (s.user.email or getattr(s.user, "phone", ""))) + ), + } for s in queryset ] return Response(data) + + +@api_view(["GET"]) +@permission_classes([IsAuthenticated]) +def api_staff_for_user_create(request, staff_id): + """ + Return detailed staff info for pre-filling the user creation form. + Only returns staff without an existing user account. + """ + try: + staff = Staff.objects.select_related("hospital", "department").get( + pk=staff_id, user__isnull=True, status="active" + ) + except Staff.DoesNotExist: + return Response({"error": "Staff not found or already has a user account."}, status=404) + + data = { + "id": str(staff.id), + "first_name": staff.first_name, + "last_name": staff.last_name, + "email": staff.email or "", + "phone": staff.phone or "", + "employee_id": staff.employee_id or "", + "hospital": str(staff.hospital_id) if staff.hospital else "", + "hospital_name": staff.hospital.name if staff.hospital else "", + "department": str(staff.department_id) if staff.department else "", + "department_name": staff.department.name if staff.department else "", + "job_title": staff.job_title or "", + "staff_type": staff.staff_type or "", + } + return Response(data) diff --git a/apps/projects/ui_views.py b/apps/projects/ui_views.py index 5691a29..ec7863c 100644 --- a/apps/projects/ui_views.py +++ b/apps/projects/ui_views.py @@ -103,7 +103,7 @@ def my_tasks(request): "title": "Submit your explanation", "description": c.title or "", "reference": c.reference_number, - "url": f"/complaints/explanation/{e.token}/" if e.token else reverse("complaints:complaint_detail", kwargs={"pk": c.id}), + "url": reverse("complaints:complaint_explanation_form", kwargs={"complaint_id": c.id, "token": e.token}) if e.token else reverse("complaints:complaint_detail", kwargs={"pk": c.id}), "due_date": None, "is_overdue": False, }) @@ -158,6 +158,36 @@ def my_tasks(request): ).select_related("complaint", "department") for d in pending_responses: c = d.complaint + explanation_url = None + from apps.complaints.models import ComplaintExplanation + explanation = ComplaintExplanation.objects.filter( + complaint_id=c.id, + staff__department=d.department, + ).first() + if not explanation and d.department.champion: + import secrets as _secrets + explanation = ComplaintExplanation.objects.create( + complaint=c, + staff=d.department.champion, + token=_secrets.token_urlsafe(32), + explanation="", + is_used=False, + ) + if explanation: + needs_resubmit = ( + d.acceptance_status == "not_acceptable" + or d.manager_review_status == "rejected" + ) + if explanation.is_used and needs_resubmit: + import secrets + explanation.is_used = False + explanation.token = secrets.token_urlsafe(32) + explanation.save(update_fields=["is_used", "token"]) + if not explanation.is_used: + explanation_url = reverse( + "complaints:complaint_explanation_form", + kwargs={"complaint_id": c.id, "token": explanation.token}, + ) tasks.append({ "type": "dept_response", "type_label": "Dept Response", @@ -174,6 +204,7 @@ def my_tasks(request): "modal_url": reverse("complaints:involved_department_response", kwargs={"pk": d.pk}), "modal_ref": c.reference_number, "modal_subject": d.department.name, + "explanation_url": explanation_url, }) # 5. Complaint response approval (department manager needs to approve) diff --git a/apps/reports/models.py b/apps/reports/models.py index 023a16f..984d20e 100644 --- a/apps/reports/models.py +++ b/apps/reports/models.py @@ -18,6 +18,11 @@ class DataSource(models.TextChoices): PX_ACTIONS = 'px_actions', 'PX Actions' SURVEYS = 'surveys', 'Surveys' PHYSICIANS = 'physicians', 'Physician Ratings' + STAFF = 'staff', 'Staff' + DEPARTMENT = 'department', 'Departments' + SUGGESTION = 'suggestion', 'Suggestions' + APPRECIATION = 'appreciation', 'Appreciations' + PATIENT = 'patient', 'Patients' class ReportFrequency(models.TextChoices): diff --git a/apps/reports/services.py b/apps/reports/services.py index 0be0c40..c9d5ce3 100644 --- a/apps/reports/services.py +++ b/apps/reports/services.py @@ -133,6 +133,74 @@ class ReportBuilderService: "neutral_count": {"label": "Neutral", "field": "neutral_count", "type": "number"}, "negative_count": {"label": "Negative", "field": "negative_count", "type": "number"}, }, + "staff": { + "id": {"label": "ID", "field": "id", "type": "string"}, + "employee_id": {"label": "Employee ID", "field": "employee_id", "type": "string"}, + "first_name": {"label": "First Name", "field": "first_name", "type": "string"}, + "last_name": {"label": "Last Name", "field": "last_name", "type": "string"}, + "name": {"label": "Full Name", "field": "get_full_name", "type": "string"}, + "staff_type": {"label": "Staff Type", "field": "staff_type", "type": "choice"}, + "job_title": {"label": "Job Title", "field": "job_title", "type": "string"}, + "department_type": {"label": "Department Category", "field": "department_type", "type": "choice"}, + "email": {"label": "Email", "field": "email", "type": "string"}, + "phone": {"label": "Phone", "field": "phone", "type": "string"}, + "hospital": {"label": "Hospital", "field": "hospital__name", "type": "string"}, + "department": {"label": "Department", "field": "department__name", "type": "string"}, + "status": {"label": "Status", "field": "status", "type": "choice"}, + "created_at": {"label": "Created Date", "field": "created_at", "type": "datetime"}, + }, + "department": { + "id": {"label": "ID", "field": "id", "type": "string"}, + "name": {"label": "Name", "field": "name", "type": "string"}, + "name_en": {"label": "Name (English)", "field": "name_en", "type": "string"}, + "code": {"label": "Code", "field": "code", "type": "string"}, + "category": {"label": "Category", "field": "category", "type": "choice"}, + "hospital": {"label": "Hospital", "field": "hospital__name", "type": "string"}, + "manager": {"label": "Manager", "field": "manager__get_full_name", "type": "string"}, + "status": {"label": "Status", "field": "status", "type": "choice"}, + "created_at": {"label": "Created Date", "field": "created_at", "type": "datetime"}, + }, + "suggestion": { + "id": {"label": "ID", "field": "id", "type": "string"}, + "reference_number": {"label": "Reference Number", "field": "reference_number", "type": "string"}, + "title": {"label": "Title", "field": "title", "type": "string"}, + "message": {"label": "Message", "field": "message", "type": "text"}, + "status": {"label": "Status", "field": "status", "type": "choice"}, + "category": {"label": "Category", "field": "category", "type": "choice"}, + "sentiment": {"label": "Sentiment", "field": "sentiment", "type": "choice"}, + "hospital": {"label": "Hospital", "field": "hospital__name", "type": "string"}, + "department": {"label": "Department", "field": "department__name", "type": "string"}, + "patient_name": {"label": "Patient Name", "field": "patient__first_name", "type": "string"}, + "is_anonymous": {"label": "Is Anonymous", "field": "is_anonymous", "type": "boolean"}, + "contact_name": {"label": "Contact Name", "field": "contact_name", "type": "string"}, + "created_at": {"label": "Created Date", "field": "created_at", "type": "datetime"}, + }, + "appreciation": { + "id": {"label": "ID", "field": "id", "type": "string"}, + "reference_number": {"label": "Reference Number", "field": "reference_number", "type": "string"}, + "category": {"label": "Category", "field": "category__name_en", "type": "string"}, + "status": {"label": "Status", "field": "status", "type": "choice"}, + "visibility": {"label": "Visibility", "field": "visibility", "type": "choice"}, + "sender": {"label": "Sender", "field": "sender__get_full_name", "type": "string"}, + "hospital": {"label": "Hospital", "field": "hospital__name", "type": "string"}, + "department": {"label": "Department", "field": "department__name", "type": "string"}, + "created_at": {"label": "Created Date", "field": "created_at", "type": "datetime"}, + "activated_at": {"label": "Activated Date", "field": "activated_at", "type": "datetime"}, + }, + "patient": { + "id": {"label": "ID", "field": "id", "type": "string"}, + "mrn": {"label": "MRN", "field": "mrn", "type": "string"}, + "first_name": {"label": "First Name", "field": "first_name", "type": "string"}, + "last_name": {"label": "Last Name", "field": "last_name", "type": "string"}, + "name": {"label": "Full Name", "field": "get_full_name", "type": "string"}, + "gender": {"label": "Gender", "field": "gender", "type": "choice"}, + "national_id": {"label": "National ID", "field": "national_id", "type": "string"}, + "phone": {"label": "Phone", "field": "phone", "type": "string"}, + "email": {"label": "Email", "field": "email", "type": "string"}, + "primary_hospital": {"label": "Primary Hospital", "field": "primary_hospital__name", "type": "string"}, + "status": {"label": "Status", "field": "status", "type": "choice"}, + "created_at": {"label": "Created Date", "field": "created_at", "type": "datetime"}, + }, } # Filter options for each data source @@ -187,6 +255,39 @@ class ReportBuilderService: {"name": "hospital", "label": "Hospital", "type": "select"}, {"name": "department", "label": "Department", "type": "select"}, ], + "staff": [ + {"name": "date_range", "label": "Date Range", "type": "daterange"}, + {"name": "staff_type", "label": "Staff Type", "type": "multiselect"}, + {"name": "status", "label": "Status", "type": "multiselect"}, + {"name": "hospital", "label": "Hospital", "type": "select"}, + {"name": "department", "label": "Department", "type": "select"}, + ], + "department": [ + {"name": "category", "label": "Category", "type": "multiselect"}, + {"name": "status", "label": "Status", "type": "multiselect"}, + {"name": "hospital", "label": "Hospital", "type": "select"}, + ], + "suggestion": [ + {"name": "date_range", "label": "Date Range", "type": "daterange"}, + {"name": "status", "label": "Status", "type": "multiselect"}, + {"name": "category", "label": "Category", "type": "multiselect"}, + {"name": "sentiment", "label": "Sentiment", "type": "multiselect"}, + {"name": "hospital", "label": "Hospital", "type": "select"}, + {"name": "department", "label": "Department", "type": "select"}, + ], + "appreciation": [ + {"name": "date_range", "label": "Date Range", "type": "daterange"}, + {"name": "status", "label": "Status", "type": "multiselect"}, + {"name": "visibility", "label": "Visibility", "type": "multiselect"}, + {"name": "hospital", "label": "Hospital", "type": "select"}, + {"name": "department", "label": "Department", "type": "select"}, + ], + "patient": [ + {"name": "date_range", "label": "Date Range", "type": "daterange"}, + {"name": "gender", "label": "Gender", "type": "multiselect"}, + {"name": "status", "label": "Status", "type": "multiselect"}, + {"name": "hospital", "label": "Hospital", "type": "select"}, + ], } @classmethod @@ -197,6 +298,9 @@ class ReportBuilderService: from apps.px_action_center.models import PXAction from apps.surveys.models import SurveyInstance from apps.physicians.models import PhysicianMonthlyRating + from apps.organizations.models import Staff, Department, Patient + from apps.feedback.models import Feedback, FeedbackType + from apps.appreciation.models import Appreciation querysets = { "complaints": Complaint.objects.all(), @@ -205,6 +309,11 @@ class ReportBuilderService: "px_actions": PXAction.objects.all(), "surveys": SurveyInstance.objects.all(), "physicians": PhysicianMonthlyRating.objects.all(), + "staff": Staff.objects.all(), + "department": Department.objects.all(), + "suggestion": Feedback.objects.filter(feedback_type=FeedbackType.SUGGESTION), + "appreciation": Appreciation.objects.all(), + "patient": Patient.objects.all(), } queryset = querysets.get(data_source) @@ -219,6 +328,8 @@ class ReportBuilderService: queryset = queryset.filter(assigned_department__hospital=hospital) elif data_source == "surveys": queryset = queryset.filter(journey__hospital=hospital) + elif data_source == "patient": + queryset = queryset.filter(primary_hospital=hospital) else: queryset = queryset.filter(hospital=hospital) @@ -252,7 +363,10 @@ class ReportBuilderService: # Hospital filter if "hospital" in filters and filters["hospital"]: - queryset = queryset.filter(hospital_id=filters["hospital"]) + if data_source == "patient": + queryset = queryset.filter(primary_hospital_id=filters["hospital"]) + else: + queryset = queryset.filter(hospital_id=filters["hospital"]) # Department filter if "department" in filters and filters["department"]: @@ -260,6 +374,8 @@ class ReportBuilderService: queryset = queryset.filter(assigned_department_id=filters["department"]) elif data_source == "surveys": queryset = queryset.filter(journey__department_id=filters["department"]) + elif data_source in ("department", "patient"): + pass else: queryset = queryset.filter(department_id=filters["department"]) @@ -320,6 +436,47 @@ class ReportBuilderService: if "patient_type" in filters and filters["patient_type"]: queryset = queryset.filter(journey__patient_type=filters["patient_type"]) + # Staff type filter (for staff source) + if "staff_type" in filters and filters["staff_type"]: + if isinstance(filters["staff_type"], list): + queryset = queryset.filter(staff_type__in=filters["staff_type"]) + else: + queryset = queryset.filter(staff_type=filters["staff_type"]) + + # Category filter (for department, suggestion sources) + if "category" in filters and filters["category"]: + if data_source == "department": + if isinstance(filters["category"], list): + queryset = queryset.filter(category__in=filters["category"]) + else: + queryset = queryset.filter(category=filters["category"]) + elif data_source == "suggestion": + if isinstance(filters["category"], list): + queryset = queryset.filter(category__in=filters["category"]) + else: + queryset = queryset.filter(category=filters["category"]) + + # Sentiment filter (for suggestion source) + if "sentiment" in filters and filters["sentiment"]: + if isinstance(filters["sentiment"], list): + queryset = queryset.filter(sentiment__in=filters["sentiment"]) + else: + queryset = queryset.filter(sentiment=filters["sentiment"]) + + # Visibility filter (for appreciation source) + if "visibility" in filters and filters["visibility"]: + if isinstance(filters["visibility"], list): + queryset = queryset.filter(visibility__in=filters["visibility"]) + else: + queryset = queryset.filter(visibility=filters["visibility"]) + + # Gender filter (for patient source) + if "gender" in filters and filters["gender"]: + if isinstance(filters["gender"], list): + queryset = queryset.filter(gender__in=filters["gender"]) + else: + queryset = queryset.filter(gender=filters["gender"]) + return queryset @classmethod @@ -508,6 +665,36 @@ class ReportBuilderService: summary["new_count"] = queryset.filter(status="new").count() summary["resolved_count"] = queryset.filter(status="resolved").count() + elif data_source == "staff": + summary["active_count"] = queryset.filter(status="active").count() + summary["by_staff_type"] = list( + queryset.values("staff_type").annotate(count=Count("id")).order_by("-count") + ) + + elif data_source == "department": + summary["active_count"] = queryset.filter(status="active").count() + summary["by_category"] = list( + queryset.values("category").annotate(count=Count("id")).order_by("-count") + ) + + elif data_source == "suggestion": + summary["open_count"] = queryset.exclude(status="closed").count() + summary["closed_count"] = queryset.filter(status="closed").count() + summary["by_sentiment"] = list( + queryset.exclude(sentiment="").values("sentiment").annotate(count=Count("id")).order_by("-count") + ) + + elif data_source == "appreciation": + summary["sent_count"] = queryset.filter(status="sent").count() + summary["acknowledged_count"] = queryset.filter(status="acknowledged").count() + summary["draft_count"] = queryset.filter(status="draft").count() + + elif data_source == "patient": + summary["active_count"] = queryset.filter(status="active").count() + summary["by_gender"] = list( + queryset.exclude(gender="").values("gender").annotate(count=Count("id")).order_by("-count") + ) + return summary diff --git a/apps/reports/views.py b/apps/reports/views.py index a89babd..6bc8590 100644 --- a/apps/reports/views.py +++ b/apps/reports/views.py @@ -16,6 +16,7 @@ from django.utils import timezone from django.core.paginator import Paginator from apps.organizations.models import Department, Hospital +from apps.core.models import StatusChoices from .models import SavedReport, GeneratedReport, ReportTemplate, DataSource, ReportFormat from .services import ReportBuilderService, ReportExportService @@ -403,6 +404,35 @@ def filter_options_api(request): elif data_source == "physicians": options["journey_type"] = ["inpatient", "outpatient", "emergency"] + elif data_source == "staff": + from apps.organizations.models import Staff + + options["staff_type"] = [choice[0] for choice in Staff.StaffType.choices] + options["status"] = [choice[0] for choice in StatusChoices.choices] + + elif data_source == "department": + from apps.organizations.models import DepartmentCategory + + options["category"] = [choice[0] for choice in DepartmentCategory.choices] + options["status"] = [choice[0] for choice in StatusChoices.choices] + + elif data_source == "suggestion": + from apps.feedback.models import FeedbackStatus, FeedbackCategory, SentimentChoices + + options["status"] = [choice[0] for choice in FeedbackStatus.choices] + options["category"] = [choice[0] for choice in FeedbackCategory.choices] + options["sentiment"] = [choice[0] for choice in SentimentChoices.choices] + + elif data_source == "appreciation": + from apps.appreciation.models import AppreciationStatus, AppreciationVisibility + + options["status"] = [choice[0] for choice in AppreciationStatus.choices] + options["visibility"] = [choice[0] for choice in AppreciationVisibility.choices] + + elif data_source == "patient": + options["gender"] = ["male", "female", "other"] + options["status"] = [choice[0] for choice in StatusChoices.choices] + # Hospital options hospitals = Hospital.objects.filter(status="active") if not request.user.is_px_admin() and request.user.hospital: diff --git a/backups/.gitkeep b/backups/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/backups/db_pre_dedup_20260628_101948.sqlite3 b/backups/db_pre_dedup_20260628_101948.sqlite3 new file mode 100644 index 0000000..150a977 Binary files /dev/null and b/backups/db_pre_dedup_20260628_101948.sqlite3 differ diff --git a/config/celery.py b/config/celery.py index cc06c93..6ca964a 100644 --- a/config/celery.py +++ b/config/celery.py @@ -127,11 +127,11 @@ app.conf.beat_schedule = { "task": "apps.analytics.tasks.calculate_daily_kpis", "schedule": crontab(hour=1, minute=0), }, - # Fetch doctor ratings from HIS on the 1st of each month at 1 AM (before aggregation) - "fetch-his-doctor-ratings-monthly": { - "task": "apps.physicians.tasks.fetch_his_doctor_ratings_monthly", - "schedule": crontab(hour=1, minute=0, day_of_month=1), - }, + # # Fetch doctor ratings from HIS on the 1st of each month at 1 AM (before aggregation) + # "fetch-his-doctor-ratings-monthly": { + # "task": "apps.physicians.tasks.fetch_his_doctor_ratings_monthly", + # "schedule": crontab(hour=1, minute=0, day_of_month=1), + # }, # Fetch doctor ratings from HIS daily at 1:30 AM (yesterday's ratings) "fetch-his-doctor-ratings-daily": { "task": "apps.physicians.tasks.fetch_his_doctor_ratings_daily", @@ -184,15 +184,15 @@ app.conf.beat_schedule = { "schedule": crontab(minute="*/15"), }, # Schedule observation monthly follow-ups daily at 6 AM - "schedule-observation-monthly-followups": { - "task": "apps.observations.tasks.schedule_monthly_followups", - "schedule": crontab(hour=6, minute=0), - }, - # Process observation monthly follow-ups daily at 7 AM - "process-observation-monthly-followups": { - "task": "apps.observations.tasks.process_monthly_followups", - "schedule": crontab(hour=7, minute=0), - }, + # "schedule-observation-monthly-followups": { + # "task": "apps.observations.tasks.schedule_monthly_followups", + # "schedule": crontab(hour=6, minute=0), + # }, + # # Process observation monthly follow-ups daily at 7 AM + # "process-observation-monthly-followups": { + # "task": "apps.observations.tasks.process_monthly_followups", + # "schedule": crontab(hour=7, minute=0), + # }, # Analyze feedback sentiment every 30 minutes "analyze-feedback-sentiment": { "task": "apps.feedback.tasks.process_pending_sentiment_analysis", @@ -214,56 +214,56 @@ app.conf.beat_schedule = { "schedule": crontab(minute=0), # Every hour }, # Generate AI executive summary daily at 6 AM (kept for backward compat) - "generate-daily-executive-summary": { - "task": "apps.analytics.tasks.generate_executive_summary_task", - "schedule": crontab(hour=6, minute=0), - }, - # Generate AI action recommendations daily at 6:30 AM (kept for backward compat) - "generate-daily-action-recommendations": { - "task": "apps.analytics.tasks.generate_action_recommendations_task", - "schedule": crontab(hour=6, minute=30), - }, - # Send weekly PX digest email every Monday at 8 AM - "send-weekly-px-digest": { - "task": "apps.analytics.tasks_digest.send_weekly_digest_task", - "schedule": crontab(hour=8, minute=0, day_of_week=1), # Monday - }, - # Send monthly PX digest email on 1st of each month at 8 AM - "send-monthly-px-digest": { - "task": "apps.analytics.tasks_digest.send_monthly_digest_task", - "schedule": crontab(hour=8, minute=0, day_of_month=1), - }, + # "generate-daily-executive-summary": { + # "task": "apps.analytics.tasks.generate_executive_summary_task", + # "schedule": crontab(hour=6, minute=0), + # }, + # # Generate AI action recommendations daily at 6:30 AM (kept for backward compat) + # "generate-daily-action-recommendations": { + # "task": "apps.analytics.tasks.generate_action_recommendations_task", + # "schedule": crontab(hour=6, minute=30), + # }, + # # Send weekly PX digest email every Monday at 8 AM + # "send-weekly-px-digest": { + # "task": "apps.analytics.tasks_digest.send_weekly_digest_task", + # "schedule": crontab(hour=8, minute=0, day_of_week=1), # Monday + # }, + # # Send monthly PX digest email on 1st of each month at 8 AM + # "send-monthly-px-digest": { + # "task": "apps.analytics.tasks_digest.send_monthly_digest_task", + # "schedule": crontab(hour=8, minute=0, day_of_month=1), + # }, # Executive Summary Tasks # Calculate daily metrics at 1 AM - "calculate-daily-executive-metrics": { - "task": "apps.executive_summary.tasks.calculate_daily_metrics", - "schedule": crontab(hour=1, minute=0), - }, - # Generate predictive insights every 6 hours - "generate-predictive-insights": { - "task": "apps.executive_summary.tasks.generate_predictive_insights", - "schedule": crontab(hour="*/6"), # Every 6 hours - }, - # Generate AI recommendations daily at 3 AM - "generate-ai-recommendations": { - "task": "apps.executive_summary.tasks.generate_ai_recommendations", - "schedule": crontab(hour=3, minute=0), - }, + # "calculate-daily-executive-metrics": { + # "task": "apps.executive_summary.tasks.calculate_daily_metrics", + # "schedule": crontab(hour=1, minute=0), + # }, + # # Generate predictive insights every 6 hours + # "generate-predictive-insights": { + # "task": "apps.executive_summary.tasks.generate_predictive_insights", + # "schedule": crontab(hour="*/6"), # Every 6 hours + # }, + # # Generate AI recommendations daily at 3 AM + # "generate-ai-recommendations": { + # "task": "apps.executive_summary.tasks.generate_ai_recommendations", + # "schedule": crontab(hour=3, minute=0), + # }, # Generate weekly executive summary every Monday at 6 AM - "generate-weekly-executive-summary": { - "task": "apps.executive_summary.tasks.generate_weekly_executive_summary", - "schedule": crontab(hour=6, minute=0, day_of_week=1), # Monday - }, + # "generate-weekly-executive-summary": { + # "task": "apps.executive_summary.tasks.generate_weekly_executive_summary", + # "schedule": crontab(hour=6, minute=0, day_of_week=1), # Monday + # }, # Generate monthly executive summary on 1st at 7 AM - "generate-monthly-executive-summary": { - "task": "apps.executive_summary.tasks.generate_monthly_executive_summary", - "schedule": crontab(hour=7, minute=0, day_of_month=1), - }, + # "generate-monthly-executive-summary": { + # "task": "apps.executive_summary.tasks.generate_monthly_executive_summary", + # "schedule": crontab(hour=7, minute=0, day_of_month=1), + # }, # Send executive PDF reports every Monday at 9 AM - "send-executive-pdf-report": { - "task": "apps.executive_summary.tasks.send_executive_pdf_report", - "schedule": crontab(hour=9, minute=0, day_of_week=1), # Monday - }, + # "send-executive-pdf-report": { + # "task": "apps.executive_summary.tasks.send_executive_pdf_report", + # "schedule": crontab(hour=9, minute=0, day_of_week=1), # Monday + # }, } diff --git a/config/settings/base.py b/config/settings/base.py index 71ce72a..4fabccf 100644 --- a/config/settings/base.py +++ b/config/settings/base.py @@ -45,6 +45,7 @@ THIRD_PARTY_APPS = [ "django_filters", "drf_spectacular", "django_celery_beat", + "django_ai_po", ] LOCAL_APPS = [ @@ -185,6 +186,21 @@ LOCALE_PATHS = [ BASE_DIR / "locale", ] +# AI-powered translation configuration +DJANGO_AI_PO = { + "MODEL": "openrouter/deepseek/deepseek-v4-flash", + "API_KEY": env("OPENROUTER_API_KEY"), + "TEMPERATURE": 0.2, + "BATCH_SIZE": 5, + "WORKERS": 2, + "LANGUAGES": { + "ar": { + "validators": ["arabic"], + "prompt_extra": "Use Saudi Arabian healthcare terminology...", + }, + }, +} + # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/5.0/howto/static-files/ STATIC_URL = "/static/" @@ -516,3 +532,22 @@ OPENROUTER_API_KEY = env( OPENROUTER_MODEL = env("OPENROUTER_MODEL", default="google/gemma-3-27b-it:free") ANALYSIS_BATCH_SIZE = env.int("ANALYSIS_BATCH_SIZE", default=2) ANALYSIS_ENABLED = env.bool("ANALYSIS_ENABLED", default=True) + +# Bugsink / Sentry error tracking +SENTRY_DSN = env("SENTRY_DSN", default=None) + +if SENTRY_DSN: + import sentry_sdk + from sentry_sdk.integrations.django import DjangoIntegration + from sentry_sdk.integrations.celery import CeleryIntegration + + sentry_sdk.init( + dsn=SENTRY_DSN, + integrations=[ + DjangoIntegration(), + CeleryIntegration(), + ], + traces_sample_rate=0.1, + send_default_pii=False, + environment="development" if DEBUG else "production", + ) diff --git a/config/urls.py b/config/urls.py index e413347..705f149 100644 --- a/config/urls.py +++ b/config/urls.py @@ -8,7 +8,7 @@ from django.contrib import admin from django.urls import include, path from django.conf.urls.i18n import i18n_patterns from drf_spectacular.views import SpectacularAPIView, SpectacularRedocView, SpectacularSwaggerView -from apps.organizations.views import api_patient_search, api_staff_search +from apps.organizations.views import api_patient_search, api_staff_search, api_staff_for_user_create urlpatterns = [ # Language switching @@ -56,6 +56,7 @@ urlpatterns = [ path("api/simulator/", include("apps.simulator.urls", namespace="api_simulator")), path("api/patients/search/", api_patient_search, name="api_patient_search"), path("api/staffs/search/", api_staff_search, name="api_staff_search"), + path("api/staffs//for-user-creation/", api_staff_for_user_create, name="api_staff_for_user_create"), # External API (X-API-Key authenticated) path("api/v1/external/", include("apps.integrations.urls_external")), # OpenAPI/Swagger documentation diff --git a/docker-compose.yml b/docker-compose.yml index ea33c3d..1524e8d 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -37,7 +37,10 @@ services: container_name: px360_web environment: - DATABASE_URL=postgresql://px360:px360@db:5432/px360 + - CELERY_BROKER_URL=redis://redis:6379/0 + - CELERY_RESULT_BACKEND=redis://redis:6379/0 - DJANGO_SETTINGS_MODULE=config.settings.dev + - SENTRY_DSN=http://52653adf0f0b4618bfab78806637fe7d@bugsink:8000/1 command: > sh -c "python manage.py migrate && python manage.py collectstatic --noinput || true && @@ -69,8 +72,11 @@ services: container_name: px360_celery environment: - DATABASE_URL=postgresql://px360:px360@db:5432/px360 + - CELERY_BROKER_URL=redis://redis:6379/0 + - CELERY_RESULT_BACKEND=redis://redis:6379/0 - DJANGO_SETTINGS_MODULE=config.settings.dev - command: celery -A config worker -l info + - SENTRY_DSN=http://52653adf0f0b4618bfab78806637fe7d@bugsink:8000/1 + command: celery -A config worker -l info --autoreload volumes: - .:/app env_file: @@ -88,7 +94,10 @@ services: container_name: px360_celery_beat environment: - DATABASE_URL=postgresql://px360:px360@db:5432/px360 + - CELERY_BROKER_URL=redis://redis:6379/0 + - CELERY_RESULT_BACKEND=redis://redis:6379/0 - DJANGO_SETTINGS_MODULE=config.settings.dev + - SENTRY_DSN=http://52653adf0f0b4618bfab78806637fe7d@bugsink:8000/1 command: celery -A config beat -l info --scheduler django_celery_beat.schedulers:DatabaseScheduler volumes: - .:/app @@ -99,6 +108,43 @@ services: - redis - web + bugsink: + image: bugsink/bugsink:latest + container_name: px360_bugsink + ports: + - "9000:8000" + volumes: + - bugsink_data:/data + environment: + - SECRET_KEY=bugsink-prod-secret-key-3f8a2c5e9b1d4f7a6c0e2d5b8f1a4c7e + restart: unless-stopped + + openobserve: + image: openobserve/openobserve:latest + container_name: px360_openobserve + ports: + - "5080:5080" + volumes: + - openobserve_data:/data + environment: + - ZO_ROOT_USER_EMAIL=root@example.com + - ZO_ROOT_USER_PASSWORD=Complexpass#123 + - ZO_DATA_DIR=/data + restart: unless-stopped + + vector: + image: timberio/vector:latest-debian + container_name: px360_vector + command: ["--config", "/etc/vector/vector.toml"] + volumes: + - ./vector.toml:/etc/vector/vector.toml:ro + - /var/run/docker.sock:/var/run/docker.sock:ro + depends_on: + - openobserve + restart: unless-stopped + volumes: postgres_data: media_volume: + bugsink_data: + openobserve_data: diff --git a/docs/COMMAND_CENTER_IMPLEMENTATION.md b/docs/COMMAND_CENTER_IMPLEMENTATION.md index ebc7771..df863ff 100644 --- a/docs/COMMAND_CENTER_IMPLEMENTATION.md +++ b/docs/COMMAND_CENTER_IMPLEMENTATION.md @@ -92,28 +92,15 @@ class ExportService: """Generates PDF file and returns HttpResponse""" ``` -#### 3. UI Views (`apps/analytics/ui_views.py`) +#### 3. Dashboard Views (`apps/dashboard/views.py`) -Django views for rendering the dashboard and handling API requests. +The canonical Command Center is `CommandCenterView` (class-based) in the dashboard app, rendered server-side with context data. Live updates are served by `command_center_api` at `/api/`. -**Key Views:** -```python -@login_required -def command_center(request) - """Main dashboard view - renders the HTML template""" - -@login_required -def command_center_api(request) - """API endpoint - returns JSON data for dynamic updates""" - -@login_required -def export_command_center(request, export_format) - """Handles Excel and PDF export requests""" -``` +> **Note:** The legacy analytics-based Command Center (`apps/analytics/ui_views.py` functions `command_center`, `command_center_api`, `export_command_center`) has been removed. The `/analytics/command-center/` URL now redirects to `/`. Excel/PDF export was removed with it. ### Frontend Components -#### 1. Command Center Template (`templates/analytics/command_center.html`) +#### 1. Command Center Template (`templates/dashboard/command_center.html`) The main dashboard template includes: - Filter panel with collapsible form @@ -142,18 +129,14 @@ updateTables(tableData) // Updates data tables handleDateRangeChange() // Shows/hides custom date range updateFilters() // Updates currentFilters object resetFilters() // Resets all filters to defaults - -// Export functions -exportDashboard(format) // Initiates Excel/PDF export ``` ## URL Structure ``` -/analytics/command-center/ # Main dashboard -/analytics/api/command-center/ # API endpoint for data -/analytics/api/command-center/export/excel/ # Excel export -/analytics/api/command-center/export/pdf/ # PDF export +/ # Main dashboard (dashboard:command-center) +/api/ # API endpoint for live data (dashboard:command_center_api) +/analytics/command-center/ # Backwards-compatible redirect to / ``` ## Data Flow @@ -191,17 +174,8 @@ JavaScript updates UI components ``` ### 3. Export Request -``` -User clicks Export → Excel/PDF - ↓ -exportDashboard(format) called - ↓ -AJAX request to export_command_center - ↓ -ExportService generates file - ↓ -Browser downloads file -``` + +> **Removed:** Excel/PDF export was provided by the legacy analytics Command Center (`export_command_center`) and is no longer available. If export is needed, it must be re-implemented under the dashboard app. ## Role-Based Access Control diff --git a/docs/COMMAND_CENTER_QUICK_START.md b/docs/COMMAND_CENTER_QUICK_START.md index f0b1c2d..fcb21ee 100644 --- a/docs/COMMAND_CENTER_QUICK_START.md +++ b/docs/COMMAND_CENTER_QUICK_START.md @@ -8,7 +8,7 @@ The PX Command Center is your one-stop dashboard for viewing all Patient Experie Navigate to: ``` -https://your-domain.com/analytics/command-center/ +https://your-domain.com/ ``` ## Dashboard Overview diff --git a/e2e/tests/workflows/champion-manager-workflow.spec.ts b/e2e/tests/workflows/champion-manager-workflow.spec.ts index 676cc9d..3370ae6 100644 --- a/e2e/tests/workflows/champion-manager-workflow.spec.ts +++ b/e2e/tests/workflows/champion-manager-workflow.spec.ts @@ -179,13 +179,13 @@ test.describe('Champion/Manager workflow', () => { cid = seed.cid; observe(M, 'B-seed', 'INFO', `complaint ${cid}`, { role: CHAMP }); - // 1. PX sends via send_to_department_form (generates champion ComplaintExplanation token) + // 1. PX sends via the unified send-to endpoint (auto-targets champion+manager, generates champion token) await login(page, PXT); await postForm(page, `${BASE_URL}/complaints/${cid}/activate/`, {}); // activate first - const send = await postForm(page, `${BASE_URL}/complaints/${cid}/send-to-department/`, { - selected_departments: seed.deptId, request_message: 'E2E investigate please', action: 'send', + const send = await postForm(page, `${BASE_URL}/complaints/${cid}/send-to/`, { + recipient_type: 'department', department_id: seed.deptId, note: 'E2E collect feedback please', }); - observe(M, 'B-send-dept-form', send.status() < 400 ? 'PASS' : 'FAIL', `send-to-department HTTP ${send.status()}`, { role: PXT, http: send.status() }); + observe(M, 'B-send-dept-form', send.status() < 400 ? 'PASS' : 'FAIL', `send-to HTTP ${send.status()}`, { role: PXT, http: send.status() }); const s0 = workflowState(cid); const champToken = s0.explanation_token; @@ -202,9 +202,9 @@ test.describe('Champion/Manager workflow', () => { const tb1 = await bodyHasTraceback(page); if (tb1) { observe(M, 'B-investigate-open', 'FAIL', `traceback: ${tb1}`); return; } - // add a question - const q = page.locator('input[name="questions[]"]').first(); - if (await q.count()) await q.fill('E2E investigation question?'); + // add a question (per-staff question field: questions__[]) + const q = page.locator(`input[name="questions__${seed.staffId}[]"]`).first(); + if (await q.count()) await q.fill('E2E feedback question?'); // select the accused staff checkbox matching our staff id const staffBox = page.locator(`input[name="accused_staff[]"][value="${seed.staffId}"]`).first(); if (await staffBox.count()) await staffBox.check(); diff --git a/e2e/tests/workflows/reports-kpis-workflow.spec.ts b/e2e/tests/workflows/reports-kpis-workflow.spec.ts index 501d0af..54a38bd 100644 --- a/e2e/tests/workflows/reports-kpis-workflow.spec.ts +++ b/e2e/tests/workflows/reports-kpis-workflow.spec.ts @@ -72,7 +72,7 @@ test.describe('Reports + KPIs / Analytics', () => { }); // 3. Command Center - await visitPage(page, '/analytics/command-center/', 'command-center', ADMIN, async (p) => { + await visitPage(page, '/', 'command-center', ADMIN, async (p) => { const body = (await p.textContent('body')) || ''; const hasCards = await p.locator('.card, .rounded-2xl, .bg-white, [class*="stat"]').count(); observe(M, 'command-center-cards', hasCards > 0 ? 'PASS' : 'WARN', `overview cards: ${hasCards}`, { role: ADMIN }); @@ -124,16 +124,6 @@ test.describe('Reports + KPIs / Analytics', () => { // 9. Report Templates await visitPage(page, '/reports/templates/', 'report-templates', ADMIN); - - // 10. Dashboard CSV export (command center) - try { - const exportResp = await page.context().request.get(`${BASE_URL}/analytics/api/command-center/export/excel/`); - const ct = exportResp.headers()['content-type'] || ''; - const exportOk = exportResp.status() === 200 && (ct.includes('csv') || ct.includes('excel') || ct.includes('spreadsheet') || ct.includes('octet')); - observe(M, 'command-center-export', exportOk ? 'PASS' : 'FAIL', `CSV export: HTTP ${exportResp.status()} ct=${ct}`, { role: ADMIN, http: exportResp.status() }); - } catch (e) { - observe(M, 'command-center-export', 'FAIL', `exception: ${(e as Error).message}`, { role: ADMIN }); - } }); test('Role access: px_employee + viewer can view, source_user blocked', async ({ page }) => { diff --git a/locale/ar/LC_MESSAGES/django.mo b/locale/ar/LC_MESSAGES/django.mo index ee005c5..22ec37d 100644 Binary files a/locale/ar/LC_MESSAGES/django.mo and b/locale/ar/LC_MESSAGES/django.mo differ diff --git a/locale/ar/LC_MESSAGES/django.po b/locale/ar/LC_MESSAGES/django.po index 587728e..596ca64 100644 --- a/locale/ar/LC_MESSAGES/django.po +++ b/locale/ar/LC_MESSAGES/django.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: PX360 1.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-04-09 13:06+0300\n" +"POT-Creation-Date: 2026-06-28 12:53+0300\n" "PO-Revision-Date: 2025-12-15 12:30+0300\n" "Last-Translator: PX360 Team\n" "Language-Team: Arabic\n" @@ -14,62 +14,90 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" +"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " +"&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" #: appreciation/forms.py:26 msgid "Category name" msgstr "اسم الفئة" -#: appreciation/forms.py:31 apps/complaints/forms.py:512 -#: apps/projects/forms.py:385 +#: appreciation/forms.py:31 apps/complaints/forms.py:471 +#: apps/observations/forms.py:776 apps/projects/forms.py:435 #: templates/accounts/onboarding/category_list.html:236 #: templates/accounts/onboarding/checklist_list.html:450 #: templates/accounts/simple_acknowledgements/admin_create.html:47 #: templates/accounts/simple_acknowledgements/admin_form.html:135 +#: templates/accounts/staff_activity_log.html:129 #: templates/actions/action_create.html:39 #: templates/actions/action_detail.html:165 #: templates/callcenter/complaint_form.html:175 #: templates/complaints/adverse_action_form.html:184 -#: templates/complaints/complaint_list.html:214 +#: templates/complaints/complaint_detail.html:340 +#: templates/complaints/complaint_list.html:236 #: templates/complaints/complaint_pdf.html:564 #: templates/complaints/complaint_threshold_form.html:361 #: templates/complaints/escalation_rule_form.html:390 -#: templates/core/public_submit.html:510 -#: templates/emails/new_complaint_admin_notification.html:98 -#: templates/emails/observation_assigned.html:110 +#: templates/complaints/explanation_form.html:58 +#: templates/complaints/investigation_questions.html:51 +#: templates/complaints/investigation_respond.html:46 +#: templates/complaints/investigation_review.html:39 +#: templates/complaints/trash_list.html:80 +#: templates/config/deleted_items.html:80 templates/core/public_submit.html:420 +#: templates/emails/new_complaint_admin_notification.html:25 #: templates/journeys/template_form.html:239 #: templates/observations/category_form.html:50 #: templates/observations/convert_to_action.html:50 #: templates/observations/convert_to_action.html:65 -#: templates/observations/observation_create.html:186 -#: templates/observations/observation_detail.html:114 -#: templates/observations/observation_list.html:298 -#: templates/observations/public_new.html:138 +#: templates/observations/observation_create.html:134 +#: templates/observations/observation_department_response.html:29 +#: templates/observations/observation_list.html:300 +#: templates/observations/public_new.html:153 +#: templates/organizations/department_complaint_detail.html:85 +#: templates/organizations/department_detail.html:1241 +#: templates/organizations/department_detail.html:1301 +#: templates/organizations/department_manager_review.html:96 +#: templates/organizations/department_observation_detail.html:62 +#: templates/organizations/department_staff_detail.html:466 +#: templates/presentations/presentation_form.html:38 #: templates/projects/convert_action.html:146 -#: templates/projects/project_form.html:188 +#: templates/projects/focus_phase_detail.html:99 +#: templates/projects/focus_phase_form.html:47 +#: templates/projects/partials/phase_form_modal.html:28 +#: templates/projects/partials/task_form_modal.html:24 +#: templates/projects/pdca_phase_detail.html:98 +#: templates/projects/pdca_phase_form.html:47 +#: templates/projects/project_form.html:194 #: templates/projects/project_save_as_template.html:54 -#: templates/projects/task_form.html:137 +#: templates/projects/task_form.html:151 #: templates/projects/template_form.html:159 #: templates/projects/template_form.html:191 #: templates/projects/template_form.html:291 +#: templates/px_sources/convert_to_complaint_modal.html:46 #: templates/px_sources/source_confirm_delete.html:69 #: templates/px_sources/source_detail.html:157 -#: templates/px_sources/source_detail.html:249 -#: templates/px_sources/source_form.html:232 templates/rca/rca_detail.html:167 -#: templates/rca/rca_detail.html:426 templates/rca/rca_detail.html:467 -#: templates/rca/rca_form.html:55 templates/references/document_view.html:364 -#: templates/references/document_view.html:488 +#: templates/px_sources/source_detail.html:257 +#: templates/px_sources/source_detail.html:621 +#: templates/px_sources/source_form.html:232 +#: templates/px_sources/source_user_observation_list.html:155 +#: templates/rca/rca_detail.html:167 templates/rca/rca_detail.html:426 +#: templates/rca/rca_detail.html:467 templates/rca/rca_form.html:55 +#: templates/references/document_view.html:364 +#: templates/references/document_view.html:487 #: templates/reports/report_builder.html:190 +#: templates/standards/activity_type_confirm_delete.html:104 #: templates/standards/attachment_confirm_delete.html:78 #: templates/standards/attachment_upload.html:106 #: templates/standards/attachment_upload.html:195 #: templates/standards/category_confirm_delete.html:112 #: templates/standards/category_list.html:129 #: templates/standards/compliance_form.html:157 -#: templates/standards/department_standards.html:318 -#: templates/standards/department_standards.html:356 +#: templates/standards/department_standards.html:417 +#: templates/standards/department_standards.html:455 +#: templates/standards/search.html:535 templates/standards/search.html:568 #: templates/standards/source_confirm_delete.html:108 -#: templates/standards/standard_detail.html:195 +#: templates/standards/standard_detail.html:254 +#: templates/standards/standard_detail.html:550 +#: templates/standards/standard_detail.html:575 msgid "Description" msgstr "الوصف" @@ -129,18 +157,28 @@ msgstr "حدد هذا الخيار إذا كان التعليق داخليًا msgid "Search appreciations..." msgstr "البحث في رسائل التقدير..." -#: appreciation/forms.py:267 templates/complaints/adverse_action_list.html:220 +#: appreciation/forms.py:267 +#: apps/executive_summary/templates/executive/insights.html:66 +#: templates/complaints/adverse_action_list.html:220 +#: templates/complaints/government_ticket_list.html:94 #: templates/journeys/instance_list.html:184 -#: templates/observations/observation_list.html:181 -#: templates/organizations/patient_list.html:214 +#: templates/observations/observation_list.html:182 +#: templates/organizations/department_complaints.html:33 +#: templates/organizations/department_inquiries.html:32 +#: templates/organizations/department_observations.html:32 +#: templates/organizations/patient_list.html:234 #: templates/px_sources/source_user_complaint_list.html:115 #: templates/px_sources/source_user_inquiry_list.html:115 +#: templates/px_sources/source_user_observation_list.html:103 +#: templates/px_sources/source_user_suggestion_list.html:103 #: templates/reports/report_builder.html:92 msgid "All Statuses" msgstr "جميع الحالات" -#: appreciation/forms.py:274 apps/references/forms.py:219 -#: templates/analytics/kpi_report_list.html:161 +#: appreciation/forms.py:274 +#: apps/executive_summary/templates/executive/insights.html:75 +#: apps/references/forms.py:219 templates/accounts/staff_activity_log.html:87 +#: templates/analytics/kpi_report_list.html:204 #: templates/complaints/adverse_action_list.html:238 #: templates/complaints/complaint_threshold_list.html:209 #: templates/journeys/instance_list.html:174 @@ -151,16 +189,17 @@ msgstr "جميع الأنواع" #: templates/accounts/acknowledgements/category_list.html:87 #: templates/accounts/acknowledgements/checklist_list.html:88 #: templates/accounts/onboarding/category_list.html:62 -#: templates/analytics/command_center.html:133 -#: templates/appreciation/appreciation_list.html:198 #: templates/appreciation/category_list.html:110 #: templates/complaints/complaint_threshold_form.html:301 #: templates/complaints/complaint_threshold_list.html:283 -#: templates/complaints/inquiry_list.html:196 -#: templates/observations/observation_list.html:206 +#: templates/complaints/inquiry_list.html:153 +#: templates/observations/observation_list.html:207 +#: templates/organizations/department_list.html:129 #: templates/px_sources/source_user_complaint_list.html:138 #: templates/px_sources/source_user_inquiry_list.html:127 -#: templates/standards/search.html:118 +#: templates/px_sources/source_user_observation_list.html:115 +#: templates/standards/search.html:118 templates/standards/search.html:604 +#: templates/standards/search.html:619 templates/standards/search.html:629 msgid "All Categories" msgstr "جميع الفئات" @@ -173,23 +212,23 @@ msgid "Personal info" msgstr "المعلومات الشخصية" #: apps/accounts/admin.py:40 templates/callcenter/complaint_form.html:128 -#: templates/callcenter/inquiry_form.html:132 -#: templates/complaints/inquiry_detail.html:481 -#: templates/complaints/inquiry_form.html:197 +#: templates/callcenter/inquiry_form.html:147 +#: templates/complaints/inquiry_form.html:97 +#: templates/config/user_form.html:249 +#: templates/organizations/department_staff_detail.html:87 #: templates/organizations/staff_detail.html:98 #: templates/organizations/staff_form.html:289 msgid "Organization" msgstr "المنظمة" #: apps/accounts/admin.py:41 templates/accounts/settings.html:24 -#: templates/layouts/partials/sidebar.html:621 -#: templates/layouts/partials/topbar.html:116 +#: templates/layouts/partials/topbar.html:117 msgid "Profile" msgstr "الملف الشخصي" #: apps/accounts/admin.py:42 #: templates/px_sources/source_user_confirm_delete.html:93 -#: templates/px_sources/source_user_form.html:311 +#: templates/px_sources/source_user_form.html:281 msgid "Permissions" msgstr "الصلاحيات" @@ -197,92 +236,535 @@ msgstr "الصلاحيات" msgid "Important dates" msgstr "التواريخ المهمة" -#: apps/accounts/models.py:409 +#: apps/accounts/forms.py:18 apps/accounts/views.py:371 +#: apps/complaints/models.py:2584 apps/complaints/models.py:3413 +#: apps/surveys/forms.py:199 apps/surveys/forms.py:408 +#: templates/accounts/onboarding/dashboard.html:222 +#: templates/accounts/onboarding/provisional_list.html:133 +#: templates/accounts/onboarding/provisional_list.html:265 +#: templates/accounts/settings.html:97 templates/accounts/settings.html:400 +#: templates/appreciation/appreciation_detail.html:132 +#: templates/complaints/oncall/schedule_detail.html:137 +#: templates/complaints/public_complaint_form.html:51 +#: templates/config/hospital_users.html:237 templates/config/user_form.html:219 +#: templates/config/user_form.html:436 templates/core/public_submit.html:433 +#: templates/notifications/settings.html:401 +#: templates/observations/public_new.html:220 +#: templates/organizations/department_form.html:142 +#: templates/organizations/department_inquiry_detail.html:94 +#: templates/organizations/department_staff_detail.html:133 +#: templates/organizations/department_staff_detail.html:389 +#: templates/organizations/patient_detail.html:248 +#: templates/organizations/staff_detail.html:128 +#: templates/organizations/staff_form.html:229 +#: templates/physicians/physician_detail.html:382 +#: templates/simulator/log_detail.html:70 templates/simulator/log_list.html:156 +#: templates/simulator/log_list.html:219 templates/simulator/log_list.html:293 +#: templates/surveys/instance_detail.html:483 +msgid "Email" +msgstr "البريد الإلكتروني" + +#: apps/accounts/forms.py:25 apps/accounts/forms.py:154 +#: templates/accounts/onboarding/provisional_list.html:285 +#: templates/accounts/settings.html:83 templates/config/user_form.html:194 +#: templates/organizations/department_staff_detail.html:353 +#: templates/organizations/patient_detail.html:222 +#: templates/organizations/staff_form.html:113 +#: templates/px_sources/source_user_form.html:186 +msgid "First Name" +msgstr "الاسم الأول" + +#: apps/accounts/forms.py:31 apps/accounts/forms.py:160 +#: templates/accounts/onboarding/provisional_list.html:294 +#: templates/accounts/settings.html:90 templates/config/user_form.html:206 +#: templates/organizations/department_staff_detail.html:358 +#: templates/organizations/patient_detail.html:227 +#: templates/organizations/staff_form.html:128 +#: templates/px_sources/source_user_form.html:196 +msgid "Last Name" +msgstr "اسم العائلة" + +#: apps/accounts/forms.py:37 apps/accounts/forms.py:166 +#: apps/complaints/models.py:2582 +#: templates/appreciation/appreciation_detail.html:126 +#: templates/config/user_form.html:232 templates/core/public_submit.html:432 +#: templates/observations/public_new.html:216 +#: templates/organizations/department_form.html:137 +#: templates/organizations/department_inquiry_detail.html:88 +#: templates/organizations/department_staff_detail.html:139 +#: templates/organizations/department_staff_detail.html:394 +#: templates/organizations/hospital_list.html:164 +#: templates/organizations/patient_detail.html:244 +#: templates/organizations/staff_detail.html:138 +#: templates/organizations/staff_form.html:276 +#: templates/physicians/physician_detail.html:388 +#: templates/surveys/his_patient_survey_send.html:122 +#: templates/surveys/instance_detail.html:474 +msgid "Phone" +msgstr "رقم الهاتف" + +#: apps/accounts/forms.py:45 apps/accounts/forms.py:174 +#: templates/accounts/onboarding/provisional_list.html:274 +#: templates/accounts/settings.html:428 +#: templates/accounts/simple_acknowledgements/admin_upload_pdf.html:80 +#: templates/accounts/simple_acknowledgements/admin_upload_pdf.html:85 +#: templates/accounts/simple_acknowledgements/sign.html:78 +#: templates/config/user_form.html:238 +#: templates/organizations/department_detail.html:518 +#: templates/organizations/department_staff_detail.html:69 +#: templates/organizations/staff_detail.html:110 +#: templates/organizations/staff_form.html:214 +#: templates/organizations/staff_hierarchy.html:231 +#: templates/px_sources/source_user_form.html:216 +msgid "Employee ID" +msgstr "الرقم الوظيفي" + +#: apps/accounts/forms.py:53 apps/accounts/forms.py:182 +#: apps/complaints/forms.py:123 apps/complaints/forms.py:424 +#: apps/complaints/forms.py:588 apps/complaints/forms.py:980 +#: apps/complaints/models.py:68 +#: apps/executive_summary/templates/executive/insights.html:83 +#: apps/feedback/forms.py:270 apps/feedback/models.py:407 +#: apps/observations/forms.py:187 apps/observations/forms.py:736 +#: apps/surveys/forms.py:375 +#: templates/accounts/onboarding/provisional_list.html:305 +#: templates/accounts/settings.html:414 +#: templates/appreciation/leaderboard.html:146 +#: templates/callcenter/complaint_form.html:133 +#: templates/callcenter/complaint_list.html:179 +#: templates/callcenter/inquiry_form.html:152 +#: templates/callcenter/inquiry_list.html:176 +#: templates/complaints/analytics.html:331 +#: templates/complaints/complaint_pdf.html:519 +#: templates/complaints/complaint_threshold_form.html:170 +#: templates/complaints/complaint_threshold_list.html:252 +#: templates/complaints/escalation_rule_form.html:185 +#: templates/complaints/escalation_rule_list.html:286 +#: templates/complaints/partials/resolution_panel.html:28 +#: templates/complaints/partials/resolution_panel.html:169 +#: templates/complaints/public_complaint_form.html:83 +#: templates/complaints/public_inquiry_form.html:48 +#: templates/complaints/trash_list.html:38 +#: templates/complaints/trash_list.html:81 +#: templates/config/deleted_items.html:38 +#: templates/config/deleted_items.html:81 +#: templates/config/deleted_items.html:124 +#: templates/config/deleted_items.html:167 +#: templates/config/hospital_users.html:176 +#: templates/config/hospital_users.html:238 +#: templates/config/routing_rules.html:44 templates/config/sla_config.html:41 +#: templates/config/user_form.html:254 templates/core/public_submit.html:443 +#: templates/dashboard/admin_evaluation.html:460 +#: templates/dashboard/admin_evaluation.html:537 +#: templates/dashboard/census_report.html:33 +#: templates/dashboard/comments_report.html:26 +#: templates/dashboard/complaint_monthly_report.html:34 +#: templates/dashboard/complaint_quarterly_report.html:34 +#: templates/dashboard/inquiry_report.html:42 +#: templates/dashboard/observation_report.html:34 +#: templates/dashboard/standards_dashboard.html:28 +#: templates/emails/new_appreciation_notification.html:18 +#: templates/emails/new_complaint_admin_notification.html:21 +#: templates/emails/new_inquiry_notification.html:21 +#: templates/emails/new_suggestion_notification.html:21 +#: templates/feedback/comment_import_list.html:70 +#: templates/feedback/feedback_delete_confirm.html:111 +#: templates/feedback/feedback_detail.html:86 +#: templates/feedback/feedback_form.html:102 +#: templates/integrations/survey_mapping_settings.html:123 +#: templates/journeys/instance_list.html:240 +#: templates/journeys/template_form.html:199 +#: templates/journeys/template_list.html:80 +#: templates/layouts/partials/sidebar.html:716 +#: templates/observations/observation_create.html:70 +#: templates/observations/public_new.html:71 +#: templates/organizations/department_confirm_delete.html:30 +#: templates/organizations/department_form.html:126 +#: templates/organizations/department_staff_detail.html:91 +#: templates/organizations/patient_detail.html:582 +#: templates/organizations/patient_list.html:526 +#: templates/organizations/patient_visit_journey.html:131 +#: templates/organizations/physician_list.html:80 +#: templates/organizations/section_list.html:125 +#: templates/organizations/staff_detail.html:102 +#: templates/organizations/staff_hierarchy.html:183 +#: templates/organizations/staff_hierarchy.html:233 +#: templates/physicians/doctor_rating_import.html:120 +#: templates/physicians/doctor_rating_job_list.html:105 +#: templates/physicians/doctor_rating_job_status.html:158 +#: templates/physicians/doctor_rating_review.html:102 +#: templates/physicians/physician_detail.html:371 +#: templates/physicians/physician_list.html:196 +#: templates/physicians/physician_ratings_dashboard.html:458 +#: templates/physicians/ratings_list.html:200 +#: templates/physicians/specialization_overview.html:108 +#: templates/presentations/presentation_detail.html:148 +#: templates/presentations/presentation_generate.html:39 +#: templates/projects/convert_action.html:115 +#: templates/projects/project_form.html:208 +#: templates/projects/project_list.html:166 +#: templates/projects/project_save_as_template.html:108 +#: templates/px_sources/convert_to_complaint_modal.html:59 +#: templates/px_sources/source_detail.html:260 +#: templates/px_sources/source_detail.html:327 +#: templates/px_sources/source_detail.html:477 +#: templates/rca/rca_detail.html:148 templates/rca/rca_list.html:231 +#: templates/simulator/log_detail.html:238 +#: templates/surveys/bulk_job_list.html:85 +#: templates/surveys/instance_detail.html:455 +#: templates/surveys/template_detail.html:244 +#: templates/surveys/template_list.html:85 +msgid "Hospital" +msgstr "المستشفى" + +#: apps/accounts/forms.py:61 apps/accounts/forms.py:190 +#: apps/complaints/forms.py:447 +#: templates/accounts/acknowledgements/compliance.html:138 +#: templates/accounts/onboarding/provisional_list.html:318 +#: templates/accounts/settings.html:421 templates/analytics/dashboard.html:776 +#: templates/analytics/dashboard.html:1005 +#: templates/analytics/dashboard.html:1119 +#: templates/appreciation/appreciation_detail.html:292 +#: templates/appreciation/appreciation_list.html:192 +#: templates/appreciation/leaderboard.html:118 +#: templates/appreciation/leaderboard.html:147 +#: templates/callcenter/call_records_list.html:217 +#: templates/callcenter/complaint_form.html:139 +#: templates/callcenter/inquiry_form.html:157 +#: templates/complaints/complaint_detail.html:1062 +#: templates/complaints/complaint_detail.html:1126 +#: templates/complaints/complaint_list.html:197 +#: templates/complaints/complaint_list.html:238 +#: templates/complaints/complaint_pdf.html:523 +#: templates/complaints/government_ticket_detail.html:127 +#: templates/complaints/government_ticket_form.html:201 +#: templates/complaints/government_ticket_import.html:166 +#: templates/complaints/government_ticket_list.html:101 +#: templates/complaints/government_ticket_list.html:144 +#: templates/complaints/inquiry_detail.html:753 +#: templates/complaints/involved_department_form.html:129 +#: templates/complaints/partials/departments_panel.html:34 +#: templates/complaints/partials/pdf_summary_panel.html:57 +#: templates/complaints/public_complaint_form.html:127 +#: templates/complaints/public_inquiry_form.html:90 +#: templates/complaints/public_inquiry_track.html:198 +#: templates/components/send_to_modal.html:46 +#: templates/config/hospital_users.html:239 templates/config/user_form.html:266 +#: templates/core/public_submit.html:499 +#: templates/dashboard/admin_evaluation.html:276 +#: templates/dashboard/admin_evaluation.html:461 +#: templates/dashboard/admin_evaluation.html:538 +#: templates/dashboard/command_center.html:658 +#: templates/dashboard/complaint_quarterly_report.html:642 +#: templates/dashboard/complaint_request_list.html:86 +#: templates/dashboard/employee_evaluation.html:730 +#: templates/dashboard/employee_evaluation.html:1114 +#: templates/dashboard/inquiry_report.html:196 +#: templates/dashboard/observation_report.html:172 +#: templates/emails/new_appreciation_notification.html:19 +#: templates/emails/new_complaint_admin_notification.html:22 +#: templates/emails/new_inquiry_notification.html:22 +#: templates/emails/new_suggestion_notification.html:22 +#: templates/feedback/feedback_detail.html:133 +#: templates/feedback/feedback_detail.html:331 +#: templates/journeys/instance_list.html:192 +#: templates/observations/observation_create.html:91 +#: templates/observations/observation_detail.html:614 +#: templates/observations/observation_detail.html:684 +#: templates/observations/observation_list.html:218 +#: templates/observations/observation_list.html:304 +#: templates/observations/public_new.html:130 +#: templates/organizations/department_complaint_detail.html:105 +#: templates/organizations/department_detail.html:5 +#: templates/organizations/department_detail.html:1305 +#: templates/organizations/department_inquiry_detail.html:69 +#: templates/organizations/department_list.html:140 +#: templates/organizations/department_manager_review.html:67 +#: templates/organizations/department_staff_detail.html:95 +#: templates/organizations/department_staff_detail.html:470 +#: templates/organizations/orgsection_confirm_delete.html:30 +#: templates/organizations/orgsection_form.html:90 +#: templates/organizations/orgsection_list.html:80 +#: templates/organizations/orgsection_list.html:125 +#: templates/organizations/orgsubsection_list.html:126 +#: templates/organizations/physician_list.html:81 +#: templates/organizations/section_confirm_delete.html:30 +#: templates/organizations/section_form.html:105 +#: templates/organizations/section_list.html:80 +#: templates/organizations/section_list.html:124 +#: templates/organizations/staff_detail.html:106 +#: templates/organizations/staff_form.html:298 +#: templates/organizations/staff_hierarchy.html:193 +#: templates/organizations/staff_hierarchy.html:234 +#: templates/organizations/staff_list.html:219 +#: templates/organizations/staff_list.html:268 +#: templates/organizations/subsection_list.html:125 +#: templates/physicians/doctor_rating_review.html:178 +#: templates/physicians/individual_ratings_list.html:187 +#: templates/physicians/leaderboard.html:134 +#: templates/physicians/leaderboard.html:200 +#: templates/physicians/physician_detail.html:376 +#: templates/physicians/physician_list.html:146 +#: templates/physicians/physician_list.html:195 +#: templates/physicians/physician_ratings_dashboard.html:280 +#: templates/physicians/physician_ratings_dashboard.html:457 +#: templates/physicians/ratings_list.html:160 +#: templates/physicians/ratings_list.html:199 +#: templates/physicians/specialization_overview.html:107 +#: templates/projects/convert_action.html:120 +#: templates/projects/project_form.html:222 +#: templates/projects/project_save_as_template.html:114 +#: templates/projects/template_detail.html:110 +#: templates/px_sources/convert_to_complaint_modal.html:70 +#: templates/px_sources/source_user_complaint_list.html:185 +#: templates/rca/rca_detail.html:152 templates/rca/rca_form.html:79 +#: templates/reports/report_builder.html:82 +#: templates/simulator/log_detail.html:227 +#: templates/standards/attachment_confirm_delete.html:94 +#: templates/standards/attachment_upload.html:147 +#: templates/standards/compliance_form.html:242 +#: templates/standards/dashboard.html:195 +#: templates/standards/dashboard.html:255 templates/standards/search.html:127 +#: templates/standards/search.html:148 +#: templates/standards/standard_confirm_delete.html:90 +#: templates/standards/standard_detail.html:143 +#: templates/standards/standard_detail.html:336 +#: templates/standards/standard_detail.html:386 +msgid "Department" +msgstr "القسم" + +#: apps/accounts/forms.py:69 apps/accounts/forms.py:198 +#: templates/accounts/onboarding/provisional_list.html:332 +#: templates/organizations/department_detail.html:413 +msgid "Roles" +msgstr "الأدوار" + +#: apps/accounts/forms.py:76 templates/accounts/login.html:85 +#: templates/accounts/onboarding/step_activation.html:75 +#: templates/config/user_form.html:320 templates/config/user_form.html:325 +#: templates/px_sources/source_user_form.html:226 +msgid "Password" +msgstr "كلمة المرور" + +#: apps/accounts/forms.py:80 +msgid "Leave blank to generate random password" +msgstr "اتركه فارغاً لإنشاء كلمة مرور عشوائية" + +#: apps/accounts/forms.py:84 +#: templates/accounts/onboarding/step_activation.html:84 +#: templates/accounts/password_reset_confirm.html:98 +#: templates/config/user_form.html:347 +#: templates/px_sources/source_user_form.html:239 +msgid "Confirm Password" +msgstr "تأكيد كلمة المرور" + +#: apps/accounts/forms.py:91 apps/accounts/forms.py:205 apps/core/models.py:141 +#: templates/accounts/acknowledgements/category_form.html:195 +#: templates/accounts/acknowledgements/category_list.html:127 +#: templates/accounts/acknowledgements/checklist_form.html:210 +#: templates/accounts/acknowledgements/checklist_list.html:98 +#: templates/accounts/acknowledgements/checklist_list.html:172 +#: templates/accounts/onboarding/category_list.html:82 +#: templates/accounts/onboarding/category_list.html:248 +#: templates/accounts/onboarding/checklist_list.html:162 +#: templates/accounts/onboarding/checklist_list.html:461 +#: templates/accounts/onboarding/content_list.html:99 +#: templates/accounts/onboarding/content_list.html:305 +#: templates/accounts/onboarding/provisional_list.html:193 +#: templates/accounts/simple_acknowledgements/admin_create.html:83 +#: templates/accounts/simple_acknowledgements/admin_form.html:168 +#: templates/accounts/simple_acknowledgements/admin_list.html:98 +#: templates/accounts/simple_acknowledgements/admin_list.html:136 +#: templates/appreciation/badge_form.html:224 +#: templates/appreciation/badge_list.html:127 +#: templates/appreciation/category_form.html:209 +#: templates/complaints/complaint_threshold_form.html:351 +#: templates/complaints/complaint_threshold_list.html:220 +#: templates/complaints/complaint_threshold_list.html:293 +#: templates/complaints/escalation_rule_form.html:380 +#: templates/complaints/escalation_rule_list.html:254 +#: templates/complaints/escalation_rule_list.html:341 +#: templates/complaints/oncall/schedule_detail.html:147 +#: templates/complaints/oncall/schedule_list.html:208 +#: templates/complaints/sla_management_form.html:344 +#: templates/complaints/templates/template_list.html:181 +#: templates/complaints/templates/template_list.html:212 +#: templates/config/hospital_users.html:144 +#: templates/config/hospital_users.html:198 +#: templates/config/hospital_users.html:285 +#: templates/config/routing_rules.html:95 templates/config/sla_config.html:76 +#: templates/config/user_form.html:377 +#: templates/dashboard/admin_evaluation.html:291 +#: templates/dashboard/employee_evaluation.html:745 +#: templates/dashboard/employee_evaluation_charts.html:211 +#: templates/integrations/survey_mapping_settings.html:51 +#: templates/integrations/survey_mapping_settings.html:183 +#: templates/journeys/instance_list.html:123 +#: templates/journeys/instance_list.html:185 +#: templates/journeys/template_detail.html:42 +#: templates/journeys/template_detail.html:74 +#: templates/journeys/template_detail.html:141 +#: templates/journeys/template_form.html:209 +#: templates/journeys/template_list.html:95 +#: templates/observations/category_form.html:83 +#: templates/observations/category_list.html:123 +#: templates/organizations/department_confirm_delete.html:36 +#: templates/organizations/department_detail.html:674 +#: templates/organizations/department_form.html:154 +#: templates/organizations/department_list.html:84 +#: templates/organizations/hierarchy_node.html:61 +#: templates/organizations/hospital_list.html:129 +#: templates/organizations/manager_review_question_form.html:73 +#: templates/organizations/manager_review_questions.html:27 +#: templates/organizations/manager_review_questions.html:46 +#: templates/organizations/orgsection_confirm_delete.html:36 +#: templates/organizations/orgsection_detail.html:162 +#: templates/organizations/orgsection_form.html:138 +#: templates/organizations/orgsection_list.html:92 +#: templates/organizations/orgsection_list.html:157 +#: templates/organizations/orgsubsection_confirm_delete.html:36 +#: templates/organizations/orgsubsection_form.html:136 +#: templates/organizations/orgsubsection_list.html:92 +#: templates/organizations/orgsubsection_list.html:153 +#: templates/organizations/patient_detail.html:358 +#: templates/organizations/patient_list.html:186 +#: templates/organizations/patient_list.html:235 +#: templates/organizations/patient_visit_journey.html:102 +#: templates/organizations/section_confirm_delete.html:36 +#: templates/organizations/section_form.html:117 +#: templates/organizations/section_list.html:92 +#: templates/organizations/section_list.html:153 +#: templates/organizations/staff_detail.html:21 +#: templates/organizations/staff_detail.html:409 +#: templates/organizations/staff_detail.html:473 +#: templates/organizations/staff_hierarchy.html:300 +#: templates/organizations/staff_list.html:157 +#: templates/organizations/staff_list.html:204 +#: templates/organizations/staff_list.html:333 +#: templates/organizations/subsection_confirm_delete.html:36 +#: templates/organizations/subsection_form.html:117 +#: templates/organizations/subsection_list.html:92 +#: templates/organizations/subsection_list.html:153 +#: templates/physicians/physician_detail.html:338 +#: templates/physicians/physician_list.html:161 +#: templates/projects/project_list.html:106 +#: templates/projects/project_list.html:145 +#: templates/projects/template_list.html:90 +#: templates/px_sources/source_confirm_delete.html:78 +#: templates/px_sources/source_detail.html:102 +#: templates/px_sources/source_form.html:266 +#: templates/px_sources/source_list.html:174 +#: templates/px_sources/source_list.html:251 +#: templates/px_sources/source_user_confirm_delete.html:81 +#: templates/px_sources/source_user_form.html:271 +#: templates/references/folder_form.html:257 +#: templates/social/dashboard.html:104 +#: templates/standards/activity_type_list.html:148 +#: templates/standards/category_list.html:159 +#: templates/standards/source_list.html:165 +#: templates/surveys/template_detail.html:65 +#: templates/surveys/template_detail.html:251 +#: templates/surveys/template_list.html:118 +msgid "Active" +msgstr "نشط" + +#: apps/accounts/forms.py:118 apps/px_sources/ui_views.py:430 +msgid "A user with this email already exists." +msgstr "يوجد مستخدم بهذا البريد الإلكتروني بالفعل." + +#: apps/accounts/forms.py:126 apps/px_sources/ui_views.py:444 +msgid "Passwords do not match." +msgstr "كلمات المرور غير متطابقة." + +#: apps/accounts/models.py:465 msgid "User Created" msgstr "تم إنشاء المستخدم" -#: apps/accounts/models.py:410 +#: apps/accounts/models.py:466 msgid "Invitation Sent" msgstr "تم إرسال الدعوة" -#: apps/accounts/models.py:411 +#: apps/accounts/models.py:467 msgid "Invitation Resent" msgstr "تم إعادة إرسال الدعوة" -#: apps/accounts/models.py:412 +#: apps/accounts/models.py:468 msgid "Wizard Started" msgstr "بدأ المعالج التلقائي" -#: apps/accounts/models.py:413 +#: apps/accounts/models.py:469 msgid "Wizard Step Completed" msgstr "اكتملت خطوة المعالج التلقائي" -#: apps/accounts/models.py:414 +#: apps/accounts/models.py:470 msgid "Wizard Completed" msgstr "اكتمل المعالج التوجيهي" -#: apps/accounts/models.py:415 +#: apps/accounts/models.py:471 msgid "User Activated" msgstr "تم تفعيل المستخدم" -#: apps/accounts/models.py:416 templates/emails/invitation_expired.html:8 +#: apps/accounts/models.py:472 msgid "Invitation Expired" msgstr "انتهت صلاحية الدعوة" -#: apps/accounts/models.py:451 templates/accounts/settings.html:422 +#: apps/accounts/models.py:507 templates/accounts/settings.html:439 msgid "PX Admin" msgstr "مشرف PX" -#: apps/accounts/models.py:452 templates/accounts/settings.html:424 +#: apps/accounts/models.py:508 templates/accounts/settings.html:441 msgid "Hospital Admin" msgstr "مشرف المستشفى" -#: apps/accounts/models.py:453 -#: templates/emails/survey_results_notification.html:130 +#: apps/accounts/models.py:509 +#: templates/emails/survey_results_notification.html:42 msgid "Department Manager" msgstr "مدير القسم" -#: apps/accounts/models.py:454 -msgid "PX Staff" -msgstr "موظف تجربة المرضى" +#: apps/accounts/models.py:510 +msgid "Director" +msgstr "مدير" -#: apps/accounts/models.py:455 apps/organizations/models.py:177 -#: templates/analytics/command_center.html:388 -#: templates/appreciation/appreciation_send_form.html:122 -#: templates/callcenter/complaint_form.html:148 -#: templates/dashboard/command_center.html:657 -#: templates/feedback/feedback_form.html:335 -#: templates/organizations/staff_list.html:207 -#: templates/physicians/department_overview.html:107 -#: templates/physicians/leaderboard.html:177 -#: templates/physicians/physician_list.html:192 -#: templates/physicians/physician_ratings_dashboard.html:455 -#: templates/physicians/ratings_list.html:197 -#: templates/physicians/specialization_overview.html:106 -msgid "Physician" -msgstr "طبيب" +#: apps/accounts/models.py:511 apps/complaints/models.py:2851 +msgid "PX Management" +msgstr "إدارة PX" -#: apps/accounts/models.py:456 apps/organizations/models.py:178 -#: templates/organizations/staff_list.html:208 -msgid "Nurse" -msgstr "ممرض/ممرضة" +#: apps/accounts/models.py:512 templates/complaints/oncall/admin_form.html:155 +#: templates/organizations/staff_detail.html:509 +msgid "PX Employee" +msgstr "موظف PX" -#: apps/accounts/models.py:457 apps/complaints/forms.py:462 -#: apps/complaints/models.py:73 apps/surveys/forms.py:195 -#: templates/accounts/settings.html:428 -#: templates/complaints/complaint_detail.html:130 +#: apps/accounts/models.py:513 apps/complaints/forms.py:463 +#: apps/complaints/models.py:91 apps/surveys/forms.py:195 +#: templates/accounts/settings.html:445 +#: templates/appreciation/appreciation_list.html:191 +#: templates/complaints/complaint_detail.html:1136 +#: templates/complaints/inquiry_detail.html:737 #: templates/dashboard/complaint_request_list.html:41 #: templates/dashboard/complaint_request_list.html:87 -#: templates/layouts/partials/sidebar.html:289 +#: templates/dashboard/my_performance.html:240 +#: templates/layouts/partials/sidebar.html:299 +#: templates/organizations/department_complaints.html:70 +#: templates/organizations/department_detail.html:95 +#: templates/organizations/department_detail.html:409 +#: templates/organizations/department_detail.html:702 +#: templates/organizations/department_list.html:143 +#: templates/organizations/department_staff_detail.html:13 #: templates/organizations/staff_detail.html:17 +#: templates/organizations/staff_detail.html:508 +#: templates/organizations/staff_import.html:32 #: templates/surveys/manual_send.html:73 msgid "Staff" msgstr "الموظفين" -#: apps/accounts/models.py:458 +#: apps/accounts/models.py:514 msgid "Viewer" msgstr "عارض" +#: apps/accounts/models.py:515 +msgid "Executive" +msgstr "تنفيذي" + #: apps/accounts/simple_acknowledgement_views.py:107 msgid "You have already signed this acknowledgement." msgstr "لقد وقعت على هذا الإقرار بالفعل." @@ -388,87 +870,74 @@ msgstr "يجب أن تتكون كلمة المرور من 8 أحرف على ال msgid "Password changed successfully. Please login again." msgstr "تم تغيير كلمة المرور بنجاح. يرجى تسجيل الدخول مرة أخرى." -#: apps/accounts/views.py:358 apps/complaints/models.py:1896 -#: apps/complaints/models.py:2662 apps/surveys/forms.py:199 -#: apps/surveys/forms.py:408 templates/accounts/onboarding/dashboard.html:222 -#: templates/accounts/onboarding/provisional_list.html:133 -#: templates/accounts/onboarding/provisional_list.html:265 -#: templates/accounts/settings.html:93 templates/accounts/settings.html:383 -#: templates/complaints/inquiry_detail.html:470 -#: templates/complaints/oncall/schedule_detail.html:137 -#: templates/config/hospital_users.html:232 -#: templates/core/public_submit.html:546 -#: templates/feedback/feedback_form.html:202 -#: templates/notifications/settings.html:401 -#: templates/observations/observation_detail.html:198 -#: templates/observations/public_new.html:205 -#: templates/organizations/patient_detail.html:253 -#: templates/organizations/staff_detail.html:132 -#: templates/organizations/staff_form.html:229 -#: templates/physicians/physician_detail.html:382 -#: templates/simulator/log_detail.html:70 -#: templates/simulator/log_list.html:156 templates/simulator/log_list.html:219 -#: templates/simulator/log_list.html:293 -#: templates/surveys/instance_detail.html:621 -msgid "Email" -msgstr "البريد الإلكتروني" - -#: apps/accounts/views.py:358 apps/complaints/models.py:2663 +#: apps/accounts/views.py:371 apps/complaints/models.py:3414 #: apps/surveys/forms.py:200 apps/surveys/forms.py:407 #: templates/complaints/oncall/schedule_detail.html:140 #: templates/notifications/settings.html:402 -#: templates/simulator/log_detail.html:71 -#: templates/simulator/log_list.html:159 templates/simulator/log_list.html:220 -#: templates/simulator/log_list.html:294 +#: templates/simulator/log_detail.html:71 templates/simulator/log_list.html:159 +#: templates/simulator/log_list.html:220 templates/simulator/log_list.html:294 msgid "SMS" msgstr "رسائل نصية" -#: apps/accounts/views.py:358 +#: apps/accounts/views.py:371 msgid "Both" msgstr "كلاهما" -#: apps/accounts/views.py:359 apps/organizations/models.py:28 -#: templates/complaints/partials/resolution_panel.html:82 -#: templates/surveys/instance_detail.html:190 +#: apps/accounts/views.py:372 apps/organizations/models.py:28 +#: templates/complaints/partials/resolution_panel.html:135 +#: templates/organizations/department_manager_review.html:158 +#: templates/surveys/instance_detail.html:122 msgid "English" msgstr "الإنجليزية" -#: apps/accounts/views.py:359 apps/organizations/models.py:28 -#: templates/complaints/partials/resolution_panel.html:91 -#: templates/surveys/instance_detail.html:190 +#: apps/accounts/views.py:372 apps/organizations/models.py:28 +#: templates/appreciation/appreciation_detail.html:105 +#: templates/complaints/partials/resolution_panel.html:144 +#: templates/organizations/department_manager_review.html:164 +#: templates/surveys/instance_detail.html:122 msgid "Arabic" msgstr "العربية" #: apps/analytics/kpi_models.py:23 -msgid "72-Hour Resolution Rate (MOH-2)" -msgstr "معدل حل الشكاوى خلال 72 ساعة (MOH-2)" +msgid "MOH-2: 72-Hour Resolution Rate" +msgstr "وزارة الصحة-2: معدل الحل خلال 72 ساعة" #: apps/analytics/kpi_models.py:24 -msgid "Patient Experience Score (MOH-1)" -msgstr "درجة تجربة المريض (MOH-1)" +msgid "MOH-1: Patient Experience Score" +msgstr "وزارة الصحة-1: درجة تجربة المريض" #: apps/analytics/kpi_models.py:25 -msgid "Overall Satisfaction with Resolution (MOH-3)" -msgstr "الرضا العام عن الحل (MOH-3)" +msgid "MOH-3: Overall Satisfaction with Resolution" +msgstr "وزارة الصحة-3: الرضا العام عن الحل" #: apps/analytics/kpi_models.py:26 -msgid "Resolution to Patient Complaints (N-PAD-001)" -msgstr "حل لشكاوى المرضى (N-PAD-001)" +msgid "N-PAD-001: Resolution to Patient Complaints" +msgstr "ن-باد-001: حل شكاوى المرضى" #: apps/analytics/kpi_models.py:27 -msgid "Department Response Rate (Dep-KPI-4)" -msgstr "معدل استجابة القسم (Dep-KPI-4)" +msgid "Dep-KPI-4: Department Response Rate" +msgstr "مؤشر أداء القسم-4: معدل استجابة القسم" #: apps/analytics/kpi_models.py:28 -msgid "Complaint Activation Within 2 Hours (KPI-6)" -msgstr "تفعيل الشكوى خلال ساعتين (KPI-6)" +msgid "KPI-6: Complaint Activation Within 2 Hours" +msgstr "مؤشر الأداء الرئيسي-6: تفعيل الشكوى خلال ساعتين" #: apps/analytics/kpi_models.py:29 -msgid "Unactivated Filled Complaints Rate (KPI-7)" -msgstr "معدل الشكاوى غير المكتملة (KPI-7)" +msgid "KPI-7: Unactivated Filled Complaints Rate" +msgstr "مؤشر الأداء الرئيسي-7: معدل الشكاوى المملوءة غير المفعلة" -#: apps/analytics/kpi_models.py:35 apps/core/models.py:131 -#: apps/feedback/models.py:394 apps/feedback/models.py:563 +#: apps/analytics/kpi_models.py:30 +msgid "MOH-24h: 24-Hour MOH Complaint Resolution Rate" +msgstr "وزارة الصحة-24 ساعة: معدل حل شكاوى وزارة الصحة خلال 24 ساعة" + +#: apps/analytics/kpi_models.py:31 +msgid "CHI-48h: 48-Hour CHI Complaint Resolution Rate" +msgstr "هيئة الصحة-48 ساعة: معدل حل شكاوى هيئة الصحة خلال 48 ساعة" + +#: apps/analytics/kpi_models.py:37 apps/complaints/models.py:3547 +#: apps/core/models.py:143 apps/executive_summary/models.py:107 +#: apps/feedback/models.py:480 apps/feedback/models.py:649 +#: apps/px_sources/models.py:343 #: templates/accounts/acknowledgements/compliance.html:61 #: templates/accounts/acknowledgements/dashboard.html:51 #: templates/accounts/acknowledgements/dashboard.html:76 @@ -481,30 +950,46 @@ msgstr "معدل الشكاوى غير المكتملة (KPI-7)" #: templates/actions/action_create.html:85 #: templates/actions/action_list.html:101 #: templates/actions/action_list.html:165 -#: templates/analytics/kpi_report_list.html:104 -#: templates/analytics/kpi_report_list.html:141 -#: templates/complaints/complaint_list.html:127 -#: templates/complaints/complaint_list.html:159 -#: templates/complaints/partials/explanation_panel.html:62 -#: templates/feedback/action_plan_list.html:27 -#: templates/feedback/action_plan_list.html:78 -#: templates/feedback/comment_import_list.html:41 +#: templates/analytics/kpi_report_list.html:147 +#: templates/analytics/kpi_report_list.html:184 +#: templates/appreciation/appreciation_list.html:67 +#: templates/complaints/complaint_detail.html:577 +#: templates/complaints/complaint_detail.html:602 +#: templates/complaints/complaint_list.html:130 +#: templates/complaints/complaint_list.html:162 +#: templates/complaints/investigation_review.html:66 +#: templates/complaints/partials/departments_panel.html:78 +#: templates/complaints/partials/explanation_panel.html:119 +#: templates/complaints/partials/explanation_panel.html:240 +#: templates/complaints/partials/staff_panel.html:52 +#: templates/feedback/action_plan_list.html:87 +#: templates/feedback/action_plan_list.html:141 +#: templates/feedback/comment_import_list.html:95 #: templates/journeys/instance_detail.html:258 +#: templates/organizations/department_detail.html:284 +#: templates/organizations/department_manager_review.html:128 #: templates/physicians/doctor_rating_job_list.html:140 #: templates/physicians/doctor_rating_job_status.html:105 -#: templates/projects/project_list.html:124 +#: templates/projects/my_tasks.html:23 templates/projects/project_list.html:124 #: templates/projects/project_list.html:148 -#: templates/surveys/comment_list.html:310 +#: templates/px_sources/communication_request_detail.html:62 +#: templates/px_sources/communication_request_detail.html:248 +#: templates/px_sources/communication_request_list.html:79 +#: templates/px_sources/communication_request_list.html:138 +#: templates/px_sources/source_user_communication_request_list.html:102 +#: templates/social/comments_list.html:199 +#: templates/surveys/comment_list.html:337 #: templates/surveys/instance_list.html:94 msgid "Pending" msgstr "قيد الانتظار" -#: apps/analytics/kpi_models.py:36 +#: apps/analytics/kpi_models.py:38 apps/executive_summary/models.py:108 msgid "Generating" msgstr "جاري التوليد" -#: apps/analytics/kpi_models.py:37 apps/core/models.py:132 -#: apps/feedback/models.py:396 apps/feedback/models.py:561 +#: apps/analytics/kpi_models.py:39 apps/core/models.py:144 +#: apps/executive_summary/models.py:109 apps/feedback/models.py:482 +#: apps/feedback/models.py:647 #: templates/accounts/acknowledgements/dashboard.html:26 #: templates/accounts/acknowledgements/dashboard.html:63 #: templates/accounts/acknowledgements/dashboard.html:128 @@ -517,11 +1002,11 @@ msgstr "جاري التوليد" #: templates/actions/action_create.html:87 #: templates/actions/action_list.html:103 #: templates/actions/action_list.html:159 -#: templates/analytics/kpi_report_list.html:95 #: templates/analytics/kpi_report_list.html:138 -#: templates/feedback/action_plan_list.html:25 -#: templates/feedback/action_plan_list.html:74 -#: templates/feedback/comment_import_list.html:35 +#: templates/analytics/kpi_report_list.html:181 +#: templates/feedback/action_plan_list.html:85 +#: templates/feedback/action_plan_list.html:137 +#: templates/feedback/comment_import_list.html:89 #: templates/journeys/instance_detail.html:313 #: templates/journeys/instance_list.html:138 #: templates/journeys/instance_list.html:186 @@ -531,18 +1016,18 @@ msgstr "جاري التوليد" #: templates/physicians/doctor_rating_job_status.html:184 #: templates/projects/project_list.html:115 #: templates/projects/project_list.html:151 -#: templates/surveys/instance_detail.html:571 +#: templates/surveys/instance_detail.html:433 #: templates/surveys/instance_list.html:93 #: templates/surveys/instance_list.html:139 -#: templates/surveys/template_detail.html:89 +#: templates/surveys/template_detail.html:104 msgid "Completed" msgstr "مكتملة" -#: apps/analytics/kpi_models.py:38 apps/feedback/models.py:397 -#: templates/analytics/kpi_report_list.html:113 -#: templates/analytics/kpi_report_list.html:144 -#: templates/core/public_submit.html:727 templates/core/public_submit.html:730 -#: templates/feedback/comment_import_list.html:37 +#: apps/analytics/kpi_models.py:40 apps/executive_summary/models.py:110 +#: apps/feedback/models.py:483 templates/analytics/kpi_report_list.html:156 +#: templates/analytics/kpi_report_list.html:187 +#: templates/core/public_submit.html:455 +#: templates/feedback/comment_import_list.html:91 #: templates/physicians/doctor_rating_job_list.html:155 #: templates/physicians/doctor_rating_job_status.html:120 #: templates/physicians/doctor_rating_job_status.html:218 @@ -552,372 +1037,423 @@ msgstr "مكتملة" msgid "Failed" msgstr "فشل" -#: apps/analytics/kpi_models.py:50 +#: apps/analytics/kpi_models.py:52 msgid "Type of KPI report" msgstr "نوع تقرير KPI" -#: apps/analytics/kpi_models.py:58 +#: apps/analytics/kpi_models.py:60 msgid "Hospital this report belongs to" msgstr "المستشفى الذي ينتمي إليه هذا التقرير" -#: apps/analytics/kpi_models.py:66 +#: apps/analytics/kpi_models.py:68 msgid "Date the report was generated" msgstr "تاريخ إنشاء التقرير" -#: apps/analytics/kpi_models.py:76 +#: apps/analytics/kpi_models.py:78 msgid "User who generated the report (null for automated)" msgstr "المستخدم الذي أنشأ التقرير (null للآلي)" -#: apps/analytics/kpi_models.py:82 +#: apps/analytics/kpi_models.py:84 msgid "Target percentage for this KPI" msgstr "النسبة المستهدفة لهذا مؤشر الأداء" -#: apps/analytics/kpi_models.py:88 +#: apps/analytics/kpi_models.py:90 msgid "Threshold (minimum acceptable) percentage for this KPI" msgstr "النسبة الحدية (الحد الأدنى المقبول) لهذا مؤشر الأداء" -#: apps/analytics/kpi_models.py:93 +#: apps/analytics/kpi_models.py:95 msgid "Report category (e.g., Organizational, Clinical)" msgstr "فئة التقرير (مثلاً: إداري، سريري)" -#: apps/analytics/kpi_models.py:96 +#: apps/analytics/kpi_models.py:98 msgid "KPI type (e.g., Outcome, Process, Structure)" msgstr "نوع مؤشر الأداء (مثلاً: نتيجة، عملية، هيكل)" -#: apps/analytics/kpi_models.py:106 +#: apps/analytics/kpi_models.py:108 msgid "Risk level for this KPI" msgstr "مستوى المخاطر لهذا مؤشر الأداء" -#: apps/analytics/kpi_models.py:109 +#: apps/analytics/kpi_models.py:111 msgid "Data collection method" msgstr "طريقة جمع البيانات" -#: apps/analytics/kpi_models.py:112 +#: apps/analytics/kpi_models.py:114 msgid "How often data is collected" msgstr "كم مرة تُجمع البيانات" -#: apps/analytics/kpi_models.py:115 +#: apps/analytics/kpi_models.py:117 msgid "How often report is generated" msgstr "كم مرة يُنتج التقرير" -#: apps/analytics/kpi_models.py:118 +#: apps/analytics/kpi_models.py:120 msgid "KPI dimension (e.g., Efficiency, Quality, Safety)" msgstr "بعد مؤشر الأداء الرئيسي (مثلاً: الكفاءة، الجودة، الأمان)" -#: apps/analytics/kpi_models.py:120 +#: apps/analytics/kpi_models.py:122 msgid "Name of data collector" msgstr "اسم جامع البيانات" -#: apps/analytics/kpi_models.py:121 +#: apps/analytics/kpi_models.py:123 msgid "Name of data analyzer" msgstr "اسم محلل البيانات" -#: apps/analytics/kpi_models.py:124 +#: apps/analytics/kpi_models.py:126 msgid "Total count of successful outcomes" msgstr "إجمالي عدد النتائج الناجحة" -#: apps/analytics/kpi_models.py:125 +#: apps/analytics/kpi_models.py:127 msgid "Total count of all cases" msgstr "إجمالي عدد جميع الحالات" -#: apps/analytics/kpi_models.py:127 +#: apps/analytics/kpi_models.py:129 msgid "Overall percentage result" msgstr "النسبة المئوية للنتيجة الشاملة" -#: apps/analytics/kpi_models.py:135 +#: apps/analytics/kpi_models.py:137 msgid "AI-generated analysis and recommendations for this report" msgstr "التحليل والتوصيات المولدة بواسطة الذكاء الاصطناعي لهذا التقرير" -#: apps/analytics/kpi_models.py:138 +#: apps/analytics/kpi_models.py:140 msgid "When the AI analysis was generated" msgstr "متى تم إنشاء تحليل الذكاء الاصطناعي" -#: apps/analytics/kpi_models.py:243 +#: apps/analytics/kpi_models.py:253 msgid "Month number (1-12), 0 for TOTAL" msgstr "رقم الشهر (1-12)، 0 للكلي" -#: apps/analytics/kpi_models.py:246 +#: apps/analytics/kpi_models.py:256 msgid "Count of successful outcomes" msgstr "عدد النتائج الناجحة" -#: apps/analytics/kpi_models.py:247 +#: apps/analytics/kpi_models.py:257 msgid "Count of all cases" msgstr "عدد جميع الحالات" -#: apps/analytics/kpi_models.py:248 +#: apps/analytics/kpi_models.py:258 msgid "Calculated percentage" msgstr "النسبة المئوية المحسوبة" -#: apps/analytics/kpi_models.py:251 +#: apps/analytics/kpi_models.py:261 msgid "Whether this month is below target" msgstr "هل هذا الشهر أقل من الهدف" -#: apps/analytics/kpi_models.py:255 +#: apps/analytics/kpi_models.py:265 msgid "Additional breakdown data (e.g., by source, department)" msgstr "بيانات تفصيلية إضافية (مثلاً حسب المصدر، القسم)" -#: apps/analytics/kpi_models.py:302 +#: apps/analytics/kpi_models.py:312 msgid "Category of department" msgstr "فئة القسم" -#: apps/analytics/kpi_models.py:311 +#: apps/analytics/kpi_models.py:321 msgid "Top complaint areas or notes (newline-separated)" msgstr "أبرز مناطق الشكوى أو الملاحظات (مفصولة بسطر جديد)" # Staff Hierarchy -#: apps/analytics/kpi_models.py:343 +#: apps/analytics/kpi_models.py:353 msgid "Location type category" msgstr "فئة نوع الموقع" -#: apps/analytics/kpi_views.py:108 apps/analytics/kpi_views.py:223 +#: apps/analytics/kpi_views.py:113 apps/analytics/kpi_views.py:228 msgid "January" msgstr "يناير" -#: apps/analytics/kpi_views.py:109 apps/analytics/kpi_views.py:224 +#: apps/analytics/kpi_views.py:114 apps/analytics/kpi_views.py:229 msgid "February" msgstr "فبراير" -#: apps/analytics/kpi_views.py:110 apps/analytics/kpi_views.py:225 +#: apps/analytics/kpi_views.py:115 apps/analytics/kpi_views.py:230 msgid "March" msgstr "مارس" -#: apps/analytics/kpi_views.py:111 apps/analytics/kpi_views.py:226 +#: apps/analytics/kpi_views.py:116 apps/analytics/kpi_views.py:231 msgid "April" msgstr "أبريل" -#: apps/analytics/kpi_views.py:112 apps/analytics/kpi_views.py:227 +#: apps/analytics/kpi_views.py:117 apps/analytics/kpi_views.py:232 #: templates/analytics/kpi_report_detail.html:115 -#: templates/analytics/kpi_report_pdf.html:743 msgid "May" msgstr "مايو" -#: apps/analytics/kpi_views.py:113 apps/analytics/kpi_views.py:228 +#: apps/analytics/kpi_views.py:118 apps/analytics/kpi_views.py:233 msgid "June" msgstr "يونيو" -#: apps/analytics/kpi_views.py:114 apps/analytics/kpi_views.py:229 +#: apps/analytics/kpi_views.py:119 apps/analytics/kpi_views.py:234 msgid "July" msgstr "يوليو" -#: apps/analytics/kpi_views.py:115 apps/analytics/kpi_views.py:230 +#: apps/analytics/kpi_views.py:120 apps/analytics/kpi_views.py:235 msgid "August" msgstr "أغسطس" -#: apps/analytics/kpi_views.py:116 apps/analytics/kpi_views.py:231 +#: apps/analytics/kpi_views.py:121 apps/analytics/kpi_views.py:236 msgid "September" msgstr "سبتمبر" -#: apps/analytics/kpi_views.py:117 apps/analytics/kpi_views.py:232 +#: apps/analytics/kpi_views.py:122 apps/analytics/kpi_views.py:237 msgid "October" msgstr "أكتوبر" -#: apps/analytics/kpi_views.py:118 apps/analytics/kpi_views.py:233 +#: apps/analytics/kpi_views.py:123 apps/analytics/kpi_views.py:238 msgid "November" msgstr "نوفمبر" -#: apps/analytics/kpi_views.py:119 apps/analytics/kpi_views.py:234 +#: apps/analytics/kpi_views.py:124 apps/analytics/kpi_views.py:239 msgid "December" msgstr "ديسمبر" -#: apps/analytics/kpi_views.py:145 apps/analytics/kpi_views.py:357 +#: apps/analytics/kpi_views.py:150 apps/analytics/kpi_views.py:365 msgid "You do not have permission to view this report." msgstr "ليس لديك إذن لعرض هذا التقرير." -#: apps/analytics/kpi_views.py:259 apps/analytics/kpi_views.py:261 +#: apps/analytics/kpi_views.py:264 apps/analytics/kpi_views.py:266 msgid "All fields are required." msgstr "جميع الحقول مطلوبة." -#: apps/analytics/kpi_views.py:269 apps/analytics/kpi_views.py:270 +#: apps/analytics/kpi_views.py:274 apps/analytics/kpi_views.py:275 msgid "Hospital not found." msgstr "لم يتم العثور على المستشفى." -#: apps/analytics/kpi_views.py:278 apps/analytics/kpi_views.py:280 +#: apps/analytics/kpi_views.py:283 apps/analytics/kpi_views.py:285 msgid "You do not have permission to generate reports for this hospital." msgstr "ليس لديك إذن لتوليد تقارير لهذا المستشفى." -#: apps/analytics/kpi_views.py:292 +#: apps/analytics/kpi_views.py:297 msgid "KPI Report generated successfully." msgstr "تم إنشاء تقرير مؤشرات الأداء الرئيسية بنجاح." -#: apps/analytics/kpi_views.py:322 +#: apps/analytics/kpi_views.py:327 msgid "You do not have permission to regenerate this report." msgstr "ليس لديك إذن لإعادة إنشاء هذا التقرير." -#: apps/analytics/kpi_views.py:335 +#: apps/analytics/kpi_views.py:340 msgid "KPI Report regenerated successfully." msgstr "تم إعادة إنشاء تقرير مؤشرات الأداء الرئيسية بنجاح." -#: apps/complaints/forms.py:70 -#: templates/complaints/public_complaint_form.html:180 +#: apps/analytics/kpi_views.py:372 +#, fuzzy +#| msgid "Failed to generate report. Please try again." +msgid "Failed to generate PDF. Please try again." +msgstr "فشل في إنشاء التقرير. يرجى المحاولة مرة أخرى." + +#: apps/appreciation/ui_views.py:105 +msgid "You don't have permission to view this appreciation." +msgstr "ليس لديك صلاحية لعرض هذا التقدير." + +#: apps/appreciation/ui_views.py:159 +msgid "This appreciation has already been processed." +msgstr "تمت معالجة هذا التقدير مسبقاً." + +#: apps/appreciation/ui_views.py:168 apps/appreciation/ui_views.py:266 +msgid "Permission denied." +msgstr "تم رفض الإذن." + +#: apps/appreciation/ui_views.py:176 +msgid "Please select a staff member before activating." +msgstr "يرجى اختيار أحد الموظفين قبل التفعيل." + +#: apps/appreciation/ui_views.py:247 +msgid "Appreciation activated successfully." +msgstr "تم تفعيل التقدير بنجاح." + +#: apps/appreciation/ui_views.py:257 +msgid "This appreciation must be activated before sending." +msgstr "يجب تفعيل هذا التقدير قبل الإرسال." + +#: apps/appreciation/ui_views.py:303 +msgid "Appreciation sent successfully." +msgstr "تم إرسال التقدير بنجاح." + +#: apps/appreciation/ui_views.py:326 +#, fuzzy +#| msgid "You don't have permission to view this appreciation." +msgid "You don't have permission to send this appreciation." +msgstr "ليس لديك صلاحية لعرض هذا التقدير." + +#: apps/appreciation/ui_views.py:333 +#, fuzzy +#| msgid "Activate this observation before sending it to a department." +msgid "Activate this appreciation before sending it to a department." +msgstr "قم بتفعيل هذه الملاحظة قبل إرسالها إلى قسم." + +#: apps/appreciation/ui_views.py:349 apps/complaints/ui_views.py:1053 +#: apps/complaints/ui_views.py:3666 apps/observations/views.py:1467 +#: templates/components/send_to_modal.html:183 +msgid "Please select a person." +msgstr "يرجى تحديد شخص" + +#: apps/appreciation/ui_views.py:355 apps/complaints/ui_views.py:1061 +#: apps/complaints/ui_views.py:3674 apps/observations/views.py:1475 +msgid "User not found." +msgstr "المستخدم غير موجود." + +#: apps/appreciation/ui_views.py:387 apps/complaints/ui_views.py:1097 +#: apps/complaints/ui_views.py:3410 apps/complaints/ui_views.py:3710 +#: apps/observations/views.py:1197 apps/observations/views.py:1510 +#: templates/complaints/complaint_detail.html:1276 +#: templates/components/send_to_modal.html:188 +msgid "Please select a department." +msgstr "يرجى اختيار قسم." + +#: apps/appreciation/ui_views.py:393 apps/complaints/ui_views.py:1105 +#: apps/complaints/ui_views.py:3417 apps/complaints/ui_views.py:3718 +#: apps/observations/views.py:1204 apps/observations/views.py:1518 +msgid "Department not found." +msgstr "القسم غير موجود." + +#: apps/appreciation/ui_views.py:403 apps/complaints/ui_views.py:1116 +#: apps/complaints/ui_views.py:3729 apps/observations/views.py:1529 +#, fuzzy +#| msgid "" +#| "Cannot send to {department.get_localized_name()}. This department has no " +#| "champion or manager assigned." +msgid "" +"Cannot send to {department.get_localized_name()}. This department has no " +"champion or manager assigned. Please assign one before sending." +msgstr "" +"لا يمكن الإرسال إلى {department.get_localized_name()}. لا يحتوي هذا القسم " +"على بطل أو مدير معين." + +#: apps/appreciation/ui_views.py:482 +#, fuzzy +#| msgid "An error occurred while sending the observation." +msgid "An error occurred while sending the appreciation." +msgstr "حدث خطأ أثناء إرسال الملاحظة." + +#: apps/complaints/forms.py:71 msgid "Complainant Name" msgstr "اسم مقدم الشكوى" -#: apps/complaints/forms.py:73 apps/complaints/forms.py:896 +#: apps/complaints/forms.py:74 apps/complaints/forms.py:962 +#: apps/feedback/forms.py:256 apps/observations/forms.py:722 #: templates/accounts/onboarding/step_checklist.html:111 -#: templates/complaints/public_complaint_form.html:183 +#: templates/complaints/public_complaint_form.html:33 #: templates/complaints/public_inquiry_form.html:25 -#: templates/core/public_submit.html:645 +#: templates/core/public_submit.html:439 +#: templates/feedback/feedback_form.html:91 msgid "Your full name" msgstr "اسمك الكامل" -#: apps/complaints/forms.py:77 apps/complaints/forms.py:418 -#: apps/complaints/models.py:209 -#: templates/complaints/public_complaint_form.html:189 +#: apps/complaints/forms.py:78 apps/complaints/forms.py:396 +#: apps/complaints/models.py:229 +#: templates/complaints/public_complaint_form.html:37 msgid "Relation to Patient" msgstr "صلة القرابة بالمريض" -#: apps/complaints/forms.py:87 apps/complaints/forms.py:907 -#: templates/accounts/login.html:72 +#: apps/complaints/forms.py:90 apps/complaints/forms.py:973 +#: apps/feedback/forms.py:265 apps/observations/forms.py:731 +#: templates/accounts/login.html:68 #: templates/accounts/onboarding/step_activation.html:58 -#: templates/accounts/password_reset.html:68 -#: templates/complaints/public_complaint_form.html:202 +#: templates/accounts/password_reset.html:64 #: templates/complaints/public_inquiry_form.html:29 -#: templates/core/public_submit.html:649 -#: templates/px_sources/source_user_form.html:205 +#: templates/core/public_submit.html:440 +#: templates/px_sources/source_user_form.html:173 msgid "Email Address" msgstr "البريد الإلكتروني" -#: apps/complaints/forms.py:89 apps/complaints/forms.py:909 +#: apps/complaints/forms.py:92 apps/complaints/forms.py:975 +#: apps/feedback/forms.py:267 apps/observations/forms.py:733 msgid "your@email.com" msgstr "your@email.com" -#: apps/complaints/forms.py:93 -#: templates/complaints/public_complaint_form.html:207 -#: templates/organizations/patient_list.html:463 +#: apps/complaints/forms.py:96 apps/feedback/forms.py:259 +#: apps/observations/forms.py:725 templates/organizations/patient_list.html:475 msgid "Mobile Number" msgstr "رقم الجوال" -#: apps/complaints/forms.py:96 +#: apps/complaints/forms.py:99 apps/feedback/forms.py:262 +#: apps/observations/forms.py:728 msgid "Your mobile number" msgstr "رقم جوالك" -#: apps/complaints/forms.py:101 apps/complaints/forms.py:428 -#: apps/surveys/forms.py:296 templates/complaints/complaint_list.html:213 +#: apps/complaints/forms.py:104 apps/complaints/forms.py:406 +#: apps/surveys/forms.py:296 templates/complaints/complaint_list.html:235 #: templates/complaints/complaint_pdf.html:499 -#: templates/complaints/public_complaint_form.html:223 +#: templates/complaints/public_complaint_form.html:64 +#: templates/px_sources/communication_request_detail.html:104 +#: templates/px_sources/convert_to_complaint_modal.html:52 +#: templates/px_sources/source_detail.html:628 +#: templates/px_sources/source_user_create_communication_request.html:28 #: templates/surveys/bulk_job_status.html:118 #: templates/surveys/his_patient_review.html:158 #: templates/surveys/his_patient_survey_send.html:121 msgid "Patient Name" msgstr "اسم المريض" -#: apps/complaints/forms.py:104 apps/complaints/forms.py:431 +#: apps/complaints/forms.py:107 apps/complaints/forms.py:409 msgid "Name of the patient involved" msgstr "اسم المريض المعني" -#: apps/complaints/forms.py:108 +#: apps/complaints/forms.py:111 msgid "National ID/ Iqama No." msgstr "رقم الهوية الوطنية / الإقامة" -#: apps/complaints/forms.py:111 apps/complaints/forms.py:438 +#: apps/complaints/forms.py:114 apps/complaints/forms.py:416 msgid "Saudi National ID or Iqama number" msgstr "رقم الهوية الوطنية السعودية أو رقم الإقامة" -#: apps/complaints/forms.py:115 apps/complaints/forms.py:442 +#: apps/complaints/forms.py:118 apps/complaints/forms.py:420 #: templates/complaints/complaint_pdf.html:535 -#: templates/complaints/public_complaint_form.html:239 +#: templates/complaints/investigation_respond.html:53 +#: templates/complaints/partials/pdf_summary_panel.html:53 +#: templates/complaints/public_complaint_form.html:76 +#: templates/organizations/department_manager_review.html:63 msgid "Incident Date" msgstr "تاريخ الواقعة" -#: apps/complaints/forms.py:120 apps/complaints/forms.py:446 -#: apps/complaints/forms.py:612 apps/complaints/forms.py:914 -#: apps/complaints/models.py:50 apps/feedback/models.py:321 -#: apps/surveys/forms.py:375 -#: templates/accounts/onboarding/provisional_list.html:305 -#: templates/accounts/settings.html:397 -#: templates/analytics/command_center.html:362 -#: templates/appreciation/appreciation_send_form.html:127 -#: templates/appreciation/leaderboard.html:85 -#: templates/callcenter/complaint_form.html:133 -#: templates/callcenter/complaint_list.html:179 -#: templates/callcenter/inquiry_form.html:137 -#: templates/callcenter/inquiry_list.html:176 -#: templates/complaints/analytics.html:307 -#: templates/complaints/complaint_pdf.html:519 -#: templates/complaints/complaint_threshold_form.html:170 -#: templates/complaints/complaint_threshold_list.html:252 -#: templates/complaints/escalation_rule_form.html:185 -#: templates/complaints/escalation_rule_list.html:286 -#: templates/complaints/inquiry_detail.html:486 -#: templates/complaints/partials/resolution_panel.html:27 -#: templates/complaints/partials/resolution_panel.html:112 -#: templates/complaints/public_complaint_form.html:253 -#: templates/complaints/public_inquiry_form.html:48 -#: templates/config/hospital_users.html:176 -#: templates/config/hospital_users.html:233 -#: templates/config/routing_rules.html:44 templates/config/sla_config.html:41 -#: templates/core/public_submit.html:662 -#: templates/dashboard/admin_evaluation.html:450 -#: templates/dashboard/admin_evaluation.html:527 -#: templates/emails/new_complaint_admin_notification.html:76 -#: templates/emails/observation_assigned.html:76 -#: templates/feedback/comment_import_list.html:16 -#: templates/feedback/feedback_form.html:313 -#: templates/feedback/feedback_list.html:361 -#: templates/integrations/survey_mapping_settings.html:123 -#: templates/journeys/instance_list.html:240 -#: templates/journeys/template_form.html:199 -#: templates/journeys/template_list.html:80 -#: templates/layouts/partials/sidebar.html:558 -#: templates/organizations/department_list.html:163 -#: templates/organizations/patient_detail.html:587 -#: templates/organizations/patient_list.html:506 -#: templates/organizations/patient_visit_journey.html:131 -#: templates/organizations/physician_list.html:80 -#: templates/organizations/section_list.html:125 -#: templates/organizations/staff_detail.html:102 -#: templates/physicians/doctor_rating_import.html:120 -#: templates/physicians/doctor_rating_job_list.html:105 -#: templates/physicians/doctor_rating_job_status.html:158 -#: templates/physicians/doctor_rating_review.html:102 -#: templates/physicians/physician_detail.html:371 -#: templates/physicians/physician_list.html:196 -#: templates/physicians/physician_ratings_dashboard.html:458 -#: templates/physicians/ratings_list.html:200 -#: templates/physicians/specialization_overview.html:108 -#: templates/projects/convert_action.html:115 -#: templates/projects/project_detail.html:181 -#: templates/projects/project_form.html:202 -#: templates/projects/project_list.html:166 -#: templates/projects/project_save_as_template.html:108 -#: templates/px_sources/source_detail.html:252 -#: templates/px_sources/source_detail.html:320 -#: templates/px_sources/source_detail.html:391 -#: templates/rca/rca_detail.html:148 templates/rca/rca_list.html:231 -#: templates/simulator/log_detail.html:238 -#: templates/surveys/bulk_job_list.html:85 -#: templates/surveys/instance_detail.html:593 -#: templates/surveys/template_detail.html:221 -#: templates/surveys/template_list.html:85 -msgid "Hospital" -msgstr "المستشفى" - -#: apps/complaints/forms.py:122 apps/complaints/forms.py:448 -#: apps/complaints/forms.py:614 apps/complaints/forms.py:916 +#: apps/complaints/forms.py:125 apps/complaints/forms.py:426 +#: apps/complaints/forms.py:590 apps/complaints/forms.py:982 +#: apps/feedback/forms.py:272 apps/observations/forms.py:189 +#: apps/observations/forms.py:738 #: templates/accounts/onboarding/bulk_invite.html:83 #: templates/accounts/onboarding/provisional_list.html:309 #: templates/complaints/complaint_threshold_form.html:173 #: templates/complaints/escalation_rule_form.html:188 #: templates/complaints/patient_complaint_portal.html:60 -#: templates/complaints/public_complaint_form.html:256 +#: templates/complaints/public_complaint_form.html:86 #: templates/complaints/public_inquiry_form.html:52 -#: templates/core/public_submit.html:628 templates/core/select_hospital.html:7 -#: templates/core/select_hospital.html:48 +#: templates/core/public_submit.html:437 templates/core/select_hospital.html:7 +#: templates/core/select_hospital.html:43 +#: templates/feedback/feedback_form.html:104 #: templates/integrations/survey_mapping_settings.html:127 +#: templates/organizations/department_form.html:128 msgid "Select Hospital" msgstr "اختر المستشفى" -#: apps/complaints/forms.py:130 apps/complaints/forms.py:620 +#: apps/complaints/forms.py:133 apps/complaints/forms.py:611 +#: apps/complaints/forms.py:1003 apps/observations/forms.py:749 msgid "Department (Optional)" msgstr "القسم (اختياري)" -#: apps/complaints/forms.py:132 apps/complaints/forms.py:456 -#: apps/complaints/forms.py:622 +#: apps/complaints/forms.py:135 apps/complaints/forms.py:449 +#: apps/complaints/forms.py:613 apps/complaints/forms.py:689 +#: apps/complaints/forms.py:1005 apps/observations/forms.py:751 #: templates/accounts/onboarding/provisional_list.html:322 -#: templates/appreciation/appreciation_send_form.html:147 -#: templates/complaints/complaint_form.html:776 -#: templates/complaints/complaint_form.html:787 +#: templates/complaints/complaint_detail.html:1067 +#: templates/complaints/complaint_detail.html:1129 +#: templates/complaints/complaint_detail.html:1356 +#: templates/complaints/complaint_form.html:808 +#: templates/complaints/complaint_form.html:821 +#: templates/complaints/inquiry_detail.html:755 +#: templates/complaints/inquiry_detail.html:936 +#: templates/complaints/inquiry_form.html:372 +#: templates/complaints/inquiry_form.html:380 #: templates/complaints/involved_department_form.html:132 +#: templates/complaints/public_complaint_form.html:130 +#: templates/complaints/public_complaint_form.html:208 +#: templates/complaints/public_complaint_form.html:225 +#: templates/complaints/public_inquiry_form.html:94 +#: templates/complaints/public_inquiry_form.html:199 +#: templates/components/send_to_modal.html:64 +#: templates/components/send_to_modal.html:66 +#: templates/config/user_form.html:270 templates/config/user_form.html:465 +#: templates/config/user_form.html:475 templates/core/public_submit.html:500 +#: templates/observations/observation_create.html:201 +#: templates/observations/observation_create.html:207 +#: templates/observations/public_new.html:134 +#: templates/observations/public_new.html:298 +#: templates/organizations/orgsection_form.html:92 #: templates/organizations/section_form.html:107 #: templates/organizations/staff_form.html:302 #: templates/organizations/staff_form.html:447 @@ -925,30 +1461,57 @@ msgstr "القسم (اختياري)" msgid "Select Department" msgstr "اختر القسم" -#: apps/complaints/forms.py:139 apps/complaints/forms.py:477 -#: templates/complaints/adverse_action_form.html:173 -#: templates/complaints/complaint_detail.html:215 -#: templates/complaints/complaint_pdf.html:527 -#: templates/complaints/public_complaint_form.html:276 -#: templates/core/public_submit.html:517 -#: templates/dashboard/partials/observations_table.html:26 -#: templates/emails/observation_assigned.html:67 -#: templates/observations/observation_create.html:245 -#: templates/observations/observation_detail.html:136 -#: templates/observations/public_new.html:149 -msgid "Location" -msgstr "الموقع" +#: apps/complaints/forms.py:142 apps/complaints/forms.py:432 +#: apps/complaints/forms.py:596 apps/complaints/forms.py:988 +#: apps/observations/forms.py:743 +#: templates/complaints/complaint_detail.html:1028 +#: templates/complaints/government_ticket_detail.html:131 +#: templates/complaints/public_complaint_form.html:93 +#: templates/complaints/public_inquiry_form.html:63 +#: templates/core/public_submit.html:505 +#: templates/observations/observation_create.html:77 +#: templates/observations/public_new.html:86 +#: templates/organizations/orgsection_form.html:115 +msgid "Location Type" +msgstr "نوع الموقع" -#: apps/complaints/forms.py:141 apps/complaints/forms.py:479 -#: templates/complaints/public_complaint_form.html:279 -#: templates/complaints/public_complaint_form.html:382 -#: templates/core/public_submit.html:790 -msgid "Select Location" -msgstr "اختر الموقع" +#: apps/complaints/forms.py:143 apps/complaints/forms.py:433 +#: apps/complaints/forms.py:597 apps/complaints/forms.py:989 +#: apps/observations/forms.py:744 +#: templates/complaints/complaint_detail.html:1030 +#: templates/complaints/public_complaint_form.html:96 +#: templates/complaints/public_inquiry_form.html:67 +#: templates/core/public_submit.html:506 +#: templates/observations/public_new.html:90 +msgid "Select Location Type" +msgstr "اختر نوع الموقع" -#: apps/complaints/forms.py:147 apps/complaints/forms.py:485 +#: apps/complaints/forms.py:149 apps/complaints/forms.py:995 +#: apps/observations/forms.py:763 +msgid "Area (Optional)" +msgstr "المنطقة (اختياري)" + +#: apps/complaints/forms.py:151 apps/complaints/forms.py:997 +#: apps/observations/forms.py:765 +#: templates/complaints/complaint_detail.html:1044 +#: templates/complaints/complaint_detail.html:1334 +msgid "Select Area" +msgstr "اختر المنطقة" + +#: apps/complaints/forms.py:157 apps/complaints/forms.py:455 +#: apps/complaints/forms.py:659 apps/feedback/forms.py:290 +#: apps/observations/forms.py:253 +#: templates/complaints/complaint_detail.html:367 +#: templates/complaints/complaint_detail.html:1073 +#: templates/complaints/government_ticket_form.html:205 +#: templates/complaints/public_complaint_form.html:134 +#: templates/complaints/public_inquiry_form.html:99 +#: templates/core/public_submit.html:501 +#: templates/observations/observation_create.html:101 +#: templates/observations/public_new.html:141 +#: templates/organizations/department_staff_detail.html:104 #: templates/organizations/staff_detail.html:114 -#: templates/organizations/staff_list.html:223 +#: templates/organizations/staff_list.html:228 #: templates/organizations/subsection_confirm_delete.html:30 #: templates/organizations/subsection_form.html:105 #: templates/organizations/subsection_list.html:80 @@ -956,51 +1519,55 @@ msgstr "اختر الموقع" msgid "Section" msgstr "القسم" -#: apps/complaints/forms.py:149 apps/complaints/forms.py:487 -#: templates/complaints/complaint_form.html:807 -#: templates/complaints/complaint_form.html:819 +#: apps/complaints/forms.py:159 apps/complaints/forms.py:661 +#: apps/complaints/forms.py:1013 apps/feedback/forms.py:292 +#: apps/observations/forms.py:255 apps/observations/forms.py:758 +#: templates/complaints/complaint_detail.html:1078 +#: templates/complaints/complaint_detail.html:1378 +#: templates/complaints/complaint_detail.html:1385 +#: templates/complaints/complaint_detail.html:1423 +#: templates/complaints/government_ticket_form.html:286 +#: templates/complaints/inquiry_form.html:296 +#: templates/complaints/public_complaint_form.html:137 +#: templates/complaints/public_complaint_form.html:209 +#: templates/complaints/public_complaint_form.html:226 +#: templates/complaints/public_complaint_form.html:248 +#: templates/complaints/public_inquiry_form.html:103 +#: templates/complaints/public_inquiry_form.html:200 +#: templates/complaints/public_inquiry_form.html:218 +#: templates/core/public_submit.html:502 +#: templates/observations/observation_create.html:232 +#: templates/observations/observation_create.html:254 +#: templates/observations/observation_create.html:278 +#: templates/observations/public_new.html:145 +#: templates/observations/public_new.html:299 +#: templates/observations/public_new.html:332 +#: templates/organizations/orgsubsection_form.html:110 #: templates/organizations/subsection_form.html:107 +#: templates/px_sources/source_user_create_inquiry.html:191 +#: templates/px_sources/source_user_create_inquiry.html:198 +#: templates/px_sources/source_user_create_observation.html:199 +#: templates/px_sources/source_user_create_observation.html:205 msgid "Select Section" msgstr "اختر القسم" -#: apps/complaints/forms.py:157 apps/complaints/forms.py:495 -#: templates/complaints/public_complaint_form.html:296 -#: templates/organizations/staff_detail.html:118 -msgid "Subsection" -msgstr "الوحدة" - -#: apps/complaints/forms.py:159 apps/complaints/forms.py:497 -#: templates/complaints/complaint_form.html:808 -#: templates/complaints/complaint_form.html:828 -#: templates/complaints/complaint_form.html:843 -#: templates/complaints/complaint_form.html:854 -#: templates/complaints/public_complaint_form.html:299 -#: templates/complaints/public_complaint_form.html:407 -#: templates/complaints/public_complaint_form.html:441 -#: templates/core/public_submit.html:814 templates/core/public_submit.html:844 -msgid "Select Subsection" -msgstr "اختر القسم الفرعي" - -#: apps/complaints/forms.py:165 apps/complaints/forms.py:503 +#: apps/complaints/forms.py:165 +#: templates/organizations/department_complaint_detail.html:118 +#: templates/organizations/department_detail.html:1304 +#: templates/organizations/department_staff_detail.html:469 msgid "Staff Involved" msgstr "الموظف المعني" -#: apps/complaints/forms.py:169 apps/complaints/forms.py:507 +#: apps/complaints/forms.py:169 msgid "Name of staff member involved (if known)" msgstr "اسم الموظف المعني (إن كان معروفًا)" #: apps/complaints/forms.py:174 templates/callcenter/complaint_form.html:165 #: templates/callcenter/complaint_success.html:64 -#: templates/complaints/complaint_detail.html:196 -#: templates/complaints/complaint_form.html:628 +#: templates/complaints/complaint_form.html:622 #: templates/complaints/complaint_pdf.html:543 -#: templates/complaints/explanation_form.html:192 #: templates/complaints/patient_complaint_visit_form.html:130 -#: templates/complaints/public_complaint_form.html:248 -#: templates/emails/explanation_reminder.html:30 -#: templates/emails/explanation_second_reminder.html:33 -#: templates/emails/sla_reminder.html:42 -#: templates/emails/sla_second_reminder.html:45 +#: templates/organizations/department_manager_review.html:31 msgid "Complaint Details" msgstr "تفاصيل الشكوى" @@ -1012,52 +1579,57 @@ msgstr "" "يرجى وصف الشكوى بالتفصيل. سيقوم نظام الذكاء الاصطناعي لدينا بتحليلها وتحديد " "أولويتها." -#: apps/complaints/forms.py:188 apps/complaints/forms.py:520 +#: apps/complaints/forms.py:188 apps/complaints/forms.py:479 msgid "Expected Complaint Result" msgstr "النتيجة المتوقعة للشكوى" -#: apps/complaints/forms.py:191 apps/complaints/forms.py:523 +#: apps/complaints/forms.py:191 apps/complaints/forms.py:482 msgid "What do you expect as a resolution?" msgstr "ما النتيجة التي تتوقعها لحل هذه الشكوى؟" -#: apps/complaints/forms.py:197 templates/analytics/command_center.html:361 -#: templates/analytics/command_center.html:591 -#: templates/analytics/dashboard.html:727 +#: apps/complaints/forms.py:197 +#: apps/executive_summary/templates/executive/insights.html:55 +#: templates/analytics/dashboard.html:1117 #: templates/callcenter/complaint_form.html:213 #: templates/callcenter/complaint_list.html:146 #: templates/callcenter/complaint_list.html:181 #: templates/complaints/adverse_action_list.html:227 #: templates/complaints/adverse_action_list.html:276 -#: templates/complaints/complaint_detail.html:221 -#: templates/complaints/complaint_form.html:691 +#: templates/complaints/complaint_detail.html:380 +#: templates/complaints/complaint_form.html:685 +#: templates/complaints/complaint_list.html:206 +#: templates/complaints/complaint_list.html:241 #: templates/complaints/escalation_rule_list.html:291 #: templates/complaints/sla_management.html:370 -#: templates/config/routing_rules.html:43 -#: templates/core/public_submit.html:492 -#: templates/emails/new_complaint_admin_notification.html:59 -#: templates/emails/observation_assigned.html:57 +#: templates/config/routing_rules.html:43 templates/core/public_submit.html:413 +#: templates/emails/new_complaint_admin_notification.html:19 #: templates/observations/convert_to_action.html:38 -#: templates/observations/observation_create.html:200 -#: templates/observations/observation_list.html:192 -#: templates/observations/observation_list.html:299 -#: templates/observations/public_new.html:101 +#: templates/observations/observation_list.html:193 +#: templates/observations/observation_list.html:301 #: templates/observations/public_success.html:130 -#: templates/observations/public_track.html:204 +#: templates/observations/public_track.html:200 +#: templates/observations/response_form_token.html:26 +#: templates/organizations/department_complaints.html:74 +#: templates/organizations/department_detail.html:830 +#: templates/organizations/department_observations.html:70 +#: templates/organizations/department_staff_detail.html:217 +#: templates/organizations/staff_detail.html:239 #: templates/rca/rca_detail.html:122 templates/rca/rca_form.html:91 #: templates/rca/rca_list.html:182 templates/rca/rca_list.html:229 msgid "Severity" msgstr "الخطورة" -#: apps/complaints/forms.py:205 templates/actions/action_create.html:29 +#: apps/complaints/forms.py:205 apps/complaints/forms.py:667 +#: templates/actions/action_create.html:29 #: templates/actions/action_detail.html:157 #: templates/actions/action_list.html:108 +#: templates/analytics/dashboard.html:919 #: templates/callcenter/complaint_form.html:227 -#: templates/complaints/complaint_form.html:697 -#: templates/complaints/complaint_list.html:184 -#: templates/complaints/complaint_list.html:218 +#: templates/complaints/complaint_form.html:691 +#: templates/complaints/complaint_list.html:187 +#: templates/complaints/complaint_list.html:242 #: templates/complaints/escalation_rule_list.html:292 -#: templates/complaints/inquiry_detail.html:501 -#: templates/complaints/inquiry_list.html:233 +#: templates/complaints/inquiry_list.html:194 #: templates/complaints/oncall/admin_form.html:248 #: templates/complaints/oncall/schedule_detail.html:94 #: templates/complaints/sla_management.html:371 @@ -1066,21 +1638,27 @@ msgstr "الخطورة" #: templates/dashboard/partials/complaints_table.html:27 #: templates/dashboard/partials/inquiries_table.html:26 #: templates/dashboard/partials/tasks_table.html:26 -#: templates/emails/new_complaint_admin_notification.html:49 -#: templates/feedback/feedback_form.html:295 +#: templates/dashboard/standards_dashboard.html:185 +#: templates/emails/new_complaint_admin_notification.html:18 +#: templates/emails/new_inquiry_notification.html:19 +#: templates/emails/new_suggestion_notification.html:19 +#: templates/feedback/feedback_detail.html:232 #: templates/observations/convert_to_action.html:75 +#: templates/organizations/department_detail.html:894 +#: templates/organizations/department_detail.html:1324 +#: templates/organizations/department_inquiries.html:71 #: templates/projects/convert_action.html:125 -#: templates/px_sources/source_detail.html:251 -#: templates/px_sources/source_detail.html:319 +#: templates/px_sources/source_detail.html:259 +#: templates/px_sources/source_detail.html:326 #: templates/px_sources/source_user_complaint_list.html:125 #: templates/px_sources/source_user_complaint_list.html:187 -#: templates/px_sources/source_user_dashboard.html:164 +#: templates/px_sources/source_user_dashboard.html:196 #: templates/rca/rca_detail.html:130 templates/rca/rca_form.html:97 #: templates/rca/rca_list.html:192 templates/rca/rca_list.html:230 msgid "Priority" msgstr "الأولوية" -#: apps/complaints/forms.py:214 apps/complaints/forms.py:400 +#: apps/complaints/forms.py:214 apps/complaints/forms.py:378 msgid "Complaint Source Type" msgstr "نوع مصدر الشكوى" @@ -1093,305 +1671,508 @@ msgid "You can upload images, PDFs, or Word documents (max 10MB each)" msgstr "" "يمكنك رفع صور أو ملفات PDF أو مستندات Word (بحد أقصى 10 ميجابايت لكل ملف)" -#: apps/complaints/forms.py:316 +#: apps/complaints/forms.py:294 msgid "Please enter a valid Saudi mobile number (10 digits starting with 05)" msgstr "يرجى إدخال رقم جوال سعودي صحيح (10 أرقام تبدأ بـ 05)" -#: apps/complaints/forms.py:329 +#: apps/complaints/forms.py:307 msgid "Please enter a valid National ID or Iqama number (10 digits)" msgstr "يرجى إدخال رقم هوية وطنية أو إقامة صحيح (10 أرقام)" -#: apps/complaints/forms.py:340 +#: apps/complaints/forms.py:318 apps/complaints/forms.py:562 +#: apps/complaints/ui_views.py:4365 msgid "Incident date cannot be in the future" msgstr "لا يمكن أن يكون تاريخ الواقعة في المستقبل" -#: apps/complaints/forms.py:350 +#: apps/complaints/forms.py:328 msgid "Maximum 5 files allowed" msgstr "يُسمح بحد أقصى 5 ملفات" -#: apps/complaints/forms.py:356 +#: apps/complaints/forms.py:334 msgid "File size must be less than 10MB" msgstr "يجب ألا يتجاوز حجم الملف 10 ميجابايت" -#: apps/complaints/forms.py:362 +#: apps/complaints/forms.py:340 msgid "Allowed file types: JPG, PNG, GIF, PDF, DOC, DOCX" msgstr "أنواع الملفات المسموحة: JPG، PNG، GIF، PDF، DOC، DOCX" -#: apps/complaints/forms.py:391 templates/feedback/feedback_form.html:228 +#: apps/complaints/forms.py:369 msgid "Feedback Type" msgstr "نوع الملاحظة" -#: apps/complaints/forms.py:409 templates/px_sources/source_detail.html:4 +#: apps/complaints/forms.py:387 templates/px_sources/source_detail.html:4 msgid "PX Source" msgstr "مصدر PX" -#: apps/complaints/forms.py:411 +#: apps/complaints/forms.py:389 apps/complaints/forms.py:699 msgid "Select source (optional)" msgstr "اختر المصدر (اختياري)" -#: apps/complaints/forms.py:435 +#: apps/complaints/forms.py:413 msgid "National ID/Iqama No." msgstr "رقم الهوية الوطنية/الإقامة" -#: apps/complaints/forms.py:454 -#: templates/accounts/acknowledgements/compliance.html:138 -#: templates/accounts/onboarding/provisional_list.html:318 -#: templates/accounts/settings.html:404 -#: templates/analytics/command_center.html:116 -#: templates/analytics/command_center.html:363 -#: templates/analytics/command_center.html:390 -#: templates/analytics/command_center.html:506 -#: templates/analytics/dashboard.html:473 -#: templates/analytics/dashboard.html:615 -#: templates/analytics/dashboard.html:729 -#: templates/appreciation/appreciation_send_form.html:145 -#: templates/appreciation/leaderboard.html:51 -#: templates/appreciation/leaderboard.html:86 -#: templates/callcenter/call_records_list.html:217 -#: templates/callcenter/complaint_form.html:139 -#: templates/callcenter/inquiry_form.html:143 -#: templates/complaints/complaint_list.html:194 -#: templates/complaints/complaint_list.html:216 -#: templates/complaints/complaint_pdf.html:523 -#: templates/complaints/inquiry_detail.html:491 -#: templates/complaints/involved_department_form.html:129 -#: templates/complaints/public_complaint_track.html:192 -#: templates/config/hospital_users.html:234 -#: templates/dashboard/admin_evaluation.html:276 -#: templates/dashboard/admin_evaluation.html:451 -#: templates/dashboard/admin_evaluation.html:528 -#: templates/dashboard/command_center.html:658 -#: templates/dashboard/complaint_request_list.html:86 -#: templates/dashboard/employee_evaluation.html:676 -#: templates/dashboard/employee_evaluation.html:1033 -#: templates/emails/new_complaint_admin_notification.html:83 -#: templates/emails/observation_assigned.html:85 -#: templates/emails/observation_monthly_followup.html:66 -#: templates/emails/observation_resolved.html:68 -#: templates/feedback/feedback_form.html:325 -#: templates/journeys/instance_list.html:192 -#: templates/observations/observation_create.html:285 -#: templates/observations/observation_detail.html:295 -#: templates/observations/observation_detail.html:359 -#: templates/observations/observation_list.html:217 -#: templates/observations/observation_list.html:302 -#: templates/organizations/physician_list.html:81 -#: templates/organizations/section_confirm_delete.html:30 -#: templates/organizations/section_form.html:105 -#: templates/organizations/section_list.html:80 -#: templates/organizations/section_list.html:124 -#: templates/organizations/staff_detail.html:106 -#: templates/organizations/staff_form.html:298 -#: templates/organizations/staff_hierarchy.html:200 -#: templates/organizations/staff_list.html:214 -#: templates/organizations/staff_list.html:263 -#: templates/organizations/subsection_list.html:125 -#: templates/physicians/doctor_rating_review.html:178 -#: templates/physicians/individual_ratings_list.html:187 -#: templates/physicians/leaderboard.html:133 -#: templates/physicians/leaderboard.html:179 -#: templates/physicians/physician_detail.html:376 -#: templates/physicians/physician_list.html:146 -#: templates/physicians/physician_list.html:195 -#: templates/physicians/physician_ratings_dashboard.html:280 -#: templates/physicians/physician_ratings_dashboard.html:457 -#: templates/physicians/ratings_list.html:160 -#: templates/physicians/ratings_list.html:199 -#: templates/physicians/specialization_overview.html:107 -#: templates/projects/convert_action.html:120 -#: templates/projects/project_detail.html:186 -#: templates/projects/project_form.html:216 -#: templates/projects/project_save_as_template.html:114 -#: templates/projects/template_detail.html:110 -#: templates/px_sources/source_user_complaint_list.html:185 -#: templates/rca/rca_detail.html:152 templates/rca/rca_form.html:79 -#: templates/reports/report_builder.html:82 -#: templates/simulator/log_detail.html:227 -#: templates/standards/attachment_confirm_delete.html:94 -#: templates/standards/attachment_upload.html:147 -#: templates/standards/compliance_form.html:242 -#: templates/standards/dashboard.html:195 -#: templates/standards/dashboard.html:255 templates/standards/search.html:170 -#: templates/standards/standard_confirm_delete.html:90 -#: templates/standards/standard_detail.html:120 -#: templates/standards/standard_detail.html:218 -msgid "Department" -msgstr "القسم" +#: apps/complaints/forms.py:439 apps/complaints/forms.py:603 +#: apps/feedback/forms.py:277 templates/complaints/complaint_detail.html:365 +#: templates/complaints/complaint_detail.html:1039 +#: templates/complaints/public_complaint_form.html:106 +#: templates/complaints/public_inquiry_form.html:78 +#: templates/core/public_submit.html:507 +#: templates/dashboard/census_report.html:128 +#: templates/observations/observation_create.html:84 +#: templates/observations/public_new.html:102 +#: templates/px_sources/source_user_suggestion_list.html:112 +#: templates/px_sources/source_user_suggestion_list.html:158 +msgid "Area" +msgstr "المنطقة" -#: apps/complaints/forms.py:464 +#: apps/complaints/forms.py:441 apps/complaints/forms.py:605 +#: templates/complaints/complaint_form.html:777 +#: templates/complaints/complaint_form.html:785 +#: templates/complaints/inquiry_form.html:340 +#: templates/complaints/inquiry_form.html:348 +#: templates/complaints/public_complaint_form.html:109 +#: templates/complaints/public_complaint_form.html:179 +#: templates/complaints/public_inquiry_form.html:82 +#: templates/complaints/public_inquiry_form.html:175 +#: templates/core/public_submit.html:508 +#: templates/observations/observation_create.html:175 +#: templates/observations/observation_create.html:183 +#: templates/observations/public_new.html:106 +#: templates/observations/public_new.html:279 +msgid "Select Area (optional)" +msgstr "اختر المنطقة (اختياري)" + +#: apps/complaints/forms.py:457 templates/complaints/complaint_form.html:840 +#: templates/complaints/complaint_form.html:849 +#: templates/complaints/complaint_form.html:859 +#: templates/px_sources/source_user_create_complaint.html:290 +#: templates/px_sources/source_user_create_complaint.html:299 +msgid "Select Section (optional)" +msgstr "اختر القسم (اختياري)" + +#: apps/complaints/forms.py:465 #: templates/accounts/simple_acknowledgements/admin_send.html:138 -#: templates/complaints/complaint_detail.html:477 -#: templates/dashboard/employee_evaluation.html:689 +#: templates/complaints/complaint_form.html:850 +#: templates/complaints/complaint_form.html:878 +#: templates/dashboard/employee_evaluation.html:753 +#: templates/dashboard/employee_evaluation_charts.html:231 msgid "Select Staff" msgstr "اختر الموظف" -#: apps/complaints/forms.py:470 templates/callcenter/complaint_form.html:155 -#: templates/feedback/feedback_form.html:345 -#: templates/journeys/instance_list.html:237 -msgid "Encounter ID" -msgstr "معرّف الزيارة" - -#: apps/complaints/forms.py:472 templates/callcenter/complaint_form.html:157 -msgid "Optional encounter/visit ID" -msgstr "معرّف الزيارة (اختياري)" - -#: apps/complaints/forms.py:515 +#: apps/complaints/forms.py:474 msgid "Detailed description of complaint..." msgstr "وصف مفصل للشكوى..." -#: apps/complaints/forms.py:604 +#: apps/complaints/forms.py:580 msgid "Patient (Optional)" msgstr "المريض (اختياري)" -#: apps/complaints/forms.py:606 +#: apps/complaints/forms.py:582 msgid "Select Patient" msgstr "اختر المريض" -#: apps/complaints/forms.py:628 apps/complaints/forms.py:922 +#: apps/complaints/forms.py:619 apps/complaints/forms.py:1019 msgid "Inquiry Type" msgstr "نوع الاستفسار" -#: apps/complaints/forms.py:644 apps/complaints/forms.py:935 -#: templates/callcenter/inquiry_form.html:170 +#: apps/complaints/forms.py:635 apps/complaints/forms.py:1032 +#: templates/callcenter/inquiry_form.html:186 #: templates/callcenter/inquiry_list.html:174 #: templates/callcenter/interaction_list.html:108 -#: templates/complaints/inquiry_list.html:229 -#: templates/complaints/public_inquiry_form.html:80 -#: templates/core/public_submit.html:683 +#: templates/complaints/complaint_detail.html:961 +#: templates/complaints/inquiry_detail.html:840 +#: templates/complaints/inquiry_list.html:190 +#: templates/complaints/inquiry_response_form_token.html:23 +#: templates/complaints/public_inquiry_form.html:130 +#: templates/complaints/public_inquiry_track.html:214 +#: templates/components/department_response_modal.html:17 +#: templates/components/send_to_modal.html:87 +#: templates/config/deleted_items.html:123 +#: templates/core/public_submit.html:450 #: templates/dashboard/partials/complaints_table.html:25 #: templates/dashboard/partials/inquiries_table.html:25 -#: templates/px_sources/source_detail.html:316 -#: templates/px_sources/source_user_dashboard.html:254 +#: templates/emails/new_inquiry_notification.html:17 +#: templates/observations/observation_detail.html:956 +#: templates/organizations/department_detail.html:155 +#: templates/organizations/department_detail.html:769 +#: templates/organizations/department_detail.html:1319 +#: templates/organizations/department_inquiries.html:67 +#: templates/organizations/department_staff_detail.html:484 +#: templates/px_sources/source_detail.html:323 +#: templates/px_sources/source_detail.html:395 +#: templates/px_sources/source_detail.html:615 +#: templates/px_sources/source_user_dashboard.html:286 #: templates/px_sources/source_user_inquiry_list.html:171 #: templates/simulator/log_detail.html:204 msgid "Subject" msgstr "الموضوع" -#: apps/complaints/forms.py:647 apps/complaints/forms.py:938 +#: apps/complaints/forms.py:638 apps/complaints/forms.py:1035 msgid "Brief subject" msgstr "موضوع مختصر" -#: apps/complaints/forms.py:651 apps/complaints/forms.py:942 -#: templates/callcenter/inquiry_form.html:176 -#: templates/complaints/public_inquiry_form.html:90 -#: templates/core/public_submit.html:689 -#: templates/feedback/feedback_form.html:246 +#: apps/complaints/forms.py:642 apps/complaints/forms.py:1039 +#: templates/appreciation/appreciation_list.html:190 +#: templates/callcenter/inquiry_form.html:191 +#: templates/complaints/inquiry_department_response.html:33 +#: templates/complaints/public_inquiry_form.html:140 +#: templates/config/deleted_items.html:166 +#: templates/core/public_submit.html:452 +#: templates/emails/new_inquiry_notification.html:25 +#: templates/emails/new_suggestion_notification.html:25 +#: templates/feedback/feedback_form.html:112 #: templates/notifications/send_sms_direct.html:44 +#: templates/organizations/department_detail.html:1323 +#: templates/organizations/department_inquiry_detail.html:58 +#: templates/organizations/department_staff_detail.html:285 +#: templates/organizations/department_staff_detail.html:488 +#: templates/px_sources/communication_request_detail.html:121 +#: templates/px_sources/communication_request_list.html:112 +#: templates/px_sources/source_user_communication_request_list.html:81 +#: templates/px_sources/source_user_create_communication_request.html:59 msgid "Message" msgstr "الرسالة" -#: apps/complaints/forms.py:653 apps/complaints/forms.py:944 +#: apps/complaints/forms.py:644 apps/complaints/forms.py:1041 msgid "Describe your inquiry" msgstr "اشرح استفسارك" -#: apps/complaints/forms.py:658 templates/callcenter/inquiry_form.html:99 -#: templates/feedback/feedback_form.html:193 +#: apps/complaints/forms.py:649 apps/feedback/forms.py:253 +#: templates/callcenter/inquiry_form.html:115 msgid "Contact Name" msgstr "اسم جهة الاتصال" -#: apps/complaints/forms.py:661 templates/callcenter/inquiry_form.html:105 +#: apps/complaints/forms.py:652 templates/callcenter/inquiry_form.html:120 +#: templates/px_sources/source_detail.html:634 #: templates/px_sources/source_form.html:251 msgid "Contact Phone" msgstr "هاتف جهة الاتصال" -#: apps/complaints/forms.py:664 templates/callcenter/inquiry_form.html:111 +#: apps/complaints/forms.py:655 templates/callcenter/inquiry_form.html:125 +#: templates/px_sources/source_detail.html:641 #: templates/px_sources/source_form.html:242 msgid "Contact Email" msgstr "البريد الإلكتروني لجهة الاتصال" -#: apps/complaints/forms.py:893 templates/analytics/kpi_list.html:76 -#: templates/complaints/complaint_detail.html:295 -#: templates/complaints/inquiry_detail.html:462 +#: apps/complaints/forms.py:669 apps/complaints/models.py:1732 +#: apps/core/models.py:149 apps/core/models.py:156 +#: apps/executive_summary/models.py:185 apps/executive_summary/models.py:287 +#: apps/observations/models.py:37 templates/actions/action_create.html:31 +#: templates/actions/action_list.html:113 +#: templates/actions/action_list.html:155 +#: templates/callcenter/complaint_form.html:216 +#: templates/callcenter/complaint_form.html:230 +#: templates/callcenter/complaint_list.html:152 +#: templates/complaints/complaint_form.html:722 +#: templates/complaints/complaint_list.html:190 +#: templates/complaints/complaint_list.html:209 +#: templates/complaints/partials/priority_badge.html:16 +#: templates/complaints/partials/severity_badge.html:16 +#: templates/core/public_submit.html:414 +#: templates/dashboard/command_center.html:862 +#: templates/dashboard/my_dashboard.html:157 +#: templates/observations/observation_list.html:196 +#: templates/organizations/department_complaints.html:42 +#: templates/organizations/department_inquiries.html:41 +#: templates/organizations/department_observations.html:42 +#: templates/organizations/staff_detail.html:286 +#: templates/px_sources/source_user_complaint_list.html:128 +#: templates/px_sources/source_user_complaint_list.html:235 +#: templates/px_sources/source_user_dashboard.html:243 +#: templates/rca/rca_list.html:185 templates/rca/rca_list.html:195 +msgid "Low" +msgstr "منخفض" + +#: apps/complaints/forms.py:670 apps/complaints/models.py:1733 +#: apps/core/models.py:150 apps/core/models.py:157 +#: apps/executive_summary/models.py:186 apps/executive_summary/models.py:288 +#: apps/observations/models.py:38 templates/actions/action_create.html:32 +#: templates/actions/action_list.html:112 +#: templates/actions/action_list.html:153 +#: templates/callcenter/complaint_form.html:217 +#: templates/callcenter/complaint_form.html:231 +#: templates/callcenter/complaint_list.html:151 +#: templates/complaints/complaint_form.html:718 +#: templates/complaints/complaint_list.html:191 +#: templates/complaints/complaint_list.html:210 +#: templates/complaints/partials/priority_badge.html:12 +#: templates/complaints/partials/severity_badge.html:12 +#: templates/core/public_submit.html:415 +#: templates/dashboard/command_center.html:862 +#: templates/dashboard/my_dashboard.html:158 +#: templates/observations/observation_list.html:197 +#: templates/organizations/department_complaints.html:43 +#: templates/organizations/department_inquiries.html:42 +#: templates/organizations/department_observations.html:43 +#: templates/organizations/staff_detail.html:284 +#: templates/px_sources/source_user_complaint_list.html:129 +#: templates/px_sources/source_user_complaint_list.html:231 +#: templates/px_sources/source_user_dashboard.html:239 +#: templates/rca/rca_list.html:186 templates/rca/rca_list.html:196 +msgid "Medium" +msgstr "متوسط" + +#: apps/complaints/forms.py:671 apps/complaints/models.py:1734 +#: apps/core/models.py:151 apps/core/models.py:158 +#: apps/executive_summary/models.py:187 apps/executive_summary/models.py:289 +#: apps/executive_summary/templates/executive/dashboard.html:271 +#: apps/executive_summary/templates/executive/insights.html:26 +#: apps/observations/models.py:39 templates/actions/action_create.html:33 +#: templates/actions/action_list.html:111 +#: templates/actions/action_list.html:151 +#: templates/callcenter/complaint_form.html:218 +#: templates/callcenter/complaint_form.html:232 +#: templates/callcenter/complaint_list.html:150 +#: templates/complaints/complaint_form.html:714 +#: templates/complaints/complaint_list.html:192 +#: templates/complaints/complaint_list.html:211 +#: templates/complaints/partials/priority_badge.html:8 +#: templates/complaints/partials/severity_badge.html:8 +#: templates/core/public_submit.html:416 +#: templates/dashboard/command_center.html:862 +#: templates/dashboard/my_dashboard.html:159 +#: templates/observations/observation_list.html:198 +#: templates/organizations/department_complaints.html:44 +#: templates/organizations/department_inquiries.html:43 +#: templates/organizations/department_observations.html:44 +#: templates/organizations/staff_detail.html:282 +#: templates/px_sources/source_user_complaint_list.html:130 +#: templates/px_sources/source_user_complaint_list.html:227 +#: templates/px_sources/source_user_dashboard.html:235 +#: templates/rca/rca_list.html:187 templates/rca/rca_list.html:197 +msgid "High" +msgstr "مرتفع" + +#: apps/complaints/forms.py:672 apps/core/models.py:152 apps/core/models.py:159 +#: apps/executive_summary/models.py:188 +#: apps/executive_summary/templates/executive/dashboard.html:92 +#: apps/executive_summary/templates/executive/dashboard.html:268 +#: apps/executive_summary/templates/executive/insights.html:23 +#: apps/observations/models.py:40 templates/callcenter/complaint_form.html:219 +#: templates/callcenter/complaint_list.html:149 +#: templates/complaints/complaint_form.html:710 +#: templates/complaints/complaint_list.html:193 +#: templates/complaints/complaint_list.html:212 +#: templates/complaints/partials/severity_badge.html:4 +#: templates/core/public_submit.html:417 +#: templates/dashboard/command_center.html:862 +#: templates/dashboard/my_dashboard.html:160 +#: templates/dashboard/staff_performance_detail.html:200 +#: templates/observations/observation_list.html:199 +#: templates/organizations/department_complaints.html:45 +#: templates/organizations/department_observations.html:45 +#: templates/organizations/staff_detail.html:280 +#: templates/rca/rca_list.html:188 templates/rca/rca_list.html:198 +msgid "Critical" +msgstr "حرج" + +#: apps/complaints/forms.py:680 +msgid "Outgoing Inquiry" +msgstr "استفسار صادر" + +#: apps/complaints/forms.py:687 +#: templates/organizations/department_inquiry_detail.html:74 +msgid "Outgoing Department" +msgstr "القسم الصادر" + +#: apps/complaints/forms.py:697 templates/complaints/complaint_detail.html:445 +#: templates/complaints/complaint_list.html:237 +#: templates/complaints/complaint_pdf.html:550 +#: templates/complaints/government_ticket_list.html:83 +#: templates/complaints/government_ticket_list.html:142 +#: templates/complaints/partials/pdf_summary_panel.html:45 +#: templates/complaints/sla_management.html:263 +#: templates/dashboard/complaint_quarterly_report.html:592 +#: templates/dashboard/employee_evaluation.html:964 +#: templates/dashboard/standards_dashboard.html:36 +#: templates/feedback/comment_list.html:104 +#: templates/feedback/comment_list.html:153 +#: templates/feedback/feedback_detail.html:156 +#: templates/organizations/department_complaint_detail.html:137 +#: templates/organizations/department_detail.html:1309 +#: templates/organizations/department_staff_detail.html:474 +#: templates/physicians/doctor_rating_job_list.html:106 +#: templates/physicians/doctor_rating_job_status.html:162 +#: templates/physicians/individual_ratings_list.html:146 +#: templates/physicians/individual_ratings_list.html:188 +#: templates/px_sources/convert_to_complaint_modal.html:30 +#: templates/px_sources/source_user_confirm_delete.html:71 +#: templates/social/comment_detail.html:378 +#: templates/social/comments_list.html:130 +#: templates/standards/compliance_form.html:149 +#: templates/standards/search.html:101 templates/standards/search.html:380 +#: templates/standards/standard_confirm_delete.html:82 +#: templates/standards/standard_detail.html:135 +msgid "Source" +msgstr "المصدر" + +#: apps/complaints/forms.py:959 templates/analytics/kpi_list.html:76 +#: templates/appreciation/appreciation_detail.html:120 +#: templates/complaints/government_ticket_detail.html:107 +#: templates/complaints/partials/pdf_summary_panel.html:41 +#: templates/complaints/public_complaint_form.html:32 #: templates/complaints/public_inquiry_form.html:21 -#: templates/config/hospital_users.html:231 -#: templates/config/routing_rules.html:41 -#: templates/core/public_submit.html:544 templates/core/public_submit.html:644 +#: templates/config/hospital_users.html:236 +#: templates/config/routing_rules.html:41 templates/core/public_submit.html:431 #: templates/journeys/template_list.html:78 -#: templates/observations/observation_detail.html:186 -#: templates/observations/public_new.html:197 -#: templates/organizations/department_list.html:161 +#: templates/observations/public_new.html:212 +#: templates/organizations/department_confirm_delete.html:22 +#: templates/organizations/department_detail.html:516 +#: templates/organizations/department_form.html:89 +#: templates/organizations/department_staff_detail.html:59 #: templates/organizations/hospital_list.html:161 +#: templates/organizations/orgsection_confirm_delete.html:22 +#: templates/organizations/orgsubsection_confirm_delete.html:22 #: templates/organizations/physician_list.html:77 #: templates/organizations/section_confirm_delete.html:22 #: templates/organizations/section_form.html:90 #: templates/organizations/section_list.html:122 -#: templates/organizations/staff_list.html:260 +#: templates/organizations/staff_hierarchy.html:230 +#: templates/organizations/staff_import.html:264 +#: templates/organizations/staff_list.html:265 #: templates/organizations/subsection_confirm_delete.html:22 #: templates/organizations/subsection_form.html:90 #: templates/organizations/subsection_list.html:122 #: templates/references/folder_view.html:239 #: templates/references/search.html:231 +#: templates/standards/activity_type_confirm_delete.html:96 +#: templates/standards/activity_type_list.html:120 #: templates/standards/category_confirm_delete.html:104 #: templates/standards/category_list.html:123 #: templates/standards/source_confirm_delete.html:100 #: templates/standards/source_list.html:123 -#: templates/surveys/instance_detail.html:608 -#: templates/surveys/template_detail.html:196 +#: templates/surveys/instance_detail.html:470 +#: templates/surveys/template_detail.html:219 #: templates/surveys/template_list.html:83 msgid "Name" msgstr "الاسم" -#: apps/complaints/forms.py:900 apps/surveys/forms.py:288 -#: templates/accounts/settings.html:101 +#: apps/complaints/forms.py:966 apps/surveys/forms.py:288 +#: templates/accounts/settings.html:105 +#: templates/complaints/public_complaint_form.html:56 #: templates/complaints/public_inquiry_form.html:40 -#: templates/core/public_submit.html:657 +#: templates/core/public_submit.html:441 +#: templates/feedback/feedback_form.html:95 #: templates/notifications/send_sms_direct.html:25 #: templates/notifications/settings.html:406 -#: templates/px_sources/source_user_form.html:238 +#: templates/px_sources/source_user_form.html:206 #: templates/surveys/manual_send_phone.html:80 msgid "Phone Number" msgstr "رقم الهاتف" -#: apps/complaints/forms.py:903 +#: apps/complaints/forms.py:969 +#: templates/complaints/public_complaint_form.html:57 #: templates/complaints/public_inquiry_form.html:44 -#: templates/core/public_submit.html:658 +#: templates/core/public_submit.html:442 +#: templates/feedback/feedback_form.html:96 msgid "Your phone number" msgstr "رقم هاتفك" -#: apps/complaints/forms.py:1000 +#: apps/complaints/forms.py:1011 apps/observations/forms.py:756 +msgid "Section (Optional)" +msgstr "القسم (اختياري)" + +#: apps/complaints/forms.py:1125 msgid "This department is already involved in this complaint." msgstr "هذا القسم مشارك بالفعل في هذه الشكوى." -#: apps/complaints/forms.py:1051 +#: apps/complaints/forms.py:1176 msgid "This staff member is already involved in this complaint." msgstr "هذا الموظف مشارك بالفعل في هذه الشكوى." -#: apps/complaints/forms.py:1076 +#: apps/complaints/forms.py:1201 msgid "Enter department response and findings..." msgstr "أدخل استجابة القسم ونتائج التحقيق..." -#: apps/complaints/forms.py:1095 +#: apps/complaints/forms.py:1220 msgid "Enter your explanation regarding this complaint..." msgstr "أدخل تفسيرك بخصوص هذه الشكوى..." -#: apps/complaints/models.py:26 apps/complaints/models.py:1397 +#: apps/complaints/forms.py:1251 +msgid "Enter ticket content..." +msgstr "أدخل محتوى التذكرة..." + +#: apps/complaints/forms.py:1254 +msgid "e.g., B2022807" +msgstr "مثال: B2022807" + +#: apps/complaints/forms.py:1257 +msgid "Complainant name" +msgstr "اسم المشتكي" + +#: apps/complaints/forms.py:1260 +#: templates/complaints/government_ticket_detail.html:111 +#: templates/complaints/government_ticket_import.html:164 +#: templates/organizations/patient_list.html:283 +#: templates/surveys/his_patient_import.html:135 +msgid "National ID" +msgstr "رقم الهوية الوطنية" + +#: apps/complaints/forms.py:1263 +msgid "Contact number" +msgstr "رقم الاتصال" + +#: apps/complaints/forms.py:1266 apps/complaints/models.py:117 +#: templates/callcenter/complaint_form.html:209 +#: templates/complaints/complaint_detail.html:394 +#: templates/complaints/government_ticket_import.html:168 +#: templates/feedback/comment_list.html:77 +#: templates/feedback/comment_list.html:155 +#: templates/organizations/department_complaint_detail.html:126 +#: templates/organizations/department_complaints.html:69 +#: templates/organizations/department_detail.html:701 +#: templates/organizations/department_detail.html:1308 +#: templates/organizations/department_staff_detail.html:473 +msgid "Classification" +msgstr "التصنيف" + +#: apps/complaints/forms.py:1299 +msgid "A ticket with this number already exists." +msgstr "توجد بالفعل تذكرة بهذا الرقم." + +#: apps/complaints/models.py:28 apps/complaints/models.py:1758 +#: apps/executive_summary/templates/executive/dashboard.html:99 +#: apps/observations/models.py:46 apps/organizations/ui_views.py:2368 +#: apps/organizations/ui_views.py:2440 apps/px_sources/models.py:276 #: templates/callcenter/complaint_list.html:93 #: templates/callcenter/complaint_list.html:139 #: templates/callcenter/inquiry_list.html:89 #: templates/callcenter/inquiry_list.html:135 #: templates/complaints/analytics.html:181 -#: templates/complaints/analytics.html:309 -#: templates/complaints/inquiry_list.html:187 -#: templates/dashboard/admin_evaluation.html:455 -#: templates/dashboard/admin_evaluation.html:530 +#: templates/complaints/analytics.html:333 +#: templates/complaints/inquiry_list.html:144 +#: templates/dashboard/admin_evaluation.html:465 +#: templates/dashboard/admin_evaluation.html:540 #: templates/dashboard/command_center.html:384 -#: templates/dashboard/my_dashboard.html:49 -#: templates/dashboard/my_dashboard.html:141 -#: templates/dashboard/my_dashboard.html:260 +#: templates/dashboard/my_dashboard.html:55 +#: templates/dashboard/my_dashboard.html:147 +#: templates/dashboard/my_dashboard.html:329 +#: templates/dashboard/observation_report.html:141 +#: templates/dashboard/observation_report.html:173 +#: templates/organizations/department_complaints.html:34 +#: templates/organizations/department_detail.html:453 +#: templates/organizations/department_detail.html:463 +#: templates/organizations/department_inquiries.html:33 +#: templates/organizations/department_staff_detail.html:179 +#: templates/organizations/staff_detail.html:207 +#: templates/organizations/staff_detail.html:265 #: templates/px_sources/source_user_complaint_list.html:116 #: templates/px_sources/source_user_complaint_list.html:207 -#: templates/px_sources/source_user_dashboard.html:183 -#: templates/px_sources/source_user_dashboard.html:272 +#: templates/px_sources/source_user_dashboard.html:215 +#: templates/px_sources/source_user_dashboard.html:304 #: templates/px_sources/source_user_inquiry_list.html:116 #: templates/px_sources/source_user_inquiry_list.html:202 msgid "Open" msgstr "مفتوح" -#: apps/complaints/models.py:27 apps/complaints/models.py:673 -#: apps/complaints/models.py:675 apps/complaints/models.py:683 -#: apps/complaints/models.py:685 apps/complaints/models.py:1398 -#: apps/complaints/ui_views.py:2130 apps/complaints/ui_views.py:2131 -#: apps/complaints/ui_views.py:2132 apps/complaints/ui_views.py:2133 +#: apps/complaints/models.py:29 apps/complaints/models.py:889 +#: apps/complaints/models.py:891 apps/complaints/models.py:1759 +#: apps/complaints/models.py:3548 apps/complaints/ui_views.py:4549 +#: apps/complaints/ui_views.py:4550 apps/complaints/ui_views.py:4745 +#: apps/complaints/ui_views.py:4746 apps/complaints/ui_views.py:4747 +#: apps/observations/models.py:47 apps/organizations/ui_views.py:2368 +#: apps/organizations/ui_views.py:2440 apps/organizations/ui_views.py:2510 #: templates/accounts/onboarding/dashboard.html:59 #: templates/accounts/onboarding/progress_detail.html:153 #: templates/accounts/onboarding/provisional_list.html:110 @@ -1402,241 +2183,375 @@ msgstr "مفتوح" #: templates/callcenter/complaint_list.html:140 #: templates/callcenter/inquiry_list.html:98 #: templates/callcenter/inquiry_list.html:136 -#: templates/complaints/complaint_list.html:162 -#: templates/complaints/inquiry_list.html:155 -#: templates/complaints/inquiry_list.html:188 +#: templates/complaints/complaint_list.html:165 +#: templates/complaints/inquiry_list.html:108 +#: templates/complaints/inquiry_list.html:145 #: templates/dashboard/command_center.html:393 -#: templates/dashboard/my_dashboard.html:62 -#: templates/dashboard/my_dashboard.html:142 -#: templates/dashboard/my_dashboard.html:261 +#: templates/dashboard/inquiry_report.html:166 +#: templates/dashboard/inquiry_report.html:198 +#: templates/dashboard/my_dashboard.html:68 +#: templates/dashboard/my_dashboard.html:148 +#: templates/dashboard/my_dashboard.html:330 +#: templates/dashboard/observation_report.html:142 +#: templates/dashboard/observation_report.html:174 #: templates/observations/observation_list.html:132 +#: templates/organizations/department_complaints.html:35 +#: templates/organizations/department_detail.html:454 +#: templates/organizations/department_detail.html:464 +#: templates/organizations/department_detail.html:475 +#: templates/organizations/department_inquiries.html:34 +#: templates/organizations/department_observations.html:35 +#: templates/organizations/department_staff_detail.html:185 #: templates/organizations/patient_visit_journey.html:127 +#: templates/organizations/staff_detail.html:213 +#: templates/organizations/staff_detail.html:267 #: templates/px_sources/source_user_complaint_list.html:117 #: templates/px_sources/source_user_complaint_list.html:212 -#: templates/px_sources/source_user_dashboard.html:188 -#: templates/px_sources/source_user_dashboard.html:277 +#: templates/px_sources/source_user_dashboard.html:220 +#: templates/px_sources/source_user_dashboard.html:309 #: templates/px_sources/source_user_inquiry_list.html:117 #: templates/px_sources/source_user_inquiry_list.html:207 +#: templates/px_sources/source_user_observation_list.html:107 +#: templates/px_sources/source_user_observation_list.html:188 +#: templates/px_sources/source_user_suggestion_list.html:106 +#: templates/px_sources/source_user_suggestion_list.html:182 #: templates/rca/rca_list.html:111 templates/rca/rca_list.html:157 msgid "In Progress" msgstr "قيد التنفيذ" -#: apps/complaints/models.py:28 +#: apps/complaints/models.py:30 apps/complaints/ui_views.py:167 msgid "Partially Resolved" msgstr "محلول جزئياً" -#: apps/complaints/models.py:29 apps/complaints/models.py:680 -#: apps/complaints/models.py:1399 apps/complaints/models.py:2386 -#: apps/complaints/ui_views.py:2134 +#: apps/complaints/models.py:31 apps/complaints/models.py:896 +#: apps/complaints/models.py:1760 apps/complaints/models.py:3137 +#: apps/complaints/models.py:3549 apps/complaints/ui_views.py:160 +#: apps/complaints/ui_views.py:269 apps/complaints/ui_views.py:4551 +#: apps/complaints/ui_views.py:4748 apps/executive_summary/models.py:194 +#: apps/observations/models.py:48 apps/observations/views.py:136 +#: apps/organizations/ui_views.py:2368 apps/organizations/ui_views.py:2440 +#: apps/organizations/ui_views.py:2510 apps/px_sources/models.py:345 +#: templates/analytics/kpi_report_weasyprint.html:510 #: templates/callcenter/complaint_list.html:111 #: templates/callcenter/complaint_list.html:141 #: templates/callcenter/inquiry_list.html:107 #: templates/callcenter/inquiry_list.html:137 #: templates/complaints/analytics.html:205 -#: templates/complaints/analytics.html:310 -#: templates/complaints/complaint_list.html:116 -#: templates/complaints/complaint_list.html:165 -#: templates/complaints/inquiry_list.html:148 -#: templates/complaints/inquiry_list.html:189 -#: templates/dashboard/admin_evaluation.html:456 -#: templates/dashboard/admin_evaluation.html:531 -#: templates/dashboard/employee_evaluation.html:1115 -#: templates/dashboard/my_dashboard.html:75 -#: templates/dashboard/my_dashboard.html:143 -#: templates/dashboard/my_dashboard.html:262 +#: templates/complaints/analytics.html:334 +#: templates/complaints/complaint_list.html:119 +#: templates/complaints/complaint_list.html:168 +#: templates/complaints/inquiry_list.html:97 +#: templates/complaints/inquiry_list.html:146 +#: templates/dashboard/admin_evaluation.html:466 +#: templates/dashboard/admin_evaluation.html:541 +#: templates/dashboard/employee_evaluation.html:1196 +#: templates/dashboard/my_dashboard.html:81 +#: templates/dashboard/my_dashboard.html:149 +#: templates/dashboard/my_dashboard.html:331 +#: templates/dashboard/observation_report.html:97 +#: templates/dashboard/observation_report.html:143 +#: templates/dashboard/observation_report.html:175 +#: templates/organizations/department_complaints.html:36 +#: templates/organizations/department_detail.html:455 +#: templates/organizations/department_detail.html:465 +#: templates/organizations/department_detail.html:476 +#: templates/organizations/department_inquiries.html:35 +#: templates/organizations/department_observations.html:36 +#: templates/organizations/department_staff_detail.html:191 +#: templates/organizations/staff_detail.html:219 +#: templates/organizations/staff_detail.html:269 +#: templates/px_sources/communication_request_detail.html:70 +#: templates/px_sources/communication_request_detail.html:250 +#: templates/px_sources/communication_request_list.html:87 +#: templates/px_sources/communication_request_list.html:146 +#: templates/px_sources/source_user_communication_request_list.html:110 #: templates/px_sources/source_user_complaint_list.html:118 #: templates/px_sources/source_user_complaint_list.html:217 -#: templates/px_sources/source_user_dashboard.html:193 -#: templates/px_sources/source_user_dashboard.html:282 +#: templates/px_sources/source_user_dashboard.html:225 +#: templates/px_sources/source_user_dashboard.html:314 #: templates/px_sources/source_user_inquiry_list.html:118 #: templates/px_sources/source_user_inquiry_list.html:212 +#: templates/px_sources/source_user_observation_list.html:108 +#: templates/px_sources/source_user_observation_list.html:192 msgid "Resolved" msgstr "تم الحل" -#: apps/complaints/models.py:30 apps/complaints/models.py:681 -#: apps/complaints/models.py:1400 apps/complaints/ui_views.py:2135 -#: apps/feedback/models.py:35 templates/callcenter/complaint_list.html:142 +#: apps/complaints/models.py:32 apps/complaints/models.py:897 +#: apps/complaints/models.py:1761 apps/complaints/models.py:3550 +#: apps/complaints/ui_views.py:179 apps/complaints/ui_views.py:275 +#: apps/complaints/ui_views.py:4552 apps/complaints/ui_views.py:4749 +#: apps/executive_summary/templates/executive/dashboard.html:101 +#: apps/feedback/models.py:36 apps/observations/models.py:49 +#: apps/observations/views.py:143 apps/organizations/ui_views.py:2368 +#: apps/organizations/ui_views.py:2440 apps/organizations/ui_views.py:2510 +#: apps/px_sources/models.py:278 apps/px_sources/models.py:346 +#: templates/callcenter/complaint_list.html:142 #: templates/callcenter/inquiry_list.html:138 -#: templates/complaints/inquiry_list.html:190 -#: templates/dashboard/my_dashboard.html:88 -#: templates/dashboard/my_dashboard.html:144 -#: templates/dashboard/my_dashboard.html:263 +#: templates/complaints/inquiry_list.html:147 +#: templates/dashboard/my_dashboard.html:94 +#: templates/dashboard/my_dashboard.html:150 +#: templates/dashboard/my_dashboard.html:332 +#: templates/organizations/department_complaints.html:37 +#: templates/organizations/department_detail.html:456 +#: templates/organizations/department_detail.html:466 +#: templates/organizations/department_detail.html:477 +#: templates/organizations/department_detail.html:487 +#: templates/organizations/department_inquiries.html:36 +#: templates/organizations/department_observations.html:37 +#: templates/organizations/department_staff_detail.html:197 +#: templates/organizations/staff_detail.html:225 +#: templates/organizations/staff_detail.html:271 +#: templates/px_sources/communication_request_detail.html:74 +#: templates/px_sources/communication_request_detail.html:251 +#: templates/px_sources/communication_request_list.html:91 +#: templates/px_sources/communication_request_list.html:150 #: templates/px_sources/source_user_complaint_list.html:119 #: templates/px_sources/source_user_inquiry_list.html:119 +#: templates/px_sources/source_user_observation_list.html:109 +#: templates/px_sources/source_user_suggestion_list.html:108 #: templates/rca/rca_list.html:166 msgid "Closed" msgstr "مغلقة" -#: apps/complaints/models.py:31 apps/complaints/models.py:682 -#: apps/complaints/ui_views.py:2136 apps/core/models.py:133 -#: templates/actions/action_create.html:88 +#: apps/complaints/models.py:33 apps/complaints/models.py:898 +#: apps/complaints/ui_views.py:186 apps/complaints/ui_views.py:4553 +#: apps/core/models.py:145 templates/actions/action_create.html:88 #: templates/actions/action_list.html:104 #: templates/actions/action_list.html:163 #: templates/journeys/instance_list.html:187 +#: templates/organizations/staff_detail.html:273 msgid "Cancelled" msgstr "ملغى" -#: apps/complaints/models.py:32 apps/complaints/models.py:1401 +#: apps/complaints/models.py:34 apps/complaints/ui_views.py:172 +msgid "Pending External" +msgstr "معلق خارجي" + +#: apps/complaints/models.py:35 +msgid "OVR Pending Approval" +msgstr "موافقة OVR معلقة" + +#: apps/complaints/models.py:41 apps/complaints/models.py:1770 +msgid "Not Contacted" +msgstr "لم يتم الاتصال" + +#: apps/complaints/models.py:42 apps/complaints/models.py:1771 +#: apps/complaints/ui_views.py:131 apps/complaints/ui_views.py:246 +#: apps/px_sources/models.py:344 templates/complaints/complaint_detail.html:811 +#: templates/dashboard/inquiry_report.html:167 +#: templates/dashboard/inquiry_report.html:199 +#: templates/px_sources/communication_request_detail.html:66 +#: templates/px_sources/communication_request_detail.html:249 +#: templates/px_sources/communication_request_detail.html:294 +#: templates/px_sources/communication_request_list.html:83 +#: templates/px_sources/communication_request_list.html:142 +#: templates/px_sources/source_user_communication_request_list.html:106 msgid "Contacted" msgstr "تم التواصل" -#: apps/complaints/models.py:33 apps/complaints/models.py:1402 +#: apps/complaints/models.py:43 msgid "Contacted, No Response" msgstr "تم التواصل، لا رد" -#: apps/complaints/models.py:39 +#: apps/complaints/models.py:49 +msgid "Department No Response" +msgstr "لا رد من القسم" + +#: apps/complaints/models.py:50 apps/complaints/ui_views.py:136 +#: apps/observations/views.py:122 templates/actions/action_detail.html:496 +#: templates/complaints/adverse_action_list.html:279 +#: templates/complaints/complaint_detail.html:454 +#: templates/complaints/partials/adverse_actions_panel.html:47 +#: templates/complaints/public_complaint_track.html:173 +#: templates/complaints/public_inquiry_track.html:177 +#: templates/core/public_track.html:235 +#: templates/dashboard/command_center.html:524 +#: templates/dashboard/complaint_monthly_report.html:108 +#: templates/dashboard/complaint_quarterly_report.html:111 +#: templates/dashboard/employee_evaluation_charts.html:578 +#: templates/organizations/department_complaint_detail.html:155 +#: templates/organizations/department_detail.html:1313 +#: templates/organizations/department_staff_detail.html:478 +msgid "Escalated" +msgstr "تم التصعيد" + +#: apps/complaints/models.py:51 +msgid "Patient Not Satisfied with Complaint Resolution" +msgstr "المريض غير راضٍ عن حل الشكوى" + +#: apps/complaints/models.py:57 msgid "Full Action Taken" msgstr "تم اتخاذ الإجراء الكامل" -#: apps/complaints/models.py:40 +#: apps/complaints/models.py:58 msgid "Partial Action Taken" msgstr "تم اتخاذ الإجراء الجزئي" -#: apps/complaints/models.py:41 +#: apps/complaints/models.py:59 msgid "No Action Needed" msgstr "لا حاجة لاتخاذ إجراء" -#: apps/complaints/models.py:42 +#: apps/complaints/models.py:60 msgid "Cannot Resolve" msgstr "غير قادر على الحل" -#: apps/complaints/models.py:43 +#: apps/complaints/models.py:61 msgid "Patient Withdrawn" msgstr "المريض منسحب" -#: apps/complaints/models.py:49 apps/complaints/models.py:71 -#: apps/complaints/models.py:205 apps/surveys/forms.py:194 -#: templates/analytics/command_center.html:360 -#: templates/callcenter/complaint_form.html:117 +#: apps/complaints/models.py:67 apps/complaints/models.py:89 +#: apps/complaints/models.py:223 apps/complaints/ui_views.py:105 +#: apps/complaints/ui_views.py:227 apps/observations/views.py:106 +#: apps/surveys/forms.py:194 templates/callcenter/complaint_form.html:117 #: templates/callcenter/complaint_list.html:178 -#: templates/callcenter/inquiry_form.html:121 -#: templates/complaints/partials/resolution_panel.html:25 -#: templates/complaints/partials/resolution_panel.html:111 +#: templates/callcenter/inquiry_form.html:134 +#: templates/complaints/partials/resolution_panel.html:26 +#: templates/complaints/partials/resolution_panel.html:168 #: templates/complaints/patient_complaint_portal.html:49 #: templates/complaints/patient_complaint_visits.html:65 -#: templates/complaints/public_complaint_form.html:193 +#: templates/complaints/public_complaint_form.html:41 #: templates/dashboard/complaint_request_list.html:84 #: templates/dashboard/partials/feedback_table.html:25 -#: templates/emails/new_complaint_admin_notification.html:69 -#: templates/feedback/feedback_form.html:180 +#: templates/emails/new_complaint_admin_notification.html:20 #: templates/journeys/instance_list.html:238 -#: templates/organizations/patient_list.html:261 -#: templates/organizations/patient_list.html:502 -#: templates/organizations/patient_visit_journey.html:217 +#: templates/organizations/department_complaints.html:71 +#: templates/organizations/department_detail.html:703 +#: templates/organizations/department_detail.html:1302 +#: templates/organizations/department_manager_review.html:59 +#: templates/organizations/department_staff_detail.html:215 +#: templates/organizations/department_staff_detail.html:467 +#: templates/organizations/patient_list.html:281 +#: templates/organizations/patient_list.html:522 +#: templates/organizations/patient_visit_journey.html:276 +#: templates/organizations/staff_detail.html:237 #: templates/physicians/doctor_rating_review.html:175 +#: templates/px_sources/communication_request_list.html:111 +#: templates/px_sources/source_detail.html:396 +#: templates/px_sources/source_user_communication_request_list.html:80 #: templates/px_sources/source_user_complaint_list.html:184 -#: templates/px_sources/source_user_dashboard.html:162 +#: templates/px_sources/source_user_dashboard.html:194 #: templates/simulator/log_detail.html:131 -#: templates/surveys/comment_list.html:259 -#: templates/surveys/instance_detail.html:320 +#: templates/surveys/comment_list.html:273 #: templates/surveys/instance_list.html:133 #: templates/surveys/manual_send.html:66 msgid "Patient" msgstr "المريض" -#: apps/complaints/models.py:51 -#: templates/complaints/partials/resolution_panel.html:113 +#: apps/complaints/models.py:69 msgid "Other — please specify" msgstr "آخر — يرجى التحديد" -#: apps/complaints/models.py:57 templates/analytics/command_center.html:589 -#: templates/analytics/dashboard.html:725 +#: apps/complaints/models.py:75 templates/analytics/dashboard.html:1115 #: templates/complaints/adverse_action_form.html:101 #: templates/complaints/adverse_action_list.html:274 -#: templates/core/public_submit.html:303 +#: templates/complaints/investigation_respond.html:30 +#: templates/complaints/partials/pdf_summary_panel.html:84 +#: templates/core/public_submit.html:295 templates/core/public_track.html:153 +#: templates/organizations/department_complaint_detail.html:49 +#: templates/organizations/department_detail.html:1296 +#: templates/organizations/department_staff_detail.html:464 +#: templates/px_sources/communication_request_detail.html:194 +#: templates/surveys/comment_list.html:202 msgid "Complaint" msgstr "شكوى" -#: apps/complaints/models.py:58 -#: templates/appreciation/appreciation_detail.html:11 -#: templates/appreciation/appreciation_list.html:4 -#: templates/appreciation/appreciation_list.html:57 -#: templates/appreciation/appreciation_send_form.html:93 +#: apps/complaints/models.py:76 templates/analytics/dashboard.html:380 #: templates/appreciation/badge_form.html:93 #: templates/appreciation/badge_list.html:82 #: templates/appreciation/category_form.html:93 #: templates/appreciation/category_list.html:98 -#: templates/appreciation/leaderboard.html:11 +#: templates/appreciation/leaderboard.html:64 #: templates/appreciation/my_badges.html:11 +#: templates/core/public_submit.html:334 +#: templates/layouts/partials/sidebar.html:222 +#: templates/organizations/department_detail.html:1300 +#: templates/organizations/department_staff_detail.html:465 +#: templates/surveys/comment_list.html:206 msgid "Appreciation" msgstr "التقدير" -#: apps/complaints/models.py:64 apps/px_sources/models.py:37 -#: templates/dashboard/admin_evaluation.html:453 +#: apps/complaints/models.py:82 apps/px_sources/models.py:39 +#: templates/dashboard/admin_evaluation.html:463 msgid "Internal" msgstr "داخلي" -#: apps/complaints/models.py:65 apps/px_sources/models.py:38 -#: templates/dashboard/admin_evaluation.html:454 +#: apps/complaints/models.py:83 apps/px_sources/models.py:40 +#: templates/dashboard/admin_evaluation.html:464 msgid "External" msgstr "خارجي" -#: apps/complaints/models.py:72 templates/callcenter/complaint_form.html:118 -#: templates/callcenter/inquiry_form.html:122 +#: apps/complaints/models.py:90 templates/callcenter/complaint_form.html:118 +#: templates/callcenter/inquiry_form.html:135 msgid "Family Member" msgstr "أحد أفراد العائلة" -#: apps/complaints/models.py:74 templates/journeys/template_form.html:266 -#: templates/organizations/patient_visit_journey.html:357 +#: apps/complaints/models.py:92 templates/journeys/template_form.html:266 +#: templates/organizations/patient_visit_journey.html:416 #: templates/simulator/log_detail.html:161 -#: templates/surveys/comment_list.html:263 +#: templates/surveys/comment_list.html:277 #: templates/surveys/instance_detail.html:6 -#: templates/surveys/instance_detail.html:467 +#: templates/surveys/instance_detail.html:329 msgid "Survey" msgstr "الاستبيان" -#: apps/complaints/models.py:75 templates/layouts/partials/sidebar.html:331 +#: apps/complaints/models.py:93 templates/layouts/partials/sidebar.html:543 #: templates/social/social_comment_detail.html:14 #: templates/social/social_platform.html:96 msgid "Social Media" msgstr "وسائل التواصل الاجتماعي" -#: apps/complaints/models.py:76 templates/callcenter/complaint_form.html:5 +#: apps/complaints/models.py:94 templates/callcenter/complaint_form.html:5 #: templates/callcenter/complaint_list.html:5 #: templates/callcenter/complaint_success.html:5 #: templates/callcenter/inquiry_form.html:5 +#: templates/callcenter/inquiry_form.html:69 #: templates/callcenter/inquiry_list.html:5 #: templates/callcenter/inquiry_success.html:5 #: templates/callcenter/interaction_list.html:60 msgid "Call Center" msgstr "مركز الاتصال" -#: apps/complaints/models.py:77 +#: apps/complaints/models.py:95 #: templates/analytics/kpi_report_generate.html:161 msgid "Ministry of Health" msgstr "وزارة الصحة" -#: apps/complaints/models.py:78 +#: apps/complaints/models.py:96 msgid "Council of Health Insurance" msgstr "مجلس التأمين الصحي" -#: apps/complaints/models.py:79 apps/complaints/models.py:1363 -#: apps/complaints/models.py:1897 apps/complaints/models.py:1960 -#: apps/complaints/models.py:2369 apps/complaints/models.py:2666 -#: apps/feedback/models.py:50 apps/feedback/models.py:349 -#: apps/organizations/models.py:180 apps/organizations/models.py:219 -#: apps/organizations/models.py:427 apps/px_sources/models.py:41 +#: apps/complaints/models.py:97 apps/complaints/models.py:226 +#: apps/complaints/models.py:1690 apps/complaints/models.py:2585 +#: apps/complaints/models.py:2648 apps/complaints/models.py:3120 +#: apps/complaints/models.py:3417 apps/feedback/models.py:61 +#: apps/feedback/models.py:435 apps/organizations/models.py:306 +#: apps/organizations/models.py:352 apps/organizations/models.py:560 +#: apps/px_sources/models.py:43 apps/px_sources/models.py:340 #: templates/callcenter/complaint_form.html:119 #: templates/callcenter/complaint_form.html:191 -#: templates/callcenter/inquiry_form.html:123 -#: templates/callcenter/inquiry_form.html:165 +#: templates/callcenter/inquiry_form.html:136 +#: templates/callcenter/inquiry_form.html:182 #: templates/callcenter/inquiry_list.html:149 -#: templates/complaints/partials/resolution_panel.html:29 -#: templates/complaints/public_complaint_form.html:196 -#: templates/complaints/public_inquiry_form.html:73 -#: templates/core/public_submit.html:678 -#: templates/dashboard/employee_evaluation.html:719 -#: templates/organizations/staff_list.html:210 +#: templates/complaints/inquiry_list.html:161 +#: templates/complaints/partials/resolution_panel.html:30 +#: templates/complaints/public_complaint_form.html:44 +#: templates/complaints/public_inquiry_form.html:123 +#: templates/core/public_submit.html:449 +#: templates/dashboard/employee_evaluation.html:783 +#: templates/organizations/department_staff_detail.html:418 +#: templates/organizations/staff_import.html:83 #: templates/px_sources/source_user_complaint_list.html:144 +#: templates/px_sources/source_user_create_communication_request.html:53 #: templates/px_sources/source_user_inquiry_list.html:132 +#: templates/px_sources/source_user_suggestion_list.html:121 msgid "Other" msgstr "أخرى" -#: apps/complaints/models.py:96 templates/complaints/complaint_detail.html:261 +#: apps/complaints/models.py:114 msgid "Domain" msgstr "المجال" -#: apps/complaints/models.py:97 +#: apps/complaints/models.py:115 #: templates/accounts/acknowledgements/category_list.html:95 #: templates/accounts/acknowledgements/checklist_form.html:124 #: templates/accounts/acknowledgements/checklist_list.html:86 @@ -1645,85 +2560,103 @@ msgstr "المجال" #: templates/accounts/onboarding/content_list.html:193 #: templates/actions/action_detail.html:153 #: templates/analytics/kpi_list.html:77 -#: templates/appreciation/appreciation_list.html:195 -#: templates/appreciation/appreciation_send_form.html:154 +#: templates/analytics/kpi_report_weasyprint.html:449 +#: templates/appreciation/appreciation_detail.html:301 +#: templates/appreciation/appreciation_list.html:193 #: templates/callcenter/complaint_form.html:182 #: templates/callcenter/complaint_list.html:180 -#: templates/callcenter/inquiry_form.html:158 +#: templates/callcenter/inquiry_form.html:175 #: templates/callcenter/inquiry_list.html:142 #: templates/callcenter/inquiry_list.html:177 -#: templates/complaints/complaint_detail.html:267 -#: templates/complaints/complaint_form.html:685 +#: templates/complaints/complaint_detail.html:366 +#: templates/complaints/complaint_form.html:679 #: templates/complaints/complaint_pdf.html:546 #: templates/complaints/complaint_threshold_list.html:257 -#: templates/complaints/inquiry_detail.html:496 -#: templates/complaints/inquiry_list.html:194 -#: templates/complaints/inquiry_list.html:231 -#: templates/complaints/public_inquiry_form.html:63 -#: templates/core/public_submit.html:486 templates/core/public_submit.html:670 +#: templates/complaints/inquiry_list.html:151 +#: templates/complaints/inquiry_list.html:192 +#: templates/complaints/public_complaint_form.html:114 +#: templates/complaints/public_inquiry_form.html:111 +#: templates/complaints/templates/template_form.html:29 +#: templates/core/public_submit.html:412 +#: templates/dashboard/comments_report.html:91 +#: templates/dashboard/comments_report.html:119 #: templates/dashboard/partials/complaints_table.html:26 #: templates/dashboard/partials/feedback_table.html:27 #: templates/dashboard/partials/observations_table.html:25 -#: templates/emails/observation_assigned.html:49 -#: templates/emails/observation_monthly_followup.html:49 -#: templates/emails/observation_resolved.html:49 -#: templates/feedback/feedback_form.html:257 -#: templates/feedback/feedback_list.html:265 -#: templates/feedback/feedback_list.html:357 +#: templates/dashboard/standards_dashboard.html:137 +#: templates/dashboard/standards_dashboard.html:182 +#: templates/dashboard/standards_dashboard.html:240 +#: templates/emails/new_appreciation_notification.html:20 +#: templates/emails/new_inquiry_notification.html:18 +#: templates/emails/new_suggestion_notification.html:18 +#: templates/feedback/feedback_detail.html:90 +#: templates/feedback/feedback_detail.html:226 +#: templates/feedback/feedback_list.html:171 +#: templates/feedback/feedback_list.html:209 #: templates/observations/convert_to_action.html:71 -#: templates/observations/observation_create.html:160 -#: templates/observations/observation_detail.html:132 -#: templates/observations/observation_list.html:204 -#: templates/observations/observation_list.html:297 -#: templates/observations/public_new.html:91 +#: templates/observations/observation_detail.html:145 +#: templates/observations/observation_list.html:205 +#: templates/observations/observation_list.html:299 +#: templates/observations/public_new.html:114 #: templates/observations/public_success.html:126 -#: templates/observations/public_track.html:196 -#: templates/px_sources/source_detail.html:317 +#: templates/observations/public_track.html:192 +#: templates/organizations/department_detail.html:895 +#: templates/organizations/department_detail.html:950 +#: templates/organizations/department_detail.html:1317 +#: templates/organizations/department_form.html:104 +#: templates/organizations/department_inquiry_detail.html:100 +#: templates/organizations/department_list.html:141 +#: templates/organizations/department_observation_detail.html:82 +#: templates/organizations/department_staff_detail.html:284 +#: templates/organizations/department_staff_detail.html:482 +#: templates/px_sources/source_detail.html:324 #: templates/px_sources/source_user_complaint_list.html:136 #: templates/px_sources/source_user_inquiry_list.html:125 +#: templates/px_sources/source_user_observation_list.html:113 +#: templates/px_sources/source_user_observation_list.html:154 #: templates/rca/rca_detail.html:412 #: templates/standards/compliance_form.html:153 -#: templates/standards/search.html:114 templates/standards/search.html:167 +#: templates/standards/search.html:114 templates/standards/search.html:383 #: templates/standards/standard_confirm_delete.html:86 -#: templates/standards/standard_detail.html:116 +#: templates/standards/standard_detail.html:139 +#: templates/surveys/comment_list.html:198 msgid "Category" msgstr "الفئة" -#: apps/complaints/models.py:98 templates/callcenter/complaint_form.html:196 -#: templates/complaints/complaint_detail.html:273 -#: templates/feedback/feedback_form.html:264 +#: apps/complaints/models.py:116 templates/callcenter/complaint_form.html:196 msgid "Subcategory" msgstr "الفئة الفرعية" -#: apps/complaints/models.py:99 templates/callcenter/complaint_form.html:209 -#: templates/complaints/complaint_detail.html:256 -#: templates/complaints/complaint_detail.html:279 -#: templates/feedback/comment_list.html:29 -msgid "Classification" -msgstr "التصنيف" - -#: apps/complaints/models.py:102 +#: apps/complaints/models.py:120 msgid "Clinical" msgstr "سريري" -#: apps/complaints/models.py:103 +#: apps/complaints/models.py:121 msgid "Management" msgstr "إدارة" -#: apps/complaints/models.py:104 +#: apps/complaints/models.py:122 msgid "Relationships" msgstr "العلاقات" -#: apps/complaints/models.py:206 -#: templates/complaints/public_complaint_form.html:194 +#: apps/complaints/models.py:224 +#: templates/complaints/public_complaint_form.html:42 msgid "Relative" msgstr "قريب" -#: apps/complaints/models.py:453 +#: apps/complaints/models.py:225 +#: templates/complaints/public_complaint_form.html:43 +msgid "Friend" +msgstr "صديق" + +#: apps/complaints/models.py:581 templates/complaints/inquiry_detail.html:577 +#: templates/complaints/partials/resolution_panel.html:92 +#: templates/core/public_track.html:279 +#: templates/observations/observation_detail.html:728 msgid "Satisfied" msgstr "راضٍ" -#: apps/complaints/models.py:454 apps/feedback/models.py:57 +#: apps/complaints/models.py:582 apps/feedback/models.py:68 #: templates/ai_engine/analyze_text.html:105 #: templates/ai_engine/sentiment_dashboard.html:48 #: templates/ai_engine/sentiment_dashboard.html:90 @@ -1733,10 +2666,16 @@ msgstr "راضٍ" #: templates/ai_engine/sentiment_list.html:230 #: templates/ai_engine/tags/sentiment_badge.html:10 #: templates/ai_engine/tags/sentiment_card.html:14 -#: templates/analytics/command_center.html:394 -#: templates/physicians/leaderboard.html:246 +#: templates/complaints/inquiry_detail.html:582 +#: templates/complaints/partials/resolution_panel.html:98 +#: templates/core/public_track.html:283 +#: templates/feedback/feedback_list.html:184 +#: templates/observations/observation_detail.html:733 #: templates/physicians/physician_detail.html:502 #: templates/physicians/ratings_list.html:255 +#: templates/social/comment_detail.html:139 +#: templates/social/comments_list.html:125 +#: templates/social/comments_list.html:192 #: templates/social/social_comment_detail.html:50 #: templates/social/social_comment_list.html:140 #: templates/social/social_comment_list.html:191 @@ -1748,820 +2687,1209 @@ msgstr "راضٍ" msgid "Neutral" msgstr "محايد" -#: apps/complaints/models.py:455 +#: apps/complaints/models.py:583 templates/complaints/inquiry_detail.html:587 +#: templates/complaints/partials/resolution_panel.html:104 +#: templates/core/public_track.html:287 +#: templates/observations/observation_detail.html:738 msgid "Dissatisfied" msgstr "غير راضٍ" -#: apps/complaints/models.py:456 +#: apps/complaints/models.py:584 templates/complaints/complaint_detail.html:98 +#: templates/complaints/complaint_detail.html:817 +#: templates/complaints/partials/resolution_panel.html:110 +#: templates/dashboard/inquiry_report.html:165 +#: templates/dashboard/inquiry_report.html:197 msgid "No Response" msgstr "لا رد" -#: apps/complaints/models.py:457 templates/actions/action_detail.html:496 -#: templates/complaints/adverse_action_list.html:279 -#: templates/complaints/partials/adverse_actions_panel.html:47 -#: templates/dashboard/command_center.html:524 -msgid "Escalated" -msgstr "تم التصعيد" - -#: apps/complaints/models.py:672 apps/complaints/models.py:697 -#: apps/complaints/ui_views.py:2129 -#: templates/appreciation/appreciation_list.html:75 -#: templates/appreciation/leaderboard.html:87 +#: apps/complaints/models.py:888 apps/complaints/models.py:906 +#: apps/complaints/ui_views.py:4548 apps/complaints/ui_views.py:4744 +#: apps/complaints/ui_views.py:4751 templates/appreciation/leaderboard.html:148 +#: templates/complaints/government_ticket_list.html:145 +#: templates/complaints/inquiry_detail.html:202 +#: templates/observations/observation_detail.html:221 msgid "Received" msgstr "المستلمة" -#: apps/complaints/models.py:1359 apps/feedback/models.py:313 -#: templates/callcenter/inquiry_form.html:161 +#: apps/complaints/models.py:1686 apps/feedback/models.py:399 +#: templates/callcenter/inquiry_form.html:178 #: templates/callcenter/inquiry_list.html:145 #: templates/integrations/survey_mapping_settings.html:160 msgid "Appointment" msgstr "موعد" -#: apps/complaints/models.py:1360 apps/feedback/models.py:344 +#: apps/complaints/models.py:1687 apps/feedback/models.py:430 #: templates/callcenter/complaint_form.html:189 -#: templates/callcenter/inquiry_form.html:162 +#: templates/callcenter/inquiry_form.html:179 #: templates/callcenter/inquiry_list.html:146 -#: templates/complaints/inquiry_list.html:200 +#: templates/complaints/inquiry_list.html:156 #: templates/px_sources/source_user_complaint_list.html:143 #: templates/px_sources/source_user_inquiry_list.html:131 msgid "Billing" msgstr "الفوترة" -#: apps/complaints/models.py:1361 templates/callcenter/inquiry_form.html:163 +#: apps/complaints/models.py:1688 templates/callcenter/inquiry_form.html:180 #: templates/callcenter/inquiry_list.html:147 -#: templates/complaints/inquiry_list.html:201 -#: templates/complaints/public_inquiry_form.html:72 -#: templates/core/public_submit.html:677 +#: templates/complaints/inquiry_list.html:157 +#: templates/complaints/public_inquiry_form.html:119 +#: templates/core/public_submit.html:448 msgid "Medical Records" msgstr "السجلات الطبية" -#: apps/complaints/models.py:1362 templates/callcenter/inquiry_form.html:164 +#: apps/complaints/models.py:1689 templates/callcenter/inquiry_form.html:181 msgid "General Information" msgstr "معلومات عامة" -#: apps/complaints/models.py:1371 apps/core/models.py:137 -#: apps/core/models.py:144 templates/actions/action_create.html:31 -#: templates/actions/action_list.html:113 -#: templates/actions/action_list.html:155 -#: templates/callcenter/complaint_form.html:216 -#: templates/callcenter/complaint_form.html:230 -#: templates/callcenter/complaint_list.html:152 -#: templates/complaints/complaint_form.html:728 -#: templates/complaints/complaint_list.html:187 -#: templates/complaints/partials/priority_badge.html:16 -#: templates/complaints/partials/severity_badge.html:16 -#: templates/core/public_submit.html:494 -#: templates/dashboard/command_center.html:862 -#: templates/dashboard/my_dashboard.html:151 -#: templates/observations/observation_create.html:205 -#: templates/observations/observation_list.html:195 -#: templates/observations/public_new.html:106 -#: templates/px_sources/source_user_complaint_list.html:128 -#: templates/px_sources/source_user_complaint_list.html:235 -#: templates/px_sources/source_user_dashboard.html:211 -#: templates/rca/rca_list.html:185 templates/rca/rca_list.html:195 -msgid "Low" -msgstr "منخفض" +#: apps/complaints/models.py:1772 +msgid "Contacted - No Response" +msgstr "تم الاتصال - لا رد" -#: apps/complaints/models.py:1372 apps/core/models.py:138 -#: apps/core/models.py:145 templates/actions/action_create.html:32 -#: templates/actions/action_list.html:112 -#: templates/actions/action_list.html:153 -#: templates/callcenter/complaint_form.html:217 -#: templates/callcenter/complaint_form.html:231 -#: templates/callcenter/complaint_list.html:151 -#: templates/complaints/complaint_form.html:724 -#: templates/complaints/complaint_list.html:188 -#: templates/complaints/partials/priority_badge.html:12 -#: templates/complaints/partials/severity_badge.html:12 -#: templates/core/public_submit.html:495 -#: templates/dashboard/command_center.html:862 -#: templates/dashboard/my_dashboard.html:152 -#: templates/observations/observation_create.html:209 -#: templates/observations/observation_list.html:196 -#: templates/observations/public_new.html:110 -#: templates/px_sources/source_user_complaint_list.html:129 -#: templates/px_sources/source_user_complaint_list.html:231 -#: templates/px_sources/source_user_dashboard.html:207 -#: templates/rca/rca_list.html:186 templates/rca/rca_list.html:196 -msgid "Medium" -msgstr "متوسط" +#: apps/complaints/models.py:1932 apps/complaints/models.py:2383 +#: apps/complaints/models.py:2743 templates/complaints/complaint_pdf.html:623 +#: templates/complaints/inquiry_detail.html:281 +#: templates/complaints/partials/departments_panel.html:70 +#: templates/feedback/feedback_list.html:118 +#: templates/observations/observation_detail.html:302 +msgid "Pending Review" +msgstr "بانتظار المراجعة" -#: apps/complaints/models.py:1373 apps/core/models.py:139 -#: apps/core/models.py:146 templates/actions/action_create.html:33 -#: templates/actions/action_list.html:111 -#: templates/actions/action_list.html:151 -#: templates/callcenter/complaint_form.html:218 -#: templates/callcenter/complaint_form.html:232 -#: templates/callcenter/complaint_list.html:150 -#: templates/complaints/complaint_form.html:720 -#: templates/complaints/complaint_list.html:189 -#: templates/complaints/partials/priority_badge.html:8 -#: templates/complaints/partials/severity_badge.html:8 -#: templates/core/public_submit.html:496 -#: templates/dashboard/command_center.html:862 -#: templates/dashboard/my_dashboard.html:153 -#: templates/observations/observation_create.html:213 -#: templates/observations/observation_list.html:197 -#: templates/observations/public_new.html:114 -#: templates/px_sources/source_user_complaint_list.html:130 -#: templates/px_sources/source_user_complaint_list.html:227 -#: templates/px_sources/source_user_dashboard.html:203 -#: templates/rca/rca_list.html:187 templates/rca/rca_list.html:197 -msgid "High" -msgstr "مرتفع" +#: apps/complaints/models.py:1933 apps/complaints/models.py:2384 +#: apps/complaints/models.py:2744 templates/complaints/complaint_pdf.html:619 +#: templates/complaints/inquiry_detail.html:293 +#: templates/complaints/partials/explanation_panel.html:188 +#: templates/observations/observation_detail.html:314 +msgid "Acceptable" +msgstr "مقبول" -#: apps/complaints/models.py:1668 +#: apps/complaints/models.py:1934 apps/complaints/models.py:2385 +#: apps/complaints/models.py:2745 templates/complaints/complaint_pdf.html:621 +#: templates/complaints/inquiry_detail.html:278 +#: templates/complaints/inquiry_detail.html:300 +#: templates/complaints/partials/explanation_panel.html:191 +#: templates/observations/observation_detail.html:299 +#: templates/observations/observation_detail.html:321 +msgid "Not Acceptable" +msgstr "غير مقبول" + +#: apps/complaints/models.py:2242 msgid "Status Change" msgstr "تغيير الحالة" -#: apps/complaints/models.py:1669 -#: templates/observations/observation_create.html:275 -#: templates/observations/observation_detail.html:290 +#: apps/complaints/models.py:2243 +#: templates/complaints/government_ticket_form.html:215 +#: templates/observations/observation_detail.html:610 msgid "Assignment" msgstr "التعيين" -#: apps/complaints/models.py:1670 -#: templates/complaints/complaint_detail.html:612 -#: templates/complaints/inquiry_detail.html:436 -#: templates/observations/observation_detail.html:247 -#: templates/observations/observation_detail.html:371 +#: apps/complaints/models.py:2244 +#: templates/complaints/complaint_detail.html:912 +#: templates/complaints/complaint_detail.html:1144 +#: templates/observations/observation_detail.html:696 #: templates/rca/rca_detail.html:528 msgid "Note" msgstr "ملاحظة" -#: apps/complaints/models.py:1671 templates/complaints/inquiry_detail.html:364 -#: templates/complaints/inquiry_detail.html:434 +#: apps/complaints/models.py:2245 +#: templates/complaints/complaint_detail.html:202 +#: templates/complaints/explanation_form.html:8 +#: templates/complaints/inquiry_detail.html:354 +#: templates/complaints/partials/explanation_panel.html:50 +#: templates/complaints/public_inquiry_track.html:228 +#: templates/core/public_track.html:269 +#: templates/observations/public_track.html:213 +#: templates/surveys/instance_detail.html:137 msgid "Response" msgstr "الرد" -#: apps/complaints/models.py:1672 apps/feedback/models.py:44 -#: templates/callcenter/complaint_form.html:190 -#: templates/complaints/inquiry_detail.html:435 +#: apps/complaints/models.py:2246 apps/executive_summary/models.py:282 +#: apps/feedback/models.py:55 templates/callcenter/complaint_form.html:190 +#: templates/core/public_submit.html:483 +#: templates/layouts/source_user_base.html:197 +#: templates/observations/observation_detail.html:627 +#: templates/px_sources/source_user_suggestion_list.html:118 msgid "Communication" msgstr "التواصل" -#: apps/complaints/models.py:1755 +#: apps/complaints/models.py:2247 +#: templates/complaints/inquiry_department_response.html:4 +#: templates/complaints/inquiry_department_response.html:13 +#: templates/complaints/inquiry_response_form_token.html:15 +#: templates/complaints/partials/pdf_summary_panel.html:88 +#: templates/complaints/public_complaint_track.html:226 +#: templates/observations/observation_department_response.html:4 +#: templates/observations/observation_department_response.html:13 +#: templates/observations/response_form_token.html:15 +#: templates/organizations/department_inquiry_detail.html:120 +#: templates/organizations/department_observation_detail.html:123 +msgid "Department Response" +msgstr "رد القسم" + +#: apps/complaints/models.py:2248 +msgid "Sent to Department" +msgstr "تم الإرسال إلى القسم" + +#: apps/complaints/models.py:2249 apps/complaints/ui_views.py:242 +msgid "Transferred to Department" +msgstr "تم التحويل إلى القسم" + +#: apps/complaints/models.py:2332 apps/complaints/models.py:2497 msgid "Email Link" msgstr "رابط البريد الإلكتروني" -#: apps/complaints/models.py:1756 templates/complaints/complaint_pdf.html:613 +#: apps/complaints/models.py:2333 apps/complaints/models.py:2498 +#: templates/complaints/complaint_pdf.html:613 msgid "Direct Entry" msgstr "إدخال مباشر" -#: apps/complaints/models.py:1806 templates/complaints/complaint_pdf.html:623 -#: templates/feedback/feedback_list.html:202 -msgid "Pending Review" -msgstr "بانتظار المراجعة" - -#: apps/complaints/models.py:1807 templates/complaints/complaint_pdf.html:619 -#: templates/complaints/partials/explanation_panel.html:109 -msgid "Acceptable" -msgstr "مقبول" - -#: apps/complaints/models.py:1808 templates/complaints/complaint_pdf.html:621 -#: templates/complaints/partials/explanation_panel.html:112 -msgid "Not Acceptable" -msgstr "غير مقبول" - -#: apps/complaints/models.py:1894 -#: templates/complaints/complaint_detail.html:303 -#: templates/complaints/inquiry_detail.html:466 -#: templates/core/public_submit.html:545 -#: templates/feedback/feedback_form.html:209 -#: templates/observations/observation_detail.html:192 -#: templates/observations/public_new.html:201 -#: templates/organizations/hospital_list.html:164 -#: templates/organizations/patient_detail.html:249 -#: templates/organizations/staff_detail.html:142 -#: templates/organizations/staff_form.html:276 -#: templates/physicians/physician_detail.html:388 -#: templates/surveys/his_patient_survey_send.html:122 -#: templates/surveys/instance_detail.html:612 -msgid "Phone" -msgstr "رقم الهاتف" - -#: apps/complaints/models.py:1895 +#: apps/complaints/models.py:2583 msgid "In Person" msgstr "شخصياً" -#: apps/complaints/models.py:1957 +#: apps/complaints/models.py:2645 msgid "Management Intervention" msgstr "التدخل الإداري" -#: apps/complaints/models.py:1958 +#: apps/complaints/models.py:2646 msgid "PR Follow-up" msgstr "متابعة العلاقات العامة" -#: apps/complaints/models.py:1959 +#: apps/complaints/models.py:2647 msgid "Department Review" msgstr "مراجعة القسم" -#: apps/complaints/models.py:2001 +#: apps/complaints/models.py:2689 msgid "Primary Department" msgstr "القسم الرئيسي" -#: apps/complaints/models.py:2002 +#: apps/complaints/models.py:2690 msgid "Secondary/Supporting" msgstr "ثانوي/مساند" -#: apps/complaints/models.py:2003 +#: apps/complaints/models.py:2691 msgid "Coordination Only" msgstr "التنسيق فقط" -#: apps/complaints/models.py:2004 +#: apps/complaints/models.py:2692 msgid "Investigating" msgstr "جاري التحقيق" -#: apps/complaints/models.py:2094 +#: apps/complaints/models.py:2777 +#: templates/complaints/partials/explanation_panel.html:28 +#: templates/complaints/partials/explanation_panel.html:154 +#: templates/organizations/department_complaints.html:142 +msgid "Pending Manager Review" +msgstr "قيد مراجعة المدير" + +#: apps/complaints/models.py:2778 +msgid "Manager Approved" +msgstr "تمت الموافقة من قبل المدير" + +#: apps/complaints/models.py:2779 +msgid "Manager Rejected" +msgstr "تم الرفض من قبل المدير" + +#: apps/complaints/models.py:2846 msgid "Accused/Involved" msgstr "متهم/متورط" -#: apps/complaints/models.py:2095 +#: apps/complaints/models.py:2847 msgid "Witness" msgstr "شاهد" -#: apps/complaints/models.py:2096 +#: apps/complaints/models.py:2848 msgid "Responsible for Resolution" msgstr "مسؤول عن الحل" -#: apps/complaints/models.py:2097 +#: apps/complaints/models.py:2849 msgid "Investigator" msgstr "المحقق" -#: apps/complaints/models.py:2098 +#: apps/complaints/models.py:2850 msgid "Support Staff" msgstr "طاقم الدعم" -#: apps/complaints/models.py:2099 -msgid "PX Staff" -msgstr "موظف تجربة المرضى" - -#: apps/complaints/models.py:2360 +#: apps/complaints/models.py:3111 msgid "Refused Service" msgstr "رفض الخدمة" -#: apps/complaints/models.py:2361 +#: apps/complaints/models.py:3112 msgid "Delayed Treatment" msgstr "تأخير العلاج" -#: apps/complaints/models.py:2362 +#: apps/complaints/models.py:3113 msgid "Verbal Abuse / Hostility" msgstr "إساءة لفظية / عدائية" -#: apps/complaints/models.py:2363 +#: apps/complaints/models.py:3114 msgid "Increased Wait Time" msgstr "زيادة وقت الانتظار" -#: apps/complaints/models.py:2364 +#: apps/complaints/models.py:3115 msgid "Unnecessary Procedure" msgstr "إجراء غير ضروري" -#: apps/complaints/models.py:2365 +#: apps/complaints/models.py:3116 msgid "Dismissed from Care" msgstr "فصل من الرعاية" -#: apps/complaints/models.py:2366 +#: apps/complaints/models.py:3117 msgid "Poor Treatment Quality" msgstr "جودة العلاج رديئة" -#: apps/complaints/models.py:2367 +#: apps/complaints/models.py:3118 msgid "Discrimination" msgstr "التمييز" -#: apps/complaints/models.py:2368 +#: apps/complaints/models.py:3119 msgid "Retaliation" msgstr "الانتقام" -#: apps/complaints/models.py:2374 +#: apps/complaints/models.py:3125 msgid "Low - Minor inconvenience" msgstr "منخفض - إزعاج طفيف" -#: apps/complaints/models.py:2375 +#: apps/complaints/models.py:3126 msgid "Medium - Moderate impact" msgstr "متوسط - تأثير متوسط" -#: apps/complaints/models.py:2376 +#: apps/complaints/models.py:3127 msgid "High - Significant harm" msgstr "عالٍ - ضرر كبير" -#: apps/complaints/models.py:2377 +#: apps/complaints/models.py:3128 msgid "Critical - Severe harm / Life-threatening" msgstr "حرج - ضرر شديد / مهدد للحياة" -#: apps/complaints/models.py:2382 +#: apps/complaints/models.py:3133 msgid "Reported - Awaiting Review" msgstr "تم الإبلاغ - بانتظار المراجعة" -#: apps/complaints/models.py:2383 +#: apps/complaints/models.py:3134 msgid "Under Investigation" msgstr "قيد التحقيق" -#: apps/complaints/models.py:2384 +#: apps/complaints/models.py:3135 msgid "Verified" msgstr "تم التحقق" -#: apps/complaints/models.py:2385 +#: apps/complaints/models.py:3136 msgid "Unfounded" msgstr "غير مستند" -#: apps/complaints/models.py:2393 +#: apps/complaints/models.py:3144 msgid "The complaint this adverse action is related to" msgstr "الشـكوى التي تتعلق بهذا الإجراء السلبي" -#: apps/complaints/models.py:2398 +#: apps/complaints/models.py:3149 msgid "Type of adverse action" msgstr "نوع الإجراء السلبي" -#: apps/complaints/models.py:2405 +#: apps/complaints/models.py:3156 msgid "Severity level of the adverse action" msgstr "مستوى شدة الإجراء السلبي" -#: apps/complaints/models.py:2408 +#: apps/complaints/models.py:3159 msgid "Detailed description of what happened to the patient" msgstr "وصف مفصل لما حدث للمريض" -#: apps/complaints/models.py:2411 +#: apps/complaints/models.py:3162 msgid "Date and time when the adverse action occurred" msgstr "تاريخ ووقت حدوث الحادث الضائر" -#: apps/complaints/models.py:2415 +#: apps/complaints/models.py:3166 msgid "Location where the incident occurred (e.g., Emergency Room, Clinic B)" msgstr "الموقع الذي وقع فيه الحادث (مثلاً، غرفة الطوارئ، عيادة ب)" -#: apps/complaints/models.py:2423 +#: apps/complaints/models.py:3174 msgid "Staff members involved in the adverse action" msgstr "العاملون المتورطون في الإجراء السلبي" -#: apps/complaints/models.py:2428 +#: apps/complaints/models.py:3179 msgid "" "Description of the impact on the patient (physical, emotional, financial)" msgstr "وصف تأثير الإجراء على المريض (الجسدي، العاطفي، المالي)" -#: apps/complaints/models.py:2436 +#: apps/complaints/models.py:3187 msgid "Current status of the adverse action report" msgstr "الحالة الحالية لتقرير الإجراء السلبي" -#: apps/complaints/models.py:2445 +#: apps/complaints/models.py:3196 msgid "User who reported this adverse action" msgstr "المستخدم الذي أبلغ عن هذا الإجراء السلبي" -#: apps/complaints/models.py:2449 +#: apps/complaints/models.py:3200 msgid "Notes from the investigation" msgstr "ملاحظات التحقيق" -#: apps/complaints/models.py:2457 +#: apps/complaints/models.py:3208 msgid "User who investigated this adverse action" msgstr "المستخدم الذي تحققمن هذا الإجراء السلبي" -#: apps/complaints/models.py:2460 +#: apps/complaints/models.py:3211 msgid "When the investigation was completed" msgstr "متى تم الانتهاء من التحقيق" -#: apps/complaints/models.py:2463 +#: apps/complaints/models.py:3214 msgid "How the adverse action was resolved" msgstr "كيف تم حل هذا الإجراء السلبي" -#: apps/complaints/models.py:2471 +#: apps/complaints/models.py:3222 msgid "User who resolved this adverse action" msgstr "المستخدم الذي حل هذا الإجراء السلبي" -#: apps/complaints/models.py:2474 +#: apps/complaints/models.py:3225 msgid "When the adverse action was resolved" msgstr "متى تم حل هذا الإجراء السلبي" -#: apps/complaints/models.py:2478 +#: apps/complaints/models.py:3229 msgid "Whether this adverse action has been escalated to management" msgstr "هل تم رفع هذا الإجراء السلبي إلى الإدارة؟" -#: apps/complaints/models.py:2481 +#: apps/complaints/models.py:3232 msgid "When the adverse action was escalated" msgstr "متى تم رفع الإجراء السلبي" -#: apps/complaints/models.py:2485 +#: apps/complaints/models.py:3236 msgid "Complaint Adverse Action" msgstr "إجراء مضاد للشكاوى" -#: apps/complaints/models.py:2486 +#: apps/complaints/models.py:3237 msgid "Complaint Adverse Actions" msgstr "إجراءات مضادة للشكاوى" -#: apps/complaints/models.py:2525 +#: apps/complaints/models.py:3276 msgid "Attachment file (image, document, audio recording, etc.)" msgstr "ملف مرفق (صورة، مستند، تسجيل صوتي، إلخ)" -#: apps/complaints/models.py:2530 +#: apps/complaints/models.py:3281 msgid "File size in bytes" msgstr "حجم الملف بالبايت" -#: apps/complaints/models.py:2532 +#: apps/complaints/models.py:3283 msgid "Description of what this attachment shows" msgstr "وصف لما يظهره هذا المرفق" -#: apps/complaints/models.py:2540 +#: apps/complaints/models.py:3291 msgid "Adverse Action Attachment" msgstr "مرفق الإجراء المضاد" -#: apps/complaints/models.py:2541 +#: apps/complaints/models.py:3292 msgid "Adverse Action Attachments" msgstr "مرفقات الإجراء المضاد" -#: apps/complaints/models.py:2564 +#: apps/complaints/models.py:3315 msgid "Hospital this template belongs to" msgstr "المستشفى الذي ينتمي إليه هذا القالب" -#: apps/complaints/models.py:2567 +#: apps/complaints/models.py:3318 msgid "Template name (e.g., 'Long Wait Time', 'Rude Staff')" msgstr "اسم القالب(على سبيل المثال، 'وقت الانتظار الطويل'، 'موظف غير مهذب')" -#: apps/complaints/models.py:2568 +#: apps/complaints/models.py:3319 msgid "Default description template with placeholders" msgstr "قالب الوصف الافتراضي مع القيم الفارغة" -#: apps/complaints/models.py:2577 +#: apps/complaints/models.py:3328 msgid "Default category for this template" msgstr "الفئة الافتراضية لهذا القالب" -#: apps/complaints/models.py:2585 +#: apps/complaints/models.py:3336 msgid "Default severity level" msgstr "مستوى الشدة الافتراضي" -#: apps/complaints/models.py:2591 +#: apps/complaints/models.py:3342 msgid "Default priority level" msgstr "مستوى الأولوية الافتراضي" -#: apps/complaints/models.py:2601 +#: apps/complaints/models.py:3352 msgid "Auto-assign to this department when template is used" msgstr "تخصيص تلقائي لهذا القسم عند استخدام القالب" -#: apps/complaints/models.py:2606 +#: apps/complaints/models.py:3357 msgid "Number of times this template has been used" msgstr "عدد المرات التي تم فيها استخدام هذا القالب" -#: apps/complaints/models.py:2612 +#: apps/complaints/models.py:3363 msgid "List of placeholder names used in description" msgstr "قائمة أسماءالمتغيرات الوهمية المستخدمة في الوصف" -#: apps/complaints/models.py:2616 +#: apps/complaints/models.py:3367 msgid "Whether this template is available for selection" msgstr "هل هذا القالب متاح للاختيار" -#: apps/complaints/models.py:2621 +#: apps/complaints/models.py:3372 msgid "Complaint Template" msgstr "قالب الشكوى" -#: apps/complaints/models.py:2622 +#: apps/complaints/models.py:3373 #: templates/complaints/templates/template_list.html:4 #: templates/complaints/templates/template_list.html:156 msgid "Complaint Templates" msgstr "قالب الشكاوى" -#: apps/complaints/models.py:2661 +#: apps/complaints/models.py:3412 msgid "Phone Call" msgstr "مكالمة هاتفية" -#: apps/complaints/models.py:2664 +#: apps/complaints/models.py:3415 msgid "Meeting" msgstr "اجتماع" -#: apps/complaints/models.py:2665 +#: apps/complaints/models.py:3416 msgid "Letter" msgstr "رسالة" -#: apps/complaints/models.py:2678 +#: apps/complaints/models.py:3429 msgid "Related complaint" msgstr "شكوى ذات صلة" -#: apps/complaints/models.py:2683 +#: apps/complaints/models.py:3434 msgid "Type of communication" msgstr "نوع التواصل" -#: apps/complaints/models.py:2689 +#: apps/complaints/models.py:3440 #: templates/callcenter/call_records_list.html:99 #: templates/callcenter/call_records_list.html:163 #: templates/callcenter/call_records_list.html:247 msgid "Inbound" msgstr "الوارد" -#: apps/complaints/models.py:2690 +#: apps/complaints/models.py:3441 #: templates/callcenter/call_records_list.html:111 #: templates/callcenter/call_records_list.html:164 #: templates/callcenter/call_records_list.html:252 msgid "Outbound" msgstr "الخارجي" -#: apps/complaints/models.py:2696 +#: apps/complaints/models.py:3447 msgid "Name of person contacted" msgstr "اسم الشخص الذي تم التواصل معه" -#: apps/complaints/models.py:2698 +#: apps/complaints/models.py:3449 msgid "Role/relation (e.g., Complainant, Patient, Staff)" msgstr "الدور/العلاقة (مثلاً: المُشتكِي، المريض، الموظف)" -#: apps/complaints/models.py:2700 templates/callcenter/complaint_form.html:111 -#: templates/callcenter/inquiry_form.html:107 +#: apps/complaints/models.py:3451 templates/callcenter/complaint_form.html:111 +#: templates/callcenter/inquiry_form.html:122 +#: templates/organizations/department_form.html:138 +#: templates/px_sources/source_detail.html:637 +#: templates/px_sources/source_user_create_communication_request.html:37 #: templates/surveys/his_patient_import.html:139 msgid "Phone number" msgstr "رقم الهاتف" -#: apps/complaints/models.py:2701 templates/callcenter/inquiry_form.html:113 +#: apps/complaints/models.py:3452 templates/callcenter/inquiry_form.html:127 +#: templates/organizations/department_form.html:143 +#: templates/px_sources/source_detail.html:644 msgid "Email address" msgstr "عنوان البريد الإلكتروني" -#: apps/complaints/models.py:2704 +#: apps/complaints/models.py:3455 msgid "Subject/summary of communication" msgstr "موضوع/ملخص التواصل" -#: apps/complaints/models.py:2705 +#: apps/complaints/models.py:3456 msgid "Details of what was discussed" msgstr "تفاصيل ما تم مناقشته" -#: apps/complaints/models.py:2708 +#: apps/complaints/models.py:3459 msgid "Whether this communication requires follow-up" msgstr "هل يتطلب هذا التواصل متابعة" -#: apps/complaints/models.py:2709 +#: apps/complaints/models.py:3460 msgid "Date when follow-up is needed" msgstr "تاريخ المتابعة المطلوبة" -#: apps/complaints/models.py:2710 +#: apps/complaints/models.py:3461 msgid "Notes from follow-up" msgstr "ملاحظات من المتابعة" -#: apps/complaints/models.py:2717 +#: apps/complaints/models.py:3468 msgid "Attached document (email export, letter, etc.)" msgstr "الوثيقة المرفقة (تصدير البريد الإلكتروني، رسالة، إلخ)" -#: apps/complaints/models.py:2726 +#: apps/complaints/models.py:3477 msgid "User who logged this communication" msgstr "المستخدم الذي سجل هذه المراسلة" -#: apps/complaints/models.py:2731 +#: apps/complaints/models.py:3482 msgid "Complaint Communication" msgstr "الاتصال بشكاوى المرضى" -#: apps/complaints/models.py:2732 +#: apps/complaints/models.py:3483 msgid "Complaint Communications" msgstr "الاتصال بشكاوى المرضى" -#: apps/complaints/ui_views.py:1925 +#: apps/complaints/models.py:3558 +msgid "Government source (MOH, CCHI, etc.)" +msgstr "مصدر حكومي (وزارة الصحة، مجلس الضمان الصحي، إلخ)" + +#: apps/complaints/models.py:3563 +msgid "Ticket number from source system (e.g., B2022807)" +msgstr "رقم التذكرة من النظام المصدر (مثل: B2022807)" + +#: apps/complaints/models.py:3626 +msgid "Date/time the ticket was received from source" +msgstr "تاريخ/وقت استلام التذكرة من المصدر" + +#: apps/complaints/models.py:3653 +#: templates/complaints/government_ticket_detail.html:4 +#: templates/complaints/government_ticket_detail.html:86 +msgid "Government Ticket" +msgstr "تذكرة حكومية" + +#: apps/complaints/models.py:3654 +#: templates/complaints/government_ticket_list.html:4 +#: templates/layouts/partials/sidebar.html:527 +msgid "Government Tickets" +msgstr "تذاكر حكومية" + +#: apps/complaints/models.py:3661 +msgid "Short Text" +msgstr "نص قصير" + +#: apps/complaints/models.py:3662 +msgid "Long Text" +msgstr "نص طويل" + +#: apps/complaints/models.py:3663 +msgid "Yes / No" +msgstr "نعم / لا" + +#: apps/complaints/models.py:3664 +msgid "Rating (1-5)" +msgstr "التقييم (1-5)" + +#: apps/complaints/models.py:3665 +msgid "Multiple Choice" +msgstr "اختيار من متعدد" + +#: apps/complaints/models.py:3736 apps/executive_summary/models.py:296 +#: templates/complaints/partials/departments_panel.html:76 +#: templates/rca/rca_list.html:133 templates/rca/rca_list.html:163 +msgid "Approved" +msgstr "معتمد" + +#: apps/complaints/models.py:3737 apps/executive_summary/models.py:298 +#: templates/complaints/complaint_detail.html:576 +#: templates/complaints/partials/departments_panel.html:68 +#: templates/complaints/partials/departments_panel.html:74 +msgid "Rejected" +msgstr "مرفوض" + +#: apps/complaints/ui_views.py:106 apps/complaints/ui_views.py:228 +#: apps/observations/views.py:107 +#: templates/accounts/onboarding/checklist_list.html:109 +#: templates/actions/action_detail.html:189 +#: templates/ai_engine/sentiment_detail.html:171 +#: templates/callcenter/complaint_list.html:183 +#: templates/callcenter/inquiry_list.html:179 +#: templates/complaints/complaint_detail.html:165 +#: templates/complaints/complaint_detail.html:406 +#: templates/complaints/government_ticket_detail.html:194 +#: templates/complaints/inquiry_list.html:195 +#: templates/dashboard/partials/observations_table.html:28 +#: templates/feedback/feedback_delete_confirm.html:127 +#: templates/feedback/feedback_list.html:213 +#: templates/organizations/department_complaint_detail.html:141 +#: templates/organizations/department_complaints.html:76 +#: templates/organizations/department_detail.html:706 +#: templates/organizations/department_detail.html:773 +#: templates/organizations/department_detail.html:833 +#: templates/organizations/department_detail.html:899 +#: templates/organizations/department_detail.html:955 +#: templates/organizations/department_detail.html:1310 +#: templates/organizations/department_inquiries.html:73 +#: templates/organizations/department_inquiry_detail.html:111 +#: templates/organizations/department_observation_detail.html:87 +#: templates/organizations/department_observations.html:74 +#: templates/organizations/department_staff_detail.html:219 +#: templates/organizations/department_staff_detail.html:475 +#: templates/organizations/patient_detail.html:602 +#: templates/organizations/staff_detail.html:241 +#: templates/organizations/staff_detail.html:419 +#: templates/organizations/staff_detail.html:480 +#: templates/organizations/staff_import.html:235 +#: templates/physicians/doctor_rating_job_list.html:110 +#: templates/physicians/doctor_rating_job_status.html:176 +#: templates/presentations/presentation_detail.html:144 +#: templates/projects/template_detail.html:125 +#: templates/px_sources/communication_request_detail.html:282 +#: templates/px_sources/communication_request_list.html:114 +#: templates/px_sources/source_detail.html:180 +#: templates/px_sources/source_user_communication_request_list.html:83 +#: templates/px_sources/source_user_complaint_list.html:188 +#: templates/px_sources/source_user_inquiry_list.html:175 +#: templates/px_sources/source_user_observation_list.html:158 +#: templates/px_sources/source_user_suggestion_list.html:160 +#: templates/rca/rca_detail.html:156 templates/rca/rca_list.html:233 +#: templates/references/document_view.html:268 +#: templates/references/document_view.html:304 +#: templates/references/document_view.html:424 +#: templates/reports/report_detail.html:109 +#: templates/reports/report_detail.html:212 +#: templates/reports/saved_reports.html:101 +#: templates/surveys/analytics_report_info.html:35 +#: templates/surveys/analytics_report_info.html:83 +#: templates/surveys/analytics_report_markdown_view.html:107 +#: templates/surveys/analytics_report_view.html:35 +#: templates/surveys/analytics_reports.html:102 +#: templates/surveys/bulk_job_list.html:90 +msgid "Created" +msgstr "تاريخ الإنشاء" + +#: apps/complaints/ui_views.py:113 apps/complaints/ui_views.py:235 +#: apps/observations/views.py:116 +#: templates/appreciation/appreciation_list.html:103 +#: templates/appreciation/appreciation_list.html:170 +#: templates/complaints/complaint_detail.html:719 +#: templates/complaints/inquiry_detail.html:453 +#: templates/organizations/department_detail.html:495 +msgid "Activated" +msgstr "مفعّل" + +#: apps/complaints/ui_views.py:126 apps/observations/views.py:119 +msgid "Forwarded to Department" +msgstr "تم التحويل إلى القسم" + +#: apps/complaints/ui_views.py:140 +msgid "OVR Escalated" +msgstr "تم تصعيد OVR" + +#: apps/complaints/ui_views.py:153 apps/complaints/ui_views.py:259 +#: apps/observations/views.py:129 +msgid "Department Responded" +msgstr "تم الرد من القسم" + +#: apps/complaints/ui_views.py:250 +msgid "Contacted No Response" +msgstr "تم الاتصال دون رد" + +#: apps/complaints/ui_views.py:255 apps/observations/views.py:125 +msgid "Dept Response Escalated" +msgstr "تم تصعيد رد القسم" + +#: apps/complaints/ui_views.py:263 +#: templates/observations/observation_detail.html:388 +msgid "Response Sent" +msgstr "تم إرسال الرد" + +#: apps/complaints/ui_views.py:985 +#, fuzzy +#| msgid "This complaint has been reopened as" +msgid "This complaint has no department assigned." +msgstr "تم إعادة فتح هذه الشكوى كـ" + +#: apps/complaints/ui_views.py:992 +msgid "Only the department champion or manager can collect feedback." +msgstr "فقط بطل القسم أو المدير يمكنه جمع الملاحظات." + +#: apps/complaints/ui_views.py:998 +msgid "No staff profile available to collect feedback." +msgstr "لا يوجد ملف موظف متاح لجمع الملاحظات." + +#: apps/complaints/ui_views.py:1032 +msgid "You don't have permission to send this complaint." +msgstr "ليس لديك صلاحية إرسال هذه الشكوى" + +#: apps/complaints/ui_views.py:1039 +msgid "Activate this complaint before sending it to a department." +msgstr "قم بتفعيل هذه الشكوى قبل إرسالها إلى القسم" + +#: apps/complaints/ui_views.py:1275 +msgid "An error occurred while sending the complaint." +msgstr "حدث خطأ أثناء إرسال الشكوى." + +#: apps/complaints/ui_views.py:1328 +msgid "Satisfaction can only be set for resolved or closed complaints." +msgstr "يمكن تعيين مستوى الرضا فقط للشكاوى التي تم حلها أو إغلاقها." + +#: apps/complaints/ui_views.py:1332 +msgid "You don't have permission to update satisfaction." +msgstr "ليس لديك صلاحية تحديث تقييم الرضا." + +#: apps/complaints/ui_views.py:1338 +msgid "Invalid satisfaction value." +msgstr "قيمة تقييم الرضا غير صالحة." + +#: apps/complaints/ui_views.py:1351 +msgid "Satisfaction updated to: {}" +msgstr "تم تحديث تقييم الرضا إلى: {}" + +#: apps/complaints/ui_views.py:1353 +msgid "Satisfaction cleared." +msgstr "تم مسح تقييم الرضا." + +#: apps/complaints/ui_views.py:1365 +msgid "You don't have permission to update patient contact status." +msgstr "ليس لديك صلاحية لتحديث حالة الاتصال بالمريض." + +#: apps/complaints/ui_views.py:1371 +msgid "Invalid patient contact status." +msgstr "حالة الاتصال بالمريض غير صالحة." + +#: apps/complaints/ui_views.py:1393 +msgid "Patient contact status updated to: {}" +msgstr "تم تحديث حالة الاتصال بالمريض إلى: {}" + +#: apps/complaints/ui_views.py:1405 +msgid "You don't have permission to update this complaint." +msgstr "ليس لديك صلاحية لتحديث هذه الشكوى." + +#: apps/complaints/ui_views.py:1415 +msgid "OVR escalation request cancelled." +msgstr "تم إلغاء طلب تصعيد OVR." + +#: apps/complaints/ui_views.py:1421 +msgid "OVR escalation requested. Waiting for admin approval." +msgstr "تم طلب تصعيد OVR. بانتظار موافقة المسؤول." + +#: apps/complaints/ui_views.py:1495 +msgid "You don't have permission to approve OVR escalation." +msgstr "ليس لديك صلاحية للموافقة على تصعيد OVR." + +#: apps/complaints/ui_views.py:1499 apps/complaints/ui_views.py:1529 +#: apps/complaints/ui_views.py:1611 +msgid "This complaint does not have a pending OVR request." +msgstr "لا يوجد طلب OVR معلق لهذه الشكوى." + +# Escalation Rules +#: apps/complaints/ui_views.py:1513 +msgid "OVR escalation approved." +msgstr "تمت الموافقة على تصعيد OVR." + +#: apps/complaints/ui_views.py:1525 apps/complaints/ui_views.py:1607 +msgid "You don't have permission to reject OVR escalation." +msgstr "ليس لديك صلاحية رفض تصعيد OVR." + +#: apps/complaints/ui_views.py:1539 apps/complaints/ui_views.py:1621 +msgid "OVR escalation request rejected." +msgstr "تم رفض طلب تصعيد OVR." + +#: apps/complaints/ui_views.py:1802 +msgid "You don't have permission to update this complaint's location." +msgstr "ليس لديك صلاحية تحديث موقع هذه الشكوى." + +#: apps/complaints/ui_views.py:1836 +msgid "Location details updated." +msgstr "تم تحديث تفاصيل الموقع." + +#: apps/complaints/ui_views.py:1882 apps/complaints/ui_views.py:3573 +#: apps/observations/views.py:1364 +msgid "Please select a valid person to escalate to." +msgstr "يرجى اختيار شخص صالح للإحالة إليه." + +#: apps/complaints/ui_views.py:2713 +msgid "You don't have permission to perform this action." +msgstr "ليس لديك صلاحية تنفيذ هذا الإجراء." + +#: apps/complaints/ui_views.py:2720 +msgid "Please select a staff member." +msgstr "يرجى اختيار أحد أعضاء الطاقم." + +#: apps/complaints/ui_views.py:2772 +#, python-brace-format +msgid "Response request sent to {staff.first_name} {staff.last_name}" +msgstr "تم إرسال طلب الرد إلى {staff.first_name} {staff.last_name}" + +#: apps/complaints/ui_views.py:2911 +msgid "You don't have permission to edit this inquiry." +msgstr "ليس لديك صلاحية تعديل هذا الاستفسار." + +#: apps/complaints/ui_views.py:2915 +msgid "Closed inquiries cannot be edited." +msgstr "لا يمكن تعديل الاستفسارات المغلقة." + +#: apps/complaints/ui_views.py:2956 +msgid "Inquiry updated successfully." +msgstr "تم تحديث الاستفسار بنجاح." + +#: apps/complaints/ui_views.py:3382 apps/observations/views.py:1102 +msgid "Satisfaction updated." +msgstr "تم تحديث مستوى الرضا." + +#: apps/complaints/ui_views.py:3400 +msgid "You don't have permission to transfer inquiries to departments." +msgstr "ليس لديك صلاحية تحويل الاستفسارات إلى الإدارات." + +#: apps/complaints/ui_views.py:3405 apps/complaints/ui_views.py:3654 +msgid "Activate this inquiry before sending it to a department." +msgstr "قم بتفعيل هذا الاستفسار قبل إرساله إلى قسم." + +#: apps/complaints/ui_views.py:3421 apps/observations/views.py:1208 +msgid "" +"Cannot send to {department.get_localized_name()}. This department has no " +"champion or manager assigned." +msgstr "" +"لا يمكن الإرسال إلى {department.get_localized_name()}. لا يحتوي هذا القسم " +"على بطل أو مدير معين." + +#: apps/complaints/ui_views.py:3426 apps/observations/views.py:1213 +msgid "Please select a contact person." +msgstr "يرجى اختيار شخص للتواصل." + +#: apps/complaints/ui_views.py:3431 apps/observations/views.py:1218 +msgid "Selected person is not a role holder in this department." +msgstr "الشخص المحدد ليس له دور في هذا القسم." + +#: apps/complaints/ui_views.py:3530 +#, python-format +msgid "Inquiry transferred to %(dept)s department email." +msgstr "تم تحويل الاستفسار إلى البريد الإلكتروني لقسم %(dept)s." + +#: apps/complaints/ui_views.py:3532 +#, python-format +msgid "" +"Inquiry transferred to %(dept)s. Department respondents have been notified." +msgstr "تم تحويل الاستفسار إلى %(dept)s. تم إخطار المستجيبين في القسم." + +#: apps/complaints/ui_views.py:3551 +msgid "You don't have permission to escalate inquiries." +msgstr "ليس لديك صلاحية تصعيد الاستفسارات." + +#: apps/complaints/ui_views.py:3555 +msgid "Cannot escalate a closed or cancelled inquiry." +msgstr "لا يمكن تصعيد استفسار مغلق أو ملغي." + +#: apps/complaints/ui_views.py:3622 +msgid "Inquiry escalated to {escalate_to_staff.get_full_name()}." +msgstr "تم تصعيد الاستفسار إلى {escalate_to_staff.get_full_name()}." + +#: apps/complaints/ui_views.py:3647 +msgid "You don't have permission to send this inquiry." +msgstr "ليس لديك صلاحية لإرسال هذا الاستفسار." + +#: apps/complaints/ui_views.py:3807 +msgid "An error occurred while sending the inquiry." +msgstr "حدث خطأ أثناء إرسال الاستفسار." + +#: apps/complaints/ui_views.py:4178 +msgid "You don't have permission to update contact tracking." +msgstr "ليس لديك صلاحية لتحديث تتبع جهات الاتصال." + +#: apps/complaints/ui_views.py:4265 +msgid "Contact tracking updated." +msgstr "تم تحديث تتبع جهة الاتصال." + +#: apps/complaints/ui_views.py:4349 msgid "Complainant name is required" msgstr "اسم المشتكي مطلوب" -#: apps/complaints/ui_views.py:1927 +#: apps/complaints/ui_views.py:4351 msgid "Mobile number is required" msgstr "رقم الجوال مطلوب" -#: apps/complaints/ui_views.py:1929 apps/complaints/ui_views.py:2186 +#: apps/complaints/ui_views.py:4353 apps/complaints/ui_views.py:4606 msgid "Hospital is required" msgstr "المستشفى مطلوب" -#: apps/complaints/ui_views.py:1931 -msgid "Location is required" -msgstr "الموقع مطلوب" +#: apps/complaints/ui_views.py:4355 +msgid "Location type is required" +msgstr "نوع الموقع مطلوب" -#: apps/complaints/ui_views.py:1933 -msgid "Main section is required" -msgstr "القسم الرئيسي مطلوب" +#: apps/complaints/ui_views.py:4357 +msgid "Department is required" +msgstr "القسم مطلوب" -#: apps/complaints/ui_views.py:1935 +#: apps/complaints/ui_views.py:4359 msgid "Complaint details are required" msgstr "تفاصيل الشكوى مطلوبة" -#: apps/complaints/ui_views.py:1941 apps/complaints/ui_views.py:2196 +#: apps/complaints/ui_views.py:4367 +msgid "Invalid incident date format" +msgstr "تنسيق تاريخ الحادثة غير صالح" + +#: apps/complaints/ui_views.py:4373 apps/complaints/ui_views.py:4616 #: templates/accounts/onboarding/step_activation.html:136 msgid "Please fill in all required fields." msgstr "يرجى تعبئة جميع الحقول المطلوبة." -#: apps/complaints/ui_views.py:2028 apps/complaints/ui_views.py:2268 +#: apps/complaints/ui_views.py:4447 apps/complaints/ui_views.py:4686 msgid "Selected hospital not found." msgstr "المستشفى المحدد غير موجود." -#: apps/complaints/ui_views.py:2086 +#: apps/complaints/ui_views.py:4505 msgid "Please enter a reference number." msgstr "يرجى إدخال رقم مرجعي." -#: apps/complaints/ui_views.py:2100 apps/complaints/ui_views.py:2115 +#: apps/complaints/ui_views.py:4519 apps/complaints/ui_views.py:4534 msgid "" "No complaint found with this reference number. Please check and try again." msgstr "" "لم يتم العثور على شكوى بهذا الرقم المرجعي. يرجى التحقق والمحاولة مرة أخرى." -#: apps/complaints/ui_views.py:2182 +#: apps/complaints/ui_views.py:4602 msgid "Name is required" msgstr "الاسم مطلوب" -#: apps/complaints/ui_views.py:2184 +#: apps/complaints/ui_views.py:4604 msgid "Phone number is required" msgstr "رقم الهاتف مطلوب" -#: apps/complaints/ui_views.py:2188 +#: apps/complaints/ui_views.py:4608 msgid "Subject is required" msgstr "الموضوع مطلوب" -#: apps/complaints/ui_views.py:2190 +#: apps/complaints/ui_views.py:4610 msgid "Message is required" msgstr "الرسالة مطلوب" -#: apps/complaints/ui_views.py:2260 +#: apps/complaints/ui_views.py:4678 msgid "Inquiry submitted successfully!" msgstr "تم إرسال الاستفسار بنجاح!" -#: apps/complaints/ui_views.py:3084 apps/complaints/ui_views.py:3151 -#: apps/complaints/ui_views.py:3224 apps/complaints/ui_views.py:3281 -#: apps/complaints/ui_views.py:3367 apps/complaints/ui_views.py:3434 -#: apps/complaints/ui_views.py:3483 +#: apps/complaints/ui_views.py:4759 +msgid "" +"No inquiry found with this reference number. Please check and try again." +msgstr "" +"لم يتم العثور على استفسار بهذا الرقم المرجعي. يرجى التحقق والمحاولة مرة أخرى." + +#: apps/complaints/ui_views.py:5599 apps/complaints/ui_views.py:5666 +#: apps/complaints/ui_views.py:5746 apps/complaints/ui_views.py:5803 +#: apps/complaints/ui_views.py:6061 apps/complaints/ui_views.py:6135 +#: apps/complaints/ui_views.py:6184 msgid "You don't have permission to manage this complaint." msgstr "ليس لديك الصلاحية لإدارة هذه الشكوى." -#: apps/complaints/ui_views.py:3089 -#, fuzzy -#| msgid "No departments found" +#: apps/complaints/ui_views.py:5604 msgid "No AI department suggestion found." -msgstr "لا توجد أقسام" +msgstr "لم يتم العثور على اقتراح قسم من الذكاء الاصطناعي." -#: apps/complaints/ui_views.py:3094 -#, fuzzy -#| msgid "This department is already involved in this complaint." +#: apps/complaints/ui_views.py:5609 msgid "This department is already involved." -msgstr "هذا القسم مشارك بالفعل في هذه الشكوى." +msgstr "هذا القسم مشترك بالفعل." -#: apps/complaints/ui_views.py:3129 -#, fuzzy, python-format -#| msgid "Department '%(dept)s' added successfully as %(role)s." +#: apps/complaints/ui_views.py:5644 +#, python-format msgid "Department '%(dept)s' added as Primary (AI suggestion confirmed)." -msgstr "تمت إضافة القسم '%(dept)s' بنجاح كـ %(role)s." +msgstr "" +"تمت إضافة القسم '%(dept)s' كقسم أساسي (تم تأكيد اقتراح الذكاء الاصطناعي)." -#: apps/complaints/ui_views.py:3192 +#: apps/complaints/ui_views.py:5705 #, python-format msgid "Department '%(dept)s' added successfully as %(role)s." msgstr "تمت إضافة القسم '%(dept)s' بنجاح كـ %(role)s." -#: apps/complaints/ui_views.py:3197 apps/complaints/ui_views.py:3252 -#: apps/complaints/ui_views.py:3407 apps/complaints/ui_views.py:3454 +#: apps/complaints/ui_views.py:5719 apps/complaints/ui_views.py:5774 +#: apps/complaints/ui_views.py:6108 apps/complaints/ui_views.py:6155 +#: apps/px_sources/ui_views.py:1370 apps/px_sources/ui_views.py:1455 msgid "Please correct the errors below." msgstr "يرجى تصحيح الأخطاء أدناه." -#: apps/complaints/ui_views.py:3204 +#: apps/complaints/ui_views.py:5726 msgid "Add Involved Department" msgstr "إضافة القسم المعني" -#: apps/complaints/ui_views.py:3249 +#: apps/complaints/ui_views.py:5771 msgid "Department involvement updated successfully." msgstr "تم تحديث إشراك القسم بنجاح." -#: apps/complaints/ui_views.py:3260 +#: apps/complaints/ui_views.py:5782 msgid "Edit Involved Department" msgstr "تعديل القسم المعني" -#: apps/complaints/ui_views.py:3302 +#: apps/complaints/ui_views.py:5832 msgid "Department removed successfully." msgstr "تم إزالة القسم بنجاح." -#: apps/complaints/ui_views.py:3322 +#: apps/complaints/ui_views.py:5870 apps/complaints/ui_views.py:5872 msgid "You don't have permission to submit a response for this department." msgstr "ليس لديك إذن لإرسال استجابة لهذا القسم." -#: apps/complaints/ui_views.py:3341 -msgid "Department response submitted successfully." -msgstr "تم إرسال استجابة القسم بنجاح." - -#: apps/complaints/ui_views.py:3343 +#: apps/complaints/ui_views.py:5883 apps/complaints/ui_views.py:5885 msgid "Please provide a valid response." msgstr "يرجى تقديم استجابة صالحة." -#: apps/complaints/ui_views.py:3402 +#: apps/complaints/ui_views.py:5930 apps/complaints/ui_views.py:5934 +msgid "Department response submitted successfully." +msgstr "تم إرسال استجابة القسم بنجاح." + +#: apps/complaints/ui_views.py:5957 +msgid "You don't have permission to review department responses." +msgstr "ليس لديك صلاحية مراجعة ردود الأقسام." + +#: apps/complaints/ui_views.py:5961 +msgid "No department response to review." +msgstr "لا يوجد رد من القسم للمراجعة." + +#: apps/complaints/ui_views.py:5965 +msgid "This response has not been approved by the department manager yet." +msgstr "لم تتم الموافقة على هذا الرد من قبل مدير القسم بعد." + +#: apps/complaints/ui_views.py:5970 +msgid "Invalid acceptance status." +msgstr "حالة القبول غير صالحة." + +#: apps/complaints/ui_views.py:6038 +#, python-brace-format +msgid "Department response marked as {acceptance}." +msgstr "تم وضع علامة على رد القسم كـ {acceptance}." + +#: apps/complaints/ui_views.py:6094 #, python-format msgid "Staff member '%(staff)s' added successfully as %(role)s." msgstr "تمت إضافة الموظف '%(staff)s' بنجاح كـ %(role)s." -#: apps/complaints/ui_views.py:3414 +#: apps/complaints/ui_views.py:6115 msgid "Add Involved Staff" msgstr "إضافة الموظفين المشاركين" -#: apps/complaints/ui_views.py:3451 +#: apps/complaints/ui_views.py:6152 msgid "Staff involvement updated successfully." msgstr "تم تحديث مشاركة الموظفين بنجاح." -#: apps/complaints/ui_views.py:3462 +#: apps/complaints/ui_views.py:6163 msgid "Edit Involved Staff" msgstr "تعديل الموظفين المشاركين" -#: apps/complaints/ui_views.py:3504 +#: apps/complaints/ui_views.py:6213 msgid "Staff member removed successfully." msgstr "تم إزالة الموظف بنجاح." -#: apps/complaints/ui_views.py:3526 +#: apps/complaints/ui_views.py:6235 msgid "" "You don't have permission to submit an explanation for this staff member." msgstr "ليس لديك إذن لإرسال تفسير لهذا الموظف." -#: apps/complaints/ui_views.py:3545 +#: apps/complaints/ui_views.py:6254 msgid "Explanation submitted successfully." msgstr "تم إرسال التفسير بنجاح." -#: apps/complaints/ui_views.py:3547 +#: apps/complaints/ui_views.py:6256 msgid "Please provide a valid explanation." msgstr "يرجى تقديم تفسير صالح." -#: apps/complaints/ui_views.py:3570 +#: apps/complaints/ui_views.py:6279 msgid "You don't have permission to view adverse actions." msgstr "ليس لديك إذن لعرض الإجراءات السلبية." -#: apps/complaints/ui_views.py:3630 +#: apps/complaints/ui_views.py:6339 msgid "You don't have permission to add adverse actions to this complaint." msgstr "ليس لديك إذن لإضافة إجراءات سلبية إلى هذه الشكوى." -#: apps/complaints/ui_views.py:3645 +#: apps/complaints/ui_views.py:6354 msgid "Description is required." msgstr "الوصف مطلوب." -#: apps/complaints/ui_views.py:3695 +#: apps/complaints/ui_views.py:6404 msgid "Adverse action reported successfully." msgstr "تم الإبلاغ عن الإجراء السلبي بنجاح." -#: apps/complaints/ui_views.py:3725 +#: apps/complaints/ui_views.py:6434 msgid "You don't have permission to edit this adverse action." msgstr "ليس لديك إذن لتعديل هذا الإجراء السلبي." -#: apps/complaints/ui_views.py:3756 +#: apps/complaints/ui_views.py:6465 msgid "Adverse action updated successfully." msgstr "تم تحديث الإجراء السلبي بنجاح." -#: apps/complaints/ui_views.py:3788 +#: apps/complaints/ui_views.py:6497 msgid "You don't have permission to update this adverse action." msgstr "ليس لديك إذن لتحديث هذا الإجراء السلبي." -#: apps/complaints/ui_views.py:3841 +#: apps/complaints/ui_views.py:6550 msgid "Adverse action status updated successfully." msgstr "تم تحديث حالة الإجراء السلبي بنجاح." -#: apps/complaints/ui_views.py:3861 +#: apps/complaints/ui_views.py:6570 msgid "You don't have permission to escalate this adverse action." msgstr "ليس لديك إذن لتصعيد هذا الإجراء السلبي." -#: apps/complaints/ui_views.py:3886 +#: apps/complaints/ui_views.py:6595 msgid "Adverse action escalated successfully." msgstr "تم تصعيد الإجراء السلبي بنجاح." -#: apps/complaints/ui_views.py:3906 +#: apps/complaints/ui_views.py:6615 msgid "You don't have permission to delete adverse actions." msgstr "ليس لديك إذن لحذف الإجراءات السلبية." -#: apps/complaints/ui_views.py:3926 +#: apps/complaints/ui_views.py:6635 msgid "Adverse action deleted successfully." msgstr "تم حذف الإجراء السلبي بنجاح." -#: apps/complaints/ui_views_explanation.py:48 -msgid "You don't have permission to request explanations." -msgstr "ليس لديك إذن لطلب التفسيرات." +#: apps/complaints/ui_views.py:6786 +msgid "You don't have permission to view government tickets." +msgstr "ليس لديك صلاحية لعرض التذاكر الحكومية." -#: apps/complaints/ui_views_explanation.py:55 -msgid "" -"Cannot request explanation for complaint with status '{}'. Complaint must be" -" Open, In Progress, or Partially Resolved." -msgstr "" -"لا يمكن طلب شرح للشكوى ذات الحالة '{}'. يجب أن تكون الشكوى مفتوحة، أو قيد " -"التنفيذ، أو محلولة جزئيًا." +#: apps/complaints/ui_views.py:6848 +msgid "You don't have permission to view this ticket." +msgstr "ليس لديك صلاحية لعرض هذه التذكرة." -#: apps/complaints/ui_views_explanation.py:64 -#: templates/complaints/request_explanation_form.html:210 -msgid "No staff members are involved in this complaint." -msgstr "لا يوجد أي موظف مشارك في هذه الشكوى." +#: apps/complaints/ui_views.py:6862 +msgid "You don't have permission to create government tickets." +msgstr "ليس لديك صلاحية لإنشاء تذاكر حكومية." -#: apps/complaints/ui_views_explanation.py:101 -msgid "Please select at least one staff member." -msgstr "يرجى اختيار موظف واحد على الأقل." +#: apps/complaints/ui_views.py:6869 +msgid "Government ticket created successfully." +msgstr "تم إنشاء التذكرة الحكومية بنجاح." -#: apps/complaints/ui_views_explanation.py:133 -msgid "" -"No explanation requests were sent. {} staff member(s) do not have email " -"addresses. Please update staff records with email addresses before sending " -"explanation requests." -msgstr "" -"لم يتم إرسال أي طلبات شرح. {} موظف(ين) لا يحتوي(ون) على عناوين بريد " -"إلكتروني. يرجى تحديث سجلات الموظفين بعناوين البريد الإلكتروني قبل إرسال " -"طلبات الشرح." +#: apps/complaints/ui_views.py:6888 +msgid "You don't have permission to update this ticket." +msgstr "ليس لديك صلاحية تحديث هذه التذكرة." -#: apps/complaints/ui_views_explanation.py:138 -msgid "" -"No explanation requests were sent. Please check staff email configuration." -msgstr "" -"لم يتم إرسال أي طلبات توضيح. يرجى التحقق من تكوين البريد الإلكتروني " -"للموظفين." +#: apps/complaints/ui_views.py:6895 +msgid "Government ticket updated successfully." +msgstr "تم تحديث التذكرة الحكومية بنجاح." -#: apps/complaints/ui_views_explanation.py:144 -msgid "" -"Only manager notifications were sent ({}). Staff explanation requests could " -"not be sent due to missing email addresses." -msgstr "" -"تم إرسال إشعارات المدير فقط ({}). تعذر إرسال طلبات شرح الموظفين بسبب عدم " -"وجود عناوين بريد إلكتروني." +#: apps/complaints/ui_views.py:6915 +msgid "You don't have permission to convert this ticket." +msgstr "ليس لديك صلاحية تحويل هذه التذكرة." -#: apps/complaints/ui_views_explanation.py:150 -msgid "" -"Explanation requests sent successfully! Staff: {}, Managers notified: {}." -msgstr "تم إرسال طلبات التوضيح بنجاح! الموظفون: {}، المديرون تم إخطارهم: {}." +#: apps/complaints/ui_views.py:6919 +msgid "This ticket has already been converted to a complaint." +msgstr "تم تحويل هذه التذكرة إلى شكوى بالفعل." + +#: apps/complaints/ui_views.py:6948 +msgid "You don't have permission to import government tickets." +msgstr "ليس لديك صلاحية استيراد التذاكر الحكومية." + +#: apps/complaints/ui_views.py:6963 +msgid "Please select a file to import." +msgstr "يرجى تحديد ملف لاستيراده." + +#: apps/complaints/ui_views.py:7000 +msgid "Preview ready. Review the data below and confirm to import." +msgstr "المعاينة جاهزة. راجع البيانات أدناه وقم بالتأكيد للاستيراد." + +#: apps/complaints/ui_views.py:7010 +msgid "No data to import. Please upload a file first." +msgstr "لا توجد بيانات للاستيراد. يرجى تحميل ملف أولاً." + +#: apps/complaints/ui_views.py:7024 +msgid "MOH source not found in system. Please configure it first." +msgstr "لم يتم العثور على مصدر وزارة الصحة في النظام. يرجى تكوينه أولاً." + +#: apps/complaints/ui_views.py:7160 +msgid "You don't have permission to export government tickets." +msgstr "ليس لديك صلاحية تصدير التذاكر الحكومية." + +#: apps/complaints/ui_views.py:7227 +msgid "You don't have permission to delete complaints." +msgstr "ليس لديك صلاحية حذف الشكاوى." + +#: apps/complaints/ui_views.py:7229 +msgid "Complaint moved to trash." +msgstr "تم نقل الشكوى إلى سلة المهملات." + +#: apps/complaints/ui_views.py:7241 +msgid "You don't have permission to restore complaints." +msgstr "ليس لديك صلاحية لاستعادة الشكاوى." + +#: apps/complaints/ui_views.py:7243 +msgid "Complaint restored successfully." +msgstr "تم استعادة الشكوى بنجاح." + +#: apps/complaints/ui_views.py:7255 +msgid "You don't have permission to restore inquiries." +msgstr "ليس لديك صلاحية لاستعادة الاستفسارات." + +#: apps/complaints/ui_views.py:7257 +msgid "Inquiry restored successfully." +msgstr "تم استعادة الاستفسار بنجاح." + +#: apps/complaints/ui_views.py:7267 +msgid "You don't have permission to view trash." +msgstr "ليس لديك صلاحية لعرض المهملات." #: apps/complaints/ui_views_oncall.py:49 msgid "On-Call Admin Schedules" @@ -2648,8 +3976,8 @@ msgstr "لوحة تحكم المناوب" msgid "You don't have permission to manage templates." msgstr "ليس لديك الصلاحية لإدارة القوالب." -#: apps/complaints/ui_views_templates.py:64 apps/projects/ui_views.py:305 -#: apps/projects/ui_views.py:574 +#: apps/complaints/ui_views_templates.py:64 apps/projects/ui_views.py:602 +#: apps/projects/ui_views.py:908 msgid "You don't have permission to create templates." msgstr "ليس لديك الصلاحية لإنشاء القوالب." @@ -2681,44 +4009,65 @@ msgstr "ليس لديك إذن لحذف القوالب." msgid "Template '{}' deleted successfully!" msgstr "تم حذف القالب '{}' بنجاح!" -#: apps/complaints/views.py:3471 -#, fuzzy -#| msgid "PX360 Complaint Management System" -msgid "PX360 Complaint Management" -msgstr "نظام PX360 لإدارة الشكاوى" +#: apps/complaints/views.py:4216 +msgid "Please check the acknowledgment box before submitting." +msgstr "يرجى تحديد مربع الإقرار قبل الإرسال." -#: apps/complaints/views.py:3472 templates/ai_engine/sentiment_list.html:299 +#: apps/complaints/views.py:4409 apps/complaints/views.py:4477 +msgid "Please check the acknowledgment box." +msgstr "يرجى تحديد مربع الإقرار." + +#: apps/complaints/views.py:4414 +msgid "Please describe the required improvement project." +msgstr "يرجى شرح مشروع التحسين المطلوب." + +#: apps/complaints/views.py:4654 +msgid "PX360 Complaint Management" +msgstr "إدارة الشكاوى PX360" + +#: apps/complaints/views.py:4655 +#: apps/executive_summary/templates/executive/insights.html:176 +#: templates/accounts/staff_activity_log.html:190 +#: templates/ai_engine/sentiment_list.html:299 #: templates/callcenter/complaint_list.html:254 #: templates/callcenter/inquiry_list.html:246 -#: templates/surveys/comment_list.html:361 +#: templates/surveys/comment_list.html:388 #: templates/surveys/template_list.html:146 msgid "Page" msgstr "الصفحة" -#: apps/complaints/views.py:3473 +#: apps/complaints/views.py:4656 #: templates/accounts/onboarding/step_checklist.html:29 #: templates/accounts/onboarding/step_checklist.html:232 #: templates/accounts/onboarding/step_content.html:34 +#: templates/accounts/staff_activity_log.html:190 #: templates/ai_engine/sentiment_list.html:299 -#: templates/analytics/kpi_report_list.html:148 -#: templates/analytics/kpi_report_list.html:281 +#: templates/appreciation/appreciation_list.html:267 +#: templates/appreciation/leaderboard.html:210 #: templates/callcenter/call_records_list.html:298 #: templates/callcenter/complaint_list.html:254 #: templates/callcenter/inquiry_list.html:246 -#: templates/complaints/complaint_list.html:174 -#: templates/complaints/complaint_list.html:317 -#: templates/config/hospital_users.html:224 -#: templates/config/hospital_users.html:313 +#: templates/complaints/complaint_list.html:177 +#: templates/complaints/government_ticket_list.html:216 +#: templates/complaints/inquiry_list.html:182 +#: templates/config/hospital_users.html:228 +#: templates/config/hospital_users.html:335 #: templates/dashboard/partials/actions_table.html:88 #: templates/dashboard/partials/complaints_table.html:84 #: templates/dashboard/partials/feedback_table.html:80 #: templates/dashboard/partials/inquiries_table.html:82 #: templates/dashboard/partials/observations_table.html:74 #: templates/dashboard/partials/tasks_table.html:82 -#: templates/observations/observation_list.html:284 -#: templates/organizations/patient_list.html:370 -#: templates/organizations/staff_list.html:253 -#: templates/organizations/staff_list.html:379 +#: templates/feedback/comment_list.html:202 +#: templates/feedback/feedback_list.html:149 +#: templates/feedback/feedback_list.html:302 +#: templates/observations/observation_list.html:286 +#: templates/organizations/patient_list.html:382 +#: templates/organizations/staff_hierarchy.html:223 +#: templates/organizations/staff_hierarchy.html:339 +#: templates/organizations/staff_list.html:258 +#: templates/organizations/staff_list.html:384 +#: templates/partials/pagination.html:6 #: templates/physicians/doctor_rating_review.html:166 #: templates/physicians/doctor_rating_review.html:267 #: templates/physicians/individual_ratings_list.html:312 @@ -2726,8 +4075,8 @@ msgstr "الصفحة" #: templates/physicians/ratings_list.html:312 #: templates/projects/project_list.html:157 #: templates/projects/project_list.html:271 templates/rca/rca_list.html:219 -#: templates/rca/rca_list.html:304 templates/surveys/comment_list.html:345 -#: templates/surveys/comment_list.html:361 +#: templates/rca/rca_list.html:304 templates/surveys/comment_list.html:372 +#: templates/surveys/comment_list.html:388 #: templates/surveys/his_patient_review.html:149 #: templates/surveys/instance_list.html:125 #: templates/surveys/instance_list.html:225 @@ -2735,138 +4084,94 @@ msgstr "الصفحة" msgid "of" msgstr "من" -#: apps/complaints/views.py:3474 +#: apps/complaints/views.py:4657 +#: apps/executive_summary/templates/executive/dashboard.html:406 +#: apps/executive_summary/templates/executive/pdf_report.html:116 #: templates/analytics/kpi_report_detail.html:546 +#: templates/analytics/kpi_report_weasyprint.html:351 +#: templates/analytics/kpi_report_weasyprint.html:613 #: templates/surveys/enhanced_reports_list.html:128 msgid "Generated" msgstr "تم الإنشاء" -#: apps/core/config_views.py:243 +#: apps/core/config_views.py:209 +msgid "You don't have permission to create users." +msgstr "ليس لديك صلاحية لإنشاء مستخدمين." + +#: apps/core/config_views.py:224 +msgid "User '{}' created and linked to staff '{}'." +msgstr "تم إنشاء المستخدم '{}' وربطه بالموظف '{}'." + +#: apps/core/config_views.py:228 apps/core/config_views.py:230 +msgid "User '{}' created successfully." +msgstr "تم إنشاء المستخدم '{}' بنجاح." + +#: apps/core/config_views.py:250 apps/core/config_views.py:263 +msgid "Your PX360 Account Has Been Created" +msgstr "تم إنشاء حساب PX360 الخاص بك" + +#: apps/core/config_views.py:274 +msgid "Credentials sent to {}." +msgstr "تم إرسال بيانات الاعتماد إلى {}." + +#: apps/core/config_views.py:276 +msgid "Password setup link sent to {}." +msgstr "تم إرسال رابط إعداد كلمة المرور إلى {}." + +#: apps/core/config_views.py:278 +msgid "User created but email sending failed: {}" +msgstr "تم إنشاء المستخدم ولكن فشل إرسال البريد الإلكتروني: {}" + +#: apps/core/config_views.py:298 +msgid "You can only edit users in your hospital." +msgstr "يمكنك فقط تعديل المستخدمين في مستشفاك." + +#: apps/core/config_views.py:304 +msgid "User '{}' updated successfully." +msgstr "تم تحديث المستخدم '{}' بنجاح." + +#: apps/core/config_views.py:352 msgid "Your PX360 Password Has Been Reset" msgstr "تم إعادة تعيين كلمة مرور PX360 الخاصة بك" +#: apps/core/config_views.py:422 +msgid "You don't have permission to view deleted items." +msgstr "ليس لديك صلاحية لعرض العناصر المحذوفة." + #: apps/core/decorators.py:34 apps/px_sources/decorators.py:168 msgid "Access denied. PX Admin privileges required." msgstr "تم رفض الوصول. مطلوب صلاحيات مسؤول PX." -#: apps/core/decorators.py:58 +#: apps/core/decorators.py:56 msgid "Access denied. Hospital Admin privileges required." msgstr "تم رفض الوصول. مطلوب صلاحيات مسؤول المستشفى." -#: apps/core/decorators.py:84 +#: apps/core/decorators.py:78 msgid "Access denied. Admin privileges required." msgstr "تم رفض الوصول. يلزم وجود صلاحيات المدير." -#: apps/core/decorators.py:114 -msgid "Access denied. PX Staff privileges required." -msgstr "تم رفض الوصول. يلزم وجود صلاحيات موظف تجربة المرضى." +#: apps/core/decorators.py:105 +msgid "Access denied. PX Management privileges required." +msgstr "تم رفض الوصول. صلاحيات إدارة PX مطلوبة." -#: apps/core/decorators.py:140 +#: apps/core/decorators.py:129 msgid "Access denied. This page is not available for source users." msgstr "تم رفض الوصول. هذه الصفحة غير متاحة للمستخدمين المصدر." -#: apps/core/decorators.py:163 apps/px_sources/decorators.py:34 +#: apps/core/decorators.py:151 apps/px_sources/decorators.py:34 msgid "Access denied. Source user privileges required." msgstr "تم رفض الوصول. يلزم وجود صلاحيات المستخدم المصدر." -#: apps/core/decorators.py:171 apps/px_sources/decorators.py:46 +#: apps/core/decorators.py:156 apps/px_sources/decorators.py:46 msgid "" "Your source user account is inactive. Please contact your administrator." msgstr "حساب المستخدم المصدر الخاص بك غير نشط. يرجى التواصل مع المسؤول." -#: apps/core/decorators.py:234 apps/px_sources/decorators.py:116 +#: apps/core/decorators.py:218 apps/px_sources/decorators.py:116 msgid "Access denied." msgstr "تم رفض الوصول." -#: apps/core/models.py:129 -#: templates/accounts/acknowledgements/category_form.html:195 -#: templates/accounts/acknowledgements/category_list.html:127 -#: templates/accounts/acknowledgements/checklist_form.html:210 -#: templates/accounts/acknowledgements/checklist_list.html:98 -#: templates/accounts/acknowledgements/checklist_list.html:172 -#: templates/accounts/onboarding/category_list.html:82 -#: templates/accounts/onboarding/category_list.html:248 -#: templates/accounts/onboarding/checklist_list.html:162 -#: templates/accounts/onboarding/checklist_list.html:461 -#: templates/accounts/onboarding/content_list.html:99 -#: templates/accounts/onboarding/content_list.html:305 -#: templates/accounts/onboarding/provisional_list.html:193 -#: templates/accounts/simple_acknowledgements/admin_create.html:83 -#: templates/accounts/simple_acknowledgements/admin_form.html:168 -#: templates/accounts/simple_acknowledgements/admin_list.html:98 -#: templates/accounts/simple_acknowledgements/admin_list.html:136 -#: templates/appreciation/badge_form.html:226 -#: templates/appreciation/badge_list.html:127 -#: templates/appreciation/category_form.html:209 -#: templates/complaints/complaint_threshold_form.html:351 -#: templates/complaints/complaint_threshold_list.html:220 -#: templates/complaints/complaint_threshold_list.html:293 -#: templates/complaints/escalation_rule_form.html:380 -#: templates/complaints/escalation_rule_list.html:254 -#: templates/complaints/escalation_rule_list.html:341 -#: templates/complaints/oncall/schedule_detail.html:147 -#: templates/complaints/oncall/schedule_list.html:208 -#: templates/complaints/sla_management_form.html:344 -#: templates/complaints/templates/template_list.html:181 -#: templates/complaints/templates/template_list.html:212 -#: templates/config/hospital_users.html:144 -#: templates/config/hospital_users.html:198 -#: templates/config/hospital_users.html:280 -#: templates/config/routing_rules.html:95 templates/config/sla_config.html:76 -#: templates/integrations/survey_mapping_settings.html:51 -#: templates/integrations/survey_mapping_settings.html:183 -#: templates/journeys/instance_list.html:123 -#: templates/journeys/instance_list.html:185 -#: templates/journeys/template_detail.html:42 -#: templates/journeys/template_detail.html:74 -#: templates/journeys/template_detail.html:141 -#: templates/journeys/template_form.html:209 -#: templates/journeys/template_list.html:95 -#: templates/observations/category_form.html:83 -#: templates/observations/category_list.html:123 -#: templates/organizations/department_list.html:129 -#: templates/organizations/hierarchy_node.html:61 -#: templates/organizations/hospital_list.html:129 -#: templates/organizations/patient_detail.html:363 -#: templates/organizations/patient_list.html:166 -#: templates/organizations/patient_list.html:215 -#: templates/organizations/patient_visit_journey.html:102 -#: templates/organizations/section_confirm_delete.html:36 -#: templates/organizations/section_form.html:117 -#: templates/organizations/section_list.html:92 -#: templates/organizations/section_list.html:153 -#: templates/organizations/staff_detail.html:21 -#: templates/organizations/staff_detail.html:215 -#: templates/organizations/staff_detail.html:279 -#: templates/organizations/staff_list.html:152 -#: templates/organizations/staff_list.html:199 -#: templates/organizations/staff_list.html:328 -#: templates/organizations/subsection_confirm_delete.html:36 -#: templates/organizations/subsection_form.html:117 -#: templates/organizations/subsection_list.html:92 -#: templates/organizations/subsection_list.html:153 -#: templates/physicians/physician_detail.html:338 -#: templates/physicians/physician_list.html:161 -#: templates/projects/project_list.html:106 -#: templates/projects/project_list.html:145 -#: templates/projects/template_list.html:90 -#: templates/px_sources/source_confirm_delete.html:78 -#: templates/px_sources/source_detail.html:102 -#: templates/px_sources/source_form.html:266 -#: templates/px_sources/source_list.html:174 -#: templates/px_sources/source_list.html:251 -#: templates/px_sources/source_user_confirm_delete.html:81 -#: templates/px_sources/source_user_form.html:301 -#: templates/references/folder_form.html:257 -#: templates/standards/category_list.html:159 -#: templates/standards/source_list.html:165 -#: templates/surveys/template_detail.html:65 -#: templates/surveys/template_detail.html:228 -#: templates/surveys/template_list.html:118 -msgid "Active" -msgstr "نشط" - -#: apps/core/models.py:130 +#: apps/core/models.py:142 #: templates/accounts/acknowledgements/category_list.html:127 #: templates/accounts/acknowledgements/checklist_list.html:99 #: templates/accounts/acknowledgements/checklist_list.html:172 @@ -2885,22 +4190,39 @@ msgstr "نشط" #: templates/complaints/templates/template_list.html:217 #: templates/config/hospital_users.html:157 #: templates/config/hospital_users.html:199 -#: templates/config/hospital_users.html:282 +#: templates/config/hospital_users.html:287 #: templates/config/routing_rules.html:97 templates/config/sla_config.html:78 +#: templates/dashboard/admin_evaluation.html:292 +#: templates/dashboard/employee_evaluation.html:746 +#: templates/dashboard/employee_evaluation_charts.html:212 #: templates/integrations/survey_mapping_settings.html:53 #: templates/journeys/template_detail.html:76 #: templates/journeys/template_list.html:97 #: templates/observations/category_list.html:125 +#: templates/organizations/department_confirm_delete.html:36 +#: templates/organizations/department_detail.html:676 +#: templates/organizations/department_form.html:155 #: templates/organizations/hierarchy_node.html:66 -#: templates/organizations/patient_list.html:216 +#: templates/organizations/manager_review_questions.html:48 +#: templates/organizations/orgsection_confirm_delete.html:36 +#: templates/organizations/orgsection_detail.html:164 +#: templates/organizations/orgsection_form.html:139 +#: templates/organizations/orgsection_list.html:93 +#: templates/organizations/orgsection_list.html:159 +#: templates/organizations/orgsubsection_confirm_delete.html:36 +#: templates/organizations/orgsubsection_form.html:137 +#: templates/organizations/orgsubsection_list.html:93 +#: templates/organizations/orgsubsection_list.html:155 +#: templates/organizations/patient_list.html:236 #: templates/organizations/section_confirm_delete.html:36 #: templates/organizations/section_form.html:118 #: templates/organizations/section_list.html:93 #: templates/organizations/section_list.html:155 #: templates/organizations/staff_detail.html:23 -#: templates/organizations/staff_detail.html:281 -#: templates/organizations/staff_list.html:200 -#: templates/organizations/staff_list.html:330 +#: templates/organizations/staff_detail.html:475 +#: templates/organizations/staff_hierarchy.html:302 +#: templates/organizations/staff_list.html:205 +#: templates/organizations/staff_list.html:335 #: templates/organizations/subsection_confirm_delete.html:36 #: templates/organizations/subsection_form.html:118 #: templates/organizations/subsection_list.html:93 @@ -2913,125 +4235,1483 @@ msgstr "نشط" #: templates/px_sources/source_list.html:177 #: templates/px_sources/source_list.html:256 #: templates/px_sources/source_user_confirm_delete.html:86 +#: templates/social/dashboard.html:106 +#: templates/standards/activity_type_list.html:152 #: templates/standards/category_list.html:163 #: templates/standards/source_list.html:169 #: templates/surveys/template_detail.html:67 -#: templates/surveys/template_detail.html:230 +#: templates/surveys/template_detail.html:253 #: templates/surveys/template_list.html:120 msgid "Inactive" msgstr "غير نشط" -#: apps/core/models.py:140 apps/core/models.py:147 -#: templates/analytics/kpi_report_pdf.html:689 -#: templates/callcenter/complaint_form.html:219 -#: templates/callcenter/complaint_list.html:149 -#: templates/complaints/complaint_form.html:716 -#: templates/complaints/complaint_list.html:190 -#: templates/complaints/partials/severity_badge.html:4 -#: templates/core/public_submit.html:497 -#: templates/dashboard/command_center.html:862 -#: templates/dashboard/my_dashboard.html:154 -#: templates/dashboard/staff_performance_detail.html:200 -#: templates/observations/observation_create.html:217 -#: templates/observations/observation_list.html:198 -#: templates/observations/public_new.html:118 templates/rca/rca_list.html:188 -#: templates/rca/rca_list.html:198 -msgid "Critical" -msgstr "حرج" +#: apps/core/views.py:408 +msgid "A reference number is required." +msgstr "رقم المرجع مطلوب." -#: apps/dashboard/views.py:120 +#: apps/core/views.py:421 +msgid "This reference type is not publicly trackable." +msgstr "نوع المرجع هذا غير قابل للتتبع علنًا." + +#: apps/core/views.py:425 +msgid "Unrecognized reference format." +msgstr "تنسيق مرجع غير معروف." + +#: apps/core/views.py:434 +msgid "Invalid tracking type." +msgstr "نوع تتبع غير صالح." + +#: apps/core/views.py:742 +msgid "Note cannot be empty." +msgstr "لا يمكن أن تكون الملاحظة فارغة." + +#: apps/core/views.py:749 +msgid "Invalid object reference." +msgstr "مرجع كائن غير صالح." + +#: apps/core/views.py:759 +msgid "Note added successfully." +msgstr "تمت إضافة الملاحظة بنجاح." + +#: apps/dashboard/views.py:168 apps/executive_summary/models.py:27 msgid "Critical Complaints" msgstr "الشكاوى الحرجة" -#: apps/dashboard/views.py:135 templates/analytics/command_center.html:196 -#: templates/analytics/command_center.html:351 +#: apps/dashboard/views.py:183 apps/executive_summary/models.py:28 msgid "Overdue Complaints" msgstr "الشكاوى المتأخرة" -#: apps/dashboard/views.py:150 +#: apps/dashboard/views.py:198 msgid "Escalated Actions" msgstr "الإجراءات المتصاعدة" -#: apps/dashboard/views.py:165 +#: apps/dashboard/views.py:213 msgid "Negative Surveys (24h)" msgstr "الاستبيانات السلبية (24 ساعة)" -#: apps/feedback/models.py:22 -msgid "Compliment" -msgstr "مديح" +#: apps/dashboard/views.py:2867 +msgid "No staff profile found for your account." +msgstr "لم يتم العثور على ملف تعريف موظف لحسابك." -#: apps/feedback/models.py:23 -msgid "Suggestion" -msgstr "اقتراح" +#: apps/executive_summary/models.py:26 templates/analytics/dashboard.html:265 +#: templates/callcenter/complaint_list.html:84 +#: templates/complaints/analytics.html:156 +#: templates/dashboard/admin_evaluation.html:355 +#: templates/dashboard/complaint_monthly_report.html:75 +#: templates/dashboard/complaint_quarterly_report.html:87 +#: templates/dashboard/employee_evaluation.html:774 +#: templates/dashboard/employee_evaluation.html:817 +#: templates/dashboard/employee_evaluation.html:831 +#: templates/dashboard/employee_evaluation.html:1462 +#: templates/dashboard/employee_evaluation_charts.html:305 +#: templates/dashboard/my_performance.html:130 +#: templates/dashboard/staff_performance_detail.html:127 +#: templates/px_sources/source_detail.html:524 +#: templates/px_sources/source_user_dashboard.html:54 +msgid "Total Complaints" +msgstr "إجمالي الشكاوى" -#: apps/feedback/models.py:24 -msgid "General Feedback" -msgstr "ملاحظات عامة" +#: apps/executive_summary/models.py:29 +msgid "Avg Resolution Time (hours)" +msgstr "متوسط وقت الحل (ساعات)" -#: apps/feedback/models.py:25 templates/complaints/inquiry_detail.html:4 -#: templates/complaints/inquiry_detail.html:228 -#: templates/core/public_submit.html:329 -msgid "Inquiry" -msgstr "استفسار" +#: apps/executive_summary/models.py:30 templates/physicians/leaderboard.html:90 +#: templates/physicians/physician_ratings_dashboard.html:331 +msgid "Total Surveys" +msgstr "إجمالي الاستبيانات" -#: apps/feedback/models.py:26 -msgid "Satisfaction Check" -msgstr "فحص الرضا" +#: apps/executive_summary/models.py:31 +msgid "Satisfaction Rate %" +msgstr "معدل الرضا %" -#: apps/feedback/models.py:32 -#: templates/complaints/partials/explanation_panel.html:62 -#: templates/complaints/public_complaint_track.html:187 -#: templates/observations/observation_detail.html:144 -#: templates/observations/public_success.html:156 -#: templates/observations/public_track.html:191 -#: templates/surveys/instance_detail.html:382 -msgid "Submitted" -msgstr "تم الإرسال" +#: apps/executive_summary/models.py:32 templates/analytics/dashboard.html:343 +msgid "NPS Score" +msgstr "درجة NPS" -#: apps/feedback/models.py:33 -msgid "Reviewed" -msgstr "تم المراجعة" +#: apps/executive_summary/models.py:33 +msgid "Response Rate %" +msgstr "معدل الاستجابة %" -#: apps/feedback/models.py:34 +#: apps/executive_summary/models.py:34 templates/analytics/dashboard.html:299 +msgid "Total Actions" +msgstr "إجمالي الإجراءات" + +#: apps/executive_summary/models.py:35 +#: templates/organizations/department_detail.html:1022 +msgid "Open Actions" +msgstr "الإجراءات المفتوحة" + +#: apps/executive_summary/models.py:36 +#: templates/reports/report_templates.html:120 +msgid "Overdue Actions" +msgstr "الإجراءات المتأخرة" + +#: apps/executive_summary/models.py:37 +msgid "Closed Actions" +msgstr "الإجراءات المغلقة" + +#: apps/executive_summary/models.py:38 +#: templates/dashboard/observation_report.html:64 +msgid "Total Observations" +msgstr "إجمالي الملاحظات" + +#: apps/executive_summary/models.py:39 +msgid "Critical Observations" +msgstr "الملاحظات الحرجة" + +#: apps/executive_summary/models.py:40 +#: templates/callcenter/inquiry_list.html:80 +#: templates/complaints/inquiry_list.html:86 +#: templates/dashboard/admin_evaluation.html:372 +#: templates/dashboard/employee_evaluation.html:785 +#: templates/dashboard/employee_evaluation.html:844 +#: templates/dashboard/employee_evaluation.html:1518 +#: templates/dashboard/employee_evaluation_charts.html:359 +#: templates/dashboard/my_performance.html:162 +#: templates/dashboard/staff_performance_detail.html:136 +#: templates/px_sources/source_detail.html:528 +#: templates/px_sources/source_user_dashboard.html:80 +msgid "Total Inquiries" +msgstr "إجمالي الاستفسارات" + +#: apps/executive_summary/models.py:41 +msgid "Resolved Inquiries" +msgstr "الاستفسارات التي تم حلها" + +#: apps/executive_summary/models.py:42 +msgid "Call Center Interactions" +msgstr "تفاعلات مركز الاتصال" + +#: apps/executive_summary/models.py:43 +msgid "Call Center Satisfaction %" +msgstr "نسبة الرضا عن مركز الاتصال %" + +#: apps/executive_summary/models.py:44 +#: templates/organizations/department_detail.html:1012 +msgid "Avg Physician Rating" +msgstr "متوسط تقييم الأطباء" + +#: apps/executive_summary/models.py:83 +msgid "Executive Metric" +msgstr "مقياس تنفيذي" + +#: apps/executive_summary/models.py:84 +msgid "Executive Metrics" +msgstr "المقاييس التنفيذية" + +#: apps/executive_summary/models.py:100 +msgid "Weekly Summary" +msgstr "الملخص الأسبوعي" + +#: apps/executive_summary/models.py:101 +#: templates/dashboard/complaint_quarterly_report.html:305 +#: templates/reports/report_templates.html:168 +msgid "Monthly Summary" +msgstr "ملخص شهري" + +#: apps/executive_summary/models.py:102 +msgid "Quarterly Summary" +msgstr "الملخص الربعي" + +#: apps/executive_summary/models.py:103 +#: templates/reports/report_templates.html:16 +msgid "Custom Report" +msgstr "تقرير مخصص" + +#: apps/executive_summary/models.py:154 +#: apps/executive_summary/templates/executive/pdf_report.html:6 +msgid "Executive Report" +msgstr "التقرير التنفيذي" + +#: apps/executive_summary/models.py:155 +msgid "Executive Reports" +msgstr "التقارير التنفيذية" + +#: apps/executive_summary/models.py:174 +msgid "Trend Change" +msgstr "تغيير الاتجاه" + +#: apps/executive_summary/models.py:175 +msgid "Anomaly Detected" +msgstr "تم اكتشاف شذوذ" + +#: apps/executive_summary/models.py:176 +msgid "Risk Warning" +msgstr "تحذير المخاطر" + +#: apps/executive_summary/models.py:177 templates/analytics/dashboard.html:1106 +msgid "SLA Breach Risk" +msgstr "مخاطر اختراق اتفاقية مستوى الخدمة" + +#: apps/executive_summary/models.py:178 +msgid "Performance Drop" +msgstr "انخفاض الأداء" + +#: apps/executive_summary/models.py:179 +msgid "Volume Spike" +msgstr "ارتفاع مفاجئ في الحجم" + +#: apps/executive_summary/models.py:180 +msgid "Satisfaction Decline" +msgstr "تراجع الرضا" + +#: apps/executive_summary/models.py:181 +msgid "Positive Trend" +msgstr "اتجاه إيجابي" + +#: apps/executive_summary/models.py:192 apps/executive_summary/models.py:294 +#: apps/executive_summary/templates/executive/insights.html:28 +#: apps/organizations/ui_views.py:2510 +#: templates/complaints/templates/template_form.html:12 +#: templates/feedback/feedback_form.html:54 +#: templates/notifications/inbox.html:83 +#: templates/observations/observation_list.html:121 +#: templates/organizations/department_detail.html:473 +#: templates/organizations/department_observations.html:33 +#: templates/presentations/presentation_form.html:11 +#: templates/px_sources/source_user_observation_list.html:104 +#: templates/px_sources/source_user_observation_list.html:176 +#: templates/px_sources/source_user_suggestion_list.html:104 +#: templates/px_sources/source_user_suggestion_list.html:174 +#: templates/surveys/his_patient_review.html:196 +msgid "New" +msgstr "جديد" + +#: apps/executive_summary/models.py:193 +#: apps/executive_summary/templates/executive/dashboard.html:307 +#: apps/executive_summary/templates/executive/insights.html:124 +#: apps/executive_summary/views.py:393 apps/feedback/models.py:35 +#: templates/appreciation/appreciation_list.html:173 +#: templates/organizations/department_detail.html:486 +#: templates/organizations/department_detail.html:497 +#: templates/organizations/department_detail.html:1328 +#: templates/organizations/department_staff_detail.html:491 msgid "Acknowledged" msgstr "تم الإقرار" -#: apps/feedback/models.py:41 templates/callcenter/complaint_form.html:185 +#: apps/executive_summary/models.py:195 +msgid "Dismissed" +msgstr "تم الرفض" + +#: apps/executive_summary/models.py:256 +msgid "Predictive Insight" +msgstr "بصيرة تنبؤية" + +#: apps/executive_summary/models.py:257 +#: apps/executive_summary/templates/executive/insights.html:4 +#: apps/executive_summary/templates/executive/insights.html:16 +msgid "Predictive Insights" +msgstr "بصائر تنبؤية" + +#: apps/executive_summary/models.py:276 +msgid "Process Improvement" +msgstr "تحسين العمليات" + +#: apps/executive_summary/models.py:277 +msgid "Resource Allocation" +msgstr "تخصيص الموارد" + +#: apps/executive_summary/models.py:278 +msgid "Training" +msgstr "تدريب" + +#: apps/executive_summary/models.py:279 +msgid "Policy Change" +msgstr "تغيير السياسة" + +#: apps/executive_summary/models.py:280 +msgid "Preventive Action" +msgstr "إجراء وقائي" + +#: apps/executive_summary/models.py:281 +msgid "Performance Optimization" +msgstr "تحسين الأداء" + +#: apps/executive_summary/models.py:283 +msgid "Quality Assurance" +msgstr "ضمان الجودة" + +#: apps/executive_summary/models.py:290 +#: templates/callcenter/complaint_form.html:233 +#: templates/complaints/partials/priority_badge.html:4 +msgid "Urgent" +msgstr "عاجل" + +#: apps/executive_summary/models.py:295 +msgid "Under Review" +msgstr "قيد المراجعة" + +#: apps/executive_summary/models.py:297 +#: templates/px_sources/source_user_suggestion_list.html:107 +#: templates/px_sources/source_user_suggestion_list.html:186 +msgid "Implemented" +msgstr "تم التنفيذ" + +#: apps/executive_summary/models.py:346 +#: apps/executive_summary/templates/executive/insights.html:132 +msgid "AI Recommendation" +msgstr "توصية الذكاء الاصطناعي" + +#: apps/executive_summary/models.py:347 +#: templates/emails/px_digest_weekly.html:65 +msgid "AI Recommendations" +msgstr "توصيات الذكاء الاصطناعي" + +#: apps/executive_summary/templates/executive/dashboard.html:4 +#: apps/executive_summary/templates/executive/dashboard.html:16 +#: templates/analytics/kpi_report_detail.html:358 +#: templates/analytics/kpi_report_detail.html:464 +#: templates/analytics/kpi_report_weasyprint.html:540 +msgid "Executive Summary" +msgstr "ملخص تنفيذي" + +#: apps/executive_summary/templates/executive/dashboard.html:18 +#: apps/executive_summary/templates/executive/dashboard.html:27 +#: apps/executive_summary/templates/executive/insights.html:85 +#: templates/config/sla_config.html:62 +msgid "All Hospitals" +msgstr "جميع المستشفيات" + +#: apps/executive_summary/templates/executive/dashboard.html:20 +#: templates/ai_engine/sentiment_detail.html:174 +#: templates/complaints/government_ticket_detail.html:198 +#: templates/organizations/patient_detail.html:609 +#: templates/organizations/staff_detail.html:484 +#: templates/organizations/staff_import.html:239 +msgid "Updated" +msgstr "تاريخ التحديث" + +#: apps/executive_summary/templates/executive/dashboard.html:41 +#: templates/social/social_comment_list.html:76 +msgid "Analytics" +msgstr "التحليلات" + +#: apps/executive_summary/templates/executive/dashboard.html:49 +msgid "Overview" +msgstr "نظرة عامة" + +#: apps/executive_summary/templates/executive/dashboard.html:50 +msgid "Trends" +msgstr "اتجاهات" + +#: apps/executive_summary/templates/executive/dashboard.html:52 +msgid "Insights" +msgstr "رؤى" + +#: apps/executive_summary/templates/executive/dashboard.html:57 +#: templates/layouts/partials/sidebar.html:570 +#: templates/reports/report_detail.html:27 +#: templates/reports/saved_reports.html:26 +#: templates/surveys/analytics_reports.html:42 +#: templates/surveys/analytics_reports.html:55 +#: templates/surveys/analytics_reports.html:68 +#: templates/surveys/analytics_reports.html:81 +msgid "Reports" +msgstr "التقارير" + +#: apps/executive_summary/templates/executive/dashboard.html:71 +#: apps/executive_summary/templates/executive/dashboard.html:519 +#: templates/analytics/dashboard.html:364 +#: templates/analytics/dashboard.html:525 +#: templates/analytics/dashboard.html:777 +#: templates/analytics/dashboard.html:2198 +#: templates/analytics/kpi_report_weasyprint.html:509 +#: templates/analytics/kpi_report_weasyprint.html:526 +#: templates/callcenter/complaint_list.html:5 +#: templates/callcenter/complaint_list.html:170 +#: templates/complaints/analytics.html:392 +#: templates/complaints/complaint_list.html:155 +#: templates/dashboard/admin_evaluation.html:410 +#: templates/dashboard/command_center.html:178 +#: templates/dashboard/command_center.html:752 +#: templates/dashboard/department_benchmarks.html:130 +#: templates/dashboard/employee_evaluation.html:773 +#: templates/dashboard/my_dashboard.html:179 +#: templates/dashboard/partials/complaints_table.html:6 +#: templates/dashboard/staff_performance_detail.html:269 +#: templates/layouts/partials/sidebar.html:191 +#: templates/layouts/source_user_base.html:167 +#: templates/organizations/department_complaint_detail.html:13 +#: templates/organizations/department_complaints.html:5 +#: templates/organizations/department_complaints.html:14 +#: templates/organizations/department_detail.html:420 +#: templates/organizations/department_detail.html:521 +#: templates/organizations/department_detail.html:1802 +#: templates/organizations/department_list.html:144 +#: templates/organizations/department_staff_detail.html:206 +#: templates/organizations/patient_detail.html:281 +#: templates/organizations/patient_detail.html:558 +#: templates/organizations/staff_detail.html:191 +#: templates/px_sources/source_detail.html:208 +#: templates/px_sources/source_detail.html:230 +#: templates/px_sources/source_user_confirm_delete.html:96 +msgid "Complaints" +msgstr "الشكاوى" + +#: apps/executive_summary/templates/executive/dashboard.html:71 +#: apps/executive_summary/templates/executive/dashboard.html:538 +#: templates/complaints/inquiry_detail.html:558 +#: templates/observations/observation_detail.html:709 +msgid "Satisfaction" +msgstr "الرضا" + +#: apps/executive_summary/templates/executive/dashboard.html:71 +#: templates/complaints/complaint_detail.html:287 +#: templates/dashboard/command_center.html:244 +#: templates/dashboard/my_dashboard.html:194 +#: templates/dashboard/partials/actions_table.html:6 +msgid "PX Actions" +msgstr "إجراءات تجربة المريض" + +#: apps/executive_summary/templates/executive/dashboard.html:93 +#: apps/executive_summary/templates/executive/dashboard.html:100 +#: templates/complaints/analytics.html:193 +#: templates/complaints/analytics.html:335 +#: templates/complaints/complaint_detail.html:419 +#: templates/complaints/complaint_list.html:308 +#: templates/complaints/complaint_list.html:569 +#: templates/complaints/inquiry_list.html:119 +#: templates/complaints/public_complaint_track.html:191 +#: templates/dashboard/my_dashboard.html:107 +#: templates/observations/observation_detail.html:55 +#: templates/organizations/department_complaint_detail.html:45 +#: templates/organizations/department_complaint_detail.html:149 +#: templates/organizations/department_complaints.html:130 +#: templates/organizations/department_complaints.html:185 +#: templates/organizations/department_detail.html:370 +#: templates/organizations/department_detail.html:1312 +#: templates/organizations/department_inquiries.html:105 +#: templates/organizations/department_inquiries.html:146 +#: templates/organizations/department_observations.html:102 +#: templates/organizations/department_observations.html:143 +#: templates/organizations/department_staff_detail.html:477 +#: templates/projects/my_tasks.html:34 templates/projects/my_tasks.html:86 +msgid "Overdue" +msgstr "متأخر" + +#: apps/executive_summary/templates/executive/dashboard.html:94 +#: templates/surveys/instance_detail.html:138 +msgid "Avg" +msgstr "المتوسط" + +#: apps/executive_summary/templates/executive/dashboard.html:97 +#: apps/executive_summary/templates/executive/insights.html:21 +#: templates/accounts/acknowledgements/dashboard.html:39 +#: templates/accounts/simple_acknowledgements/admin_list.html:87 +#: templates/actions/action_list.html:138 +#: templates/analytics/dashboard.html:2018 +#: templates/appreciation/appreciation_list.html:81 +#: templates/complaints/analytics.html:332 +#: templates/config/routing_rules.html:33 templates/config/sla_config.html:33 +#: templates/dashboard/admin_evaluation.html:462 +#: templates/dashboard/admin_evaluation.html:539 +#: templates/dashboard/census_report.html:133 +#: templates/dashboard/command_center.html:871 +#: templates/dashboard/complaint_quarterly_report.html:487 +#: templates/dashboard/employee_evaluation.html:927 +#: templates/dashboard/employee_evaluation.html:996 +#: templates/dashboard/employee_evaluation.html:1046 +#: templates/dashboard/employee_evaluation.html:1091 +#: templates/dashboard/employee_evaluation.html:1141 +#: templates/dashboard/inquiry_report.html:168 +#: templates/dashboard/inquiry_report.html:200 +#: templates/dashboard/observation_report.html:144 +#: templates/dashboard/observation_report.html:176 +#: templates/dashboard/standards_dashboard.html:138 +#: templates/dashboard/standards_dashboard.html:315 +#: templates/observations/observation_list.html:110 +#: templates/organizations/department_staff_detail.html:174 +#: templates/organizations/patient_visit_journey.html:490 +#: templates/rca/rca_list.html:89 templates/social/social_platform.html:130 +#: templates/standards/dashboard.html:105 +#: templates/surveys/analytics_reports.html:38 +#: templates/surveys/bulk_job_status.html:51 +#: templates/surveys/comment_list.html:87 +msgid "Total" +msgstr "الإجمالي" + +#: apps/executive_summary/templates/executive/dashboard.html:114 +msgid "Risk Alerts" +msgstr "تنبيهات المخاطر" + +#: apps/executive_summary/templates/executive/dashboard.html:124 +#: apps/executive_summary/templates/executive/dashboard.html:292 +#: apps/executive_summary/templates/executive/dashboard.html:416 +#: apps/executive_summary/templates/executive/insights.html:122 +#: templates/dashboard/command_center.html:458 +#: templates/dashboard/command_center.html:524 +#: templates/dashboard/command_center.html:573 +#: templates/dashboard/command_center.html:618 +#: templates/notifications/inbox.html:81 +msgid "ago" +msgstr "منذ" + +#: apps/executive_summary/templates/executive/dashboard.html:128 +msgid "View all insights" +msgstr "عرض جميع الرؤى" + +#: apps/executive_summary/templates/executive/dashboard.html:131 +#: apps/executive_summary/templates/executive/dashboard.html:315 +msgid "No active risk alerts" +msgstr "لا توجد تنبيهات مخاطر نشطة" + +#: apps/executive_summary/templates/executive/dashboard.html:138 +msgid "Latest AI Report" +msgstr "أحدث تقرير للذكاء الاصطناعي" + +#: apps/executive_summary/templates/executive/dashboard.html:146 +#: apps/executive_summary/templates/executive/partials/ai_insights_card.html:33 +#: apps/executive_summary/templates/executive/partials/ai_overview_card.html:33 +#: apps/executive_summary/templates/executive/partials/ai_trends_card.html:33 +msgid "Highlights" +msgstr "أبرز النقاط" + +#: apps/executive_summary/templates/executive/dashboard.html:156 +#: apps/executive_summary/templates/executive/partials/ai_insights_card.html:43 +#: apps/executive_summary/templates/executive/partials/ai_overview_card.html:43 +#: apps/executive_summary/templates/executive/partials/ai_trends_card.html:43 +msgid "Concerns" +msgstr "المخاوف" + +#: apps/executive_summary/templates/executive/dashboard.html:168 +#: templates/accounts/acknowledgements/signed_list.html:144 +#: templates/analytics/kpi_report_list.html:337 +#: templates/complaints/partials/pdf_summary_panel.html:125 +msgid "Download PDF" +msgstr "تحميل PDF" + +#: apps/executive_summary/templates/executive/dashboard.html:174 +msgid "No AI report generated yet" +msgstr "لم يتم إنشاء أي تقرير للذكاء الاصطناعي بعد" + +#: apps/executive_summary/templates/executive/dashboard.html:175 +msgid "Generate your first report" +msgstr "أنشئ تقريرك الأول" + +#: apps/executive_summary/templates/executive/dashboard.html:191 +msgid "Analyze Overview with AI" +msgstr "تحليل النظرة العامة باستخدام الذكاء الاصطناعي" + +#: apps/executive_summary/templates/executive/dashboard.html:193 +msgid "Get AI-powered analysis of your current KPIs" +msgstr "" +"احصل على تحليل مدعوم بالذكاء الاصطناعي لمؤشرات الأداء الرئيسية الحالية لديك" + +#: apps/executive_summary/templates/executive/dashboard.html:201 +#: templates/complaints/analytics.html:246 +#: templates/dashboard/command_center.html:323 +msgid "Complaints Trend" +msgstr "اتجاه الشكاوى" + +#: apps/executive_summary/templates/executive/dashboard.html:204 +#: apps/executive_summary/templates/executive/dashboard.html:244 +msgid "No data for selected period" +msgstr "لا توجد بيانات للفترة المحددة" + +#: apps/executive_summary/templates/executive/dashboard.html:210 +msgid "Hospital Leaderboard" +msgstr "لوحة صدارة المستشفيات" + +#: apps/executive_summary/templates/executive/dashboard.html:235 +msgid "No hospital data" +msgstr "لا توجد بيانات للمستشفى" + +#: apps/executive_summary/templates/executive/dashboard.html:241 +msgid "Satisfaction Trend" +msgstr "اتجاه الرضا" + +#: apps/executive_summary/templates/executive/dashboard.html:258 +msgid "Analyze Trends with AI" +msgstr "تحليل الاتجاهات باستخدام الذكاء الاصطناعي" + +#: apps/executive_summary/templates/executive/dashboard.html:260 +msgid "Get AI-powered trend analysis and predictions" +msgstr "احصل على تحليل تنبؤي واتجاهات مدعومة بالذكاء الاصطناعي" + +#: apps/executive_summary/templates/executive/dashboard.html:273 +msgid "View All Insights" +msgstr "عرض جميع الرؤى" + +#: apps/executive_summary/templates/executive/dashboard.html:279 +msgid "Active Risk Alerts" +msgstr "تنبيهات المخاطر النشطة" + +#: apps/executive_summary/templates/executive/dashboard.html:302 +#: apps/executive_summary/templates/executive/insights.html:150 +#: templates/accounts/onboarding/step_checklist.html:118 +#: templates/accounts/onboarding/step_checklist.html:220 +#: templates/accounts/onboarding/welcome.html:54 +msgid "Acknowledge" +msgstr "إقرار" + +#: apps/executive_summary/templates/executive/dashboard.html:325 +msgid "AI Recommended Actions" +msgstr "الإجراءات الموصى بها من الذكاء الاصطناعي" + +#: apps/executive_summary/templates/executive/dashboard.html:360 +msgid "Analyze Risks with AI" +msgstr "تحليل المخاطر باستخدام الذكاء الاصطناعي" + +#: apps/executive_summary/templates/executive/dashboard.html:362 +msgid "Get AI-powered risk assessment and recommendations" +msgstr "احصل على تقييم المخاطر والتوصيات المدعومة بالذكاء الاصطناعي" + +#: apps/executive_summary/templates/executive/dashboard.html:369 +msgid "Generate New Report" +msgstr "إنشاء تقرير جديد" + +#: apps/executive_summary/templates/executive/dashboard.html:373 +#: apps/executive_summary/templates/executive/dashboard.html:404 +#: apps/executive_summary/templates/executive/insights.html:73 +#: templates/ai_engine/sentiment_detail.html:106 +#: templates/ai_engine/sentiment_detail.html:187 +#: templates/callcenter/call_records_list.html:218 +#: templates/callcenter/interaction_list.html:109 +#: templates/complaints/adverse_action_list.html:236 +#: templates/complaints/adverse_action_list.html:275 +#: templates/complaints/complaint_threshold_list.html:254 +#: templates/dashboard/employee_evaluation.html:1069 +#: templates/dashboard/partials/actions_table.html:26 +#: templates/feedback/feedback_delete_confirm.html:92 +#: templates/feedback/feedback_detail.html:362 +#: templates/feedback/feedback_list.html:206 +#: templates/organizations/department_detail.html:153 +#: templates/organizations/manager_review_questions.html:26 +#: templates/organizations/patient_detail.html:299 +#: templates/organizations/patient_list.html:527 +#: templates/organizations/staff_list.html:209 +#: templates/organizations/staff_list.html:266 +#: templates/px_sources/source_detail.html:475 +#: templates/px_sources/source_list.html:198 +#: templates/references/folder_view.html:240 +#: templates/references/search.html:233 templates/simulator/log_detail.html:149 +#: templates/simulator/log_detail.html:165 +#: templates/surveys/analytics_report_info.html:18 +#: templates/surveys/analytics_report_markdown_view.html:105 +#: templates/surveys/analytics_report_view.html:18 +#: templates/surveys/analytics_reports.html:100 +#: templates/surveys/comment_list.html:274 +#: templates/surveys/instance_detail.html:136 +#: templates/surveys/instance_detail.html:330 +#: templates/surveys/instance_detail.html:438 +#: templates/surveys/instance_list.html:99 +#: templates/surveys/instance_list.html:135 +#: templates/surveys/template_detail.html:156 +msgid "Type" +msgstr "النوع" + +#: apps/executive_summary/templates/executive/dashboard.html:375 +#: templates/complaints/complaint_threshold_form.html:413 +#: templates/complaints/complaint_threshold_list.html:211 +msgid "Weekly" +msgstr "أسبوعي" + +#: apps/executive_summary/templates/executive/dashboard.html:376 +#: templates/complaints/complaint_threshold_form.html:417 +#: templates/complaints/complaint_threshold_list.html:212 +msgid "Monthly" +msgstr "شهري" + +#: apps/executive_summary/templates/executive/dashboard.html:377 +msgid "Quarterly" +msgstr "ربع سنوي" + +#: apps/executive_summary/templates/executive/dashboard.html:381 +msgid "Start" +msgstr "بدء" + +#: apps/executive_summary/templates/executive/dashboard.html:385 +msgid "End" +msgstr "نهاية" + +#: apps/executive_summary/templates/executive/dashboard.html:390 +#: templates/analytics/kpi_report_detail.html:346 +#: templates/config/user_form.html:331 +#: templates/presentations/presentation_generate.html:11 +#: templates/presentations/presentation_list.html:57 +#: templates/surveys/analytics_reports.html:248 +msgid "Generate" +msgstr "إنشاء" + +#: apps/executive_summary/templates/executive/dashboard.html:397 +msgid "Recent Reports" +msgstr "التقارير الأخيرة" + +#: apps/executive_summary/templates/executive/dashboard.html:405 +#: apps/executive_summary/templates/executive/pdf_report.html:115 +#: templates/dashboard/staff_performance_detail.html:145 +#: templates/physicians/ratings_list.html:196 +msgid "Period" +msgstr "الفترة" + +#: apps/executive_summary/templates/executive/dashboard.html:407 +#: apps/executive_summary/templates/executive/insights.html:64 +#: templates/accounts/acknowledgements/category_form.html:191 +#: templates/accounts/acknowledgements/category_list.html:98 +#: templates/accounts/acknowledgements/checklist_list.html:95 +#: templates/accounts/acknowledgements/checklist_list.html:132 +#: templates/accounts/onboarding/checklist_list.html:108 +#: templates/accounts/onboarding/dashboard.html:225 +#: templates/accounts/onboarding/provisional_list.html:145 +#: templates/accounts/simple_acknowledgements/admin_list.html:118 +#: templates/accounts/simple_acknowledgements/admin_signatures.html:100 +#: templates/actions/action_create.html:83 +#: templates/actions/action_list.html:98 templates/analytics/dashboard.html:781 +#: templates/analytics/kpi_list.html:81 +#: templates/analytics/kpi_report_detail.html:548 +#: templates/appreciation/appreciation_list.html:166 +#: templates/appreciation/appreciation_list.html:194 +#: templates/callcenter/complaint_list.html:136 +#: templates/callcenter/complaint_list.html:182 +#: templates/callcenter/inquiry_list.html:132 +#: templates/callcenter/inquiry_list.html:178 +#: templates/complaints/adverse_action_list.html:218 +#: templates/complaints/adverse_action_list.html:278 +#: templates/complaints/complaint_list.html:239 +#: templates/complaints/complaint_threshold_list.html:217 +#: templates/complaints/complaint_threshold_list.html:259 +#: templates/complaints/escalation_rule_list.html:251 +#: templates/complaints/escalation_rule_list.html:293 +#: templates/complaints/government_ticket_list.html:92 +#: templates/complaints/government_ticket_list.html:146 +#: templates/complaints/inquiry_detail.html:499 +#: templates/complaints/inquiry_list.html:141 +#: templates/complaints/inquiry_list.html:193 +#: templates/complaints/oncall/schedule_detail.html:96 +#: templates/complaints/partials/departments_panel.html:36 +#: templates/complaints/partials/staff_panel.html:20 +#: templates/complaints/templates/template_list.html:178 +#: templates/config/hospital_users.html:195 +#: templates/config/hospital_users.html:241 +#: templates/config/routing_rules.html:46 templates/config/sla_config.html:45 +#: templates/config/user_form.html:371 +#: templates/dashboard/admin_evaluation.html:289 +#: templates/dashboard/comments_report.html:123 +#: templates/dashboard/complaint_quarterly_report.html:645 +#: templates/dashboard/complaint_request_list.html:52 +#: templates/dashboard/complaint_request_list.html:88 +#: templates/dashboard/employee_evaluation.html:743 +#: templates/dashboard/employee_evaluation.html:1329 +#: templates/dashboard/employee_evaluation_charts.html:209 +#: templates/dashboard/my_dashboard.html:144 +#: templates/dashboard/partials/actions_table.html:28 +#: templates/dashboard/partials/complaints_table.html:28 +#: templates/dashboard/partials/inquiries_table.html:27 +#: templates/dashboard/partials/observations_table.html:27 +#: templates/dashboard/partials/tasks_table.html:27 +#: templates/dashboard/standards_dashboard.html:183 +#: templates/dashboard/standards_dashboard.html:241 +#: templates/feedback/action_plan_list.html:82 +#: templates/feedback/action_plan_list.html:122 +#: templates/feedback/comment_import_list.html:73 +#: templates/feedback/feedback_delete_confirm.html:115 +#: templates/feedback/feedback_detail.html:299 +#: templates/feedback/feedback_list.html:162 +#: templates/feedback/feedback_list.html:212 +#: templates/integrations/survey_mapping_settings.html:31 +#: templates/integrations/survey_mapping_settings.html:179 +#: templates/journeys/instance_detail.html:298 +#: templates/journeys/instance_list.html:182 +#: templates/journeys/instance_list.html:242 +#: templates/journeys/template_form.html:206 +#: templates/journeys/template_list.html:82 +#: templates/observations/category_list.html:91 +#: templates/observations/observation_detail.html:692 +#: templates/observations/observation_list.html:180 +#: templates/observations/observation_list.html:302 +#: templates/observations/public_success.html:141 +#: templates/organizations/department_complaints.html:73 +#: templates/organizations/department_confirm_delete.html:34 +#: templates/organizations/department_detail.html:654 +#: templates/organizations/department_detail.html:705 +#: templates/organizations/department_detail.html:772 +#: templates/organizations/department_detail.html:832 +#: templates/organizations/department_detail.html:898 +#: templates/organizations/department_detail.html:953 +#: templates/organizations/department_detail.html:1089 +#: templates/organizations/department_form.html:152 +#: templates/organizations/department_inquiries.html:70 +#: templates/organizations/department_list.html:147 +#: templates/organizations/department_observations.html:72 +#: templates/organizations/department_staff_detail.html:216 +#: templates/organizations/department_staff_detail.html:287 +#: templates/organizations/hospital_list.html:165 +#: templates/organizations/orgsection_confirm_delete.html:34 +#: templates/organizations/orgsection_detail.html:144 +#: templates/organizations/orgsection_form.html:136 +#: templates/organizations/orgsection_list.html:89 +#: templates/organizations/orgsection_list.html:128 +#: templates/organizations/orgsubsection_confirm_delete.html:34 +#: templates/organizations/orgsubsection_form.html:134 +#: templates/organizations/orgsubsection_list.html:89 +#: templates/organizations/orgsubsection_list.html:127 +#: templates/organizations/patient_detail.html:256 +#: templates/organizations/patient_detail.html:303 +#: templates/organizations/patient_list.html:232 +#: templates/organizations/patient_list.html:286 +#: templates/organizations/physician_list.html:82 +#: templates/organizations/section_confirm_delete.html:34 +#: templates/organizations/section_form.html:115 +#: templates/organizations/section_list.html:89 +#: templates/organizations/section_list.html:127 +#: templates/organizations/staff_detail.html:238 +#: templates/organizations/staff_detail.html:470 +#: templates/organizations/staff_form.html:323 +#: templates/organizations/staff_form.html:328 +#: templates/organizations/staff_hierarchy.html:237 +#: templates/organizations/staff_import.html:265 +#: templates/organizations/staff_list.html:201 +#: templates/organizations/staff_list.html:271 +#: templates/organizations/subsection_confirm_delete.html:34 +#: templates/organizations/subsection_form.html:115 +#: templates/organizations/subsection_list.html:89 +#: templates/organizations/subsection_list.html:127 +#: templates/physicians/doctor_rating_job_list.html:107 +#: templates/physicians/physician_list.html:158 +#: templates/physicians/physician_list.html:198 +#: templates/presentations/presentation_detail.html:127 +#: templates/presentations/presentation_form.html:71 +#: templates/projects/convert_action.html:135 +#: templates/projects/focus_phase_detail.html:78 +#: templates/projects/focus_phase_form.html:37 +#: templates/projects/partials/phase_form_modal.html:18 +#: templates/projects/partials/task_form_modal.html:35 +#: templates/projects/pdca_phase_detail.html:77 +#: templates/projects/pdca_phase_form.html:37 +#: templates/projects/project_detail.html:190 +#: templates/projects/project_detail.html:295 +#: templates/projects/project_form.html:246 +#: templates/projects/project_list.html:168 +#: templates/projects/task_form.html:163 +#: templates/projects/template_form.html:147 +#: templates/px_sources/communication_request_detail.html:246 +#: templates/px_sources/communication_request_list.html:113 +#: templates/px_sources/source_confirm_delete.html:73 +#: templates/px_sources/source_detail.html:258 +#: templates/px_sources/source_detail.html:325 +#: templates/px_sources/source_detail.html:397 +#: templates/px_sources/source_list.html:169 +#: templates/px_sources/source_list.html:200 +#: templates/px_sources/source_user_communication_request_list.html:82 +#: templates/px_sources/source_user_complaint_list.html:113 +#: templates/px_sources/source_user_complaint_list.html:186 +#: templates/px_sources/source_user_confirm_delete.html:76 +#: templates/px_sources/source_user_dashboard.html:195 +#: templates/px_sources/source_user_dashboard.html:288 +#: templates/px_sources/source_user_form.html:266 +#: templates/px_sources/source_user_inquiry_list.html:113 +#: templates/px_sources/source_user_inquiry_list.html:174 +#: templates/px_sources/source_user_observation_list.html:101 +#: templates/px_sources/source_user_observation_list.html:157 +#: templates/px_sources/source_user_suggestion_list.html:101 +#: templates/px_sources/source_user_suggestion_list.html:159 +#: templates/rca/rca_detail.html:114 templates/rca/rca_detail.html:492 +#: templates/rca/rca_form.html:85 templates/rca/rca_list.html:228 +#: templates/reports/report_builder.html:90 +#: templates/simulator/log_detail.html:76 +#: templates/simulator/log_detail.html:150 +#: templates/simulator/log_detail.html:166 +#: templates/simulator/log_list.html:225 templates/simulator/log_list.html:279 +#: templates/social/dashboard.html:171 +#: templates/standards/activity_type_list.html:126 +#: templates/standards/attachment_upload.html:151 +#: templates/standards/category_list.html:132 +#: templates/standards/compliance_form.html:178 +#: templates/standards/dashboard.html:198 +#: templates/standards/dashboard.html:258 +#: templates/standards/department_standards.html:120 +#: templates/standards/search.html:185 templates/standards/source_list.html:132 +#: templates/standards/standard_detail.html:387 +#: templates/surveys/bulk_job_list.html:89 +#: templates/surveys/his_patient_review.html:160 +#: templates/surveys/instance_detail.html:404 +#: templates/surveys/instance_list.html:89 +#: templates/surveys/instance_list.html:136 +#: templates/surveys/template_detail.html:249 +#: templates/surveys/template_list.html:88 +msgid "Status" +msgstr "الحالة" + +#: apps/executive_summary/templates/executive/dashboard.html:408 +#: templates/accounts/acknowledgements/category_list.html:99 +#: templates/accounts/acknowledgements/checklist_list.html:133 +#: templates/accounts/onboarding/checklist_list.html:110 +#: templates/accounts/onboarding/provisional_list.html:148 +#: templates/accounts/settings.html:491 templates/accounts/settings.html:504 +#: templates/accounts/simple_acknowledgements/admin_list.html:121 +#: templates/accounts/simple_acknowledgements/admin_signatures.html:102 +#: templates/ai_engine/sentiment_dashboard.html:238 +#: templates/ai_engine/sentiment_list.html:208 +#: templates/analytics/dashboard.html:778 +#: templates/appreciation/appreciation_list.html:196 +#: templates/appreciation/category_list.html:123 +#: templates/callcenter/complaint_list.html:184 +#: templates/callcenter/inquiry_list.html:180 +#: templates/callcenter/interaction_list.html:114 +#: templates/complaints/adverse_action_list.html:280 +#: templates/complaints/complaint_list.html:244 +#: templates/complaints/complaint_threshold_form.html:444 +#: templates/complaints/complaint_threshold_list.html:260 +#: templates/complaints/escalation_rule_list.html:294 +#: templates/complaints/government_ticket_detail.html:157 +#: templates/complaints/government_ticket_list.html:148 +#: templates/complaints/oncall/dashboard.html:80 +#: templates/complaints/oncall/schedule_detail.html:97 +#: templates/complaints/partials/rca_panel.html:37 +#: templates/complaints/sla_management.html:268 +#: templates/complaints/sla_management.html:375 +#: templates/complaints/trash_list.html:41 +#: templates/complaints/trash_list.html:84 +#: templates/config/deleted_items.html:41 +#: templates/config/deleted_items.html:84 +#: templates/config/deleted_items.html:127 +#: templates/config/deleted_items.html:170 +#: templates/config/hospital_users.html:242 +#: templates/dashboard/department_benchmarks.html:133 +#: templates/dashboard/partials/actions_table.html:30 +#: templates/dashboard/partials/complaints_table.html:30 +#: templates/dashboard/partials/feedback_table.html:29 +#: templates/dashboard/partials/inquiries_table.html:29 +#: templates/dashboard/partials/observations_table.html:29 +#: templates/dashboard/partials/tasks_table.html:29 +#: templates/feedback/feedback_list.html:214 +#: templates/integrations/survey_mapping_settings.html:32 +#: templates/journeys/instance_list.html:244 +#: templates/journeys/stage_surveys_form.html:206 +#: templates/journeys/template_detail.html:142 +#: templates/journeys/template_form.html:269 +#: templates/journeys/template_list.html:83 +#: templates/journeys/template_list.html:103 +#: templates/observations/category_list.html:92 +#: templates/observations/observation_list.html:306 +#: templates/organizations/department_detail.html:655 +#: templates/organizations/department_detail.html:774 +#: templates/organizations/department_detail.html:834 +#: templates/organizations/department_inquiries.html:74 +#: templates/organizations/department_observations.html:75 +#: templates/organizations/manager_review_questions.html:28 +#: templates/organizations/orgsection_detail.html:145 +#: templates/organizations/orgsection_list.html:129 +#: templates/organizations/orgsubsection_list.html:128 +#: templates/organizations/patient_list.html:287 +#: templates/organizations/physician_list.html:83 +#: templates/organizations/section_list.html:128 +#: templates/organizations/staff_detail.html:334 +#: templates/organizations/staff_hierarchy.html:238 +#: templates/organizations/staff_list.html:272 +#: templates/organizations/subsection_list.html:128 +#: templates/physicians/department_overview.html:112 +#: templates/physicians/doctor_rating_job_list.html:111 +#: templates/physicians/leaderboard.html:209 +#: templates/physicians/physician_list.html:199 +#: templates/physicians/physician_ratings_dashboard.html:461 +#: templates/physicians/ratings_list.html:205 +#: templates/physicians/specialization_overview.html:111 +#: templates/projects/project_detail.html:192 +#: templates/projects/project_detail.html:297 +#: templates/projects/project_list.html:171 +#: templates/px_sources/communication_request_list.html:115 +#: templates/px_sources/source_detail.html:400 +#: templates/px_sources/source_list.html:201 templates/rca/rca_list.html:234 +#: templates/references/document_view.html:337 +#: templates/references/document_view.html:458 +#: templates/social/dashboard.html:173 +#: templates/social/social_analytics.html:250 +#: templates/social/social_comment_detail.html:264 +#: templates/standards/activity_type_list.html:129 +#: templates/standards/attachment_upload.html:204 +#: templates/standards/category_list.html:135 +#: templates/standards/dashboard.html:201 +#: templates/standards/department_standards.html:126 +#: templates/standards/department_standards.html:461 +#: templates/standards/search.html:191 templates/standards/search.html:386 +#: templates/standards/search.html:570 templates/standards/source_list.html:135 +#: templates/standards/standard_detail.html:279 +#: templates/standards/standard_detail.html:391 +#: templates/standards/standard_detail.html:577 +#: templates/surveys/analytics_reports.html:103 +#: templates/surveys/bulk_job_list.html:91 +#: templates/surveys/comment_list.html:279 +#: templates/surveys/enhanced_reports_list.html:132 +#: templates/surveys/instance_detail.html:333 +#: templates/surveys/instance_list.html:140 +#: templates/surveys/template_detail.html:158 +#: templates/surveys/template_list.html:89 +msgid "Actions" +msgstr "الإجراءات" + +#: apps/executive_summary/templates/executive/dashboard.html:430 +#: templates/accounts/acknowledgements/dashboard.html:159 +#: templates/accounts/simple_acknowledgements/admin_list.html:120 +#: templates/complaints/explanation_form.html:51 +#: templates/presentations/presentation_detail.html:109 +#: templates/reports/report_detail.html:75 +msgid "PDF" +msgstr "PDF" + +#: apps/executive_summary/templates/executive/dashboard.html:442 +msgid "No reports yet" +msgstr "لا توجد تقارير بعد" + +#: apps/executive_summary/templates/executive/dashboard.html:443 +msgid "Use the form above to generate your first report" +msgstr "استخدم النموذج أعلاه لإنشاء تقريرك الأول" + +#: apps/executive_summary/templates/executive/insights.html:18 +msgid "AI-detected patterns, anomalies, and early warnings" +msgstr "الأنماط والشذوذ والتحذيرات المبكرة التي اكتشفها الذكاء الاصطناعي" + +#: apps/executive_summary/templates/executive/insights.html:38 +#: templates/accounts/staff_activity_log.html:76 +#: templates/actions/action_list.html:89 +#: templates/ai_engine/sentiment_list.html:144 +#: templates/analytics/kpi_report_list.html:168 +#: templates/appreciation/appreciation_list.html:157 +#: templates/appreciation/leaderboard.html:97 +#: templates/callcenter/call_records_list.html:148 +#: templates/callcenter/complaint_list.html:125 +#: templates/callcenter/inquiry_list.html:121 +#: templates/complaints/adverse_action_list.html:207 +#: templates/complaints/complaint_threshold_list.html:202 +#: templates/complaints/escalation_rule_list.html:237 +#: templates/complaints/inquiry_list.html:130 +#: templates/complaints/templates/template_list.html:173 +#: templates/config/hospital_users.html:170 +#: templates/dashboard/admin_evaluation.html:239 +#: templates/dashboard/employee_evaluation.html:695 +#: templates/dashboard/employee_evaluation_charts.html:175 +#: templates/feedback/action_plan_list.html:77 +#: templates/feedback/comment_list.html:72 +#: templates/journeys/instance_list.html:154 +#: templates/observations/observation_list.html:160 +#: templates/organizations/orgsection_list.html:71 +#: templates/organizations/orgsubsection_list.html:71 +#: templates/organizations/section_list.html:71 +#: templates/organizations/staff_hierarchy.html:177 +#: templates/organizations/staff_list.html:196 +#: templates/organizations/subsection_list.html:71 +#: templates/physicians/individual_ratings_list.html:99 +#: templates/physicians/physician_list.html:130 +#: templates/physicians/physician_ratings_dashboard.html:253 +#: templates/physicians/ratings_list.html:123 +#: templates/projects/project_list.html:138 +#: templates/px_sources/source_user_complaint_list.html:94 +#: templates/px_sources/source_user_inquiry_list.html:94 +#: templates/px_sources/source_user_observation_list.html:85 +#: templates/px_sources/source_user_suggestion_list.html:85 +#: templates/simulator/log_list.html:211 +#: templates/surveys/instance_list.html:72 +#: templates/surveys/instance_list.html:84 +msgid "Filters" +msgstr "عوامل التصفية" + +#: apps/executive_summary/templates/executive/insights.html:57 +#: templates/complaints/adverse_action_list.html:229 +#: templates/complaints/escalation_rule_form.html:326 +#: templates/observations/observation_list.html:195 +#: templates/organizations/department_complaints.html:41 +#: templates/organizations/department_observations.html:41 +msgid "All Severities" +msgstr "جميع درجات الخطورة" + +#: apps/executive_summary/templates/executive/insights.html:95 +msgid "Clear all filters" +msgstr "مسح جميع المرشحات" + +#: apps/executive_summary/templates/executive/insights.html:140 +#: templates/ai_engine/analyze_text.html:120 +#: templates/ai_engine/sentiment_detail.html:68 +#: templates/ai_engine/sentiment_list.html:204 +#: templates/ai_engine/tags/sentiment_card.html:22 +#: templates/complaints/inquiry_detail.html:165 +#: templates/complaints/inquiry_detail.html:1031 +#: templates/complaints/partials/ai_panel.html:32 +#: templates/complaints/partials/ai_panel.html:205 +#: templates/observations/observation_detail.html:110 +#: templates/observations/partials/ai_panel.html:18 +#: templates/social/partials/ai_analysis_bilingual.html:56 +#: templates/social/social_comment_detail.html:126 +msgid "Confidence" +msgstr "الثقة" + +#: apps/executive_summary/templates/executive/insights.html:161 +msgid "No Insights Match" +msgstr "لا توجد رؤى مطابقة" + +#: apps/executive_summary/templates/executive/insights.html:162 +#: templates/config/hospital_users.html:321 +#: templates/physicians/physician_list.html:271 +#: templates/physicians/ratings_list.html:298 +msgid "Try adjusting your filters" +msgstr "جرب تعديل عوامل التصفية الخاصة بك" + +#: apps/executive_summary/templates/executive/insights.html:172 +#: templates/references/search.html:298 +msgid "First" +msgstr "الأول" + +#: apps/executive_summary/templates/executive/insights.html:174 +#: templates/accounts/onboarding/step_content.html:93 +#: templates/actions/action_list.html:219 +#: templates/appreciation/badge_list.html:156 +#: templates/appreciation/badge_list.html:160 +#: templates/appreciation/my_badges.html:102 +#: templates/appreciation/my_badges.html:107 +#: templates/callcenter/call_records_list.html:304 +#: templates/callcenter/complaint_list.html:249 +#: templates/callcenter/inquiry_list.html:241 +#: templates/complaints/adverse_action_list.html:369 +#: templates/complaints/complaint_threshold_list.html:342 +#: templates/complaints/escalation_rule_list.html:390 +#: templates/complaints/government_ticket_list.html:221 +#: templates/dashboard/complaint_request_list.html:140 +#: templates/dashboard/partials/actions_table.html:93 +#: templates/dashboard/partials/complaints_table.html:89 +#: templates/dashboard/partials/feedback_table.html:85 +#: templates/dashboard/partials/inquiries_table.html:87 +#: templates/dashboard/partials/observations_table.html:79 +#: templates/dashboard/partials/tasks_table.html:87 +#: templates/px_sources/source_user_complaint_list.html:275 +#: templates/px_sources/source_user_inquiry_list.html:254 +#: templates/px_sources/source_user_observation_list.html:233 +#: templates/px_sources/source_user_suggestion_list.html:227 +#: templates/references/search.html:303 +#: templates/reports/saved_reports.html:149 +msgid "Previous" +msgstr "السابق" + +#: apps/executive_summary/templates/executive/insights.html:179 +#: templates/actions/action_list.html:229 +#: templates/appreciation/badge_list.html:178 +#: templates/appreciation/badge_list.html:182 +#: templates/appreciation/my_badges.html:126 +#: templates/appreciation/my_badges.html:131 +#: templates/callcenter/call_records_list.html:315 +#: templates/callcenter/complaint_list.html:260 +#: templates/callcenter/inquiry_list.html:252 +#: templates/complaints/adverse_action_list.html:375 +#: templates/complaints/complaint_threshold_list.html:348 +#: templates/complaints/escalation_rule_list.html:396 +#: templates/complaints/government_ticket_list.html:225 +#: templates/dashboard/complaint_request_list.html:150 +#: templates/dashboard/partials/actions_table.html:101 +#: templates/dashboard/partials/complaints_table.html:97 +#: templates/dashboard/partials/feedback_table.html:93 +#: templates/dashboard/partials/inquiries_table.html:95 +#: templates/dashboard/partials/observations_table.html:87 +#: templates/dashboard/partials/tasks_table.html:95 +#: templates/px_sources/source_user_complaint_list.html:286 +#: templates/px_sources/source_user_inquiry_list.html:265 +#: templates/px_sources/source_user_observation_list.html:242 +#: templates/px_sources/source_user_suggestion_list.html:236 +#: templates/references/search.html:321 +#: templates/reports/saved_reports.html:163 +msgid "Next" +msgstr "التالي" + +#: apps/executive_summary/templates/executive/insights.html:181 +#: templates/references/search.html:326 +msgid "Last" +msgstr "الأخيرة" + +#: apps/executive_summary/templates/executive/partials/ai_insights_card.html:6 +msgid "AI Risk Assessment" +msgstr "تقييم المخاطر بالذكاء الاصطناعي" + +#: apps/executive_summary/templates/executive/partials/ai_insights_card.html:18 +#: apps/executive_summary/templates/executive/partials/ai_overview_card.html:18 +#: apps/executive_summary/templates/executive/partials/ai_trends_card.html:18 +#: templates/analytics/kpi_report_detail.html:96 +#: templates/analytics/kpi_report_detail.html:346 +#: templates/analytics/kpi_report_list.html:344 +msgid "Regenerate" +msgstr "إعادة توليد" + +#: apps/executive_summary/templates/executive/partials/ai_insights_card.html:26 +#: apps/executive_summary/templates/executive/partials/ai_overview_card.html:26 +#: apps/executive_summary/templates/executive/partials/ai_trends_card.html:26 +msgid "Analysis failed. Try regenerating." +msgstr "فشل التحليل. حاول إعادة التوليد." + +#: apps/executive_summary/templates/executive/partials/ai_insights_card.html:53 +#: apps/executive_summary/templates/executive/partials/ai_overview_card.html:53 +#: apps/executive_summary/templates/executive/partials/ai_trends_card.html:53 +#: templates/analytics/kpi_report_detail.html:435 +#: templates/analytics/kpi_report_weasyprint.html:574 +msgid "Recommendations" +msgstr "التوصيات" + +#: apps/executive_summary/templates/executive/partials/ai_insights_card.html:63 +#: apps/executive_summary/templates/executive/partials/ai_overview_card.html:63 +#: apps/executive_summary/templates/executive/partials/ai_trends_card.html:63 +msgid "Generated just now" +msgstr "تم التوليد للتو." + +#: apps/executive_summary/templates/executive/partials/ai_overview_card.html:6 +msgid "AI Overview Analysis" +msgstr "تحليل النظرة العامة للذكاء الاصطناعي" + +#: apps/executive_summary/templates/executive/partials/ai_trends_card.html:6 +msgid "AI Trend Analysis" +msgstr "تحليل الاتجاهات بالذكاء الاصطناعي" + +#: apps/executive_summary/templates/executive/pdf_report.html:112 +msgid "Executive Summary Report" +msgstr "تقرير الملخص التنفيذي" + +#: apps/executive_summary/templates/executive/pdf_report.html:114 +#: templates/analytics/kpi_report_list.html:202 +#: templates/presentations/presentation_form.html:55 +#: templates/presentations/presentation_generate.html:30 +msgid "Report Type" +msgstr "نوع التقرير" + +#: apps/executive_summary/templates/executive/pdf_report.html:116 +msgid "By" +msgstr "بواسطة" + +#: apps/executive_summary/templates/executive/pdf_report.html:122 +msgid "AI Executive Narrative" +msgstr "السرد التنفيذي للذكاء الاصطناعي" + +#: apps/executive_summary/templates/executive/pdf_report.html:129 +msgid "Key Highlights" +msgstr "أبرز النقاط" + +#: apps/executive_summary/templates/executive/pdf_report.html:143 +msgid "Key Concerns" +msgstr "المخاوف الرئيسية" + +#: apps/executive_summary/templates/executive/pdf_report.html:157 +msgid "Snapshot Metrics" +msgstr "مقاييس سريعة" + +#: apps/executive_summary/templates/executive/pdf_report.html:170 +msgid "This report was automatically generated by the PX360 AI system." +msgstr "تم إنشاء هذا التقرير تلقائيًا بواسطة نظام PX360 للذكاء الاصطناعي." + +#: apps/executive_summary/views.py:44 +msgid "You do not have permission to access the executive dashboard." +msgstr "ليس لديك صلاحية الوصول إلى لوحة القيادة التنفيذية." + +#: apps/executive_summary/views.py:215 +#: templates/dashboard/my_dashboard.html:133 +msgid "Last 7 days" +msgstr "آخر 7 أيام" + +#: apps/executive_summary/views.py:216 +msgid "Last 14 days" +msgstr "آخر 14 يومًا" + +#: apps/executive_summary/views.py:217 +#: templates/dashboard/my_dashboard.html:134 +#: templates/emails/survey_results_notification.html:22 +msgid "Last 30 days" +msgstr "آخر 30 يومًا" + +#: apps/executive_summary/views.py:218 +msgid "Last 60 days" +msgstr "آخر 60 يومًا" + +#: apps/executive_summary/views.py:219 +#: templates/dashboard/my_dashboard.html:135 +msgid "Last 90 days" +msgstr "آخر 90 يومًا" + +#: apps/executive_summary/views.py:259 apps/executive_summary/views.py:376 +#: apps/executive_summary/views.py:440 apps/executive_summary/views.py:469 +#: apps/executive_summary/views.py:501 apps/projects/ui_views.py:1374 +#: apps/projects/ui_views.py:1377 apps/projects/ui_views.py:1410 +#: apps/projects/ui_views.py:1437 apps/projects/ui_views.py:1545 +#: apps/projects/ui_views.py:1623 apps/projects/ui_views.py:1667 +#: apps/projects/ui_views.py:1709 +msgid "Permission denied" +msgstr "تم رفض الإذن" + +#: apps/executive_summary/views.py:398 +msgid "Insight acknowledged successfully" +msgstr "تم تأكيد الاستبصار بنجاح" + +#: apps/executive_summary/views.py:406 apps/executive_summary/views.py:409 +msgid "Error acknowledging insight" +msgstr "خطأ في تأكيد التبصرة" + +#: apps/executive_summary/views.py:411 +msgid "POST required" +msgstr "مطلوب POST" + +#: apps/executive_summary/views.py:544 +msgid "You do not have permission to generate reports." +msgstr "ليس لديك صلاحية لإنشاء التقارير." + +#: apps/executive_summary/views.py:560 +msgid "Invalid date format. Use YYYY-MM-DD." +msgstr "تنسيق التاريخ غير صالح. استخدم YYYY-MM-DD." + +#: apps/executive_summary/views.py:625 +#, python-format +msgid "%(report_type)s report generated successfully." +msgstr "تم إنشاء تقرير %(report_type)s بنجاح." + +#: apps/executive_summary/views.py:631 +msgid "Failed to generate report. Please try again." +msgstr "فشل في إنشاء التقرير. يرجى المحاولة مرة أخرى." + +#: apps/executive_summary/views.py:650 +msgid "You do not have permission to access this report." +msgstr "ليس لديك صلاحية الوصول إلى هذا التقرير." + +#: apps/executive_summary/views.py:676 +msgid "Failed to generate PDF report." +msgstr "فشل في إنشاء تقرير PDF." + +#: apps/feedback/forms.py:283 templates/complaints/adverse_action_form.html:173 +#: templates/complaints/complaint_detail.html:350 +#: templates/complaints/complaint_pdf.html:527 +#: templates/core/public_submit.html:422 +#: templates/dashboard/partials/observations_table.html:26 +#: templates/feedback/feedback_detail.html:102 +#: templates/feedback/feedback_detail.html:111 +#: templates/observations/observation_detail.html:149 +#: templates/organizations/department_complaint_detail.html:132 +#: templates/organizations/department_detail.html:649 +#: templates/organizations/department_detail.html:1307 +#: templates/organizations/department_form.html:147 +#: templates/organizations/department_inquiry_detail.html:106 +#: templates/organizations/department_staff_detail.html:472 +#: templates/organizations/orgsection_list.html:126 +#: templates/px_sources/source_user_create_observation.html:124 +#: templates/px_sources/source_user_observation_list.html:156 +msgid "Location" +msgstr "الموقع" + +#: apps/feedback/forms.py:285 templates/core/public_submit.html:456 +msgid "Select Location" +msgstr "اختر الموقع" + +#: apps/feedback/forms.py:297 templates/core/public_submit.html:458 +#: templates/organizations/department_staff_detail.html:110 +msgid "Subsection" +msgstr "الوحدة" + +#: apps/feedback/forms.py:299 templates/core/public_submit.html:460 +msgid "Select Subsection" +msgstr "اختر القسم الفرعي" + +#: apps/feedback/forms.py:304 templates/core/public_submit.html:487 +msgid "Suggestion Title" +msgstr "عنوان الاقتراح" + +#: apps/feedback/forms.py:307 templates/core/public_submit.html:488 +msgid "Brief title for your suggestion" +msgstr "عنوان مختصر لاقتراحك" + +#: apps/feedback/forms.py:310 templates/core/public_submit.html:489 +#: templates/px_sources/source_user_create_suggestion.html:111 +msgid "Your Suggestion" +msgstr "اقتراحك" + +#: apps/feedback/forms.py:312 templates/feedback/feedback_form.html:113 +msgid "Describe your suggestion in detail..." +msgstr "صف اقتراحك بالتفصيل..." + +#: apps/feedback/models.py:23 +msgid "Compliment" +msgstr "مديح" + +#: apps/feedback/models.py:24 templates/core/public_submit.html:347 +#: templates/organizations/department_detail.html:1299 +#: templates/px_sources/communication_request_detail.html:224 +#: templates/px_sources/source_user_dashboard.html:162 +#: templates/px_sources/source_user_suggestion_list.html:157 +#: templates/surveys/comment_list.html:205 +msgid "Suggestion" +msgstr "اقتراح" + +#: apps/feedback/models.py:25 +msgid "General Feedback" +msgstr "ملاحظات عامة" + +#: apps/feedback/models.py:26 templates/complaints/inquiry_detail.html:4 +#: templates/core/public_submit.html:321 templates/core/public_track.html:164 +#: templates/organizations/department_detail.html:1297 +#: templates/organizations/department_inquiry_detail.html:35 +#: templates/px_sources/communication_request_detail.html:204 +msgid "Inquiry" +msgstr "استفسار" + +#: apps/feedback/models.py:27 +msgid "Satisfaction Check" +msgstr "فحص الرضا" + +#: apps/feedback/models.py:33 templates/complaints/explanation_success.html:8 +#: templates/complaints/explanation_success.html:51 +#: templates/complaints/partials/explanation_panel.html:119 +#: templates/complaints/public_inquiry_track.html:193 +#: templates/observations/public_success.html:152 +#: templates/observations/public_track.html:187 +#: templates/organizations/department_complaints.html:151 +#: templates/organizations/department_detail.html:484 +#: templates/organizations/department_manager_review.html:170 +#: templates/surveys/instance_detail.html:244 +msgid "Submitted" +msgstr "تم الإرسال" + +#: apps/feedback/models.py:34 +#: templates/organizations/department_detail.html:485 +#: templates/px_sources/source_user_suggestion_list.html:105 +#: templates/px_sources/source_user_suggestion_list.html:178 +msgid "Reviewed" +msgstr "تم المراجعة" + +#: apps/feedback/models.py:37 templates/analytics/dashboard.html:310 +#: templates/complaints/analytics.html:217 +#: templates/complaints/complaint_list.html:253 +#: templates/organizations/department_detail.html:1032 +msgid "Reopened" +msgstr "أعيد فتحه" + +#: apps/feedback/models.py:52 templates/callcenter/complaint_form.html:185 +#: templates/core/public_submit.html:480 #: templates/px_sources/source_user_complaint_list.html:139 #: templates/px_sources/source_user_inquiry_list.html:128 +#: templates/px_sources/source_user_suggestion_list.html:115 msgid "Clinical Care" msgstr "الرعاية السريرية" -#: apps/feedback/models.py:42 +#: apps/feedback/models.py:53 templates/core/public_submit.html:482 +#: templates/px_sources/source_user_suggestion_list.html:116 msgid "Staff Service" msgstr "خدمة الموظفين" -#: apps/feedback/models.py:43 templates/callcenter/complaint_form.html:187 +#: apps/feedback/models.py:54 templates/callcenter/complaint_form.html:187 +#: templates/core/public_submit.html:481 msgid "Facility & Environment" msgstr "المرافق والبيئة" -#: apps/feedback/models.py:45 +#: apps/feedback/models.py:56 templates/core/public_submit.html:486 msgid "Appointment & Scheduling" msgstr "المواعيد والجدولة" -#: apps/feedback/models.py:46 templates/complaints/public_inquiry_form.html:71 -#: templates/core/public_submit.html:676 +#: apps/feedback/models.py:57 templates/complaints/public_inquiry_form.html:118 +#: templates/core/public_submit.html:447 msgid "Billing & Insurance" msgstr "الفوترة والتأمين" -#: apps/feedback/models.py:47 +#: apps/feedback/models.py:58 templates/core/public_submit.html:485 +#: templates/px_sources/source_user_suggestion_list.html:120 msgid "Food Service" msgstr "خدمة المأكولات" -#: apps/feedback/models.py:48 +#: apps/feedback/models.py:59 msgid "Cleanliness" msgstr "النظافة" -#: apps/feedback/models.py:49 +#: apps/feedback/models.py:60 templates/core/public_submit.html:484 msgid "Technology & Systems" msgstr "التقنية والأنظمة" -#: apps/feedback/models.py:56 templates/ai_engine/analyze_text.html:99 +#: apps/feedback/models.py:67 templates/ai_engine/analyze_text.html:99 #: templates/ai_engine/sentiment_dashboard.html:37 #: templates/ai_engine/sentiment_dashboard.html:79 #: templates/ai_engine/sentiment_dashboard.html:251 @@ -3040,10 +5720,14 @@ msgstr "التقنية والأنظمة" #: templates/ai_engine/sentiment_list.html:222 #: templates/ai_engine/tags/sentiment_badge.html:6 #: templates/ai_engine/tags/sentiment_card.html:10 -#: templates/analytics/command_center.html:393 -#: templates/physicians/leaderboard.html:243 +#: templates/dashboard/comments_report.html:64 +#: templates/feedback/comment_list.html:159 +#: templates/feedback/feedback_list.html:183 #: templates/physicians/physician_detail.html:501 #: templates/physicians/ratings_list.html:252 +#: templates/social/comment_detail.html:131 +#: templates/social/comments_list.html:124 +#: templates/social/comments_list.html:184 #: templates/social/social_analytics.html:63 #: templates/social/social_comment_detail.html:42 #: templates/social/social_comment_list.html:127 @@ -3054,10 +5738,12 @@ msgstr "التقنية والأنظمة" #: templates/social/social_platform.html:220 #: templates/surveys/comment_list.html:100 #: templates/surveys/comment_list.html:190 +#: templates/surveys/comment_list.html:204 +#: templates/surveys/template_detail.html:108 msgid "Positive" msgstr "إيجابي" -#: apps/feedback/models.py:58 templates/ai_engine/analyze_text.html:102 +#: apps/feedback/models.py:69 templates/ai_engine/analyze_text.html:102 #: templates/ai_engine/sentiment_dashboard.html:59 #: templates/ai_engine/sentiment_dashboard.html:101 #: templates/ai_engine/sentiment_dashboard.html:253 @@ -3066,10 +5752,14 @@ msgstr "إيجابي" #: templates/ai_engine/sentiment_list.html:226 #: templates/ai_engine/tags/sentiment_badge.html:8 #: templates/ai_engine/tags/sentiment_card.html:12 -#: templates/analytics/command_center.html:395 -#: templates/physicians/leaderboard.html:249 +#: templates/dashboard/comments_report.html:60 +#: templates/feedback/comment_list.html:158 +#: templates/feedback/feedback_list.html:185 #: templates/physicians/physician_detail.html:503 #: templates/physicians/ratings_list.html:258 +#: templates/social/comment_detail.html:135 +#: templates/social/comments_list.html:126 +#: templates/social/comments_list.html:188 #: templates/social/social_analytics.html:80 #: templates/social/social_comment_detail.html:46 #: templates/social/social_comment_list.html:153 @@ -3080,121 +5770,157 @@ msgstr "إيجابي" #: templates/social/social_platform.html:224 #: templates/surveys/comment_list.html:113 #: templates/surveys/comment_list.html:191 -#: templates/surveys/template_detail.html:93 +#: templates/surveys/comment_list.html:203 +#: templates/surveys/template_detail.html:112 msgid "Negative" msgstr "سلبي" -#: apps/feedback/models.py:314 +#: apps/feedback/models.py:400 apps/organizations/models.py:161 +#: templates/complaints/complaint_detail.html:1032 +#: templates/dashboard/employee_evaluation.html:1076 #: templates/integrations/survey_mapping_settings.html:156 #: templates/journeys/instance_list.html:176 -#: templates/surveys/comment_list.html:216 +#: templates/surveys/comment_list.html:230 msgid "Inpatient" msgstr "المرضى المنومون" -#: apps/feedback/models.py:315 +#: apps/feedback/models.py:401 apps/organizations/models.py:160 +#: templates/complaints/complaint_detail.html:1031 +#: templates/dashboard/employee_evaluation.html:1081 #: templates/integrations/survey_mapping_settings.html:157 -#: templates/surveys/comment_list.html:215 +#: templates/surveys/comment_list.html:229 msgid "Outpatient" msgstr "العيادات الخارجية" -#: apps/feedback/models.py:322 -#: templates/dashboard/employee_evaluation.html:1040 +#: apps/feedback/models.py:408 apps/organizations/models.py:152 +#: templates/complaints/complaint_detail.html:1053 +#: templates/complaints/complaint_form.html:562 +#: templates/complaints/inquiry_form.html:142 +#: templates/complaints/public_complaint_form.html:118 +#: templates/core/public_submit.html:495 +#: templates/dashboard/employee_evaluation.html:1121 +#: templates/observations/public_new.html:119 +#: templates/organizations/department_form.html:109 +#: templates/organizations/staff_list.html:213 msgid "Medical" msgstr "طبي" -#: apps/feedback/models.py:323 +#: apps/feedback/models.py:409 apps/organizations/models.py:153 +#: templates/complaints/complaint_detail.html:1054 +#: templates/organizations/department_form.html:110 +#: templates/organizations/staff_list.html:214 msgid "Non-Medical" msgstr "غير طبي" -#: apps/feedback/models.py:324 -#: templates/dashboard/employee_evaluation.html:1050 +#: apps/feedback/models.py:410 apps/organizations/models.py:154 +#: templates/complaints/complaint_detail.html:1055 +#: templates/complaints/complaint_form.html:563 +#: templates/complaints/inquiry_form.html:143 +#: templates/complaints/public_complaint_form.html:119 +#: templates/core/public_submit.html:496 +#: templates/dashboard/employee_evaluation.html:1131 +#: templates/observations/public_new.html:120 +#: templates/organizations/department_form.html:107 +#: templates/organizations/staff_list.html:212 msgid "Nursing" msgstr "تمريض" -#: apps/feedback/models.py:325 -#: templates/dashboard/employee_evaluation.html:1005 -msgid "ER" +#: apps/feedback/models.py:411 apps/organizations/models.py:162 +#: templates/complaints/complaint_detail.html:1033 +#: templates/dashboard/employee_evaluation.html:1086 +#: templates/integrations/survey_mapping_settings.html:158 +#: templates/surveys/comment_list.html:231 +msgid "Emergency" msgstr "الطوارئ" -#: apps/feedback/models.py:326 -#: templates/dashboard/employee_evaluation.html:1055 +#: apps/feedback/models.py:412 apps/organizations/models.py:155 +#: templates/complaints/complaint_detail.html:1057 +#: templates/complaints/complaint_form.html:565 +#: templates/complaints/inquiry_form.html:145 +#: templates/complaints/public_complaint_form.html:121 +#: templates/core/public_submit.html:498 +#: templates/dashboard/employee_evaluation.html:1136 +#: templates/observations/public_new.html:122 +#: templates/organizations/department_form.html:108 +#: templates/organizations/staff_list.html:215 msgid "Support Services" msgstr "خدمات دعم" -#: apps/feedback/models.py:332 +#: apps/feedback/models.py:418 templates/complaints/inquiry_list.html:158 +#: templates/complaints/public_inquiry_form.html:120 msgid "Pharmacy" msgstr "الصيدلية" -#: apps/feedback/models.py:333 +#: apps/feedback/models.py:419 msgid "RAD" msgstr "الأشعة التشخيصية" -#: apps/feedback/models.py:334 +#: apps/feedback/models.py:420 msgid "LAB" msgstr "مختبر" -#: apps/feedback/models.py:335 +#: apps/feedback/models.py:421 msgid "Physiotherapy" msgstr "العلاج الطبيعي" -#: apps/feedback/models.py:336 +#: apps/feedback/models.py:422 msgid "Doctors" msgstr "الأطباء" -#: apps/feedback/models.py:337 +#: apps/feedback/models.py:423 msgid "Medical Reports" msgstr "التقارير الطبية" -#: apps/feedback/models.py:338 +#: apps/feedback/models.py:424 msgid "Reception" msgstr "الاستقبال" -#: apps/feedback/models.py:339 +#: apps/feedback/models.py:425 msgid "Insurance/Approvals" msgstr "التأمين/الموافقات" -#: apps/feedback/models.py:340 +#: apps/feedback/models.py:426 msgid "OPD - Clinics" msgstr "العيادات الخارجية" -#: apps/feedback/models.py:341 templates/complaints/inquiry_list.html:199 -#: templates/complaints/public_inquiry_form.html:70 -#: templates/core/public_submit.html:675 +#: apps/feedback/models.py:427 templates/complaints/inquiry_list.html:155 +#: templates/complaints/public_inquiry_form.html:117 +#: templates/core/public_submit.html:446 msgid "Appointments" msgstr "المواعيد" -#: apps/feedback/models.py:342 +#: apps/feedback/models.py:428 msgid "IT - App" msgstr "تقنية المعلومات - التطبيق" -#: apps/feedback/models.py:343 +#: apps/feedback/models.py:429 msgid "Administration" msgstr "الإدارة" -#: apps/feedback/models.py:345 +#: apps/feedback/models.py:431 msgid "Facilities" msgstr "المرافق" -#: apps/feedback/models.py:346 +#: apps/feedback/models.py:432 msgid "Food Services" msgstr "خدمات الطعام" -#: apps/feedback/models.py:347 +#: apps/feedback/models.py:433 msgid "Parking" msgstr "المواقف" -#: apps/feedback/models.py:348 +#: apps/feedback/models.py:434 msgid "Housekeeping" msgstr "النظافة" -#: apps/feedback/models.py:395 templates/feedback/comment_import_list.html:39 +#: apps/feedback/models.py:481 templates/feedback/comment_import_list.html:93 #: templates/physicians/doctor_rating_job_list.html:145 #: templates/physicians/doctor_rating_job_status.html:110 msgid "Processing" msgstr "جاري المعالجة" -#: apps/feedback/models.py:562 templates/feedback/action_plan_list.html:26 -#: templates/feedback/action_plan_list.html:76 +#: apps/feedback/models.py:648 templates/feedback/action_plan_list.html:86 +#: templates/feedback/action_plan_list.html:139 msgid "On Process" msgstr "قيد المعالجة" @@ -3204,53 +5930,174 @@ msgstr "قيد المعالجة" msgid "Survey Template Mappings" msgstr "ربط قوالب الاستبيان" -#: apps/notifications/views.py:468 +#: apps/notifications/views.py:480 msgid "Phone number is required." msgstr "رقم الهاتف مطلوب." -#: apps/notifications/views.py:470 +#: apps/notifications/views.py:482 msgid "Phone number must include country code (e.g., +966501234567)." msgstr "يجب أن يتضمن رقم الهاتف رمز الدولة (على سبيل المثال: +966501234567)." -#: apps/notifications/views.py:473 +#: apps/notifications/views.py:485 msgid "Message is required." msgstr "الرسالة مطلوبة." -#: apps/notifications/views.py:475 +#: apps/notifications/views.py:487 msgid "Message is too long. Maximum 1600 characters." msgstr "الرسالة طويلة جدًا. الحد الأقصى 1600 حرف." -#: apps/notifications/views.py:518 +#: apps/notifications/views.py:530 #, python-brace-format msgid "SMS sent successfully to {phone_number}." msgstr "تم إرسال الرسالة القصيرة بنجاح إلى {phone_number}." -#: apps/observations/views.py:143 -#, fuzzy -#| msgid "Please enter a title." -msgid "Please enter a tracking code." -msgstr "الرجاء إدخال العنوان." +#: apps/observations/forms.py:719 +msgid "Reporter Name" +msgstr "اسم المبلغ" -#: apps/observations/views.py:152 apps/observations/views.py:161 -#, fuzzy -#| msgid "" -#| "No complaint found with this reference number. Please check and try again." +#: apps/observations/forms.py:770 +#: templates/accounts/simple_acknowledgements/admin_create.html:36 +#: templates/accounts/simple_acknowledgements/admin_form.html:124 +#: templates/accounts/simple_acknowledgements/admin_list.html:117 +#: templates/actions/action_create.html:24 +#: templates/callcenter/complaint_form.html:169 +#: templates/callcenter/complaint_list.html:177 +#: templates/complaints/complaint_form.html:673 +#: templates/complaints/explanation_success.html:46 +#: templates/complaints/investigation_respond.html:40 +#: templates/complaints/trash_list.html:37 +#: templates/config/deleted_items.html:37 templates/core/public_submit.html:418 +#: templates/dashboard/partials/actions_table.html:25 +#: templates/dashboard/partials/tasks_table.html:25 +#: templates/emails/new_complaint_admin_notification.html:17 +#: templates/emails/new_suggestion_notification.html:17 +#: templates/feedback/feedback_delete_confirm.html:103 +#: templates/feedback/feedback_list.html:208 +#: templates/observations/response_form_token.html:24 +#: templates/organizations/department_detail.html:829 +#: templates/organizations/department_detail.html:893 +#: templates/organizations/department_detail.html:1087 +#: templates/organizations/department_manager_review.html:90 +#: templates/organizations/department_observations.html:69 +#: templates/organizations/department_staff_detail.html:214 +#: templates/organizations/staff_detail.html:236 +#: templates/presentations/presentation_form.html:24 +#: templates/presentations/slide_form.html:46 +#: templates/projects/convert_action.html:111 +#: templates/px_sources/convert_to_complaint_modal.html:40 +#: templates/px_sources/source_user_complaint_list.html:183 +#: templates/px_sources/source_user_dashboard.html:193 +#: templates/px_sources/source_user_suggestion_list.html:156 +#: templates/rca/rca_form.html:46 templates/rca/rca_list.html:227 +#: templates/standards/attachment_upload.html:143 +#: templates/standards/compliance_form.html:145 +#: templates/standards/department_standards.html:117 +#: templates/standards/search.html:182 templates/standards/search.html:377 +#: templates/standards/standard_confirm_delete.html:78 +#: templates/standards/standard_detail.html:277 +msgid "Title" +msgstr "العنوان" + +#: apps/observations/forms.py:773 +msgid "Brief title (optional)" +msgstr "عنوان مختصر (اختياري)" + +#: apps/observations/forms.py:778 +msgid "Describe the observation in detail..." +msgstr "صف الملاحظة بالتفصيل..." + +#: apps/observations/views.py:111 apps/organizations/ui_views.py:2510 +#: templates/organizations/department_detail.html:474 +#: templates/organizations/department_observations.html:34 +#: templates/px_sources/source_user_observation_list.html:105 +#: templates/px_sources/source_user_observation_list.html:180 +msgid "Triaged" +msgstr "تم الفرز" + +#: apps/observations/views.py:254 +msgid "Please enter a tracking code." +msgstr "يرجى إدخال رمز التتبع." + +#: apps/observations/views.py:263 apps/observations/views.py:272 msgid "" "No observation found with this tracking code. Please check and try again." msgstr "" -"لم يتم العثور على شكوى بهذا الرقم المرجعي. يرجى التحقق والمحاولة مرة أخرى." +"لم يتم العثور على أي ملاحظة بهذا الرمز التتبعي. يرجى التحقق والمحاولة مرة " +"أخرى." -#: apps/observations/views.py:169 -#: templates/complaints/public_complaint_track.html:231 -#: templates/observations/public_track.html:233 -msgid "Status Updated" -msgstr "تم تحديث الحالة" +#: apps/observations/views.py:844 +msgid "You don't have permission to activate observations." +msgstr "ليس لديك صلاحية لتفعيل الملاحظات." -#: apps/observations/views.py:180 -#: templates/complaints/public_complaint_track.html:233 -#: templates/observations/public_track.html:238 -msgid "Update Received" -msgstr "تم استلام التحديث" +#: apps/observations/views.py:848 +msgid "This observation is already assigned to you." +msgstr "هذه الملاحظة مُسندة إليك بالفعل." + +#: apps/observations/views.py:883 +msgid "Observation activated and assigned to you successfully." +msgstr "تم تفعيل الملاحظة وإسنادها إليك بنجاح." + +#: apps/observations/views.py:966 +msgid "You don't have permission to respond to observations." +msgstr "ليس لديك صلاحية للرد على الملاحظات." + +#: apps/observations/views.py:995 +msgid "Response sent successfully." +msgstr "تم إرسال الرد بنجاح." + +#: apps/observations/views.py:1187 +msgid "You don't have permission to send observations to departments." +msgstr "ليس لديك صلاحية إرسال الملاحظات إلى الأقسام." + +#: apps/observations/views.py:1192 apps/observations/views.py:1455 +msgid "Activate this observation before sending it to a department." +msgstr "قم بتفعيل هذه الملاحظة قبل إرسالها إلى قسم." + +#: apps/observations/views.py:1316 +#, python-format +msgid "Observation sent to %(dept)s department email." +msgstr "تم إرسال الملاحظة إلى البريد الإلكتروني لقسم %(dept)s." + +#: apps/observations/views.py:1322 +#, python-format +msgid "Observation sent to %(dept)s. Department champions have been notified." +msgstr "تم إرسال الملاحظة إلى %(dept)s. تم إخطار أبطال القسم." + +#: apps/observations/views.py:1342 +msgid "You don't have permission to escalate observations." +msgstr "ليس لديك صلاحية تصعيد الملاحظات." + +#: apps/observations/views.py:1346 +msgid "Cannot escalate a closed, cancelled, or rejected observation." +msgstr "لا يمكن تصعيد ملاحظة مغلقة أو ملغاة أو مرفوضة." + +#: apps/observations/views.py:1422 +msgid "Observation escalated to {escalate_to_staff.get_full_name()}." +msgstr "تم تصعيد الملاحظة إلى {escalate_to_staff.get_full_name()}." + +#: apps/observations/views.py:1448 +msgid "You don't have permission to send this observation." +msgstr "ليس لديك صلاحية إرسال هذه الملاحظة." + +#: apps/observations/views.py:1601 +msgid "An error occurred while sending the observation." +msgstr "حدث خطأ أثناء إرسال الملاحظة." + +#: apps/observations/views.py:2089 +msgid "You don't have permission to delete observations." +msgstr "ليس لديك صلاحية حذف الملاحظات." + +#: apps/observations/views.py:2091 +msgid "Observation moved to trash." +msgstr "تم نقل الملاحظة إلى سلة المهملات." + +#: apps/observations/views.py:2103 +msgid "You don't have permission to restore observations." +msgstr "ليس لديك صلاحية استعادة الملاحظات." + +#: apps/observations/views.py:2105 +msgid "Observation restored successfully." +msgstr "تمت استعادة الملاحظة بنجاح." #: apps/organizations/forms.py:70 msgid "Leave blank to auto-generate" @@ -3260,28 +6107,549 @@ msgstr "اتركه فارغًا للإنشاء التلقائي" msgid "A patient with this MRN already exists." msgstr "يوجد مريض بهذا الرقم الطبي بالفعل." -#: apps/organizations/models.py:179 +#: apps/organizations/models.py:156 apps/organizations/models.py:305 +#: templates/complaints/complaint_detail.html:1056 +#: templates/complaints/complaint_form.html:564 +#: templates/complaints/inquiry_form.html:144 +#: templates/complaints/public_complaint_form.html:120 +#: templates/core/public_submit.html:497 +#: templates/observations/public_new.html:121 +#: templates/organizations/staff_import.html:82 msgid "Administrative" msgstr "إداري" -#: apps/organizations/models.py:219 apps/organizations/models.py:427 -#: templates/organizations/patient_list.html:223 +#: apps/organizations/models.py:163 templates/callcenter/inquiry_list.html:148 +#: templates/complaints/complaint_detail.html:1034 +#: templates/complaints/inquiry_list.html:154 +#: templates/complaints/public_complaint_form.html:100 +#: templates/complaints/public_inquiry_form.html:71 +#: templates/core/public_submit.html:479 templates/core/public_submit.html:512 +#: templates/observations/public_new.html:94 +#: templates/organizations/orgsection_form.html:121 +#: templates/surveys/comment_list.html:218 +#: templates/surveys/instance_list.html:104 +msgid "General" +msgstr "عام" + +#: apps/organizations/models.py:303 +#: templates/callcenter/complaint_form.html:148 +#: templates/dashboard/command_center.html:657 +#: templates/organizations/staff_import.html:80 +#: templates/physicians/department_overview.html:107 +#: templates/physicians/leaderboard.html:146 +#: templates/physicians/leaderboard.html:198 +#: templates/physicians/physician_list.html:192 +#: templates/physicians/physician_ratings_dashboard.html:455 +#: templates/physicians/ratings_list.html:197 +#: templates/physicians/specialization_overview.html:106 +msgid "Physician" +msgstr "طبيب" + +#: apps/organizations/models.py:304 +#: templates/organizations/staff_import.html:81 +msgid "Nurse" +msgstr "ممرض/ممرضة" + +#: apps/organizations/models.py:352 apps/organizations/models.py:560 +#: templates/organizations/department_staff_detail.html:416 +#: templates/organizations/patient_list.html:243 msgid "Male" msgstr "ذكر" -#: apps/organizations/models.py:219 apps/organizations/models.py:427 -#: templates/organizations/patient_list.html:224 +#: apps/organizations/models.py:352 apps/organizations/models.py:560 +#: templates/organizations/department_staff_detail.html:417 +#: templates/organizations/patient_list.html:244 msgid "Female" msgstr "أنثى" -#: apps/organizations/ui_views.py:1297 +#: apps/organizations/ui_views.py:445 apps/organizations/ui_views.py:517 +#: apps/organizations/ui_views.py:2795 +#: templates/appreciation/category_form.html:190 +#: templates/complaints/complaint_detail.html:558 +#: templates/complaints/partials/explanation_panel.html:16 +msgid "Primary" +msgstr "أساسي" + +#: apps/organizations/ui_views.py:1558 msgid "Create Patient" msgstr "إنشاء مريض" -#: apps/organizations/ui_views.py:1334 +#: apps/organizations/ui_views.py:1595 msgid "Edit Patient" msgstr "تعديل المريض" +#: apps/organizations/ui_views.py:1913 apps/organizations/ui_views.py:2289 +#: apps/organizations/ui_views.py:2384 apps/organizations/ui_views.py:2456 +#: apps/organizations/ui_views.py:2525 apps/organizations/ui_views.py:2649 +#: apps/organizations/ui_views.py:2715 apps/organizations/ui_views.py:2764 +msgid "You don't have permission to view this department." +msgstr "ليس لديك صلاحية عرض هذا القسم." + +#: apps/organizations/ui_views.py:2067 +msgid "Complaint Response (Re-submit)" +msgstr "الرد على الشكوى (إعادة تقديم)" + +#: apps/organizations/ui_views.py:2067 +#: templates/dashboard/staff_performance_detail.html:73 +msgid "Complaint Response" +msgstr "الاستجابة للشكاوى" + +#: apps/organizations/ui_views.py:2069 apps/organizations/ui_views.py:2098 +msgid "No title" +msgstr "بدون عنوان" + +#: apps/organizations/ui_views.py:2096 +#: templates/organizations/department_manager_review.html:4 +#: templates/organizations/department_manager_review.html:13 +msgid "Manager Review" +msgstr "مراجعة المدير" + +#: apps/organizations/ui_views.py:2117 +msgid "Complaint Explanation" +msgstr "شرح الشكوى" + +#: apps/organizations/ui_views.py:2135 +msgid "Observation Response" +msgstr "الرد على الملاحظة" + +#: apps/organizations/ui_views.py:2156 +#: templates/dashboard/staff_performance_detail.html:91 +msgid "Inquiry Response" +msgstr "الاستجابة للاستفسارات" + +#: apps/organizations/ui_views.py:2544 +msgid "This complaint does not belong to this department." +msgstr "هذه الشكوى لا تنتمي إلى هذا القسم." + +#: apps/organizations/ui_views.py:2666 +msgid "This inquiry does not belong to this department." +msgstr "هذا الاستفسار لا ينتمي إلى هذا القسم." + +#: apps/organizations/ui_views.py:2728 +msgid "This observation does not belong to this department." +msgstr "هذه الملاحظة لا تنتمي إلى هذا القسم." + +#: apps/organizations/ui_views.py:2861 +msgid "You don't have permission to update staff info." +msgstr "ليس لديك صلاحية لتحديث معلومات الموظفين." + +#: apps/organizations/ui_views.py:2883 +msgid "{field.replace('_', ' ').title()} is required." +msgstr "{field.replace('_', ' ').title()} مطلوب." + +#: apps/organizations/ui_views.py:2891 +msgid "Staff info updated successfully." +msgstr "تم تحديث معلومات الموظفين بنجاح." + +#: apps/organizations/ui_views.py:2893 +msgid "No changes detected." +msgstr "لم يتم اكتشاف أي تغييرات." + +#: apps/organizations/ui_views.py:3066 apps/organizations/ui_views.py:3138 +#: apps/organizations/ui_views.py:3188 +#: templates/appreciation/appreciation_list.html:208 +#: templates/observations/observation_detail.html:50 +#: templates/observations/observation_list.html:359 +#: templates/organizations/department_detail.html:919 +#: templates/organizations/department_detail.html:973 +#: templates/organizations/department_observation_detail.html:107 +#: templates/organizations/department_staff_detail.html:307 +msgid "Anonymous" +msgstr "مجهول" + +#: apps/organizations/ui_views.py:3440 +msgid "You don't have permission to set the respondent." +msgstr "ليس لديك صلاحية تعيين المستجيب." + +#: apps/organizations/ui_views.py:3447 apps/organizations/ui_views.py:3517 +msgid "Invalid staff member selected." +msgstr "عضو الطاقم المحدد غير صالح." + +#: apps/organizations/ui_views.py:3453 +msgid "" +"{respondent.get_full_name()} does not have an email address. Add an email " +"first." +msgstr "" +"{respondent.get_full_name()} ليس لديه عنوان بريد إلكتروني. أضف بريدًا " +"إلكترونيًا أولاً." + +#: apps/organizations/ui_views.py:3460 +msgid "" +"{respondent.get_full_name()} does not have a user account. Create a user " +"account first." +msgstr "" +"ليس لدى {respondent.get_full_name()} حساب مستخدم. قم بإنشاء حساب مستخدم أولاً." + +#: apps/organizations/ui_views.py:3471 +msgid "Champion set to {respondent.get_full_name()}. Champion role assigned." +msgstr "تم تعيين المشرف إلى {respondent.get_full_name()}. تم تعيين دور المشرف." + +#: apps/organizations/ui_views.py:3476 +msgid "Champion removed." +msgstr "تم إزالة المشرف." + +#: apps/organizations/ui_views.py:3498 +msgid "You don't have permission to set department roles." +msgstr "ليس لديك صلاحية تعيين أدوار القسم." + +#: apps/organizations/ui_views.py:3504 +msgid "Invalid role." +msgstr "دور غير صالح." + +#: apps/organizations/ui_views.py:3527 +msgid "" +"Selected staff {staff.get_full_name()} has no email. Add an email and create " +"a user account first." +msgstr "" +"الموظف المحدد {staff.get_full_name()} ليس لديه بريد إلكتروني. أضف بريدًا " +"إلكترونيًا وأنشئ حساب مستخدم أولاً." + +#: apps/organizations/ui_views.py:3538 +msgid "" +"Manager set to {staff.get_full_name()}. User account created with Department " +"Manager role." +msgstr "" +"تم تعيين المدير إلى {staff.get_full_name()}. تم إنشاء حساب المستخدم بدور " +"مدير القسم." + +#: apps/organizations/ui_views.py:3541 +#, python-brace-format +msgid "Could not create user account: {e}" +msgstr "تعذر إنشاء حساب المستخدم: {e}" + +#: apps/organizations/ui_views.py:3546 +msgid "Manager set to {staff.get_full_name()}." +msgstr "تم تعيين المدير إلى {staff.get_full_name()}." + +#: apps/organizations/ui_views.py:3550 +msgid "{role_label} set to {staff.get_full_name()}." +msgstr "تم تعيين {role_label} إلى {staff.get_full_name()}." + +#: apps/organizations/ui_views.py:3558 +#, python-brace-format +msgid "{role_label} removed." +msgstr "تمت إزالة {role_label}." + +#: apps/organizations/ui_views.py:3571 +msgid "You don't have permission to import staff." +msgstr "ليس لديك صلاحية لاستيراد الموظفين." + +#: apps/organizations/ui_views.py:3576 +msgid "No hospital associated with your account." +msgstr "لا يوجد مستشفى مرتبط بحسابك." + +#: apps/organizations/ui_views.py:3587 +msgid "Please select a CSV file to upload." +msgstr "يرجى تحديد ملف CSV للتحميل." + +#: apps/organizations/ui_views.py:3591 +msgid "Please upload a CSV file (.csv extension)." +msgstr "يرجى تحميل ملف CSV بامتداد .csv." + +#: apps/organizations/ui_views.py:3607 +msgid "Could not decode the file. Please save as UTF-8 CSV." +msgstr "تعذر فك تشفير الملف. يرجى الحفظ بتنسيق UTF-8 CSV." + +#: apps/organizations/ui_views.py:3616 +msgid "Missing required columns: {', '.join(missing)}" +msgstr "الأعمدة المطلوبة مفقودة: {', '.join(missing)}" + +#: apps/organizations/ui_views.py:3648 +msgid "Import failed: {str(e)}" +msgstr "فشل الاستيراد: {str(e)}" + +#: apps/organizations/ui_views.py:3966 apps/projects/ui_views.py:1097 +#: apps/projects/ui_views.py:1140 apps/projects/ui_views.py:1207 +#: apps/projects/ui_views.py:1251 apps/projects/ui_views.py:1319 +msgid "You don't have permission." +msgstr "ليس لديك صلاحية." + +#: apps/organizations/ui_views.py:4024 +msgid "Only the department manager can review champion responses." +msgstr "يمكن لمدير القسم فقط مراجعة استجابات الأبطال." + +#: apps/organizations/ui_views.py:4028 +msgid "No champion response submitted yet." +msgstr "لم يتم تقديم رد البطل بعد." + +#: apps/organizations/ui_views.py:4032 +msgid "This response has already been approved." +msgstr "تمت الموافقة على هذا الرد بالفعل." + +#: apps/organizations/ui_views.py:4056 +msgid "Invalid action." +msgstr "إجراء غير صالح." + +#: apps/organizations/ui_views.py:4062 +#: templates/organizations/department_manager_review.html:290 +msgid "Please provide a rejection reason." +msgstr "يرجى تقديم سبب الرفض." + +#: apps/organizations/ui_views.py:4145 +msgid "Response approved and forwarded to the PX team." +msgstr "تمت الموافقة على الاستجابة وإرسالها إلى فريق PX." + +#: apps/organizations/ui_views.py:4212 +msgid "" +"Response rejected. The champion has been notified to submit a new response." +msgstr "تم رفض الرد. تم إبلاغ البطل لتقديم رد جديد." + +#: apps/organizations/ui_views.py:4258 apps/organizations/ui_views.py:4283 +#: apps/organizations/ui_views.py:4337 apps/organizations/ui_views.py:4377 +msgid "You don't have permission to manage review questions." +msgstr "ليس لديك صلاحية إدارة أسئلة المراجعة." + +#: apps/organizations/ui_views.py:4263 apps/organizations/ui_views.py:4288 +msgid "No hospital context found." +msgstr "لم يتم العثور على سياق المستشفى." + +#: apps/organizations/ui_views.py:4299 +msgid "English text is required." +msgstr "النص الإنجليزي مطلوب." + +#: apps/organizations/ui_views.py:4321 +msgid "Question created successfully." +msgstr "تم إنشاء السؤال بنجاح." + +#: apps/organizations/ui_views.py:4361 +msgid "Question updated successfully." +msgstr "تم تحديث السؤال بنجاح." + +#: apps/organizations/ui_views.py:4383 +msgid "Question deleted." +msgstr "تم حذف السؤال." + +#: apps/organizations/ui_views.py:4493 +msgid "You don't have permission to view this section." +msgstr "ليس لديك صلاحية لعرض هذا القسم." + +#: apps/presentations/models.py:8 +msgid "Healthcare Modern" +msgstr "Healthcare Modern" + +#: apps/presentations/models.py:9 +msgid "Corporate Navy" +msgstr "البحرية المؤسسية" + +#: apps/presentations/models.py:10 +msgid "Dark Command Center" +msgstr "مركز القيادة الداكن" + +#: apps/presentations/models.py:14 +msgid "Cover" +msgstr "غلاف" + +#: apps/presentations/models.py:15 +msgid "Section Divider" +msgstr "فاصل الأقسام" + +#: apps/presentations/models.py:16 +msgid "KPI Dashboard" +msgstr "لوحة مؤشرات الأداء الرئيسية" + +#: apps/presentations/models.py:17 +msgid "Full Chart" +msgstr "المخطط الكامل" + +#: apps/presentations/models.py:18 +msgid "Chart + Metrics" +msgstr "المخطط والمقاييس" + +#: apps/presentations/models.py:19 +msgid "Data Table" +msgstr "جدول البيانات" + +#: apps/presentations/models.py:20 +msgid "Two Column" +msgstr "عمودان" + +#: apps/presentations/models.py:21 +msgid "Quote / Callout" +msgstr "اقتباس / إشارة" + +#: apps/presentations/models.py:22 +#: templates/complaints/complaint_detail.html:274 +#: templates/complaints/inquiry_detail.html:127 +#: templates/complaints/partials/inquiry_timeline_panel.html:3 +#: templates/complaints/partials/timeline_panel.html:3 +#: templates/observations/observation_detail.html:73 +#: templates/observations/partials/observation_timeline_panel.html:3 +#: templates/projects/project_list.html:170 +#: templates/px_sources/communication_request_detail.html:274 +msgid "Timeline" +msgstr "الجدول الزمني" + +#: apps/presentations/models.py:23 +msgid "Comparison" +msgstr "المقارنة" + +#: apps/presentations/models.py:24 +msgid "Team / Department Grid" +msgstr "شبكة الفريق / القسم" + +#: apps/presentations/models.py:25 +msgid "Closing" +msgstr "إغلاق" + +#: apps/presentations/models.py:29 +#: templates/appreciation/appreciation_list.html:92 +#: templates/appreciation/appreciation_list.html:169 +#: templates/organizations/department_detail.html:494 +#: templates/rca/rca_list.html:100 templates/rca/rca_list.html:154 +msgid "Draft" +msgstr "مسودة" + +#: apps/presentations/models.py:30 +#: templates/social/social_comment_detail.html:216 +msgid "Published" +msgstr "منشور" + +#: apps/presentations/models.py:31 +msgid "Archived" +msgstr "مؤرشف" + +#: apps/presentations/models.py:53 +msgid "Type of report (e.g., quarterly, monthly, custom)" +msgstr "نوع التقرير (على سبيل المثال، ربع سنوي، شهري، مخصص)" + +#: apps/presentations/models.py:115 +msgid "" +"Layout-specific content. Structure varies by slide type: " +"kpi_dashboard={metrics:[...]}, full_chart={chart_config:{...}}, " +"data_table={headers:[...], rows:[...]}, etc." +msgstr "" +"محتوى خاص بالتخطيط. يختلف الهيكل حسب نوع الشريحة: kpi_dashboard={metrics:" +"[...]}، full_chart={chart_config:{...}}، data_table={headers:[...]، rows:" +"[...]}، إلخ." + +#: apps/presentations/models.py:146 +msgid "Key in REPORT_DATA_SOURCES registry" +msgstr "المفتاح في سجل REPORT_DATA_SOURCES" + +#: apps/presentations/models.py:156 +msgid "Raw AI analysis of the reference PDF" +msgstr "تحليل الذكاء الاصطناعي الخام لملف PDF المرجعي" + +#: apps/presentations/models.py:161 +msgid "Theme colors, row colors, fonts" +msgstr "ألوان السمة، ألوان الصفوف، الخطوط" + +#: apps/presentations/models.py:165 +msgid "" +"Prompt template for AI insight generation. Use {{ data_summary }} " +"placeholder." +msgstr "" +"قالب المطالبة لتوليد الرؤى بالذكاء الاصطناعي. استخدم العنصر النائب " +"{{ data_summary }}." + +#: apps/presentations/models.py:175 +msgid "Null = available for all hospitals" +msgstr "قيمة فارغة = متاح لجميع المستشفيات" + +#: apps/presentations/models.py:214 +msgid "For section dividers: e.g. \"01\", \"02\"" +msgstr "لفواصل الأقسام: على سبيل المثال \"01\"، \"02\"" + +#: apps/presentations/models.py:219 apps/presentations/models.py:224 +msgid "Supports {{ variable }} substitution" +msgstr "يدعم استبدال {{ variable }}" + +#: apps/presentations/models.py:231 +msgid "How data maps to slide content. Structure depends on layout type." +msgstr "كيفية تعيين البيانات إلى محتوى الشريحة. يعتمد الهيكل على نوع التخطيط." + +#: apps/presentations/models.py:239 +msgid "" +"Data key to repeat over, e.g. \"by_department\". Creates one slide per item." +msgstr "" +"مفتاح البيانات للتكرار عليه، مثل \"by_department\". ينشئ شريحة واحدة لكل " +"عنصر." + +#: apps/presentations/models.py:247 +msgid "Key in repeat item for slide title, e.g. \"department_name\"" +msgstr "مفتاح في عنصر التكرار لعنوان الشريحة، مثل \"department_name\"" + +#: apps/presentations/models.py:252 +msgid "Subtitle template for repeated slides. {{ item.X }} available." +msgstr "قالب النص الفرعي للشرائح المتكررة. {{ item.X }} متاح." + +#: apps/presentations/models.py:256 +msgid "Max data rows per slide (tables split across slides)" +msgstr "الحد الأقصى لصفوف البيانات لكل شريحة (تقسيم الجداول عبر الشرائح)" + +#: apps/presentations/models.py:261 +msgid "Per-slide style overrides (row colors, etc.)" +msgstr "تجاوزات النمط لكل شريحة (ألوان الصفوف، إلخ)" + +#: apps/presentations/models.py:265 +msgid "Speaker notes template with {{ variable }} support" +msgstr "قالب ملاحظات المتحدث مع دعم {{ variable }}" + +#: apps/presentations/views.py:67 +msgid "Presentation created successfully." +msgstr "تم إنشاء العرض التقديمي بنجاح." + +#: apps/presentations/views.py:107 +msgid "Presentation updated." +msgstr "تم تحديث العرض التقديمي." + +#: apps/presentations/views.py:123 +msgid "Presentation deleted." +msgstr "تم حذف العرض التقديمي." + +#: apps/presentations/views.py:184 apps/presentations/views.py:479 +msgid "Slide added." +msgstr "تمت إضافة الشريحة." + +#: apps/presentations/views.py:207 apps/presentations/views.py:505 +msgid "Slide updated." +msgstr "تم تحديث الشريحة." + +#: apps/presentations/views.py:229 apps/presentations/views.py:523 +msgid "Slide deleted." +msgstr "تم حذف الشريحة." + +#: apps/presentations/views.py:318 apps/presentations/views.py:553 +msgid "Please select a hospital." +msgstr "يرجى اختيار مستشفى." + +#: apps/presentations/views.py:337 +#, python-format +msgid "Presentation generated successfully with %d slides." +msgstr "تم إنشاء العرض التقديمي بنجاح مع %d شريحة." + +#: apps/presentations/views.py:340 +#, python-format +msgid "Error generating presentation: %s" +msgstr "خطأ في إنشاء العرض التقديمي: %s" + +#: apps/presentations/views.py:392 +msgid "Template created and PDF parsed successfully." +msgstr "تم إنشاء القالب وتحليل ملف PDF بنجاح." + +#: apps/presentations/views.py:394 +#, python-format +msgid "Template created but PDF parsing failed: %s" +msgstr "تم إنشاء القالب ولكن فشل تحليل PDF: %s" + +#: apps/presentations/views.py:396 +msgid "Template created. Upload a reference PDF to auto-generate slides." +msgstr "تم إنشاء القالب. قم بتحميل PDF مرجعي لإنشاء الشرائح تلقائيًا." + +#: apps/presentations/views.py:426 +msgid "Template deleted." +msgstr "تم حذف القالب." + +#: apps/presentations/views.py:564 +#, python-format +msgid "Report generated with %d slides." +msgstr "تم إنشاء التقرير بعدد %d شريحة." + +#: apps/presentations/views.py:567 +#, python-format +msgid "Error generating report: %s" +msgstr "خطأ في إنشاء التقرير: %s" + #: apps/projects/forms.py:46 msgid "Project name" msgstr "اسم المشروع" @@ -3294,335 +6662,513 @@ msgstr "اسم المشروع" msgid "Describe the project objectives and scope..." msgstr "صف أهداف المشروع ونطاقه..." -#: apps/projects/forms.py:104 +#: apps/projects/forms.py:106 msgid "Document project outcomes and results..." msgstr "توثيق نتائج ومحصلة المشروع..." -#: apps/projects/forms.py:158 apps/projects/forms.py:379 +#: apps/projects/forms.py:159 apps/projects/forms.py:429 msgid "Task title" msgstr "عنوان المهمة" -#: apps/projects/forms.py:165 +#: apps/projects/forms.py:166 msgid "Task description..." msgstr "وصف المهمة..." -#: apps/projects/forms.py:228 +#: apps/projects/forms.py:277 msgid "Template name" msgstr "اسم القالب" -#: apps/projects/forms.py:234 +#: apps/projects/forms.py:283 msgid "اسم القالب" msgstr "اسم القالب" -#: apps/projects/forms.py:242 +#: apps/projects/forms.py:291 msgid "Describe the project template..." msgstr "اشرح قالب المشروع..." -#: apps/projects/forms.py:268 +#: apps/projects/forms.py:317 #: templates/projects/template_delete_confirm.html:27 #: templates/projects/template_detail.html:103 msgid "Global (All Hospitals)" msgstr "عالمي (جميع المستشفيات)" -#: apps/projects/forms.py:302 +#: apps/projects/forms.py:351 msgid "Blank Project" msgstr "مشروع فارغ" -#: apps/projects/forms.py:303 templates/projects/convert_action.html:41 +#: apps/projects/forms.py:352 templates/projects/convert_action.html:41 msgid "Project Template" msgstr "قالب المشروع" -#: apps/projects/forms.py:313 templates/projects/convert_action.html:53 -#: templates/projects/project_form.html:165 +#: apps/projects/forms.py:362 templates/projects/convert_action.html:53 +#: templates/projects/project_form.html:171 msgid "Project Name" msgstr "اسم المشروع" -#: apps/projects/forms.py:317 +#: apps/projects/forms.py:366 msgid "Enter project name" msgstr "أدخل اسم المشروع" -#: apps/projects/forms.py:325 templates/projects/convert_action.html:65 -#: templates/projects/project_detail.html:192 -#: templates/projects/project_form.html:229 +#: apps/projects/forms.py:374 templates/projects/convert_action.html:65 +#: templates/projects/project_form.html:235 #: templates/projects/project_list.html:167 msgid "Project Lead" msgstr "قائد المشروع" -#: apps/projects/forms.py:335 templates/projects/convert_action.html:76 -#: templates/projects/project_form.html:276 +#: apps/projects/forms.py:384 templates/projects/convert_action.html:76 +#: templates/projects/project_form.html:282 msgid "Target Completion Date" msgstr "تاريخ الإنجاز المستهدف" -#: apps/projects/ui_views.py:110 +#: apps/projects/models.py:19 +msgid "Plan" +msgstr "خطة" + +#: apps/projects/models.py:20 +msgid "Do" +msgstr "تنفيذ" + +#: apps/projects/models.py:21 +msgid "Check" +msgstr "تحقق" + +#: apps/projects/models.py:22 templates/journeys/template_form.html:268 +msgid "Act" +msgstr "تعديل" + +#: apps/projects/models.py:26 +msgid "Find" +msgstr "بحث" + +#: apps/projects/models.py:27 +msgid "Organize" +msgstr "تنظيم" + +#: apps/projects/models.py:28 +msgid "Clarify" +msgstr "توضيح" + +#: apps/projects/models.py:29 +msgid "Understand" +msgstr "فهم" + +#: apps/projects/models.py:30 +msgid "Select" +msgstr "اختيار" + +#: apps/projects/ui_views.py:343 msgid "You don't have permission to view this project." msgstr "ليس لديك إذن لعرض هذا المشروع." -#: apps/projects/ui_views.py:137 apps/projects/ui_views.py:682 +#: apps/projects/ui_views.py:400 apps/projects/ui_views.py:1016 msgid "You don't have permission to create projects." msgstr "ليس لديك إذن لإنشاء مشاريع." -#: apps/projects/ui_views.py:215 +#: apps/projects/ui_views.py:510 #, python-format msgid "QI Project created successfully with %(count)d task(s) from template." msgstr "تم إنشاء مشروع الجودة والتحسين بنجاح مع %(count)d مهمة من القالب." -#: apps/projects/ui_views.py:218 +#: apps/projects/ui_views.py:513 msgid "QI Project created successfully." msgstr "تم إنشاء مشروع الجودة والتحسين بنجاح." -#: apps/projects/ui_views.py:241 +#: apps/projects/ui_views.py:538 apps/projects/ui_views.py:1145 +#: apps/projects/ui_views.py:1256 msgid "You don't have permission to edit this project." msgstr "ليس لديك إذن لتعديل هذا المشروع." -#: apps/projects/ui_views.py:246 +#: apps/projects/ui_views.py:543 msgid "You don't have permission to edit projects." msgstr "ليس لديك إذن لتعديل المشاريع." -#: apps/projects/ui_views.py:253 +#: apps/projects/ui_views.py:550 msgid "QI Project updated successfully." msgstr "تم تحديث مشروع الجودة والتحسين بنجاح." -#: apps/projects/ui_views.py:276 +#: apps/projects/ui_views.py:573 msgid "You don't have permission to delete projects." msgstr "ليس لديك إذن لحذف المشاريع." -#: apps/projects/ui_views.py:280 +#: apps/projects/ui_views.py:577 msgid "You don't have permission to delete this project." msgstr "ليس لديك إذن لحذف هذا المشروع." -#: apps/projects/ui_views.py:286 +#: apps/projects/ui_views.py:583 #, python-format msgid "Project \"%(name)s\" deleted successfully." msgstr "تم حذف المشروع \"%(name)s\" بنجاح." -#: apps/projects/ui_views.py:310 +#: apps/projects/ui_views.py:607 msgid "You don't have permission to create templates from this project." msgstr "ليس لديك الإذن لإنشاء قوالب من هذا المشروع." -#: apps/projects/ui_views.py:319 +#: apps/projects/ui_views.py:616 msgid "Please provide a template name." msgstr "يرجى تقديم اسم للقالب." -#: apps/projects/ui_views.py:347 +#: apps/projects/ui_views.py:644 #, python-format msgid "Template \"%(name)s\" created successfully with %(count)d task(s)." msgstr "تم إنشاء القالب \"%(name)s\" بنجاح مع %(count)d مهمة." -#: apps/projects/ui_views.py:374 +#: apps/projects/ui_views.py:688 msgid "You don't have permission to add tasks to this project." msgstr "ليس لديك الإذن لإضافة مهام إلى هذا المشروع." -#: apps/projects/ui_views.py:383 +#: apps/projects/ui_views.py:697 msgid "Task added successfully." msgstr "تمت إضافة المهمة بنجاح." -#: apps/projects/ui_views.py:407 +#: apps/projects/ui_views.py:731 msgid "You don't have permission to edit tasks in this project." msgstr "ليس لديك الإذن لتعديل المهام في هذا المشروع." -#: apps/projects/ui_views.py:420 +#: apps/projects/ui_views.py:744 msgid "Task updated successfully." msgstr "تم تحديث المهمة بنجاح." -#: apps/projects/ui_views.py:445 +#: apps/projects/ui_views.py:771 msgid "You don't have permission to delete tasks in this project." msgstr "ليس لديك إذن لحذف المهام في هذا المشروع." -#: apps/projects/ui_views.py:450 +#: apps/projects/ui_views.py:778 msgid "Task deleted successfully." msgstr "تم حذف المهمة بنجاح." -#: apps/projects/ui_views.py:471 +#: apps/projects/ui_views.py:800 +msgid "You don't have permission to update task status." +msgstr "ليس لديك صلاحية تحديث حالة المهمة." + +#: apps/projects/ui_views.py:805 msgid "You don't have permission to update tasks in this project." msgstr "ليس لديك إذن لتحديث المهام في هذا المشروع." -#: apps/projects/ui_views.py:484 +#: apps/projects/ui_views.py:818 msgid "Task status updated." msgstr "تم تحديث حالة المهمة." -#: apps/projects/ui_views.py:501 apps/projects/ui_views.py:540 +#: apps/projects/ui_views.py:835 apps/projects/ui_views.py:874 msgid "You don't have permission to view templates." msgstr "ليس لديك إذن لعرض القوالب." -#: apps/projects/ui_views.py:552 +#: apps/projects/ui_views.py:886 msgid "You don't have permission to view this template." msgstr "ليس لديك إذن لعرض هذا القالب." -#: apps/projects/ui_views.py:590 +#: apps/projects/ui_views.py:924 msgid "Project template created successfully." msgstr "تم إنشاء قالب المشروع بنجاح." -#: apps/projects/ui_views.py:618 +#: apps/projects/ui_views.py:952 msgid "You don't have permission to edit this template." msgstr "ليس لديك إذن لتعديل هذا القالب." -#: apps/projects/ui_views.py:627 +#: apps/projects/ui_views.py:961 msgid "Project template updated successfully." msgstr "تم تحديث قالب المشروع بنجاح." -#: apps/projects/ui_views.py:653 +#: apps/projects/ui_views.py:987 msgid "You don't have permission to delete this template." msgstr "ليس لديك الصلاحية لحذف هذا القالب." -#: apps/projects/ui_views.py:659 +#: apps/projects/ui_views.py:993 #, python-format msgid "Template \"%(name)s\" deleted successfully." msgstr "تم حذف القالب \"%(name)s\" بنجاح." -#: apps/projects/ui_views.py:689 +#: apps/projects/ui_views.py:1023 msgid "You don't have permission to convert this action." msgstr "ليس لديك الصلاحية لتحويل هذا الإجراء." -#: apps/projects/ui_views.py:735 +#: apps/projects/ui_views.py:1069 msgid "PX Action converted to QI Project successfully." msgstr "تم تحويل إجراء المريض بنجاح إلى مشروع الجودة." +#: apps/projects/ui_views.py:1090 apps/projects/ui_views.py:1133 +msgid "Invalid PDCA phase." +msgstr "مرحلة PDCA غير صالحة." + +#: apps/projects/ui_views.py:1174 apps/projects/ui_views.py:1286 +#, python-format +msgid "%(phase)s phase updated successfully." +msgstr "تم تحديث مرحلة %(phase)s بنجاح." + +#: apps/projects/ui_views.py:1200 apps/projects/ui_views.py:1244 +msgid "Invalid FOCUS phase." +msgstr "مرحلة FOCUS غير صالحة." + +#: apps/projects/ui_views.py:1413 +msgid "You don't have permission to delete tasks." +msgstr "ليس لديك صلاحية لحذف المهام." + +#: apps/projects/ui_views.py:1441 +msgid "You don't have permission to add tasks." +msgstr "ليس لديك صلاحية لإضافة المهام." + +#: apps/projects/ui_views.py:1447 apps/projects/ui_views.py:1456 +#: apps/projects/ui_views.py:1617 apps/projects/ui_views.py:1661 +#: apps/projects/ui_views.py:1717 apps/projects/ui_views.py:1726 +msgid "Invalid phase" +msgstr "مرحلة غير صالحة." + +#: apps/projects/ui_views.py:1464 apps/projects/ui_views.py:1734 +msgid "Invalid phase type" +msgstr "نوع المرحلة غير صالح" + +#: apps/projects/ui_views.py:1549 +msgid "You don't have permission to edit tasks." +msgstr "ليس لديك صلاحية لتعديل المهام." + +#: apps/projects/ui_views.py:1713 +msgid "You don't have permission to edit phases." +msgstr "ليس لديك صلاحية لتعديل المراحل." + #: apps/px_sources/decorators.py:78 msgid "Access denied. Source users cannot access admin pages." msgstr "تم رفض الوصول. لا يمكن للمستخدمين المصدر الوصول إلى صفحات الإدارة." -#: apps/px_sources/models.py:39 +#: apps/px_sources/models.py:41 msgid "Partner" msgstr "شريك" -#: apps/px_sources/models.py:40 +#: apps/px_sources/models.py:42 msgid "Government" msgstr "الحكومة" -#: apps/px_sources/ui_views.py:139 +#: apps/px_sources/models.py:277 +#: templates/complaints/government_ticket_detail.html:82 +#: templates/complaints/government_ticket_list.html:110 +#: templates/complaints/government_ticket_list.html:113 +#: templates/complaints/government_ticket_list.html:147 +msgid "Converted" +msgstr "تم التحويل" + +#: apps/px_sources/models.py:336 +#: templates/px_sources/source_user_create_communication_request.html:49 +msgid "Complaint Follow-up" +msgstr "متابعة الشكوى" + +#: apps/px_sources/models.py:337 +#: templates/complaints/public_inquiry_form.html:116 +#: templates/core/public_submit.html:444 +#: templates/px_sources/source_user_create_communication_request.html:50 +msgid "General Inquiry" +msgstr "استفسار عام" + +#: apps/px_sources/models.py:338 +#: templates/px_sources/source_user_create_communication_request.html:51 +msgid "Feedback Sharing" +msgstr "مشاركة الملاحظات" + +#: apps/px_sources/models.py:339 +#: templates/px_sources/source_user_create_communication_request.html:52 +msgid "Urgent Matter" +msgstr "أمر عاجل" + +#: apps/px_sources/ui_views.py:142 msgid "You don't have permission to create sources." msgstr "ليس لديك الصلاحية لإنشاء المصادر." -#: apps/px_sources/ui_views.py:156 +#: apps/px_sources/ui_views.py:159 msgid "Source created successfully!" msgstr "تم إنشاء المصدر بنجاح!" -#: apps/px_sources/ui_views.py:160 +#: apps/px_sources/ui_views.py:163 msgid "Error creating source: {}" msgstr "حدث خطأ أثناء إنشاء المصدر: {}" -#: apps/px_sources/ui_views.py:176 +#: apps/px_sources/ui_views.py:179 msgid "You don't have permission to edit sources." msgstr "ليس لديك صلاحية تعديل المصادر." -#: apps/px_sources/ui_views.py:193 +#: apps/px_sources/ui_views.py:196 msgid "Source updated successfully!" msgstr "تم تحديث المصدر بنجاح!" -#: apps/px_sources/ui_views.py:197 +#: apps/px_sources/ui_views.py:200 msgid "Error updating source: {}" msgstr "حدث خطأ أثناء تحديث المصدر: {}" -#: apps/px_sources/ui_views.py:214 +#: apps/px_sources/ui_views.py:217 msgid "You don't have permission to delete sources." msgstr "ليس لديك صلاحية حذف المصادر." -#: apps/px_sources/ui_views.py:222 +#: apps/px_sources/ui_views.py:225 msgid "Source '{}' deleted successfully!" msgstr "تم حذف المصدر '{}' بنجاح!" -#: apps/px_sources/ui_views.py:241 +#: apps/px_sources/ui_views.py:244 msgid "You don't have permission to toggle source status." msgstr "ليس لديك إذن لتغيير حالة المصدر." -#: apps/px_sources/ui_views.py:247 +#: apps/px_sources/ui_views.py:250 msgid "Invalid request method." msgstr "طريقة الطلب غير صالحة." -#: apps/px_sources/ui_views.py:254 +#: apps/px_sources/ui_views.py:257 msgid "activated" msgstr "مفعل" -#: apps/px_sources/ui_views.py:254 +#: apps/px_sources/ui_views.py:257 msgid "deactivated" msgstr "غير مفعل" -#: apps/px_sources/ui_views.py:255 +#: apps/px_sources/ui_views.py:258 msgid "Source '{}' {} successfully." msgstr "تم تفعيل المصدر '{}' بنجاح." -#: apps/px_sources/ui_views.py:314 apps/px_sources/ui_views.py:605 -#: apps/px_sources/ui_views.py:690 +#: apps/px_sources/ui_views.py:317 apps/px_sources/ui_views.py:617 +#: apps/px_sources/ui_views.py:702 apps/px_sources/ui_views.py:1210 +#: apps/px_sources/ui_views.py:1271 msgid "" "You are not assigned as a source user. Please contact your administrator." msgstr "لم يتم تعيينك كمستخدم مصدر. يرجى التواصل مع مدير النظام." -#: apps/px_sources/ui_views.py:402 +#: apps/px_sources/ui_views.py:407 msgid "Please select a user." msgstr "يرجى اختيار مستخدم." -#: apps/px_sources/ui_views.py:409 +#: apps/px_sources/ui_views.py:414 msgid "User already has a source profile. A user can only manage one source." msgstr "المستخدم لديه ملف مصدر بالفعل. يمكن للمستخدم إدارة مصدر واحد فقط." -#: apps/px_sources/ui_views.py:423 +#: apps/px_sources/ui_views.py:428 msgid "Email is required." msgstr "البريد الإلكتروني مطلوب." -#: apps/px_sources/ui_views.py:425 -msgid "A user with this email already exists." -msgstr "يوجد مستخدم بهذا البريد الإلكتروني بالفعل." - -#: apps/px_sources/ui_views.py:428 +#: apps/px_sources/ui_views.py:433 msgid "First name is required." msgstr "الاسم الأول مطلوب." -#: apps/px_sources/ui_views.py:431 +#: apps/px_sources/ui_views.py:436 msgid "Last name is required." msgstr "اسم العائلة مطلوب." -#: apps/px_sources/ui_views.py:434 +#: apps/px_sources/ui_views.py:439 templates/config/hospital_users.html:595 msgid "Password is required." msgstr "كلمة المرور مطلوبة." -#: apps/px_sources/ui_views.py:436 +#: apps/px_sources/ui_views.py:441 msgid "Password must be at least 8 characters." msgstr "يجب أن تكون كلمة المرور بطول 8 أحرف على الأقل." -#: apps/px_sources/ui_views.py:439 -msgid "Passwords do not match." -msgstr "كلمات المرور غير متطابقة." - -#: apps/px_sources/ui_views.py:465 +#: apps/px_sources/ui_views.py:473 msgid "New user created successfully!" msgstr "تم إنشاء المستخدم الجديد بنجاح!" -#: apps/px_sources/ui_views.py:486 +#: apps/px_sources/ui_views.py:496 msgid "Source user created successfully!" msgstr "تم إنشاء مستخدم المصدر بنجاح!" -#: apps/px_sources/ui_views.py:490 +#: apps/px_sources/ui_views.py:500 msgid "Error creating source user: {}" msgstr "حدث خطأ أثناء إنشاء مستخدم المصدر: {}" -#: apps/px_sources/ui_views.py:511 +#: apps/px_sources/ui_views.py:521 msgid "You don't have permission to edit source users." msgstr "ليس لديك صلاحية تعديل مستخدمي المصادر." -#: apps/px_sources/ui_views.py:524 +#: apps/px_sources/ui_views.py:536 msgid "Source user updated successfully!" msgstr "تم تحديث مستخدم المصدر بنجاح!" -#: apps/px_sources/ui_views.py:528 +#: apps/px_sources/ui_views.py:540 msgid "Error updating source user: {}" msgstr "حدث خطأ أثناء تحديث مستخدم المصدر: {}" -#: apps/px_sources/ui_views.py:546 +#: apps/px_sources/ui_views.py:558 msgid "You don't have permission to delete source users." msgstr "ليس لديك صلاحية حذف مستخدمي المصادر." -#: apps/px_sources/ui_views.py:555 +#: apps/px_sources/ui_views.py:567 msgid "Source user '{}' deleted successfully!" msgstr "تم حذف مستخدم المصدر '{}' بنجاح!" -#: apps/px_sources/ui_views.py:780 +#: apps/px_sources/ui_views.py:812 msgid "You don't have permission to create complaints." msgstr "ليس لديك إذن لإنشاء الشكاوى." -#: apps/px_sources/ui_views.py:998 +#: apps/px_sources/ui_views.py:1027 msgid "You don't have permission to create inquiries." msgstr "ليس لديك إذن لإنشاء الاستفسارات." +#: apps/px_sources/ui_views.py:1114 +msgid "You don't have permission to create source complaints." +msgstr "ليس لديك صلاحية لإنشاء شكاوى المصدر." + +#: apps/px_sources/ui_views.py:1121 +msgid "Subject and description are required." +msgstr "الموضوع والوصف مطلوبان." + +#: apps/px_sources/ui_views.py:1134 +msgid "Source complaint created successfully." +msgstr "تم إنشاء شكوى المصدر بنجاح." + +#: apps/px_sources/ui_views.py:1146 +msgid "You don't have permission to convert source complaints." +msgstr "ليس لديك صلاحية لتحويل شكاوى المصدر." + +#: apps/px_sources/ui_views.py:1150 +msgid "Closed source complaints cannot be converted." +msgstr "لا يمكن تحويل شكاوى المصدر المغلقة." + +#: apps/px_sources/ui_views.py:1161 +msgid "Title and description are required." +msgstr "العنوان والوصف مطلوبان." + +#: apps/px_sources/ui_views.py:1188 +#, python-brace-format +msgid "Converted to system complaint: {complaint.reference_number}" +msgstr "تم التحويل إلى شكوى النظام: {complaint.reference_number}" + +#: apps/px_sources/ui_views.py:1329 +msgid "You don't have permission to create observations." +msgstr "ليس لديك صلاحية لإنشاء الملاحظات." + +#: apps/px_sources/ui_views.py:1365 +#, python-format +msgid "Observation submitted successfully! Tracking code: %s" +msgstr "تم إرسال الملاحظة بنجاح! رمز التتبع: %s" + +#: apps/px_sources/ui_views.py:1368 +#, python-format +msgid "Error creating observation: %s" +msgstr "خطأ في إنشاء الملاحظة: %s" + +#: apps/px_sources/ui_views.py:1394 +msgid "You don't have permission to create suggestions." +msgstr "ليس لديك صلاحية لإنشاء الاقتراحات." + +#: apps/px_sources/ui_views.py:1450 +msgid "Suggestion submitted successfully!" +msgstr "تم تقديم الاقتراح بنجاح!" + +#: apps/px_sources/ui_views.py:1453 +#, python-format +msgid "Error creating suggestion: %s" +msgstr "خطأ في إنشاء الاقتراح: %s" + +#: apps/px_sources/ui_views.py:1476 apps/px_sources/ui_views.py:1550 +msgid "You are not assigned as a source user." +msgstr "لم يتم تعيينك كمستخدم مصدر." + +#: apps/px_sources/ui_views.py:1537 +msgid "Communication request sent to the PX team." +msgstr "تم إرسال طلب التواصل إلى فريق PX." + +#: apps/px_sources/ui_views.py:1623 +msgid "You do not have permission to view this request." +msgstr "ليس لديك صلاحية لعرض هذا الطلب." + +#: apps/px_sources/ui_views.py:1641 +msgid "Communication request updated successfully." +msgstr "تم تحديث طلب التواصل بنجاح." + +#: apps/px_sources/ui_views.py:1643 +msgid "Invalid status." +msgstr "حالة غير صالحة." + #: apps/references/forms.py:24 msgid "Enter folder name (English)" msgstr "أدخل اسم المجلد (بالإنجليزية)" @@ -3687,39 +7233,48 @@ msgstr "يرجى إدخال عنوان باللغة الإنجليزية أو ا msgid "File is required when uploading a new version." msgstr "الملف مطلوب عند رفع إصدار جديد." -#: apps/references/forms.py:199 templates/actions/action_list.html:94 +#: apps/references/forms.py:199 templates/accounts/staff_activity_log.html:81 +#: templates/accounts/staff_activity_log.html:111 +#: templates/actions/action_list.html:94 #: templates/ai_engine/sentiment_list.html:165 -#: templates/appreciation/appreciation_list.html:207 +#: templates/appreciation/appreciation_list.html:162 +#: templates/appreciation/appreciation_list.html:177 #: templates/callcenter/call_records_list.html:153 #: templates/callcenter/complaint_form.html:93 #: templates/callcenter/complaint_list.html:130 -#: templates/callcenter/inquiry_form.html:89 +#: templates/callcenter/inquiry_form.html:107 #: templates/callcenter/inquiry_list.html:126 #: templates/complaints/adverse_action_list.html:212 -#: templates/complaints/inquiry_list.html:178 +#: templates/complaints/government_ticket_list.html:78 +#: templates/complaints/inquiry_list.html:135 #: templates/complaints/templates/template_list.html:186 #: templates/config/hospital_users.html:203 -#: templates/dashboard/my_dashboard.html:134 -#: templates/feedback/feedback_list.html:231 +#: templates/dashboard/my_dashboard.html:140 +#: templates/feedback/feedback_list.html:158 #: templates/journeys/instance_list.html:165 -#: templates/observations/observation_list.html:170 -#: templates/organizations/patient_list.html:203 -#: templates/organizations/patient_list.html:473 +#: templates/observations/observation_list.html:171 +#: templates/organizations/orgsection_list.html:76 +#: templates/organizations/orgsubsection_list.html:76 +#: templates/organizations/patient_list.html:223 +#: templates/organizations/patient_list.html:485 #: templates/organizations/section_list.html:76 -#: templates/organizations/staff_list.html:232 +#: templates/organizations/staff_hierarchy.html:202 +#: templates/organizations/staff_list.html:237 #: templates/organizations/subsection_list.html:76 #: templates/physicians/physician_list.html:135 #: templates/px_sources/source_list.html:160 #: templates/px_sources/source_user_complaint_list.html:100 #: templates/px_sources/source_user_inquiry_list.html:100 +#: templates/px_sources/source_user_observation_list.html:90 +#: templates/px_sources/source_user_suggestion_list.html:90 #: templates/rca/rca_list.html:202 templates/references/dashboard.html:133 #: templates/references/folder_view.html:165 #: templates/references/search.html:159 templates/references/search.html:200 #: templates/simulator/log_list.html:244 templates/simulator/log_list.html:257 -#: templates/social/social_platform.html:186 -#: templates/standards/search.html:92 templates/standards/search.html:128 -#: templates/surveys/comment_list.html:174 -#: templates/surveys/comment_list.html:235 +#: templates/social/comments_list.html:116 +#: templates/social/social_platform.html:186 templates/standards/search.html:92 +#: templates/standards/search.html:141 templates/surveys/comment_list.html:174 +#: templates/surveys/comment_list.html:249 msgid "Search" msgstr "بحث" @@ -3750,26 +7305,22 @@ msgid "" "JSON array of choices for multiple choice questions. Format: [{\"value\": " "\"1\", \"label\": \"Option 1\", \"label_ar\": \"خيار 1\"}]" msgstr "" -"مصفوفة JSON للخيارات في أسئلة الاختيار من متعدد. الصيغة: [{\"value\": \"1\"," -" \"label\": \"الخيار 1\", \"label_ar\": \"خيار 1\"}]" +"مصفوفة JSON للخيارات في أسئلة الاختيار من متعدد. الصيغة: [{\"value\": \"1\", " +"\"label\": \"الخيار 1\", \"label_ar\": \"خيار 1\"}]" #: apps/surveys/forms.py:106 msgid "Leave blank for base questions (always included)." msgstr "اتركه فارغاً للأسئلة الأساسية (دائماً مشمولة)." -#: apps/surveys/forms.py:134 templates/surveys/template_form.html:467 -#: templates/surveys/template_form.html:513 -#, fuzzy -#| msgid "question" +#: apps/surveys/forms.py:134 templates/surveys/template_form.html:671 +#: templates/surveys/template_form.html:717 msgid "When question" -msgstr "سؤال" +msgstr "عند السؤال" -#: apps/surveys/forms.py:135 templates/surveys/template_form.html:483 -#: templates/surveys/template_form.html:529 -#, fuzzy -#| msgid "question" +#: apps/surveys/forms.py:135 templates/surveys/template_form.html:687 +#: templates/surveys/template_form.html:733 msgid "Go to question" -msgstr "سؤال" +msgstr "الانتقال إلى السؤال" #: apps/surveys/forms.py:221 apps/surveys/forms.py:283 #: apps/surveys/forms.py:325 apps/surveys/forms.py:401 @@ -3790,15 +7341,15 @@ msgstr "قالب الاستبيان" msgid "Select a survey template" msgstr "اختر قالب استبيان" -#: apps/surveys/forms.py:227 -#: templates/appreciation/appreciation_send_form.html:118 -#: templates/surveys/manual_send.html:57 +#: apps/surveys/forms.py:227 templates/surveys/manual_send.html:57 msgid "Recipient Type" msgstr "نوع المستلم" -#: apps/surveys/forms.py:232 -#: templates/appreciation/appreciation_send_form.html:135 -#: templates/appreciation/leaderboard.html:84 +#: apps/surveys/forms.py:232 templates/appreciation/leaderboard.html:145 +#: templates/config/deleted_items.html:165 +#: templates/organizations/department_detail.html:952 +#: templates/organizations/department_detail.html:1322 +#: templates/organizations/department_staff_detail.html:487 #: templates/simulator/log_detail.html:194 #: templates/surveys/manual_send.html:104 msgid "Recipient" @@ -3866,8 +7417,7 @@ msgstr "ملف CSV لإحصائيات نظام معلومات المستشفى" msgid "Upload MOH Statistics CSV with patient visit data" msgstr "تحميل إحصائيات وزارة الصحة بصيغة CSV مع بيانات زيارات المرضى" -#: apps/surveys/forms.py:387 -#: templates/physicians/doctor_rating_import.html:134 +#: apps/surveys/forms.py:387 templates/physicians/doctor_rating_import.html:134 msgid "Skip Header Rows" msgstr "تخطي صفوف الرؤوس" @@ -3899,7 +7449,8 @@ msgstr "فئة جديدة" #: templates/accounts/onboarding/dashboard.html:124 #: templates/appreciation/category_form.html:95 #: templates/appreciation/category_list.html:100 -#: templates/layouts/partials/sidebar.html:546 +#: templates/callcenter/inquiry_form.html:205 +#: templates/layouts/partials/sidebar.html:491 #: templates/observations/category_form.html:13 #: templates/standards/category_list.html:111 msgid "Categories" @@ -3920,35 +7471,52 @@ msgstr "الفئات" #: templates/complaints/adverse_action_list.html:327 #: templates/complaints/complaint_threshold_list.html:306 #: templates/complaints/escalation_rule_list.html:354 +#: templates/complaints/government_ticket_list.html:195 +#: templates/complaints/inquiry_detail.html:505 +#: templates/complaints/inquiry_form.html:69 #: templates/complaints/partials/adverse_actions_panel.html:97 -#: templates/complaints/partials/departments_panel.html:93 -#: templates/complaints/partials/staff_panel.html:75 +#: templates/complaints/partials/departments_panel.html:110 +#: templates/complaints/partials/staff_panel.html:69 #: templates/complaints/sla_management.html:317 #: templates/complaints/sla_management.html:412 +#: templates/complaints/templates/template_form.html:12 #: templates/complaints/templates/template_list.html:243 +#: templates/feedback/feedback_detail.html:53 #: templates/integrations/survey_mapping_settings.html:65 #: templates/journeys/template_detail.html:21 #: templates/journeys/template_detail.html:170 #: templates/journeys/template_form.html:157 #: templates/journeys/template_list.html:113 #: templates/observations/category_list.html:131 -#: templates/organizations/patient_detail.html:203 -#: templates/organizations/patient_list.html:336 +#: templates/organizations/department_detail.html:682 +#: templates/organizations/department_staff_detail.html:42 +#: templates/organizations/manager_review_question_form.html:11 +#: templates/organizations/manager_review_questions.html:54 +#: templates/organizations/orgsection_detail.html:169 +#: templates/organizations/orgsection_list.html:167 +#: templates/organizations/orgsubsection_list.html:160 +#: templates/organizations/patient_detail.html:198 +#: templates/organizations/patient_list.html:348 #: templates/organizations/physician_list.html:115 #: templates/organizations/section_list.html:160 #: templates/organizations/staff_detail.html:44 #: templates/organizations/subsection_list.html:160 -#: templates/projects/project_detail.html:40 -#: templates/projects/project_detail.html:121 +#: templates/presentations/presentation_detail.html:175 +#: templates/presentations/presentation_form.html:11 +#: templates/projects/focus_phase_detail.html:177 +#: templates/projects/partials/task_row.html:102 +#: templates/projects/pdca_phase_detail.html:176 +#: templates/projects/project_detail.html:103 #: templates/projects/project_list.html:242 #: templates/projects/template_detail.html:38 #: templates/px_sources/source_detail.html:121 #: templates/px_sources/source_list.html:268 templates/rca/rca_detail.html:65 #: templates/rca/rca_list.html:278 templates/references/document_view.html:217 +#: templates/standards/activity_type_list.html:160 #: templates/standards/category_list.html:171 #: templates/standards/source_list.html:177 -#: templates/standards/standard_detail.html:87 -#: templates/surveys/template_detail.html:162 +#: templates/standards/standard_detail.html:110 +#: templates/surveys/template_detail.html:185 #: templates/surveys/template_list.html:129 msgid "Edit" msgstr "تعديل" @@ -3956,13 +7524,16 @@ msgstr "تعديل" #: templates/accounts/acknowledgements/category_form.html:97 #: templates/accounts/acknowledgements/checklist_form.html:97 #: templates/accounts/simple_acknowledgements/admin_form.html:97 -#: templates/appreciation/badge_form.html:239 +#: templates/appreciation/badge_form.html:237 #: templates/appreciation/category_form.html:222 -#: templates/layouts/source_user_base.html:147 -#: templates/organizations/staff_detail.html:313 -#: templates/organizations/staff_detail.html:440 -#: templates/organizations/staff_list.html:458 -#: templates/organizations/staff_list.html:527 +#: templates/layouts/source_user_base.html:125 +#: templates/organizations/manager_review_question_form.html:11 +#: templates/organizations/manager_review_question_form.html:79 +#: templates/organizations/staff_detail.html:515 +#: templates/organizations/staff_detail.html:632 +#: templates/organizations/staff_list.html:463 +#: templates/organizations/staff_list.html:533 +#: templates/px_sources/source_detail.html:653 #: templates/references/folder_form.html:296 msgid "Create" msgstr "إنشاء" @@ -4002,13 +7573,15 @@ msgstr "الاسم (بالإنجليزية)" #: templates/journeys/template_form.html:182 #: templates/observations/category_form.html:42 #: templates/observations/category_list.html:88 +#: templates/organizations/department_form.html:94 +#: templates/organizations/department_staff_detail.html:64 #: templates/organizations/section_form.html:95 #: templates/organizations/subsection_form.html:95 #: templates/px_sources/source_confirm_delete.html:65 #: templates/px_sources/source_detail.html:153 #: templates/px_sources/source_form.html:208 #: templates/references/folder_form.html:180 -#: templates/surveys/template_detail.html:201 +#: templates/surveys/template_detail.html:224 msgid "Name (Arabic)" msgstr "الاسم (بالعربية)" @@ -4020,9 +7593,19 @@ msgstr "الاسم (بالعربية)" #: templates/accounts/onboarding/checklist_list.html:226 #: templates/accounts/onboarding/checklist_list.html:406 #: templates/accounts/onboarding/content_list.html:182 +#: templates/dashboard/standards_dashboard.html:238 #: templates/journeys/template_form.html:264 -#: templates/organizations/department_list.html:162 +#: templates/organizations/department_confirm_delete.html:26 +#: templates/organizations/department_detail.html:1086 +#: templates/organizations/department_form.html:99 #: templates/organizations/hospital_list.html:162 +#: templates/organizations/orgsection_confirm_delete.html:26 +#: templates/organizations/orgsection_detail.html:143 +#: templates/organizations/orgsection_form.html:110 +#: templates/organizations/orgsection_list.html:124 +#: templates/organizations/orgsubsection_confirm_delete.html:26 +#: templates/organizations/orgsubsection_form.html:129 +#: templates/organizations/orgsubsection_list.html:124 #: templates/organizations/section_confirm_delete.html:26 #: templates/organizations/section_form.html:100 #: templates/organizations/section_list.html:123 @@ -4032,9 +7615,10 @@ msgstr "الاسم (بالعربية)" #: templates/px_sources/source_list.html:195 #: templates/standards/compliance_form.html:141 #: templates/standards/department_standards.html:114 -#: templates/standards/search.html:158 +#: templates/standards/search.html:179 templates/standards/search.html:374 #: templates/standards/source_confirm_delete.html:96 #: templates/standards/source_list.html:120 +#: templates/standards/standard_detail.html:276 msgid "Code" msgstr "الرمز" @@ -4072,133 +7656,6 @@ msgstr "الأيقونة" msgid "Color" msgstr "اللون" -#: templates/accounts/acknowledgements/category_form.html:191 -#: templates/accounts/acknowledgements/category_list.html:98 -#: templates/accounts/acknowledgements/checklist_list.html:95 -#: templates/accounts/acknowledgements/checklist_list.html:132 -#: templates/accounts/onboarding/checklist_list.html:108 -#: templates/accounts/onboarding/dashboard.html:225 -#: templates/accounts/onboarding/provisional_list.html:145 -#: templates/accounts/simple_acknowledgements/admin_list.html:118 -#: templates/accounts/simple_acknowledgements/admin_signatures.html:100 -#: templates/actions/action_create.html:83 -#: templates/actions/action_list.html:98 -#: templates/analytics/dashboard.html:478 templates/analytics/kpi_list.html:81 -#: templates/analytics/kpi_report_detail.html:548 -#: templates/appreciation/appreciation_list.html:183 -#: templates/callcenter/complaint_list.html:136 -#: templates/callcenter/complaint_list.html:182 -#: templates/callcenter/inquiry_list.html:132 -#: templates/callcenter/inquiry_list.html:178 -#: templates/complaints/adverse_action_list.html:218 -#: templates/complaints/adverse_action_list.html:278 -#: templates/complaints/complaint_list.html:217 -#: templates/complaints/complaint_threshold_list.html:217 -#: templates/complaints/complaint_threshold_list.html:259 -#: templates/complaints/escalation_rule_list.html:251 -#: templates/complaints/escalation_rule_list.html:293 -#: templates/complaints/inquiry_list.html:184 -#: templates/complaints/inquiry_list.html:232 -#: templates/complaints/oncall/schedule_detail.html:96 -#: templates/complaints/templates/template_list.html:178 -#: templates/config/hospital_users.html:195 -#: templates/config/hospital_users.html:236 -#: templates/config/routing_rules.html:46 templates/config/sla_config.html:45 -#: templates/dashboard/complaint_request_list.html:52 -#: templates/dashboard/complaint_request_list.html:88 -#: templates/dashboard/employee_evaluation.html:1248 -#: templates/dashboard/my_dashboard.html:138 -#: templates/dashboard/partials/actions_table.html:28 -#: templates/dashboard/partials/complaints_table.html:28 -#: templates/dashboard/partials/inquiries_table.html:27 -#: templates/dashboard/partials/observations_table.html:27 -#: templates/dashboard/partials/tasks_table.html:27 -#: templates/emails/observation_monthly_followup.html:57 -#: templates/emails/observation_resolved.html:57 -#: templates/feedback/action_plan_list.html:22 -#: templates/feedback/action_plan_list.html:61 -#: templates/feedback/comment_import_list.html:19 -#: templates/feedback/feedback_list.html:252 -#: templates/feedback/feedback_list.html:360 -#: templates/integrations/survey_mapping_settings.html:31 -#: templates/integrations/survey_mapping_settings.html:179 -#: templates/journeys/instance_detail.html:298 -#: templates/journeys/instance_list.html:182 -#: templates/journeys/instance_list.html:242 -#: templates/journeys/template_form.html:206 -#: templates/journeys/template_list.html:82 -#: templates/observations/category_list.html:91 -#: templates/observations/observation_detail.html:367 -#: templates/observations/observation_list.html:179 -#: templates/observations/observation_list.html:300 -#: templates/observations/public_success.html:141 -#: templates/organizations/department_list.html:165 -#: templates/organizations/hospital_list.html:165 -#: templates/organizations/patient_detail.html:261 -#: templates/organizations/patient_detail.html:308 -#: templates/organizations/patient_list.html:212 -#: templates/organizations/patient_list.html:266 -#: templates/organizations/physician_list.html:82 -#: templates/organizations/section_confirm_delete.html:34 -#: templates/organizations/section_form.html:115 -#: templates/organizations/section_list.html:89 -#: templates/organizations/section_list.html:127 -#: templates/organizations/staff_detail.html:276 -#: templates/organizations/staff_form.html:323 -#: templates/organizations/staff_form.html:328 -#: templates/organizations/staff_list.html:196 -#: templates/organizations/staff_list.html:266 -#: templates/organizations/subsection_confirm_delete.html:34 -#: templates/organizations/subsection_form.html:115 -#: templates/organizations/subsection_list.html:89 -#: templates/organizations/subsection_list.html:127 -#: templates/physicians/doctor_rating_job_list.html:107 -#: templates/physicians/physician_list.html:158 -#: templates/physicians/physician_list.html:198 -#: templates/projects/convert_action.html:135 -#: templates/projects/project_detail.html:175 -#: templates/projects/project_form.html:240 -#: templates/projects/project_list.html:168 -#: templates/projects/task_form.html:149 -#: templates/projects/template_form.html:147 -#: templates/px_sources/source_confirm_delete.html:73 -#: templates/px_sources/source_detail.html:250 -#: templates/px_sources/source_detail.html:318 -#: templates/px_sources/source_list.html:169 -#: templates/px_sources/source_list.html:200 -#: templates/px_sources/source_user_complaint_list.html:113 -#: templates/px_sources/source_user_complaint_list.html:186 -#: templates/px_sources/source_user_confirm_delete.html:76 -#: templates/px_sources/source_user_dashboard.html:163 -#: templates/px_sources/source_user_dashboard.html:256 -#: templates/px_sources/source_user_form.html:297 -#: templates/px_sources/source_user_inquiry_list.html:113 -#: templates/px_sources/source_user_inquiry_list.html:174 -#: templates/rca/rca_detail.html:114 templates/rca/rca_detail.html:492 -#: templates/rca/rca_form.html:85 templates/rca/rca_list.html:228 -#: templates/reports/report_builder.html:90 -#: templates/simulator/log_detail.html:76 -#: templates/simulator/log_detail.html:150 -#: templates/simulator/log_detail.html:166 -#: templates/simulator/log_list.html:225 templates/simulator/log_list.html:279 -#: templates/standards/attachment_upload.html:151 -#: templates/standards/category_list.html:132 -#: templates/standards/compliance_form.html:178 -#: templates/standards/dashboard.html:198 -#: templates/standards/dashboard.html:258 -#: templates/standards/department_standards.html:120 -#: templates/standards/source_list.html:132 -#: templates/standards/standard_detail.html:221 -#: templates/surveys/bulk_job_list.html:89 -#: templates/surveys/his_patient_review.html:160 -#: templates/surveys/instance_detail.html:542 -#: templates/surveys/instance_list.html:89 -#: templates/surveys/instance_list.html:136 -#: templates/surveys/template_detail.html:226 -#: templates/surveys/template_list.html:88 -msgid "Status" -msgstr "الحالة" - #: templates/accounts/acknowledgements/category_form.html:202 #: templates/accounts/acknowledgements/checklist_form.html:219 #: templates/accounts/acknowledgements/sign.html:84 @@ -4218,35 +7675,46 @@ msgstr "الحالة" #: templates/actions/action_detail.html:537 #: templates/analytics/kpi_report_detail.html:504 #: templates/analytics/kpi_report_generate.html:136 -#: templates/appreciation/appreciation_send_form.html:229 -#: templates/appreciation/badge_form.html:235 +#: templates/appreciation/badge_form.html:233 #: templates/appreciation/category_form.html:218 #: templates/callcenter/complaint_form.html:270 #: templates/callcenter/import_call_records.html:123 -#: templates/callcenter/inquiry_form.html:229 +#: templates/callcenter/inquiry_form.html:247 #: templates/complaints/adverse_action_form.html:238 -#: templates/complaints/complaint_detail.html:556 -#: templates/complaints/complaint_detail.html:589 -#: templates/complaints/complaint_detail.html:617 -#: templates/complaints/complaint_detail.html:657 -#: templates/complaints/complaint_detail.html:686 -#: templates/complaints/complaint_form.html:742 -#: templates/complaints/complaint_form.html:747 +#: templates/complaints/complaint_detail.html:854 +#: templates/complaints/complaint_detail.html:889 +#: templates/complaints/complaint_detail.html:917 +#: templates/complaints/complaint_detail.html:973 +#: templates/complaints/complaint_detail.html:1002 +#: templates/complaints/complaint_detail.html:1104 +#: templates/complaints/complaint_detail.html:1149 +#: templates/complaints/complaint_form.html:736 +#: templates/complaints/complaint_form.html:741 +#: templates/complaints/complaint_list.html:426 #: templates/complaints/complaint_threshold_form.html:383 #: templates/complaints/escalation_rule_form.html:412 -#: templates/complaints/inquiry_detail.html:653 -#: templates/complaints/inquiry_form.html:367 +#: templates/complaints/government_ticket_form.html:257 +#: templates/complaints/government_ticket_import.html:197 +#: templates/complaints/inquiry_department_response.html:83 +#: templates/complaints/inquiry_detail.html:668 +#: templates/complaints/inquiry_detail.html:706 +#: templates/complaints/inquiry_detail.html:795 +#: templates/complaints/inquiry_detail.html:852 +#: templates/complaints/inquiry_form.html:284 +#: templates/complaints/inquiry_form.html:286 #: templates/complaints/involved_department_form.html:238 #: templates/complaints/involved_staff_form.html:206 #: templates/complaints/oncall/admin_form.html:324 #: templates/complaints/oncall/schedule_form.html:293 -#: templates/complaints/partials/explanation_panel.html:201 -#: templates/complaints/request_explanation_form.html:247 +#: templates/complaints/partials/explanation_panel.html:382 #: templates/complaints/sla_management_form.html:354 -#: templates/config/hospital_users.html:394 -#: templates/dashboard/my_dashboard.html:275 -#: templates/feedback/feedback_form.html:142 -#: templates/feedback/feedback_form.html:358 +#: templates/complaints/templates/template_form.html:57 +#: templates/components/department_response_modal.html:40 +#: templates/components/send_to_modal.html:110 +#: templates/config/hospital_users.html:416 +#: templates/config/hospital_users.html:469 templates/config/user_form.html:393 +#: templates/dashboard/my_dashboard.html:344 +#: templates/feedback/feedback_delete_confirm.html:157 #: templates/integrations/survey_mapping_settings.html:193 #: templates/integrations/survey_mapping_settings.html:230 #: templates/journeys/stage_surveys_form.html:257 @@ -4257,55 +7725,93 @@ msgstr "الحالة" #: templates/notifications/settings.html:415 #: templates/observations/category_form.html:91 #: templates/observations/convert_to_action.html:95 -#: templates/observations/observation_create.html:336 +#: templates/observations/observation_create.html:143 +#: templates/observations/observation_department_response.html:79 +#: templates/observations/observation_detail.html:911 +#: templates/observations/observation_detail.html:968 +#: templates/organizations/department_confirm_delete.html:46 +#: templates/organizations/department_detail.html:1205 +#: templates/organizations/department_detail.html:1257 +#: templates/organizations/department_form.html:163 +#: templates/organizations/department_manager_review.html:264 +#: templates/organizations/department_staff_detail.html:424 +#: templates/organizations/manager_review_question_form.html:83 +#: templates/organizations/orgsection_confirm_delete.html:46 +#: templates/organizations/orgsection_form.html:147 +#: templates/organizations/orgsubsection_confirm_delete.html:46 +#: templates/organizations/orgsubsection_form.html:146 +#: templates/organizations/orgsubsection_form.html:151 +#: templates/organizations/orgsubsection_form.html:156 #: templates/organizations/patient_confirm_delete.html:47 #: templates/organizations/patient_form.html:231 #: templates/organizations/section_confirm_delete.html:46 #: templates/organizations/section_form.html:126 -#: templates/organizations/staff_detail.html:312 -#: templates/organizations/staff_detail.html:332 -#: templates/organizations/staff_detail.html:357 +#: templates/organizations/staff_detail.html:514 +#: templates/organizations/staff_detail.html:534 +#: templates/organizations/staff_detail.html:559 #: templates/organizations/staff_form.html:366 -#: templates/organizations/staff_list.html:457 -#: templates/organizations/staff_list.html:477 +#: templates/organizations/staff_import.html:126 +#: templates/organizations/staff_list.html:462 +#: templates/organizations/staff_list.html:482 #: templates/organizations/subsection_confirm_delete.html:46 #: templates/organizations/subsection_form.html:126 #: templates/physicians/doctor_rating_fetch.html:155 #: templates/physicians/doctor_rating_import.html:176 #: templates/physicians/doctor_rating_review.html:327 +#: templates/presentations/presentation_form.html:91 +#: templates/presentations/presentation_generate.html:107 +#: templates/presentations/slide_form.html:76 +#: templates/presentations/template_create.html:73 #: templates/projects/convert_action.html:92 +#: templates/projects/focus_phase_form.html:81 +#: templates/projects/partials/phase_form_modal.html:67 +#: templates/projects/partials/task_form_modal.html:99 +#: templates/projects/pdca_phase_form.html:81 #: templates/projects/project_confirm_delete.html:59 #: templates/projects/project_delete_confirm.html:48 -#: templates/projects/project_form.html:307 +#: templates/projects/project_form.html:313 #: templates/projects/project_save_as_template.html:86 #: templates/projects/task_confirm_delete.html:44 -#: templates/projects/task_delete_confirm.html:38 -#: templates/projects/task_form.html:187 +#: templates/projects/task_delete_confirm.html:39 +#: templates/projects/task_delete_confirm.html:43 +#: templates/projects/task_delete_confirm.html:47 +#: templates/projects/task_form.html:232 templates/projects/task_form.html:237 +#: templates/projects/task_form.html:242 #: templates/projects/template_confirm_delete.html:59 #: templates/projects/template_delete_confirm.html:42 #: templates/projects/template_form.html:219 +#: templates/px_sources/convert_to_complaint_modal.html:84 #: templates/px_sources/source_confirm_delete.html:31 #: templates/px_sources/source_confirm_delete.html:132 +#: templates/px_sources/source_detail.html:650 #: templates/px_sources/source_form.html:279 #: templates/px_sources/source_user_confirm_delete.html:129 -#: templates/px_sources/source_user_create_complaint.html:273 -#: templates/px_sources/source_user_create_inquiry.html:145 -#: templates/px_sources/source_user_form.html:346 +#: templates/px_sources/source_user_create_communication_request.html:73 +#: templates/px_sources/source_user_create_complaint.html:264 +#: templates/px_sources/source_user_create_inquiry.html:172 +#: templates/px_sources/source_user_create_observation.html:184 +#: templates/px_sources/source_user_create_suggestion.html:136 +#: templates/px_sources/source_user_form.html:334 #: templates/rca/rca_detail.html:445 templates/rca/rca_detail.html:506 #: templates/rca/rca_detail.html:537 templates/rca/rca_form.html:119 #: templates/references/document_form.html:367 #: templates/references/folder_form.html:300 #: templates/reports/report_builder.html:200 +#: templates/standards/activity_type_confirm_delete.html:117 +#: templates/standards/activity_type_form.html:132 #: templates/standards/attachment_confirm_delete.html:108 #: templates/standards/attachment_upload.html:120 #: templates/standards/category_confirm_delete.html:125 -#: templates/standards/category_form.html:143 -#: templates/standards/department_standards.html:272 +#: templates/standards/category_form.html:163 +#: templates/standards/department_standards.html:371 +#: templates/standards/search.html:494 #: templates/standards/source_confirm_delete.html:133 #: templates/standards/source_form.html:154 #: templates/standards/standard_confirm_delete.html:114 -#: templates/standards/standard_form.html:266 -#: templates/standards/standard_form.html:271 +#: templates/standards/standard_detail.html:367 +#: templates/standards/standard_detail.html:516 +#: templates/standards/standard_form.html:336 +#: templates/standards/standard_form.html:341 #: templates/surveys/analytics_reports.html:244 #: templates/surveys/generate_enhanced_report.html:75 #: templates/surveys/his_patient_import.html:83 @@ -4315,7 +7821,7 @@ msgstr "الحالة" #: templates/surveys/manual_send_csv.html:181 #: templates/surveys/manual_send_phone.html:161 #: templates/surveys/template_confirm_delete.html:120 -#: templates/surveys/template_form.html:551 +#: templates/surveys/template_form.html:755 #: templates/surveys/template_list.html:206 msgid "Cancel" msgstr "إلغاء" @@ -4343,7 +7849,14 @@ msgstr "إدارة فئات عناصر الإقرار" #: templates/accounts/acknowledgements/category_list.html:71 #: templates/accounts/acknowledgements/checklist_list.html:71 #: templates/accounts/acknowledgements/compliance.html:26 -#: templates/analytics/kpi_report_pdf.html:640 +#: templates/accounts/staff_activity_log.html:50 +#: templates/complaints/partials/pdf_summary_panel.html:148 +#: templates/config/user_form.html:123 templates/feedback/feedback_form.html:59 +#: templates/organizations/department_form.html:71 +#: templates/organizations/orgsection_form.html:72 +#: templates/organizations/orgsubsection_form.html:73 +#: templates/organizations/orgsubsection_form.html:78 +#: templates/organizations/orgsubsection_form.html:83 #: templates/organizations/patient_form.html:73 #: templates/organizations/section_form.html:72 #: templates/organizations/staff_form.html:86 @@ -4358,98 +7871,19 @@ msgstr "رجوع" #: templates/journeys/template_detail.html:137 #: templates/journeys/template_form.html:262 #: templates/observations/category_list.html:86 +#: templates/organizations/manager_review_question_form.html:53 +#: templates/projects/partials/task_form_modal.html:65 #: templates/references/folder_form.html:227 #: templates/standards/category_confirm_delete.html:96 #: templates/standards/category_list.html:120 -#: templates/surveys/template_detail.html:130 -#: templates/surveys/template_form.html:285 -#: templates/surveys/template_form.html:390 -#: templates/surveys/template_form.html:487 -#: templates/surveys/template_form.html:533 +#: templates/surveys/template_detail.html:153 +#: templates/surveys/template_form.html:395 +#: templates/surveys/template_form.html:544 +#: templates/surveys/template_form.html:691 +#: templates/surveys/template_form.html:737 msgid "Order" msgstr "الترتيب" -#: templates/accounts/acknowledgements/category_list.html:99 -#: templates/accounts/acknowledgements/checklist_list.html:133 -#: templates/accounts/onboarding/checklist_list.html:110 -#: templates/accounts/onboarding/provisional_list.html:148 -#: templates/accounts/simple_acknowledgements/admin_list.html:121 -#: templates/accounts/simple_acknowledgements/admin_signatures.html:102 -#: templates/ai_engine/sentiment_dashboard.html:238 -#: templates/ai_engine/sentiment_list.html:208 -#: templates/analytics/command_center.html:136 -#: templates/analytics/command_center.html:365 -#: templates/analytics/dashboard.html:475 -#: templates/appreciation/appreciation_detail.html:170 -#: templates/appreciation/category_list.html:123 -#: templates/callcenter/complaint_list.html:184 -#: templates/callcenter/inquiry_list.html:180 -#: templates/callcenter/interaction_list.html:114 -#: templates/complaints/adverse_action_list.html:280 -#: templates/complaints/complaint_list.html:220 -#: templates/complaints/complaint_threshold_form.html:444 -#: templates/complaints/complaint_threshold_list.html:260 -#: templates/complaints/escalation_rule_list.html:294 -#: templates/complaints/inquiry_detail.html:520 -#: templates/complaints/oncall/dashboard.html:80 -#: templates/complaints/oncall/schedule_detail.html:97 -#: templates/complaints/partials/rca_panel.html:49 -#: templates/complaints/sla_management.html:268 -#: templates/complaints/sla_management.html:375 -#: templates/config/hospital_users.html:237 -#: templates/dashboard/department_benchmarks.html:133 -#: templates/dashboard/partials/actions_table.html:30 -#: templates/dashboard/partials/complaints_table.html:30 -#: templates/dashboard/partials/feedback_table.html:29 -#: templates/dashboard/partials/inquiries_table.html:29 -#: templates/dashboard/partials/observations_table.html:29 -#: templates/dashboard/partials/tasks_table.html:29 -#: templates/feedback/feedback_list.html:363 -#: templates/integrations/survey_mapping_settings.html:32 -#: templates/journeys/instance_list.html:244 -#: templates/journeys/stage_surveys_form.html:206 -#: templates/journeys/template_detail.html:142 -#: templates/journeys/template_form.html:269 -#: templates/journeys/template_list.html:83 -#: templates/journeys/template_list.html:103 -#: templates/observations/category_list.html:92 -#: templates/observations/observation_list.html:304 -#: templates/organizations/patient_list.html:267 -#: templates/organizations/physician_list.html:83 -#: templates/organizations/section_list.html:128 -#: templates/organizations/staff_list.html:267 -#: templates/organizations/subsection_list.html:128 -#: templates/physicians/department_overview.html:112 -#: templates/physicians/doctor_rating_job_list.html:111 -#: templates/physicians/leaderboard.html:184 -#: templates/physicians/physician_list.html:199 -#: templates/physicians/physician_ratings_dashboard.html:461 -#: templates/physicians/ratings_list.html:205 -#: templates/physicians/specialization_overview.html:111 -#: templates/projects/project_list.html:171 -#: templates/px_sources/source_list.html:201 templates/rca/rca_list.html:234 -#: templates/references/document_view.html:337 -#: templates/references/document_view.html:459 -#: templates/social/social_analytics.html:250 -#: templates/social/social_comment_detail.html:264 -#: templates/standards/attachment_upload.html:204 -#: templates/standards/category_list.html:135 -#: templates/standards/dashboard.html:201 -#: templates/standards/department_standards.html:126 -#: templates/standards/department_standards.html:362 -#: templates/standards/search.html:173 -#: templates/standards/source_list.html:135 -#: templates/surveys/analytics_reports.html:103 -#: templates/surveys/bulk_job_list.html:91 -#: templates/surveys/comment_list.html:265 -#: templates/surveys/enhanced_reports_list.html:132 -#: templates/surveys/instance_detail.html:471 -#: templates/surveys/instance_list.html:140 -#: templates/surveys/template_detail.html:135 -#: templates/surveys/template_list.html:89 -msgid "Actions" -msgstr "الإجراءات" - #: templates/accounts/acknowledgements/category_list.html:146 #: templates/accounts/onboarding/category_list.html:130 msgid "No Categories Yet" @@ -4462,7 +7896,7 @@ msgstr "قم بإنشاء فئة إقرار أولى للبدء." #: templates/accounts/acknowledgements/category_list.html:150 #: templates/standards/category_form.html:4 #: templates/standards/category_form.html:66 -#: templates/standards/category_form.html:140 +#: templates/standards/category_form.html:160 msgid "Create Category" msgstr "إنشاء فئة" @@ -4489,11 +7923,13 @@ msgstr "عناصر قائمة التحقق" #: templates/accounts/simple_acknowledgements/admin_form.html:107 #: templates/ai_engine/analyze_text.html:16 #: templates/ai_engine/sentiment_detail.html:16 -#: templates/appreciation/appreciation_detail.html:105 #: templates/callcenter/complaint_form.html:65 -#: templates/callcenter/inquiry_form.html:61 +#: templates/callcenter/inquiry_form.html:77 #: templates/complaints/complaint_threshold_form.html:156 #: templates/complaints/escalation_rule_form.html:171 +#: templates/complaints/government_ticket_detail.html:91 +#: templates/complaints/government_ticket_form.html:97 +#: templates/complaints/government_ticket_import.html:91 #: templates/complaints/sla_management_form.html:133 #: templates/px_sources/source_form.html:162 msgid "Back to List" @@ -4559,48 +7995,68 @@ msgid "New Item" msgstr "عنصر جديد" #: templates/accounts/acknowledgements/checklist_list.html:97 +#: templates/accounts/settings.html:498 #: templates/callcenter/call_records_list.html:171 #: templates/callcenter/complaint_list.html:138 #: templates/callcenter/complaint_list.html:148 #: templates/callcenter/inquiry_list.html:134 #: templates/callcenter/inquiry_list.html:144 -#: templates/complaints/complaint_list.html:186 -#: templates/complaints/complaint_list.html:196 +#: templates/complaints/complaint_list.html:189 +#: templates/complaints/complaint_list.html:199 +#: templates/complaints/complaint_list.html:208 #: templates/complaints/complaint_threshold_list.html:219 #: templates/complaints/escalation_rule_list.html:253 #: templates/complaints/escalation_rule_list.html:325 #: templates/complaints/escalation_rule_list.html:334 +#: templates/complaints/government_ticket_list.html:112 #: templates/config/hospital_users.html:178 #: templates/config/hospital_users.html:188 #: templates/config/hospital_users.html:197 #: templates/config/routing_rules.html:79 +#: templates/dashboard/admin_evaluation.html:293 #: templates/dashboard/complaint_request_list.html:25 #: templates/dashboard/complaint_request_list.html:34 #: templates/dashboard/complaint_request_list.html:43 #: templates/dashboard/complaint_request_list.html:54 -#: templates/dashboard/my_dashboard.html:140 -#: templates/dashboard/my_dashboard.html:150 -#: templates/feedback/action_plan_list.html:24 -#: templates/feedback/action_plan_list.html:33 -#: templates/feedback/comment_list.html:31 -#: templates/feedback/comment_list.html:40 -#: templates/feedback/comment_list.html:49 +#: templates/dashboard/employee_evaluation.html:747 +#: templates/dashboard/employee_evaluation_charts.html:213 +#: templates/dashboard/my_dashboard.html:146 +#: templates/dashboard/my_dashboard.html:156 +#: templates/feedback/action_plan_list.html:84 +#: templates/feedback/action_plan_list.html:93 +#: templates/feedback/comment_list.html:79 +#: templates/feedback/comment_list.html:88 +#: templates/feedback/comment_list.html:97 +#: templates/feedback/comment_list.html:106 +#: templates/feedback/comment_list.html:115 +#: templates/feedback/comment_list.html:124 +#: templates/feedback/feedback_list.html:134 +#: templates/feedback/feedback_list.html:164 +#: templates/feedback/feedback_list.html:173 +#: templates/feedback/feedback_list.html:182 #: templates/notifications/inbox.html:42 -#: templates/observations/observation_list.html:245 -#: templates/organizations/patient_list.html:222 -#: templates/organizations/patient_list.html:230 +#: templates/organizations/patient_list.html:242 +#: templates/organizations/patient_list.html:250 +#: templates/organizations/patient_list.html:510 +#: templates/organizations/staff_hierarchy.html:185 #: templates/organizations/staff_hierarchy_d3.html:192 -#: templates/organizations/staff_list.html:198 -#: templates/organizations/staff_list.html:206 -#: templates/organizations/staff_list.html:216 -#: templates/organizations/staff_list.html:225 templates/rca/rca_list.html:151 -#: templates/rca/rca_list.html:184 templates/rca/rca_list.html:194 -#: templates/simulator/log_list.html:218 templates/simulator/log_list.html:227 -#: templates/simulator/log_list.html:237 +#: templates/organizations/staff_list.html:203 +#: templates/organizations/staff_list.html:211 +#: templates/organizations/staff_list.html:221 +#: templates/organizations/staff_list.html:230 +#: templates/partials/list_stats_bar.html:6 +#: templates/presentations/presentation_list.html:68 +#: templates/px_sources/communication_request_list.html:75 +#: templates/rca/rca_list.html:151 templates/rca/rca_list.html:184 +#: templates/rca/rca_list.html:194 templates/simulator/log_list.html:218 +#: templates/simulator/log_list.html:227 templates/simulator/log_list.html:237 +#: templates/social/comments_list.html:123 +#: templates/social/comments_list.html:132 #: templates/social/social_platform.html:171 #: templates/surveys/comment_list.html:189 #: templates/surveys/comment_list.html:201 -#: templates/surveys/comment_list.html:214 +#: templates/surveys/comment_list.html:215 +#: templates/surveys/comment_list.html:228 #: templates/surveys/his_patient_review.html:225 #: templates/surveys/instance_list.html:91 #: templates/surveys/instance_list.html:101 @@ -4613,23 +8069,32 @@ msgstr "الكل" #: templates/callcenter/complaint_list.html:157 #: templates/callcenter/inquiry_list.html:154 #: templates/complaints/adverse_action_list.html:247 -#: templates/complaints/inquiry_list.html:207 +#: templates/complaints/inquiry_list.html:165 #: templates/complaints/templates/template_list.html:194 #: templates/dashboard/complaint_request_list.html:63 -#: templates/feedback/action_plan_list.html:41 -#: templates/organizations/patient_list.html:239 +#: templates/feedback/action_plan_list.html:100 +#: templates/feedback/comment_list.html:131 +#: templates/organizations/department_complaints.html:52 +#: templates/organizations/department_inquiries.html:50 +#: templates/organizations/department_observations.html:52 +#: templates/organizations/orgsection_list.html:99 +#: templates/organizations/orgsubsection_list.html:99 +#: templates/organizations/patient_list.html:259 #: templates/organizations/section_list.html:99 #: templates/organizations/subsection_list.html:99 #: templates/physicians/department_overview.html:55 #: templates/physicians/individual_ratings_list.html:160 -#: templates/physicians/leaderboard.html:157 +#: templates/physicians/leaderboard.html:178 #: templates/physicians/physician_list.html:169 #: templates/physicians/ratings_list.html:173 #: templates/physicians/specialization_overview.html:55 #: templates/px_sources/source_list.html:185 #: templates/px_sources/source_user_complaint_list.html:154 #: templates/px_sources/source_user_inquiry_list.html:142 +#: templates/px_sources/source_user_observation_list.html:126 +#: templates/px_sources/source_user_suggestion_list.html:129 #: templates/reports/saved_reports.html:69 +#: templates/social/comments_list.html:139 #: templates/social/social_analytics.html:32 #: templates/social/social_comment_list.html:205 #: templates/social/social_platform.html:195 @@ -4637,24 +8102,31 @@ msgid "Filter" msgstr "تصفية" #: templates/accounts/acknowledgements/checklist_list.html:107 +#: templates/accounts/staff_activity_log.html:113 #: templates/ai_engine/sentiment_list.html:173 -#: templates/analytics/kpi_report_list.html:195 -#: templates/complaints/complaint_list.html:203 +#: templates/analytics/kpi_report_list.html:238 +#: templates/appreciation/appreciation_list.html:179 +#: templates/complaints/complaint_list.html:225 #: templates/complaints/complaint_threshold_list.html:231 #: templates/complaints/escalation_rule_list.html:265 #: templates/config/hospital_users.html:208 #: templates/dashboard/complaint_request_list.html:67 +#: templates/feedback/feedback_list.html:197 #: templates/journeys/instance_list.html:218 #: templates/notifications/send_sms_direct.html:77 -#: templates/observations/observation_list.html:269 -#: templates/organizations/staff_hierarchy.html:221 -#: templates/organizations/staff_list.html:237 +#: templates/observations/observation_list.html:271 +#: templates/organizations/department_complaints.html:56 +#: templates/organizations/department_detail.html:502 +#: templates/organizations/department_inquiries.html:54 +#: templates/organizations/department_observations.html:56 +#: templates/organizations/staff_hierarchy.html:207 +#: templates/organizations/staff_list.html:242 #: templates/physicians/individual_ratings_list.html:164 -#: templates/physicians/leaderboard.html:161 +#: templates/physicians/leaderboard.html:182 #: templates/physicians/physician_list.html:173 #: templates/physicians/ratings_list.html:177 templates/rca/rca_list.html:214 -#: templates/references/search.html:203 templates/standards/search.html:131 -#: templates/surveys/instance_list.html:111 +#: templates/references/search.html:203 templates/social/comments_list.html:144 +#: templates/standards/search.html:144 templates/surveys/instance_list.html:111 msgid "Clear" msgstr "مسح" @@ -4668,27 +8140,50 @@ msgstr "العنصر" #: templates/accounts/acknowledgements/checklist_list.html:161 #: templates/accounts/onboarding/checklist_list.html:151 +#: templates/appreciation/appreciation_detail.html:180 +#: templates/appreciation/appreciation_detail.html:186 #: templates/callcenter/call_records_list.html:172 #: templates/callcenter/call_records_list.html:265 #: templates/complaints/adverse_action_list.html:317 +#: templates/complaints/government_ticket_list.html:179 +#: templates/complaints/investigation_respond.html:85 +#: templates/complaints/investigation_review.html:81 +#: templates/complaints/investigation_review.html:138 +#: templates/complaints/investigation_review.html:153 +#: templates/complaints/investigation_review.html:168 +#: templates/complaints/partials/explanation_panel.html:68 #: templates/journeys/template_detail.html:163 -#: templates/organizations/staff_detail.html:218 +#: templates/organizations/department_manager_review.html:205 +#: templates/organizations/staff_detail.html:412 #: templates/physicians/individual_ratings_list.html:275 -#: templates/surveys/instance_detail.html:268 -#: templates/surveys/template_detail.html:155 +#: templates/social/comment_detail.html:259 +#: templates/standards/standard_detail.html:293 +#: templates/surveys/instance_detail.html:176 +#: templates/surveys/template_detail.html:178 msgid "Yes" msgstr "نعم" #: templates/accounts/acknowledgements/checklist_list.html:165 #: templates/accounts/onboarding/checklist_list.html:154 +#: templates/appreciation/appreciation_detail.html:180 +#: templates/appreciation/appreciation_detail.html:186 #: templates/callcenter/call_records_list.html:173 #: templates/callcenter/call_records_list.html:270 #: templates/complaints/adverse_action_list.html:320 +#: templates/complaints/government_ticket_list.html:183 +#: templates/complaints/investigation_respond.html:91 +#: templates/complaints/investigation_review.html:83 +#: templates/complaints/investigation_review.html:142 +#: templates/complaints/investigation_review.html:157 +#: templates/complaints/investigation_review.html:172 +#: templates/complaints/partials/explanation_panel.html:68 #: templates/journeys/template_detail.html:165 -#: templates/organizations/staff_detail.html:220 +#: templates/organizations/department_manager_review.html:210 +#: templates/organizations/staff_detail.html:414 #: templates/physicians/individual_ratings_list.html:280 -#: templates/surveys/instance_detail.html:273 -#: templates/surveys/template_detail.html:157 +#: templates/standards/standard_detail.html:295 +#: templates/surveys/instance_detail.html:180 +#: templates/surveys/template_detail.html:180 msgid "No" msgstr "لا" @@ -4730,12 +8225,13 @@ msgid "Compliance Rate" msgstr "معدل الامتثال" #: templates/accounts/acknowledgements/compliance.html:84 +#: templates/dashboard/standards_dashboard.html:124 msgid "Compliance by Category" msgstr "الامتثال حسب الفئة" #: templates/accounts/acknowledgements/compliance.html:99 #: templates/accounts/onboarding/category_list.html:103 -#: templates/dashboard/my_dashboard.html:501 +#: templates/dashboard/my_dashboard.html:570 msgid "items" msgstr "عناصر" @@ -4747,7 +8243,7 @@ msgid "completed" msgstr "مكتمل" #: templates/accounts/acknowledgements/compliance.html:117 -#: templates/complaints/analytics.html:256 +#: templates/complaints/analytics.html:280 msgid "No category data available" msgstr "لا توجد بيانات فئة متاحة" @@ -4758,9 +8254,9 @@ msgstr "المستخدمون غير المتوافقين" #: templates/accounts/acknowledgements/compliance.html:137 #: templates/accounts/onboarding/dashboard.html:221 #: templates/accounts/onboarding/provisional_list.html:130 -#: templates/appreciation/appreciation_send_form.html:121 -#: templates/layouts/partials/topbar.html:93 -#: templates/px_sources/source_detail.html:392 +#: templates/accounts/staff_activity_log.html:126 +#: templates/layouts/partials/topbar.html:94 +#: templates/px_sources/source_detail.html:478 #: templates/px_sources/source_user_confirm_delete.html:61 msgid "User" msgstr "مستخدم" @@ -4770,6 +8266,8 @@ msgid "Pending Items" msgstr "العناصر المعلقة" #: templates/accounts/acknowledgements/compliance.html:140 +#: templates/analytics/dashboard.html:1880 +#: templates/dashboard/employee_evaluation_charts.html:562 msgid "Completion" msgstr "الإكمال" @@ -4797,28 +8295,6 @@ msgstr "إقراراتي" msgid "Review and sign required acknowledgements" msgstr "مراجعة والتوقيع على الإقرارات المطلوبة" -#: templates/accounts/acknowledgements/dashboard.html:39 -#: templates/accounts/simple_acknowledgements/admin_list.html:87 -#: templates/actions/action_list.html:138 -#: templates/complaints/analytics.html:308 -#: templates/config/routing_rules.html:33 templates/config/sla_config.html:33 -#: templates/dashboard/admin_evaluation.html:452 -#: templates/dashboard/admin_evaluation.html:529 -#: templates/dashboard/command_center.html:871 -#: templates/dashboard/employee_evaluation.html:846 -#: templates/dashboard/employee_evaluation.html:915 -#: templates/dashboard/employee_evaluation.html:965 -#: templates/dashboard/employee_evaluation.html:1010 -#: templates/dashboard/employee_evaluation.html:1060 -#: templates/observations/observation_list.html:110 -#: templates/rca/rca_list.html:89 templates/social/social_platform.html:130 -#: templates/standards/dashboard.html:105 -#: templates/surveys/analytics_reports.html:38 -#: templates/surveys/bulk_job_status.html:51 -#: templates/surveys/comment_list.html:87 -msgid "Total" -msgstr "الإجمالي" - #: templates/accounts/acknowledgements/dashboard.html:95 #: templates/accounts/acknowledgements/sign.html:24 #: templates/accounts/onboarding/checklist_list.html:106 @@ -4829,9 +8305,9 @@ msgstr "الإجمالي" #: templates/accounts/simple_acknowledgements/admin_form.html:179 #: templates/accounts/simple_acknowledgements/admin_list.html:145 #: templates/accounts/simple_acknowledgements/list.html:159 -#: templates/surveys/template_detail.html:134 -#: templates/surveys/template_form.html:295 -#: templates/surveys/template_form.html:397 +#: templates/surveys/template_detail.html:157 +#: templates/surveys/template_form.html:402 +#: templates/surveys/template_form.html:551 msgid "Required" msgstr "مطلوب" @@ -4852,12 +8328,6 @@ msgstr "تم إكمال جميع الإقرارات!" msgid "Signed" msgstr "مُوقّع" -#: templates/accounts/acknowledgements/dashboard.html:159 -#: templates/accounts/simple_acknowledgements/admin_list.html:120 -#: templates/reports/report_detail.html:75 -msgid "PDF" -msgstr "PDF" - #: templates/accounts/acknowledgements/dashboard.html:171 msgid "No completed acknowledgements yet" msgstr "لا توجد إقرارات مكتملة بعد" @@ -4871,17 +8341,16 @@ msgstr "توقيع الإقرار" #: templates/accounts/acknowledgements/sign.html:12 #: templates/accounts/acknowledgements/signed_list.html:71 -#: templates/accounts/change_password.html:165 +#: templates/accounts/change_password.html:161 #: templates/accounts/onboarding/bulk_invite.html:17 #: templates/accounts/onboarding/category_list.html:44 #: templates/accounts/onboarding/content_list.html:62 #: templates/accounts/onboarding/preview_wizard.html:17 #: templates/accounts/onboarding/progress_detail.html:17 #: templates/accounts/onboarding/provisional_list.html:62 -#: templates/references/search.html:166 +#: templates/references/search.html:166 templates/social/comments_list.html:46 #: templates/standards/department_standards.html:83 #: templates/standards/search.html:76 -#: templates/standards/standard_detail.html:94 #: templates/standards/standard_form.html:129 msgid "Back to Dashboard" msgstr "العودة إلى لوحة التحكم" @@ -4906,8 +8375,8 @@ msgstr "اكتب اسمك الكامل كتوقيع" #: templates/accounts/acknowledgements/sign.html:59 msgid "" -"By typing your name above, you acknowledge that you have read and understood" -" this statement." +"By typing your name above, you acknowledge that you have read and understood " +"this statement." msgstr "من خلال كتابة اسمك أعلاه، فإنك تقر بأنك قد قرأت وفهمت هذه البيانات." #: templates/accounts/acknowledgements/sign.html:68 @@ -4951,12 +8420,6 @@ msgstr "وقت التوقيع" msgid "Signature" msgstr "التوقيع" -#: templates/accounts/acknowledgements/signed_list.html:144 -#: templates/analytics/kpi_report_list.html:259 -#: templates/analytics/kpi_report_pdf.html:632 -msgid "Download PDF" -msgstr "تحميل PDF" - #: templates/accounts/acknowledgements/signed_list.html:149 msgid "PDF not available" msgstr "ملف PDF غير متاح" @@ -4973,62 +8436,61 @@ msgstr "لم توقع أي إقرارات حتى الآن." msgid "View Pending Acknowledgements" msgstr "عرض الإخطارات المعلقة" -#: templates/accounts/change_password.html:7 +#: templates/accounts/change_password.html:8 msgid "Change Password - PX360" msgstr "تغيير كلمة المرور - PX360" -#: templates/accounts/change_password.html:37 -#: templates/accounts/change_password.html:156 -#: templates/accounts/settings.html:315 -#: templates/layouts/source_user_base.html:194 +#: templates/accounts/change_password.html:33 +#: templates/accounts/change_password.html:152 +#: templates/accounts/settings.html:332 +#: templates/layouts/source_user_base.html:217 msgid "Change Password" msgstr "تغيير كلمة المرور" -#: templates/accounts/change_password.html:38 +#: templates/accounts/change_password.html:34 msgid "Secure your account with a new password" msgstr "أمّن حسابك باستخدام كلمة مرور جديدة" -#: templates/accounts/change_password.html:63 +#: templates/accounts/change_password.html:59 msgid "Password Requirements:" msgstr "متطلبات كلمة المرور:" -#: templates/accounts/change_password.html:67 -#: templates/accounts/settings.html:304 -#: templates/px_sources/source_user_form.html:264 +#: templates/accounts/change_password.html:63 +#: templates/accounts/settings.html:321 +#: templates/px_sources/source_user_form.html:232 msgid "Minimum 8 characters" msgstr "حد أدنى 8 أحرف" -#: templates/accounts/change_password.html:71 +#: templates/accounts/change_password.html:67 msgid "Cannot be too common" msgstr "لا يمكن أن تكون شائعة جدًا" -#: templates/accounts/change_password.html:75 +#: templates/accounts/change_password.html:71 msgid "Cannot be entirely numeric" msgstr "لا يمكن أن تكون أرقامًا فقط" -#: templates/accounts/change_password.html:79 +#: templates/accounts/change_password.html:75 msgid "Must be different from your current password" msgstr "يجب أن تكون مختلفة عن كلمة المرور الحالية" -#: templates/accounts/change_password.html:91 -#: templates/accounts/password_reset_confirm.html:69 -#: templates/accounts/settings.html:302 -#: templates/organizations/staff_detail.html:383 +#: templates/accounts/change_password.html:87 +#: templates/accounts/password_reset_confirm.html:65 +#: templates/accounts/settings.html:319 msgid "New Password" msgstr "كلمة المرور الجديدة" -#: templates/accounts/change_password.html:99 -#: templates/accounts/password_reset_confirm.html:77 +#: templates/accounts/change_password.html:95 +#: templates/accounts/password_reset_confirm.html:73 msgid "Enter new password" msgstr "أدخل كلمة المرور الجديدة" -#: templates/accounts/change_password.html:124 -#: templates/accounts/settings.html:308 +#: templates/accounts/change_password.html:120 +#: templates/accounts/settings.html:325 msgid "Confirm New Password" msgstr "تأكيد كلمة المرور الجديدة" -#: templates/accounts/change_password.html:132 -#: templates/accounts/password_reset_confirm.html:110 +#: templates/accounts/change_password.html:128 +#: templates/accounts/password_reset_confirm.html:106 msgid "Confirm new password" msgstr "تأكيد كلمة المرور الجديدة" @@ -5036,26 +8498,16 @@ msgstr "تأكيد كلمة المرور الجديدة" msgid "Password Reset Request - PX360 Al Hammadi Hospital" msgstr "طلب إعادة تعيين كلمة المرور - مستشفى PX360 آل حمادي" -#: templates/accounts/email/password_reset_email.html:6 +#: templates/accounts/email/password_reset_email.html:5 msgid "We received a request to reset your password. Click to reset it now." msgstr "" -"لقد تلقينا طلباً لإعادة تعيين كلمة المرور الخاصة بك. اضغط لإعادة تعيينها " -"الآن." +"لقد تلقينا طلباً لإعادة تعيين كلمة المرور الخاصة بك. اضغط لإعادة تعيينها الآن." -#: templates/accounts/email/password_reset_email.html:8 -msgid "Password Reset Request" -msgstr "طلب إعادة تعيين كلمة المرور" - -#: templates/accounts/email/password_reset_email.html:10 -#: templates/accounts/login.html:40 -msgid "Patient Experience Management System" -msgstr "نظام إدارة تجربة المريض" - -#: templates/accounts/email/password_reset_email.html:18 +#: templates/accounts/email/password_reset_email.html:9 msgid "Hello" msgstr "مرحباً" -#: templates/accounts/email/password_reset_email.html:21 +#: templates/accounts/email/password_reset_email.html:13 msgid "" "We received a request to reset your password for your PX360 account. If you " "made this request, click the button below to reset your password:" @@ -5063,17 +8515,21 @@ msgstr "" "لقد تلقينا طلبًا لإعادة تعيين كلمة المرور لحسابك في PX360. إذا كنت قد قدمت " "هذا الطلب، يرجى النقر على الزر أدناه لإعادة تعيين كلمة المرور:" -#: templates/accounts/email/password_reset_email.html:32 +#: templates/accounts/email/password_reset_email.html:21 +msgid "Reset My Password" +msgstr "إعادة تعيين كلمة المرور" + +#: templates/accounts/email/password_reset_email.html:28 msgid "Or copy and paste this link into your browser:" msgstr "أو انسخ الرابط التالي والصقه في متصفحك:" -#: templates/accounts/email/password_reset_email.html:46 -#: templates/accounts/onboarding/invitation_email.html:42 -#: templates/emails/explanation_reminder.html:76 +#: templates/accounts/email/password_reset_email.html:35 +#: templates/accounts/onboarding/invitation_email.html:34 +#: templates/config/emails/user_created_email.html:26 msgid "Important:" msgstr "مهم:" -#: templates/accounts/email/password_reset_email.html:49 +#: templates/accounts/email/password_reset_email.html:35 msgid "" "This link will expire in 24 hours. If you didn't request this password " "reset, please ignore this email and your password will remain unchanged." @@ -5081,55 +8537,48 @@ msgstr "" "ستنتهي صلاحية هذا الرابط خلال 24 ساعة. إذا لم تقم بطلب إعادة تعيين كلمة " "المرور، يرجى تجاهل هذه الرسالة وستبقى كلمة المرور الخاصة بك دون تغيير." -#: templates/accounts/email/password_reset_email.html:60 +#: templates/accounts/email/password_reset_email.html:39 msgid "If you continue to have problems, please contact our support team." msgstr "إذا استمرت المشكلة، يرجى التواصل مع فريق الدعم." -#: templates/accounts/email/password_reset_email.html:68 -msgid "Reset My Password" -msgstr "إعادة تعيين كلمة المرور" - #: templates/accounts/email/password_reset_subject.txt:1 msgid "Reset Your Password - PX360" msgstr "إعادة تعيين كلمة المرور - PX360" -#: templates/accounts/login.html:7 +#: templates/accounts/login.html:8 msgid "Login - PX360" msgstr "تسجيل الدخول - PX360" -#: templates/accounts/login.html:39 +#: templates/accounts/login.html:35 #: templates/accounts/onboarding/welcome.html:6 -#: templates/organizations/emails/staff_credentials.html:8 msgid "Welcome to PX360" msgstr "مرحبًا بك في PX360" -#: templates/accounts/login.html:80 templates/accounts/password_reset.html:76 +#: templates/accounts/login.html:36 +msgid "Patient Experience Management System" +msgstr "نظام إدارة تجربة المريض" + +#: templates/accounts/login.html:76 templates/accounts/password_reset.html:72 msgid "Enter your email" msgstr "أدخل بريدك الإلكتروني" -#: templates/accounts/login.html:89 -#: templates/accounts/onboarding/step_activation.html:75 -#: templates/px_sources/source_user_form.html:258 -msgid "Password" -msgstr "كلمة المرور" - -#: templates/accounts/login.html:97 +#: templates/accounts/login.html:93 msgid "Enter your password" msgstr "أدخل كلمة المرور" -#: templates/accounts/login.html:112 +#: templates/accounts/login.html:108 msgid "Remember me" msgstr "تذكرني" -#: templates/accounts/login.html:116 +#: templates/accounts/login.html:112 msgid "Forgot password?" msgstr "نسيت كلمة المرور؟" -#: templates/accounts/login.html:124 +#: templates/accounts/login.html:120 msgid "Sign In" msgstr "تسجيل الدخول" -#: templates/accounts/login.html:152 +#: templates/accounts/login.html:148 msgid "Secure login powered by" msgstr "تسجيل دخول آمن بدعم من" @@ -5176,8 +8625,8 @@ msgid "Check with IT support if you continue to have issues" msgstr "تحقق مع دعم تقني المعلومات إذا استمرت في مواجهة مشاكل" #: templates/accounts/onboarding/activation_error.html:66 -#: templates/accounts/password_reset.html:99 -#: templates/accounts/password_reset_confirm.html:153 +#: templates/accounts/password_reset.html:95 +#: templates/accounts/password_reset_confirm.html:149 msgid "Back to Login" msgstr "العودة إلى تسجيل الدخول" @@ -5200,6 +8649,7 @@ msgstr "جاري إرسال الدعوات..." #: templates/accounts/onboarding/bulk_invite.html:38 #: templates/callcenter/import_call_records.html:76 +#: templates/organizations/staff_import.html:60 #: templates/physicians/doctor_rating_import.html:109 #: templates/surveys/his_patient_import.html:32 msgid "Upload CSV File" @@ -5231,10 +8681,9 @@ msgid "Or Enter Email Addresses" msgstr "أو أدخل عناوين البريد الإلكتروني" #: templates/accounts/onboarding/bulk_invite.html:72 -#, fuzzy -#| msgid "Assign To" +#: templates/organizations/staff_detail.html:506 msgid "Assign Role" -msgstr "تعيين إلى" +msgstr "تعيين الدور" #: templates/accounts/onboarding/bulk_invite.html:74 #: templates/complaints/escalation_rule_form.html:278 @@ -5244,10 +8693,8 @@ msgid "Select Role" msgstr "اختر الدور" #: templates/accounts/onboarding/bulk_invite.html:81 -#, fuzzy -#| msgid "Add Hospital" msgid "Assign Hospital" -msgstr "إضافة مستشفى" +msgstr "تعيين المستشفى" #: templates/accounts/onboarding/bulk_invite.html:90 msgid "" @@ -5298,7 +8745,7 @@ msgid "Monitor completion from the dashboard" msgstr "راقب الإكمال من لوحة التحكم" #: templates/accounts/onboarding/bulk_invite.html:152 -#: templates/analytics/kpi_report_generate.html:223 +#: templates/analytics/kpi_report_generate.html:241 #: templates/physicians/doctor_rating_fetch.html:190 #: templates/physicians/doctor_rating_import.html:217 msgid "Quick Tips" @@ -5322,16 +8769,12 @@ msgstr "تحقق مزدوج من عناوين البريد الإلكتروني #: templates/accounts/onboarding/category_list.html:4 #: templates/accounts/onboarding/checklist_list.html:70 -#, fuzzy -#| msgid "Standard Categories" msgid "Manage Categories" -msgstr "فئات المعايير" +msgstr "إدارة الفئات" #: templates/accounts/onboarding/category_list.html:47 -#, fuzzy -#| msgid "Manage acknowledgement checklist items" msgid "Manage acknowledgement categories and departments" -msgstr "إدارة عناصر قائمة التحقق للتأكيد" +msgstr "إدارة فئات الإقرار والأقسام" #: templates/accounts/onboarding/category_list.html:52 #: templates/accounts/onboarding/category_list.html:134 @@ -5354,16 +8797,20 @@ msgstr "الافتراضي" #: templates/accounts/onboarding/provisional_list.html:221 #: templates/complaints/sla_management.html:324 #: templates/complaints/sla_management.html:419 -#: templates/px_sources/source_detail.html:499 +#: templates/px_sources/source_detail.html:585 #: templates/px_sources/source_list.html:274 msgid "Deactivate" msgstr "إلغاء التنشيط" #: templates/accounts/onboarding/category_list.html:111 -#: templates/complaints/complaint_detail.html:378 +#: templates/complaints/complaint_detail.html:176 +#: templates/complaints/complaint_detail.html:228 +#: templates/complaints/complaint_detail.html:730 +#: templates/complaints/inquiry_detail.html:453 #: templates/complaints/sla_management.html:324 #: templates/complaints/sla_management.html:419 -#: templates/px_sources/source_detail.html:505 +#: templates/observations/observation_detail.html:489 +#: templates/px_sources/source_detail.html:591 #: templates/px_sources/source_list.html:274 msgid "Activate" msgstr "تفعيل" @@ -5375,34 +8822,50 @@ msgstr "تفعيل" #: templates/accounts/simple_acknowledgements/admin_list.html:182 #: templates/appreciation/badge_list.html:142 #: templates/complaints/adverse_action_list.html:332 +#: templates/complaints/complaint_detail.html:764 #: templates/complaints/complaint_threshold_list.html:316 #: templates/complaints/escalation_rule_list.html:364 #: templates/complaints/partials/adverse_actions_panel.html:110 #: templates/complaints/templates/template_list.html:250 +#: templates/feedback/feedback_delete_confirm.html:57 #: templates/integrations/survey_mapping_settings.html:70 #: templates/integrations/survey_mapping_settings.html:233 #: templates/journeys/template_detail.html:24 #: templates/journeys/template_list.html:124 #: templates/journeys/template_list.html:194 #: templates/observations/category_list.html:139 -#: templates/organizations/patient_detail.html:209 +#: templates/observations/observation_detail.html:575 +#: templates/organizations/department_confirm_delete.html:49 +#: templates/organizations/department_detail.html:683 +#: templates/organizations/manager_review_questions.html:60 +#: templates/organizations/orgsection_confirm_delete.html:49 +#: templates/organizations/orgsection_detail.html:172 +#: templates/organizations/orgsection_list.html:170 +#: templates/organizations/orgsubsection_confirm_delete.html:49 +#: templates/organizations/orgsubsection_list.html:163 +#: templates/organizations/patient_detail.html:204 #: templates/organizations/physician_list.html:118 #: templates/organizations/section_confirm_delete.html:49 #: templates/organizations/section_list.html:163 #: templates/organizations/subsection_confirm_delete.html:49 #: templates/organizations/subsection_list.html:163 -#: templates/projects/project_detail.html:48 -#: templates/projects/project_detail.html:125 +#: templates/presentations/presentation_detail.html:178 +#: templates/projects/focus_phase_detail.html:181 +#: templates/projects/partials/task_row.html:110 +#: templates/projects/pdca_phase_detail.html:180 +#: templates/projects/project_detail.html:114 #: templates/projects/template_detail.html:42 #: templates/px_sources/source_confirm_delete.html:15 #: templates/px_sources/source_detail.html:128 #: templates/px_sources/source_list.html:284 templates/rca/rca_detail.html:91 #: templates/reports/report_detail.html:79 #: templates/reports/saved_reports.html:129 +#: templates/standards/activity_type_list.html:165 #: templates/standards/category_list.html:176 -#: templates/standards/department_standards.html:675 +#: templates/standards/department_standards.html:774 #: templates/standards/source_list.html:182 -#: templates/standards/standard_detail.html:90 +#: templates/standards/standard_detail.html:113 +#: templates/standards/standard_detail.html:793 #: templates/surveys/analytics_reports.html:150 #: templates/surveys/template_list.html:132 #: templates/surveys/template_list.html:211 @@ -5410,31 +8873,23 @@ msgid "Delete" msgstr "حذف" #: templates/accounts/onboarding/category_list.html:131 -#, fuzzy -#| msgid "Start by adding your first onboarding content item" msgid "Start by adding your first category" -msgstr "ابدأ بإضافة أول عنصر لمحتوى الإعداد" +msgstr "ابدأ بإضافة فئتك الأولى" #: templates/accounts/onboarding/category_list.html:147 #: templates/accounts/onboarding/category_list.html:281 #: templates/accounts/onboarding/checklist_list.html:368 #: templates/accounts/onboarding/checklist_list.html:701 -#, fuzzy -#| msgid "New Category" msgid "Add New Category" -msgstr "فئة جديدة" +msgstr "إضافة فئة جديدة" #: templates/accounts/onboarding/category_list.html:170 #: templates/accounts/onboarding/checklist_list.html:390 -#, fuzzy -#| msgid "OPD - Clinics" msgid "e.g. Clinics" -msgstr "العيادات الخارجية" +msgstr "مثال: العيادات" #: templates/accounts/onboarding/category_list.html:181 #: templates/accounts/onboarding/checklist_list.html:400 -#, fuzzy -#| msgid "Arabic Name" msgid "Arabic name" msgstr "الاسم بالعربية" @@ -5445,40 +8900,34 @@ msgstr "مثال: عيادات" #: templates/accounts/onboarding/category_list.html:203 #: templates/accounts/onboarding/checklist_list.html:420 -#, fuzzy -#| msgid "pending users" msgid "e.g. building, user" -msgstr "المستخدمون المعلقون" +msgstr "مثال: مبنى، مستخدم" #: templates/accounts/onboarding/category_list.html:240 #: templates/accounts/onboarding/checklist_list.html:454 -#, fuzzy -#| msgid "No description" msgid "Category description" -msgstr "لا يوجد وصف" +msgstr "وصف الفئة" #: templates/accounts/onboarding/category_list.html:327 #: templates/accounts/onboarding/checklist_list.html:576 #: templates/accounts/onboarding/checklist_list.html:777 #: templates/accounts/onboarding/content_list.html:386 +#: templates/complaints/inquiry_form.html:79 #: templates/integrations/survey_mapping_settings.html:433 -#: templates/standards/department_standards.html:225 +#: templates/standards/department_standards.html:324 +#: templates/standards/search.html:457 msgid "Saving..." msgstr "جارٍ الحفظ..." #: templates/accounts/onboarding/category_list.html:349 #: templates/accounts/onboarding/checklist_list.html:799 -#, fuzzy -#| msgid "Template updated successfully!" msgid "Category updated successfully!" -msgstr "تم تحديث القالب بنجاح!" +msgstr "تم تحديث الفئة بنجاح!" #: templates/accounts/onboarding/category_list.html:350 #: templates/accounts/onboarding/checklist_list.html:800 -#, fuzzy -#| msgid "Template created successfully!" msgid "Category created successfully!" -msgstr "تم إنشاء القالب بنجاح!" +msgstr "تم إنشاء الفئة بنجاح!" #: templates/accounts/onboarding/category_list.html:362 #: templates/accounts/onboarding/category_list.html:426 @@ -5488,11 +8937,14 @@ msgstr "تم إنشاء القالب بنجاح!" #: templates/accounts/onboarding/checklist_list.html:813 #: templates/accounts/onboarding/content_list.html:421 #: templates/accounts/onboarding/content_list.html:493 -#: templates/complaints/partials/explanation_panel.html:244 -#: templates/complaints/partials/explanation_panel.html:269 -#: templates/complaints/partials/explanation_panel.html:302 -#: templates/complaints/partials/explanation_panel.html:381 -#: templates/complaints/partials/resolution_panel.html:205 +#: templates/complaints/partials/ai_helper_panel.html:66 +#: templates/complaints/partials/ai_panel.html:374 +#: templates/complaints/partials/explanation_panel.html:425 +#: templates/complaints/partials/explanation_panel.html:450 +#: templates/complaints/partials/explanation_panel.html:483 +#: templates/complaints/partials/explanation_panel.html:559 +#: templates/complaints/partials/resolution_panel.html:279 +#: templates/core/public_track.html:384 msgid "An error occurred. Please try again." msgstr "حدث خطأ. يرجى المحاولة مرة أخرى." @@ -5500,41 +8952,31 @@ msgstr "حدث خطأ. يرجى المحاولة مرة أخرى." #: templates/accounts/onboarding/checklist_list.html:845 #: templates/standards/category_form.html:4 #: templates/standards/category_form.html:66 -#: templates/standards/category_form.html:140 +#: templates/standards/category_form.html:160 msgid "Update Category" msgstr "تحديث الفئة" #: templates/accounts/onboarding/category_list.html:399 #: templates/accounts/onboarding/checklist_list.html:850 -#, fuzzy -#| msgid "Failed to load locations" msgid "Failed to load category" -msgstr "فشل تحميل المواقع" +msgstr "فشل في تحميل الفئة" #: templates/accounts/onboarding/category_list.html:403 #: templates/accounts/onboarding/checklist_list.html:854 -#, fuzzy -#| msgid "An error occurred loading the item" msgid "An error occurred loading the category" -msgstr "حدث خطأ أثناء تحميل العنصر" +msgstr "حدث خطأ أثناء تحميل الفئة" #: templates/accounts/onboarding/category_list.html:418 -#, fuzzy -#| msgid "deactivated" msgid "Category deactivated" -msgstr "غير مفعل" +msgstr "تم إلغاء تنشيط الفئة" #: templates/accounts/onboarding/category_list.html:419 -#, fuzzy -#| msgid "Category name" msgid "Category activated" -msgstr "اسم الفئة" +msgstr "تم تنشيط الفئة" #: templates/accounts/onboarding/category_list.html:422 -#, fuzzy -#| msgid "Failed to update setting" msgid "Failed to update category" -msgstr "فشل تحديث الإعداد" +msgstr "فشل في تحديث الفئة" #: templates/accounts/onboarding/category_list.html:431 #: templates/observations/category_list.html:137 @@ -5543,24 +8985,20 @@ msgid "Are you sure you want to delete this category?" msgstr "هل أنت متأكد من أنك تريد حذف هذه الفئة؟" #: templates/accounts/onboarding/category_list.html:441 -#, fuzzy -#| msgid "Task deleted successfully." msgid "Category deleted successfully!" -msgstr "تم حذف المهمة بنجاح." +msgstr "تم حذف الفئة بنجاح!" #: templates/accounts/onboarding/category_list.html:447 msgid "" "Cannot delete this category because it has linked content or checklist " "items. Deactivate it instead." msgstr "" -"لا يمكن حذف هذه الفئة لأنها محتوى مرتبط أو عناصر قائمة مرجعية. بدلاً من ذلك،" -" قم بإلغاء تنشيطها." +"لا يمكن حذف هذه الفئة لأنها محتوى مرتبط أو عناصر قائمة مرجعية. بدلاً من ذلك، " +"قم بإلغاء تنشيطها." #: templates/accounts/onboarding/category_list.html:449 -#, fuzzy -#| msgid "Failed to delete checklist item" msgid "Failed to delete category" -msgstr "فشل في حذف عنصر القائمة" +msgstr "فشل حذف الفئة" #: templates/accounts/onboarding/checklist_list.html:75 msgid "Add Checklist Item" @@ -5581,10 +9019,14 @@ msgstr "نص العنصر" #: templates/accounts/onboarding/checklist_list.html:104 #: templates/accounts/onboarding/dashboard.html:223 #: templates/accounts/onboarding/provisional_list.html:136 -#: templates/accounts/settings.html:418 +#: templates/accounts/settings.html:435 #: templates/complaints/involved_department_form.html:149 #: templates/complaints/involved_staff_form.html:142 +#: templates/complaints/partials/departments_panel.html:35 +#: templates/complaints/partials/staff_panel.html:19 #: templates/config/hospital_users.html:186 +#: templates/organizations/department_staff_detail.html:218 +#: templates/organizations/staff_detail.html:240 msgid "Role" msgstr "الدور" @@ -5593,44 +9035,9 @@ msgstr "الدور" msgid "Linked Content" msgstr "المحتوى المرتبط" -#: templates/accounts/onboarding/checklist_list.html:109 -#: templates/actions/action_detail.html:189 -#: templates/ai_engine/sentiment_detail.html:171 -#: templates/callcenter/complaint_list.html:183 -#: templates/callcenter/inquiry_list.html:179 -#: templates/complaints/inquiry_list.html:234 -#: templates/dashboard/partials/observations_table.html:28 -#: templates/feedback/feedback_list.html:362 -#: templates/organizations/patient_detail.html:607 -#: templates/organizations/staff_detail.html:225 -#: templates/organizations/staff_detail.html:286 -#: templates/physicians/doctor_rating_job_list.html:110 -#: templates/physicians/doctor_rating_job_status.html:176 -#: templates/projects/template_detail.html:125 -#: templates/px_sources/source_detail.html:180 -#: templates/px_sources/source_user_complaint_list.html:188 -#: templates/px_sources/source_user_inquiry_list.html:175 -#: templates/rca/rca_detail.html:156 templates/rca/rca_list.html:233 -#: templates/references/document_view.html:268 -#: templates/references/document_view.html:304 -#: templates/references/document_view.html:425 -#: templates/reports/report_detail.html:109 -#: templates/reports/report_detail.html:212 -#: templates/reports/saved_reports.html:101 -#: templates/surveys/analytics_report_info.html:35 -#: templates/surveys/analytics_report_info.html:83 -#: templates/surveys/analytics_report_markdown_view.html:107 -#: templates/surveys/analytics_report_view.html:35 -#: templates/surveys/analytics_reports.html:102 -#: templates/surveys/bulk_job_list.html:90 -msgid "Created" -msgstr "تاريخ الإنشاء" - #: templates/accounts/onboarding/checklist_list.html:135 -#, fuzzy -#| msgid "New Category" msgid "No Category" -msgstr "فئة جديدة" +msgstr "لا توجد فئة" #: templates/accounts/onboarding/checklist_list.html:190 msgid "No checklist items found" @@ -5712,10 +9119,8 @@ msgid "Failed to delete checklist item" msgstr "فشل في حذف عنصر القائمة" #: templates/accounts/onboarding/checklist_list.html:808 -#, fuzzy -#| msgid "Failed to create action" msgid "Failed to save category" -msgstr "فشل في إنشاء الإجراء" +msgstr "فشل حفظ الفئة" #: templates/accounts/onboarding/complete.html:6 msgid "Onboarding Complete" @@ -5741,9 +9146,8 @@ msgstr "" "تم إعداد حسابك الآن وجاهز للاستخدام. يمكنك البدء في استكشاف نظام PX360." #: templates/accounts/onboarding/complete.html:42 -#: templates/accounts/onboarding/completion_email.html:84 #: templates/callcenter/complaint_success.html:133 -#: templates/callcenter/inquiry_success.html:141 +#: templates/callcenter/inquiry_success.html:118 msgid "Next Steps" msgstr "الخطوات التالية" @@ -5756,7 +9160,7 @@ msgid "View complaints, surveys, and analytics" msgstr "عرض الشكاوى، والاستبيانات، والتحليلات" #: templates/accounts/onboarding/complete.html:61 -#: templates/accounts/settings.html:51 +#: templates/accounts/settings.html:55 msgid "Profile Settings" msgstr "إعدادات الملف الشخصي" @@ -5772,114 +9176,105 @@ msgstr "ابدأ الاستكشاف" msgid "User Onboarding Completed - Al Hammadi Hospital" msgstr "اكتملت عملية إعداد المستخدم - مستشفى الحمادي" -#: templates/accounts/onboarding/completion_email.html:6 +#: templates/accounts/onboarding/completion_email.html:5 msgid "A new user has completed onboarding and is now active." msgstr "أكمل مستخدم جديد عملية الإعداد وأصبح نشطًا الآن." -#: templates/accounts/onboarding/completion_email.html:8 -msgid "User Onboarding Completed" -msgstr "اكتملت عملية إعداد المستخدم" - -#: templates/accounts/onboarding/completion_email.html:10 -msgid "A new team member has joined PX360" -msgstr "انضم عضو جديد إلى فريق PX360" - -#: templates/accounts/onboarding/completion_email.html:18 +#: templates/accounts/onboarding/completion_email.html:9 msgid "" "A new user has successfully completed the onboarding process and is now " "active in the PX360 system." msgstr "أكمل مستخدم جديد عملية الإعداد بنجاح وأصبح نشطًا الآن في نظام PX360." -#: templates/accounts/onboarding/completion_email.html:29 -msgid "User Information" -msgstr "معلومات المستخدم" - -#: templates/accounts/onboarding/completion_email.html:36 +#: templates/accounts/onboarding/completion_email.html:12 #: templates/core/no_hospital_assigned.html:29 #: templates/journeys/instance_detail.html:327 #: templates/journeys/template_confirm_delete.html:32 msgid "Name:" msgstr "الاسم:" -#: templates/accounts/onboarding/completion_email.html:39 +#: templates/accounts/onboarding/completion_email.html:12 msgid "Not provided" msgstr "غير متوفر" -#: templates/accounts/onboarding/completion_email.html:44 -#: templates/callcenter/inquiry_success.html:97 -#: templates/config/emails/reset_password_email.html:35 -#: templates/config/hospital_users.html:390 +#: templates/accounts/onboarding/completion_email.html:13 +#: templates/callcenter/inquiry_success.html:71 +#: templates/complaints/emails/new_complaint_admin_en.html:24 +#: templates/config/emails/reset_password_email.html:16 +#: templates/config/emails/user_created_email.html:19 +#: templates/config/hospital_users.html:412 #: templates/core/no_hospital_assigned.html:28 -#: templates/emails/appointment_confirmation.html:154 +#: templates/emails/appointment_confirmation.html:42 #: templates/journeys/instance_detail.html:342 -#: templates/organizations/emails/staff_credentials.html:48 +#: templates/organizations/emails/staff_credentials.html:17 msgid "Email:" msgstr "البريد الإلكتروني:" -#: templates/accounts/onboarding/completion_email.html:52 +#: templates/accounts/onboarding/completion_email.html:14 msgid "Role:" msgstr "الدور:" -#: templates/accounts/onboarding/completion_email.html:55 -#: templates/accounts/onboarding/completion_email.html:63 -#: templates/accounts/settings.html:399 templates/accounts/settings.html:406 -#: templates/observations/observation_detail.html:296 -#: templates/observations/observation_detail.html:300 +#: templates/accounts/onboarding/completion_email.html:14 +#: templates/accounts/onboarding/completion_email.html:15 +#: templates/accounts/settings.html:416 templates/accounts/settings.html:423 +#: templates/observations/observation_detail.html:615 +#: templates/observations/observation_detail.html:619 +#: templates/organizations/department_detail.html:615 msgid "Not assigned" msgstr "غير معيّن" -#: templates/accounts/onboarding/completion_email.html:60 -#: templates/appreciation/appreciation_detail.html:156 -#: templates/appreciation/appreciation_send_form.html:286 -#: templates/callcenter/inquiry_success.html:109 -#: templates/emails/appointment_confirmation.html:68 -#: templates/emails/explanation_request.html:45 -#: templates/emails/new_observation_notification.html:46 -#: templates/emails/sla_reminder.html:87 -#: templates/emails/sla_second_reminder.html:90 +#: templates/accounts/onboarding/completion_email.html:15 +#: templates/callcenter/inquiry_success.html:83 +#: templates/complaints/emails/new_complaint_admin_en.html:26 +#: templates/emails/appointment_confirmation.html:20 +#: templates/emails/explanation_request.html:23 +#: templates/emails/inquiry_dept_response_escalation.html:18 +#: templates/emails/inquiry_dept_response_reminder.html:18 +#: templates/emails/new_observation_notification.html:23 +#: templates/emails/observation_assigned.html:27 +#: templates/emails/observation_dept_response_escalation.html:20 +#: templates/emails/observation_dept_response_reminder.html:20 +#: templates/emails/observation_monthly_followup.html:23 +#: templates/emails/observation_resolved.html:23 +#: templates/emails/sla_reminder.html:27 +#: templates/emails/sla_second_reminder.html:27 #: templates/journeys/instance_detail.html:174 msgid "Department:" msgstr "القسم:" -#: templates/accounts/onboarding/completion_email.html:68 +#: templates/accounts/onboarding/completion_email.html:16 #: templates/surveys/bulk_job_status.html:100 msgid "Completed At:" msgstr "تم الإكمال في:" -#: templates/accounts/onboarding/completion_email.html:87 -msgid "" -"The user can now access PX360 and begin using the platform. You may want to:" -msgstr "" -"يمكن للمستخدم الآن الوصول إلى PX360 والبدء في استخدام المنصة. قد ترغب في:" +#: templates/accounts/onboarding/completion_email.html:18 +msgid "Next Steps:" +msgstr "الخطوات التالية:" -#: templates/accounts/onboarding/completion_email.html:91 +#: templates/accounts/onboarding/completion_email.html:18 +msgid "The user can now access PX360. You may want to:" +msgstr "يمكن للمستخدم الآن الوصول إلى PX360. قد ترغب في:" + +#: templates/accounts/onboarding/completion_email.html:19 msgid "Welcome them to the team" msgstr "ترحيبهم بالفريق" -#: templates/accounts/onboarding/completion_email.html:92 +#: templates/accounts/onboarding/completion_email.html:20 msgid "Provide role-specific training if needed" msgstr "توفير تدريب مخصص للدور إذا لزم الأمر" -#: templates/accounts/onboarding/completion_email.html:93 +#: templates/accounts/onboarding/completion_email.html:21 msgid "Assign initial tasks or responsibilities" msgstr "تعيين المهام أو المسؤوليات الأولية" -#: templates/accounts/onboarding/completion_email.html:94 +#: templates/accounts/onboarding/completion_email.html:22 msgid "Introduce them to relevant team members" msgstr "قدّمهم إلى الأعضاء ذوي الصلة في الفريق" -#: templates/accounts/onboarding/completion_email.html:109 +#: templates/accounts/onboarding/completion_email.html:30 msgid "View User Profile" msgstr "عرض ملف المستخدم" -#: templates/accounts/onboarding/completion_email.html:123 -msgid "" -"If you need to make any changes to this user's account, please visit the " -"admin panel or contact support." -msgstr "" -"إذا كنت بحاجة إلى إجراء أي تغييرات على حساب هذا المستخدم، يرجى زيارة لوحة " -"التحكم أو الاتصال بالدعم." - #: templates/accounts/onboarding/content_list.html:4 msgid "Manage Onboarding Content" msgstr "إدارة محتوى الإعداد" @@ -5912,10 +9307,8 @@ msgstr "ابدأ بإضافة أول عنصر لمحتوى الإعداد" #: templates/accounts/onboarding/content_list.html:162 #: templates/accounts/onboarding/content_list.html:336 -#, fuzzy -#| msgid "Add Content" msgid "Add New Content" -msgstr "إضافة محتوى" +msgstr "إضافة محتوى جديد" #: templates/accounts/onboarding/content_list.html:186 msgid "e.g. GENERAL_ORIENT_01" @@ -5927,10 +9320,8 @@ msgid "Title (English)" msgstr "العنوان (إنجليزي)" #: templates/accounts/onboarding/content_list.html:210 -#, fuzzy -#| msgid "Enter document title in English" msgid "Content title in English" -msgstr "أدخل عنوان المستند باللغة الإنجليزية" +msgstr "عنوان المحتوى باللغة الإنجليزية" #: templates/accounts/onboarding/content_list.html:217 #: templates/references/document_form.html:265 @@ -5938,50 +9329,36 @@ msgid "Title (Arabic)" msgstr "العنوان (عربي)" #: templates/accounts/onboarding/content_list.html:221 -#, fuzzy -#| msgid "Enter document title (Arabic)" msgid "Content title in Arabic" -msgstr "أدخل عنوان المستند (بالعربية)" +msgstr "عنوان المحتوى باللغة العربية" #: templates/accounts/onboarding/content_list.html:232 -#, fuzzy -#| msgid "Describe the action plan..." msgid "Describe the content in English" -msgstr "صف خطة العمل..." +msgstr "وصف المحتوى باللغة الإنجليزية" #: templates/accounts/onboarding/content_list.html:243 -#, fuzzy -#| msgid "Describe the action plan..." msgid "Describe the content in Arabic" -msgstr "صف خطة العمل..." +msgstr "وصف المحتوى باللغة العربية" #: templates/accounts/onboarding/content_list.html:250 -#, fuzzy -#| msgid "Text (English)" msgid "Content Body (English)" -msgstr "النص (بالإنجليزية)" +msgstr "محتوى النص (باللغة الإنجليزية)" #: templates/accounts/onboarding/content_list.html:254 -#, fuzzy -#| msgid "Enter document title in English" msgid "Full content text in English" -msgstr "أدخل عنوان المستند باللغة الإنجليزية" +msgstr "نص المحتوى الكامل باللغة الإنجليزية" #: templates/accounts/onboarding/content_list.html:261 -#, fuzzy -#| msgid "Text (Arabic)" msgid "Content Body (Arabic)" -msgstr "النص (بالعربية)" +msgstr "نص المحتوى (بالعربية)" #: templates/accounts/onboarding/content_list.html:265 msgid "Full content text in Arabic" msgstr "نص المحتوى الكامل باللغة العربية" #: templates/accounts/onboarding/content_list.html:276 -#, fuzzy -#| msgid "e.g., fa-folder, fa-file-pdf" msgid "e.g. fa-user, fa-shield" -msgstr "مثال: fa-folder، fa-file-pdf" +msgstr "مثال: fa-user، fa-shield" #: templates/accounts/onboarding/content_list.html:287 #: templates/references/folder_form.html:223 @@ -5991,58 +9368,40 @@ msgstr "#007bff" #: templates/accounts/onboarding/content_list.html:320 #: templates/accounts/onboarding/content_list.html:337 #: templates/accounts/onboarding/content_list.html:425 -#, fuzzy -#| msgid "Save Patient" msgid "Save Content" -msgstr "حفظ المريض" +msgstr "حفظ المحتوى" #: templates/accounts/onboarding/content_list.html:408 -#, fuzzy -#| msgid "Source updated successfully!" msgid "Content updated successfully!" -msgstr "تم تحديث المصدر بنجاح!" +msgstr "تم تحديث المحتوى بنجاح!" #: templates/accounts/onboarding/content_list.html:409 -#, fuzzy -#| msgid "Source created successfully!" msgid "Content created successfully!" -msgstr "تم إنشاء المصدر بنجاح!" +msgstr "تم إنشاء المحتوى بنجاح!" #: templates/accounts/onboarding/content_list.html:458 -#, fuzzy -#| msgid "Add Content" msgid "Edit Content" -msgstr "إضافة محتوى" +msgstr "تعديل المحتوى" #: templates/accounts/onboarding/content_list.html:459 -#, fuzzy -#| msgid "Update Document" msgid "Update Content" -msgstr "تحديث المستند" +msgstr "تحديث المحتوى" #: templates/accounts/onboarding/content_list.html:464 -#, fuzzy -#| msgid "Failed to load checklist item" msgid "Failed to load content item" -msgstr "فشل في تحميل عنصر القائمة" +msgstr "فشل في تحميل عنصر المحتوى" #: templates/accounts/onboarding/content_list.html:473 -#, fuzzy -#| msgid "Are you sure you want to delete this content?" msgid "Are you sure you want to delete this content item?" -msgstr "هل أنت متأكد من رغبتك في حذف هذا المحتوى؟" +msgstr "هل أنت متأكد من رغبتك في حذف عنصر المحتوى هذا؟" #: templates/accounts/onboarding/content_list.html:486 -#, fuzzy -#| msgid "Checklist item deleted successfully!" msgid "Content item deleted successfully!" -msgstr "تم حذف عنصر القائمة بنجاح!" +msgstr "تم حذف عنصر المحتوى بنجاح!" #: templates/accounts/onboarding/content_list.html:489 -#, fuzzy -#| msgid "Failed to delete checklist item" msgid "Failed to delete content item" -msgstr "فشل في حذف عنصر القائمة" +msgstr "فشل حذف عنصر المحتوى" #: templates/accounts/onboarding/dashboard.html:4 msgid "Onboarding & Acknowledgements Dashboard" @@ -6093,6 +9452,9 @@ msgid "Manage checklist items" msgstr "إدارة عناصر قائمة التحقق" #: templates/accounts/onboarding/dashboard.html:112 +#: templates/complaints/government_ticket_import.html:169 +#: templates/complaints/partials/pdf_summary_panel.html:82 +#: templates/presentations/slide_form.html:60 msgid "Content" msgstr "المحتوى" @@ -6101,10 +9463,8 @@ msgid "Manage onboarding content" msgstr "إدارة محتوى الإعداد" #: templates/accounts/onboarding/dashboard.html:126 -#, fuzzy -#| msgid "Acknowledgement Categories" msgid "Manage acknowledgement categories" -msgstr "فئات الإقرار" +msgstr "إدارة فئات الإقرار" #: templates/accounts/onboarding/dashboard.html:136 msgid "Accounts" @@ -6116,7 +9476,7 @@ msgstr "عرض الحسابات المؤقتة" #: templates/accounts/onboarding/dashboard.html:149 #: templates/complaints/complaint_pdf.html:765 -#: templates/px_sources/source_detail.html:379 +#: templates/px_sources/source_detail.html:465 msgid "Recent Activity" msgstr "النشاط الأخير" @@ -6143,13 +9503,13 @@ msgstr "التفعيلات المعلقة" #: templates/accounts/onboarding/dashboard.html:224 #: templates/accounts/onboarding/provisional_list.html:142 -#: templates/surveys/instance_detail.html:521 +#: templates/surveys/instance_detail.html:383 msgid "Expires" msgstr "تنتهي صلاحيتها" #: templates/accounts/onboarding/dashboard.html:250 -#: templates/accounts/onboarding/reminder_email.html:123 -#: templates/analytics/kpi_report_pdf.html:894 +#: templates/accounts/onboarding/reminder_email.html:32 +#: templates/analytics/kpi_report_weasyprint.html:512 #: templates/callcenter/complaint_form.html:250 #: templates/dashboard/staff_performance_detail.html:147 msgid "days" @@ -6171,69 +9531,53 @@ msgstr "مرحبًا بك في PX360 - مستشفى الحمادي" msgid "You have been invited to join PX360. Complete your account setup." msgstr "لقد تمت دعوتك للانضمام إلى PX360. أكمل إعداد حسابك." -#: templates/accounts/onboarding/invitation_email.html:8 -#: templates/accounts/onboarding/welcome.html:18 -msgid "Welcome to PX360!" -msgstr "مرحبًا بك في PX360!" - -#: templates/accounts/onboarding/invitation_email.html:11 -#: templates/accounts/onboarding/reminder_email.html:18 +#: templates/accounts/onboarding/invitation_email.html:9 +#: templates/accounts/onboarding/reminder_email.html:9 #, python-format msgid "Hello %(name)s," msgstr "مرحبًا %(name)s،" -#: templates/accounts/onboarding/invitation_email.html:14 +#: templates/accounts/onboarding/invitation_email.html:13 msgid "" "You have been invited to join PX360, our comprehensive Patient Experience " -"management platform. To complete your account setup, please click the button" -" below." +"management platform. To complete your account setup, please click the button " +"below." msgstr "" -"لقد تمت دعوتك للانضمام إلى PX360، منصتنا الشاملة لإدارة تجربة المريض. لإكمال" -" إعداد حسابك، يرجى النقر على الزر أدناه." +"لقد تمت دعوتك للانضمام إلى PX360، منصتنا الشاملة لإدارة تجربة المريض. لإكمال " +"إعداد حسابك، يرجى النقر على الزر أدناه." -#: templates/accounts/onboarding/invitation_email.html:19 -#, fuzzy -#| msgid "During the onboarding process, you will:" +#: templates/accounts/onboarding/invitation_email.html:16 msgid "During onboarding, you will:" -msgstr "أثناء عملية الإعداد، ستقوم بما يلي:" +msgstr "أثناء الإعداد، سوف تقوم بـ:" -#: templates/accounts/onboarding/invitation_email.html:21 -#, fuzzy -#| msgid "Learn about PX360 features and your role responsibilities" +#: templates/accounts/onboarding/invitation_email.html:17 msgid "Learn about PX360 features and your role" -msgstr "تعلم ميزات PX360 ومسؤوليات دورك" +msgstr "التعرف على ميزات PX360 ودورك" -#: templates/accounts/onboarding/invitation_email.html:22 +#: templates/accounts/onboarding/invitation_email.html:18 msgid "Set up your profile and preferences" msgstr "قم بإعداد ملفك الشخصي وتفضيلاتك" -#: templates/accounts/onboarding/invitation_email.html:23 -#, fuzzy -#| msgid "Complete required training materials" +#: templates/accounts/onboarding/invitation_email.html:19 msgid "Complete required training" -msgstr "إكمال المواد التدريبية المطلوبة" +msgstr "أكمل التدريب المطلوب" -#: templates/accounts/onboarding/invitation_email.html:24 -#, fuzzy -#| msgid "Create Account" +#: templates/accounts/onboarding/invitation_email.html:20 msgid "Activate your account" -msgstr "إنشاء حساب" +msgstr "تفعيل حسابك" -#: templates/accounts/onboarding/invitation_email.html:34 +#: templates/accounts/onboarding/invitation_email.html:27 msgid "Complete Account Setup" msgstr "إكمال إعداد الحساب" -#: templates/accounts/onboarding/invitation_email.html:42 -#, fuzzy -#| msgid "Your invitation will expire in" +#: templates/accounts/onboarding/invitation_email.html:34 msgid "This invitation link will expire in 7 days." -msgstr "ستنتهي صلاحية دعوتك في" +msgstr "ستنتهي صلاحية رابط الدعوة هذا خلال 7 أيام." -#: templates/accounts/onboarding/invitation_email.html:47 +#: templates/accounts/onboarding/invitation_email.html:38 msgid "Need help? Contact support@alhammadi.com or call +966 11 123 4567." msgstr "" -"تحتاج إلى مساعدة؟ اتصل بـ support@alhammadi.com أو اتصل على +966 11 123 " -"4567." +"تحتاج إلى مساعدة؟ اتصل بـ support@alhammadi.com أو اتصل على +966 11 123 4567." #: templates/accounts/onboarding/preview_wizard.html:4 msgid "Preview Onboarding" @@ -6365,7 +9709,8 @@ msgstr "عرض الحسابات المعلقة التفعيل" #: templates/accounts/onboarding/provisional_list.html:73 #: templates/accounts/onboarding/provisional_list.html:251 -#: templates/px_sources/source_user_form.html:147 +#: templates/config/user_form.html:127 +#: templates/px_sources/source_user_form.html:100 msgid "Create New User" msgstr "إنشاء مستخدم جديد" @@ -6383,6 +9728,7 @@ msgstr "تمت الدعوة" #: templates/accounts/onboarding/provisional_list.html:181 #: templates/accounts/onboarding/provisional_list.html:198 +#: templates/social/dashboard.html:102 templates/social/dashboard.html:185 msgid "Expired" msgstr "منتهي الصلاحية" @@ -6410,39 +9756,9 @@ msgstr "جميع الحسابات مفعلة" msgid "There are no pending provisional accounts" msgstr "لا توجد حسابات مؤقتة معلقة" -#: templates/accounts/onboarding/provisional_list.html:274 -#: templates/accounts/settings.html:411 -#: templates/accounts/simple_acknowledgements/admin_upload_pdf.html:80 -#: templates/accounts/simple_acknowledgements/admin_upload_pdf.html:85 -#: templates/accounts/simple_acknowledgements/sign.html:78 -#: templates/organizations/staff_detail.html:110 -#: templates/organizations/staff_form.html:214 -#: templates/px_sources/source_user_form.html:248 -msgid "Employee ID" -msgstr "الرقم الوظيفي" - -#: templates/accounts/onboarding/provisional_list.html:285 -#: templates/accounts/settings.html:79 -#: templates/organizations/patient_detail.html:227 -#: templates/organizations/staff_form.html:113 -#: templates/px_sources/source_user_form.html:218 -msgid "First Name" -msgstr "الاسم الأول" - -#: templates/accounts/onboarding/provisional_list.html:294 -#: templates/accounts/settings.html:86 -#: templates/organizations/patient_detail.html:232 -#: templates/organizations/staff_form.html:128 -#: templates/px_sources/source_user_form.html:228 -msgid "Last Name" -msgstr "اسم العائلة" - -#: templates/accounts/onboarding/provisional_list.html:332 -msgid "Roles" -msgstr "الأدوار" - #: templates/accounts/onboarding/provisional_list.html:351 -#: templates/organizations/staff_list.html:340 +#: templates/config/hospital_users.html:225 templates/config/user_form.html:4 +#: templates/organizations/staff_list.html:345 msgid "Create User" msgstr "إنشاء مستخدم" @@ -6450,19 +9766,11 @@ msgstr "إنشاء مستخدم" msgid "Reminder: Complete Your PX360 Account Setup - Al Hammadi Hospital" msgstr "تذكير: إكمال إعداد حساب PX360 - مستشفى الحمادي" -#: templates/accounts/onboarding/reminder_email.html:6 +#: templates/accounts/onboarding/reminder_email.html:5 msgid "Your PX360 account setup is pending. Please complete before expiry." msgstr "إعداد حساب PX360 الخاص بك معلق. يرجى الإكمال قبل انتهاء الصلاحية." -#: templates/accounts/onboarding/reminder_email.html:8 -msgid "Reminder: Complete Your Setup" -msgstr "تذكير: إكمال إعدادك" - -#: templates/accounts/onboarding/reminder_email.html:10 -msgid "Your PX360 account invitation is still active" -msgstr "دعوة حساب PX360 الخاصة بك لا تزال نشطة" - -#: templates/accounts/onboarding/reminder_email.html:21 +#: templates/accounts/onboarding/reminder_email.html:13 msgid "" "We noticed that you haven't completed your PX360 account setup yet. Your " "invitation is still active, and we'd love to have you on board!" @@ -6470,70 +9778,34 @@ msgstr "" "لاحظنا أنك لم تكمل إعداد حساب PX360 بعد. دعوتك لا تزال نشطة، ونحن نتطلع إلى " "انضمامك!" -#: templates/accounts/onboarding/reminder_email.html:24 +#: templates/accounts/onboarding/reminder_email.html:17 msgid "Click the button below to continue where you left off:" msgstr "انقر على الزر أدناه للاستمرار من حيث توقفت:" -#: templates/accounts/onboarding/reminder_email.html:35 -msgid "Why Complete Your Setup?" -msgstr "لماذا إكمال إعدادك؟" - -#: templates/accounts/onboarding/reminder_email.html:49 -msgid "Access Your Dashboard:" -msgstr "الوصول إلى لوحة التحكم الخاصة بك:" - -#: templates/accounts/onboarding/reminder_email.html:49 -msgid "Manage your tasks and responsibilities" -msgstr "إدارة مهامك ومسؤولياتك" - -#: templates/accounts/onboarding/reminder_email.html:63 -msgid "Collaborate with Your Team:" -msgstr "التعاون مع فريقك:" - -#: templates/accounts/onboarding/reminder_email.html:63 -msgid "Connect with colleagues across departments" -msgstr "تواصل مع الزملاء عبر الأقسام" - -#: templates/accounts/onboarding/reminder_email.html:77 -msgid "Stay Updated:" -msgstr "ابق على اطلاع:" - -#: templates/accounts/onboarding/reminder_email.html:77 -msgid "Get real-time notifications and alerts" -msgstr "احصل على إشعارات وتنبيهات فورية" - -#: templates/accounts/onboarding/reminder_email.html:91 -msgid "Improve Patient Experience:" -msgstr "تحسين تجربة المريض:" - -#: templates/accounts/onboarding/reminder_email.html:91 -msgid "Contribute to better healthcare outcomes" -msgstr "ساهم في تحسين نتائج الرعاية الصحية" - -#: templates/accounts/onboarding/reminder_email.html:109 +#: templates/accounts/onboarding/reminder_email.html:25 msgid "Complete Your Setup" msgstr "أكمل إعدادك" -#: templates/accounts/onboarding/reminder_email.html:123 +#: templates/accounts/onboarding/reminder_email.html:32 msgid "Time Sensitive:" msgstr "حساسية الوقت:" -#: templates/accounts/onboarding/reminder_email.html:123 +#: templates/accounts/onboarding/reminder_email.html:32 msgid "Your invitation will expire in" msgstr "ستنتهي صلاحية دعوتك في" -#: templates/accounts/onboarding/reminder_email.html:123 +#: templates/accounts/onboarding/reminder_email.html:32 msgid "" "After that, you'll need to request a new invitation from your administrator." msgstr "بعد ذلك، ستحتاج إلى طلب دعوة جديدة من المسؤول الخاص بك." -#: templates/accounts/onboarding/reminder_email.html:134 -msgid "Need help? Contact our support team at" -msgstr "هل تحتاج إلى مساعدة؟ تواصل مع فريق الدعم لدينا على" - -#: templates/accounts/onboarding/reminder_email.html:136 -msgid "or call" -msgstr "أو اتصل" +#: templates/accounts/onboarding/reminder_email.html:36 +msgid "" +"Need help? Contact our support team at support@alhammadi.com or call +966 11 " +"123 4567." +msgstr "" +"هل تحتاج إلى مساعدة؟ اتصل بفريق الدعم لدينا على support@alhammadi.com أو " +"اتصل على +966 11 123 4567." #: templates/accounts/onboarding/step_activation.html:18 msgid "Create Your Account" @@ -6548,60 +9820,43 @@ msgid "Final Step" msgstr "الخطوة النهائية" #: templates/accounts/onboarding/step_activation.html:29 -#, fuzzy -#| msgid "All acknowledgements completed!" msgid "All acknowledgements completed" -msgstr "تم إكمال جميع الإقرارات!" +msgstr "تم إتمام جميع الإقرارات" #: templates/accounts/onboarding/step_activation.html:50 -#: templates/accounts/settings.html:376 +#: templates/accounts/settings.html:393 msgid "Full Name" msgstr "الاسم الكامل" #: templates/accounts/onboarding/step_activation.html:66 -#: templates/organizations/staff_detail.html:211 +#: templates/organizations/staff_detail.html:405 msgid "Username" msgstr "اسم المستخدم" #: templates/accounts/onboarding/step_activation.html:70 -#, fuzzy -#| msgid "Choose a user..." msgid "Choose a username" -msgstr "اختر مستخدمًا..." +msgstr "اختر اسم مستخدم" #: templates/accounts/onboarding/step_activation.html:79 -#, fuzzy -#| msgid "Create a strong password" msgid "Create a strong password (min 8 characters)" -msgstr "أنشئ كلمة مرور قوية" - -#: templates/accounts/onboarding/step_activation.html:84 -#: templates/accounts/password_reset_confirm.html:102 -#: templates/px_sources/source_user_form.html:271 -msgid "Confirm Password" -msgstr "تأكيد كلمة المرور" +msgstr "أنشئ كلمة مرور قوية (8 أحرف على الأقل)" #: templates/accounts/onboarding/step_activation.html:88 msgid "Confirm your password" msgstr "تأكيد كلمة المرور الخاصة بك" #: templates/accounts/onboarding/step_activation.html:98 -msgid "" -"This will be recorded as your digital signature for account activation." +msgid "This will be recorded as your digital signature for account activation." msgstr "سيُسجل هذا كتوقيعك الرقمي لتفعيل الحساب." #: templates/accounts/onboarding/step_activation.html:102 #: templates/accounts/onboarding/step_activation.html:189 -#, fuzzy -#| msgid "Create Account" msgid "Activate Account" -msgstr "إنشاء حساب" +msgstr "تفعيل الحساب" #: templates/accounts/onboarding/step_activation.html:142 -#, fuzzy -#| msgid "Active ratings" msgid "Activating..." -msgstr "التقييمات النشطة" +msgstr "جارٍ التفعيل..." #: templates/accounts/onboarding/step_activation.html:176 msgid "Activation failed. Please check your input and try again." @@ -6609,47 +9864,26 @@ msgstr "فشل التفعيل. يرجى التحقق من مدخلاتك وال #: templates/accounts/onboarding/step_checklist.html:6 #: templates/accounts/onboarding/step_checklist.html:18 -#, fuzzy -#| msgid "Acknowledgement Checklist Items" msgid "Acknowledgement Checklist" -msgstr "عناصر قائمة التحقق للتأكيد" +msgstr "قائمة الإقرار" #: templates/accounts/onboarding/step_checklist.html:21 -#, fuzzy -#| msgid "Please review the following important information" msgid "Please review and acknowledge the following items" -msgstr "يرجى مراجعة المعلومات المهمة التالية" +msgstr "يرجى مراجعة البنود التالية والإقرار بها" #: templates/accounts/onboarding/step_checklist.html:92 -#, fuzzy -#| msgid "No checklist items found" msgid "No checklist items found." -msgstr "لا توجد عناصر في قائمة التحقق" +msgstr "لم يتم العثور على أي عناصر في قائمة التدقيق." #: templates/accounts/onboarding/step_checklist.html:104 -#, fuzzy -#| msgid "Sign Acknowledgement" msgid "Sign to Acknowledge" -msgstr "توقيع الإقرار" - -#: templates/accounts/onboarding/step_checklist.html:118 -#: templates/accounts/onboarding/step_checklist.html:220 -#: templates/accounts/onboarding/welcome.html:54 -#: templates/appreciation/appreciation_detail.html:99 -msgid "Acknowledge" -msgstr "إقرار" +msgstr "التوقيع للإقرار" #: templates/accounts/onboarding/step_checklist.html:126 -#, fuzzy -#| msgid "Complete Account Setup" msgid "Continue to Account Setup" -msgstr "إكمال إعداد الحساب" +msgstr "المتابعة إلى إعداد الحساب" #: templates/accounts/onboarding/step_checklist.html:135 -#: templates/emails/observation_assigned.html:152 -#: templates/emails/observation_monthly_followup.html:133 -#: templates/emails/observation_sla_reminder.html:173 -#: templates/emails/sla_reminder.html:186 #: templates/observations/public_success.html:97 msgid "Important" msgstr "مهم" @@ -6663,70 +9897,35 @@ msgstr "" "تتمكن من تفعيل حسابك." #: templates/accounts/onboarding/step_checklist.html:184 -#: templates/layouts/base.html:287 +#: templates/config/hospital_users.html:602 templates/layouts/base.html:304 #: templates/physicians/doctor_rating_job_status.html:133 #: templates/surveys/manual_send_csv.html:217 msgid "Processing..." msgstr "جاري المعالجة..." #: templates/accounts/onboarding/step_checklist.html:216 -#, fuzzy -#| msgid "Failed to escalate. Please try again." msgid "Failed to acknowledge item. Please try again." -msgstr "فشل التصعيد. يرجى المحاولة مرة أخرى." +msgstr "فشل الإقرار بالعنصر. يرجى المحاولة مرة أخرى." #: templates/accounts/onboarding/step_content.html:34 msgid "Step" msgstr "الخطوة" #: templates/accounts/onboarding/step_content.html:81 -#, fuzzy -#| msgid "I have reviewed all the onboarding material above" msgid "I have reviewed the onboarding material above" -msgstr "لقد قمت بمراجعة جميع مواد الإعداد المذكورة أعلاه" - -#: templates/accounts/onboarding/step_content.html:93 -#: templates/actions/action_list.html:219 -#: templates/appreciation/appreciation_list.html:291 -#: templates/appreciation/appreciation_list.html:295 -#: templates/appreciation/badge_list.html:156 -#: templates/appreciation/badge_list.html:160 -#: templates/appreciation/leaderboard.html:145 -#: templates/appreciation/leaderboard.html:150 -#: templates/appreciation/my_badges.html:102 -#: templates/appreciation/my_badges.html:107 -#: templates/callcenter/call_records_list.html:304 -#: templates/callcenter/complaint_list.html:249 -#: templates/callcenter/inquiry_list.html:241 -#: templates/complaints/adverse_action_list.html:369 -#: templates/complaints/complaint_threshold_list.html:342 -#: templates/complaints/escalation_rule_list.html:390 -#: templates/complaints/inquiry_list.html:313 -#: templates/dashboard/complaint_request_list.html:140 -#: templates/dashboard/partials/actions_table.html:93 -#: templates/dashboard/partials/complaints_table.html:89 -#: templates/dashboard/partials/feedback_table.html:85 -#: templates/dashboard/partials/inquiries_table.html:87 -#: templates/dashboard/partials/observations_table.html:79 -#: templates/dashboard/partials/tasks_table.html:87 -#: templates/px_sources/source_user_complaint_list.html:275 -#: templates/px_sources/source_user_inquiry_list.html:254 -#: templates/references/search.html:303 -#: templates/reports/saved_reports.html:149 -msgid "Previous" -msgstr "السابق" +msgstr "لقد راجعت المواد التعريفية أعلاه" #: templates/accounts/onboarding/step_content.html:98 -#, fuzzy -#| msgid "Next Steps" msgid "Next Step" -msgstr "الخطوات التالية" +msgstr "الخطوة التالية" #: templates/accounts/onboarding/step_content.html:103 -#, fuzzy -#| msgid "Complete Your Checklist" msgid "Continue to Checklist" -msgstr "أكمل قائمة التحقق الخاصة بك" +msgstr "متابعة إلى قائمة التحقق" + +#: templates/accounts/onboarding/welcome.html:18 +msgid "Welcome to PX360!" +msgstr "مرحبًا بك في PX360!" #: templates/accounts/onboarding/welcome.html:21 msgid "Your journey to better patient experience starts here" @@ -6738,8 +9937,8 @@ msgstr "التسجيل مطلوب" #: templates/accounts/onboarding/welcome.html:32 msgid "" -"Please complete the onboarding wizard to set up your account and learn about" -" the system." +"Please complete the onboarding wizard to set up your account and learn about " +"the system." msgstr "يرجى إكمال معالج الإعداد لإعداد حسابك والتعرّف على النظام." #: templates/accounts/onboarding/welcome.html:44 @@ -6770,46 +9969,49 @@ msgstr "بدء الإعداد" msgid "Estimated time: 10-15 minutes" msgstr "الوقت المتوقع: 10–15 دقيقة" -#: templates/accounts/password_reset.html:7 +#: templates/accounts/password_reset.html:8 msgid "Reset Password - PX360" msgstr "إعادة تعيين كلمة المرور - PX360" -#: templates/accounts/password_reset.html:37 -#: templates/config/hospital_users.html:286 -#: templates/config/hospital_users.html:382 -#: templates/config/hospital_users.html:395 -#: templates/config/hospital_users.html:485 -#: templates/organizations/staff_detail.html:235 +#: templates/accounts/password_reset.html:33 +#: templates/config/hospital_users.html:295 +#: templates/config/hospital_users.html:307 +#: templates/config/hospital_users.html:404 +#: templates/config/hospital_users.html:417 +#: templates/config/hospital_users.html:545 +#: templates/organizations/staff_detail.html:429 msgid "Reset Password" msgstr "إعادة تعيين كلمة المرور" -#: templates/accounts/password_reset.html:38 +#: templates/accounts/password_reset.html:34 msgid "Enter your email to receive reset instructions" msgstr "أدخل بريدك الإلكتروني لتلقي تعليمات إعادة التعيين" -#: templates/accounts/password_reset.html:90 +#: templates/accounts/password_reset.html:86 msgid "Send Reset Link" msgstr "إرسال رابط إعادة التعيين" -#: templates/accounts/password_reset.html:102 -#: templates/accounts/password_reset_confirm.html:156 +#: templates/accounts/password_reset.html:98 +#: templates/accounts/password_reset_confirm.html:152 msgid "Secure password reset powered by" msgstr "إعادة تعيين كلمة مرور آمنة بدعم من" -#: templates/accounts/password_reset_confirm.html:7 +#: templates/accounts/password_reset_confirm.html:8 msgid "Set New Password - PX360" msgstr "تعيين كلمة مرور جديدة - PX360" -#: templates/accounts/password_reset_confirm.html:37 -#: templates/accounts/password_reset_confirm.html:131 +#: templates/accounts/password_reset_confirm.html:33 +#: templates/accounts/password_reset_confirm.html:127 +#: templates/config/emails/reset_password_email.html:27 +#: templates/config/emails/user_created_email.html:34 msgid "Set New Password" msgstr "تعيين كلمة مرور جديدة" -#: templates/accounts/password_reset_confirm.html:38 +#: templates/accounts/password_reset_confirm.html:34 msgid "Enter your new password below" msgstr "أدخل كلمة المرور الجديدة أدناه" -#: templates/accounts/password_reset_confirm.html:139 +#: templates/accounts/password_reset_confirm.html:135 msgid "" "The password reset link was invalid, possibly because it has already been " "used or has expired." @@ -6817,12 +10019,14 @@ msgstr "" "رابط إعادة تعيين كلمة المرور غير صالح، وقد يكون ذلك بسبب استخدامه مسبقًا أو " "انتهاء صلاحيته." -#: templates/accounts/password_reset_confirm.html:144 +#: templates/accounts/password_reset_confirm.html:140 msgid "Request New Reset Link" msgstr "طلب رابط إعادة تعيين جديد" #: templates/accounts/settings.html:4 templates/accounts/settings.html:12 -#: templates/layouts/partials/topbar.html:120 +#: templates/layouts/partials/sidebar.html:687 +#: templates/layouts/partials/topbar.html:121 +#: templates/presentations/presentation_detail.html:119 msgid "Settings" msgstr "الإعدادات" @@ -6831,7 +10035,7 @@ msgid "Manage your account preferences and configurations" msgstr "إدارة تفضيلات وإعدادات حسابك" #: templates/accounts/settings.html:28 -#: templates/layouts/partials/topbar.html:50 +#: templates/layouts/partials/topbar.html:51 #: templates/notifications/inbox.html:5 templates/notifications/inbox.html:14 msgid "Notifications" msgstr "الإشعارات" @@ -6840,68 +10044,96 @@ msgstr "الإشعارات" msgid "Security" msgstr "الأمان" -#: templates/accounts/settings.html:36 +#: templates/accounts/settings.html:36 templates/social/comments_list.html:105 +#: templates/social/dashboard.html:170 msgid "Account" msgstr "الحساب" -#: templates/accounts/settings.html:70 +#: templates/accounts/settings.html:40 +#: templates/accounts/staff_activity_log.html:127 +#: templates/actions/action_detail.html:136 +#: templates/dashboard/my_dashboard.html:209 +#: templates/organizations/staff_detail.html:316 +msgid "Activity" +msgstr "النشاط" + +#: templates/accounts/settings.html:74 msgid "Change Avatar" msgstr "تغيير الصورة الشخصية" -#: templates/accounts/settings.html:96 +#: templates/accounts/settings.html:100 msgid "Contact administrator to change email" msgstr "يرجى التواصل مع مدير النظام لتغيير البريد الإلكتروني" -#: templates/accounts/settings.html:104 +#: templates/accounts/settings.html:108 msgid "Required for SMS notifications" msgstr "مطلوب لتلقي إشعارات الرسائل النصية" -#: templates/accounts/settings.html:109 +#: templates/accounts/settings.html:113 #: templates/ai_engine/analyze_text.html:133 #: templates/ai_engine/sentiment_dashboard.html:236 #: templates/ai_engine/sentiment_list.html:153 #: templates/ai_engine/sentiment_list.html:205 -#: templates/surveys/instance_detail.html:581 +#: templates/surveys/instance_detail.html:443 msgid "Language" msgstr "اللغة" -#: templates/accounts/settings.html:122 +#: templates/accounts/settings.html:126 msgid "Bio" msgstr "نبذة تعريفية" -#: templates/accounts/settings.html:130 +#: templates/accounts/settings.html:134 msgid "Save Profile" msgstr "حفظ الملف الشخصي" -#: templates/accounts/settings.html:141 +#: templates/accounts/settings.html:146 +#: templates/dashboard/my_dashboard.html:27 +#: templates/dashboard/my_performance.html:4 +#: templates/dashboard/my_performance.html:76 +msgid "My Performance" +msgstr "أدائي" + +#: templates/accounts/settings.html:148 +#, fuzzy +#| msgid "How your performance compares to your department" +msgid "View your performance metrics and evaluations" +msgstr "كيفية مقارنة أدائك بأداء قسمك" + +#: templates/accounts/settings.html:151 +#, fuzzy +#| msgid "Performance" +msgid "View Performance" +msgstr "الأداء" + +#: templates/accounts/settings.html:158 msgid "Profile Tips" msgstr "نصائح الملف الشخصي" -#: templates/accounts/settings.html:146 +#: templates/accounts/settings.html:163 msgid "Add a professional photo to help others recognize you" msgstr "أضف صورة شخصية احترافية لمساعدة الآخرين على التعرف عليك" -#: templates/accounts/settings.html:150 +#: templates/accounts/settings.html:167 msgid "Keep your phone number updated for SMS notifications" msgstr "احرص على تحديث رقم هاتفك لتلقي إشعارات الرسائل النصية" -#: templates/accounts/settings.html:154 +#: templates/accounts/settings.html:171 msgid "Add a bio to share your role and expertise" msgstr "أضف نبذة تعريفية لعرض دورك وخبراتك" -#: templates/accounts/settings.html:158 +#: templates/accounts/settings.html:175 msgid "Choose your preferred language for the interface" msgstr "اختر لغتك المفضلة لواجهة النظام" -#: templates/accounts/settings.html:172 +#: templates/accounts/settings.html:189 msgid "Notification Preferences" msgstr "تفضيلات الإشعارات" -#: templates/accounts/settings.html:183 +#: templates/accounts/settings.html:200 msgid "Email Notifications" msgstr "إشعارات البريد الإلكتروني" -#: templates/accounts/settings.html:184 +#: templates/accounts/settings.html:201 msgid "" "Receive notifications via email for complaint assignments, updates, and " "escalations" @@ -6909,128 +10141,130 @@ msgstr "" "استلام الإشعارات عبر البريد الإلكتروني لتكليفات الشكاوى والتحديثات وحالات " "التصعيد" -#: templates/accounts/settings.html:197 +#: templates/accounts/settings.html:214 msgid "SMS Notifications" msgstr "إشعارات الرسائل النصية" -#: templates/accounts/settings.html:198 +#: templates/accounts/settings.html:215 msgid "Receive critical notifications via SMS (requires phone number)" msgstr "استلام الإشعارات الهامة عبر الرسائل النصية (يتطلب رقم هاتف)" -#: templates/accounts/settings.html:210 +#: templates/accounts/settings.html:227 msgid "Preferred Notification Channel" msgstr "قناة الإشعارات المفضلة" -#: templates/accounts/settings.html:219 +#: templates/accounts/settings.html:236 msgid "Default channel for general notifications" msgstr "القناة الافتراضية للإشعارات العامة" -#: templates/accounts/settings.html:224 +#: templates/accounts/settings.html:241 msgid "Explanation Request Channel" msgstr "قناة طلب الإيضاحات" -#: templates/accounts/settings.html:233 +#: templates/accounts/settings.html:250 msgid "Default channel when requesting complaint explanations" msgstr "القناة الافتراضية عند طلب إيضاحات الشكاوى" -#: templates/accounts/settings.html:238 +#: templates/accounts/settings.html:255 msgid "Phone Number for SMS" msgstr "رقم الهاتف للرسائل النصية" -#: templates/accounts/settings.html:241 +#: templates/accounts/settings.html:258 msgid "Required to receive SMS notifications" msgstr "مطلوب لاستلام إشعارات الرسائل النصية" -#: templates/accounts/settings.html:246 +#: templates/accounts/settings.html:263 msgid "Save Preferences" msgstr "حفظ التفضيلات" -#: templates/accounts/settings.html:256 +#: templates/accounts/settings.html:273 msgid "Notification Tips" msgstr "نصائح الإشعارات" -#: templates/accounts/settings.html:259 +#: templates/accounts/settings.html:276 msgid "" "Configure how you receive notifications to stay informed without being " "overwhelmed." msgstr "" "قم بضبط طريقة استلام الإشعارات لتبقى على اطلاع دون التعرض لكثرة التنبيهات." -#: templates/accounts/settings.html:264 +#: templates/accounts/settings.html:281 msgid "Email is best for detailed information" msgstr "البريد الإلكتروني مناسب للمعلومات التفصيلية" -#: templates/accounts/settings.html:268 +#: templates/accounts/settings.html:285 msgid "SMS is best for urgent alerts" msgstr "الرسائل النصية مناسبة للتنبيهات العاجلة" -#: templates/accounts/settings.html:272 +#: templates/accounts/settings.html:289 msgid "In-app notifications are always enabled" msgstr "الإشعارات داخل النظام مفعّلة دائمًا" -#: templates/accounts/settings.html:286 +#: templates/accounts/settings.html:303 msgid "Security Settings" msgstr "إعدادات الأمان" -#: templates/accounts/settings.html:296 +#: templates/accounts/settings.html:313 msgid "Current Password" msgstr "كلمة المرور الحالية" -#: templates/accounts/settings.html:324 +#: templates/accounts/settings.html:341 msgid "Password History" msgstr "سجل كلمات المرور" -#: templates/accounts/settings.html:328 +#: templates/accounts/settings.html:345 msgid "Last password change:" msgstr "آخر تغيير لكلمة المرور:" -#: templates/accounts/settings.html:328 +#: templates/accounts/settings.html:345 msgid "Recently" msgstr "مؤخرًا" -#: templates/accounts/settings.html:328 +#: templates/accounts/settings.html:345 msgid "Never" msgstr "أبدًا" -#: templates/accounts/settings.html:337 +#: templates/accounts/settings.html:354 msgid "Security Tips" msgstr "نصائح الأمان" -#: templates/accounts/settings.html:342 +#: templates/accounts/settings.html:359 msgid "Use strong passwords with letters, numbers, and symbols" msgstr "استخدم كلمات مرور قوية تحتوي على حروف وأرقام ورموز" -#: templates/accounts/settings.html:346 +#: templates/accounts/settings.html:363 msgid "Don't reuse passwords from other sites" msgstr "لا تعِد استخدام كلمات المرور من مواقع أخرى" -#: templates/accounts/settings.html:350 +#: templates/accounts/settings.html:367 msgid "Change your password regularly" msgstr "قم بتغيير كلمة المرور بشكل دوري" -#: templates/accounts/settings.html:354 +#: templates/accounts/settings.html:371 msgid "Never share your password with anyone" msgstr "لا تشارك كلمة المرور مع أي شخص" -#: templates/accounts/settings.html:368 +#: templates/accounts/settings.html:385 msgid "Account Information" msgstr "معلومات الحساب" -#: templates/accounts/settings.html:390 +#: templates/accounts/settings.html:407 msgid "Member Since" msgstr "عضو منذ" -#: templates/accounts/settings.html:426 +#: templates/accounts/settings.html:443 +#: templates/organizations/department_detail.html:395 #: templates/organizations/staff_detail.html:37 #: templates/organizations/staff_form.html:349 +#: templates/organizations/staff_hierarchy.html:255 msgid "Department Head" msgstr "رئيس القسم" -#: templates/accounts/settings.html:440 +#: templates/accounts/settings.html:457 msgid "Account Info" msgstr "معلومات الحساب" -#: templates/accounts/settings.html:443 +#: templates/accounts/settings.html:460 msgid "" "This information is managed by your organization's administrators. Contact " "them if you need to update your hospital, department, or employee ID." @@ -7038,7 +10272,44 @@ msgstr "" "تتم إدارة هذه المعلومات من قبل مسؤولي مؤسستك. يرجى التواصل معهم في حال " "الحاجة إلى تحديث المستشفى أو القسم أو الرقم الوظيفي." -#: templates/accounts/settings.html:508 +#: templates/accounts/settings.html:472 +msgid "My Activity" +msgstr "نشاطي" + +#: templates/accounts/settings.html:475 +msgid "View Full Log" +msgstr "عرض السجل الكامل" + +#: templates/accounts/settings.html:483 +#: templates/organizations/staff_detail.html:326 +msgid "Recent" +msgstr "الأخيرة" + +#: templates/accounts/settings.html:487 +#: templates/organizations/staff_detail.html:330 +msgid "Logins" +msgstr "تسجيلات الدخول" + +#: templates/accounts/settings.html:501 +msgid "Login History" +msgstr "سجل تسجيل الدخول" + +#: templates/accounts/settings.html:559 +#: templates/organizations/orgsection_form.html:119 +#: templates/surveys/template_form.html:426 +#: templates/surveys/template_form.html:574 +msgid "IP" +msgstr "عنوان IP" + +#: templates/accounts/settings.html:570 +msgid "No activity yet" +msgstr "لا يوجد نشاط بعد" + +#: templates/accounts/settings.html:571 +msgid "Your activity will appear here as you use the system." +msgstr "سيظهر نشاطك هنا أثناء استخدامك للنظام." + +#: templates/accounts/settings.html:635 msgid "Passwords do not match!" msgstr "كلمتا المرور غير متطابقتين!" @@ -7058,37 +10329,6 @@ msgstr "إنشاء إقرار جديد للموظفين للتوقيع عليه" msgid "Acknowledgement Details" msgstr "تفاصيل إشعار الاستلام" -#: templates/accounts/simple_acknowledgements/admin_create.html:36 -#: templates/accounts/simple_acknowledgements/admin_form.html:124 -#: templates/accounts/simple_acknowledgements/admin_list.html:117 -#: templates/actions/action_create.html:24 -#: templates/analytics/command_center.html:359 -#: templates/callcenter/complaint_form.html:169 -#: templates/callcenter/complaint_list.html:177 -#: templates/complaints/complaint_form.html:679 -#: templates/core/public_submit.html:504 -#: templates/dashboard/partials/actions_table.html:25 -#: templates/dashboard/partials/tasks_table.html:25 -#: templates/emails/new_complaint_admin_notification.html:42 -#: templates/emails/observation_assigned.html:41 -#: templates/emails/observation_monthly_followup.html:41 -#: templates/emails/observation_resolved.html:41 -#: templates/feedback/feedback_form.html:237 -#: templates/feedback/feedback_list.html:356 -#: templates/observations/observation_create.html:173 -#: templates/observations/public_new.html:128 -#: templates/projects/convert_action.html:111 -#: templates/px_sources/source_user_complaint_list.html:183 -#: templates/px_sources/source_user_dashboard.html:161 -#: templates/rca/rca_form.html:46 templates/rca/rca_list.html:227 -#: templates/standards/attachment_upload.html:143 -#: templates/standards/compliance_form.html:145 -#: templates/standards/department_standards.html:117 -#: templates/standards/search.html:161 -#: templates/standards/standard_confirm_delete.html:78 -msgid "Title" -msgstr "العنوان" - #: templates/accounts/simple_acknowledgements/admin_create.html:40 msgid "e.g., Code of Conduct, Safety Policy, HIPAA Agreement" msgstr "على سبيل المثال: ميثاق السلوك، سياسة السلامة، اتفاقية HIPAA" @@ -7099,8 +10339,8 @@ msgstr "قدم لهذا الإقرار عنوانًا واضحًا ووصفيً #: templates/accounts/simple_acknowledgements/admin_create.html:51 msgid "" -"Enter the full text of the acknowledgement or a detailed description of what" -" employees are agreeing to..." +"Enter the full text of the acknowledgement or a detailed description of what " +"employees are agreeing to..." msgstr "أدخل النص الكامل للإقرار أو وصفًا تفصيليًا لما يوافق عليه الموظفون..." #: templates/accounts/simple_acknowledgements/admin_create.html:52 @@ -7143,8 +10383,10 @@ msgstr "تظهر الأرقام الأصغر أولاً في القائمة (0 = #: templates/accounts/simple_acknowledgements/admin_create.html:133 #: templates/appreciation/category_form.html:242 -#: templates/callcenter/inquiry_form.html:212 +#: templates/callcenter/inquiry_form.html:232 +#: templates/config/user_form.html:405 #: templates/organizations/staff_form.html:407 +#: templates/organizations/staff_import.html:192 msgid "Tips" msgstr "نصائح" @@ -7209,8 +10451,8 @@ msgstr "أنت على وشك حذف:" #: templates/accounts/simple_acknowledgements/admin_delete.html:40 msgid "" -"This action cannot be undone. All signature records for this acknowledgement" -" will also be deleted." +"This action cannot be undone. All signature records for this acknowledgement " +"will also be deleted." msgstr "" "لا يمكن التراجع عن هذا الإجراء. سيتم حذف جميع سجلات التوقيع لهذه الإقرار " "أيضًا." @@ -7228,7 +10470,7 @@ msgstr "تعديل الإقرار" #: templates/accounts/simple_acknowledgements/admin_form.html:95 #: templates/accounts/simple_acknowledgements/admin_list.html:60 -#: templates/layouts/partials/sidebar.html:474 +#: templates/layouts/partials/sidebar.html:672 msgid "Acknowledgements" msgstr "الإقرارات" @@ -7269,11 +10511,18 @@ msgstr "الأرقام الأصغر تظهر أولاً" #: templates/accounts/simple_acknowledgements/admin_form.html:205 #: templates/analytics/kpi_report_detail.html:500 #: templates/complaints/adverse_action_form.html:242 +#: templates/complaints/complaint_detail.html:1107 +#: templates/complaints/inquiry_form.html:281 #: templates/journeys/stage_surveys_form.html:260 -#: templates/projects/project_form.html:303 -#: templates/projects/task_form.html:183 +#: templates/organizations/department_staff_detail.html:427 +#: templates/presentations/presentation_form.html:93 +#: templates/projects/partials/task_form_modal.html:96 +#: templates/projects/project_form.html:309 +#: templates/projects/task_form.html:227 #: templates/projects/template_form.html:215 +#: templates/px_sources/communication_request_detail.html:263 #: templates/px_sources/source_form.html:275 +#: templates/px_sources/source_user_form.html:330 msgid "Save Changes" msgstr "حفظ التغييرات" @@ -7296,12 +10545,12 @@ msgid "All Acknowledgements" msgstr "كل التأكيدات" #: templates/accounts/simple_acknowledgements/admin_list.html:160 -#: templates/analytics/kpi_report_list.html:256 -#: templates/appreciation/appreciation_list.html:110 -#: templates/appreciation/appreciation_list.html:171 -#: templates/complaints/complaint_list.html:290 +#: templates/analytics/kpi_report_list.html:334 +#: templates/appreciation/appreciation_list.html:245 +#: templates/complaints/complaint_list.html:340 +#: templates/complaints/government_ticket_list.html:191 #: templates/complaints/oncall/schedule_list.html:271 -#: templates/complaints/partials/actions_panel.html:19 +#: templates/complaints/partials/actions_panel.html:36 #: templates/dashboard/department_benchmarks.html:162 #: templates/dashboard/partials/actions_table.html:69 #: templates/dashboard/partials/complaints_table.html:65 @@ -7309,26 +10558,36 @@ msgstr "كل التأكيدات" #: templates/dashboard/partials/inquiries_table.html:63 #: templates/dashboard/partials/observations_table.html:55 #: templates/dashboard/partials/tasks_table.html:63 -#: templates/feedback/feedback_list.html:434 +#: templates/feedback/feedback_list.html:281 #: templates/journeys/template_list.html:108 -#: templates/organizations/patient_detail.html:371 -#: templates/organizations/patient_list.html:330 -#: templates/organizations/staff_list.html:335 +#: templates/organizations/department_detail.html:681 +#: templates/organizations/department_detail.html:797 +#: templates/organizations/department_detail.html:861 +#: templates/organizations/department_inquiries.html:114 +#: templates/organizations/department_observations.html:111 +#: templates/organizations/orgsection_list.html:164 +#: templates/organizations/patient_detail.html:366 +#: templates/organizations/patient_list.html:342 +#: templates/organizations/staff_hierarchy.html:306 +#: templates/organizations/staff_list.html:340 #: templates/physicians/doctor_rating_job_list.html:198 -#: templates/physicians/leaderboard.html:276 +#: templates/physicians/leaderboard.html:307 #: templates/physicians/physician_list.html:257 #: templates/physicians/ratings_list.html:285 #: templates/projects/project_list.html:238 #: templates/projects/template_list.html:116 #: templates/projects/template_list.html:120 +#: templates/px_sources/communication_request_list.html:158 +#: templates/px_sources/source_detail.html:437 #: templates/px_sources/source_list.html:263 templates/rca/rca_list.html:274 #: templates/references/search.html:280 #: templates/reports/saved_reports.html:119 #: templates/social/social_analytics.html:283 -#: templates/standards/dashboard.html:220 templates/standards/search.html:206 +#: templates/standards/dashboard.html:220 templates/standards/search.html:424 +#: templates/standards/standard_detail.html:300 #: templates/surveys/analytics_report_info.html:43 #: templates/surveys/analytics_reports.html:135 -#: templates/surveys/comment_list.html:329 +#: templates/surveys/comment_list.html:356 #: templates/surveys/template_list.html:126 msgid "View" msgstr "عرض" @@ -7338,10 +10597,14 @@ msgid "Send to Staff" msgstr "إرسال إلى الموظفين" #: templates/accounts/simple_acknowledgements/admin_list.html:172 -#: templates/organizations/staff_detail.html:333 -#: templates/organizations/staff_detail.html:470 -#: templates/organizations/staff_list.html:478 -#: templates/organizations/staff_list.html:560 +#: templates/complaints/complaint_detail.html:1151 +#: templates/complaints/complaint_detail.html:1311 +#: templates/components/send_to_modal.html:107 +#: templates/components/send_to_modal.html:238 +#: templates/organizations/staff_detail.html:535 +#: templates/organizations/staff_detail.html:662 +#: templates/organizations/staff_list.html:483 +#: templates/organizations/staff_list.html:566 msgid "Send" msgstr "إرسال" @@ -7373,7 +10636,6 @@ msgid "Select All" msgstr "اختر الكل" #: templates/accounts/simple_acknowledgements/admin_send.html:47 -#: templates/complaints/request_explanation_form.html:127 #: templates/surveys/his_patient_survey_send.html:105 msgid "Deselect All" msgstr "إلغاء تحديد الكل" @@ -7388,7 +10650,8 @@ msgid "Already sent" msgstr "تم الإرسال بالفعل" #: templates/accounts/simple_acknowledgements/admin_send.html:81 -#: templates/organizations/staff_list.html:360 +#: templates/organizations/staff_hierarchy.html:318 +#: templates/organizations/staff_list.html:365 msgid "No staff members found" msgstr "لم يتم العثور على أي موظفين" @@ -7442,9 +10705,10 @@ msgid "View all signed acknowledgements" msgstr "عرض جميع الإقرارات الموقعة" #: templates/accounts/simple_acknowledgements/admin_signatures.html:23 -#: templates/dashboard/admin_evaluation.html:313 -#: templates/organizations/patient_list.html:133 +#: templates/dashboard/admin_evaluation.html:323 +#: templates/organizations/patient_list.html:153 #: templates/reports/report_builder.html:144 +#: templates/social/comments_list.html:57 msgid "Export CSV" msgstr "تصدير CSV" @@ -7461,9 +10725,9 @@ msgid "Total Signatures" msgstr "إجمالي التوقيعات" #: templates/accounts/simple_acknowledgements/admin_signatures.html:71 -#: templates/analytics/command_center.html:94 #: templates/dashboard/admin_evaluation.html:251 -#: templates/dashboard/employee_evaluation.html:651 +#: templates/dashboard/employee_evaluation.html:705 +#: templates/dashboard/employee_evaluation_charts.html:184 #: templates/social/social_platform.html:165 msgid "This Month" msgstr "هذا الشهر" @@ -7477,6 +10741,8 @@ msgid "All Signatures" msgstr "جميع التوقيعات" #: templates/accounts/simple_acknowledgements/admin_signatures.html:98 +#: templates/dashboard/inquiry_report.html:164 +#: templates/dashboard/observation_report.html:140 msgid "Employee" msgstr "الموظف" @@ -7487,31 +10753,45 @@ msgstr "الإقرار" #: templates/accounts/simple_acknowledgements/admin_signatures.html:101 #: templates/ai_engine/sentiment_dashboard.html:237 #: templates/ai_engine/sentiment_list.html:207 +#: templates/appreciation/appreciation_list.html:195 #: templates/callcenter/interaction_list.html:113 #: templates/complaints/adverse_action_list.html:277 #: templates/dashboard/complaint_request_list.html:83 #: templates/dashboard/partials/feedback_table.html:28 -#: templates/feedback/comment_import_list.html:24 -#: templates/observations/observation_list.html:296 +#: templates/feedback/comment_import_list.html:78 +#: templates/observations/observation_list.html:298 +#: templates/organizations/department_staff_detail.html:288 +#: templates/organizations/patient_list.html:528 #: templates/physicians/doctor_rating_review.html:177 #: templates/physicians/individual_ratings_list.html:183 -#: templates/px_sources/source_detail.html:253 -#: templates/px_sources/source_detail.html:321 -#: templates/px_sources/source_detail.html:388 -#: templates/px_sources/source_user_dashboard.html:165 -#: templates/px_sources/source_user_dashboard.html:257 +#: templates/presentations/presentation_form.html:64 +#: templates/px_sources/source_detail.html:261 +#: templates/px_sources/source_detail.html:328 +#: templates/px_sources/source_detail.html:399 +#: templates/px_sources/source_detail.html:474 +#: templates/px_sources/source_user_dashboard.html:197 +#: templates/px_sources/source_user_dashboard.html:289 +#: templates/social/comments_list.html:162 #: templates/standards/attachment_upload.html:201 -#: templates/surveys/comment_list.html:264 -#: templates/surveys/instance_detail.html:470 +#: templates/surveys/comment_list.html:278 +#: templates/surveys/instance_detail.html:332 msgid "Date" msgstr "التاريخ" #: templates/accounts/simple_acknowledgements/admin_signatures.html:131 #: templates/accounts/simple_acknowledgements/list.html:153 -#: templates/appreciation/appreciation_list.html:86 -#: templates/appreciation/leaderboard.html:88 +#: templates/appreciation/appreciation_detail.html:170 +#: templates/appreciation/appreciation_list.html:114 +#: templates/appreciation/appreciation_list.html:172 +#: templates/appreciation/leaderboard.html:149 +#: templates/complaints/complaint_detail.html:562 +#: templates/complaints/complaint_detail.html:564 +#: templates/organizations/department_detail.html:496 +#: templates/organizations/department_detail.html:954 +#: templates/organizations/department_detail.html:1325 +#: templates/organizations/department_staff_detail.html:489 #: templates/simulator/log_list.html:229 -#: templates/surveys/instance_detail.html:565 +#: templates/surveys/instance_detail.html:427 #: templates/surveys/instance_list.html:92 #: templates/surveys/instance_list.html:138 msgid "Sent" @@ -7522,7 +10802,8 @@ msgstr "المرسلة" #: templates/references/document_view.html:220 #: templates/references/folder_view.html:272 #: templates/references/search.html:277 -#: templates/standards/department_standards.html:669 +#: templates/standards/department_standards.html:768 +#: templates/standards/standard_detail.html:792 #: templates/surveys/analytics_report_info.html:47 #: templates/surveys/analytics_report_markdown_view.html:115 #: templates/surveys/analytics_report_view.html:47 @@ -7581,12 +10862,21 @@ msgid "Name on signature" msgstr "الاسم على التوقيع" #: templates/accounts/simple_acknowledgements/admin_upload_pdf.html:92 +#: templates/appreciation/appreciation_detail.html:88 +#: templates/complaints/complaint_detail.html:320 +#: templates/complaints/inquiry_detail.html:132 #: templates/complaints/involved_department_form.html:219 #: templates/complaints/involved_staff_form.html:187 -#: templates/dashboard/employee_evaluation.html:1210 -#: templates/rca/rca_detail.html:365 -#: templates/standards/department_standards.html:257 -#: templates/surveys/instance_detail.html:727 +#: templates/dashboard/employee_evaluation.html:1291 +#: templates/dashboard/employee_evaluation_charts.html:580 +#: templates/feedback/feedback_detail.html:66 +#: templates/observations/observation_detail.html:80 +#: templates/partials/notes_panel.html:5 templates/rca/rca_detail.html:365 +#: templates/standards/department_standards.html:356 +#: templates/standards/search.html:482 +#: templates/standards/standard_detail.html:356 +#: templates/standards/standard_detail.html:506 +#: templates/surveys/instance_detail.html:589 msgid "Notes" msgstr "ملاحظات" @@ -7603,13 +10893,12 @@ msgid "Create New" msgstr "إنشاء جديد" #: templates/accounts/simple_acknowledgements/list.html:74 -#: templates/px_sources/source_detail.html:479 +#: templates/px_sources/source_detail.html:565 msgid "Manage" msgstr "إدارة" #: templates/accounts/simple_acknowledgements/list.html:100 -#: templates/emails/public_inquiry_notification.html:71 -#: templates/surveys/instance_detail.html:690 +#: templates/surveys/instance_detail.html:552 msgid "Action Required" msgstr "إجراء مطلوب" @@ -7617,11 +10906,13 @@ msgstr "إجراء مطلوب" #, python-format msgid "" "\n" -" You have %(pending)s acknowledgement(s) waiting for your signature. Please review and sign them below.\n" +" You have %(pending)s acknowledgement(s) waiting for " +"your signature. Please review and sign them below.\n" " " msgstr "" "\n" -" لديك %(pending)s إقرار(إقرارات) في انتظار توقيعك. يرجى مراجعتها والتوقيع عليها أدناه. " +" لديك %(pending)s إقرار(إقرارات) في انتظار توقيعك. " +"يرجى مراجعتها والتوقيع عليها أدناه. " #: templates/accounts/simple_acknowledgements/list.html:116 msgid "Completion Progress" @@ -7684,6 +10975,95 @@ msgstr "أؤكد أنني قد قرأت وفهمت هذا التأكيد." msgid "Cancel and go back" msgstr "إلغاء والعودة" +#: templates/accounts/staff_activity_log.html:4 +#: templates/accounts/staff_activity_log.html:59 +msgid "Staff Activity Log" +msgstr "سجل نشاط الموظفين" + +#: templates/accounts/staff_activity_log.html:61 +msgid "Track and monitor staff actions across the system" +msgstr "تتبع ومراقبة إجراءات الموظفين عبر النظام" + +#: templates/accounts/staff_activity_log.html:65 +msgid "Total Events" +msgstr "إجمالي الأحداث" + +#: templates/accounts/staff_activity_log.html:82 +msgid "Search descriptions..." +msgstr "البحث في الأوصاف..." + +#: templates/accounts/staff_activity_log.html:85 +#: templates/organizations/department_detail.html:1088 +#: templates/standards/activity_type_form.html:150 +#: templates/standards/standard_form.html:259 +msgid "Activity Type" +msgstr "نوع النشاط" + +#: templates/accounts/staff_activity_log.html:94 +#: templates/accounts/staff_activity_log.html:128 +msgid "Module" +msgstr "الوحدة" + +#: templates/accounts/staff_activity_log.html:96 +msgid "All Modules" +msgstr "جميع الوحدات" + +#: templates/accounts/staff_activity_log.html:103 +#: templates/analytics/dashboard.html:507 +#: templates/appreciation/appreciation_list.html:189 +#: templates/complaints/complaint_list.html:216 +#: templates/complaints/complaint_list.html:416 +#: templates/complaints/inquiry_department_response.html:30 +#: templates/complaints/oncall/schedule_detail.html:122 +#: templates/dashboard/admin_evaluation.html:259 +#: templates/dashboard/employee_evaluation.html:713 +#: templates/dashboard/employee_evaluation_charts.html:192 +#: templates/dashboard/observation_report.html:42 +#: templates/emails/new_appreciation_notification.html:17 +#: templates/feedback/feedback_list.html:189 +#: templates/organizations/department_complaints.html:47 +#: templates/organizations/department_inquiries.html:45 +#: templates/organizations/department_observations.html:47 +#: templates/organizations/department_staff_detail.html:286 +#: templates/px_sources/source_user_dashboard.html:287 +#: templates/px_sources/source_user_inquiry_list.html:172 +#: templates/rca/rca_list.html:206 +msgid "From" +msgstr "من" + +#: templates/accounts/staff_activity_log.html:107 +#: templates/analytics/dashboard.html:512 +#: templates/complaints/complaint_list.html:220 +#: templates/complaints/complaint_list.html:420 +#: templates/dashboard/admin_evaluation.html:264 +#: templates/dashboard/employee_evaluation.html:718 +#: templates/dashboard/employee_evaluation_charts.html:197 +#: templates/dashboard/observation_report.html:47 +#: templates/feedback/feedback_list.html:193 +#: templates/organizations/department_complaints.html:49 +#: templates/organizations/department_inquiries.html:47 +#: templates/organizations/department_observations.html:49 +#: templates/rca/rca_list.html:210 +msgid "To" +msgstr "إلى" + +#: templates/accounts/staff_activity_log.html:125 +#: templates/simulator/log_detail.html:83 templates/simulator/log_list.html:277 +msgid "Timestamp" +msgstr "الطابع الزمني" + +#: templates/accounts/staff_activity_log.html:144 +msgid "System" +msgstr "النظام" + +#: templates/accounts/staff_activity_log.html:204 +msgid "No activity found" +msgstr "لم يتم العثور على أي نشاط" + +#: templates/accounts/staff_activity_log.html:205 +msgid "Try adjusting your filters." +msgstr "حاول ضبط عوامل التصفية الخاصة بك." + #: templates/actions/action_create.html:4 #: templates/actions/action_create.html:10 msgid "Edit Action Plan" @@ -7691,8 +11071,7 @@ msgstr "تعديل خطة العمل" #: templates/actions/action_create.html:4 #: templates/actions/action_create.html:10 -#: templates/actions/action_list.html:78 -#: templates/actions/action_list.html:206 +#: templates/actions/action_list.html:78 templates/actions/action_list.html:206 msgid "Create Action Plan" msgstr "إنشاء خطة عمل" @@ -7714,28 +11093,51 @@ msgstr "صف خطة العمل..." #: templates/actions/action_create.html:45 #: templates/actions/action_detail.html:453 -#: templates/observations/observation_detail.html:299 -#: templates/observations/observation_list.html:230 -#: templates/projects/task_form.html:160 templates/rca/rca_detail.html:142 +#: templates/appreciation/appreciation_detail.html:150 +#: templates/complaints/government_ticket_detail.html:190 +#: templates/observations/observation_detail.html:618 +#: templates/observations/observation_list.html:231 +#: templates/organizations/department_complaint_detail.html:109 +#: templates/organizations/department_complaints.html:72 +#: templates/organizations/department_detail.html:704 +#: templates/organizations/department_detail.html:771 +#: templates/organizations/department_detail.html:831 +#: templates/organizations/department_detail.html:897 +#: templates/organizations/department_detail.html:1306 +#: templates/organizations/department_inquiries.html:69 +#: templates/organizations/department_inquiry_detail.html:79 +#: templates/organizations/department_observation_detail.html:77 +#: templates/organizations/department_observations.html:71 +#: templates/organizations/department_staff_detail.html:471 +#: templates/projects/partials/task_form_modal.html:45 +#: templates/projects/project_detail.html:188 +#: templates/projects/project_detail.html:293 +#: templates/projects/task_form.html:174 templates/rca/rca_detail.html:142 #: templates/rca/rca_form.html:103 templates/rca/rca_list.html:232 msgid "Assigned To" msgstr "تم الإسناد إلى" #: templates/actions/action_create.html:47 -#: templates/complaints/complaint_detail.html:581 -#: templates/px_sources/source_user_form.html:163 +#: templates/complaints/complaint_detail.html:881 +#: templates/complaints/inquiry_detail.html:694 +#: templates/observations/observation_detail.html:594 +#: templates/px_sources/source_user_form.html:131 msgid "Select User" msgstr "اختر المستخدم" #: templates/actions/action_create.html:55 #: templates/actions/action_detail.html:489 -#: templates/analytics/command_center.html:364 #: templates/dashboard/partials/actions_table.html:29 #: templates/dashboard/partials/complaints_table.html:29 #: templates/dashboard/partials/inquiries_table.html:28 #: templates/dashboard/partials/tasks_table.html:28 -#: templates/emails/observation_assigned.html:94 -#: templates/projects/task_form.html:171 +#: templates/projects/focus_phase_form.html:66 +#: templates/projects/partials/phase_form_modal.html:49 +#: templates/projects/partials/task_form_modal.html:56 +#: templates/projects/pdca_phase_form.html:66 +#: templates/projects/project_detail.html:189 +#: templates/projects/project_detail.html:294 +#: templates/projects/task_form.html:215 msgid "Due Date" msgstr "تاريخ الاستحقاق" @@ -7758,7 +11160,11 @@ msgstr "اختر الاستبيان" #: templates/actions/action_create.html:98 #: templates/complaints/involved_department_form.html:234 #: templates/complaints/involved_staff_form.html:202 -#: templates/complaints/partials/explanation_panel.html:24 +#: templates/config/user_form.html:388 +#: templates/organizations/department_detail.html:1208 +#: templates/organizations/department_form.html:167 +#: templates/organizations/orgsection_form.html:151 +#: templates/organizations/orgsubsection_form.html:161 #: templates/organizations/section_form.html:130 #: templates/organizations/staff_form.html:361 #: templates/organizations/subsection_form.html:130 @@ -7768,9 +11174,12 @@ msgstr "حفظ" #: templates/actions/action_detail.html:5 #: templates/complaints/complaint_threshold_list.html:258 -#: templates/organizations/patient_list.html:508 -#: templates/surveys/template_form.html:479 -#: templates/surveys/template_form.html:525 +#: templates/organizations/department_complaints.html:78 +#: templates/organizations/department_detail.html:157 +#: templates/organizations/patient_list.html:529 +#: templates/projects/my_tasks.html:106 +#: templates/surveys/template_form.html:683 +#: templates/surveys/template_form.html:729 msgid "Action" msgstr "الإجراء" @@ -7788,7 +11197,9 @@ msgid "Due:" msgstr "الموعد المستحق:" #: templates/actions/action_detail.html:116 +#: templates/complaints/inquiry_detail.html:204 #: templates/dashboard/command_center.html:471 +#: templates/observations/observation_detail.html:223 msgid "OVERDUE" msgstr "متأخرة" @@ -7797,34 +11208,40 @@ msgid "left" msgstr "يسار" #: templates/actions/action_detail.html:133 -#: templates/appreciation/appreciation_detail.html:12 -#: templates/complaints/complaint_detail.html:121 -#: templates/observations/observation_detail.html:128 +#: templates/appreciation/appreciation_detail.html:83 +#: templates/complaints/complaint_detail.html:265 +#: templates/complaints/inquiry_detail.html:126 +#: templates/feedback/feedback_detail.html:61 +#: templates/observations/observation_detail.html:72 +#: templates/organizations/department_complaint_detail.html:101 +#: templates/organizations/department_inquiry_detail.html:65 +#: templates/organizations/department_observation_detail.html:69 #: templates/simulator/log_list.html:281 +#: templates/social/comment_detail.html:365 msgid "Details" msgstr "التفاصيل" -#: templates/actions/action_detail.html:136 -msgid "Activity" -msgstr "النشاط" - #: templates/actions/action_detail.html:139 #: templates/actions/action_detail.html:293 -#: templates/feedback/action_plan_list.html:63 +#: templates/feedback/action_plan_list.html:124 +#: templates/organizations/department_detail.html:1090 #: templates/standards/department_standards.html:123 -#: templates/standards/department_standards.html:180 -#: templates/standards/standard_detail.html:230 +#: templates/standards/department_standards.html:203 +#: templates/standards/department_standards.html:278 +#: templates/standards/search.html:188 templates/standards/search.html:270 +#: templates/standards/search.html:345 +#: templates/standards/standard_detail.html:390 +#: templates/standards/standard_detail.html:445 msgid "Evidence" msgstr "الأدلة" #: templates/actions/action_detail.html:142 +#: templates/complaints/explanation_success.html:57 +#: templates/complaints/investigation_review.html:96 #: templates/complaints/partials/attachments_panel.html:3 -#: templates/complaints/public_complaint_form.html:314 -#: templates/core/public_submit.html:529 -#: templates/feedback/feedback_detail.html:669 -#: templates/observations/observation_create.html:316 -#: templates/observations/observation_detail.html:211 -#: templates/observations/public_new.html:168 +#: templates/core/public_submit.html:425 +#: templates/observations/observation_detail.html:409 +#: templates/observations/public_new.html:183 msgid "Attachments" msgstr "المرفقات" @@ -7833,6 +11250,7 @@ msgid "Action Details" msgstr "تفاصيل الإجراء" #: templates/actions/action_detail.html:172 +#: templates/dashboard/comments_report.html:121 msgid "Action Plan" msgstr "خطة العمل" @@ -7843,8 +11261,8 @@ msgstr "النتيجة" #: templates/actions/action_detail.html:193 #: templates/dashboard/admin_evaluation.html:228 #: templates/dashboard/command_center.html:130 -#: templates/dashboard/employee_evaluation.html:631 -#: templates/observations/observation_detail.html:148 +#: templates/dashboard/employee_evaluation.html:685 +#: templates/dashboard/employee_evaluation_charts.html:165 #: templates/px_sources/source_detail.html:184 #: templates/reports/report_detail.html:216 #: templates/standards/dashboard.html:261 @@ -7871,7 +11289,7 @@ msgstr "تم رفعه بواسطة" #: templates/actions/action_detail.html:251 #: templates/actions/action_detail.html:298 #: templates/complaints/complaint_pdf.html:643 -#: templates/complaints/partials/explanation_panel.html:128 +#: templates/complaints/partials/explanation_panel.html:207 msgid "on" msgstr "في" @@ -7889,6 +11307,7 @@ msgstr "جميع المرفقات" #: templates/actions/action_detail.html:312 #: templates/complaints/partials/attachments_panel.html:25 +#: templates/observations/observation_detail.html:431 #: templates/standards/compliance_form.html:285 msgid "No attachments" msgstr "لا توجد مرفقات" @@ -7906,31 +11325,35 @@ msgid "Approve Action" msgstr "الموافقة على الإجراء" #: templates/actions/action_detail.html:346 -#: templates/complaints/complaint_detail.html:367 +#: templates/complaints/complaint_detail.html:662 +#: templates/complaints/inquiry_detail.html:442 +#: templates/feedback/feedback_detail.html:295 +#: templates/observations/observation_detail.html:480 #: templates/surveys/analytics_report_info.html:168 -#: templates/surveys/template_detail.html:240 +#: templates/surveys/template_detail.html:263 msgid "Quick Actions" msgstr "إجراءات سريعة" #: templates/actions/action_detail.html:353 -#: templates/complaints/complaint_detail.html:579 +#: templates/complaints/complaint_detail.html:879 +#: templates/complaints/inquiry_detail.html:692 #: templates/complaints/involved_department_form.html:197 #: templates/config/routing_rules.html:45 -#: templates/dashboard/my_dashboard.html:267 -#: templates/feedback/feedback_detail.html:475 -#: templates/observations/observation_create.html:298 -#: templates/observations/observation_detail.html:363 +#: templates/dashboard/my_dashboard.html:336 +#: templates/feedback/feedback_detail.html:315 +#: templates/observations/observation_create.html:108 +#: templates/observations/observation_detail.html:688 msgid "Assign To" msgstr "تعيين إلى" #: templates/actions/action_detail.html:356 +#: templates/feedback/feedback_detail.html:317 msgid "Select user..." msgstr "اختر المستخدم..." #: templates/actions/action_detail.html:372 -#: templates/dashboard/my_dashboard.html:253 -#: templates/feedback/feedback_detail.html:455 -#: templates/observations/observation_detail.html:425 +#: templates/complaints/inquiry_detail.html:549 +#: templates/dashboard/my_dashboard.html:322 msgid "Change Status" msgstr "تغيير الحالة" @@ -7939,19 +11362,25 @@ msgid "Optional note..." msgstr "ملاحظة اختيارية..." #: templates/actions/action_detail.html:380 +#: templates/complaints/inquiry_detail.html:538 +#: templates/px_sources/communication_request_detail.html:240 msgid "Update Status" msgstr "تحديث الحالة" #: templates/actions/action_detail.html:386 #: templates/actions/action_detail.html:540 -#: templates/complaints/complaint_detail.html:395 -#: templates/complaints/complaint_detail.html:660 +#: templates/complaints/complaint_detail.html:698 +#: templates/complaints/inquiry_detail.html:527 #: templates/complaints/partials/adverse_actions_panel.html:103 -#: templates/complaints/partials/explanation_panel.html:204 +#: templates/complaints/partials/explanation_panel.html:385 +#: templates/observations/observation_detail.html:544 msgid "Escalate" msgstr "تصعيد" #: templates/actions/action_detail.html:397 +#: templates/complaints/inquiry_detail.html:515 +#: templates/complaints/partials/actions_panel.html:12 +#: templates/observations/observation_detail.html:554 msgid "QI Project" msgstr "مشروع الجودة والتحسين" @@ -7961,8 +11390,7 @@ msgstr "مرتبط بـ:" #: templates/actions/action_detail.html:414 msgid "Convert this action to a QI project for long-term tracking." -msgstr "" -"قم بتحويل هذا الإجراء إلى مشروع تحسين الجودة لمتابعة على المدى الطويل." +msgstr "قم بتحويل هذا الإجراء إلى مشروع تحسين الجودة لمتابعة على المدى الطويل." # Explanation Status #: templates/actions/action_detail.html:420 @@ -7975,41 +11403,43 @@ msgstr "تحويل إلى مشروع" #: templates/actions/action_detail.html:430 #: templates/actions/action_detail.html:438 -#: templates/complaints/complaint_detail.html:620 -#: templates/observations/observation_detail.html:386 -#: templates/observations/observation_detail.html:402 -#: templates/rca/rca_detail.html:369 templates/rca/rca_detail.html:522 -#: templates/rca/rca_detail.html:539 +#: templates/complaints/complaint_detail.html:920 +#: templates/partials/notes_panel.html:19 templates/rca/rca_detail.html:369 +#: templates/rca/rca_detail.html:522 templates/rca/rca_detail.html:539 msgid "Add Note" msgstr "إضافة ملاحظة" #: templates/actions/action_detail.html:436 -#: templates/complaints/complaint_detail.html:613 +#: templates/complaints/complaint_detail.html:913 msgid "Enter your note..." msgstr "أدخل ملاحظتك..." #: templates/actions/action_detail.html:448 -#: templates/complaints/complaint_detail.html:490 msgid "Assignment Info" msgstr "معلومات التعيين" #: templates/actions/action_detail.html:456 -#: templates/complaints/complaint_list.html:219 -#: templates/complaints/inquiry_list.html:235 -#: templates/observations/observation_list.html:303 +#: templates/complaints/complaint_list.html:243 +#: templates/complaints/inquiry_list.html:196 +#: templates/observations/observation_list.html:305 +#: templates/px_sources/source_user_observation_list.html:106 +#: templates/px_sources/source_user_observation_list.html:184 msgid "Assigned" msgstr "تم التعيين" #: templates/actions/action_detail.html:458 -#: templates/complaints/complaint_list.html:285 -#: templates/complaints/inquiry_list.html:291 -#: templates/feedback/action_plan_list.html:52 -#: templates/observations/observation_list.html:377 -#: templates/rca/rca_list.html:268 +#: templates/complaints/complaint_list.html:335 +#: templates/complaints/inquiry_list.html:238 +#: templates/feedback/action_plan_list.html:113 +#: templates/observations/observation_list.html:375 +#: templates/projects/focus_phase_form.html:55 +#: templates/projects/partials/phase_form_modal.html:37 +#: templates/projects/pdca_phase_form.html:55 templates/rca/rca_list.html:268 msgid "Unassigned" msgstr "غير معين" #: templates/actions/action_detail.html:464 +#: templates/analytics/kpi_report_weasyprint.html:602 msgid "Approved By" msgstr "تمت الموافقة من قبل" @@ -8019,10 +11449,7 @@ msgstr "تم الإغلاق بواسطة" #: templates/actions/action_detail.html:484 #: templates/callcenter/complaint_form.html:241 -#: templates/complaints/complaint_form.html:708 -#: templates/emails/observation_sla_reminder.html:108 -#: templates/emails/sla_reminder.html:110 -#: templates/emails/sla_second_reminder.html:113 +#: templates/complaints/complaint_form.html:702 msgid "SLA Information" msgstr "معلومات اتفاقية مستوى الخدمة" @@ -8043,7 +11470,6 @@ msgid "Current level:" msgstr "المستوى الحالي:" #: templates/actions/action_detail.html:531 -#: templates/complaints/complaint_detail.html:652 msgid "Reason for Escalation" msgstr "سبب التصعيد" @@ -8053,6 +11479,7 @@ msgstr "اشرح سبب الحاجة إلى تصعيد هذا الإجراء..." #: templates/actions/action_list.html:4 templates/actions/action_list.html:73 #: templates/actions/action_list.html:136 +#: templates/dashboard/comments_report.html:113 msgid "Action Plans" msgstr "خطط العمل" @@ -8060,49 +11487,16 @@ msgstr "خطط العمل" msgid "Manage improvement action plans" msgstr "إدارة خطط تحسين الإجراءات" -#: templates/actions/action_list.html:89 -#: templates/ai_engine/sentiment_list.html:144 -#: templates/analytics/command_center.html:77 -#: templates/analytics/kpi_report_list.html:125 -#: templates/appreciation/appreciation_list.html:166 -#: templates/callcenter/call_records_list.html:148 -#: templates/callcenter/complaint_list.html:125 -#: templates/callcenter/inquiry_list.html:121 -#: templates/complaints/adverse_action_list.html:207 -#: templates/complaints/complaint_threshold_list.html:202 -#: templates/complaints/escalation_rule_list.html:237 -#: templates/complaints/inquiry_list.html:172 -#: templates/complaints/templates/template_list.html:173 -#: templates/config/hospital_users.html:170 -#: templates/dashboard/admin_evaluation.html:239 -#: templates/dashboard/employee_evaluation.html:641 -#: templates/feedback/feedback_list.html:220 -#: templates/journeys/instance_list.html:154 -#: templates/observations/observation_list.html:159 -#: templates/organizations/section_list.html:71 -#: templates/organizations/staff_list.html:191 -#: templates/organizations/subsection_list.html:71 -#: templates/physicians/individual_ratings_list.html:99 -#: templates/physicians/physician_list.html:130 -#: templates/physicians/physician_ratings_dashboard.html:253 -#: templates/physicians/ratings_list.html:123 -#: templates/projects/project_list.html:138 -#: templates/px_sources/source_user_complaint_list.html:94 -#: templates/px_sources/source_user_inquiry_list.html:94 -#: templates/simulator/log_list.html:211 -#: templates/surveys/instance_list.html:72 -#: templates/surveys/instance_list.html:84 -msgid "Filters" -msgstr "عوامل التصفية" - #: templates/actions/action_list.html:95 msgid "Search action plans..." msgstr "البحث في خطط الإجراءات..." #: templates/actions/action_list.html:100 -#: templates/appreciation/appreciation_list.html:186 -#: templates/complaints/inquiry_list.html:186 +#: templates/appreciation/appreciation_list.html:168 +#: templates/complaints/inquiry_list.html:143 #: templates/complaints/templates/template_list.html:180 +#: templates/organizations/orgsection_list.html:91 +#: templates/organizations/orgsubsection_list.html:91 #: templates/organizations/section_list.html:91 #: templates/organizations/subsection_list.html:91 #: templates/physicians/physician_list.html:160 @@ -8112,6 +11506,7 @@ msgstr "جميع الحالات" #: templates/actions/action_list.html:110 #: templates/complaints/escalation_rule_form.html:351 +#: templates/organizations/department_inquiries.html:40 #: templates/px_sources/source_user_complaint_list.html:127 msgid "All Priorities" msgstr "جميع الأولويات" @@ -8138,36 +11533,6 @@ msgstr "ابدأ بإنشاء خطة الإجراءات الأولى الخاص msgid "Page %(current)s of %(total)s" msgstr "الصفحة %(current)s من %(total)s" -#: templates/actions/action_list.html:229 -#: templates/appreciation/appreciation_list.html:313 -#: templates/appreciation/appreciation_list.html:317 -#: templates/appreciation/badge_list.html:178 -#: templates/appreciation/badge_list.html:182 -#: templates/appreciation/leaderboard.html:169 -#: templates/appreciation/leaderboard.html:174 -#: templates/appreciation/my_badges.html:126 -#: templates/appreciation/my_badges.html:131 -#: templates/callcenter/call_records_list.html:315 -#: templates/callcenter/complaint_list.html:260 -#: templates/callcenter/inquiry_list.html:252 -#: templates/complaints/adverse_action_list.html:375 -#: templates/complaints/complaint_threshold_list.html:348 -#: templates/complaints/escalation_rule_list.html:396 -#: templates/complaints/inquiry_list.html:319 -#: templates/dashboard/complaint_request_list.html:150 -#: templates/dashboard/partials/actions_table.html:101 -#: templates/dashboard/partials/complaints_table.html:97 -#: templates/dashboard/partials/feedback_table.html:93 -#: templates/dashboard/partials/inquiries_table.html:95 -#: templates/dashboard/partials/observations_table.html:87 -#: templates/dashboard/partials/tasks_table.html:95 -#: templates/px_sources/source_user_complaint_list.html:286 -#: templates/px_sources/source_user_inquiry_list.html:265 -#: templates/references/search.html:321 -#: templates/reports/saved_reports.html:163 -msgid "Next" -msgstr "التالي" - #: templates/ai_engine/analyze_text.html:4 #: templates/ai_engine/analyze_text.html:11 #: templates/ai_engine/sentiment_dashboard.html:19 @@ -8185,9 +11550,10 @@ msgstr "إدخال النص" #: templates/ai_engine/analyze_text.html:29 #: templates/ai_engine/sentiment_detail.html:18 -#: templates/complaints/inquiry_detail.html:766 -#: templates/complaints/partials/ai_panel.html:166 -#: templates/surveys/comment_list.html:300 +#: templates/complaints/inquiry_detail.html:1016 +#: templates/complaints/partials/ai_panel.html:173 +#: templates/social/comments_list.html:83 +#: templates/surveys/comment_list.html:327 msgid "Analyzing..." msgstr "جارٍ التحليل..." @@ -8196,7 +11562,7 @@ msgid "Analysis Options" msgstr "خيارات التحليل" #: templates/ai_engine/analyze_text.html:80 -#: templates/complaints/partials/ai_panel.html:14 +#: templates/complaints/partials/ai_panel.html:15 msgid "Analyze" msgstr "تحليل" @@ -8209,34 +11575,20 @@ msgstr "نتائج التحليل" #: templates/ai_engine/sentiment_detail.html:63 #: templates/ai_engine/sentiment_list.html:203 #: templates/ai_engine/tags/sentiment_card.html:19 +#: templates/dashboard/my_performance.html:241 #: templates/dashboard/staff_performance_detail.html:298 -#: templates/organizations/patient_detail.html:426 +#: templates/organizations/patient_detail.html:421 #: templates/simulator/log_detail.html:171 #: templates/social/partials/ai_analysis_bilingual.html:46 -#: templates/surveys/instance_detail.html:251 -#: templates/surveys/instance_detail.html:469 +#: templates/surveys/instance_detail.html:331 #: templates/surveys/instance_list.html:137 msgid "Score" msgstr "النتيجة" -#: templates/ai_engine/analyze_text.html:120 -#: templates/ai_engine/sentiment_detail.html:68 -#: templates/ai_engine/sentiment_list.html:204 -#: templates/ai_engine/tags/sentiment_card.html:22 -#: templates/analytics/command_center.html:570 -#: templates/complaints/inquiry_detail.html:319 -#: templates/complaints/inquiry_detail.html:798 -#: templates/complaints/partials/ai_panel.html:30 -#: templates/complaints/partials/ai_panel.html:198 -#: templates/observations/partials/ai_panel.html:18 -#: templates/social/partials/ai_analysis_bilingual.html:56 -#: templates/social/social_comment_detail.html:126 -msgid "Confidence" -msgstr "الثقة" - #: templates/ai_engine/analyze_text.html:144 #: templates/ai_engine/sentiment_detail.html:84 #: templates/ai_engine/tags/sentiment_card.html:26 +#: templates/social/comment_detail.html:190 #: templates/social/partials/ai_analysis_bilingual.html:102 #: templates/social/social_comment_detail.html:146 msgid "Keywords" @@ -8251,6 +11603,7 @@ msgstr "الكيانات" #: templates/ai_engine/analyze_text.html:169 #: templates/ai_engine/sentiment_detail.html:127 +#: templates/social/comment_detail.html:218 #: templates/social/partials/ai_analysis_bilingual.html:187 msgid "Emotions" msgstr "العواطف" @@ -8301,7 +11654,7 @@ msgid "Sentiment Distribution" msgstr "توزيع المشاعر" #: templates/ai_engine/sentiment_dashboard.html:113 -#: templates/surveys/template_detail.html:101 +#: templates/surveys/template_detail.html:124 msgid "Avg Score" msgstr "متوسط التقييم" @@ -8338,6 +11691,7 @@ msgstr "نتائج التحليل الأخيرة" #: templates/ai_engine/sentiment_dashboard.html:233 #: templates/ai_engine/sentiment_detail.html:105 #: templates/ai_engine/sentiment_list.html:201 +#: templates/complaints/investigation_questions.html:96 msgid "Text" msgstr "النص" @@ -8345,14 +11699,20 @@ msgstr "النص" #: templates/ai_engine/sentiment_detail.html:53 #: templates/ai_engine/sentiment_list.html:149 #: templates/ai_engine/sentiment_list.html:202 +#: templates/analytics/dashboard.html:459 #: templates/dashboard/command_center.html:661 -#: templates/feedback/comment_list.html:47 -#: templates/feedback/feedback_list.html:278 -#: templates/feedback/feedback_list.html:359 +#: templates/feedback/comment_list.html:95 +#: templates/feedback/comment_list.html:157 +#: templates/feedback/feedback_detail.html:117 +#: templates/feedback/feedback_list.html:180 +#: templates/feedback/feedback_list.html:211 +#: templates/organizations/department_detail.html:1327 #: templates/physicians/department_overview.html:95 -#: templates/physicians/leaderboard.html:182 #: templates/physicians/ratings_list.html:203 #: templates/physicians/specialization_overview.html:94 +#: templates/social/comment_detail.html:126 +#: templates/social/comments_list.html:121 +#: templates/social/comments_list.html:159 #: templates/social/partials/ai_analysis_bilingual.html:25 #: templates/social/social_comment_detail.html:117 #: templates/social/social_comment_list.html:187 @@ -8360,8 +11720,8 @@ msgstr "النص" #: templates/surveys/comment_list.html:104 #: templates/surveys/comment_list.html:117 #: templates/surveys/comment_list.html:186 -#: templates/surveys/comment_list.html:262 -#: templates/surveys/instance_detail.html:395 +#: templates/surveys/comment_list.html:276 +#: templates/surveys/instance_detail.html:257 msgid "Sentiment" msgstr "المشاعر" @@ -8378,9 +11738,9 @@ msgid "Sentiment Analysis Result" msgstr "نتيجة تحليل المشاعر" #: templates/ai_engine/sentiment_detail.html:21 -#: templates/complaints/inquiry_detail.html:302 -#: templates/complaints/inquiry_detail.html:787 -#: templates/complaints/inquiry_detail.html:834 +#: templates/complaints/inquiry_detail.html:155 +#: templates/complaints/inquiry_detail.html:1026 +#: templates/complaints/inquiry_detail.html:1046 msgid "Re-analyze" msgstr "إعادة التحليل" @@ -8390,49 +11750,16 @@ msgstr "النص المحلل" #: templates/ai_engine/sentiment_detail.html:48 #: templates/physicians/physician_ratings_dashboard.html:429 +#: templates/social/comments_list.html:94 msgid "Sentiment Analysis" msgstr "تحليل المشاعر" -#: templates/ai_engine/sentiment_detail.html:106 -#: templates/ai_engine/sentiment_detail.html:187 -#: templates/callcenter/call_records_list.html:218 -#: templates/callcenter/interaction_list.html:109 -#: templates/complaints/adverse_action_list.html:236 -#: templates/complaints/adverse_action_list.html:275 -#: templates/complaints/complaint_threshold_list.html:254 -#: templates/dashboard/employee_evaluation.html:988 -#: templates/dashboard/partials/actions_table.html:26 -#: templates/feedback/feedback_list.html:239 -#: templates/feedback/feedback_list.html:354 -#: templates/organizations/patient_detail.html:304 -#: templates/organizations/patient_list.html:507 -#: templates/organizations/staff_list.html:204 -#: templates/organizations/staff_list.html:261 -#: templates/px_sources/source_detail.html:389 -#: templates/px_sources/source_list.html:198 -#: templates/references/folder_view.html:240 -#: templates/references/search.html:233 -#: templates/simulator/log_detail.html:149 -#: templates/simulator/log_detail.html:165 -#: templates/surveys/analytics_report_info.html:18 -#: templates/surveys/analytics_report_markdown_view.html:105 -#: templates/surveys/analytics_report_view.html:18 -#: templates/surveys/analytics_reports.html:100 -#: templates/surveys/comment_list.html:260 -#: templates/surveys/instance_detail.html:468 -#: templates/surveys/instance_detail.html:576 -#: templates/surveys/instance_list.html:99 -#: templates/surveys/instance_list.html:135 -#: templates/surveys/template_detail.html:133 -msgid "Type" -msgstr "النوع" - #: templates/ai_engine/sentiment_detail.html:155 +#: templates/complaints/government_ticket_detail.html:183 msgid "Metadata" msgstr "البيانات الوصفية" #: templates/ai_engine/sentiment_detail.html:159 -#: templates/analytics/command_center.html:358 #: templates/callcenter/complaint_list.html:176 #: templates/callcenter/inquiry_list.html:173 #: templates/dashboard/partials/actions_table.html:24 @@ -8441,7 +11768,8 @@ msgstr "البيانات الوصفية" #: templates/dashboard/partials/inquiries_table.html:24 #: templates/dashboard/partials/observations_table.html:24 #: templates/dashboard/partials/tasks_table.html:24 -#: templates/feedback/feedback_list.html:353 +#: templates/feedback/feedback_delete_confirm.html:88 +#: templates/feedback/feedback_list.html:205 #: templates/simulator/log_list.html:276 msgid "ID" msgstr "المعرف" @@ -8450,12 +11778,6 @@ msgstr "المعرف" msgid "AI Model" msgstr "نموذج الذكاء الاصطناعي" -#: templates/ai_engine/sentiment_detail.html:174 -#: templates/organizations/patient_detail.html:614 -#: templates/organizations/staff_detail.html:290 -msgid "Updated" -msgstr "تاريخ التحديث" - #: templates/ai_engine/sentiment_detail.html:184 msgid "Related Object" msgstr "الكائن المرتبط" @@ -8474,12 +11796,14 @@ msgid "AI-powered sentiment analysis of text content" msgstr "تحليل مشاعر النصوص باستخدام الذكاء الاصطناعي" #: templates/ai_engine/sentiment_list.html:84 -#: templates/layouts/partials/sidebar.html:106 -#: templates/layouts/partials/sidebar.html:348 -#: templates/layouts/partials/sidebar.html:496 -#: templates/layouts/partials/sidebar.html:531 +#: templates/dashboard/complaint_quarterly_report.html:59 +#: templates/layouts/partials/sidebar.html:140 +#: templates/layouts/partials/sidebar.html:263 +#: templates/layouts/partials/sidebar.html:475 +#: templates/layouts/partials/sidebar.html:644 #: templates/layouts/partials/topbar.html:15 -#: templates/layouts/source_user_base.html:141 +#: templates/layouts/source_user_base.html:119 +#: templates/organizations/department_detail.html:406 #: templates/physicians/leaderboard.html:52 #: templates/physicians/ratings_list.html:106 #: templates/reports/report_builder.html:24 @@ -8498,18 +11822,16 @@ msgid "Min Confidence" msgstr "الحد الأدنى للثقة" #: templates/ai_engine/sentiment_list.html:170 -#: templates/analytics/command_center.html:144 -#: templates/appreciation/leaderboard.html:64 #: templates/complaints/complaint_threshold_list.html:227 #: templates/complaints/escalation_rule_list.html:261 -#: templates/dashboard/my_dashboard.html:160 +#: templates/dashboard/my_dashboard.html:166 #: templates/journeys/instance_list.html:215 -#: templates/observations/observation_list.html:266 +#: templates/observations/observation_list.html:268 msgid "Apply Filters" msgstr "تطبيق الفلاتر" #: templates/ai_engine/sentiment_list.html:187 -#: templates/organizations/patient_list.html:495 +#: templates/organizations/patient_list.html:508 #: templates/physicians/doctor_rating_job_list.html:109 #: templates/references/search.html:218 msgid "Results" @@ -8529,10 +11851,8 @@ msgstr "تحليل المشاعر بالذكاء الاصطناعي" #: templates/analytics/ask_your_data.html:4 #: templates/analytics/ask_your_data.html:212 -#, fuzzy -#| msgid "Access Your Dashboard:" msgid "Ask Your Data" -msgstr "الوصول إلى لوحة التحكم الخاصة بك:" +msgstr "اسأل بياناتك" #: templates/analytics/ask_your_data.html:214 msgid "" @@ -8547,530 +11867,36 @@ msgid "Example: How many complaints did Cardiology have last month?" msgstr "مثال: كم عدد الشكاوى التي تلقاها قسم القلب الشهر الماضي؟" #: templates/analytics/ask_your_data.html:238 -#, fuzzy -#| msgid "No physician ratings this month" msgid "How many complaints this month?" -msgstr "لا توجد تقييمات للأطباء هذا الشهر" +msgstr "كم عدد الشكاوى هذا الشهر؟" #: templates/analytics/ask_your_data.html:241 -#, fuzzy -#| msgid "Complaints by Department" msgid "Show complaints by department" -msgstr "الشكاوى حسب القسم" +msgstr "عرض الشكاوى حسب القسم" #: templates/analytics/ask_your_data.html:244 msgid "What's the average survey score?" msgstr "ما هو متوسط درجة الاستبيان؟" #: templates/analytics/ask_your_data.html:247 -#, fuzzy -#| msgid "This department is already involved in this complaint." msgid "Which departments have overdue complaints?" -msgstr "هذا القسم مشارك بالفعل في هذه الشكوى." +msgstr "أي الأقسام لديها شكاوى متأخرة؟" #: templates/analytics/ask_your_data.html:250 msgid "Show NPS trend for the last 6 months" msgstr "عرض اتجاه مؤشر رضا العملاء (NPS) للأشهر الستة الماضية" #: templates/analytics/ask_your_data.html:253 -#, fuzzy -#| msgid "How the adverse action was resolved" msgid "How many actions are overdue?" -msgstr "كيف تم حل هذا الإجراء السلبي" +msgstr "كم عدد الإجراءات المتأخرة؟" #: templates/analytics/ask_your_data.html:256 -#, fuzzy -#| msgid "Monitor specific complaint categories" msgid "Top complaint categories this week" -msgstr "مراقبة فئات شكاوى محددة" +msgstr "أهم فئات الشكاوى هذا الأسبوع" #: templates/analytics/ask_your_data.html:259 -#, fuzzy -#| msgid "Physician Ratings Dashboard" msgid "Show physician ratings leaderboard" -msgstr "لوحة تحكم تقييمات الأطباء" - -#: templates/analytics/command_center.html:4 -#: templates/analytics/command_center.html:55 -#: templates/dashboard/command_center.html:5 -#: templates/dashboard/command_center.html:113 -msgid "PX Command Center" -msgstr "مركز قيادة تجربة المرضى" - -#: templates/analytics/command_center.html:46 -#: templates/physicians/physician_ratings_dashboard.html:235 -msgid "Loading dashboard data..." -msgstr "جارٍ تحميل بيانات لوحة التحكم..." - -#: templates/analytics/command_center.html:57 -msgid "Comprehensive Patient Experience Analytics Dashboard" -msgstr "لوحة تحليلات شاملة لتجربة المرضى" - -#: templates/analytics/command_center.html:61 -#: templates/dashboard/complaint_request_list.html:15 -#: templates/dashboard/employee_evaluation.html:737 -#: templates/reports/report_builder.html:147 -#: templates/reports/saved_reports.html:122 -msgid "Export Excel" -msgstr "تصدير Excel" - -#: templates/analytics/command_center.html:64 -#: templates/analytics/kpi_report_detail.html:89 -#: templates/reports/saved_reports.html:125 -msgid "Export PDF" -msgstr "تصدير PDF" - -#: templates/analytics/command_center.html:67 -#: templates/analytics/dashboard.html:247 -#: templates/notifications/settings.html:217 -msgid "Refresh" -msgstr "تحديث" - -#: templates/analytics/command_center.html:88 -#: templates/dashboard/admin_evaluation.html:246 -#: templates/dashboard/employee_evaluation.html:646 -#: templates/dashboard/my_dashboard.html:125 -#: templates/reports/report_builder.html:66 -#: templates/surveys/comment_list.html:223 -msgid "Date Range" -msgstr "نطاق التاريخ" - -#: templates/analytics/command_center.html:91 -#: templates/complaints/analytics.html:143 -#: templates/dashboard/admin_evaluation.html:248 -#: templates/dashboard/employee_evaluation.html:648 -#: templates/dashboard/staff_performance_detail.html:28 -#: templates/reports/report_builder.html:68 -msgid "Last 7 Days" -msgstr "آخر ٧ أيام" - -#: templates/analytics/command_center.html:92 -#: templates/complaints/analytics.html:144 -#: templates/dashboard/admin_evaluation.html:249 -#: templates/dashboard/employee_evaluation.html:649 -#: templates/dashboard/staff_performance_detail.html:29 -#: templates/reports/report_builder.html:69 -msgid "Last 30 Days" -msgstr "آخر ٣٠ يومًا" - -#: templates/analytics/command_center.html:93 -#: templates/complaints/analytics.html:145 -#: templates/dashboard/admin_evaluation.html:250 -#: templates/dashboard/employee_evaluation.html:650 -#: templates/dashboard/staff_performance_detail.html:30 -#: templates/reports/report_builder.html:70 -msgid "Last 90 Days" -msgstr "آخر ٩٠ يومًا" - -#: templates/analytics/command_center.html:95 -#: templates/dashboard/admin_evaluation.html:252 -#: templates/dashboard/employee_evaluation.html:652 -msgid "Last Month" -msgstr "الشهر الماضي" - -#: templates/analytics/command_center.html:96 -#: templates/dashboard/admin_evaluation.html:253 -#: templates/dashboard/employee_evaluation.html:653 -msgid "This Quarter" -msgstr "هذا الربع" - -#: templates/analytics/command_center.html:97 -#: templates/dashboard/admin_evaluation.html:254 -#: templates/dashboard/employee_evaluation.html:654 -msgid "This Year" -msgstr "هذا العام" - -#: templates/analytics/command_center.html:98 -#: templates/analytics/command_center.html:104 -#: templates/dashboard/admin_evaluation.html:255 -#: templates/dashboard/employee_evaluation.html:655 -#: templates/reports/report_builder.html:72 -msgid "Custom Range" -msgstr "نطاق مخصص" - -#: templates/analytics/command_center.html:119 -#: templates/dashboard/admin_evaluation.html:278 -#: templates/dashboard/employee_evaluation.html:678 -#: templates/journeys/instance_list.html:194 -#: templates/observations/observation_list.html:219 -#: templates/organizations/section_list.html:82 -#: templates/organizations/staff_hierarchy.html:202 -#: templates/physicians/leaderboard.html:135 -#: templates/physicians/physician_list.html:148 -#: templates/physicians/physician_ratings_dashboard.html:282 -#: templates/physicians/ratings_list.html:162 -#: templates/reports/report_builder.html:84 -#: templates/standards/search.html:200 -#: templates/standards/standard_confirm_delete.html:95 -#: templates/standards/standard_detail.html:125 -msgid "All Departments" -msgstr "جميع الأقسام" - -#: templates/analytics/command_center.html:130 -msgid "KPI Category" -msgstr "فئة مؤشرات الأداء" - -#: templates/analytics/command_center.html:134 -#: templates/analytics/dashboard.html:474 -#: templates/callcenter/complaint_list.html:5 -#: templates/callcenter/complaint_list.html:170 -#: templates/complaints/analytics.html:368 -#: templates/complaints/complaint_list.html:152 -#: templates/complaints/request_explanation_form.html:99 -#: templates/dashboard/admin_evaluation.html:400 -#: templates/dashboard/command_center.html:178 -#: templates/dashboard/command_center.html:752 -#: templates/dashboard/department_benchmarks.html:130 -#: templates/dashboard/employee_evaluation.html:709 -#: templates/dashboard/my_dashboard.html:173 -#: templates/dashboard/partials/complaints_table.html:6 -#: templates/dashboard/staff_performance_detail.html:269 -#: templates/layouts/partials/sidebar.html:153 -#: templates/layouts/source_user_base.html:173 -#: templates/organizations/patient_detail.html:286 -#: templates/organizations/patient_detail.html:563 -#: templates/px_sources/source_detail.html:208 -#: templates/px_sources/source_detail.html:230 -#: templates/px_sources/source_user_confirm_delete.html:96 -msgid "Complaints" -msgstr "الشكاوى" - -#: templates/analytics/command_center.html:135 -#: templates/analytics/command_center.html:392 -#: templates/dashboard/command_center.html:660 -#: templates/layouts/partials/sidebar.html:233 -#: templates/organizations/patient_detail.html:281 -#: templates/organizations/patient_detail.html:554 -#: templates/physicians/department_overview.html:87 -#: templates/physicians/department_overview.html:110 -#: templates/physicians/leaderboard.html:181 -#: templates/physicians/physician_detail.html:412 -#: templates/physicians/physician_detail.html:500 -#: templates/physicians/physician_ratings_dashboard.html:460 -#: templates/physicians/ratings_list.html:202 -#: templates/physicians/specialization_overview.html:86 -#: templates/physicians/specialization_overview.html:110 -#: templates/surveys/instance_detail.html:120 -msgid "Surveys" -msgstr "الاستبيانات" - -#: templates/analytics/command_center.html:137 -#: templates/layouts/partials/sidebar.html:341 -#: templates/organizations/physician_list.html:4 -#: templates/organizations/physician_list.html:56 -#: templates/physicians/department_overview.html:5 -#: templates/physicians/department_overview.html:14 -#: templates/physicians/department_overview.html:83 -#: templates/physicians/physician_detail.html:5 -#: templates/physicians/physician_detail.html:320 -#: templates/physicians/physician_list.html:5 -#: templates/physicians/physician_list.html:74 -#: templates/physicians/physician_list.html:186 -#: templates/physicians/specialization_overview.html:5 -#: templates/physicians/specialization_overview.html:14 -#: templates/physicians/specialization_overview.html:82 -msgid "Physicians" -msgstr "الأطباء" - -#: templates/analytics/command_center.html:147 -#: templates/appreciation/leaderboard.html:68 -msgid "Reset" -msgstr "إعادة تعيين" - -#: templates/analytics/command_center.html:161 -#: templates/analytics/dashboard.html:265 -#: templates/callcenter/complaint_list.html:84 -#: templates/complaints/analytics.html:156 -#: templates/dashboard/admin_evaluation.html:345 -#: templates/dashboard/employee_evaluation.html:710 -#: templates/dashboard/employee_evaluation.html:753 -#: templates/dashboard/employee_evaluation.html:767 -#: templates/dashboard/employee_evaluation.html:1380 -#: templates/dashboard/staff_performance_detail.html:127 -#: templates/px_sources/source_detail.html:438 -#: templates/px_sources/source_user_dashboard.html:54 -msgid "Total Complaints" -msgstr "إجمالي الشكاوى" - -#: templates/analytics/command_center.html:174 -#: templates/complaints/analytics.html:169 -msgid "vs last period" -msgstr "مقارنةً بالفترة السابقة" - -#: templates/analytics/command_center.html:183 -#: templates/px_sources/source_user_dashboard.html:67 -msgid "Open Complaints" -msgstr "الشكاوى المفتوحة" - -#: templates/analytics/command_center.html:209 -msgid "Resolved Complaints" -msgstr "الشكاوى المغلقة" - -#: templates/analytics/command_center.html:222 -#: templates/analytics/dashboard.html:299 -msgid "Total Actions" -msgstr "إجمالي الإجراءات" - -#: templates/analytics/command_center.html:235 -#: templates/reports/report_templates.html:120 -msgid "Overdue Actions" -msgstr "الإجراءات المتأخرة" - -#: templates/analytics/command_center.html:248 -#: templates/analytics/dashboard.html:310 -msgid "Avg Survey Score" -msgstr "متوسط تقييم الاستبيان" - -#: templates/analytics/command_center.html:261 -msgid "Negative Surveys" -msgstr "الاستبيانات السلبية" - -#: templates/analytics/command_center.html:278 -#: templates/complaints/analytics.html:222 -#: templates/dashboard/command_center.html:323 -msgid "Complaints Trend" -msgstr "اتجاه الشكاوى" - -#: templates/analytics/command_center.html:289 -msgid "Complaints by Category" -msgstr "الشكاوى حسب الفئة" - -#: templates/analytics/command_center.html:303 -msgid "Survey Satisfaction Trend" -msgstr "اتجاه رضا الاستبيانات" - -#: templates/analytics/command_center.html:314 -msgid "Survey Distribution" -msgstr "توزيع الاستبيانات" - -#: templates/analytics/command_center.html:328 -#: templates/analytics/dashboard.html:465 -#: templates/reports/report_templates.html:160 -msgid "Department Performance" -msgstr "أداء الأقسام" - -#: templates/analytics/command_center.html:339 -#: templates/physicians/leaderboard.html:5 -#: templates/physicians/leaderboard.html:44 -msgid "Physician Leaderboard" -msgstr "لوحة صدارة الأطباء" - -#: templates/analytics/command_center.html:380 -msgid "Top Performing Physicians" -msgstr "أفضل الأطباء أداءً" - -#: templates/analytics/command_center.html:387 -#: templates/dashboard/command_center.html:656 -#: templates/dashboard/department_benchmarks.html:126 -#: templates/physicians/department_overview.html:106 -#: templates/physicians/leaderboard.html:176 -#: templates/physicians/physician_detail.html:417 -#: templates/physicians/physician_detail.html:504 -#: templates/physicians/physician_ratings_dashboard.html:454 -#: templates/physicians/specialization_overview.html:105 -msgid "Rank" -msgstr "الترتيب" - -#: templates/analytics/command_center.html:389 -#: templates/organizations/physician_list.html:79 -#: templates/organizations/staff_detail.html:87 -#: templates/organizations/staff_form.html:261 -#: templates/physicians/department_overview.html:108 -#: templates/physicians/leaderboard.html:178 -#: templates/physicians/physician_detail.html:367 -#: templates/physicians/physician_list.html:194 -#: templates/physicians/physician_ratings_dashboard.html:456 -#: templates/physicians/ratings_list.html:198 -msgid "Specialization" -msgstr "التخصص" - -#: templates/analytics/command_center.html:391 -#: templates/callcenter/interaction_detail.html:64 -#: templates/callcenter/interaction_list.html:111 -#: templates/dashboard/command_center.html:659 -#: templates/dashboard/department_benchmarks.html:129 -#: templates/dashboard/partials/feedback_table.html:26 -#: templates/feedback/feedback_list.html:358 -#: templates/physicians/department_overview.html:109 -#: templates/physicians/doctor_rating_review.html:176 -#: templates/physicians/individual_ratings_list.html:186 -#: templates/physicians/leaderboard.html:180 -#: templates/physicians/physician_detail.html:499 -#: templates/physicians/physician_ratings_dashboard.html:459 -#: templates/physicians/ratings_list.html:201 -#: templates/physicians/specialization_overview.html:109 -msgid "Rating" -msgstr "التقييم" - -#: templates/analytics/command_center.html:410 -#: templates/analytics/dashboard.html:524 -#, fuzzy -#| msgid "Survey Insights" -msgid "AI-Powered Insights" -msgstr "استنتاجات الاستبيان" - -#: templates/analytics/command_center.html:413 -#: templates/analytics/dashboard.html:245 -#, fuzzy -#| msgid "Refresh" -msgid "Refresh AI" -msgstr "تحديث" - -#: templates/analytics/command_center.html:421 -#: templates/analytics/kpi_report_detail.html:358 -#: templates/analytics/kpi_report_detail.html:464 -#: templates/analytics/kpi_report_pdf.html:940 -msgid "Executive Summary" -msgstr "ملخص تنفيذي" - -#: templates/analytics/command_center.html:424 -#, fuzzy -#| msgid "Escalation Warning:" -msgid "Early Warnings" -msgstr "تحذير التصعيد:" - -#: templates/analytics/command_center.html:427 -msgid "Forecast" -msgstr "التنبؤ" - -#: templates/analytics/command_center.html:430 -#, fuzzy -#| msgid "Risk:" -msgid "SLA Risk" -msgstr "مستوى الخطورة:" - -#: templates/analytics/command_center.html:433 -#: templates/analytics/kpi_report_detail.html:435 -#: templates/analytics/kpi_report_pdf.html:1036 -msgid "Recommendations" -msgstr "التوصيات" - -#: templates/analytics/command_center.html:447 -#: templates/analytics/command_center.html:507 -#, fuzzy -#| msgid "Risk:" -msgid "Risk" -msgstr "مستوى الخطورة:" - -#: templates/analytics/command_center.html:450 -#: templates/analytics/dashboard.html:549 -#, fuzzy -#| msgid "Monthly Summary" -msgid "English Summary" -msgstr "ملخص شهري" - -#: templates/analytics/command_center.html:464 -#: templates/analytics/dashboard.html:566 -#, fuzzy -#| msgid "العربية" -msgid "الملخص العربي" -msgstr "العربية" - -#: templates/analytics/command_center.html:480 -#: templates/analytics/dashboard.html:583 -#, fuzzy -#| msgid "Recommended action:" -msgid "Recommended Actions" -msgstr "الإجراء الموصى به:" - -#: templates/analytics/command_center.html:494 -msgid "" -"AI summary loading — click Refresh AI or wait for daily generation at 6 AM" -msgstr "" -"جاري تحميل ملخص الذكاء الاصطناعي — انقر على تحديث الذكاء الاصطناعي أو انتظر " -"التوليد اليومي في الساعة ٦ صباحًا" - -#: templates/analytics/command_center.html:508 -#: templates/complaints/escalation_rule_list.html:288 -#: templates/complaints/escalation_rule_list.html:306 -#: templates/dashboard/command_center.html:528 -msgid "Level" -msgstr "المستوى" - -#: templates/analytics/command_center.html:509 -#, fuzzy -#| msgid "Sign" -msgid "Signals" -msgstr "توقيع" - -#: templates/analytics/command_center.html:510 -#: templates/analytics/dashboard.html:619 -#, fuzzy -#| msgid "Complaint" -msgid "Complaint Δ" -msgstr "شكوى" - -#: templates/analytics/command_center.html:511 -#: templates/analytics/dashboard.html:620 -#, fuzzy -#| msgid "Survey" -msgid "Survey Δ" -msgstr "الاستبيان" - -#: templates/analytics/command_center.html:512 -#: templates/analytics/dashboard.html:621 -msgid "SLA Δ" -msgstr "SLA Δ" - -#: templates/analytics/command_center.html:550 -msgid "No departments currently showing risk signals" -msgstr "لا توجد أقسام تعرض حالياً إشارات خطر" - -#: templates/analytics/command_center.html:560 -msgid "Predicted 30d" -msgstr "متوقع 30 يوم" - -#: templates/analytics/command_center.html:564 -#: templates/analytics/dashboard.html:676 -#, fuzzy -#| msgid "Recently" -msgid "vs Recent" -msgstr "مؤخرًا" - -#: templates/analytics/command_center.html:577 -msgid "Insufficient historical data for forecasting (need 14+ days)" -msgstr "بيانات تاريخية غير كافية للتنبؤ (تتطلب 14 يوماً أو أكثر)" - -#: templates/analytics/command_center.html:590 -#: templates/analytics/dashboard.html:726 -msgid "Breach Risk" -msgstr "خطر الانتهاك" - -#: templates/analytics/command_center.html:592 -#: templates/analytics/dashboard.html:728 -#, fuzzy -#| msgid "hours before" -msgid "Hours Left" -msgstr "ساعات قبل" - -#: templates/analytics/command_center.html:593 -#: templates/analytics/dashboard.html:731 -#: templates/feedback/action_plan_list.html:59 -msgid "Recommendation" -msgstr "توصية" - -#: templates/analytics/command_center.html:614 -#: templates/analytics/dashboard.html:752 -msgid "EXPIRED" -msgstr "منتهي الصلاحية" - -#: templates/analytics/command_center.html:625 -msgid "No complaints currently at risk of SLA breach" -msgstr "لا توجد شكاوى حالية معرضة لانتهاء اتفاقية مستوى الخدمة" - -#: templates/analytics/command_center.html:643 -#: templates/analytics/dashboard.html:798 -#: templates/analytics/kpi_report_pdf.html:885 -#: templates/dashboard/partials/complaints_table.html:84 -#: templates/px_sources/source_list.html:239 -msgid "complaints" -msgstr "شكاوى" - -#: templates/analytics/command_center.html:661 -msgid "No actionable patterns detected yet — need more complaint data" -msgstr "" -"لم يتم الكشف عن أنماط قابلة للتنفيذ حتى الآن — هناك حاجة إلى المزيد من " -"بيانات الشكاوى" +msgstr "عرض لوحة متصدر تقييمات الأطباء" #: templates/analytics/dashboard.html:5 templates/analytics/dashboard.html:238 #: templates/social/social_analytics.html:6 @@ -9083,10 +11909,17 @@ msgid "Comprehensive overview of patient experience metrics" msgstr "نظرة شاملة على مقاييس تجربة المريض" #: templates/analytics/dashboard.html:243 -#, fuzzy -#| msgid "Performance Analytics" msgid "Refresh AI Analytics" -msgstr "تحليلات الأداء" +msgstr "تحديث تحليلات الذكاء الاصطناعي" + +#: templates/analytics/dashboard.html:245 +msgid "Refresh AI" +msgstr "تحديث الذكاء الاصطناعي" + +#: templates/analytics/dashboard.html:247 +#: templates/notifications/settings.html:217 +msgid "Refresh" +msgstr "تحديث" #: templates/analytics/dashboard.html:262 #: templates/analytics/dashboard.html:296 @@ -9096,245 +11929,520 @@ msgid "open" msgstr "مفتوح" #: templates/analytics/dashboard.html:276 +#: templates/dashboard/inquiry_report.html:120 #: templates/reports/report_templates.html:44 msgid "SLA Compliance" msgstr "الامتثال لاتفاقية مستوى الخدمة (SLA)" #: templates/analytics/dashboard.html:287 +#: templates/analytics/kpi_report_weasyprint.html:512 msgid "Avg Resolution" msgstr "متوسط التحويل" #: templates/analytics/dashboard.html:321 -msgid "NPS Score" -msgstr "درجة NPS" +#: templates/complaints/complaint_list.html:256 +msgid "Escalated OVR" +msgstr "OVR المُصعّد" #: templates/analytics/dashboard.html:332 -#: templates/complaints/analytics.html:4 -#: templates/complaints/analytics.html:137 -msgid "Complaints Analytics" -msgstr "تحليلات الشكاوى" +msgid "Avg Survey Score" +msgstr "متوسط تقييم الاستبيان" -#: templates/analytics/dashboard.html:333 -msgid "Status, sources, and severity breakdown" -msgstr "الحالة والمصادر وتفصيل الشدة" +#: templates/analytics/dashboard.html:354 +msgid "Module Analytics" +msgstr "تحليلات الوحدة" -#: templates/analytics/dashboard.html:343 +#: templates/analytics/dashboard.html:355 +msgid "Breakdown by status, severity, department, and category" +msgstr "تحليل حسب الحالة، الخطورة، القسم، والفئة" + +#: templates/analytics/dashboard.html:368 +#: templates/analytics/dashboard.html:535 +#: templates/analytics/dashboard.html:2199 +#: templates/callcenter/inquiry_list.html:5 +#: templates/callcenter/inquiry_list.html:167 +#: templates/complaints/inquiry_department_response.html:9 +#: templates/complaints/inquiry_detail.html:82 +#: templates/complaints/inquiry_form.html:64 +#: templates/dashboard/admin_evaluation.html:414 +#: templates/dashboard/command_center.html:276 +#: templates/dashboard/department_benchmarks.html:131 +#: templates/dashboard/employee_evaluation.html:1222 +#: templates/dashboard/employee_evaluation_charts.html:579 +#: templates/dashboard/my_dashboard.html:184 +#: templates/dashboard/partials/inquiries_table.html:6 +#: templates/dashboard/staff_performance_detail.html:277 +#: templates/layouts/partials/sidebar.html:198 +#: templates/layouts/source_user_base.html:176 +#: templates/organizations/department_detail.html:423 +#: templates/organizations/department_inquiries.html:4 +#: templates/organizations/department_inquiries.html:13 +#: templates/organizations/department_inquiry_detail.html:13 +#: templates/organizations/department_list.html:145 +#: templates/organizations/patient_detail.html:286 +#: templates/organizations/patient_detail.html:567 +#: templates/px_sources/source_detail.html:212 +#: templates/px_sources/source_detail.html:236 +#: templates/px_sources/source_user_confirm_delete.html:99 +msgid "Inquiries" +msgstr "الاستفسارات" + +#: templates/analytics/dashboard.html:372 +#: templates/analytics/dashboard.html:555 +#: templates/analytics/dashboard.html:2201 +#: templates/dashboard/command_center.html:302 +#: templates/dashboard/my_dashboard.html:189 +#: templates/dashboard/partials/observations_table.html:6 +#: templates/layouts/partials/sidebar.html:205 +#: templates/layouts/source_user_base.html:185 +#: templates/observations/category_form.html:11 +#: templates/observations/category_list.html:52 +#: templates/observations/category_list.html:90 +#: templates/observations/observation_department_response.html:9 +#: templates/observations/observation_detail.html:29 +#: templates/observations/observation_list.html:5 +#: templates/observations/observation_list.html:84 +#: templates/organizations/department_detail.html:426 +#: templates/organizations/department_list.html:146 +#: templates/organizations/department_observation_detail.html:13 +#: templates/organizations/department_observations.html:4 +#: templates/organizations/department_observations.html:13 +msgid "Observations" +msgstr "الملاحظات" + +#: templates/analytics/dashboard.html:376 +#: templates/analytics/dashboard.html:545 +#: templates/analytics/dashboard.html:2200 +#: templates/feedback/feedback_delete_confirm.html:53 +#: templates/feedback/feedback_detail.html:26 +#: templates/feedback/feedback_form.html:52 +#: templates/feedback/feedback_list.html:4 +#: templates/feedback/feedback_list.html:66 +#: templates/feedback/feedback_list.html:130 +#: templates/feedback/feedback_list.html:137 +#: templates/layouts/partials/sidebar.html:213 +#: templates/layouts/source_user_base.html:191 +#: templates/organizations/department_detail.html:429 +msgid "Suggestions" +msgstr "الاقتراحات" + +#: templates/analytics/dashboard.html:389 +#: templates/analytics/dashboard.html:411 +#: templates/analytics/dashboard.html:433 +#: templates/analytics/dashboard.html:455 +#: templates/analytics/dashboard.html:477 +#: templates/dashboard/standards_dashboard.html:112 +#: templates/dashboard/standards_dashboard.html:118 #: templates/surveys/analytics_dashboard.html:60 msgid "Status Distribution" msgstr "توزيع الحالات" -#: templates/analytics/dashboard.html:354 -msgid "Complaint Sources" -msgstr "مصادر الشكاوى" - -#: templates/analytics/dashboard.html:365 +#: templates/analytics/dashboard.html:393 +#: templates/analytics/dashboard.html:437 msgid "Severity Levels" msgstr "مستويات الخطورة" -#: templates/analytics/dashboard.html:382 +#: templates/analytics/dashboard.html:397 +#: templates/analytics/dashboard.html:419 +#: templates/analytics/dashboard.html:441 +#: templates/analytics/dashboard.html:463 +#: templates/analytics/dashboard.html:485 +#: templates/physicians/physician_list.html:87 +msgid "By Department" +msgstr "حسب القسم" + +#: templates/analytics/dashboard.html:401 +msgid "Complaint Sources" +msgstr "مصادر الشكاوى" + +#: templates/analytics/dashboard.html:415 +msgid "By Priority" +msgstr "حسب الأولوية" + +#: templates/analytics/dashboard.html:423 +#: templates/analytics/dashboard.html:445 +#: templates/analytics/dashboard.html:467 +#: templates/analytics/dashboard.html:481 +#: templates/complaints/complaint_threshold_form.html:421 +#: templates/complaints/complaint_threshold_list.html:213 +#: templates/dashboard/comments_report.html:72 +#: templates/dashboard/observation_report.html:125 +msgid "By Category" +msgstr "حسب الفئة" + +#: templates/analytics/dashboard.html:489 +#: templates/organizations/department_detail.html:1326 +#: templates/organizations/department_staff_detail.html:490 +msgid "Visibility" +msgstr "الظهور" + +#: templates/analytics/dashboard.html:503 +msgid "Cross-Module Yearly Trends" +msgstr "الاتجاهات السنوية عبر الوحدات" + +#: templates/analytics/dashboard.html:504 +msgid "Quarterly volume trends across all modules" +msgstr "اتجاهات الحجم الربع سنوية عبر جميع الوحدات" + +#: templates/analytics/dashboard.html:565 +#: templates/analytics/dashboard.html:2202 +#: templates/appreciation/appreciation_detail.html:53 +#: templates/appreciation/appreciation_list.html:4 +#: templates/appreciation/appreciation_list.html:57 +#: templates/appreciation/leaderboard.html:85 +#: templates/appreciation/my_badges.html:25 +#: templates/organizations/department_detail.html:432 +#: templates/organizations/department_staff_detail.html:278 +msgid "Appreciations" +msgstr "الإشادات" + +#: templates/analytics/dashboard.html:575 +#: templates/analytics/dashboard.html:2203 +msgid "Patient Visits" +msgstr "زيارات المرضى" + +#: templates/analytics/dashboard.html:592 msgid "PX Actions Analytics" msgstr "تحليلات إجراءات المرضى" -#: templates/analytics/dashboard.html:383 +#: templates/analytics/dashboard.html:593 msgid "Action status and categories" msgstr "حالة الإجراءات والتصنيفات" -#: templates/analytics/dashboard.html:393 +#: templates/analytics/dashboard.html:603 msgid "Action Status" msgstr "حالة الإجراءات" -#: templates/analytics/dashboard.html:404 +#: templates/analytics/dashboard.html:614 msgid "Action Categories" msgstr "فئات الإجراءات" -#: templates/analytics/dashboard.html:421 +#: templates/analytics/dashboard.html:631 msgid "Survey Analytics" msgstr "تحليل الاستبيانات" -#: templates/analytics/dashboard.html:422 +#: templates/analytics/dashboard.html:632 msgid "Patient satisfaction and NPS trends" msgstr "اتجاهات رضا المرضى وNPS" -#: templates/analytics/dashboard.html:432 +#: templates/analytics/dashboard.html:642 msgid "Net Promoter Score" msgstr "مؤشر صافي الترويج" -#: templates/analytics/dashboard.html:436 +#: templates/analytics/dashboard.html:646 msgid "Industry Avg: +32" msgstr "متوسط الصناعة: +32" -#: templates/analytics/dashboard.html:448 +#: templates/analytics/dashboard.html:658 msgid "Survey Score Trend" msgstr "اتجاهات درجة الاستبيان" -#: templates/analytics/dashboard.html:466 +#: templates/analytics/dashboard.html:675 +#: templates/organizations/patient_visit_journey.html:229 +msgid "Visit Analytics" +msgstr "تحليلات الزيارات" + +#: templates/analytics/dashboard.html:676 +msgid "Patient visit metrics by type" +msgstr "مقاييس زيارات المرضى حسب النوع" + +#: templates/analytics/dashboard.html:683 +msgid "Total Visits" +msgstr "إجمالي الزيارات" + +#: templates/analytics/dashboard.html:685 +msgid "All visit types" +msgstr "جميع أنواع الزيارات" + +#: templates/analytics/dashboard.html:690 +#: templates/analytics/dashboard.html:1854 +#: templates/analytics/dashboard.html:1913 +#: templates/analytics/dashboard.html:1996 +msgid "Emergency (ED)" +msgstr "الطوارئ (ED)" + +#: templates/analytics/dashboard.html:695 +#: templates/analytics/dashboard.html:705 +#: templates/analytics/dashboard.html:715 +#: templates/analytics/dashboard.html:1879 +msgid "Avg Duration" +msgstr "متوسط المدة" + +#: templates/analytics/dashboard.html:700 +#: templates/analytics/dashboard.html:1855 +#: templates/analytics/dashboard.html:1923 +#: templates/analytics/dashboard.html:1997 +#: templates/complaints/public_complaint_form.html:98 +#: templates/complaints/public_inquiry_form.html:69 +#: templates/core/public_submit.html:510 +#: templates/observations/public_new.html:92 +msgid "Inpatient (IP)" +msgstr "المرضى الداخليون (IP)" + +#: templates/analytics/dashboard.html:710 +#: templates/analytics/dashboard.html:1856 +#: templates/analytics/dashboard.html:1933 +#: templates/analytics/dashboard.html:1998 +#: templates/complaints/public_complaint_form.html:97 +#: templates/complaints/public_inquiry_form.html:68 +#: templates/core/public_submit.html:509 +#: templates/observations/public_new.html:91 +msgid "Outpatient (OP)" +msgstr "المرضى الخارجيون (OP)" + +#: templates/analytics/dashboard.html:724 +msgid "Visit Volume by Type" +msgstr "حجم الزيارات حسب النوع" + +#: templates/analytics/dashboard.html:735 +msgid "Monthly Visit Trend" +msgstr "اتجاه الزيارات الشهرية" + +#: templates/analytics/dashboard.html:750 +msgid "Avg Time per Journey Stage" +msgstr "متوسط الوقت لكل مرحلة من رحلة المريض" + +#: templates/analytics/dashboard.html:768 +#: templates/reports/report_templates.html:160 +msgid "Department Performance" +msgstr "أداء الأقسام" + +#: templates/analytics/dashboard.html:769 msgid "Performance metrics by department" msgstr "مقاييس الأداء حسب القسم" -#: templates/analytics/dashboard.html:476 +#: templates/analytics/dashboard.html:779 msgid "Survey Avg" msgstr "متوسط الاستبيان" -#: templates/analytics/dashboard.html:477 -#: templates/complaints/analytics.html:312 -#: templates/dashboard/admin_evaluation.html:379 +#: templates/analytics/dashboard.html:780 +#: templates/complaints/analytics.html:336 +#: templates/dashboard/admin_evaluation.html:389 +#: templates/dashboard/complaint_monthly_report.html:86 +#: templates/dashboard/complaint_quarterly_report.html:91 +#: templates/dashboard/my_performance.html:154 +#: templates/dashboard/observation_report.html:75 +#: templates/organizations/department_detail.html:1017 msgid "Resolution Rate" msgstr "معدل الحل" -#: templates/analytics/dashboard.html:498 -#: templates/physicians/leaderboard.html:312 +#: templates/analytics/dashboard.html:801 +#: templates/physicians/leaderboard.html:343 msgid "Excellent" msgstr "ممتاز" -#: templates/analytics/dashboard.html:500 -#: templates/physicians/leaderboard.html:320 +#: templates/analytics/dashboard.html:803 +#: templates/physicians/leaderboard.html:351 msgid "Good" msgstr "جيد" -#: templates/analytics/dashboard.html:502 +#: templates/analytics/dashboard.html:805 msgid "Needs Work" msgstr "يحتاج إلى تحسين" -#: templates/analytics/dashboard.html:509 +#: templates/analytics/dashboard.html:812 msgid "No department data available" msgstr "لا توجد بيانات متاحة للقسم" -#: templates/analytics/dashboard.html:525 -#, fuzzy -#| msgid "Performance insights and recommendations" +#: templates/analytics/dashboard.html:827 +msgid "AI-Powered Insights" +msgstr "رؤى مدعومة بالذكاء الاصطناعي" + +#: templates/analytics/dashboard.html:828 msgid "Predictive analytics and intelligent recommendations" -msgstr "رؤى وتوصيات حول الأداء" +msgstr "تحليلات تنبؤية وتوصيات ذكية" -#: templates/analytics/dashboard.html:537 -#, fuzzy -#| msgid "Executive Summary" +#: templates/analytics/dashboard.html:840 +#: templates/emails/px_digest_weekly.html:16 msgid "AI Executive Summary" -msgstr "ملخص تنفيذي" +msgstr "ملخص تنفيذي للذكاء الاصطناعي" -#: templates/analytics/dashboard.html:538 +#: templates/analytics/dashboard.html:841 msgid "Auto-generated analysis of the past 30 days" msgstr "تحليل يتم إنشاؤه تلقائيًا لآخر 30 يومًا" -#: templates/analytics/dashboard.html:541 -#, fuzzy -#| msgid "High (hrs)" +#: templates/analytics/dashboard.html:844 msgid "High Risk" -msgstr "عالي (ساعات)" +msgstr "مخاطر عالية" -#: templates/analytics/dashboard.html:541 -#, fuzzy -#| msgid "Medium" +#: templates/analytics/dashboard.html:844 msgid "Medium Risk" -msgstr "متوسط" +msgstr "مخاطر متوسطة" -#: templates/analytics/dashboard.html:541 -#, fuzzy -#| msgid "Low Ratings" +#: templates/analytics/dashboard.html:844 msgid "Low Risk" -msgstr "تقييمات منخفضة" +msgstr "مخاطر منخفضة" -#: templates/analytics/dashboard.html:606 +#: templates/analytics/dashboard.html:852 +msgid "English Summary" +msgstr "الملخص الإنجليزي" + +#: templates/analytics/dashboard.html:869 +msgid "الملخص العربي" +msgstr "الملخص العربي" + +#: templates/analytics/dashboard.html:886 +#: templates/social/comment_detail.html:266 +msgid "Recommended Actions" +msgstr "الإجراءات الموصى بها" + +#: templates/analytics/dashboard.html:909 +msgid "Visit Efficiency Insights" +msgstr "رؤى كفاءة الزيارات" + +#: templates/analytics/dashboard.html:910 +msgid "AI-powered patient flow analysis and bottleneck detection" +msgstr "تحليل تدفق المرضى المدعوم بالذكاء الاصطناعي واكتشاف الاختناقات" + +#: templates/analytics/dashboard.html:914 +msgid "Efficiency" +msgstr "الكفاءة" + +#: templates/analytics/dashboard.html:928 +msgid "Operational Summary" +msgstr "الملخص التشغيلي" + +#: templates/analytics/dashboard.html:934 +msgid "الملخص التشغيلي" +msgstr "الملخص التشغيلي" + +#: templates/analytics/dashboard.html:945 +msgid "Top Bottlenecks Identified" +msgstr "أهم الاختناقات المحددة" + +#: templates/analytics/dashboard.html:962 +msgid "Efficiency Recommendations" +msgstr "توصيات الكفاءة" + +#: templates/analytics/dashboard.html:996 msgid "Early Warning System" msgstr "نظام الإنذار المبكر" -#: templates/analytics/dashboard.html:607 +#: templates/analytics/dashboard.html:997 msgid "Departments showing risk signals across multiple channels" msgstr "الأقسام التي تُظهر إشارات خطر عبر قنوات متعددة" -#: templates/analytics/dashboard.html:609 -#: templates/analytics/dashboard.html:719 +#: templates/analytics/dashboard.html:999 +#: templates/analytics/dashboard.html:1109 msgid "at risk" msgstr "في خطر" -#: templates/analytics/dashboard.html:616 -#, fuzzy -#| msgid "Score" +#: templates/analytics/dashboard.html:1006 msgid "Risk Score" -msgstr "النتيجة" +msgstr "درجة المخاطر" -#: templates/analytics/dashboard.html:617 -#, fuzzy -#| msgid "Risk Level:" +#: templates/analytics/dashboard.html:1007 +#: templates/analytics/kpi_report_weasyprint.html:457 msgid "Risk Level" -msgstr "مستوى المخاطر:" +msgstr "مستوى المخاطر" -#: templates/analytics/dashboard.html:618 -#, fuzzy -#| msgid "Active Status" +#: templates/analytics/dashboard.html:1008 msgid "Active Signals" -msgstr "الحالة النشطة" +msgstr "الإشارات النشطة" -#: templates/analytics/dashboard.html:667 -#, fuzzy -#| msgid "Expected Complaint Result" +#: templates/analytics/dashboard.html:1009 +msgid "Complaint Δ" +msgstr "الشكوى Δ" + +#: templates/analytics/dashboard.html:1010 +msgid "Survey Δ" +msgstr "المسح Δ" + +#: templates/analytics/dashboard.html:1011 +msgid "SLA Δ" +msgstr "SLA Δ" + +#: templates/analytics/dashboard.html:1057 msgid "Predicted Complaint Volume" -msgstr "النتيجة المتوقعة للشكوى" +msgstr "حجم الشكاوى المتوقع" -#: templates/analytics/dashboard.html:668 +#: templates/analytics/dashboard.html:1058 msgid "30-day forecast with confidence bands" msgstr "توقعات لـ 30 يومًا مع نطاقات ثقة" -#: templates/analytics/dashboard.html:672 +#: templates/analytics/dashboard.html:1062 msgid "Predicted" msgstr "متوقع" -#: templates/analytics/dashboard.html:682 -#, fuzzy -#| msgid "Avg Confidence" +#: templates/analytics/dashboard.html:1066 +msgid "vs Recent" +msgstr "مقارنة بالأخيرة" + +#: templates/analytics/dashboard.html:1072 msgid "High Confidence" -msgstr "متوسط الثقة" +msgstr "ثقة عالية" -#: templates/analytics/dashboard.html:682 -#, fuzzy -#| msgid "Min Confidence" +#: templates/analytics/dashboard.html:1072 msgid "Medium Confidence" -msgstr "الحد الأدنى للثقة" +msgstr "ثقة متوسطة" -#: templates/analytics/dashboard.html:682 -#, fuzzy -#| msgid "Confidence" +#: templates/analytics/dashboard.html:1072 msgid "Low Confidence" -msgstr "الثقة" +msgstr "ثقة منخفضة" -#: templates/analytics/dashboard.html:694 +#: templates/analytics/dashboard.html:1084 msgid "Day-of-Week Pattern Detected" msgstr "تم الكشف عن نمط يومي" -#: templates/analytics/dashboard.html:716 -#, fuzzy -#| msgid "SLA Best Practices" -msgid "SLA Breach Risk" -msgstr "أفضل ممارسات اتفاقية مستوى الخدمة" - -#: templates/analytics/dashboard.html:717 -#, fuzzy -#| msgid "An assigned complaint is approaching its SLA deadline." +#: templates/analytics/dashboard.html:1107 msgid "Complaints at risk of breaching SLA deadline" -msgstr "شكو مسند يقترب من موعد نهائي لاتفاقية مستوى الخدمة (SLA)." +msgstr "الشكاوى المعرضة لخطر تجاوز المهلة الزمنية لاتفاقية مستوى الخدمة" -#: templates/analytics/dashboard.html:730 +#: templates/analytics/dashboard.html:1116 +msgid "Breach Risk" +msgstr "خطر الانتهاك" + +#: templates/analytics/dashboard.html:1118 +msgid "Hours Left" +msgstr "الساعات المتبقية" + +#: templates/analytics/dashboard.html:1120 msgid "Risk Factors" msgstr "عوامل الخطر" -#: templates/analytics/dashboard.html:779 -#, fuzzy -#| msgid "Recommended action:" -msgid "AI-Recommended Actions" -msgstr "الإجراء الموصى به:" +#: templates/analytics/dashboard.html:1121 +#: templates/feedback/action_plan_list.html:120 +msgid "Recommendation" +msgstr "توصية" -#: templates/analytics/dashboard.html:780 +#: templates/analytics/dashboard.html:1142 +msgid "EXPIRED" +msgstr "منتهي الصلاحية" + +#: templates/analytics/dashboard.html:1169 +msgid "AI-Recommended Actions" +msgstr "الإجراءات الموصى بها بواسطة الذكاء الاصطناعي" + +#: templates/analytics/dashboard.html:1170 msgid "Systemic issues identified from complaint pattern analysis" msgstr "المشاكل النظامية التي تم تحديدها من تحليل نمط الشكوى" -#: templates/analytics/dashboard.html:783 +#: templates/analytics/dashboard.html:1173 msgid "AI Generated" msgstr "تم إنشاؤه بالذكاء الاصطناعي" -#: templates/analytics/dashboard.html:785 -#, fuzzy -#| msgid "Source-Based:" +#: templates/analytics/dashboard.html:1175 msgid "Rule-Based" -msgstr "بناءً على المصدر:" +msgstr "القائم على القواعد" + +#: templates/analytics/dashboard.html:1188 +#: templates/dashboard/partials/complaints_table.html:84 +#: templates/px_sources/source_list.html:239 +msgid "complaints" +msgstr "شكاوى" + +#: templates/analytics/dashboard.html:1859 +msgid "Visits" +msgstr "الزيارات" + +#: templates/analytics/dashboard.html:1878 +#: templates/complaints/patient_complaint_portal.html:82 +msgid "visits" +msgstr "زيارات" + +#: templates/analytics/dashboard.html:2031 +msgid "Average Minutes" +msgstr "متوسط الدقائق" #: templates/analytics/kpi_list.html:69 msgid "KPI List" @@ -9346,11 +12454,10 @@ msgstr "الوحدة" #: templates/analytics/kpi_list.html:79 #: templates/analytics/kpi_report_detail.html:124 -#: templates/analytics/kpi_report_detail.html:624 -#: templates/analytics/kpi_report_list.html:237 -#: templates/analytics/kpi_report_pdf.html:701 -#: templates/analytics/kpi_report_pdf.html:752 -#: templates/analytics/kpi_report_pdf.html:1161 +#: templates/analytics/kpi_report_detail.html:629 +#: templates/analytics/kpi_report_list.html:315 +#: templates/analytics/kpi_report_weasyprint.html:376 +#: templates/analytics/kpi_report_weasyprint.html:433 msgid "Target" msgstr "الهدف" @@ -9359,10 +12466,14 @@ msgid "Thresholds" msgstr "الحدود" #: templates/analytics/kpi_report_detail.html:6 -#: templates/analytics/kpi_report_pdf.html:9 msgid "KPI Report" msgstr "تقرير مؤشرات الأداء الرئيسية" +#: templates/analytics/kpi_report_detail.html:89 +#: templates/reports/saved_reports.html:125 +msgid "Export PDF" +msgstr "تصدير PDF" + #: templates/analytics/kpi_report_detail.html:92 msgid "Regenerate this report? Current data will be replaced." msgstr "هل تريد إعادة إنشاء هذا التقرير؟ سيتم استبدال البيانات الحالية." @@ -9371,12 +12482,6 @@ msgstr "هل تريد إعادة إنشاء هذا التقرير؟ سيتم ا msgid "Regenerating..." msgstr "جاري إعادة التوليد..." -#: templates/analytics/kpi_report_detail.html:96 -#: templates/analytics/kpi_report_detail.html:346 -#: templates/analytics/kpi_report_list.html:266 -msgid "Regenerate" -msgstr "إعادة توليد" - #: templates/analytics/kpi_report_detail.html:108 msgid "KPI ID" msgstr "معرّف مؤشر الأداء الرئيسي" @@ -9390,97 +12495,87 @@ msgid "Numerator / Denominator" msgstr "العدد الكلي / المقام" #: templates/analytics/kpi_report_detail.html:111 -#: templates/analytics/kpi_report_pdf.html:739 msgid "Jan" msgstr "يناير" #: templates/analytics/kpi_report_detail.html:112 -#: templates/analytics/kpi_report_pdf.html:740 msgid "Feb" msgstr "فبراير" #: templates/analytics/kpi_report_detail.html:113 -#: templates/analytics/kpi_report_pdf.html:741 msgid "Mar" msgstr "مارس" #: templates/analytics/kpi_report_detail.html:114 -#: templates/analytics/kpi_report_pdf.html:742 msgid "Apr" msgstr "أبريل" #: templates/analytics/kpi_report_detail.html:116 -#: templates/analytics/kpi_report_pdf.html:744 msgid "Jun" msgstr "يونيو" #: templates/analytics/kpi_report_detail.html:117 -#: templates/analytics/kpi_report_pdf.html:745 msgid "Jul" msgstr "يوليو" #: templates/analytics/kpi_report_detail.html:118 -#: templates/analytics/kpi_report_pdf.html:746 msgid "Aug" msgstr "أغسطس" #: templates/analytics/kpi_report_detail.html:119 -#: templates/analytics/kpi_report_pdf.html:747 msgid "Sep" msgstr "سبتمبر" #: templates/analytics/kpi_report_detail.html:120 -#: templates/analytics/kpi_report_pdf.html:748 msgid "Oct" msgstr "أكتوبر" #: templates/analytics/kpi_report_detail.html:121 -#: templates/analytics/kpi_report_pdf.html:749 msgid "Nov" msgstr "نوفمبر" #: templates/analytics/kpi_report_detail.html:122 -#: templates/analytics/kpi_report_pdf.html:750 msgid "Dec" msgstr "ديسمبر" #: templates/analytics/kpi_report_detail.html:123 -#: templates/analytics/kpi_report_pdf.html:751 +#: templates/analytics/kpi_report_weasyprint.html:405 msgid "TOTAL" msgstr "المجموع الكلي" #: templates/analytics/kpi_report_detail.html:125 -#: templates/analytics/kpi_report_detail.html:633 -#: templates/analytics/kpi_report_pdf.html:753 -#: templates/analytics/kpi_report_pdf.html:1170 +#: templates/analytics/kpi_report_detail.html:638 +#: templates/analytics/kpi_report_weasyprint.html:380 +#: templates/analytics/kpi_report_weasyprint.html:439 msgid "Threshold" msgstr "الحد" #: templates/analytics/kpi_report_detail.html:165 -#: templates/analytics/kpi_report_pdf.html:791 #, python-format msgid "Result (%%)" msgstr "النتيجة (%%)" #: templates/analytics/kpi_report_detail.html:186 -#: templates/analytics/kpi_report_pdf.html:672 -#: templates/analytics/kpi_report_pdf.html:814 #: templates/callcenter/complaint_success.html:94 -#: templates/callcenter/inquiry_success.html:115 +#: templates/callcenter/inquiry_success.html:89 #: templates/complaints/complaint_pdf.html:750 -#: templates/emails/new_observation_notification.html:34 -#: templates/emails/observation_sla_reminder.html:65 -#: templates/emails/observation_sla_second_reminder.html:69 -#: templates/emails/sla_reminder.html:79 -#: templates/emails/sla_second_reminder.html:82 +#: templates/emails/new_observation_notification.html:20 +#: templates/emails/observation_assigned.html:20 +#: templates/emails/observation_monthly_followup.html:20 +#: templates/emails/observation_resolved.html:20 +#: templates/emails/observation_sla_reminder.html:26 +#: templates/emails/observation_sla_second_reminder.html:20 +#: templates/emails/sla_reminder.html:26 +#: templates/emails/sla_second_reminder.html:26 msgid "Category:" msgstr "الفئة:" #: templates/analytics/kpi_report_detail.html:189 -#: templates/analytics/kpi_report_pdf.html:675 -#: templates/analytics/kpi_report_pdf.html:817 #: templates/appreciation/badge_list.html:112 -#: templates/emails/new_complaint_admin_notification.html:125 +#: templates/emails/new_appreciation_notification.html:44 +#: templates/emails/new_complaint_admin_notification.html:45 +#: templates/emails/new_inquiry_notification.html:45 +#: templates/emails/new_suggestion_notification.html:45 msgid "Type:" msgstr "النوع:" @@ -9497,7 +12592,6 @@ msgid "Method:" msgstr "الطريقة:" #: templates/analytics/kpi_report_detail.html:207 -#: templates/analytics/kpi_report_pdf.html:820 msgid "Dimension:" msgstr "البعد:" @@ -9506,17 +12600,14 @@ msgid "Gather freq.:" msgstr "تكرار التجميع:" #: templates/analytics/kpi_report_detail.html:213 -#: templates/analytics/kpi_report_pdf.html:829 msgid "Reporting:" msgstr "التقارير:" #: templates/analytics/kpi_report_detail.html:216 -#: templates/analytics/kpi_report_pdf.html:832 msgid "Collector:" msgstr "المُجمِّع:" #: templates/analytics/kpi_report_detail.html:219 -#: templates/analytics/kpi_report_pdf.html:835 msgid "Analyzer:" msgstr "المحلل:" @@ -9526,14 +12617,10 @@ msgid "Monthly Performance Trend (%%)" msgstr "اتجاه الأداء الشهري (%%)" #: templates/analytics/kpi_report_detail.html:230 -#: templates/analytics/kpi_report_pdf.html:721 -#: templates/analytics/kpi_report_pdf.html:854 msgid "Target:" msgstr "الهدف:" #: templates/analytics/kpi_report_detail.html:230 -#: templates/analytics/kpi_report_pdf.html:720 -#: templates/analytics/kpi_report_pdf.html:855 msgid "Threshold:" msgstr "الحد:" @@ -9542,6 +12629,7 @@ msgid "Complaints by Source" msgstr "الشكاوى حسب المصدر" #: templates/analytics/kpi_report_detail.html:249 +#: templates/analytics/kpi_report_weasyprint.html:504 msgid "Department Breakdown" msgstr "تفصيل الأقسام" @@ -9550,6 +12638,8 @@ msgid "Complaints:" msgstr "الشكاوى:" #: templates/analytics/kpi_report_detail.html:273 +#: templates/dashboard/my_performance.html:133 +#: templates/dashboard/my_performance.html:165 msgid "Resolved:" msgstr "المحلولة:" @@ -9562,15 +12652,17 @@ msgid "Top Areas:" msgstr "أعلى المناطق:" #: templates/analytics/kpi_report_detail.html:300 +#: templates/analytics/kpi_report_weasyprint.html:521 +#: templates/dashboard/complaint_quarterly_report.html:257 msgid "Location Breakdown" msgstr "تفصيل الموقع" #: templates/analytics/kpi_report_detail.html:328 +#: templates/analytics/kpi_report_weasyprint.html:536 msgid "AI-Generated Analysis" msgstr "تحليل مولّد بالذكاء الاصطناعي" #: templates/analytics/kpi_report_detail.html:331 -#: templates/analytics/kpi_report_pdf.html:660 msgid "Generated:" msgstr "تم إنشاء:" @@ -9578,50 +12670,39 @@ msgstr "تم إنشاء:" msgid "Edit Analysis" msgstr "تعديل التحليل" -#: templates/analytics/kpi_report_detail.html:346 -#: templates/surveys/analytics_reports.html:248 -msgid "Generate" -msgstr "إنشاء" - #: templates/analytics/kpi_report_detail.html:366 #: templates/analytics/kpi_report_detail.html:470 -#: templates/analytics/kpi_report_pdf.html:951 +#: templates/analytics/kpi_report_weasyprint.html:547 msgid "Performance Analysis" msgstr "تحليل الأداء" #: templates/analytics/kpi_report_detail.html:374 -#: templates/analytics/kpi_report_pdf.html:971 +#: templates/analytics/kpi_report_weasyprint.html:554 msgid "Key Findings" msgstr "النتائج الرئيسية" #: templates/analytics/kpi_report_detail.html:386 -#: templates/analytics/kpi_report_pdf.html:985 +#: templates/analytics/kpi_report_weasyprint.html:563 msgid "Reasons for Delays" msgstr "أسباب التأخير" #: templates/analytics/kpi_report_detail.html:398 -#: templates/analytics/kpi_report_pdf.html:999 msgid "Resolution Time Breakdown" msgstr "تفصيل وقت الحل" #: templates/analytics/kpi_report_detail.html:402 -#: templates/analytics/kpi_report_pdf.html:1003 msgid "Within 24h" msgstr "خلال 24 ساعة" #: templates/analytics/kpi_report_detail.html:409 -#: templates/analytics/kpi_report_pdf.html:1010 msgid "Within 48h" msgstr "خلال 48 ساعة" #: templates/analytics/kpi_report_detail.html:416 -#: templates/analytics/kpi_report_pdf.html:1017 msgid "Within 72h" msgstr "خلال 72 ساعة" #: templates/analytics/kpi_report_detail.html:423 -#: templates/analytics/kpi_report_pdf.html:1024 -#: templates/complaints/complaint_list.html:139 msgid "Over 72h" msgstr "أكثر من 72 ساعة" @@ -9647,7 +12728,6 @@ msgid "Recommendations (one per line)" msgstr "التوصيات (واحد لكل سطر)" #: templates/analytics/kpi_report_detail.html:516 -#: templates/analytics/kpi_report_pdf.html:1051 msgid "Review and Approval" msgstr "المراجعة والموافقة" @@ -9658,15 +12738,11 @@ msgstr "أعدّه:" #: templates/analytics/kpi_report_detail.html:524 #: templates/analytics/kpi_report_detail.html:531 #: templates/analytics/kpi_report_detail.html:538 -#: templates/analytics/kpi_report_pdf.html:1060 -#: templates/analytics/kpi_report_pdf.html:1070 -#: templates/analytics/kpi_report_pdf.html:1080 -#: templates/emails/appointment_confirmation.html:52 +#: templates/emails/appointment_confirmation.html:18 msgid "Date:" msgstr "التاريخ:" #: templates/analytics/kpi_report_detail.html:528 -#: templates/analytics/kpi_report_pdf.html:1056 msgid "Reviewed By:" msgstr "راجعه:" @@ -9675,15 +12751,12 @@ msgid "Approved By:" msgstr "أقرّه:" #: templates/analytics/kpi_report_detail.html:547 +#: templates/complaints/complaint_detail.html:798 #: templates/complaints/complaint_pdf.html:771 -#: templates/complaints/inquiry_detail.html:440 -#: templates/observations/observation_detail.html:250 -#: templates/observations/observation_detail.html:252 msgid "by" msgstr "بواسطة" #: templates/analytics/kpi_report_detail.html:589 -#: templates/analytics/kpi_report_pdf.html:1127 #, python-format msgid "Performance %%" msgstr "الأداء %%" @@ -9694,17 +12767,18 @@ msgid "Generate KPI Report" msgstr "إنشاء تقرير مؤشرات الأداء الرئيسية" #: templates/analytics/kpi_report_generate.html:11 -#: templates/analytics/kpi_report_list.html:4 -#: templates/analytics/kpi_report_list.html:61 -#: templates/layouts/partials/sidebar.html:440 +#: templates/analytics/kpi_report_list.html:5 +#: templates/analytics/kpi_report_list.html:104 +#: templates/layouts/partials/sidebar.html:589 msgid "KPI Reports" msgstr "تقارير مؤشرات الأداء الرئيسية" #: templates/analytics/kpi_report_generate.html:13 #: templates/analytics/kpi_report_generate.html:128 -#: templates/analytics/kpi_report_list.html:73 -#: templates/analytics/kpi_report_list.html:351 +#: templates/analytics/kpi_report_list.html:116 +#: templates/analytics/kpi_report_list.html:367 #: templates/complaints/complaint_threshold_form.html:457 +#: templates/complaints/partials/pdf_summary_panel.html:24 #: templates/reports/report_builder.html:115 #: templates/surveys/analytics_reports.html:24 #: templates/surveys/analytics_reports.html:172 @@ -9728,13 +12802,13 @@ msgid "Generating Report..." msgstr "جاري إنشاء التقرير..." #: templates/analytics/kpi_report_generate.html:43 +#: templates/complaints/partials/pdf_summary_panel.html:104 msgid "This may take a moment" msgstr "قد يستغرق هذا بعض الوقت" #: templates/analytics/kpi_report_generate.html:59 -#: templates/analytics/kpi_report_list.html:159 -msgid "Report Type" -msgstr "نوع التقرير" +msgid "KPI Name" +msgstr "اسم مؤشر الأداء الرئيسي" #: templates/analytics/kpi_report_generate.html:63 msgid "Select Report Type" @@ -9745,16 +12819,24 @@ msgid "Choose the type of KPI report to generate." msgstr "اختر نوع تقرير مؤشرات الأداء الرئيسية (KPI) الذي تريد إنشاؤه." #: templates/analytics/kpi_report_generate.html:80 -#: templates/analytics/kpi_report_list.html:171 -#: templates/appreciation/leaderboard.html:35 +#: templates/analytics/kpi_report_list.html:214 +#: templates/appreciation/leaderboard.html:102 +#: templates/dashboard/census_report.html:41 +#: templates/dashboard/census_report.html:120 +#: templates/dashboard/comments_report.html:34 +#: templates/dashboard/complaint_monthly_report.html:42 #: templates/dashboard/complaint_request_list.html:23 -#: templates/feedback/action_plan_list.html:31 -#: templates/feedback/comment_import_list.html:17 +#: templates/dashboard/inquiry_report.html:50 +#: templates/feedback/action_plan_list.html:91 +#: templates/feedback/comment_import_list.html:71 +#: templates/feedback/comment_list.html:113 #: templates/physicians/department_overview.html:39 -#: templates/physicians/leaderboard.html:115 +#: templates/physicians/leaderboard.html:116 #: templates/physicians/physician_ratings_dashboard.html:262 #: templates/physicians/ratings_list.html:138 #: templates/physicians/specialization_overview.html:39 +#: templates/presentations/presentation_generate.html:51 +#: templates/surveys/template_detail.html:83 msgid "Year" msgstr "السنة" @@ -9763,10 +12845,14 @@ msgid "Select Year" msgstr "اختر السنة" #: templates/analytics/kpi_report_generate.html:93 -#: templates/analytics/kpi_report_list.html:183 -#: templates/appreciation/leaderboard.html:43 +#: templates/analytics/kpi_report_list.html:226 +#: templates/analytics/kpi_report_weasyprint.html:401 +#: templates/appreciation/leaderboard.html:110 +#: templates/dashboard/complaint_monthly_report.html:53 #: templates/dashboard/complaint_request_list.html:32 -#: templates/feedback/comment_import_list.html:18 +#: templates/dashboard/inquiry_report.html:61 +#: templates/feedback/comment_import_list.html:72 +#: templates/feedback/comment_list.html:122 #: templates/physicians/department_overview.html:44 #: templates/physicians/leaderboard.html:122 #: templates/physicians/physician_detail.html:498 @@ -9786,8 +12872,8 @@ msgstr "معلومات إنشاء التقرير" #: templates/analytics/kpi_report_generate.html:114 msgid "" -"The report will be generated based on data from the selected month. This may" -" take a few moments depending on the amount of data. If a report already " +"The report will be generated based on data from the selected month. This may " +"take a few moments depending on the amount of data. If a report already " "exists for this period, it will be regenerated with the latest data." msgstr "" "سيتم إنشاء التقرير بناءً على البيانات من الشهر المحدد. قد يستغرق ذلك بضع " @@ -9810,291 +12896,255 @@ msgstr "تجربة المريض" msgid "Resolution Satisfaction" msgstr "رضا عن الحل" -#: templates/analytics/kpi_report_generate.html:183 +#: templates/analytics/kpi_report_generate.html:178 +msgid "MOH 24h Resolution" +msgstr "حل وزارة الصحة خلال 24 ساعة" + +#: templates/analytics/kpi_report_generate.html:187 msgid "Departmental" msgstr "departmental" -#: templates/analytics/kpi_report_generate.html:188 -#: templates/emails/survey_results_notification.html:51 +#: templates/analytics/kpi_report_generate.html:192 msgid "Response Rate" msgstr "معدل الاستجابة" -#: templates/analytics/kpi_report_generate.html:192 +#: templates/analytics/kpi_report_generate.html:196 msgid "Activation (2h)" msgstr "التنشيط (ساعتان)" -#: templates/analytics/kpi_report_generate.html:196 +#: templates/analytics/kpi_report_generate.html:200 msgid "Unactivated" msgstr "غير مفعل" -#: templates/analytics/kpi_report_generate.html:205 +#: templates/analytics/kpi_report_generate.html:209 msgid "N-PAD Standards" msgstr "معايير N-PAD" -#: templates/analytics/kpi_report_generate.html:210 -#: templates/complaints/complaint_detail.html:161 +#: templates/analytics/kpi_report_generate.html:214 +#: templates/complaints/complaint_detail.html:305 #: templates/complaints/complaint_pdf.html:739 #: templates/complaints/partials/resolution_panel.html:3 msgid "Resolution" msgstr "الحل" +#: templates/analytics/kpi_report_generate.html:223 +msgid "CHI Standards" +msgstr "معايير مجلس الضمان الصحي" + #: templates/analytics/kpi_report_generate.html:228 +msgid "CHI 48h Resolution" +msgstr "حل مجلس الضمان الصحي خلال 48 ساعة" + +#: templates/analytics/kpi_report_generate.html:246 msgid "Reports are generated automatically every month" msgstr "يتم إنشاء التقرير تلقائيًا كل شهر" -#: templates/analytics/kpi_report_generate.html:232 +#: templates/analytics/kpi_report_generate.html:250 msgid "You can regenerate any report with latest data" msgstr "يمكنك إعادة إنشاء أي تقرير بأحدث البيانات" -#: templates/analytics/kpi_report_generate.html:236 +#: templates/analytics/kpi_report_generate.html:254 msgid "PDF export is available for all reports" msgstr "تصدير PDF متاح لجميع التقارير" -#: templates/analytics/kpi_report_list.html:63 +#: templates/analytics/kpi_report_list.html:106 msgid "Monthly automated reports for MOH and internal KPIs" msgstr "" "تقارير شهرية آلية لمؤشرات الأداء الرئيسية للمؤسسة الصحية (MOH) والداخلية" -#: templates/analytics/kpi_report_list.html:68 +#: templates/analytics/kpi_report_list.html:111 msgid "Search KPI ID or indicator..." msgstr "البحث عن معرّف مؤشر الأداء الرئيسي أو المؤشر..." -#: templates/analytics/kpi_report_list.html:86 +#: templates/analytics/kpi_report_list.html:129 msgid "Total Reports" msgstr "إجمالي التقارير" -#: templates/analytics/kpi_report_list.html:135 +#: templates/analytics/kpi_report_list.html:178 #: templates/analytics/partials/kpi_generate_success.html:16 msgid "All Reports" msgstr "جميع التقارير" -#: templates/analytics/kpi_report_list.html:148 -#: templates/complaints/complaint_list.html:174 -#: templates/projects/project_list.html:157 templates/rca/rca_list.html:219 -msgid "Showing:" -msgstr "يُعرض:" +#: templates/analytics/kpi_report_list.html:191 +#: templates/complaints/inquiry_list.html:179 +#: templates/dashboard/complaint_quarterly_report.html:147 +#: templates/dashboard/complaint_quarterly_report.html:152 +#: templates/dashboard/complaint_quarterly_report.html:157 +#: templates/dashboard/complaint_quarterly_report.html:619 +#: templates/dashboard/complaint_quarterly_report.html:624 +#: templates/dashboard/complaint_quarterly_report.html:629 +#: templates/dashboard/employee_evaluation.html:1358 +#: templates/feedback/comment_list.html:145 +msgid "Total:" +msgstr "إجمالي:" -#: templates/analytics/kpi_report_list.html:173 +#: templates/analytics/kpi_report_list.html:216 #: templates/physicians/ratings_list.html:140 msgid "All Years" msgstr "جميع السنوات" -#: templates/analytics/kpi_report_list.html:185 +#: templates/analytics/kpi_report_list.html:228 #: templates/physicians/ratings_list.html:151 msgid "All Months" msgstr "جميع الأشهر" -#: templates/analytics/kpi_report_list.html:194 -#: templates/complaints/complaint_list.html:202 +#: templates/analytics/kpi_report_list.html:237 +#: templates/appreciation/leaderboard.html:129 +#: templates/complaints/complaint_list.html:224 #: templates/config/hospital_users.html:207 #: templates/dashboard/admin_evaluation.html:269 -#: templates/dashboard/employee_evaluation.html:669 -#: templates/organizations/staff_list.html:236 +#: templates/dashboard/census_report.html:49 +#: templates/dashboard/comments_report.html:49 +#: templates/dashboard/complaint_monthly_report.html:63 +#: templates/dashboard/complaint_quarterly_report.html:50 +#: templates/dashboard/employee_evaluation.html:723 +#: templates/dashboard/employee_evaluation_charts.html:202 +#: templates/dashboard/inquiry_report.html:74 +#: templates/dashboard/observation_report.html:52 +#: templates/dashboard/standards_dashboard.html:45 +#: templates/feedback/feedback_list.html:196 +#: templates/organizations/staff_hierarchy.html:206 +#: templates/organizations/staff_list.html:241 #: templates/physicians/physician_ratings_dashboard.html:293 #: templates/rca/rca_list.html:213 templates/surveys/instance_list.html:110 msgid "Apply" msgstr "تطبيق" -#: templates/analytics/kpi_report_list.html:241 +#: templates/analytics/kpi_report_list.html:253 +#: templates/analytics/kpi_report_list.html:276 +#: templates/surveys/enhanced_reports_list.html:145 +msgid "reports" +msgstr "تقارير" + +#: templates/analytics/kpi_report_list.html:270 +msgid "Jan - Mar" +msgstr "يناير - مارس" + +#: templates/analytics/kpi_report_list.html:271 +msgid "Apr - Jun" +msgstr "أبريل - يونيو" + +#: templates/analytics/kpi_report_list.html:272 +msgid "Jul - Sep" +msgstr "يوليو - سبتمبر" + +#: templates/analytics/kpi_report_list.html:273 +msgid "Oct - Dec" +msgstr "أكتوبر - ديسمبر" + +#: templates/analytics/kpi_report_list.html:319 msgid "Result" msgstr "النتيجة" -#: templates/analytics/kpi_report_list.html:247 -#: templates/complaints/complaint_detail.html:73 +#: templates/analytics/kpi_report_list.html:325 +#: templates/complaints/complaint_detail.html:77 msgid "Cases" msgstr "الحالات" -#: templates/analytics/kpi_report_list.html:264 +#: templates/analytics/kpi_report_list.html:342 msgid "Regenerate this report?" msgstr "هل تريد إعادة توليد هذا التقرير؟" -#: templates/analytics/kpi_report_list.html:264 +#: templates/analytics/kpi_report_list.html:342 msgid "..." msgstr "..." -#: templates/analytics/kpi_report_list.html:281 -#: templates/callcenter/call_records_list.html:298 -#: templates/complaints/complaint_list.html:317 -#: templates/config/hospital_users.html:224 -#: templates/config/hospital_users.html:313 -#: templates/dashboard/partials/actions_table.html:88 -#: templates/dashboard/partials/complaints_table.html:84 -#: templates/dashboard/partials/feedback_table.html:80 -#: templates/dashboard/partials/inquiries_table.html:82 -#: templates/dashboard/partials/observations_table.html:74 -#: templates/dashboard/partials/tasks_table.html:82 -#: templates/observations/observation_list.html:284 -#: templates/organizations/patient_list.html:370 -#: templates/organizations/staff_list.html:253 -#: templates/organizations/staff_list.html:379 -#: templates/physicians/doctor_rating_review.html:166 -#: templates/physicians/doctor_rating_review.html:267 -#: templates/physicians/individual_ratings_list.html:312 -#: templates/physicians/physician_list.html:285 -#: templates/physicians/ratings_list.html:312 -#: templates/projects/project_list.html:271 templates/rca/rca_list.html:304 -#: templates/surveys/comment_list.html:343 -#: templates/surveys/his_patient_review.html:149 -#: templates/surveys/instance_list.html:125 -#: templates/surveys/instance_list.html:225 -msgid "Showing" -msgstr "عرض" - -#: templates/analytics/kpi_report_list.html:281 -#: templates/complaints/complaint_list.html:317 -#: templates/config/hospital_users.html:313 -#: templates/organizations/staff_list.html:379 -#: templates/physicians/doctor_rating_review.html:267 -#: templates/physicians/individual_ratings_list.html:312 -#: templates/physicians/physician_list.html:285 -#: templates/physicians/ratings_list.html:312 -#: templates/projects/project_list.html:271 -#: templates/surveys/instance_list.html:225 -msgid "entries" -msgstr "إدخالات" - -#: templates/analytics/kpi_report_list.html:290 -#: templates/complaints/complaint_list.html:326 -#: templates/config/hospital_users.html:321 -#: templates/organizations/patient_list.html:378 -#: templates/organizations/staff_list.html:388 templates/rca/rca_list.html:312 -#: templates/surveys/instance_list.html:234 -msgid "Show" -msgstr "إظهار" - -#: templates/analytics/kpi_report_list.html:347 +#: templates/analytics/kpi_report_list.html:363 msgid "No KPI Reports Found" msgstr "لم يتم العثور على تقارير مؤشرات الأداء الرئيسية" -#: templates/analytics/kpi_report_list.html:348 +#: templates/analytics/kpi_report_list.html:364 msgid "Generate your first KPI report to get started." msgstr "قم بإنشاء أول تقرير لمؤشرات الأداء الرئيسية للبدء." -#: templates/analytics/kpi_report_pdf.html:636 -#: templates/dashboard/employee_evaluation.html:733 -#: templates/reports/report_builder.html:153 -msgid "Print" -msgstr "طباعة" - -#: templates/analytics/kpi_report_pdf.html:653 -#: templates/analytics/kpi_report_pdf.html:1090 -msgid "Key Performance Indicator Report" -msgstr "تقرير مؤشرات الأداء الرئيسية" - -#: templates/analytics/kpi_report_pdf.html:678 -msgid "Risk Level:" -msgstr "مستوى المخاطر:" - -#: templates/analytics/kpi_report_pdf.html:685 -msgid "On Target" -msgstr "في الهدف" - -#: templates/analytics/kpi_report_pdf.html:687 -msgid "Below Target" -msgstr "أقل من الهدف" - -#: templates/analytics/kpi_report_pdf.html:697 +#: templates/analytics/kpi_report_weasyprint.html:362 msgid "Overall Result" msgstr "النتيجة الشاملة" -#: templates/analytics/kpi_report_pdf.html:714 -msgid "Progress vs Target" +#: templates/analytics/kpi_report_weasyprint.html:388 +#, fuzzy +#| msgid "Progress vs Target" +msgid "Performance vs Target" msgstr "التقدم مقارنة بالهدف" -#: templates/analytics/kpi_report_pdf.html:731 +#: templates/analytics/kpi_report_weasyprint.html:397 msgid "Monthly Performance Data" msgstr "بيانات الأداء الشهرية" -#: templates/analytics/kpi_report_pdf.html:736 -msgid "KPI" -msgstr "مؤشر أداء رئيسي" +#: templates/analytics/kpi_report_weasyprint.html:423 +#, fuzzy, python-format +#| msgid "Result (%%)" +msgid "Result %%" +msgstr "النتيجة (%%)" -#: templates/analytics/kpi_report_pdf.html:737 -msgid "Indicator" -msgstr "مؤشر" +#: templates/analytics/kpi_report_weasyprint.html:453 +#, fuzzy +#| msgid "Type" +msgid "KPI Type" +msgstr "النوع" -#: templates/analytics/kpi_report_pdf.html:738 -msgid "Measure" -msgstr "مقياس" +#: templates/analytics/kpi_report_weasyprint.html:461 +#, fuzzy +#| msgid "Dimension:" +msgid "Dimension" +msgstr "البعد:" -#: templates/analytics/kpi_report_pdf.html:810 -msgid "Report Metadata" -msgstr "بيانات التعريف للتقرير" - -#: templates/analytics/kpi_report_pdf.html:823 -msgid "Collection:" +#: templates/analytics/kpi_report_weasyprint.html:465 +#, fuzzy +#| msgid "Collection:" +msgid "Data Collection" msgstr "التجميع:" -#: templates/analytics/kpi_report_pdf.html:826 -msgid "Frequency:" -msgstr "التكرار:" +#: templates/analytics/kpi_report_weasyprint.html:469 +#: templates/feedback/action_plan_list.html:121 +msgid "Frequency" +msgstr "التكرار" -#: templates/analytics/kpi_report_pdf.html:843 -msgid "Performance Analytics" -msgstr "تحليلات الأداء" +#: templates/analytics/kpi_report_weasyprint.html:474 +#, fuzzy +#| msgid "Collector:" +msgid "Collector" +msgstr "المُجمِّع:" -#: templates/analytics/kpi_report_pdf.html:851 -msgid "Monthly Performance Trend" -msgstr "اتجاه الأداء الشهري" +#: templates/analytics/kpi_report_weasyprint.html:480 +#, fuzzy +#| msgid "Analyzer:" +msgid "Analyzer" +msgstr "المحلل:" -#: templates/analytics/kpi_report_pdf.html:864 -msgid "Distribution by Source" -msgstr "التوزيع حسب المصدر" +#: templates/analytics/kpi_report_weasyprint.html:527 +#, fuzzy +#| msgid "Shared" +msgid "Share" +msgstr "مشترك" -#: templates/analytics/kpi_report_pdf.html:875 -msgid "Department Performance Breakdown" -msgstr "تفصيل أداء الأقسام" - -#: templates/analytics/kpi_report_pdf.html:889 -msgid "resolved" -msgstr "تم الحل" - -#: templates/analytics/kpi_report_pdf.html:894 -#: templates/callcenter/call_records_list.html:126 -msgid "Avg:" -msgstr "متوسط:" - -#: templates/analytics/kpi_report_pdf.html:908 -msgid "Location Distribution" -msgstr "توزيع المواقع" - -#: templates/analytics/kpi_report_pdf.html:931 -msgid "AI-Powered Performance Analysis" -msgstr "تحليل الأداء المدعوم بالذكاء الاصطناعي" - -#: templates/analytics/kpi_report_pdf.html:961 +#: templates/analytics/kpi_report_weasyprint.html:583 msgid "Comparison to Target" msgstr "المقارنة مع الهدف" -#: templates/analytics/kpi_report_pdf.html:1059 -#: templates/analytics/kpi_report_pdf.html:1069 -#: templates/analytics/kpi_report_pdf.html:1079 +#: templates/analytics/kpi_report_weasyprint.html:592 +#, fuzzy +#| msgid "Prepared By:" +msgid "Prepared By" +msgstr "أعدّه:" + +#: templates/analytics/kpi_report_weasyprint.html:594 +#: templates/analytics/kpi_report_weasyprint.html:599 +#: templates/analytics/kpi_report_weasyprint.html:604 msgid "Name & Signature" msgstr "الاسم والتوقيع" -#: templates/analytics/kpi_report_pdf.html:1066 -#: templates/analytics/kpi_report_pdf.html:1076 -msgid "Reviewed and Approved By:" -msgstr "تم المراجعة والموافقة من قبل:" +#: templates/analytics/kpi_report_weasyprint.html:597 +#, fuzzy +#| msgid "Reviewed By:" +msgid "Reviewed By" +msgstr "راجعه:" -#: templates/analytics/kpi_report_pdf.html:1093 -msgid "Generated by PX360 Patient Experience Management System" -msgstr "تم إنشاؤه بواسطة نظام إدارة تجربة المرضى PX360" - -#: templates/analytics/kpi_report_pdf.html:1097 -msgid "Confidential - For Internal Use Only" -msgstr "سري - للاستخدام الداخلي فقط" - -#: templates/analytics/kpi_report_pdf.html:1226 -#: templates/complaints/inquiry_detail.html:701 -#: templates/surveys/analytics_reports.html:285 -#: templates/surveys/generate_enhanced_report.html:98 -msgid "Generating..." -msgstr "جارٍ الإنشاء..." - -#: templates/analytics/kpi_report_pdf.html:1266 -msgid "Error generating PDF. Please try again." -msgstr "خطأ في إنشاء ملف PDF. يرجى المحاولة مرة أخرى." +#: templates/analytics/kpi_report_weasyprint.html:612 +#, fuzzy +#| msgid "Report" +msgid "Report ID" +msgstr "تقرير" #: templates/analytics/partials/kpi_generate_error.html:6 msgid "Error Generating Report" @@ -10110,280 +13160,242 @@ msgid "View Report" msgstr "عرض التقرير" #: templates/appreciation/appreciation_detail.html:4 -msgid "Appreciation Details" +#: templates/appreciation/appreciation_detail.html:74 +msgid "Appreciation Detail" msgstr "تفاصيل التقدير" -#: templates/appreciation/appreciation_detail.html:45 -#: templates/complaints/oncall/schedule_detail.html:122 -#: templates/dashboard/admin_evaluation.html:259 -#: templates/dashboard/employee_evaluation.html:659 -#: templates/px_sources/source_user_dashboard.html:255 -#: templates/px_sources/source_user_inquiry_list.html:172 -#: templates/rca/rca_list.html:206 -msgid "From" -msgstr "من" +#: templates/appreciation/appreciation_detail.html:55 +#: templates/feedback/feedback_delete_confirm.html:55 +msgid "Detail" +msgstr "التفاصيل" -#: templates/appreciation/appreciation_detail.html:49 -#: templates/observations/observation_detail.html:79 -#: templates/observations/observation_list.html:143 -#: templates/observations/observation_list.html:361 -msgid "Anonymous" -msgstr "مجهول" +#: templates/appreciation/appreciation_detail.html:67 +#: templates/complaints/complaint_detail.html:103 +#: templates/complaints/inquiry_detail.html:106 +#: templates/observations/observation_detail.html:60 +msgid "Not Sent to Dept" +msgstr "لم يتم الإرسال إلى القسم" -#: templates/appreciation/appreciation_detail.html:59 -#: templates/dashboard/admin_evaluation.html:264 -#: templates/dashboard/employee_evaluation.html:664 -#: templates/rca/rca_list.html:210 -msgid "To" -msgstr "إلى" +#: templates/appreciation/appreciation_detail.html:85 +#: templates/appreciation/appreciation_detail.html:223 +#: templates/complaints/complaint_detail.html:299 +#: templates/complaints/complaint_pdf.html:662 +#: templates/complaints/inquiry_detail.html:151 +#: templates/complaints/partials/ai_panel.html:6 +#: templates/complaints/partials/ai_panel.html:198 +#: templates/feedback/feedback_detail.html:63 +#: templates/feedback/feedback_detail.html:221 +#: templates/observations/observation_detail.html:103 +#: templates/observations/partials/ai_panel.html:5 +#: templates/social/comment_detail.html:119 +#: templates/social/partials/ai_analysis_bilingual.html:8 +#: templates/social/social_comment_detail.html:111 +#: templates/surveys/instance_detail.html:252 +msgid "AI Analysis" +msgstr "تحليل الذكاء الاصطناعي" -#: templates/appreciation/appreciation_detail.html:70 +#: templates/appreciation/appreciation_detail.html:100 +msgid "Appreciation Message" +msgstr "رسالة تقدير" + +#: templates/appreciation/appreciation_detail.html:115 +#: templates/emails/new_suggestion_notification.html:20 +msgid "Submitted By" +msgstr "مقدم من" + +#: templates/appreciation/appreciation_detail.html:138 +msgid "Staff Mentioned" +msgstr "الموظف المذكور" + +#: templates/appreciation/appreciation_detail.html:174 msgid "Sent At" msgstr "تاريخ الإرسال" -#: templates/appreciation/appreciation_detail.html:77 -#: templates/appreciation/appreciation_send_form.html:197 -msgid "Visibility" -msgstr "الظهور" +#: templates/appreciation/appreciation_detail.html:178 +msgid "To Manager" +msgstr "إلى المدير" -#: templates/appreciation/appreciation_detail.html:88 +#: templates/appreciation/appreciation_detail.html:184 +msgid "To Department" +msgstr "إلى القسم" + +#: templates/appreciation/appreciation_detail.html:192 +#: templates/surveys/manual_send.html:182 +#: templates/surveys/manual_send_csv.html:146 +#: templates/surveys/manual_send_phone.html:126 +msgid "Custom Message" +msgstr "رسالة مخصصة" + +#: templates/appreciation/appreciation_detail.html:198 +msgid "CC" +msgstr "نسخة كربونية (CC)" + +#: templates/appreciation/appreciation_detail.html:210 msgid "Acknowledged on" msgstr "تم الإقرار في" -#: templates/appreciation/appreciation_detail.html:117 -msgid "Related Appreciations" -msgstr "التقديرات ذات الصلة" +#: templates/appreciation/appreciation_detail.html:228 +msgid "Summary (EN)" +msgstr "الملخص (EN)" -#: templates/appreciation/appreciation_detail.html:145 -msgid "Quick Info" -msgstr "معلومات سريعة" +#: templates/appreciation/appreciation_detail.html:234 +msgid "Summary (AR)" +msgstr "الملخص (AR)" -#: templates/appreciation/appreciation_detail.html:151 -#: templates/appreciation/appreciation_send_form.html:292 -#: templates/callcenter/complaint_success.html:89 -#: templates/callcenter/inquiry_success.html:103 -#: templates/journeys/instance_detail.html:170 -#: templates/journeys/stage_surveys_form.html:180 -#: templates/journeys/template_confirm_delete.html:36 -#: templates/journeys/template_detail.html:67 -#: templates/projects/project_delete_confirm.html:24 -#: templates/projects/template_delete_confirm.html:25 -#: templates/surveys/bulk_job_status.html:73 -msgid "Hospital:" -msgstr "المستشفى:" +#: templates/appreciation/appreciation_detail.html:240 +msgid "Themes" +msgstr "المواضيع" -#: templates/appreciation/appreciation_detail.html:161 -#: templates/complaints/explanation_form.html:130 -msgid "ID:" -msgstr "المعرف:" +#: templates/appreciation/appreciation_detail.html:250 +msgid "Tone" +msgstr "النبرة" -#: templates/appreciation/appreciation_detail.html:176 -#: templates/appreciation/appreciation_list.html:62 -#: templates/appreciation/appreciation_list.html:152 -#: templates/appreciation/appreciation_send_form.html:4 -#: templates/appreciation/appreciation_send_form.html:95 -#: templates/appreciation/appreciation_send_form.html:103 -#: templates/appreciation/appreciation_send_form.html:233 -#: templates/appreciation/leaderboard.html:25 -#: templates/appreciation/leaderboard.html:196 -#: templates/appreciation/my_badges.html:25 -msgid "Send Appreciation" -msgstr "إرسال تقدير" +#: templates/appreciation/appreciation_detail.html:257 +msgid "Suggested Response" +msgstr "الرد المقترح" -#: templates/appreciation/appreciation_detail.html:180 -#: templates/dashboard/command_center.html:648 -#: templates/physicians/physician_ratings_dashboard.html:373 -msgid "View Leaderboard" -msgstr "عرض قائمة التصنيفات" +#: templates/appreciation/appreciation_detail.html:274 +msgid "Activate Appreciation" +msgstr "تفعيل التقدير" -#: templates/appreciation/appreciation_detail.html:184 -#: templates/appreciation/appreciation_list.html:139 -#: templates/appreciation/leaderboard.html:211 +#: templates/appreciation/appreciation_detail.html:278 +msgid "" +"Select the staff member and department, then activate to trigger AI analysis." +msgstr "اختر الموظف والقسم، ثم قم بالتفعيل لبدء التحليل بالذكاء الاصطناعي." + +#: templates/appreciation/appreciation_detail.html:282 +#: templates/complaints/involved_staff_form.html:122 +#: templates/complaints/partials/staff_panel.html:18 +msgid "Staff Member" +msgstr "الموظف" + +#: templates/appreciation/appreciation_detail.html:285 +msgid "Select staff..." +msgstr "اختيار موظف..." + +#: templates/appreciation/appreciation_detail.html:294 +msgid "Auto from staff" +msgstr "تلقائي من الموظف" + +#: templates/appreciation/appreciation_detail.html:303 +#: templates/callcenter/complaint_form.html:184 +#: templates/callcenter/inquiry_form.html:177 +msgid "Select category..." +msgstr "اختر الفئة..." + +#: templates/appreciation/appreciation_detail.html:311 +msgid "Activate & Analyze" +msgstr "تفعيل وتحليل" + +#: templates/appreciation/appreciation_detail.html:320 +#: templates/appreciation/appreciation_detail.html:325 +#: templates/complaints/complaint_detail.html:237 +#: templates/complaints/complaint_detail.html:616 +#: templates/complaints/complaint_detail.html:1118 +#: templates/complaints/inquiry_detail.html:521 +#: templates/complaints/partials/explanation_panel.html:92 +#: templates/complaints/partials/explanation_panel.html:355 +#: templates/feedback/feedback_detail.html:334 +msgid "Send to Department" +msgstr "إرسال إلى القسم" + +#: templates/appreciation/appreciation_detail.html:322 +msgid "" +"Route this appreciation to a department or a specific person for " +"acknowledgment." +msgstr "" + +#: templates/appreciation/appreciation_list.html:59 +msgid "Manage and review patient appreciation submissions" +msgstr "إدارة ومراجعة طلبات تقدير المرضى" + +#: templates/appreciation/appreciation_list.html:63 +msgid "New Appreciation" +msgstr "تقدير جديد" + +#: templates/appreciation/appreciation_list.html:130 +#: templates/appreciation/leaderboard.html:69 +#: templates/layouts/partials/sidebar.html:273 +#: templates/physicians/physician_list.html:92 +msgid "Leaderboard" +msgstr "قائمة التصنيفات" + +#: templates/appreciation/appreciation_list.html:131 +msgid "See top performers" +msgstr "عرض الأفضل أداءً" + +#: templates/appreciation/appreciation_list.html:143 #: templates/appreciation/my_badges.html:4 #: templates/appreciation/my_badges.html:12 #: templates/appreciation/my_badges.html:20 msgid "My Badges" msgstr "شاراتي" -#: templates/appreciation/appreciation_list.html:59 -msgid "Send appreciation to colleagues and celebrate achievements" -msgstr "أرسل تقديرًا لزملائك واحتفل بالإنجازات" - -#: templates/appreciation/appreciation_list.html:97 -#: templates/appreciation/my_badges.html:46 -msgid "Badges Earned" -msgstr "الشارات المكتسبة" - -#: templates/appreciation/appreciation_list.html:108 -#: templates/appreciation/appreciation_list.html:126 -#: templates/appreciation/leaderboard.html:12 -#: templates/layouts/partials/sidebar.html:358 -#: templates/physicians/physician_list.html:92 -msgid "Leaderboard" -msgstr "قائمة التصنيفات" - -#: templates/appreciation/appreciation_list.html:127 -msgid "See top performers" -msgstr "عرض الأفضل أداءً" - -#: templates/appreciation/appreciation_list.html:140 +#: templates/appreciation/appreciation_list.html:144 msgid "View earned badges" msgstr "عرض الشارات المكتسبة" -#: templates/appreciation/appreciation_list.html:153 -msgid "Share appreciation" -msgstr "شارك التقدير" - -#: templates/appreciation/appreciation_list.html:175 -msgid "My Appreciations" -msgstr "تقديراتي" - -#: templates/appreciation/appreciation_list.html:178 -msgid "Sent by Me" -msgstr "مرسلة من قبلي" - -#: templates/appreciation/appreciation_list.html:210 +#: templates/appreciation/appreciation_list.html:163 msgid "Search messages..." msgstr "البحث في الرسائل..." -#: templates/appreciation/appreciation_list.html:220 -#: templates/references/search.html:338 templates/standards/search.html:220 -#: templates/surveys/comment_list.html:238 -#: templates/surveys/comment_list.html:389 -msgid "Clear Filters" -msgstr "مسح الفلاتر" +#: templates/appreciation/appreciation_list.html:171 +msgid "AI Analyzed" +msgstr "تم التحليل بالذكاء الاصطناعي" -#: templates/appreciation/appreciation_list.html:232 -msgid "Appreciations" -msgstr "الإشادات" +#: templates/appreciation/appreciation_list.html:255 +msgid "No appreciations found" +msgstr "لم يتم العثور على أي تقديرات" -#: templates/appreciation/appreciation_list.html:330 -msgid "No appreciations received yet" -msgstr "لا توجد تقديرات مستلمة بعد" +#: templates/appreciation/appreciation_list.html:267 +#: templates/appreciation/leaderboard.html:210 +#: templates/callcenter/call_records_list.html:298 +#: templates/complaints/government_ticket_list.html:216 +#: templates/config/hospital_users.html:228 +#: templates/config/hospital_users.html:335 +#: templates/dashboard/partials/actions_table.html:88 +#: templates/dashboard/partials/complaints_table.html:84 +#: templates/dashboard/partials/feedback_table.html:80 +#: templates/dashboard/partials/inquiries_table.html:82 +#: templates/dashboard/partials/observations_table.html:74 +#: templates/dashboard/partials/tasks_table.html:82 +#: templates/feedback/comment_list.html:202 +#: templates/feedback/feedback_list.html:302 +#: templates/observations/observation_list.html:286 +#: templates/organizations/patient_list.html:382 +#: templates/organizations/staff_hierarchy.html:223 +#: templates/organizations/staff_hierarchy.html:339 +#: templates/organizations/staff_list.html:258 +#: templates/organizations/staff_list.html:384 +#: templates/partials/pagination.html:6 +#: templates/physicians/doctor_rating_review.html:166 +#: templates/physicians/doctor_rating_review.html:267 +#: templates/physicians/individual_ratings_list.html:312 +#: templates/physicians/physician_list.html:285 +#: templates/physicians/ratings_list.html:312 +#: templates/projects/project_list.html:271 templates/rca/rca_list.html:304 +#: templates/surveys/comment_list.html:370 +#: templates/surveys/his_patient_review.html:149 +#: templates/surveys/instance_list.html:125 +#: templates/surveys/instance_list.html:225 +msgid "Showing" +msgstr "عرض" -#: templates/appreciation/appreciation_list.html:332 -msgid "No appreciations sent yet" -msgstr "لا توجد تقديرات مرسلة بعد" - -#: templates/appreciation/appreciation_list.html:335 -msgid "Start sharing appreciation with your colleagues!" -msgstr "ابدأ بمشاركة التقدير مع زملائك!" - -#: templates/appreciation/appreciation_list.html:337 -msgid "Send Your First Appreciation" -msgstr "أرسل أول تقدير لك" - -#: templates/appreciation/appreciation_send_form.html:111 -#: templates/notifications/send_sms_direct.html:108 -#: templates/organizations/staff_detail.html:451 -#: templates/organizations/staff_list.html:541 -#: templates/surveys/manual_send.html:367 -#: templates/surveys/manual_send_phone.html:186 -msgid "Sending..." -msgstr "جاري الإرسال..." - -#: templates/appreciation/appreciation_send_form.html:138 -msgid "Select Recipient" -msgstr "اختر المستلم" - -#: templates/appreciation/appreciation_send_form.html:140 -msgid "Select a hospital first" -msgstr "يرجى اختيار المستشفى أولًا" - -#: templates/appreciation/appreciation_send_form.html:149 -msgid "Optional: Select if related to a specific department" -msgstr "اختياري: اختر إذا كان مرتبطًا بقسم معين" - -#: templates/appreciation/appreciation_send_form.html:156 -#: templates/complaints/public_inquiry_form.html:67 -#: templates/core/public_submit.html:467 templates/core/public_submit.html:672 -#: templates/core/public_submit.html:893 -msgid "Select Category" -msgstr "اختر الفئة" - -#: templates/appreciation/appreciation_send_form.html:168 -msgid "Message (English)" -msgstr "الرسالة (بالإنجليزية)" - -#: templates/appreciation/appreciation_send_form.html:176 -msgid "Write your appreciation message here..." -msgstr "اكتب رسالة التقدير هنا..." - -#: templates/appreciation/appreciation_send_form.html:178 -msgid "Required: Appreciation message in English" -msgstr "مطلوب: رسالة التقدير باللغة الإنجليزية" - -#: templates/appreciation/appreciation_send_form.html:183 -msgid "Message (Arabic)" -msgstr "الرسالة (بالعربية)" - -#: templates/appreciation/appreciation_send_form.html:190 -msgid "اكتب رسالة التقدير هنا..." -msgstr "اكتب رسالة التقدير هنا..." - -#: templates/appreciation/appreciation_send_form.html:192 -msgid "Optional: Appreciation message in Arabic" -msgstr "اختياري: رسالة التقدير باللغة العربية" - -#: templates/appreciation/appreciation_send_form.html:218 -msgid "Send anonymously" -msgstr "إرسال بشكل مجهول" - -#: templates/appreciation/appreciation_send_form.html:220 -msgid "Your name will not be shown to the recipient" -msgstr "لن يتم عرض اسمك للمستلم" - -#: templates/appreciation/appreciation_send_form.html:246 -msgid "Tips for Writing Appreciation" -msgstr "نصائح لكتابة التقدير" - -#: templates/appreciation/appreciation_send_form.html:251 -msgid "Be specific about what you appreciate" -msgstr "كن محددًا بشأن ما تقدّره" - -#: templates/appreciation/appreciation_send_form.html:255 -msgid "Use the person's name when addressing them" -msgstr "استخدم اسم الشخص عند مخاطبته" - -#: templates/appreciation/appreciation_send_form.html:259 -msgid "Mention the impact of their actions" -msgstr "اذكر تأثير أفعالهم" - -#: templates/appreciation/appreciation_send_form.html:263 -msgid "Be sincere and authentic" -msgstr "كن صادقًا وأصيلًا" - -#: templates/appreciation/appreciation_send_form.html:267 -msgid "Keep it positive and uplifting" -msgstr "اجعلها إيجابية وملهمة" - -#: templates/appreciation/appreciation_send_form.html:276 -msgid "Visibility Levels" -msgstr "مستويات الظهور" - -#: templates/appreciation/appreciation_send_form.html:280 -msgid "Private:" -msgstr "خاص:" - -#: templates/appreciation/appreciation_send_form.html:282 -msgid "Only you and the recipient can see this appreciation" -msgstr "فقط أنت والمستلم يمكنكما رؤية هذا التقدير" - -#: templates/appreciation/appreciation_send_form.html:288 -msgid "Visible to everyone in the selected department" -msgstr "مرئي للجميع في القسم المحدد" - -#: templates/appreciation/appreciation_send_form.html:294 -msgid "Visible to everyone in the selected hospital" -msgstr "مرئي للجميع في المستشفى المحدد" - -#: templates/appreciation/appreciation_send_form.html:298 -msgid "Public:" -msgstr "عام:" - -#: templates/appreciation/appreciation_send_form.html:300 -msgid "Visible to all PX360 users" -msgstr "مرئي لجميع مستخدمي PX360" +#: templates/appreciation/appreciation_list.html:267 +#: templates/appreciation/leaderboard.html:210 +#: templates/config/hospital_users.html:335 +#: templates/feedback/comment_list.html:202 +#: templates/feedback/feedback_list.html:302 +#: templates/organizations/staff_hierarchy.html:339 +#: templates/organizations/staff_list.html:384 +#: templates/physicians/doctor_rating_review.html:267 +#: templates/physicians/individual_ratings_list.html:312 +#: templates/physicians/physician_list.html:285 +#: templates/physicians/ratings_list.html:312 +#: templates/projects/project_list.html:271 +#: templates/surveys/instance_list.html:225 +msgid "entries" +msgstr "إدخالات" #: templates/appreciation/badge_form.html:4 #: templates/appreciation/badge_form.html:105 @@ -10404,6 +13416,10 @@ msgstr "الشارات" #: templates/appreciation/badge_form.html:97 #: templates/appreciation/category_form.html:97 +#: templates/complaints/partials/departments_panel.html:8 +#: templates/complaints/partials/staff_panel.html:8 +#: templates/surveys/template_form.html:473 +#: templates/surveys/template_form.html:621 msgid "Add" msgstr "إضافة" @@ -10415,67 +13431,92 @@ msgstr "كلاس أيقونة FontAwesome (مثل: fa-trophy، fa-star، fa-meda msgid "Criteria Type" msgstr "نوع المعايير" -#: templates/appreciation/badge_form.html:200 +#: templates/appreciation/badge_form.html:190 +#: templates/appreciation/category_list.html:122 +#: templates/complaints/complaint_threshold_form.html:433 +#: templates/dashboard/comments_report.html:93 +#: templates/dashboard/complaint_quarterly_report.html:593 +#: templates/dashboard/employee_evaluation.html:965 +#: templates/dashboard/employee_evaluation.html:1070 +#: templates/dashboard/employee_evaluation.html:1115 +#: templates/dashboard/employee_evaluation.html:1330 +#: templates/dashboard/staff_performance_detail.html:306 +#: templates/organizations/department_detail.html:1872 +#: templates/organizations/department_detail.html:1922 +msgid "Count" +msgstr "العدد" + +#: templates/appreciation/badge_form.html:191 +msgid "Streak" +msgstr "السلسلة" + +#: templates/appreciation/badge_form.html:192 +msgid "Special" +msgstr "خاص" + +#: templates/appreciation/badge_form.html:198 msgid "Criteria Value" msgstr "قيمة المعايير" -#: templates/appreciation/badge_form.html:211 +#: templates/appreciation/badge_form.html:209 msgid "Number of appreciations required to earn this badge" msgstr "عدد التقديرات المطلوبة للحصول على هذه الشارة" -#: templates/appreciation/badge_form.html:239 +#: templates/appreciation/badge_form.html:237 #: templates/appreciation/category_form.html:222 #: templates/complaints/partials/adverse_actions_panel.html:130 -#: templates/observations/observation_detail.html:375 +#: templates/feedback/feedback_detail.html:307 +#: templates/observations/observation_detail.html:700 +#: templates/organizations/manager_review_question_form.html:79 #: templates/rca/rca_detail.html:211 #: templates/references/document_form.html:363 #: templates/references/folder_form.html:296 msgid "Update" msgstr "تحديث" -#: templates/appreciation/badge_form.html:250 +#: templates/appreciation/badge_form.html:248 msgid "Badge Preview" msgstr "معاينة الشارة" -#: templates/appreciation/badge_form.html:256 +#: templates/appreciation/badge_form.html:254 #: templates/appreciation/my_badges.html:185 msgid "Requires" msgstr "يتطلب" -#: templates/appreciation/badge_form.html:258 +#: templates/appreciation/badge_form.html:256 #: templates/appreciation/my_badges.html:185 msgid "appreciations" msgstr "تقديرات" -#: templates/appreciation/badge_form.html:266 +#: templates/appreciation/badge_form.html:264 msgid "About Badge Criteria" msgstr "حول معايير الشارة" -#: templates/appreciation/badge_form.html:270 +#: templates/appreciation/badge_form.html:268 msgid "Count:" msgstr "العدد:" -#: templates/appreciation/badge_form.html:272 +#: templates/appreciation/badge_form.html:270 msgid "Badge is earned after receiving the specified number of appreciations" msgstr "يتم الحصول على الشارة بعد استلام عدد معين من التقديرات" -#: templates/appreciation/badge_form.html:276 +#: templates/appreciation/badge_form.html:274 msgid "Tips:" msgstr "نصائح:" -#: templates/appreciation/badge_form.html:278 +#: templates/appreciation/badge_form.html:276 msgid "Set achievable criteria to encourage participation" msgstr "حدد معايير قابلة للتحقيق لتشجيع المشاركة" -#: templates/appreciation/badge_form.html:279 +#: templates/appreciation/badge_form.html:277 msgid "Use descriptive names and icons" msgstr "استخدم أسماء وأيقونات وصفية" -#: templates/appreciation/badge_form.html:280 +#: templates/appreciation/badge_form.html:278 msgid "Create badges for different achievement levels" msgstr "أنشئ شارات لمستويات إنجاز مختلفة" -#: templates/appreciation/badge_form.html:281 +#: templates/appreciation/badge_form.html:279 msgid "Deactivate badges instead of deleting to preserve history" msgstr "قم بإلغاء تفعيل الشارات بدلاً من حذفها للحفاظ على السجل" @@ -10505,16 +13546,18 @@ msgid "times" msgstr "مرات" #: templates/appreciation/badge_list.html:124 -#: templates/callcenter/inquiry_success.html:124 -#: templates/complaints/complaint_detail.html:506 +#: templates/callcenter/inquiry_success.html:98 #: templates/complaints/complaint_pdf.html:481 #: templates/complaints/complaint_pdf.html:727 -#: templates/complaints/explanation_already_submitted.html:96 -#: templates/emails/new_observation_notification.html:40 -#: templates/emails/observation_sla_reminder.html:83 -#: templates/emails/observation_sla_second_reminder.html:87 -#: templates/emails/sla_reminder.html:131 -#: templates/emails/sla_second_reminder.html:134 +#: templates/complaints/emails/new_complaint_admin_en.html:20 +#: templates/complaints/explanation_already_submitted.html:91 +#: templates/emails/new_observation_notification.html:21 +#: templates/emails/observation_monthly_followup.html:21 +#: templates/emails/observation_resolved.html:21 +#: templates/emails/observation_sla_reminder.html:28 +#: templates/emails/observation_sla_second_reminder.html:22 +#: templates/emails/sla_reminder.html:31 +#: templates/emails/sla_second_reminder.html:31 #: templates/journeys/template_detail.html:71 #: templates/projects/project_delete_confirm.html:25 msgid "Status:" @@ -10532,6 +13575,32 @@ msgstr "أنشئ شارات لتحفيز وتقدير الإنجازات" msgid "FontAwesome icon class (e.g., fa-heart, fa-star, fa-thumbs-up)" msgstr "كلاس أيقونة FontAwesome (مثل: fa-heart، fa-star، fa-thumbs-up)" +#: templates/appreciation/category_form.html:191 +#: templates/simulator/log_list.html:124 templates/simulator/log_list.html:228 +#: templates/surveys/bulk_job_list.html:87 +#: templates/surveys/bulk_job_status.html:55 +msgid "Success" +msgstr "ناجح" + +#: templates/appreciation/category_form.html:192 +#: templates/projects/project_confirm_delete.html:39 +#: templates/projects/template_confirm_delete.html:39 +#: templates/px_sources/source_confirm_delete.html:50 +#: templates/standards/activity_type_confirm_delete.html:85 +#: templates/standards/attachment_confirm_delete.html:63 +#: templates/standards/category_confirm_delete.html:85 +#: templates/standards/source_confirm_delete.html:85 +msgid "Warning" +msgstr "تحذير" + +#: templates/appreciation/category_form.html:193 +msgid "Danger" +msgstr "خطر" + +#: templates/appreciation/category_form.html:194 +msgid "Info" +msgstr "معلومات" + #: templates/appreciation/category_form.html:233 msgid "Icon Preview" msgstr "معاينة الأيقونة" @@ -10561,16 +13630,6 @@ msgstr "فئات التقدير" msgid "Manage categories to organize appreciations" msgstr "إدارة الفئات لتنظيم التقديرات" -#: templates/appreciation/category_list.html:122 -#: templates/complaints/complaint_threshold_form.html:433 -#: templates/dashboard/employee_evaluation.html:884 -#: templates/dashboard/employee_evaluation.html:989 -#: templates/dashboard/employee_evaluation.html:1034 -#: templates/dashboard/employee_evaluation.html:1249 -#: templates/dashboard/staff_performance_detail.html:306 -msgid "Count" -msgstr "العدد" - #: templates/appreciation/category_list.html:170 #: templates/observations/category_list.html:151 #: templates/standards/category_list.html:191 @@ -10582,54 +13641,104 @@ msgid "Create categories to organize appreciations" msgstr "أنشئ فئات لتنظيم التقديرات" #: templates/appreciation/leaderboard.html:4 -#: templates/appreciation/leaderboard.html:20 +#: templates/appreciation/leaderboard.html:79 msgid "Appreciation Leaderboard" msgstr "لوحة شرف التقدير" -#: templates/appreciation/leaderboard.html:89 +# Additional common translations +#: templates/appreciation/leaderboard.html:57 +#: templates/complaints/patient_complaint_portal.html:31 +#: templates/complaints/public_complaint_success.html:166 +#: templates/layouts/partials/breadcrumbs.html:8 +msgid "Home" +msgstr "الرئيسية" + +#: templates/appreciation/leaderboard.html:81 +msgid "Top performers by appreciation received and sent" +msgstr "أفضل الأداء حسب التقديرات المستلمة والمرسلة" + +#: templates/appreciation/leaderboard.html:120 +#: templates/complaints/government_ticket_list.html:103 +#: templates/dashboard/admin_evaluation.html:278 +#: templates/dashboard/employee_evaluation.html:732 +#: templates/journeys/instance_list.html:194 +#: templates/observations/observation_list.html:220 +#: templates/organizations/orgsection_list.html:82 +#: templates/organizations/section_list.html:82 +#: templates/organizations/staff_hierarchy.html:195 +#: templates/physicians/leaderboard.html:136 +#: templates/physicians/physician_list.html:148 +#: templates/physicians/physician_ratings_dashboard.html:282 +#: templates/physicians/ratings_list.html:162 +#: templates/reports/report_builder.html:84 templates/standards/search.html:131 +#: templates/standards/standard_confirm_delete.html:95 +#: templates/standards/standard_detail.html:148 +msgid "All Departments" +msgstr "جميع الأقسام" + +#: templates/appreciation/leaderboard.html:132 +#: templates/complaints/complaint_detail.html:822 +msgid "Reset" +msgstr "إعادة تعيين" + +#: templates/appreciation/leaderboard.html:144 +#: templates/dashboard/command_center.html:656 +#: templates/dashboard/department_benchmarks.html:126 +#: templates/dashboard/my_performance.html:239 +#: templates/physicians/department_overview.html:106 +#: templates/physicians/leaderboard.html:197 +#: templates/physicians/physician_detail.html:417 +#: templates/physicians/physician_detail.html:504 +#: templates/physicians/physician_ratings_dashboard.html:454 +#: templates/physicians/specialization_overview.html:105 +msgid "Rank" +msgstr "الترتيب" + +#: templates/appreciation/leaderboard.html:150 msgid "Hospital Rank" msgstr "ترتيب المستشفى" -#: templates/appreciation/leaderboard.html:183 +#: templates/appreciation/leaderboard.html:245 msgid "No appreciations found for this period" msgstr "لم يتم العثور على أي رسائل تقدير لهذه الفترة" -#: templates/appreciation/leaderboard.html:184 +#: templates/appreciation/leaderboard.html:246 msgid "Try changing the filters or select a different time period" msgstr "جرّب تغيير عوامل التصفية أو اختر فترة زمنية مختلفة" -#: templates/appreciation/leaderboard.html:197 +#: templates/appreciation/leaderboard.html:260 +msgid "Send Appreciation" +msgstr "إرسال تقدير" + +#: templates/appreciation/leaderboard.html:261 msgid "Share your appreciation with colleagues" msgstr "شارك تقديرك مع الزملاء" -#: templates/appreciation/leaderboard.html:199 -msgid "Send Now" -msgstr "أرسل الآن" - -#: templates/appreciation/leaderboard.html:208 +#: templates/appreciation/leaderboard.html:273 msgid "View Badges" msgstr "عرض الشارات" -#: templates/appreciation/leaderboard.html:209 +#: templates/appreciation/leaderboard.html:274 msgid "See your earned badges" msgstr "عرض الشارات التي حصلت عليها" -#: templates/appreciation/leaderboard.html:220 +#: templates/appreciation/leaderboard.html:286 +#: templates/organizations/department_detail.html:493 msgid "All Appreciations" msgstr "جميع رسائل التقدير" -#: templates/appreciation/leaderboard.html:221 +#: templates/appreciation/leaderboard.html:287 msgid "View your appreciations" msgstr "عرض رسائل التقدير الخاصة بك" -#: templates/appreciation/leaderboard.html:223 -msgid "View List" -msgstr "عرض القائمة" - #: templates/appreciation/my_badges.html:37 msgid "Total Appreciations Received" msgstr "إجمالي رسائل التقدير المستلمة" +#: templates/appreciation/my_badges.html:46 +msgid "Badges Earned" +msgstr "الشارات المكتسبة" + #: templates/appreciation/my_badges.html:55 msgid "Available Badges" msgstr "الشارات المتاحة" @@ -10735,6 +13844,10 @@ msgstr "المكالمات الصادرة" msgid "Duration" msgstr "المدة" +#: templates/callcenter/call_records_list.html:126 +msgid "Avg:" +msgstr "متوسط:" + #: templates/callcenter/call_records_list.html:135 #: templates/callcenter/call_records_list.html:169 #: templates/callcenter/call_records_list.html:220 @@ -10775,11 +13888,15 @@ msgid "Caller" msgstr "المتصل" #: templates/callcenter/call_records_list.html:221 +#: templates/organizations/department_detail.html:1233 #: templates/references/document_view.html:302 -#: templates/references/document_view.html:423 +#: templates/references/document_view.html:422 #: templates/standards/attachment_upload.html:93 -#: templates/standards/department_standards.html:308 -#: templates/standards/department_standards.html:353 +#: templates/standards/department_standards.html:407 +#: templates/standards/department_standards.html:452 +#: templates/standards/search.html:526 templates/standards/search.html:567 +#: templates/standards/standard_detail.html:545 +#: templates/standards/standard_detail.html:574 msgid "File" msgstr "الملف" @@ -10795,7 +13912,7 @@ msgstr "استيراد ملف CSV للبدء" #: templates/callcenter/complaint_form.html:60 #: templates/callcenter/complaint_form.html:267 #: templates/callcenter/complaint_list.html:74 -#: templates/complaints/complaint_form.html:737 +#: templates/complaints/complaint_form.html:731 #: templates/px_sources/source_user_complaint_list.html:82 #: templates/px_sources/source_user_create_complaint.html:4 #: templates/px_sources/source_user_create_complaint.html:28 @@ -10807,7 +13924,7 @@ msgid "File a complaint on behalf of a patient or caller" msgstr "تقديم شكوى نيابة عن مريض أو متصل" #: templates/callcenter/complaint_form.html:78 -#: templates/callcenter/inquiry_form.html:74 +#: templates/callcenter/inquiry_form.html:93 msgid "Caller Information" msgstr "معلومات المتصل" @@ -10816,12 +13933,12 @@ msgid "Search for an existing patient or enter caller details manually" msgstr "ابحث عن مريض موجود أو أدخل تفاصيل المتصل يدويًا" #: templates/callcenter/complaint_form.html:88 -#: templates/callcenter/inquiry_form.html:84 +#: templates/callcenter/inquiry_form.html:102 msgid "Search Patient" msgstr "بحث عن مريض" #: templates/callcenter/complaint_form.html:91 -#: templates/callcenter/inquiry_form.html:87 +#: templates/callcenter/inquiry_form.html:105 msgid "Search by MRN, name, phone, or national ID..." msgstr "ابحث برقم الملف الطبي، الاسم، رقم الهاتف، أو رقم الهوية الوطنية..." @@ -10830,7 +13947,7 @@ msgid "Caller Name" msgstr "اسم المتصل" #: templates/callcenter/complaint_form.html:105 -#: templates/callcenter/inquiry_form.html:101 +#: templates/callcenter/inquiry_form.html:117 msgid "Full name" msgstr "الاسم الكامل" @@ -10839,14 +13956,14 @@ msgid "Caller Phone" msgstr "رقم هاتف المتصل" #: templates/callcenter/complaint_form.html:115 -#: templates/callcenter/inquiry_form.html:119 +#: templates/callcenter/inquiry_form.html:132 msgid "Relationship" msgstr "العلاقة" #: templates/callcenter/complaint_form.html:141 #: templates/callcenter/complaint_form.html:299 -#: templates/callcenter/inquiry_form.html:145 -#: templates/callcenter/inquiry_form.html:257 +#: templates/callcenter/inquiry_form.html:159 +#: templates/callcenter/inquiry_form.html:273 msgid "Select department..." msgstr "اختر القسم..." @@ -10855,6 +13972,16 @@ msgstr "اختر القسم..." msgid "Select physician..." msgstr "اختر الطبيب..." +#: templates/callcenter/complaint_form.html:155 +#: templates/feedback/feedback_detail.html:165 +#: templates/journeys/instance_list.html:237 +msgid "Encounter ID" +msgstr "معرّف الزيارة" + +#: templates/callcenter/complaint_form.html:157 +msgid "Optional encounter/visit ID" +msgstr "معرّف الزيارة (اختياري)" + #: templates/callcenter/complaint_form.html:171 msgid "Brief summary of the complaint" msgstr "ملخص موجز للشكوى" @@ -10866,11 +13993,6 @@ msgid "" msgstr "" "وصف مفصل للشكوى. يرجى تضمين جميع المعلومات ذات الصلة التي قدمها المتصل..." -#: templates/callcenter/complaint_form.html:184 -#: templates/callcenter/inquiry_form.html:160 -msgid "Select category..." -msgstr "اختر الفئة..." - #: templates/callcenter/complaint_form.html:186 #: templates/px_sources/source_user_complaint_list.html:140 #: templates/px_sources/source_user_inquiry_list.html:129 @@ -10898,16 +14020,10 @@ msgstr "يحدد الموعد النهائي لاتفاقية مستوى الخ msgid "Select priority..." msgstr "اختر الأولوية..." -#: templates/callcenter/complaint_form.html:233 -#: templates/complaints/partials/priority_badge.html:4 -msgid "Urgent" -msgstr "عاجل" - #: templates/callcenter/complaint_form.html:244 -#: templates/complaints/complaint_form.html:711 +#: templates/complaints/complaint_form.html:705 msgid "SLA deadline will be automatically calculated based on severity:" -msgstr "" -"سيتم حساب الموعد النهائي لاتفاقية SLA تلقائيًا بناءً على درجة الخطورة:" +msgstr "سيتم حساب الموعد النهائي لاتفاقية SLA تلقائيًا بناءً على درجة الخطورة:" #: templates/callcenter/complaint_form.html:247 msgid "Critical:" @@ -10918,12 +14034,14 @@ msgstr "حرج:" #: templates/callcenter/complaint_form.html:249 #: templates/callcenter/complaint_form.html:250 #: templates/complaints/sla_management_form.html:219 -#: templates/emails/explanation_reminder.html:64 -#: templates/emails/explanation_second_reminder.html:67 -#: templates/emails/observation_sla_reminder.html:124 -#: templates/emails/observation_sla_second_reminder.html:118 -#: templates/emails/sla_reminder.html:126 -#: templates/emails/sla_second_reminder.html:129 +#: templates/emails/explanation_reminder.html:21 +#: templates/emails/explanation_second_reminder.html:25 +#: templates/emails/inquiry_dept_response_reminder.html:20 +#: templates/emails/observation_dept_response_reminder.html:22 +#: templates/emails/observation_sla_reminder.html:33 +#: templates/emails/observation_sla_second_reminder.html:24 +#: templates/emails/sla_reminder.html:30 +#: templates/emails/sla_second_reminder.html:30 msgid "hours" msgstr "ساعات" @@ -10940,7 +14058,7 @@ msgid "Low:" msgstr "منخفض:" #: templates/callcenter/complaint_form.html:257 -#: templates/callcenter/inquiry_form.html:201 +#: templates/callcenter/inquiry_form.html:220 msgid "Call Center Note" msgstr "ملاحظة مركز الاتصال" @@ -10953,12 +14071,13 @@ msgstr "" "لمركز الاتصال تلقائيًا." #: templates/callcenter/complaint_form.html:330 -#: templates/callcenter/inquiry_form.html:274 +#: templates/callcenter/inquiry_form.html:289 msgid "Please enter at least 2 characters to search" msgstr "يرجى إدخال حرفين على الأقل للبحث" #: templates/callcenter/complaint_form.html:334 -#: templates/callcenter/inquiry_form.html:278 +#: templates/callcenter/inquiry_form.html:293 +#: templates/core/public_track.html:355 msgid "Searching..." msgstr "جارٍ البحث..." @@ -10967,12 +14086,12 @@ msgid "No patients found. Please enter caller details manually." msgstr "لم يتم العثور على مرضى. يرجى إدخال تفاصيل المتصل يدويًا." #: templates/callcenter/complaint_form.html:349 -#: templates/callcenter/inquiry_form.html:293 +#: templates/callcenter/inquiry_form.html:308 msgid "Select Patient:" msgstr "اختر المريض:" #: templates/callcenter/complaint_form.html:396 -#: templates/callcenter/inquiry_form.html:342 +#: templates/callcenter/inquiry_form.html:352 msgid "Error searching patients. Please try again." msgstr "حدث خطأ أثناء البحث عن المرضى. يرجى المحاولة مرة أخرى." @@ -10986,30 +14105,32 @@ msgstr "الشكاوى المُقدمة عبر مركز الاتصال" #: templates/callcenter/complaint_list.html:133 #: templates/callcenter/inquiry_list.html:129 -#: templates/dashboard/my_dashboard.html:135 -#: templates/layouts/partials/topbar.html:30 templates/rca/rca_list.html:203 +#: templates/dashboard/my_dashboard.html:141 +#: templates/organizations/department_detail.html:446 +#: templates/rca/rca_list.html:203 msgid "Search..." msgstr "بحث..." #: templates/callcenter/complaint_list.html:201 #: templates/callcenter/complaint_success.html:83 -#: templates/emails/appointment_confirmation.html:39 -#: templates/emails/appointment_confirmation.html:47 -#: templates/emails/appointment_confirmation.html:55 -#: templates/emails/appointment_confirmation.html:63 -#: templates/emails/appointment_confirmation.html:71 -#: templates/emails/appointment_confirmation.html:79 -#: templates/emails/survey_results_notification.html:30 -#: templates/emails/survey_results_notification.html:39 -#: templates/emails/survey_results_notification.html:48 +#: templates/emails/appointment_confirmation.html:16 +#: templates/emails/appointment_confirmation.html:17 +#: templates/emails/appointment_confirmation.html:18 +#: templates/emails/appointment_confirmation.html:19 +#: templates/emails/appointment_confirmation.html:20 +#: templates/emails/appointment_confirmation.html:21 +#: templates/emails/survey_results_notification.html:16 +#: templates/emails/survey_results_notification.html:17 +#: templates/emails/survey_results_notification.html:18 #: templates/physicians/individual_ratings_list.html:227 msgid "N/A" msgstr "غير متاح" #: templates/callcenter/complaint_list.html:234 -#: templates/complaints/complaint_list.html:305 +#: templates/complaints/complaint_list.html:355 #: templates/dashboard/partials/complaints_table.html:74 -#: templates/organizations/patient_detail.html:485 +#: templates/organizations/department_complaints.html:158 +#: templates/organizations/patient_detail.html:480 #: templates/px_sources/source_user_complaint_list.html:248 msgid "No complaints found" msgstr "لم يتم العثور على شكاوى" @@ -11033,43 +14154,64 @@ msgid "Complaint ID:" msgstr "رقم الشكوى:" #: templates/callcenter/complaint_success.html:73 -#: templates/complaints/explanation_already_submitted.html:64 -#: templates/complaints/explanation_form.html:200 -#: templates/complaints/explanation_success.html:65 -#: templates/emails/explanation_reminder.html:43 -#: templates/emails/explanation_request.html:35 -#: templates/emails/explanation_second_reminder.html:46 -#: templates/emails/new_observation_notification.html:28 -#: templates/emails/observation_sla_reminder.html:56 -#: templates/emails/observation_sla_second_reminder.html:60 -#: templates/emails/sla_reminder.html:55 -#: templates/emails/sla_second_reminder.html:58 +#: templates/complaints/emails/new_complaint_admin_en.html:17 +#: templates/complaints/explanation_already_submitted.html:59 +#: templates/emails/explanation_reminder.html:17 +#: templates/emails/explanation_request.html:21 +#: templates/emails/explanation_second_reminder.html:21 +#: templates/emails/new_observation_notification.html:18 +#: templates/emails/observation_assigned.html:18 +#: templates/emails/observation_dept_response_escalation.html:18 +#: templates/emails/observation_dept_response_reminder.html:18 +#: templates/emails/observation_monthly_followup.html:18 +#: templates/emails/observation_resolved.html:18 +#: templates/emails/observation_sla_reminder.html:24 +#: templates/emails/observation_sla_second_reminder.html:18 +#: templates/emails/sla_reminder.html:23 +#: templates/emails/sla_second_reminder.html:23 msgid "Title:" msgstr "العنوان:" #: templates/callcenter/complaint_success.html:78 -#: templates/complaints/explanation_form.html:205 -#: templates/emails/explanation_request.html:40 -#: templates/emails/sla_reminder.html:95 -#: templates/emails/sla_second_reminder.html:98 +#: templates/emails/communication_request_notification.html:14 +#: templates/emails/explanation_request.html:22 +#: templates/emails/sla_reminder.html:28 +#: templates/emails/sla_second_reminder.html:28 #: templates/journeys/instance_detail.html:166 msgid "Patient:" msgstr "المريض:" +#: templates/callcenter/complaint_success.html:89 +#: templates/callcenter/inquiry_success.html:77 +#: templates/complaints/emails/new_complaint_admin_en.html:25 +#: templates/emails/observation_assigned.html:24 +#: templates/journeys/instance_detail.html:170 +#: templates/journeys/stage_surveys_form.html:180 +#: templates/journeys/template_confirm_delete.html:36 +#: templates/journeys/template_detail.html:67 +#: templates/projects/project_delete_confirm.html:24 +#: templates/projects/template_delete_confirm.html:25 +#: templates/surveys/bulk_job_status.html:73 +msgid "Hospital:" +msgstr "المستشفى:" + #: templates/callcenter/complaint_success.html:99 #: templates/complaints/complaint_pdf.html:485 -#: templates/emails/observation_sla_reminder.html:73 -#: templates/emails/observation_sla_second_reminder.html:77 -#: templates/emails/sla_reminder.html:63 -#: templates/emails/sla_second_reminder.html:66 +#: templates/complaints/emails/new_complaint_admin_en.html:19 +#: templates/emails/observation_assigned.html:21 +#: templates/emails/observation_sla_reminder.html:27 +#: templates/emails/observation_sla_second_reminder.html:21 +#: templates/emails/sla_reminder.html:24 +#: templates/emails/sla_second_reminder.html:24 msgid "Severity:" msgstr "درجة الخطورة:" #: templates/callcenter/complaint_success.html:108 #: templates/complaints/complaint_pdf.html:489 #: templates/complaints/complaint_pdf.html:728 -#: templates/emails/sla_reminder.html:71 -#: templates/emails/sla_second_reminder.html:74 +#: templates/complaints/emails/new_complaint_admin_en.html:18 +#: templates/emails/sla_reminder.html:25 +#: templates/emails/sla_second_reminder.html:25 msgid "Priority:" msgstr "الأولوية:" @@ -11078,7 +14220,7 @@ msgid "SLA Deadline:" msgstr "الموعد النهائي لاتفاقية SLA:" #: templates/callcenter/complaint_success.html:125 -#: templates/callcenter/inquiry_success.html:133 +#: templates/callcenter/inquiry_success.html:107 #: templates/complaints/complaint_pdf.html:729 #: templates/references/document_form.html:352 #: templates/references/folder_form.html:285 @@ -11090,7 +14232,7 @@ msgid "The complaint has been automatically assigned based on hospital rules" msgstr "تم تعيين الشكوى تلقائيًا بناءً على قواعد المستشفى" #: templates/callcenter/complaint_success.html:137 -#: templates/callcenter/inquiry_success.html:145 +#: templates/callcenter/inquiry_success.html:128 msgid "A call center interaction record has been created" msgstr "تم إنشاء سجل تفاعل لمركز الاتصال" @@ -11103,13 +14245,16 @@ msgid "You can track the complaint status in the complaints list" msgstr "يمكنك متابعة حالة الشكوى في قائمة الشكاوى" #: templates/callcenter/complaint_success.html:146 -#: templates/emails/new_complaint_admin_notification.html:121 -#: templates/emails/sla_reminder.html:184 +#: templates/complaints/emails/new_complaint_admin_en.html:44 +#: templates/complaints/government_ticket_detail.html:173 +#: templates/emails/new_complaint_admin_notification.html:38 +#: templates/emails/sla_reminder.html:48 +#: templates/organizations/department_detail.html:378 msgid "View Complaint" msgstr "عرض الشكوى" #: templates/callcenter/complaint_success.html:149 -#: templates/callcenter/inquiry_success.html:158 +#: templates/callcenter/inquiry_success.html:153 msgid "Create Another" msgstr "إنشاء شكوى أخرى" @@ -11127,6 +14272,7 @@ msgid "Upload call records from your call recording system" msgstr "تحميل سجلات المكالمات من نظام تسجيل المكالمات الخاص بك" #: templates/callcenter/import_call_records.html:93 +#: templates/organizations/staff_import.html:64 msgid "Click to upload or drag and drop" msgstr "انقر للتحميل أو اسحب وأفلت" @@ -11210,39 +14356,40 @@ msgid "Example Data Format" msgstr "نموذج بيانات مثال" #: templates/callcenter/inquiry_form.html:5 -#: templates/callcenter/inquiry_form.html:56 -#: templates/callcenter/inquiry_form.html:226 +#: templates/callcenter/inquiry_form.html:71 +#: templates/callcenter/inquiry_form.html:73 +#: templates/callcenter/inquiry_form.html:244 #: templates/callcenter/inquiry_list.html:70 -#: templates/complaints/inquiry_form.html:364 +#: templates/complaints/inquiry_form.html:281 #: templates/px_sources/source_user_create_inquiry.html:4 #: templates/px_sources/source_user_create_inquiry.html:28 #: templates/px_sources/source_user_inquiry_list.html:82 msgid "Create Inquiry" msgstr "إنشاء استفسار" -#: templates/callcenter/inquiry_form.html:58 +#: templates/callcenter/inquiry_form.html:74 msgid "Create an inquiry on behalf of a patient or caller" msgstr "إنشاء استفسار نيابة عن مريض أو متصل" -#: templates/callcenter/inquiry_form.html:79 +#: templates/callcenter/inquiry_form.html:98 msgid "Search for an existing patient or enter contact details manually" msgstr "ابحث عن مريض موجود أو أدخل تفاصيل الاتصال يدويًا" -#: templates/callcenter/inquiry_form.html:154 -#: templates/callcenter/inquiry_success.html:60 -#: templates/complaints/inquiry_detail.html:282 -#: templates/complaints/inquiry_form.html:298 +#: templates/callcenter/inquiry_form.html:171 +#: templates/callcenter/inquiry_success.html:33 +#: templates/complaints/inquiry_explanation_form.html:91 +#: templates/complaints/inquiry_form.html:223 +#: templates/complaints/inquiry_response_form_token.html:21 #: templates/complaints/public_inquiry_form.html:12 -#: templates/core/public_submit.html:637 -#: templates/emails/public_inquiry_notification.html:27 +#: templates/core/public_submit.html:438 msgid "Inquiry Details" msgstr "تفاصيل الاستفسار" -#: templates/callcenter/inquiry_form.html:172 +#: templates/callcenter/inquiry_form.html:188 msgid "Brief summary of the inquiry" msgstr "ملخص موجز للاستفسار" -#: templates/callcenter/inquiry_form.html:178 +#: templates/callcenter/inquiry_form.html:193 msgid "" "Detailed description of the inquiry. Include all relevant information " "provided by the caller..." @@ -11250,43 +14397,39 @@ msgstr "" "وصف تفصيلي للاستفسار. يرجى تضمين جميع المعلومات ذات الصلة التي قدمها " "المتصل..." -#: templates/callcenter/inquiry_form.html:188 -msgid "Inquiry Categories" -msgstr "فئات الاستفسار" - -#: templates/callcenter/inquiry_form.html:191 +#: templates/callcenter/inquiry_form.html:208 msgid "Appointment:" msgstr "المواعيد:" -#: templates/callcenter/inquiry_form.html:191 +#: templates/callcenter/inquiry_form.html:208 msgid "Scheduling, rescheduling, or cancellation" msgstr "الحجز، إعادة الحجز، أو الإلغاء" -#: templates/callcenter/inquiry_form.html:192 +#: templates/callcenter/inquiry_form.html:209 msgid "Billing:" msgstr "الفواتير:" -#: templates/callcenter/inquiry_form.html:192 +#: templates/callcenter/inquiry_form.html:209 msgid "Payment questions or invoice requests" msgstr "استفسارات الدفع أو طلبات الفواتير" -#: templates/callcenter/inquiry_form.html:193 +#: templates/callcenter/inquiry_form.html:210 msgid "Medical Records:" msgstr "السجلات الطبية:" -#: templates/callcenter/inquiry_form.html:193 +#: templates/callcenter/inquiry_form.html:210 msgid "Record requests or updates" msgstr "طلبات السجلات أو التحديثات" -#: templates/callcenter/inquiry_form.html:194 +#: templates/callcenter/inquiry_form.html:211 msgid "General:" msgstr "عام:" -#: templates/callcenter/inquiry_form.html:194 +#: templates/callcenter/inquiry_form.html:211 msgid "Hospital information or services" msgstr "معلومات أو خدمات المستشفى" -#: templates/callcenter/inquiry_form.html:204 +#: templates/callcenter/inquiry_form.html:223 msgid "" "This inquiry will be logged as received via Call Center. A call center " "interaction record will be automatically created for tracking purposes." @@ -11294,46 +14437,26 @@ msgstr "" "سيتم تسجيل هذا الاستفسار كمستلم عبر مركز الاتصال. سيتم إنشاء سجل تفاعل " "تلقائي لأغراض المتابعة." -#: templates/callcenter/inquiry_form.html:215 +#: templates/callcenter/inquiry_form.html:235 msgid "Be clear and concise in the subject line" msgstr "كن واضحًا وموجزًا في عنوان الموضوع" -#: templates/callcenter/inquiry_form.html:216 +#: templates/callcenter/inquiry_form.html:236 msgid "Include all relevant details in the message" msgstr "قم بتضمين جميع التفاصيل ذات الصلة في الرسالة" -#: templates/callcenter/inquiry_form.html:217 +#: templates/callcenter/inquiry_form.html:237 msgid "Verify contact information for follow-up" msgstr "تحقق من معلومات الاتصال للمتابعة" -#: templates/callcenter/inquiry_form.html:218 +#: templates/callcenter/inquiry_form.html:238 msgid "Select the most appropriate category" msgstr "اختر الفئة الأنسب" -#: templates/callcenter/inquiry_form.html:289 +#: templates/callcenter/inquiry_form.html:304 msgid "No patients found. Please enter contact details manually." msgstr "لم يتم العثور على أي مرضى. يرجى إدخال بيانات الاتصال يدويًا." -#: templates/callcenter/inquiry_list.html:5 -#: templates/callcenter/inquiry_list.html:167 -#: templates/complaints/inquiry_form.html:163 -#: templates/dashboard/admin_evaluation.html:404 -#: templates/dashboard/command_center.html:276 -#: templates/dashboard/department_benchmarks.html:131 -#: templates/dashboard/employee_evaluation.html:1141 -#: templates/dashboard/my_dashboard.html:178 -#: templates/dashboard/partials/inquiries_table.html:6 -#: templates/dashboard/staff_performance_detail.html:277 -#: templates/layouts/partials/sidebar.html:163 -#: templates/layouts/source_user_base.html:182 -#: templates/organizations/patient_detail.html:291 -#: templates/organizations/patient_detail.html:572 -#: templates/px_sources/source_detail.html:212 -#: templates/px_sources/source_detail.html:236 -#: templates/px_sources/source_user_confirm_delete.html:99 -msgid "Inquiries" -msgstr "الاستفسارات" - #: templates/callcenter/inquiry_list.html:65 msgid "Call Center Inquiries" msgstr "استفسارات مركز الاتصال" @@ -11342,96 +14465,97 @@ msgstr "استفسارات مركز الاتصال" msgid "Inquiries created via call center" msgstr "الاستفسارات المُنشأة عبر مركز الاتصال" -#: templates/callcenter/inquiry_list.html:80 -#: templates/complaints/inquiry_list.html:141 -#: templates/dashboard/admin_evaluation.html:362 -#: templates/dashboard/employee_evaluation.html:721 -#: templates/dashboard/employee_evaluation.html:780 -#: templates/dashboard/employee_evaluation.html:1436 -#: templates/dashboard/staff_performance_detail.html:136 -#: templates/px_sources/source_detail.html:442 -#: templates/px_sources/source_user_dashboard.html:80 -msgid "Total Inquiries" -msgstr "إجمالي الاستفسارات" - -#: templates/callcenter/inquiry_list.html:148 -#: templates/complaints/inquiry_list.html:197 -#: templates/surveys/comment_list.html:204 -#: templates/surveys/instance_list.html:104 -msgid "General" -msgstr "عام" - #: templates/callcenter/inquiry_list.html:175 -#: templates/complaints/inquiry_list.html:230 +#: templates/complaints/government_ticket_import.html:165 +#: templates/complaints/inquiry_list.html:191 #: templates/complaints/oncall/schedule_detail.html:95 -#: templates/organizations/patient_list.html:264 +#: templates/emails/new_inquiry_notification.html:20 +#: templates/feedback/feedback_delete_confirm.html:107 +#: templates/feedback/feedback_detail.html:172 +#: templates/feedback/feedback_list.html:207 +#: templates/organizations/department_detail.html:770 +#: templates/organizations/department_detail.html:896 +#: templates/organizations/department_detail.html:1316 +#: templates/organizations/department_inquiries.html:68 +#: templates/organizations/department_inquiry_detail.html:83 +#: templates/organizations/department_staff_detail.html:128 +#: templates/organizations/department_staff_detail.html:481 +#: templates/organizations/patient_list.html:284 #: templates/px_sources/source_detail.html:162 #: templates/px_sources/source_user_inquiry_list.html:173 msgid "Contact" msgstr "جهة الاتصال" #: templates/callcenter/inquiry_list.html:226 -#: templates/complaints/inquiry_list.html:331 +#: templates/complaints/inquiry_list.html:250 #: templates/dashboard/partials/inquiries_table.html:72 -#: templates/organizations/patient_detail.html:522 +#: templates/organizations/department_inquiries.html:121 +#: templates/organizations/patient_detail.html:517 #: templates/px_sources/source_user_inquiry_list.html:227 msgid "No inquiries found" msgstr "لم يتم العثور على استفسارات" #: templates/callcenter/inquiry_success.html:5 -#: templates/complaints/inquiry_detail.html:422 msgid "Inquiry Created" msgstr "تم إنشاء الاستفسار" -#: templates/callcenter/inquiry_success.html:52 +#: templates/callcenter/inquiry_success.html:23 msgid "Inquiry Created Successfully!" msgstr "تم إنشاء الاستفسار بنجاح!" -#: templates/callcenter/inquiry_success.html:54 +#: templates/callcenter/inquiry_success.html:25 msgid "" "The inquiry has been logged and will be responded to as soon as possible." msgstr "تم تسجيل الاستفسار وسيتم الرد عليه في أقرب وقت ممكن." -#: templates/callcenter/inquiry_success.html:64 +#: templates/callcenter/inquiry_success.html:38 msgid "Inquiry ID:" msgstr "رقم الاستفسار:" -#: templates/callcenter/inquiry_success.html:69 -#: templates/emails/public_inquiry_notification.html:48 +#: templates/callcenter/inquiry_success.html:43 +#: templates/complaints/inquiry_explanation_form.html:99 +#: templates/emails/inquiry_dept_response_escalation.html:17 +#: templates/emails/inquiry_dept_response_reminder.html:17 +#: templates/emails/inquiry_explanation_request.html:14 +#: templates/emails/public_inquiry_notification.html:14 msgid "Subject:" msgstr "الموضوع:" -#: templates/callcenter/inquiry_success.html:74 +#: templates/callcenter/inquiry_success.html:48 msgid "Contact:" msgstr "جهة الاتصال:" -#: templates/callcenter/inquiry_success.html:85 -#: templates/emails/appointment_confirmation.html:153 +#: templates/callcenter/inquiry_success.html:59 +#: templates/complaints/emails/new_complaint_admin_en.html:23 +#: templates/emails/appointment_confirmation.html:41 #: templates/journeys/instance_detail.html:336 msgid "Phone:" msgstr "رقم الهاتف:" -#: templates/callcenter/inquiry_success.html:144 +#: templates/callcenter/inquiry_success.html:124 msgid "The inquiry has been logged in the system" msgstr "تم تسجيل الاستفسار في النظام" -#: templates/callcenter/inquiry_success.html:146 +#: templates/callcenter/inquiry_success.html:132 msgid "The appropriate department will be notified" msgstr "سيتم إخطار القسم المختص" -#: templates/callcenter/inquiry_success.html:147 +#: templates/callcenter/inquiry_success.html:136 msgid "The caller will be contacted once a response is available" msgstr "سيتم التواصل مع المتصل بمجرد توفر الرد" -#: templates/callcenter/inquiry_success.html:148 +#: templates/callcenter/inquiry_success.html:140 msgid "You can track the inquiry status in the inquiries list" msgstr "يمكنك متابعة حالة الاستفسار في قائمة الاستفسارات" -#: templates/callcenter/inquiry_success.html:155 +#: templates/callcenter/inquiry_success.html:149 +#: templates/emails/inquiry_dept_response_escalation.html:28 +#: templates/emails/inquiry_dept_response_reminder.html:28 +#: templates/emails/new_inquiry_notification.html:38 msgid "View Inquiry" msgstr "عرض الاستفسار" -#: templates/callcenter/inquiry_success.html:161 +#: templates/callcenter/inquiry_success.html:157 msgid "View All Inquiries" msgstr "عرض جميع الاستفسارات" @@ -11439,6 +14563,28 @@ msgstr "عرض جميع الاستفسارات" msgid "Call Interaction Details" msgstr "تفاصيل التفاعل الهاتفي" +#: templates/callcenter/interaction_detail.html:64 +#: templates/callcenter/interaction_list.html:111 +#: templates/dashboard/command_center.html:659 +#: templates/dashboard/department_benchmarks.html:129 +#: templates/dashboard/partials/feedback_table.html:26 +#: templates/feedback/feedback_delete_confirm.html:132 +#: templates/feedback/feedback_detail.html:140 +#: templates/feedback/feedback_list.html:210 +#: templates/organizations/department_detail.html:1906 +#: templates/physicians/department_overview.html:109 +#: templates/physicians/doctor_rating_review.html:176 +#: templates/physicians/individual_ratings_list.html:186 +#: templates/physicians/leaderboard.html:201 +#: templates/physicians/physician_detail.html:499 +#: templates/physicians/physician_ratings_dashboard.html:459 +#: templates/physicians/physician_ratings_dashboard.html:712 +#: templates/physicians/ratings_list.html:201 +#: templates/physicians/specialization_overview.html:109 +#: templates/social/comments_list.html:160 +msgid "Rating" +msgstr "التقييم" + #: templates/callcenter/interaction_detail.html:82 msgid "Call Metrics" msgstr "مقاييس المكالمات" @@ -11516,11 +14662,11 @@ msgid "Impact on Patient" msgstr "تأثير على المريض" #: templates/complaints/adverse_action_form.html:199 -msgid "" -"Describe the physical, emotional, or financial impact on the patient..." +msgid "Describe the physical, emotional, or financial impact on the patient..." msgstr "صف التأثير الجسدي أو العاطفي أو المالي على المريض..." #: templates/complaints/adverse_action_form.html:205 +#: templates/complaints/complaint_detail.html:589 #: templates/complaints/partials/staff_panel.html:4 msgid "Involved Staff" msgstr "الموظفون المعنيون" @@ -11555,6 +14701,7 @@ msgstr "تتبع وإدارة الإجراءات السلبية المتعلقة #: templates/complaints/adverse_action_list.html:196 #: templates/complaints/complaint_form.html:371 +#: templates/complaints/trash_list.html:9 #: templates/px_sources/source_user_create_complaint.html:38 msgid "Back to Complaints" msgstr "الرجوع إلى الشكاوى" @@ -11563,12 +14710,6 @@ msgstr "الرجوع إلى الشكاوى" msgid "Reference or description..." msgstr "مرجع أو وصف..." -#: templates/complaints/adverse_action_list.html:229 -#: templates/complaints/escalation_rule_form.html:326 -#: templates/observations/observation_list.html:194 -msgid "All Severities" -msgstr "جميع درجات الخطورة" - #: templates/complaints/adverse_action_list.html:261 msgid "All Adverse Actions" msgstr "جميع الإجراءات الضارة" @@ -11589,309 +14730,703 @@ msgstr "قم بإنشاء إجرائك الضار الأول للبدء" #, python-format msgid "" "\n" -" Showing %(start)s to %(end)s of %(total)s adverse actions\n" +" Showing %(start)s to %(end)s of %(total)s " +"adverse actions\n" " " msgstr "" "\n" -" عرض %(start)s إلى %(end)s من %(total)s إجراء سلبي " +" عرض %(start)s إلى %(end)s من %(total)s إجراء " +"سلبي " + +#: templates/complaints/analytics.html:4 +#: templates/complaints/analytics.html:137 +msgid "Complaints Analytics" +msgstr "تحليلات الشكاوى" #: templates/complaints/analytics.html:139 msgid "Comprehensive complaints metrics and insights" msgstr "مقاييس وتحليلات شاملة للشكاوى" -#: templates/complaints/analytics.html:193 -#: templates/complaints/analytics.html:311 -#: templates/complaints/inquiry_list.html:162 -#: templates/dashboard/my_dashboard.html:101 -msgid "Overdue" -msgstr "متأخر" +#: templates/complaints/analytics.html:143 +#: templates/dashboard/admin_evaluation.html:248 +#: templates/dashboard/employee_evaluation.html:702 +#: templates/dashboard/employee_evaluation_charts.html:181 +#: templates/dashboard/my_performance.html:86 +#: templates/dashboard/staff_performance_detail.html:28 +#: templates/reports/report_builder.html:68 +msgid "Last 7 Days" +msgstr "آخر ٧ أيام" -#: templates/complaints/analytics.html:235 +#: templates/complaints/analytics.html:144 +#: templates/dashboard/admin_evaluation.html:249 +#: templates/dashboard/employee_evaluation.html:703 +#: templates/dashboard/employee_evaluation_charts.html:182 +#: templates/dashboard/my_performance.html:87 +#: templates/dashboard/staff_performance_detail.html:29 +#: templates/reports/report_builder.html:69 +msgid "Last 30 Days" +msgstr "آخر ٣٠ يومًا" + +#: templates/complaints/analytics.html:145 +#: templates/dashboard/admin_evaluation.html:250 +#: templates/dashboard/employee_evaluation.html:704 +#: templates/dashboard/employee_evaluation_charts.html:183 +#: templates/dashboard/my_performance.html:88 +#: templates/dashboard/staff_performance_detail.html:30 +#: templates/reports/report_builder.html:70 +msgid "Last 90 Days" +msgstr "آخر ٩٠ يومًا" + +#: templates/complaints/analytics.html:169 +msgid "vs last period" +msgstr "مقارنةً بالفترة السابقة" + +#: templates/complaints/analytics.html:229 +#: templates/organizations/department_detail.html:1037 +msgid "Reassigned" +msgstr "تمت إعادة التعيين" + +#: templates/complaints/analytics.html:259 +#: templates/organizations/department_detail.html:1073 msgid "Top Categories" msgstr "أعلى الفئات" -#: templates/complaints/analytics.html:271 +#: templates/complaints/analytics.html:295 msgid "Department Distribution" msgstr "توزيع الأقسام" -#: templates/complaints/analytics.html:284 +#: templates/complaints/analytics.html:308 msgid "Severity Breakdown" msgstr "تفصيل الشدة" -#: templates/complaints/analytics.html:298 +#: templates/complaints/analytics.html:322 msgid "Hospital Performance" msgstr "أداء المستشفى" -#: templates/complaints/analytics.html:351 +#: templates/complaints/analytics.html:375 msgid "No hospital data available" msgstr "لا توجد بيانات للمستشفى" -#: templates/complaints/complaint_detail.html:111 +#: templates/complaints/complaint_detail.html:94 +#: templates/surveys/instance_detail.html:581 +msgid "Patient Contacted" +msgstr "تم التواصل مع المريض" + +#: templates/complaints/complaint_detail.html:112 +msgid "Converted from source complaint" +msgstr "تم التحويل من الشكوى الأصلية" + +#: templates/complaints/complaint_detail.html:123 +msgid "Reopened from complaint" +msgstr "أُعيد فتحها من شكوى" + +#: templates/complaints/complaint_detail.html:132 +msgid "This complaint has been reopened as" +msgstr "تم إعادة فتح هذه الشكوى كـ" + +#: templates/complaints/complaint_detail.html:149 msgid "Resolve Case" msgstr "حل الحالة" -#: templates/complaints/complaint_detail.html:125 -#: templates/organizations/department_list.html:4 -#: templates/organizations/department_list.html:95 -#: templates/standards/dashboard.html:175 -#: templates/standards/dashboard.html:187 -msgid "Departments" -msgstr "الأقسام" +#: templates/complaints/complaint_detail.html:189 +#: templates/observations/observation_detail.html:528 +msgid "Send to Dept" +msgstr "إرسال إلى القسم" -#: templates/complaints/complaint_detail.html:135 -#: templates/complaints/inquiry_detail.html:415 -#: templates/observations/observation_detail.html:236 -#: templates/projects/project_list.html:170 -msgid "Timeline" -msgstr "الجدول الزمني" - -#: templates/complaints/complaint_detail.html:146 -#: templates/dashboard/command_center.html:244 -#: templates/dashboard/my_dashboard.html:188 -#: templates/dashboard/partials/actions_table.html:6 -msgid "PX Actions" -msgstr "إجراءات تجربة المريض" - -#: templates/complaints/complaint_detail.html:151 -#: templates/complaints/complaint_pdf.html:662 -#: templates/complaints/inquiry_detail.html:297 -#: templates/complaints/partials/ai_panel.html:6 -#: templates/complaints/partials/ai_panel.html:191 -#: templates/observations/partials/ai_panel.html:5 -#: templates/social/partials/ai_analysis_bilingual.html:8 -#: templates/social/social_comment_detail.html:111 -#: templates/surveys/instance_detail.html:390 -msgid "AI Analysis" -msgstr "تحليل الذكاء الاصطناعي" - -#: templates/complaints/complaint_detail.html:156 -msgid "Explanation" -msgstr "إيضاح" - -#: templates/complaints/complaint_detail.html:176 -#: templates/rca/rca_detail.html:5 templates/rca/rca_detail.html:45 -#: templates/rca/rca_form.html:10 -#, fuzzy -#| msgid "RAD" -msgid "RCA" -msgstr "الأشعة التشخيصية" - -#: templates/complaints/complaint_detail.html:200 -msgid "Source:" -msgstr "المصدر:" - -#: templates/complaints/complaint_detail.html:231 -msgid "Date Created" -msgstr "تاريخ الإنشاء" - -#: templates/complaints/complaint_detail.html:237 -msgid "Response Deadline" -msgstr "موعد الاستجابة المحدد" - -#: templates/complaints/complaint_detail.html:246 -msgid "Expected Result" -msgstr "النتيجة المتوقعة" - -#: templates/complaints/complaint_detail.html:291 -#: templates/complaints/complaint_form.html:405 -#: templates/complaints/complaint_pdf.html:496 -#: templates/complaints/public_complaint_form.html:218 -#: templates/journeys/instance_detail.html:323 -#: templates/organizations/patient_detail.html:223 -#: templates/surveys/instance_detail.html:604 -msgid "Patient Information" -msgstr "معلومات المريض" - -#: templates/complaints/complaint_detail.html:299 -#: templates/journeys/instance_detail.html:166 -#: templates/organizations/patient_detail.html:161 -#: templates/organizations/patient_list.html:262 -#: templates/surveys/his_patient_survey_send.html:120 -#: templates/surveys/instance_detail.html:616 -msgid "MRN" -msgstr "الرقم الطبي (MRN)" - -#: templates/complaints/complaint_detail.html:378 -msgid "Activated" -msgstr "مفعّل" - -#: templates/complaints/complaint_detail.html:387 +#: templates/complaints/complaint_detail.html:215 +#: templates/complaints/complaint_detail.html:250 +#: templates/complaints/complaint_detail.html:690 +#: templates/observations/observation_detail.html:537 msgid "Resolve" msgstr "حلّ" -#: templates/complaints/complaint_detail.html:391 -msgid "Follow Up" -msgstr "متابعة" +#: templates/complaints/complaint_detail.html:225 +#, fuzzy +#| msgid "Activate this complaint to resolve it" +msgid "Activate this complaint" +msgstr "تنشيط هذه الشكوى لحلها" -#: templates/complaints/complaint_detail.html:400 -#: templates/complaints/complaint_list.html:404 -#: templates/rca/rca_detail.html:83 -#: templates/standards/department_standards.html:384 -msgid "Close" -msgstr "إغلاق" +#: templates/complaints/complaint_detail.html:225 +msgid "Assign it to yourself to start working on it" +msgstr "" -#: templates/complaints/complaint_detail.html:406 -msgid "Activate this complaint to perform actions" -msgstr "تفعيل هذه الشكوى لتنفيذ الإجراءات" +#: templates/complaints/complaint_detail.html:235 +#, fuzzy +#| msgid "Send to Department" +msgid "Send to department" +msgstr "إرسال إلى القسم" -#: templates/complaints/complaint_detail.html:411 -msgid "No actions available for this status" -msgstr "لا توجد إجراءات متاحة لهذه الحالة" +#: templates/complaints/complaint_detail.html:235 +msgid "Notify the champion and manager to collect their response" +msgstr "" -#: templates/complaints/complaint_detail.html:422 -msgid "72h Closure Delay Reason" -msgstr "سبب تأخير الإغلاق خلال 72 ساعة" +#: templates/complaints/complaint_detail.html:242 +#, fuzzy +#| msgid "Waiting for department response..." +msgid "Awaiting department response" +msgstr "جاري انتظار رد القسم..." -#: templates/complaints/complaint_detail.html:432 -msgid "Reason for not closing within 72 hours..." -msgstr "سبب عدم الإغلاق خلال 72 ساعة..." +#: templates/complaints/complaint_detail.html:242 +msgid "" +"The department champion and manager have been notified. You'll be notified " +"when they respond." +msgstr "" -#: templates/complaints/complaint_detail.html:434 -msgid "Save Reason" -msgstr "حفظ السبب" +#: templates/complaints/complaint_detail.html:248 +#, fuzzy +#| msgid "Resolve Complaint" +msgid "Resolve this complaint" +msgstr "حل الشكوى" -#: templates/complaints/complaint_detail.html:445 -#: templates/complaints/complaint_pdf.html:579 -msgid "Staff Assignment" -msgstr "تعيين الموظف" +#: templates/complaints/complaint_detail.html:248 +#, fuzzy +#| msgid "This department is already involved in this complaint." +msgid "The department has responded. Review and close the complaint." +msgstr "هذا القسم مشارك بالفعل في هذه الشكوى." -#: templates/complaints/complaint_detail.html:462 -msgid "View all" -msgstr "عرض الكل" +#: templates/complaints/complaint_detail.html:256 +#, fuzzy +#| msgid "Complaint Resolved" +msgid "Complaint resolved" +msgstr "تم حل الشكوى" -#: templates/complaints/complaint_detail.html:462 -msgid "staff" -msgstr "الموظفون" +#: templates/complaints/complaint_detail.html:256 +#, fuzzy +#| msgid "This complaint has been reopened as" +msgid "This complaint has been successfully resolved." +msgstr "تم إعادة فتح هذه الشكوى كـ" + +#: templates/complaints/complaint_detail.html:269 +#: templates/layouts/partials/sidebar.html:338 +#: templates/layouts/partials/sidebar.html:360 +#: templates/organizations/department_complaint_detail.html:9 +#: templates/organizations/department_complaints.html:10 +#: templates/organizations/department_detail.html:33 +#: templates/organizations/department_inquiries.html:9 +#: templates/organizations/department_inquiry_detail.html:9 +#: templates/organizations/department_list.html:4 +#: templates/organizations/department_list.html:53 +#: templates/organizations/department_list.html:73 +#: templates/organizations/department_manager_review.html:9 +#: templates/organizations/department_observation_detail.html:9 +#: templates/organizations/department_observations.html:9 +#: templates/organizations/department_staff_detail.html:9 +#: templates/organizations/orgsection_detail.html:65 +#: templates/standards/dashboard.html:175 +#: templates/standards/dashboard.html:187 +#: templates/standards/standard_form.html:238 +msgid "Departments" +msgstr "الأقسام" + +#: templates/complaints/complaint_detail.html:353 +msgid "Edit location details" +msgstr "تحرير تفاصيل الموقع" + +#: templates/complaints/complaint_detail.html:368 +#: templates/complaints/complaint_detail.html:1084 +msgid "Zone" +msgstr "المنطقة" + +#: templates/complaints/complaint_detail.html:369 +#: templates/complaints/complaint_detail.html:1092 +#: templates/organizations/orgsection_detail.html:96 +#: templates/organizations/orgsection_form.html:131 +msgid "Floor" +msgstr "الطابق" + +#: templates/complaints/complaint_detail.html:414 +#: templates/observations/observation_detail.html:162 +msgid "Deadline" +msgstr "الموعد النهائي" + +#: templates/complaints/complaint_detail.html:435 +#: templates/observations/observation_detail.html:172 +msgid "Taxonomy" +msgstr "التصنيف" + +#: templates/complaints/complaint_detail.html:455 +msgid "Escalated on" +msgstr "تم التصعيد في" + +#: templates/complaints/complaint_detail.html:464 +#: templates/dashboard/command_center.html:402 +msgid "Pending Approval" +msgstr "في انتظار الموافقة" + +#: templates/complaints/complaint_detail.html:466 +msgid "OVR escalation requested. Please review and approve or reject." +msgstr "تم طلب تصعيد OVR. يرجى المراجعة والموافقة أو الرفض." #: templates/complaints/complaint_detail.html:472 -msgid "No staff assigned to this case yet." -msgstr "لا يوجد موظفون مُعيّنون لهذه الحالة بعد." +#: templates/rca/rca_detail.html:73 +msgid "Approve" +msgstr "موافقة" -#: templates/complaints/complaint_detail.html:494 -msgid "Main Dept:" -msgstr "القسم الرئيسي:" +#: templates/complaints/complaint_detail.html:478 +#: templates/complaints/partials/departments_panel.html:105 +msgid "Reject" +msgstr "رفض" -#: templates/complaints/complaint_detail.html:498 -msgid "Assigned To:" -msgstr "مُسند إلى:" +#: templates/complaints/complaint_detail.html:483 +msgid "Waiting for admin approval." +msgstr "في انتظار موافقة المسؤول." -#: templates/complaints/complaint_detail.html:502 -msgid "TAT Goal:" -msgstr "الهدف الزمني للإكمال:" +#: templates/complaints/complaint_detail.html:490 +#: templates/organizations/department_complaint_detail.html:165 +#: templates/organizations/department_detail.html:1314 +#: templates/organizations/department_staff_detail.html:479 +msgid "Expected Result" +msgstr "النتيجة المتوقعة" -#: templates/complaints/complaint_detail.html:517 +#: templates/complaints/complaint_detail.html:500 +#: templates/complaints/complaint_list.html:262 +#: templates/complaints/emails/new_complaint_admin_en.html:22 +#: templates/feedback/feedback_detail.html:176 +#: templates/feedback/feedback_list.html:233 +#: templates/journeys/instance_detail.html:331 +#: templates/organizations/patient_confirm_delete.html:26 +msgid "MRN:" +msgstr "رقم المريض:" + +#: templates/complaints/complaint_detail.html:515 +#: templates/complaints/partials/pdf_summary_panel.html:5 +msgid "PDF Report" +msgstr "تقرير PDF" + +#: templates/complaints/complaint_detail.html:516 +#, fuzzy +#| msgid "Resolve the complaint first to enable PDF report generation." +msgid "Activate this complaint to enable PDF report generation." +msgstr "قم بحل الشكوى أولاً لتمكين إنشاء تقرير PDF." + +#: templates/complaints/complaint_detail.html:527 +#, fuzzy +#| msgid "Sent to Department" +msgid "Not sent to any department yet" +msgstr "تم الإرسال إلى القسم" + +#: templates/complaints/complaint_detail.html:534 +#, fuzzy, python-format +#| msgid "items awaiting response" +msgid "Sent to department on %(dt)s — awaiting response" +msgstr "العناصر بانتظار الرد" + +#: templates/complaints/complaint_detail.html:536 +#, fuzzy +#| msgid "items awaiting response" +msgid "Sent to department — awaiting response" +msgstr "العناصر بانتظار الرد" + +#: templates/complaints/complaint_detail.html:543 +#, fuzzy +#| msgid "Department Responded" +msgid "All departments responded" +msgstr "تم الرد من القسم" + +#: templates/complaints/complaint_detail.html:550 #: templates/complaints/partials/departments_panel.html:4 msgid "Involved Departments" msgstr "الأقسام المشاركة" -#: templates/complaints/complaint_detail.html:527 -#: templates/complaints/partials/departments_panel.html:47 -msgid "PRIMARY" -msgstr "أساسي" +#: templates/complaints/complaint_detail.html:566 +#, fuzzy +#| msgid "Not Met" +msgid "Not sent" +msgstr "غير مستوفى" -#: templates/complaints/complaint_detail.html:544 +#: templates/complaints/complaint_detail.html:574 +#: templates/complaints/partials/departments_panel.html:66 +msgid "No response" +msgstr "لا يوجد رد" + +#: templates/complaints/complaint_detail.html:575 +#: templates/complaints/inquiry_detail.html:275 +#: templates/complaints/partials/departments_panel.html:72 +#: templates/complaints/partials/explanation_panel.html:40 +#: templates/observations/observation_detail.html:296 +msgid "Accepted" +msgstr "مقبول" + +#: templates/complaints/complaint_detail.html:583 +#: templates/complaints/partials/departments_panel.html:131 +msgid "No departments involved yet" +msgstr "لا توجد أقسام مشاركة حتى الآن" + +#: templates/complaints/complaint_detail.html:602 +#: templates/complaints/investigation_review.html:66 +#: templates/complaints/partials/staff_panel.html:50 +#: templates/organizations/department_manager_review.html:126 +msgid "Responded" +msgstr "تم الرد" + +#: templates/complaints/complaint_detail.html:608 +#: templates/complaints/partials/staff_panel.html:90 +msgid "No staff members involved yet" +msgstr "لا يوجد موظفون مشاركون حتى الآن" + +#: templates/complaints/complaint_detail.html:671 +#: templates/complaints/complaint_detail.html:748 +#: templates/complaints/inquiry_detail.html:493 +#: templates/complaints/inquiry_detail.html:703 +#: templates/observations/observation_detail.html:516 +#: templates/observations/observation_detail.html:588 +#: templates/observations/observation_detail.html:602 +msgid "Reassign" +msgstr "إعادة تعيين" + +#: templates/complaints/complaint_detail.html:671 +#: templates/complaints/complaint_detail.html:892 +#: templates/complaints/complaint_list.html:344 +#: templates/complaints/inquiry_detail.html:493 +#: templates/complaints/inquiry_detail.html:703 +#: templates/feedback/feedback_detail.html:323 +#: templates/observations/observation_detail.html:516 +#: templates/observations/observation_detail.html:588 +#: templates/observations/observation_detail.html:602 +#: templates/organizations/department_detail.html:625 +msgid "Assign" +msgstr "تعيين" + +#: templates/complaints/complaint_detail.html:680 +msgid "Start collecting feedback from staff?" +msgstr "بدء جمع الملاحظات من الموظفين؟" + +#: templates/complaints/complaint_detail.html:684 +#: templates/complaints/explanation_form.html:83 +#: templates/complaints/investigation_questions.html:8 +msgid "Collect Feedback" +msgstr "تجميع الملاحظات" + +#: templates/complaints/complaint_detail.html:694 +msgid "Follow Up" +msgstr "متابعة" + +#: templates/complaints/complaint_detail.html:707 +msgid "Remove OVR" +msgstr "إزالة OVR" + +#: templates/complaints/complaint_detail.html:707 +msgid "OVR Escalate" +msgstr "تصعيد OVR" + +#: templates/complaints/complaint_detail.html:713 +#: templates/complaints/complaint_list.html:389 +#: templates/rca/rca_detail.html:83 +#: templates/standards/department_standards.html:483 +#: templates/standards/search.html:589 +#: templates/standards/standard_detail.html:589 +msgid "Close" +msgstr "إغلاق" + +#: templates/complaints/complaint_detail.html:742 +#: templates/complaints/inquiry_detail.html:485 +#: templates/observations/observation_detail.html:564 +msgid "Reopen" +msgstr "إعادة فتح" + +#: templates/complaints/complaint_detail.html:754 +msgid "No actions available for this status" +msgstr "لا توجد إجراءات متاحة لهذه الحالة" + +#: templates/complaints/complaint_detail.html:761 +msgid "" +"Are you sure you want to delete this complaint? It can be restored from the " +"trash." +msgstr "" +"هل أنت متأكد من رغبتك في حذف هذه الشكوى؟ يمكن استعادتها من سلة المحذوفات." + +#: templates/complaints/complaint_detail.html:777 +msgid "Patient Contact" +msgstr "جهة اتصال المريض" + +#: templates/complaints/complaint_detail.html:828 +msgid "Patient has not been contacted yet." +msgstr "لم يتم الاتصال بالمريض بعد." + +#: templates/complaints/complaint_detail.html:842 msgid "Resolve Complaint" msgstr "حل الشكوى" -#: templates/complaints/complaint_detail.html:546 +#: templates/complaints/complaint_detail.html:844 msgid "" "Please provide resolution details before marking this complaint as resolved." msgstr "يرجى تقديم تفاصيل الحل قبل وضع هذه الشكوى كتم حلاً." -#: templates/complaints/complaint_detail.html:551 -#: templates/complaints/partials/resolution_panel.html:101 -#: templates/emails/observation_resolved.html:93 +#: templates/complaints/complaint_detail.html:849 +#: templates/complaints/partials/resolution_panel.html:154 +#: templates/px_sources/communication_request_detail.html:133 +#: templates/px_sources/communication_request_detail.html:255 msgid "Resolution Notes" msgstr "ملاحظات الحل" -#: templates/complaints/complaint_detail.html:552 -#: templates/complaints/partials/resolution_panel.html:102 +#: templates/complaints/complaint_detail.html:850 +#: templates/complaints/partials/resolution_panel.html:155 msgid "Enter resolution details..." msgstr "أدخل تفاصيل الحل..." -#: templates/complaints/complaint_detail.html:559 +#: templates/complaints/complaint_detail.html:857 #: templates/complaints/partials/adverse_actions_panel.html:127 msgid "Mark Resolved" msgstr "تحديد كتمة" -#: templates/complaints/complaint_detail.html:573 +#: templates/complaints/complaint_detail.html:872 +msgid "Reassign Complaint" +msgstr "إعادة تعيين الشكوى" + +#: templates/complaints/complaint_detail.html:872 msgid "Assign Complaint" msgstr "تعيين شكوى" -#: templates/complaints/complaint_detail.html:575 +#: templates/complaints/complaint_detail.html:875 msgid "Select a user to assign this complaint to." msgstr "اختر مستخدمًا لتعيين هذه الشكوى إليه." -#: templates/complaints/complaint_detail.html:592 -#: templates/complaints/complaint_list.html:294 -msgid "Assign" -msgstr "تعيين" - -#: templates/complaints/complaint_detail.html:606 +#: templates/complaints/complaint_detail.html:906 msgid "Add Follow Up Note" msgstr "إضافة ملاحظة متابعة" -#: templates/complaints/complaint_detail.html:608 +#: templates/complaints/complaint_detail.html:908 msgid "Add a note or update about this complaint." msgstr "أضف ملاحظة أو تحديثًا حول هذه الشكوى." -#: templates/complaints/complaint_detail.html:634 +#: templates/complaints/complaint_detail.html:934 msgid "Escalate Complaint" msgstr "تصعيد الشكوى" -#: templates/complaints/complaint_detail.html:636 -msgid "Escalate this complaint to a manager or higher authority." -msgstr "قم بتصعيد هذه الشكوى إلى المدير أو الجهة المختصة." - -#: templates/complaints/complaint_detail.html:640 +#: templates/complaints/complaint_detail.html:939 #: templates/complaints/escalation_rule_list.html:290 +#: templates/complaints/inquiry_detail.html:814 +#: templates/observations/observation_detail.html:930 msgid "Escalate To" msgstr "التصعيد إلى" -#: templates/complaints/complaint_detail.html:642 -msgid "Select Manager (Optional)" -msgstr "اختر المدير (اختياري)" +#: templates/complaints/complaint_detail.html:941 +#: templates/complaints/inquiry_detail.html:816 +#: templates/components/send_to_modal.html:53 +#: templates/components/send_to_modal.html:55 +#: templates/observations/observation_detail.html:932 +msgid "Select Person" +msgstr "اختيار شخص" -#: templates/complaints/complaint_detail.html:645 -msgid "(Line Manager)" -msgstr "(المدير المباشر)" +#: templates/complaints/complaint_detail.html:945 +#: templates/complaints/inquiry_detail.html:820 +#: templates/observations/observation_detail.html:936 +#: templates/organizations/department_detail.html:579 +msgid "Department Roles" +msgstr "أدوار القسم" -#: templates/complaints/complaint_detail.html:645 -msgid "(Manager)" -msgstr "(المدير)" +#: templates/complaints/complaint_detail.html:947 +#: templates/complaints/inquiry_detail.html:822 +#: templates/observations/observation_detail.html:938 +msgid "Managers & Admins" +msgstr "المديرون والمشرفون" -#: templates/complaints/complaint_detail.html:649 -msgid "If not selected, will escalate to the staff's direct manager." -msgstr "في حال عدم الاختيار، سيتم التصعيد إلى المدير المباشر للموظف." +#: templates/complaints/complaint_detail.html:951 +msgid "Line Manager" +msgstr "المدير المباشر" -# Escalation Rules -#: templates/complaints/complaint_detail.html:653 -msgid "Enter escalation reason..." -msgstr "أدخل سبب التصعيد..." +#: templates/complaints/complaint_detail.html:951 +#: templates/organizations/department_form.html:115 +#: templates/organizations/department_list.html:142 +#: templates/organizations/staff_list.html:269 +msgid "Manager" +msgstr "المدير" -#: templates/complaints/complaint_detail.html:674 -#: templates/complaints/complaint_detail.html:689 +#: templates/complaints/complaint_detail.html:959 +#: templates/complaints/inquiry_detail.html:838 +#: templates/components/send_to_modal.html:85 +#: templates/observations/observation_detail.html:954 +msgid "Email Preview" +msgstr "معاينة البريد الإلكتروني" + +#: templates/complaints/complaint_detail.html:959 +#: templates/complaints/inquiry_detail.html:838 +#: templates/components/send_to_modal.html:85 +#: templates/observations/observation_detail.html:954 +msgid "editable" +msgstr "قابل للتعديل" + +#: templates/complaints/complaint_detail.html:966 +#: templates/complaints/inquiry_detail.html:845 +#: templates/components/send_to_modal.html:92 +#: templates/observations/observation_detail.html:961 +msgid "Body" +msgstr "النص" + +#: templates/complaints/complaint_detail.html:976 +#: templates/complaints/inquiry_detail.html:855 +#: templates/observations/observation_detail.html:971 +msgid "Send Escalation Email" +msgstr "إرسال بريد إلكتروني للتصعيد" + +#: templates/complaints/complaint_detail.html:990 +#: templates/complaints/complaint_detail.html:1005 msgid "Close Complaint" msgstr "إغلاق الشكوى" -#: templates/complaints/complaint_detail.html:676 +#: templates/complaints/complaint_detail.html:992 msgid "Close this complaint. This will trigger a satisfaction survey." msgstr "أغلق هذه الشكوى. سيؤدي هذا إلى إرسال استبيان رضا." -#: templates/complaints/complaint_detail.html:681 +#: templates/complaints/complaint_detail.html:997 msgid "Closing Note (Optional)" msgstr "ملاحظة الإغلاق (اختياري)" -#: templates/complaints/complaint_detail.html:682 +#: templates/complaints/complaint_detail.html:998 msgid "Enter closing note..." msgstr "أدخل ملاحظة الإغلاق..." -#: templates/complaints/complaint_detail.html:699 +#: templates/complaints/complaint_detail.html:1019 +msgid "Edit Location Details" +msgstr "تعديل تفاصيل الموقع" + +#: templates/complaints/complaint_detail.html:1021 +msgid "" +"Update where the incident occurred. Leave optional fields blank to clear " +"them." +msgstr "قم بتحديث مكان وقوع الحادثة. اترك الحقول الاختيارية فارغة لمسحها." + +#: templates/complaints/complaint_detail.html:1050 +#: templates/complaints/complaint_form.html:557 +#: templates/complaints/inquiry_form.html:139 +msgid "Department Category" +msgstr "فئة القسم" + +#: templates/complaints/complaint_detail.html:1052 +#: templates/complaints/complaint_form.html:561 +#: templates/complaints/inquiry_form.html:141 +#: templates/complaints/public_complaint_form.html:117 +#: templates/complaints/public_inquiry_form.html:115 +#: templates/complaints/templates/template_form.html:31 +#: templates/core/public_submit.html:408 +#: templates/observations/public_new.html:118 +#: templates/organizations/department_form.html:106 +msgid "Select Category" +msgstr "اختر الفئة" + +#: templates/complaints/complaint_detail.html:1087 +msgid "e.g. CENTER1-2, Gate 3" +msgstr "مثال: CENTER1-2، بوابة 3" + +#: templates/complaints/complaint_detail.html:1093 +msgid "(auto-filled from department if empty)" +msgstr "(يُملأ تلقائيًا من القسم إذا كان فارغًا)" + +#: templates/complaints/complaint_detail.html:1097 +msgid "e.g. GF, 1st Floor, Basement" +msgstr "مثال: طابق أرضي، الطابق الأول، الطابق السفلي" + +#: templates/complaints/complaint_detail.html:1136 +#: templates/complaints/complaint_detail.html:1144 +#: templates/core/public_submit.html:409 +#: templates/observations/public_new.html:72 +#: templates/observations/public_new.html:103 +#: templates/observations/public_new.html:115 +#: templates/observations/public_new.html:131 +#: templates/observations/public_new.html:142 +#: templates/observations/public_new.html:165 +#: templates/observations/public_new.html:184 +#: templates/observations/public_new.html:202 +msgid "optional" +msgstr "اختياري" + +#: templates/complaints/complaint_detail.html:1139 +#: templates/complaints/complaint_detail.html:1236 +#: templates/complaints/complaint_detail.html:1247 +#, fuzzy +#| msgid "Select department" +msgid "Select department first" +msgstr "اختر القسم" + +#: templates/complaints/complaint_detail.html:1141 +#, fuzzy +#| msgid "Sends directly to the department's champion and manager." +msgid "" +"Records the staff as involved. The department champion and manager are " +"notified." +msgstr "يُرسل مباشرة إلى بطل القسم والمدير." + +#: templates/complaints/complaint_detail.html:1145 +#: templates/components/send_to_modal.html:79 +msgid "Add context or instructions..." +msgstr "أضف سياقًا أو تعليمات..." + +#: templates/complaints/complaint_detail.html:1161 msgid "Please activate this complaint first to access this tab." msgstr "يرجى تفعيل هذه الشكوى أولاً للوصول إلى هذا التبويب." +#: templates/complaints/complaint_detail.html:1250 +#: templates/complaints/complaint_form.html:775 +#: templates/complaints/complaint_form.html:813 +#: templates/complaints/complaint_form.html:855 +#: templates/complaints/complaint_form.html:874 +#: templates/complaints/inquiry_detail.html:947 +#: templates/complaints/inquiry_form.html:338 +#: templates/complaints/inquiry_form.html:370 +#: templates/config/user_form.html:469 +#: templates/layouts/partials/topbar.html:60 +#: templates/observations/observation_create.html:172 +#: templates/observations/observation_create.html:199 +#: templates/observations/observation_create.html:250 +#: templates/organizations/staff_form.html:451 +#: templates/physicians/physician_ratings_dashboard.html:468 +#: templates/px_sources/source_user_create_complaint.html:294 +#: templates/px_sources/source_user_create_inquiry.html:189 +#: templates/standards/department_standards.html:471 +#: templates/standards/department_standards.html:714 +#: templates/standards/search.html:579 templates/standards/search.html:615 +#: templates/standards/search.html:747 +#: templates/standards/standard_detail.html:581 +#: templates/standards/standard_detail.html:755 +msgid "Loading..." +msgstr "جارٍ التحميل..." + +#: templates/complaints/complaint_detail.html:1254 +#: templates/complaints/complaint_detail.html:1263 +#, fuzzy +#| msgid "Select Area (optional)" +msgid "Select staff (optional)" +msgstr "اختر المنطقة (اختياري)" + +#: templates/complaints/complaint_detail.html:1282 +#, fuzzy +#| msgid "Patient complaint" +msgid "Send this complaint to" +msgstr "شكوى المريض" + +#: templates/complaints/complaint_detail.html:1282 +#, fuzzy +#| msgid "Only the department champion or manager can collect feedback." +msgid "The department champion and manager will be notified." +msgstr "فقط بطل القسم أو المدير يمكنه جمع الملاحظات." + +#: templates/complaints/complaint_detail.html:1290 +#: templates/components/send_to_modal.html:195 +#: templates/notifications/send_sms_direct.html:108 +#: templates/organizations/staff_detail.html:643 +#: templates/organizations/staff_list.html:547 +#: templates/surveys/manual_send.html:367 +#: templates/surveys/manual_send_phone.html:186 +msgid "Sending..." +msgstr "جاري الإرسال..." + +#: templates/complaints/complaint_detail.html:1305 +#: templates/components/send_to_modal.html:231 +msgid "Failed to send." +msgstr "فشل الإرسال." + +#: templates/complaints/complaint_detail.html:1452 +#: templates/complaints/public_complaint_track.html:275 +msgid "Overdue by" +msgstr "متأخر بمقدار" + +#: templates/complaints/complaint_detail.html:1470 +#: templates/complaints/public_complaint_track.html:293 +msgid "remaining" +msgstr "متبقية" + #: templates/complaints/complaint_form.html:4 -#: templates/layouts/source_user_base.html:153 +#: templates/layouts/source_user_base.html:131 #: templates/px_sources/source_user_dashboard.html:114 msgid "New Complaint" msgstr "شكوى جديدة" @@ -11909,107 +15444,108 @@ msgid "File a new patient complaint with SLA tracking" msgstr "تقديم شكوى مريض جديدة مع تتبع اتفاقية مستوى الخدمة (SLA)" #: templates/complaints/complaint_form.html:382 -#: templates/complaints/explanation_form.html:220 -#: templates/complaints/public_complaint_form.html:497 +#: templates/complaints/explanation_form.html:92 +#: templates/complaints/public_complaint_form.html:271 #: templates/complaints/public_inquiry_form.html:5 -#: templates/complaints/public_inquiry_form.html:117 -#: templates/core/public_submit.html:606 templates/core/public_submit.html:713 -#: templates/core/public_submit.html:995 -#: templates/feedback/feedback_form.html:148 +#: templates/complaints/public_inquiry_form.html:243 +#: templates/components/department_response_modal.html:87 +#: templates/core/public_submit.html:435 #: templates/px_sources/source_user_create_complaint.html:58 #: templates/px_sources/source_user_create_inquiry.html:58 +#: templates/px_sources/source_user_create_observation.html:58 +#: templates/px_sources/source_user_create_suggestion.html:58 msgid "Submitting..." msgstr "جارٍ الإرسال..." -#: templates/complaints/complaint_form.html:394 -#: templates/complaints/inquiry_form.html:271 -#, fuzzy -#| msgid "Patients Ready:" +#: templates/complaints/complaint_form.html:397 +#: templates/complaints/inquiry_form.html:201 msgid "Patient linked:" -msgstr "المرضى جاهزون:" +msgstr "المريض مرتبط:" -#: templates/complaints/complaint_form.html:395 -#: templates/complaints/inquiry_form.html:272 -#, fuzzy -#| msgid "Remove" +#: templates/complaints/complaint_form.html:398 +#: templates/complaints/inquiry_form.html:202 msgid "Remove link" -msgstr "إزالة" +msgstr "إزالة الارتباط" -#: templates/complaints/complaint_form.html:482 +#: templates/complaints/complaint_form.html:408 +#: templates/complaints/complaint_pdf.html:496 +#: templates/journeys/instance_detail.html:323 +#: templates/organizations/patient_detail.html:218 +#: templates/surveys/instance_detail.html:466 +msgid "Patient Information" +msgstr "معلومات المريض" + +#: templates/complaints/complaint_form.html:473 msgid "Organization & Location" msgstr "الجهة والموقع" -#: templates/complaints/complaint_form.html:513 +#: templates/complaints/complaint_form.html:504 msgid "Select if complaint is from a specific PX source" msgstr "اختر إذا كانت الشكوى من مصدر مريض محدد" -#: templates/complaints/complaint_form.html:669 +#: templates/complaints/complaint_form.html:663 msgid "AI Classification" msgstr "تصنيف بالذكاء الاصطناعي" -#: templates/complaints/complaint_form.html:672 +#: templates/complaints/complaint_form.html:666 msgid "AI will automatically analyze and classify your feedback:" msgstr "سيقوم الذكاء الاصطناعي بتحليل وتصنيف ملاحظاتك تلقائيًا:" -#: templates/complaints/complaint_form.html:679 +#: templates/complaints/complaint_form.html:673 msgid "AI-generated title" msgstr "عنوان مُنشأ بواسطة الذكاء الاصطناعي" -#: templates/complaints/complaint_form.html:685 +#: templates/complaints/complaint_form.html:679 msgid "AI-determined category" msgstr "فئة محددة بواسطة الذكاء الاصطناعي" -#: templates/complaints/complaint_form.html:691 +#: templates/complaints/complaint_form.html:685 msgid "AI-calculated severity" msgstr "درجة الخطورة محسوبة بواسطة الذكاء الاصطناعي" -#: templates/complaints/complaint_form.html:697 +#: templates/complaints/complaint_form.html:691 msgid "AI-calculated priority" msgstr "الأولوية محسوبة بواسطة الذكاء الاصطناعي" -#: templates/complaints/complaint_form.html:716 +#: templates/complaints/complaint_form.html:710 msgid "4 hours" msgstr "٤ ساعات" -#: templates/complaints/complaint_form.html:720 +#: templates/complaints/complaint_form.html:714 msgid "24 hours" msgstr "٢٤ ساعة" -#: templates/complaints/complaint_form.html:724 +#: templates/complaints/complaint_form.html:718 msgid "72 hours" msgstr "٧٢ ساعة" -#: templates/complaints/complaint_form.html:728 +#: templates/complaints/complaint_form.html:722 msgid "168 hours (7 days)" msgstr "١٦٨ ساعة (٧ أيام)" -#: templates/complaints/complaint_form.html:781 -#: templates/complaints/complaint_form.html:812 -#: templates/complaints/complaint_form.html:847 -#: templates/layouts/partials/topbar.html:59 -#: templates/organizations/staff_form.html:451 -#: templates/physicians/physician_ratings_dashboard.html:468 -#: templates/standards/department_standards.html:372 -#: templates/standards/department_standards.html:615 -msgid "Loading..." -msgstr "جارٍ التحميل..." +#: templates/complaints/complaint_form.html:795 +#: templates/complaints/inquiry_form.html:358 +#: templates/observations/observation_create.html:193 +msgid "Error loading areas" +msgstr "خطأ في تحميل المناطق" -#: templates/complaints/complaint_form.html:798 +#: templates/complaints/complaint_form.html:832 +#: templates/complaints/inquiry_form.html:390 +#: templates/config/user_form.html:492 +#: templates/observations/observation_create.html:217 #: templates/organizations/staff_form.html:468 msgid "Error loading departments" msgstr "خطأ في تحميل الأقسام" -#: templates/complaints/complaint_form.html:833 -#, fuzzy -#| msgid "Error loading locations" +#: templates/complaints/complaint_form.html:869 +#: templates/px_sources/source_user_create_complaint.html:312 +#: templates/px_sources/source_user_create_inquiry.html:208 msgid "Error loading sections" -msgstr "خطأ في تحميل المواقع" +msgstr "خطأ في تحميل الأقسام" -#: templates/complaints/complaint_form.html:865 -#, fuzzy -#| msgid "Error loading locations" -msgid "Error loading subsections" -msgstr "خطأ في تحميل المواقع" +#: templates/complaints/complaint_form.html:888 +msgid "Error loading staff" +msgstr "خطأ في تحميل بيانات الموظفين" #: templates/complaints/complaint_list.html:4 #: templates/complaints/complaint_list.html:75 @@ -12030,99 +15566,112 @@ msgid "Public Form" msgstr "النموذج العام" #: templates/complaints/complaint_list.html:89 +#: templates/complaints/complaint_list.html:429 +#: templates/complaints/government_ticket_list.html:64 +msgid "Export" +msgstr "تصدير" + +#: templates/complaints/complaint_list.html:92 msgid "New Case" msgstr "حالة جديدة" -#: templates/complaints/complaint_list.html:105 +#: templates/complaints/complaint_list.html:108 msgid "Total Received" msgstr "إجمالي المستلم" -#: templates/complaints/complaint_list.html:138 +#: templates/complaints/complaint_list.html:141 msgid "TAT Alert" msgstr "تنبيه مدة الدورة" -#: templates/complaints/complaint_list.html:156 +#: templates/complaints/complaint_list.html:159 msgid "All Cases" msgstr "جميع الحالات" -#: templates/complaints/complaint_list.html:169 -#: templates/rca/rca_list.html:170 +#: templates/complaints/complaint_list.html:172 +#: templates/feedback/feedback_list.html:144 templates/rca/rca_list.html:170 msgid "Advanced" msgstr "متقدم" -#: templates/complaints/complaint_list.html:212 +#: templates/complaints/complaint_list.html:177 +#: templates/complaints/inquiry_list.html:182 +#: templates/feedback/feedback_list.html:149 +#: templates/projects/project_list.html:157 templates/rca/rca_list.html:219 +msgid "Showing:" +msgstr "يُعرض:" + +#: templates/complaints/complaint_list.html:234 msgid "Complaint ID" msgstr "رقم الشكوى" -#: templates/complaints/complaint_list.html:215 -#: templates/complaints/complaint_pdf.html:550 -#: templates/complaints/sla_management.html:263 -#: templates/dashboard/employee_evaluation.html:883 -#: templates/feedback/feedback_detail.html:658 -#: templates/physicians/doctor_rating_job_list.html:106 -#: templates/physicians/doctor_rating_job_status.html:162 -#: templates/physicians/individual_ratings_list.html:146 -#: templates/physicians/individual_ratings_list.html:188 -#: templates/px_sources/source_user_confirm_delete.html:71 -#: templates/standards/compliance_form.html:149 -#: templates/standards/search.html:101 templates/standards/search.html:164 -#: templates/standards/standard_confirm_delete.html:82 -#: templates/standards/standard_detail.html:112 -msgid "Source" -msgstr "المصدر" +#: templates/complaints/complaint_list.html:240 +#: templates/organizations/department_complaints.html:75 +msgid "SLA" +msgstr "اتفاقية مستوى الخدمة" -#: templates/complaints/complaint_list.html:230 -#: templates/journeys/instance_detail.html:331 -#: templates/organizations/patient_confirm_delete.html:26 -msgid "MRN:" -msgstr "رقم المريض:" - -#: templates/complaints/complaint_list.html:239 +#: templates/complaints/complaint_list.html:271 msgid "View description" msgstr "عرض الوصف" -#: templates/complaints/complaint_list.html:391 -#: templates/complaints/public_complaint_form.html:306 +#: templates/complaints/complaint_list.html:376 +#: templates/complaints/public_complaint_form.html:143 msgid "Complaint Description" msgstr "وصف الشكوى" -#: templates/complaints/complaint_list.html:423 +#: templates/complaints/complaint_list.html:405 +msgid "Export Complaints" +msgstr "تصدير الشكاوى" + +#: templates/complaints/complaint_list.html:406 +msgid "Select date range for export" +msgstr "تحديد نطاق تاريخي للتصدير" + +#: templates/complaints/complaint_list.html:449 msgid "No description available" msgstr "لا يوجد وصف متاح" +#: templates/complaints/complaint_list.html:503 +msgid "Exporting..." +msgstr "جارٍ التصدير..." + +#: templates/complaints/complaint_list.html:526 +msgid "Export failed. Please try again." +msgstr "فشل التصدير. يُرجى المحاولة مرة أخرى." + #: templates/complaints/complaint_pdf.html:7 -#, fuzzy -#| msgid "Complaints Reports" +#: templates/layouts/partials/sidebar.html:609 msgid "Complaint Report" -msgstr "تقارير الشكاوى" +msgstr "تقرير الشكوى" #: templates/complaints/complaint_pdf.html:478 msgid "Ref:" -msgstr "" +msgstr "المرجع:" #: templates/complaints/complaint_pdf.html:509 -#, fuzzy -#| msgid "National ID" msgid "MRN / National ID" -msgstr "رقم الهوية الوطنية" +msgstr "رقم الملف الطبي / الهوية الوطنية" #: templates/complaints/complaint_pdf.html:554 -#, fuzzy -#| msgid "Created At:" msgid "Created Date" -msgstr "تاريخ الإنشاء:" +msgstr "تاريخ الإنشاء" #: templates/complaints/complaint_pdf.html:558 -#: templates/complaints/public_complaint_track.html:197 +#: templates/complaints/public_inquiry_track.html:204 #: templates/complaints/sla_management_form.html:209 +#: templates/organizations/department_complaint_detail.html:146 +#: templates/organizations/department_detail.html:156 +#: templates/organizations/department_detail.html:1311 +#: templates/organizations/department_observation_detail.html:98 +#: templates/organizations/department_staff_detail.html:476 msgid "SLA Deadline" msgstr "الموعد النهائي لاتفاقية مستوى الخدمة (SLA)" #: templates/complaints/complaint_pdf.html:570 -#, fuzzy -#| msgid "Expected Result" msgid "Patient Expected Result" -msgstr "النتيجة المتوقعة" +msgstr "النتيجة المتوقعة للمريض" + +#: templates/complaints/complaint_pdf.html:579 +msgid "Staff Assignment" +msgstr "تعيين الموظف" #: templates/complaints/complaint_pdf.html:590 #: templates/organizations/hierarchy_node.html:21 @@ -12131,152 +15680,131 @@ msgstr "تقارير إلى:" #: templates/complaints/complaint_pdf.html:601 #: templates/complaints/partials/explanation_panel.html:3 -msgid "Staff Explanations" -msgstr "إيضاحات الموظفين" +msgid "Send To Department" +msgstr "إرسال إلى القسم" #: templates/complaints/complaint_pdf.html:607 -#, fuzzy -#| msgid "Unknown" msgid "Unknown Staff" -msgstr "غير معروف" +msgstr "موظف غير معروف" #: templates/complaints/complaint_pdf.html:609 -#, fuzzy -#| msgid "No Manager to Escalate" msgid "Manager - Escalated" -msgstr "لا يوجد مدير للتصعيد إليه" +msgstr "مدير - تم التصعيد" #: templates/complaints/complaint_pdf.html:613 -#, fuzzy -#| msgid "Email Link" msgid "Via Email Link" -msgstr "رابط البريد الإلكتروني" +msgstr "عبر رابط البريد الإلكتروني" #: templates/complaints/complaint_pdf.html:614 -#: templates/complaints/explanation_form.html:166 msgid "Submitted:" msgstr "تم الإرسال:" #: templates/complaints/complaint_pdf.html:626 -#, fuzzy -#| msgid "Add Response" +#: templates/complaints/inquiry_detail.html:206 +#: templates/complaints/partials/explanation_panel.html:24 msgid "Awaiting Response" -msgstr "إضافة رد" +msgstr "في انتظار الرد" #: templates/complaints/complaint_pdf.html:637 -#, fuzzy -#| msgid "Review Date" msgid "Review Notes:" -msgstr "تاريخ المراجعة" +msgstr "ملاحظات المراجعة:" #: templates/complaints/complaint_pdf.html:643 -#, fuzzy -#| msgid "Reviewed by:" msgid "Reviewed by" -msgstr "تمت المراجعة بواسطة:" +msgstr "تمت المراجعة بواسطة" #: templates/complaints/complaint_pdf.html:646 -#, fuzzy, python-format -#| msgid "No attachments" +#, python-format msgid "%(counter)s attachment" msgid_plural "%(counter)s attachments" -msgstr[0] "لا توجد مرفقات" -msgstr[1] "لا توجد مرفقات" -msgstr[2] "لا توجد مرفقات" -msgstr[3] "لا توجد مرفقات" -msgstr[4] "لا توجد مرفقات" -msgstr[5] "لا توجد مرفقات" +msgstr[0] "%(counter)s مرفق" +msgstr[1] "%(counter)s مرفقين" +msgstr[2] "%(counter)s مرفقات" +msgstr[3] "%(counter)s مرفقًا" +msgstr[4] "%(counter)s مرفقاً" +msgstr[5] "%(counter)s مرفق" #: templates/complaints/complaint_pdf.html:651 -#, fuzzy -#| msgid "Explanation Submitted" msgid "Explanation not yet submitted." -msgstr "تم تقديم الإيضاح" +msgstr "لم يتم تقديم الشرح بعد." #: templates/complaints/complaint_pdf.html:651 -#, fuzzy -#| msgid "Requires Attention" msgid "Request sent on" -msgstr "يتطلب الانتباه" +msgstr "تم إرسال الطلب في" #: templates/complaints/complaint_pdf.html:666 -#: templates/complaints/inquiry_detail.html:313 -#: templates/complaints/inquiry_detail.html:795 -#: templates/complaints/partials/ai_panel.html:23 -#: templates/complaints/partials/ai_panel.html:195 +#: templates/complaints/inquiry_detail.html:1031 +#: templates/complaints/partials/ai_panel.html:25 +#: templates/complaints/partials/ai_panel.html:202 #: templates/observations/partials/ai_panel.html:11 msgid "Emotion Analysis" msgstr "تحليل المشاعر" #: templates/complaints/complaint_pdf.html:672 -#, fuzzy -#| msgid "Confidence" +#: templates/social/comment_detail.html:150 msgid "Confidence:" -msgstr "الثقة" +msgstr "مستوى الثقة:" #: templates/complaints/complaint_pdf.html:676 -#: templates/complaints/inquiry_detail.html:323 -#: templates/complaints/inquiry_detail.html:801 -#: templates/complaints/partials/ai_panel.html:35 -#: templates/complaints/partials/ai_panel.html:200 +#: templates/complaints/inquiry_detail.html:167 +#: templates/complaints/inquiry_detail.html:1031 +#: templates/complaints/partials/ai_panel.html:37 +#: templates/complaints/partials/ai_panel.html:207 #: templates/observations/partials/ai_panel.html:23 msgid "Intensity" msgstr "الشدة" #: templates/complaints/complaint_pdf.html:687 +#: templates/complaints/inquiry_detail.html:259 +#: templates/complaints/inquiry_detail.html:617 +#: templates/complaints/inquiry_detail.html:769 +#: templates/observations/observation_detail.html:278 +#: templates/observations/observation_detail.html:860 +#: templates/organizations/department_detail.html:1315 +#: templates/organizations/department_staff_detail.html:480 msgid "AI Summary" msgstr "ملخص الذكاء الاصطناعي" #: templates/complaints/complaint_pdf.html:699 -#: templates/complaints/partials/ai_panel.html:106 +#: templates/complaints/partials/ai_panel.html:108 #: templates/observations/partials/ai_panel.html:93 msgid "Suggested Action" msgstr "الإجراء المقترح" #: templates/complaints/complaint_pdf.html:711 -#, fuzzy -#| msgid "Reason" msgid "AI Reasoning" -msgstr "السبب" +msgstr "الاستدلال بالذكاء الاصطناعي" #: templates/complaints/complaint_pdf.html:722 -#: templates/complaints/partials/actions_panel.html:3 +#: templates/complaints/partials/actions_panel.html:4 msgid "Related PX Actions" msgstr "إجراءات PX المرتبطة" #: templates/complaints/complaint_pdf.html:743 -#: templates/complaints/partials/resolution_panel.html:9 +#: templates/complaints/partials/resolution_panel.html:10 msgid "Complaint Resolved" msgstr "تم حل الشكوى" #: templates/complaints/complaint_pdf.html:754 -#: templates/complaints/partials/resolution_panel.html:40 +#: templates/complaints/partials/resolution_panel.html:41 msgid "Resolved by:" msgstr "تم الحل بواسطة:" #: templates/complaints/complaint_pdf.html:756 -#, fuzzy -#| msgid "Resolved:" msgid "Resolved on:" -msgstr "المحلولة:" +msgstr "تم الحل في:" #: templates/complaints/complaint_pdf.html:780 -#, fuzzy -#| msgid "PX360 - Patient Experience Management" msgid "PX360 Patient Experience Management" -msgstr "PX360 - إدارة تجربة المريض" +msgstr "PX360 إدارة تجربة المريض" #: templates/complaints/complaint_pdf.html:781 -#, fuzzy -#| msgid "This is an automated notification from the PX 360 system." msgid "This report was generated automatically from the PX360 system." -msgstr "هذه إشعار آلي من نظام PX 360." +msgstr "تم إنشاء هذا التقرير تلقائيًا من نظام PX360." #: templates/complaints/complaint_pdf.html:782 -#, fuzzy -#| msgid "All rights reserved." msgid "AlHammadi Group. All rights reserved." -msgstr "جميع الحقوق محفوظة." +msgstr "مجموعة الحمادي. جميع الحقوق محفوظة." #: templates/complaints/complaint_threshold_form.html:4 #: templates/complaints/complaint_threshold_list.html:4 @@ -12333,7 +15861,7 @@ msgid "Action to Take" msgstr "الإجراء المتخذ" #: templates/complaints/complaint_threshold_form.html:279 -#: templates/dashboard/my_dashboard.html:251 +#: templates/dashboard/my_dashboard.html:320 msgid "Select Action" msgstr "اختر الإجراء" @@ -12370,9 +15898,10 @@ msgstr "ملاحظات اختيارية حول هذا الحد" #: templates/complaints/complaint_threshold_form.html:394 #: templates/complaints/escalation_rule_form.html:423 #: templates/projects/template_form.html:229 -#: templates/standards/category_form.html:157 +#: templates/standards/activity_type_form.html:146 +#: templates/standards/category_form.html:177 #: templates/standards/source_form.html:168 -#: templates/standards/standard_form.html:287 +#: templates/standards/standard_form.html:357 msgid "Help" msgstr "مساعدة" @@ -12400,29 +15929,14 @@ msgstr "يومي" msgid "Monitor daily complaint volume" msgstr "مراقبة عدد الشكاوى اليومي" -#: templates/complaints/complaint_threshold_form.html:413 -#: templates/complaints/complaint_threshold_list.html:211 -msgid "Weekly" -msgstr "أسبوعي" - #: templates/complaints/complaint_threshold_form.html:413 msgid "Monitor weekly complaint volume" msgstr "مراقبة عدد الشكاوى الأسبوعي" -#: templates/complaints/complaint_threshold_form.html:417 -#: templates/complaints/complaint_threshold_list.html:212 -msgid "Monthly" -msgstr "شهري" - #: templates/complaints/complaint_threshold_form.html:417 msgid "Monitor monthly complaint volume" msgstr "مراقبة عدد الشكاوى الشهري" -#: templates/complaints/complaint_threshold_form.html:421 -#: templates/complaints/complaint_threshold_list.html:213 -msgid "By Category" -msgstr "حسب الفئة" - #: templates/complaints/complaint_threshold_form.html:421 msgid "Monitor specific complaint categories" msgstr "مراقبة فئات شكاوى محددة" @@ -12478,7 +15992,8 @@ msgid "All Thresholds" msgstr "جميع العتبات" #: templates/complaints/complaint_threshold_list.html:255 -#: templates/dashboard/employee_evaluation.html:1341 +#: templates/dashboard/employee_evaluation.html:1423 +#: templates/dashboard/employee_evaluation_charts.html:268 #: templates/surveys/analytics_dashboard.html:85 msgid "Metric" msgstr "المؤشر" @@ -12491,11 +16006,13 @@ msgstr "هل أنت متأكد من رغبتك في حذف هذا الحد؟" #, python-format msgid "" "\n" -" Showing %(start)s to %(end)s of %(total)s thresholds\n" +" Showing %(start)s to %(end)s of %(total)s " +"thresholds\n" " " msgstr "" "\n" -" عرض %(start)s إلى %(end)s من %(total)s عتبات " +" عرض %(start)s إلى %(end)s من %(total)s " +"عتبات " #: templates/complaints/complaint_threshold_list.html:362 msgid "No thresholds found" @@ -12505,6 +16022,83 @@ msgstr "لم يتم العثور على عتبات" msgid "Create your first threshold to get started" msgstr "قم بإنشاء أول عتبة للبدء" +#: templates/complaints/emails/new_complaint_admin_en.html:9 +#: templates/config/emails/reset_password_email.html:9 +#: templates/config/emails/user_created_email.html:9 +#: templates/emails/appointment_confirmation.html:9 +#: templates/emails/explanation_reminder.html:9 +#: templates/emails/explanation_request.html:9 +#: templates/emails/explanation_second_reminder.html:9 +#: templates/emails/inquiry_dept_response_escalation.html:9 +#: templates/emails/inquiry_dept_response_reminder.html:9 +#: templates/emails/inquiry_explanation_request.html:9 +#: templates/emails/invitation_expired.html:9 +#: templates/emails/new_appreciation_notification.html:9 +#: templates/emails/new_complaint_admin_notification.html:9 +#: templates/emails/new_inquiry_notification.html:9 +#: templates/emails/new_observation_notification.html:9 +#: templates/emails/new_suggestion_notification.html:9 +#: templates/emails/observation_assigned.html:9 +#: templates/emails/observation_dept_response_escalation.html:9 +#: templates/emails/observation_dept_response_reminder.html:9 +#: templates/emails/observation_monthly_followup.html:9 +#: templates/emails/observation_resolved.html:9 +#: templates/emails/observation_sla_reminder.html:9 +#: templates/emails/observation_sla_second_reminder.html:9 +#: templates/emails/sla_reminder.html:9 +#: templates/emails/sla_second_reminder.html:9 +#: templates/emails/survey_invitation.html:9 +#: templates/emails/survey_results_notification.html:9 +#: templates/organizations/emails/staff_credentials.html:9 +msgid "Dear" +msgstr "عزيزي/عزيزتي" + +#: templates/complaints/emails/new_complaint_admin_en.html:13 +msgid "A new complaint has been submitted and requires your attention." +msgstr "تم تقديم شكوى جديدة وتتطلب اهتمامك." + +#: templates/complaints/emails/new_complaint_admin_en.html:16 +#: templates/complaints/explanation_already_submitted.html:55 +#: templates/complaints/inquiry_explanation_form.html:95 +#: templates/emails/explanation_reminder.html:16 +#: templates/emails/explanation_request.html:20 +#: templates/emails/explanation_second_reminder.html:20 +#: templates/emails/inquiry_dept_response_escalation.html:16 +#: templates/emails/inquiry_dept_response_reminder.html:16 +#: templates/emails/inquiry_explanation_request.html:13 +#: templates/emails/public_inquiry_notification.html:12 +#: templates/emails/sla_reminder.html:22 +#: templates/emails/sla_second_reminder.html:22 +msgid "Reference:" +msgstr "المرجع:" + +#: templates/complaints/emails/new_complaint_admin_en.html:21 +#: templates/emails/appointment_confirmation.html:16 +msgid "Patient Name:" +msgstr "اسم المريض:" + +#: templates/complaints/emails/new_complaint_admin_en.html:27 +msgid "Source:" +msgstr "المصدر:" + +#: templates/complaints/emails/new_complaint_admin_en.html:30 +#: templates/emails/explanation_reminder.html:19 +#: templates/emails/explanation_request.html:26 +#: templates/emails/explanation_second_reminder.html:23 +#: templates/emails/observation_assigned.html:34 +#: templates/journeys/template_detail.html:81 +msgid "Description:" +msgstr "الوصف:" + +#: templates/complaints/emails/new_complaint_admin_en.html:35 +msgid "Action Required:" +msgstr "الإجراء المطلوب:" + +#: templates/complaints/emails/new_complaint_admin_en.html:35 +#: templates/emails/new_complaint_admin_notification.html:30 +msgid "Please review and activate this complaint at your earliest convenience." +msgstr "يرجى مراجعة وتفعيل هذه الشكوى في أقرب وقت مناسب لك." + #: templates/complaints/escalation_rule_form.html:4 #: templates/complaints/escalation_rule_list.html:4 #: templates/complaints/escalation_rule_list.html:220 @@ -12601,8 +16195,8 @@ msgid "" "Escalation rules automatically reassign complaints to higher-level staff " "when they exceed specified time thresholds." msgstr "" -"تعيد قواعد التصعيد تعيين الشكاوى تلقائيًا إلى موظفين ذوي مستوى أعلى عند " -"تجاوز المهل الزمنية المحددة." +"تعيد قواعد التصعيد تعيين الشكاوى تلقائيًا إلى موظفين ذوي مستوى أعلى عند تجاوز " +"المهل الزمنية المحددة." #: templates/complaints/escalation_rule_form.html:434 msgid "Level 1: Escalate to department head" @@ -12656,6 +16250,12 @@ msgstr "جميع المستويات" msgid "All Escalation Rules" msgstr "جميع قواعد التصعيد" +#: templates/complaints/escalation_rule_list.html:288 +#: templates/complaints/escalation_rule_list.html:306 +#: templates/dashboard/command_center.html:528 +msgid "Level" +msgstr "المستوى" + #: templates/complaints/escalation_rule_list.html:360 msgid "Are you sure you want to delete this escalation rule?" msgstr "هل أنت متأكد من رغبتك في حذف قاعدة التصعيد هذه؟" @@ -12668,7 +16268,8 @@ msgid "" " " msgstr "" "\n" -" عرض %(start)s إلى %(end)s من %(total)s قواعد " +" عرض %(start)s إلى %(end)s من %(total)s " +"قواعد " #: templates/complaints/escalation_rule_list.html:410 msgid "No escalation rules found" @@ -12683,50 +16284,39 @@ msgid "Create Escalation Rule" msgstr "إنشاء قاعدة تصعيد" # Explanation Status -#: templates/complaints/explanation_already_submitted.html:7 -#: templates/complaints/explanation_already_submitted.html:43 -#: templates/complaints/explanation_already_submitted.html:96 +#: templates/complaints/explanation_already_submitted.html:8 +#: templates/complaints/explanation_already_submitted.html:38 +#: templates/complaints/explanation_already_submitted.html:91 +#: templates/complaints/inquiry_explanation_already_submitted.html:8 +#: templates/complaints/investigation_already_submitted.html:8 +#: templates/complaints/investigation_already_submitted.html:27 msgid "Already Submitted" msgstr "تم الإرسال مسبقًا" -#: templates/complaints/explanation_already_submitted.html:49 +#: templates/complaints/explanation_already_submitted.html:44 msgid "" "This explanation link has already been used. Each explanation link can only " "be used once." msgstr "" -"تم استخدام رابط الإيضاح هذا مسبقًا. يمكن استخدام كل رابط إيضاح مرة واحدة " -"فقط." +"تم استخدام رابط الإيضاح هذا مسبقًا. يمكن استخدام كل رابط إيضاح مرة واحدة فقط." -#: templates/complaints/explanation_already_submitted.html:56 +#: templates/complaints/explanation_already_submitted.html:51 msgid "Complaint Information" msgstr "معلومات الشكوى" -#: templates/complaints/explanation_already_submitted.html:60 -#: templates/complaints/explanation_form.html:196 -#: templates/complaints/explanation_success.html:61 -#: templates/emails/explanation_reminder.html:35 -#: templates/emails/explanation_request.html:30 -#: templates/emails/explanation_second_reminder.html:38 -#: templates/emails/public_inquiry_notification.html:32 -#: templates/emails/sla_reminder.html:47 -#: templates/emails/sla_second_reminder.html:50 -msgid "Reference:" -msgstr "المرجع:" - -#: templates/complaints/explanation_already_submitted.html:69 -#: templates/complaints/explanation_success.html:69 +#: templates/complaints/explanation_already_submitted.html:64 msgid "Submitted On:" msgstr "تاريخ الإرسال:" -#: templates/complaints/explanation_already_submitted.html:75 +#: templates/complaints/explanation_already_submitted.html:70 msgid "Submitted By:" msgstr "تم الإرسال بواسطة:" -#: templates/complaints/explanation_already_submitted.html:86 +#: templates/complaints/explanation_already_submitted.html:81 msgid "What If You Need To Update?" msgstr "ماذا لو احتجت إلى التحديث؟" -#: templates/complaints/explanation_already_submitted.html:89 +#: templates/complaints/explanation_already_submitted.html:84 msgid "" "If you need to provide additional information or make changes to your " "explanation, please contact the PX team directly." @@ -12734,401 +16324,1116 @@ msgstr "" "إذا كنت بحاجة إلى تقديم معلومات إضافية أو إجراء تعديلات على الإيضاح، يرجى " "التواصل مباشرة مع فريق PX." -#: templates/complaints/explanation_already_submitted.html:95 -#: templates/complaints/explanation_success.html:105 +#: templates/complaints/explanation_already_submitted.html:90 msgid "Explanation ID:" msgstr "رقم الإيضاح:" -#: templates/complaints/explanation_already_submitted.html:99 +#: templates/complaints/explanation_already_submitted.html:94 msgid "This link cannot be used again." msgstr "لا يمكن استخدام هذا الرابط مرة أخرى." -#: templates/complaints/explanation_already_submitted.html:106 -#: templates/complaints/explanation_form.html:100 -#: templates/complaints/explanation_form.html:285 -#: templates/complaints/explanation_success.html:113 +#: templates/complaints/explanation_already_submitted.html:101 +#: templates/complaints/investigation_already_started.html:36 +#: templates/complaints/investigation_already_submitted.html:44 +#: templates/complaints/investigation_error.html:26 +#: templates/complaints/investigation_success.html:39 msgid "PX360 Complaint Management System" msgstr "نظام PX360 لإدارة الشكاوى" -#: templates/complaints/explanation_form.html:7 -#: templates/complaints/explanation_form.html:279 -#: templates/complaints/partials/staff_panel.html:69 -msgid "Submit Explanation" -msgstr "تقديم الإيضاح" +#: templates/complaints/explanation_form.html:25 +#: templates/complaints/explanation_success.html:22 +#: templates/complaints/investigation_already_started.html:18 +#: templates/complaints/investigation_already_submitted.html:18 +#: templates/complaints/investigation_questions.html:36 +#: templates/complaints/investigation_review.html:24 +#, fuzzy +#| msgid "Back to Department Standards" +msgid "Back to Department" +msgstr "العودة إلى معايير القسم" -#: templates/complaints/explanation_form.html:99 -#: templates/emails/explanation_reminder.html:102 -#: templates/emails/explanation_request.html:70 -msgid "Submit Your Explanation" -msgstr "تقديم إيضاحك" +#: templates/complaints/explanation_form.html:74 +msgid "How would you like to respond?" +msgstr "كيف ترغب في الرد؟" -#: templates/complaints/explanation_form.html:119 -msgid "Requested From" -msgstr "تم الطلب من" +#: templates/complaints/explanation_form.html:78 +msgid "Submit Reply" +msgstr "إرسال الرد" -#: templates/complaints/explanation_form.html:157 -msgid "Original Staff Explanation" -msgstr "شرح الموظف الأصلي" +#: templates/complaints/explanation_form.html:97 +#: templates/complaints/inquiry_detail.html:651 +#: templates/complaints/inquiry_explanation_form.html:120 +#: templates/components/department_response_modal.html:23 +#: templates/observations/observation_detail.html:894 +msgid "Your Response" +msgstr "ردك" -#: templates/complaints/explanation_form.html:174 -msgid "Escalation Notes:" -msgstr "ملاحظات التصعيد:" +#: templates/complaints/explanation_form.html:105 +#: templates/complaints/inquiry_explanation_form.html:124 +msgid "Write your response here..." +msgstr "اكتب ردك هنا..." -#: templates/complaints/explanation_form.html:182 -msgid "" -"As the manager, please review the above explanation from your team member " -"and provide your own perspective on this complaint." -msgstr "" -"بصفتك المدير، يرجى مراجعة الشرح المذكور أعلاه من فريقك وتقديم وجهة نظرك " -"الخاصة بشأن هذه الشكوى." - -#: templates/complaints/explanation_form.html:214 -#: templates/emails/explanation_reminder.html:52 -#: templates/emails/explanation_request.html:56 -#: templates/emails/explanation_second_reminder.html:55 -#: templates/journeys/template_detail.html:81 -msgid "Description:" -msgstr "الوصف:" - -#: templates/complaints/explanation_form.html:226 -msgid "Your Explanation" -msgstr "إيضاحك" - -#: templates/complaints/explanation_form.html:229 -msgid "" -"Please provide your perspective about the complaint mentioned above. Your " -"explanation will help us understand the situation better." -msgstr "" -"يرجى توضيح وجهة نظرك حول الشكوى المذكورة أعلاه. سيساعدنا إيضاحك على فهم " -"الوضع بشكل أفضل." - -#: templates/complaints/explanation_form.html:237 -msgid "Write your explanation here..." -msgstr "اكتب إيضاحك هنا..." - -#: templates/complaints/explanation_form.html:244 +#: templates/complaints/explanation_form.html:111 +#: templates/complaints/inquiry_explanation_form.html:127 +#: templates/complaints/investigation_respond.html:106 msgid "Attachments (Optional)" msgstr "المرفقات (اختياري)" -#: templates/complaints/explanation_form.html:247 -msgid "" -"You can attach relevant documents, images, or other files to support your " -"explanation." -msgstr "يمكنك إرفاق مستندات أو صور أو ملفات أخرى ذات صلة لدعم إيضاحك." +#: templates/complaints/explanation_form.html:122 +#: templates/complaints/investigation_respond.html:111 +#, fuzzy +#| msgid "This link is unique and can only be used once" +msgid "This link can only be used once." +msgstr "هذا الرابط فريد ويمكن استخدامه مرة واحدة فقط" -#: templates/complaints/explanation_form.html:259 +#: templates/complaints/explanation_form.html:126 +#, fuzzy +#| msgid "Submitted" +msgid "Submit" +msgstr "تم الإرسال" + +#: templates/complaints/explanation_success.html:35 +#: templates/complaints/inquiry_explanation_success.html:8 +#: templates/complaints/inquiry_response_success_token.html:4 +#: templates/complaints/inquiry_response_success_token.html:13 +#: templates/complaints/investigation_success.html:8 +#: templates/observations/response_success_token.html:4 +#: templates/observations/response_success_token.html:13 +msgid "Response Submitted" +msgstr "تم إرسال الرد" + +#: templates/complaints/explanation_success.html:36 +#, fuzzy +#| msgid "Response approved and forwarded to the PX team." +msgid "Your response has been received and forwarded to the PX team." +msgstr "تمت الموافقة على الاستجابة وإرسالها إلى فريق PX." + +#: templates/complaints/explanation_success.html:42 +#: templates/complaints/inquiry_department_response.html:27 +#: templates/complaints/inquiry_list.html:189 +#: templates/complaints/investigation_respond.html:34 +#: templates/complaints/trash_list.html:36 +#: templates/components/department_response_modal.html:15 +#: templates/config/deleted_items.html:36 +#: templates/config/deleted_items.html:122 templates/core/public_track.html:397 +#: templates/dashboard/complaint_quarterly_report.html:641 +#: templates/emails/new_appreciation_notification.html:16 +#: templates/emails/new_complaint_admin_notification.html:16 +#: templates/emails/new_inquiry_notification.html:16 +#: templates/emails/new_suggestion_notification.html:16 +#: templates/observations/observation_department_response.html:27 +#: templates/observations/observation_list.html:297 +#: templates/organizations/department_complaints.html:68 +#: templates/organizations/department_detail.html:154 +#: templates/organizations/department_detail.html:700 +#: templates/organizations/department_detail.html:768 +#: templates/organizations/department_detail.html:892 +#: templates/organizations/department_detail.html:949 +#: templates/organizations/department_inquiries.html:66 +#: templates/organizations/department_manager_review.html:55 +#: templates/organizations/department_staff_detail.html:213 +#: templates/px_sources/source_detail.html:256 +#: templates/px_sources/source_detail.html:322 +#: templates/px_sources/source_detail.html:394 +#: templates/px_sources/source_detail.html:476 +#: templates/px_sources/source_user_complaint_list.html:182 +#: templates/px_sources/source_user_dashboard.html:192 +#: templates/px_sources/source_user_dashboard.html:285 +#: templates/px_sources/source_user_inquiry_list.html:170 +msgid "Reference" +msgstr "المرجع" + +#: templates/complaints/government_ticket_detail.html:104 +#: templates/complaints/government_ticket_form.html:172 +msgid "Complainant Information" +msgstr "بيانات مقدم الشكوى" + +#: templates/complaints/government_ticket_detail.html:115 +msgid "Contact Number" +msgstr "رقم الاتصال" + +#: templates/complaints/government_ticket_detail.html:124 +msgid "Location & Section" +msgstr "الموقع والقسم" + +#: templates/complaints/government_ticket_detail.html:140 +#: templates/complaints/government_ticket_form.html:230 +msgid "Ticket Content" +msgstr "محتوى التذكرة" + +#: templates/complaints/government_ticket_detail.html:143 +msgid "Classification:" +msgstr "التصنيف:" + +#: templates/complaints/government_ticket_detail.html:162 +msgid "Edit Ticket" +msgstr "تعديل التذكرة" + +#: templates/complaints/government_ticket_detail.html:168 +msgid "Convert to Complaint" +msgstr "تحويل إلى شكوى" + +#: templates/complaints/government_ticket_detail.html:186 +#: templates/complaints/government_ticket_import.html:167 +msgid "Received Date" +msgstr "تاريخ الاستلام" + +#: templates/complaints/government_ticket_form.html:4 +#: templates/complaints/government_ticket_form.html:92 +msgid "Create Government Ticket" +msgstr "إنشاء تذكرة حكومية" + +#: templates/complaints/government_ticket_form.html:4 +#: templates/complaints/government_ticket_form.html:92 +msgid "Edit Government Ticket" +msgstr "تعديل التذكرة الحكومية" + +#: templates/complaints/government_ticket_form.html:93 +msgid "Create a new ticket from a government source" +msgstr "إنشاء تذكرة جديدة من مصدر حكومي" + +#: templates/complaints/government_ticket_form.html:93 +msgid "Update ticket information" +msgstr "تحديث معلومات التذكرة" + +#: templates/complaints/government_ticket_form.html:110 +#: templates/config/user_form.html:138 +msgid "Please correct the errors below" +msgstr "يرجى تصحيح الأخطاء أدناه" + +#: templates/complaints/government_ticket_form.html:124 +msgid "Please correct the highlighted fields below" +msgstr "يرجى تصحيح الحقول المظللة أدناه" + +#: templates/complaints/government_ticket_form.html:134 +msgid "Source & Ticket Info" +msgstr "معلومات المصدر والتذكرة" + +#: templates/complaints/government_ticket_form.html:197 +msgid "Department & Section" +msgstr "القسم والشعبة" + +#: templates/complaints/government_ticket_form.html:254 +#: templates/complaints/government_ticket_list.html:67 +msgid "Create Ticket" +msgstr "إنشاء تذكرة" + +#: templates/complaints/government_ticket_form.html:254 +msgid "Update Ticket" +msgstr "تحديث التذكرة" + +#: templates/complaints/government_ticket_import.html:4 +#: templates/complaints/government_ticket_import.html:86 +msgid "Import Government Tickets" +msgstr "استيراد التذاكر الحكومية" + +#: templates/complaints/government_ticket_import.html:87 +msgid "Upload Excel file to import tickets from government sources" +msgstr "قم برفع ملف Excel لاستيراد التذاكر من المصادر الحكومية" + +#: templates/complaints/government_ticket_import.html:101 +msgid "Upload File" +msgstr "رفع ملف" + +#: templates/complaints/government_ticket_import.html:112 +#: templates/physicians/doctor_rating_import.html:56 +msgid "Instructions" +msgstr "التعليمات" + +#: templates/complaints/government_ticket_import.html:114 +msgid "Upload an Excel file (.xlsx) with the following columns:" +msgstr "رفع ملف Excel (.xlsx) يحتوي على الأعمدة التالية:" + +#: templates/complaints/government_ticket_import.html:116 +msgid "رقم التذكرة (Ticket Number) - Required" +msgstr "رقم التذكرة (Ticket Number) - مطلوب" + +#: templates/complaints/government_ticket_import.html:117 +msgid "اسم المشتكي (Complainant Name) - Required" +msgstr "اسم المشتكي - مطلوب" + +#: templates/complaints/government_ticket_import.html:118 +msgid "رقم الهوية (National ID)" +msgstr "رقم الهوية (National ID)" + +#: templates/complaints/government_ticket_import.html:119 +msgid "رقم التواصل (Contact Number)" +msgstr "رقم التواصل" + +#: templates/complaints/government_ticket_import.html:120 +msgid "الموقع (Location)" +msgstr "الموقع" + +#: templates/complaints/government_ticket_import.html:121 +msgid "القسم الرئيسي (Main Section)" +msgstr "القسم الرئيسي" + +#: templates/complaints/government_ticket_import.html:122 +msgid "القسم الفرعي (Subsection)" +msgstr "القسم الفرعي" + +#: templates/complaints/government_ticket_import.html:123 +msgid "تاريخ إنشاء التذكرة (Creation Date)" +msgstr "تاريخ إنشاء التذكرة" + +#: templates/complaints/government_ticket_import.html:124 +msgid "وقت إنشاء التذكرة (Creation Time)" +msgstr "وقت إنشاء التذكرة" + +#: templates/complaints/government_ticket_import.html:125 +msgid "تصنيف الشكوى (Classification)" +msgstr "تصنيف الشكوى" + +#: templates/complaints/government_ticket_import.html:126 +msgid "محتوى الشكوى (Content) - Required" +msgstr "محتوى الشكوى - مطلوب" + +#: templates/complaints/government_ticket_import.html:127 +msgid "حالة الشكوى (Status)" +msgstr "حالة الشكوى" + +#: templates/complaints/government_ticket_import.html:128 +msgid "اسم الموظف (Assigned Staff)" +msgstr "اسم الموظف (Assigned Staff)" + +#: templates/complaints/government_ticket_import.html:130 msgid "" -"Accepted file types: PDF, DOC, DOCX, JPG, PNG, etc. Maximum file size: 10MB." +"Note: The header row should be on the second row (row 2) of the Excel file." +msgstr "ملاحظة: يجب أن يكون صف الرأس في الصف الثاني (الصف 2) من ملف Excel." + +#: templates/complaints/government_ticket_import.html:137 +msgid "Select Excel File" +msgstr "اختيار ملف Excel" + +#: templates/complaints/government_ticket_import.html:144 +msgid "Preview" +msgstr "معاينة" + +#: templates/complaints/government_ticket_import.html:156 +msgid "Preview (First 5 Rows)" +msgstr "معاينة (أول 5 صفوف)" + +#: templates/complaints/government_ticket_import.html:162 +#: templates/complaints/government_ticket_list.html:141 +msgid "Ticket #" +msgstr "رقم التذكرة" + +#: templates/complaints/government_ticket_import.html:163 +#: templates/complaints/government_ticket_list.html:143 +msgid "Complainant" +msgstr "المشتكي" + +#: templates/complaints/government_ticket_import.html:194 +msgid "Confirm Import" +msgstr "تأكيد الاستيراد" + +#: templates/complaints/government_ticket_import.html:209 +#: templates/feedback/comment_import_list.html:76 +#: templates/organizations/staff_import.html:251 +msgid "Errors" +msgstr "أخطاء" + +#: templates/complaints/government_ticket_list.html:55 +msgid "Government Source Tickets" +msgstr "تذاكر المصادر الحكومية" + +#: templates/complaints/government_ticket_list.html:56 +msgid "Manage tickets from MOH, CCHI, and other government sources" msgstr "" -"أنواع الملفات المقبولة: PDF، DOC، DOCX، JPG، PNG، وغيرها. الحد الأقصى لحجم " -"الملف: 10 ميجابايت." +"إدارة التذاكر الواردة من وزارة الصحة ومجلس الضمان الصحي التعاوني والمصادر " +"الحكومية الأخرى" -#: templates/complaints/explanation_form.html:268 -msgid "Important Note:" -msgstr "ملاحظة مهمة:" +#: templates/complaints/government_ticket_list.html:60 +#: templates/organizations/staff_import.html:34 +#: templates/organizations/staff_list.html:124 +#: templates/physicians/doctor_rating_review.html:332 +msgid "Import" +msgstr "استيراد" -#: templates/complaints/explanation_form.html:270 -msgid "" -"This link can only be used once. After submitting your explanation, it will " -"expire and cannot be used again." -msgstr "" -"يمكن استخدام هذا الرابط مرة واحدة فقط. بعد تقديم الإيضاح، ستنتهي صلاحيته ولا" -" يمكن استخدامه مرة أخرى." +#: templates/complaints/government_ticket_list.html:79 +msgid "Ticket #, name, ID..." +msgstr "رقم التذكرة، الاسم، الهوية..." -#: templates/complaints/explanation_form.html:293 -msgid "Secure token-based submission" -msgstr "إرسال مضمّن بالرمز الآمن" +#: templates/complaints/government_ticket_list.html:85 +#: templates/dashboard/standards_dashboard.html:38 +#: templates/layouts/partials/sidebar.html:522 +#: templates/physicians/individual_ratings_list.html:148 +#: templates/px_sources/source_list.html:153 +#: templates/reports/saved_reports.html:62 templates/standards/search.html:105 +msgid "All Sources" +msgstr "جميع المصادر" -#: templates/complaints/explanation_success.html:7 -#: templates/complaints/partials/staff_panel.html:46 -msgid "Explanation Submitted" -msgstr "تم تقديم الإيضاح" +#: templates/complaints/government_ticket_list.html:114 +msgid "Not Converted" +msgstr "لم يتم التحويل" -#: templates/complaints/explanation_success.html:44 -msgid "Explanation Submitted Successfully!" -msgstr "تم تقديم الإيضاح بنجاح!" +#: templates/complaints/government_ticket_list.html:135 +msgid "Tickets" +msgstr "التذاكر" -#: templates/complaints/explanation_success.html:50 -msgid "" -"Thank you for providing your explanation. It has been received and will be " -"reviewed by the PX team." -msgstr "شكرًا لتقديمك الإيضاح. تم استلامه وسيتم مراجعته من قبل فريق PX." +#: templates/complaints/government_ticket_list.html:204 +msgid "No government tickets found" +msgstr "لم يتم العثور على تذاكر حكومية" -#: templates/complaints/explanation_success.html:57 -msgid "Complaint Summary" -msgstr "ملخص الشكوى" +#: templates/complaints/inquiry_department_response.html:23 +#: templates/components/department_response_modal.html:7 +#: templates/emails/explanation_request.html:34 +#: templates/observations/observation_department_response.html:23 +msgid "Submit Department Response" +msgstr "تقديم رد القسم" -#: templates/complaints/explanation_success.html:74 -msgid "Attachments:" -msgstr "المرفقات:" +#: templates/complaints/inquiry_department_response.html:53 +#: templates/complaints/inquiry_response_form_token.html:37 +#: templates/observations/observation_department_response.html:49 +#: templates/observations/response_form_token.html:38 +msgid "Response (English)" +msgstr "الرد (English)" -#: templates/complaints/explanation_success.html:85 -#: templates/complaints/public_complaint_success.html:102 -msgid "What Happens Next?" -msgstr "ماذا بعد؟" +#: templates/complaints/inquiry_department_response.html:57 +#: templates/complaints/inquiry_response_form_token.html:38 +#: templates/observations/observation_department_response.html:53 +#: templates/observations/response_form_token.html:39 +msgid "Enter your response in English..." +msgstr "أدخل ردك باللغة الإنجليزية..." -#: templates/complaints/explanation_success.html:90 -msgid "Your explanation will be reviewed by the complaint assignee" -msgstr "سيتم مراجعة إيضاحك من قبل المسؤول عن الشكوى" +#: templates/complaints/inquiry_department_response.html:62 +#: templates/complaints/inquiry_response_form_token.html:41 +#: templates/observations/observation_department_response.html:58 +#: templates/observations/response_form_token.html:42 +msgid "Response (Arabic)" +msgstr "الرد (بالعربية)" -#: templates/complaints/explanation_success.html:94 -msgid "The PX team may contact you if additional information is needed" -msgstr "قد يتواصل معك فريق PX في حال الحاجة إلى معلومات إضافية" +#: templates/complaints/inquiry_department_response.html:66 +#: templates/observations/observation_department_response.html:62 +msgid "أدخل ردك باللغة العربية..." +msgstr "أدخل ردك باللغة العربية..." -#: templates/complaints/explanation_success.html:98 -msgid "Your explanation will be considered during the complaint investigation" -msgstr "سيؤخذ إيضاحك بعين الاعتبار أثناء التحقيق في الشكوى" +#: templates/complaints/inquiry_department_response.html:71 +#: templates/observations/observation_department_response.html:67 +msgid "At least one language is required." +msgstr "مطلوب لغة واحدة على الأقل." -#: templates/complaints/explanation_success.html:106 -msgid "Submission Time:" -msgstr "وقت الإرسال:" +#: templates/complaints/inquiry_department_response.html:79 +#: templates/complaints/inquiry_detail.html:321 +#: templates/complaints/inquiry_explanation_form.html:8 +#: templates/complaints/inquiry_explanation_form.html:141 +#: templates/complaints/inquiry_response_form_token.html:45 +#: templates/complaints/partials/departments_panel.html:87 +#: templates/complaints/partials/staff_panel.html:63 +#: templates/components/department_response_modal.html:36 +#: templates/components/department_response_modal.html:122 +#: templates/observations/observation_department_response.html:75 +#: templates/observations/observation_detail.html:366 +#: templates/observations/response_form_token.html:46 +msgid "Submit Response" +msgstr "إرسال الرد" -#: templates/complaints/explanation_success.html:107 -msgid "A confirmation email has been sent to the complaint assignee." -msgstr "تم إرسال رسالة تأكيد إلى المسؤول عن الشكوى." +#: templates/complaints/inquiry_detail.html:80 +#: templates/px_sources/source_user_inquiry_list.html:4 +#: templates/px_sources/source_user_inquiry_list.html:70 +msgid "My Inquiries" +msgstr "استفساراتي" -#: templates/complaints/inquiry_detail.html:212 -msgid "Back to My Inquiries" -msgstr "العودة إلى استفساراتي" - -#: templates/complaints/inquiry_detail.html:216 -#: templates/px_sources/source_user_create_inquiry.html:38 -msgid "Back to Inquiries" -msgstr "العودة إلى الاستفسارات" - -#: templates/complaints/inquiry_detail.html:267 +#: templates/complaints/inquiry_detail.html:118 +#: templates/organizations/department_complaint_detail.html:57 +#: templates/organizations/department_complaint_detail.html:62 +#: templates/organizations/department_complaints.html:147 +#: templates/organizations/department_detail.html:190 +#: templates/organizations/department_detail.html:197 +#: templates/organizations/department_detail.html:205 +#: templates/organizations/department_detail.html:212 +#: templates/organizations/department_detail.html:218 +#: templates/organizations/department_detail.html:801 +#: templates/organizations/department_detail.html:865 +#: templates/organizations/department_inquiries.html:116 +#: templates/organizations/department_inquiry_detail.html:42 +#: templates/organizations/department_observation_detail.html:46 +#: templates/organizations/department_observations.html:113 +#: templates/projects/my_tasks.html:94 templates/projects/my_tasks.html:100 msgid "Respond" msgstr "الرد" -#: templates/complaints/inquiry_detail.html:336 -#: templates/complaints/inquiry_detail.html:808 -#: templates/complaints/partials/ai_panel.html:47 -#: templates/complaints/partials/ai_panel.html:207 +#: templates/complaints/inquiry_detail.html:129 +#: templates/complaints/inquiry_detail.html:511 +#: templates/observations/observation_detail.html:77 +#: templates/observations/observation_detail.html:550 +#: templates/rca/rca_detail.html:5 templates/rca/rca_detail.html:45 +#: templates/rca/rca_form.html:10 +msgid "RCA" +msgstr "RCA" + +#: templates/complaints/inquiry_detail.html:180 +msgid "AI analysis is running. Please refresh the page shortly." +msgstr "تحليل الذكاء الاصطناعي قيد التشغيل. يرجى تحديث الصفحة قريبًا." + +#: templates/complaints/inquiry_detail.html:199 +#: templates/observations/observation_detail.html:218 +#, python-format +msgid "Response from %(dept)s" +msgstr "رد من %(dept)s" + +#: templates/complaints/inquiry_detail.html:215 +#: templates/observations/observation_detail.html:234 +msgid "Sent:" +msgstr "أُرسل:" + +#: templates/complaints/inquiry_detail.html:221 +#: templates/complaints/inquiry_detail.html:315 +#: templates/emails/explanation_request.html:24 +#: templates/observations/observation_detail.html:240 +#: templates/observations/observation_detail.html:337 +msgid "Deadline:" +msgstr "الموعد النهائي:" + +#: templates/complaints/inquiry_detail.html:313 +#: templates/observations/observation_detail.html:335 +msgid "Waiting for department response..." +msgstr "جاري انتظار رد القسم..." + +#: templates/complaints/inquiry_detail.html:331 +#: templates/complaints/partials/explanation_panel.html:320 +#: templates/observations/observation_detail.html:346 +msgid "Send Reminder" +msgstr "إرسال تذكير" + +#: templates/complaints/inquiry_detail.html:339 +#: templates/observations/observation_detail.html:354 +msgid "Urgent Reminder" +msgstr "تذكير عاجل" + +#: templates/complaints/inquiry_detail.html:357 +msgid "Sent to inquirer" +msgstr "تم الإرسال إلى المستفسر" + +#: templates/complaints/inquiry_detail.html:405 +#: templates/observations/observation_detail.html:442 +msgid "Root Cause Analyses" +msgstr "تحليلات السبب الجذري" + +#: templates/complaints/inquiry_detail.html:428 +msgid "No Root Cause Analyses linked to this inquiry" +msgstr "لا توجد تحليلات للأسباب الجذرية مرتبطة بهذا الاستفسار" + +#: templates/complaints/inquiry_detail.html:457 +msgid "Are you sure you want to cancel this inquiry?" +msgstr "هل أنت متأكد من رغبتك في إلغاء هذا الاستفسار؟" + +#: templates/complaints/inquiry_detail.html:462 +msgid "Cancel Inquiry" +msgstr "إلغاء الاستفسار" + +#: templates/complaints/inquiry_detail.html:468 +msgid "Activate this inquiry to perform actions" +msgstr "تفعيل هذا الاستفسار لتنفيذ الإجراءات" + +#: templates/complaints/inquiry_detail.html:475 +#: templates/complaints/inquiry_detail.html:603 +#: templates/complaints/inquiry_detail.html:665 +msgid "Send Response to Patient" +msgstr "إرسال الرد إلى المريض" + +#: templates/complaints/inquiry_detail.html:631 +#: templates/complaints/inquiry_detail.html:980 +#: templates/complaints/inquiry_detail.html:991 +#: templates/observations/observation_detail.html:806 +#: templates/observations/observation_detail.html:817 +#: templates/observations/observation_detail.html:874 +msgid "Generate AI Response" +msgstr "إنشاء رد الذكاء الاصطناعي" + +#: templates/complaints/inquiry_detail.html:638 +#: templates/observations/observation_detail.html:881 +msgid "AI Generated Response (click to use)" +msgstr "الرد الذي أنشأه الذكاء الاصطناعي (انقر للاستخدام)" + +#: templates/complaints/inquiry_detail.html:654 +msgid "Enter your response..." +msgstr "أدخل ردك..." + +#: templates/complaints/inquiry_detail.html:659 +msgid "The response will be sent to the inquirer via SMS and Email." +msgstr "سيتم إرسال الرد إلى المستفسر عبر الرسائل النصية والبريد الإلكتروني." + +#: templates/complaints/inquiry_detail.html:682 +msgid "Reassign Inquiry" +msgstr "إعادة تعيين الاستفسار" + +#: templates/complaints/inquiry_detail.html:682 +msgid "Assign Inquiry" +msgstr "تعيين الاستفسار" + +#: templates/complaints/inquiry_detail.html:720 +#: templates/complaints/inquiry_detail.html:792 +msgid "Transfer to Department" +msgstr "تحويل إلى القسم" + +#: templates/complaints/inquiry_detail.html:726 +msgid "" +"Select a department to transfer this inquiry. Department champions will be " +"notified to respond." +msgstr "اختر القسم لتحويل هذا الاستفسار. سيتم إخطار مسؤولي القسم للرد." + +#: templates/complaints/inquiry_detail.html:732 +#: templates/complaints/inquiry_detail.html:759 +#: templates/components/send_to_modal.html:19 +#: templates/components/send_to_modal.html:36 +msgid "Send To" +msgstr "إرسال إلى" + +#: templates/complaints/inquiry_detail.html:742 +msgid "Department Email" +msgstr "البريد الإلكتروني للقسم" + +#: templates/complaints/inquiry_detail.html:749 +msgid "The notification will be sent to the department's email address." +msgstr "سيتم إرسال الإشعار إلى عنوان البريد الإلكتروني للقسم." + +#: templates/complaints/inquiry_detail.html:761 +#: templates/complaints/inquiry_detail.html:953 +msgid "Select Contact Person" +msgstr "حدد جهة الاتصال" + +#: templates/complaints/inquiry_detail.html:766 +msgid "Context / Note" +msgstr "السياق / ملاحظة" + +#: templates/complaints/inquiry_detail.html:780 +msgid "Add context or instructions for the department..." +msgstr "أضف سياقًا أو تعليمات للقسم..." + +#: templates/complaints/inquiry_detail.html:785 +msgid "أضف سياقاً أو تعليمات للقسم..." +msgstr "أضف سياقاً أو تعليمات للقسم..." + +#: templates/complaints/inquiry_detail.html:809 +msgid "Escalate Inquiry" +msgstr "تصعيد الاستفسار" + +#: templates/complaints/inquiry_detail.html:834 +#: templates/observations/observation_detail.html:950 +#: templates/px_sources/communication_request_detail.html:92 +#: templates/px_sources/communication_request_list.html:110 +#: templates/px_sources/source_user_communication_request_list.html:79 +#: templates/px_sources/source_user_create_communication_request.html:47 +#: templates/surveys/bulk_job_status.html:119 +msgid "Reason" +msgstr "السبب" + +#: templates/complaints/inquiry_detail.html:835 +#: templates/complaints/partials/explanation_panel.html:378 +#: templates/observations/observation_detail.html:951 +msgid "Reason for escalation..." +msgstr "سبب التصعيد..." + +#: templates/complaints/inquiry_detail.html:962 +msgid "Error loading contacts" +msgstr "خطأ في تحميل جهات الاتصال" + +#: templates/complaints/inquiry_detail.html:970 +#: templates/observations/observation_detail.html:796 +#: templates/surveys/analytics_reports.html:285 +#: templates/surveys/generate_enhanced_report.html:98 +msgid "Generating..." +msgstr "جارٍ الإنشاء..." + +#: templates/complaints/inquiry_detail.html:986 +#: templates/observations/observation_detail.html:812 +msgid "Failed to generate response" +msgstr "فشل في إنشاء الرد" + +#: templates/complaints/inquiry_detail.html:993 +#: templates/observations/observation_detail.html:819 +msgid "An error occurred while generating response" +msgstr "حدث خطأ أثناء إنشاء الرد" + +#: templates/complaints/inquiry_detail.html:1017 +msgid "Re-analyzing inquiry with AI..." +msgstr "إعادة تحليل الاستفسار بالذكاء الاصطناعي..." + +#: templates/complaints/inquiry_detail.html:1033 +#: templates/complaints/partials/ai_panel.html:49 +#: templates/complaints/partials/ai_panel.html:214 #: templates/observations/partials/ai_panel.html:35 msgid "AI Summary (English)" msgstr "ملخص الذكاء الاصطناعي (الإنجليزية)" -#: templates/complaints/inquiry_detail.html:344 -#: templates/complaints/inquiry_detail.html:815 -#: templates/complaints/partials/ai_panel.html:54 -#: templates/complaints/partials/ai_panel.html:213 +#: templates/complaints/inquiry_detail.html:1034 +#: templates/complaints/partials/ai_panel.html:56 +#: templates/complaints/partials/ai_panel.html:220 #: templates/observations/partials/ai_panel.html:42 msgid "AI Summary (Arabic)" msgstr "ملخص الذكاء الاصطناعي (العربية)" -#: templates/complaints/inquiry_detail.html:352 -#, fuzzy -#| msgid "CSRF token not found. Please refresh the page." -msgid "AI analysis is running. Please refresh the page shortly." -msgstr "لم يتم العثور على رمز CSRF. يرجي تحديث الصفحة." +#: templates/complaints/inquiry_detail.html:1035 +msgid "AI analysis complete" +msgstr "اكتمل تحليل الذكاء الاصطناعي" -#: templates/complaints/inquiry_detail.html:368 -#, fuzzy -#| msgid "Respond to Inquiry" -msgid "Sent to inquirer" -msgstr "الرد على الاستفسار" +#: templates/complaints/inquiry_detail.html:1039 +#: templates/complaints/partials/ai_panel.html:241 +msgid "Analysis failed" +msgstr "فشل التحليل" -#: templates/complaints/inquiry_detail.html:424 -msgid "Created by" -msgstr "تم الإنشاء بواسطة" +#: templates/complaints/inquiry_detail.html:1048 +#: templates/complaints/partials/ai_panel.html:247 +msgid "An error occurred" +msgstr "حدث خطأ" -#: templates/complaints/inquiry_detail.html:433 -#: templates/observations/observation_detail.html:246 -msgid "Status Changed" -msgstr "تم تغيير الحالة" +#: templates/complaints/inquiry_explanation_already_submitted.html:28 +#: templates/complaints/inquiry_response_already_submitted.html:4 +#: templates/complaints/inquiry_response_already_submitted.html:13 +#: templates/observations/response_already_submitted.html:4 +#: templates/observations/response_already_submitted.html:13 +msgid "Response Already Submitted" +msgstr "تم تقديم الرد بالفعل" -#: templates/complaints/inquiry_detail.html:457 -#: templates/complaints/inquiry_form.html:240 -#: templates/emails/appointment_confirmation.html:151 -#: templates/organizations/patient_form.html:181 -#: templates/organizations/staff_detail.html:128 -msgid "Contact Information" -msgstr "معلومات الاتصال" +#: templates/complaints/inquiry_explanation_already_submitted.html:29 +msgid "A response has already been submitted using this link." +msgstr "تم تقديم رد بالفعل باستخدام هذا الرابط." -#: templates/complaints/inquiry_detail.html:527 -#: templates/complaints/inquiry_detail.html:584 -#: templates/complaints/inquiry_detail.html:650 -msgid "Send Response" -msgstr "إرسال الرد" +#: templates/complaints/inquiry_explanation_already_submitted.html:31 +msgid "Submitted on:" +msgstr "تم التقديم في:" -#: templates/complaints/inquiry_detail.html:533 +#: templates/complaints/inquiry_explanation_form.html:51 +#: templates/emails/inquiry_explanation_request.html:29 +msgid "Submit Your Response" +msgstr "تقديم ردك" + +#: templates/complaints/inquiry_explanation_form.html:52 +msgid "PX360 Inquiry Management System" +msgstr "PX360 Inquiry Management System" + +#: templates/complaints/inquiry_explanation_form.html:69 +msgid "Requested From" +msgstr "تم الطلب من" + +#: templates/complaints/inquiry_explanation_form.html:104 +#: templates/emails/communication_request_notification.html:17 +#: templates/emails/inquiry_explanation_request.html:16 +#: templates/emails/public_inquiry_notification.html:15 +msgid "Message:" +msgstr "الرسالة:" + +#: templates/complaints/inquiry_explanation_form.html:111 +#: templates/emails/inquiry_explanation_request.html:22 +msgid "Request Message:" +msgstr "رسالة الطلب:" + +#: templates/complaints/inquiry_explanation_form.html:135 +msgid "" +"This link can only be used once. After submitting your response, it will " +"expire." +msgstr "يمكن استخدام هذا الرابط مرة واحدة فقط. بعد إرسال ردك، سينتهي صلاحيته." + +#: templates/complaints/inquiry_explanation_success.html:28 +msgid "Response Submitted Successfully" +msgstr "تم إرسال الرد بنجاح" + +#: templates/complaints/inquiry_explanation_success.html:29 +msgid "Thank you for your response. It has been recorded in our system." +msgstr "شكراً لك على ردك. تم تسجيله في نظامنا." + +#: templates/complaints/inquiry_explanation_success.html:30 +msgid "Inquiry Reference:" +msgstr "مرجع الاستفسار:" + +#: templates/complaints/inquiry_form.html:4 +#: templates/complaints/inquiry_form.html:74 msgid "Edit Inquiry" msgstr "تعديل الاستفسار" -#: templates/complaints/inquiry_detail.html:539 -#: templates/complaints/partials/rca_panel.html:10 -#: templates/complaints/partials/rca_panel.html:63 -#: templates/feedback/feedback_detail.html:587 -#: templates/observations/observation_detail.html:101 -msgid "Initiate RCA" -msgstr "" - -#: templates/complaints/inquiry_detail.html:550 -#: templates/feedback/feedback_detail.html:584 -#: templates/observations/observation_detail.html:323 -msgid "Root Cause Analyses" -msgstr "تحليلات السبب الجذري" - -#: templates/complaints/inquiry_detail.html:598 -#: templates/complaints/inquiry_detail.html:722 -#: templates/complaints/inquiry_detail.html:736 -#, fuzzy -#| msgid "Generate Reports" -msgid "Generate AI Response" -msgstr "إنشاء التقارير" - -#: templates/complaints/inquiry_detail.html:606 -#, fuzzy -#| msgid "Select AI Generated Resolution" -msgid "AI Generated Response (click to use)" -msgstr "اختر الحل المولّد بالذكاء الاصطناعي" - -#: templates/complaints/inquiry_detail.html:618 -#, fuzzy -#| msgid "Suggestion" -msgid "Use Both Suggestions" -msgstr "اقتراح" - -#: templates/complaints/inquiry_detail.html:625 -#, fuzzy -#| msgid "Message (English)" -msgid "Response (English)" -msgstr "الرسالة (بالإنجليزية)" - -#: templates/complaints/inquiry_detail.html:629 -#, fuzzy -#| msgid "Enter your response..." -msgid "Enter your response in English..." -msgstr "أدخل ردك..." - -#: templates/complaints/inquiry_detail.html:635 -#, fuzzy -#| msgid "Message (Arabic)" -msgid "Response (Arabic)" -msgstr "الرسالة (بالعربية)" - -#: templates/complaints/inquiry_detail.html:639 -msgid "أدخل ردك باللغة العربية..." -msgstr "أدخل ردك باللغة العربية..." - -#: templates/complaints/inquiry_detail.html:644 -msgid "" -"At least one language is required. The response will be sent to the inquirer" -" via SMS and Email." -msgstr "" -"مطلوب لغة واحدة على الأقل. سيتم إرسال الرد للمستفسر عبر الرسائل النصية " -"والبريد الإلكتروني." - -#: templates/complaints/inquiry_detail.html:730 -#, fuzzy -#| msgid "Failed to generate resolution. Please try again." -msgid "Failed to generate response" -msgstr "فشل في إنشاء القرار. يرجى المحاولة مرة أخرى." - -#: templates/complaints/inquiry_detail.html:738 -#, fuzzy -#| msgid "An error occurred while creating the action" -msgid "An error occurred while generating response" -msgstr "حدث خطأ أثناء إنشاء الإجراء" - -#: templates/complaints/inquiry_detail.html:767 -msgid "Re-analyzing inquiry with AI..." -msgstr "إعادة تحليل الاستفسار بالذكاء الاصطناعي..." - -#: templates/complaints/inquiry_detail.html:821 -#, fuzzy -#| msgid "Analysis confidence" -msgid "AI analysis complete" -msgstr "مستوى الثقة في التحليل" - -#: templates/complaints/inquiry_detail.html:827 -#: templates/complaints/partials/ai_panel.html:234 -#, fuzzy -#| msgid "Analysis confidence" -msgid "Analysis failed" -msgstr "مستوى الثقة في التحليل" - -#: templates/complaints/inquiry_detail.html:836 -#: templates/complaints/partials/ai_panel.html:240 -#, fuzzy -#| msgid "An error occurred loading the item" -msgid "An error occurred" -msgstr "حدث خطأ أثناء تحميل العنصر" - #: templates/complaints/inquiry_form.html:4 -#: templates/complaints/inquiry_form.html:165 -#: templates/complaints/inquiry_form.html:175 +#: templates/complaints/inquiry_form.html:74 msgid "Create New Inquiry" msgstr "إنشاء استفسار جديد" -#: templates/complaints/inquiry_form.html:177 -msgid "Create a new patient inquiry or request" -msgstr "إنشاء استفسار أو طلب جديد للمريض" - -#: templates/complaints/inquiry_form.html:188 -msgid "Inquiry Information" -msgstr "معلومات الاستفسار" - -#: templates/complaints/inquiry_list.html:4 -#: templates/complaints/inquiry_list.html:121 -msgid "Inquiries Console" -msgstr "لوحة الاستفسارات" - -#: templates/complaints/inquiry_list.html:123 -msgid "Manage patient inquiries and requests" -msgstr "إدارة استفسارات وطلبات المرضى" - -#: templates/complaints/inquiry_list.html:129 -#: templates/layouts/source_user_base.html:161 +#: templates/complaints/inquiry_form.html:71 +#: templates/complaints/inquiry_list.html:72 +#: templates/layouts/source_user_base.html:139 #: templates/px_sources/source_user_dashboard.html:130 msgid "New Inquiry" msgstr "استفسار جديد" -#: templates/complaints/inquiry_list.html:180 +#: templates/complaints/inquiry_form.html:91 +msgid "Edit Inquiry Information" +msgstr "تعديل معلومات الاستفسار" + +#: templates/complaints/inquiry_form.html:91 +msgid "Inquiry Information" +msgstr "معلومات الاستفسار" + +#: templates/complaints/inquiry_form.html:173 +#: templates/organizations/patient_form.html:181 +#: templates/organizations/staff_detail.html:124 +#: templates/px_sources/source_user_create_suggestion.html:65 +msgid "Contact Information" +msgstr "معلومات الاتصال" + +#: templates/complaints/inquiry_list.html:4 +#: templates/complaints/inquiry_list.html:66 +msgid "Inquiries Console" +msgstr "لوحة الاستفسارات" + +#: templates/complaints/inquiry_list.html:67 +msgid "Manage patient inquiries and requests" +msgstr "إدارة استفسارات وطلبات المرضى" + +#: templates/complaints/inquiry_list.html:137 #: templates/px_sources/source_user_inquiry_list.html:105 msgid "Subject, contact name..." msgstr "الموضوع، اسم جهة الاتصال..." -#: templates/complaints/inquiry_list.html:198 -msgid "Services" -msgstr "الخدمات" +#: templates/complaints/inquiry_list.html:159 +#: templates/complaints/public_inquiry_form.html:121 +#: templates/organizations/patient_detail.html:302 +#: templates/organizations/patient_visit_journey.html:135 +msgid "Insurance" +msgstr "التأمين" -#: templates/complaints/inquiry_list.html:219 +#: templates/complaints/inquiry_list.html:160 +#: templates/complaints/investigation_respond.html:8 +#: templates/complaints/partials/explanation_panel.html:220 +#: templates/complaints/public_inquiry_form.html:122 +#: templates/dashboard/my_dashboard.html:204 +#: templates/dashboard/partials/feedback_table.html:6 +msgid "Feedback" +msgstr "ملاحظات" + +#: templates/complaints/inquiry_list.html:177 +#: templates/organizations/department_detail.html:462 #: templates/px_sources/source_user_dashboard.html:44 #: templates/px_sources/source_user_inquiry_list.html:162 msgid "All Inquiries" msgstr "جميع الاستفسارات" -#: templates/complaints/inquiry_list.html:228 -#: templates/emails/new_complaint_admin_notification.html:35 -#: templates/observations/observation_list.html:295 -#: templates/px_sources/source_detail.html:248 -#: templates/px_sources/source_detail.html:315 -#: templates/px_sources/source_detail.html:390 -#: templates/px_sources/source_user_complaint_list.html:182 -#: templates/px_sources/source_user_dashboard.html:160 -#: templates/px_sources/source_user_dashboard.html:253 -#: templates/px_sources/source_user_inquiry_list.html:170 -msgid "Reference" -msgstr "المرجع" - -#: templates/complaints/inquiry_list.html:305 -#, python-format -msgid "" -"\n" -" Showing %(start)s to %(end)s of %(total)s inquiries\n" -" " -msgstr "" -"\n" -" عرض %(start)s إلى %(end)s من %(total)s الاستفسارات " - -#: templates/complaints/inquiry_list.html:332 +#: templates/complaints/inquiry_list.html:251 msgid "Adjust your filters or create a new inquiry" msgstr "اضبط عوامل التصفية الخاصة بك أو أنشئ استفسارًا جديدًا" +#: templates/complaints/inquiry_response_already_submitted.html:14 +#: templates/observations/response_already_submitted.html:14 +msgid "This response link has already been used." +msgstr "تم استخدام رابط الرد هذا من قبل." + +#: templates/complaints/inquiry_response_form_token.html:4 +msgid "Respond to Inquiry" +msgstr "الرد على الاستفسار" + +#: templates/complaints/inquiry_response_form_token.html:42 +#: templates/observations/response_form_token.html:43 +msgid "أدخل ردك بالعربية..." +msgstr "أدخل ردك بالعربية..." + +#: templates/complaints/inquiry_response_success_token.html:14 +msgid "Thank you for your response to inquiry" +msgstr "شكراً لك على ردك على الاستفسار" + +#: templates/complaints/inquiry_response_success_token.html:15 +#: templates/observations/response_success_token.html:15 +msgid "The PX team will review your response." +msgstr "سيراجع فريق تجربة المريض (PX) ردك." + +#: templates/complaints/inquiry_response_token_invalid.html:4 +#: templates/complaints/inquiry_response_token_invalid.html:13 +#: templates/observations/response_token_invalid.html:4 +#: templates/observations/response_token_invalid.html:13 +msgid "Invalid Link" +msgstr "رابط غير صالح" + +#: templates/complaints/inquiry_response_token_invalid.html:14 +#: templates/observations/response_token_invalid.html:14 +msgid "This response link is invalid or has expired." +msgstr "رابط الرد هذا غير صالح أو منتهي الصلاحية." + +#: templates/complaints/investigation_already_started.html:8 +msgid "Feedback Collection In Progress" +msgstr "جمع الملاحظات قيد التقدم" + +#: templates/complaints/investigation_already_started.html:27 +msgid "Feedback Requests Already Sent" +msgstr "تم إرسال طلبات الملاحظات بالفعل" + +#: templates/complaints/investigation_already_started.html:28 +#, fuzzy +#| msgid "" +#| "You have already started an investigation for this complaint. You will be " +#| "notified when all staff members respond." +msgid "" +"You have already sent feedback requests for this complaint. You will be " +"notified when all staff members respond." +msgstr "" +"لقد بدأت بالفعل تحقيقًا لهذه الشكوى. سيتم إعلامك عندما يرد جميع الموظفين." + +#: templates/complaints/investigation_already_started.html:31 +#: templates/complaints/investigation_already_submitted.html:39 +#: templates/complaints/investigation_success.html:28 +msgid "Complaint Reference" +msgstr "مرجع الشكوى" + +#: templates/complaints/investigation_already_submitted.html:30 +msgid "The feedback collection for this complaint has already been completed." +msgstr "تم بالفعل الانتهاء من جمع الملاحظات لهذه الشكوى." + +#: templates/complaints/investigation_already_submitted.html:32 +msgid "You have already submitted your feedback." +msgstr "لقد قدمت بالفعل ملاحظاتك." + +#: templates/complaints/investigation_already_submitted.html:34 +msgid "This link has already been used." +msgstr "تم استخدام هذا الرابط بالفعل." + +#: templates/complaints/investigation_error.html:8 +#: templates/complaints/public_complaint_form.html:286 +#: templates/complaints/public_complaint_form.html:290 +#: templates/complaints/public_inquiry_form.html:270 +#: templates/complaints/public_inquiry_form.html:280 +#: templates/core/public_submit.html:406 +#: templates/dashboard/my_dashboard.html:573 +#: templates/dashboard/my_dashboard.html:577 +#: templates/physicians/doctor_rating_job_status.html:255 +#: templates/physicians/doctor_rating_job_status.html:277 +msgid "Error" +msgstr "خطأ" + +#: templates/complaints/investigation_error.html:23 +msgid "Something went wrong" +msgstr "حدث خطأ ما" + +#: templates/complaints/investigation_questions.html:62 +msgid "Feedback Requests Sent" +msgstr "تم إرسال طلبات الملاحظات" + +#: templates/complaints/investigation_questions.html:64 +msgid "You will be notified when all staff members respond." +msgstr "سيتم إعلامك عند استجابة جميع أعضاء الموظفين." + +#: templates/complaints/investigation_questions.html:79 +#, fuzzy +#| msgid "Select Staff & Their Questions" +msgid "Select staff and write their questions" +msgstr "اختر الموظفين وأسئلتهم" + +#: templates/complaints/investigation_questions.html:80 +msgid "" +"Each staff member receives their own questions. You can write different " +"questions for each person." +msgstr "" + +#: templates/complaints/investigation_questions.html:97 +msgid "Yes/No" +msgstr "" + +#: templates/complaints/investigation_questions.html:99 +#, fuzzy +#| msgid "Enter your question..." +msgid "Enter a question..." +msgstr "أدخل سؤالك..." + +#: templates/complaints/investigation_questions.html:100 +#: templates/complaints/partials/departments_panel.html:116 +#: templates/complaints/partials/staff_panel.html:75 +#: templates/projects/template_form.html:197 +msgid "Remove" +msgstr "إزالة" + +#: templates/complaints/investigation_questions.html:104 +#: templates/organizations/manager_review_questions.html:15 +#: templates/surveys/template_form.html:493 +msgid "Add Question" +msgstr "إضافة سؤال" + +#: templates/complaints/investigation_questions.html:111 +#, fuzzy +#| msgid "No accused staff members linked to this complaint" +msgid "No staff linked to this complaint." +msgstr "لا يوجد موظفون متهمون مرتبطون بهذه الشكوى" + +#: templates/complaints/investigation_questions.html:118 +msgid "Send Feedback Requests" +msgstr "إرسال طلبات الملاحظات" + +#: templates/complaints/investigation_questions.html:147 +#, fuzzy +#| msgid "Please select a staff member." +msgid "Please select at least one staff member." +msgstr "يرجى اختيار أحد أعضاء الطاقم." + +#: templates/complaints/investigation_questions.html:157 +msgid "Send feedback requests to the following staff?" +msgstr "" + +#: templates/complaints/investigation_questions.html:159 +#, fuzzy +#| msgid "" +#| "This will also delete all associated stages and survey assignments. This " +#| "action cannot be undone." +msgid "" +"Each will receive an email and SMS with their questions. This action cannot " +"be undone." +msgstr "" +"سيؤدي هذا أيضًا إلى حذف جميع المراحل المرتبطة وتعيينات الاستبيان. لا يمكن " +"التراجع عن هذا الإجراء." + +#: templates/complaints/investigation_respond.html:67 +msgid "Please answer the following questions" +msgstr "يرجى الإجابة على الأسئلة التالية" + +#: templates/complaints/investigation_respond.html:97 +msgid "Type your answer here..." +msgstr "اكتب إجابتك هنا..." + +#: templates/complaints/investigation_respond.html:118 +msgid "" +"I confirm that the information I have provided above is true and accurate to " +"the best of my knowledge. I understand that these responses will be reviewed " +"as part of an official complaint investigation, and I accept responsibility " +"for the accuracy of my statements." +msgstr "" +"أؤكد أن المعلومات التي قدمتها أعلاه صحيحة ودقيقة على حد علمي. وأتفهم أن هذه " +"الردود ستتم مراجعتها كجزء من تحقيق رسمي في الشكوى، وأتحمل المسؤولية عن دقة " +"تصريحاتي." + +#: templates/complaints/investigation_respond.html:124 +#, fuzzy +#| msgid "Submit Response" +msgid "Submit Responses" +msgstr "إرسال الرد" + +#: templates/complaints/investigation_review.html:8 +msgid "Review Feedback" +msgstr "مراجعة الملاحظات" + +#: templates/complaints/investigation_review.html:52 +msgid "Staff Responses" +msgstr "ردود الموظفين" + +#: templates/complaints/investigation_review.html:110 +#: templates/organizations/department_manager_review.html:143 +msgid "This staff member has not responded yet." +msgstr "لم يقم هذا الموظف بالرد بعد." + +#: templates/complaints/investigation_review.html:118 +msgid "Your Final Reply" +msgstr "ردك النهائي" + +#: templates/complaints/investigation_review.html:119 +#, fuzzy +#| msgid "" +#| "Based on the staff feedback above, write your final reply. This will be " +#| "sent to the department manager for review." +msgid "Based on the staff feedback above, write your final reply." +msgstr "" +"بناءً على ملاحظات الموظفين أعلاه، اكتب ردك النهائي. سيتم إرسال هذا إلى مدير " +"القسم للمراجعة." + +#: templates/complaints/investigation_review.html:125 +msgid "Write your final reply based on the feedback..." +msgstr "اكتب ردك النهائي بناءً على الملاحظات..." + +#: templates/complaints/investigation_review.html:130 +#: templates/dashboard/standards_dashboard.html:242 +msgid "Assessment" +msgstr "التقييم" + +#: templates/complaints/investigation_review.html:134 +msgid "Is there any negligence resulting from carelessness?" +msgstr "هل يوجد تقصير ناتج عن إهمال؟" + +#: templates/complaints/investigation_review.html:149 +msgid "Is it resulting from policies or regulations?" +msgstr "هل هو ناتج عن سياسات أو تنظيمات؟" + +#: templates/complaints/investigation_review.html:164 +msgid "Does this complaint require an improvement project?" +msgstr "هل تتطلب هذه الشكوى مشروع تحسين؟" + +#: templates/complaints/investigation_review.html:178 +msgid "Describe the required improvement project..." +msgstr "اشرح مشروع التحسين المطلوب..." + +#: templates/complaints/investigation_review.html:190 +msgid "" +"I confirm that I have read and fully reviewed all staff responses above. I " +"acknowledge that my final reply represents the official department response " +"for this complaint, and I accept full responsibility for its accuracy and " +"content." +msgstr "" +"أؤكد أنني قرأت وراجعت بالكامل جميع ردود الموظفين أعلاه. وأقر بأن ردي النهائي " +"يمثل الرد الرسمي للقسم بشأن هذه الشكوى، وأتحمل المسؤولية الكاملة عن دقة " +"ومحتوى هذا الرد." + +#: templates/complaints/investigation_review.html:199 +#, fuzzy +#| msgid "Notification sent to new assignee" +msgid "Verification code sent to your phone and email." +msgstr "إرسال إشعار إلى المعيّن الجديد" + +#: templates/complaints/investigation_review.html:200 +#, fuzzy +#| msgid "Notification sent to new assignee" +msgid "Verification code sent to your phone." +msgstr "إرسال إشعار إلى المعيّن الجديد" + +#: templates/complaints/investigation_review.html:201 +#, fuzzy +#| msgid "A test notification will be sent to verify your settings." +msgid "Verification code sent to your email." +msgstr "سيتم إرسال إشعار تجريبي للتحقق من إعداداتك." + +#: templates/complaints/investigation_review.html:202 +#, fuzzy +#| msgid "Invitation Resent" +msgid "Verification code sent." +msgstr "تم إعادة إرسال الدعوة" + +#: templates/complaints/investigation_review.html:212 +#, fuzzy +#| msgid "Review & Submit Reply" +msgid "Verify & Submit" +msgstr "مراجعة وإرسال الرد" + +#: templates/complaints/investigation_review.html:215 +msgid "Enter the 6-digit code to complete your submission." +msgstr "" + +#: templates/complaints/investigation_review.html:219 +#, fuzzy +#| msgid "Resend Invite" +msgid "Resend code" +msgstr "إعادة إرسال الدعوة" + +#: templates/complaints/investigation_review.html:226 +#, fuzzy +#| msgid "Send Notification" +msgid "Send Verification Code" +msgstr "إرسال إشعار" + +#: templates/complaints/investigation_review.html:233 +msgid "Final reply will be available once staff responses are in." +msgstr "" + +#: templates/complaints/investigation_success.html:23 +msgid "Answers Submitted Successfully" +msgstr "تم تقديم الإجابات بنجاح" + +#: templates/complaints/investigation_success.html:24 +msgid "Your responses have been sent to the department champion for review." +msgstr "تم إرسال ردودك إلى مسؤول القسم للمراجعة." + +#: templates/complaints/investigation_success.html:35 +#: templates/projects/convert_action.html:158 +msgid "What happens next?" +msgstr "ماذا سيحدث بعد ذلك؟" + +#: templates/complaints/investigation_success.html:35 +msgid "" +"The department champion will review your answers and write a final response. " +"You may be contacted if further clarification is needed." +msgstr "" +"سيقوم المشرف المختص في القسم بمراجعة إجاباتك وكتابة رد نهائي. قد يتم التواصل " +"معك إذا كانت هناك حاجة إلى مزيد من التوضيح." + #: templates/complaints/involved_department_form.html:109 #: templates/complaints/involved_staff_form.html:102 -#: templates/complaints/request_explanation_form.html:92 msgid "Back to Complaint" msgstr "العودة إلى الشكوى" @@ -13186,7 +17491,7 @@ msgstr "القسم الرئيسي يتحمل المسؤولية الأساسية #: templates/complaints/involved_staff_form.html:187 #: templates/physicians/doctor_rating_fetch.html:98 #: templates/physicians/doctor_rating_import.html:98 -#: templates/px_sources/source_user_form.html:252 +#: templates/px_sources/source_user_form.html:220 #: templates/surveys/manual_send.html:183 #: templates/surveys/manual_send_csv.html:147 #: templates/surveys/manual_send_phone.html:106 @@ -13203,11 +17508,8 @@ msgstr "اختياريًا، قم بتعيين مستخدم محدد من هذا msgid "Enter any additional notes..." msgstr "أدخل أي ملاحظات إضافية..." -#: templates/complaints/involved_staff_form.html:122 -msgid "Staff Member" -msgstr "الموظف" - #: templates/complaints/involved_staff_form.html:125 +#: templates/organizations/department_detail.html:1192 msgid "Select Staff Member" msgstr "اختيار موظف" @@ -13256,8 +17558,8 @@ msgid "Supporting the resolution process" msgstr "دعم عملية الحل" #: templates/complaints/involved_staff_form.html:178 -msgid "PX Staff:" -msgstr "موظف تجربة المرضى:" +msgid "PX Employee:" +msgstr "موظف PX:" #: templates/complaints/involved_staff_form.html:179 msgid "Coordinating between departments" @@ -13283,51 +17585,32 @@ msgid "Select Admin" msgstr "اختر المسؤول" #: templates/complaints/oncall/admin_form.html:141 -#, fuzzy -#| msgid "On-Call Admins" msgid "On-Call User" -msgstr "المسؤولون المناوبون" +msgstr "المستخدم المناوب" #: templates/complaints/oncall/admin_form.html:144 -#, fuzzy -#| msgid "Select user..." msgid "Select a user..." -msgstr "اختر المستخدم..." +msgstr "اختر مستخدمًا..." #: templates/complaints/oncall/admin_form.html:146 -#, fuzzy -#| msgid "PX Admin" msgid "PX Admins" -msgstr "مشرف PX" - -#: templates/complaints/oncall/admin_form.html:155 -#, fuzzy -#| msgid "PX Staff" -msgid "PX Staff" -msgstr "موظفو تجربة المرضى" +msgstr "PX Admins" #: templates/complaints/oncall/admin_form.html:164 -#, fuzzy -#| msgid "Hospital Admin" msgid "Hospital Admins" -msgstr "مشرف المستشفى" +msgstr "إداريو المستشفى" #: templates/complaints/oncall/admin_form.html:173 -#, fuzzy -#| msgid "No available PX Admins" msgid "No available users" -msgstr "لا يوجد مسؤولين متاحين لـ PX" +msgstr "لا يوجد مستخدمون متاحون" #: templates/complaints/oncall/admin_form.html:179 -#, fuzzy -#| msgid "All PX Admins are already assigned to this schedule." msgid "All eligible users are already assigned to this schedule." -msgstr "جميع مسؤولي PX مُعينون بالفعل لهذا الجدول." +msgstr "جميع المستخدمين المؤهلين تم تعيينهم بالفعل لهذا الجدول." #: templates/complaints/oncall/admin_form.html:188 #: templates/complaints/oncall/schedule_detail.html:92 -#: templates/dashboard/employee_evaluation.html:1045 -#: templates/organizations/staff_list.html:209 +#: templates/dashboard/employee_evaluation.html:1126 msgid "Admin" msgstr "مسؤول" @@ -13459,7 +17742,7 @@ msgstr "ساعات العمل" #: templates/complaints/oncall/dashboard.html:78 #: templates/complaints/oncall/schedule_detail.html:62 -#: templates/complaints/public_complaint_track.html:163 +#: templates/complaints/public_inquiry_track.html:163 #: templates/observations/public_track.html:163 msgid "Current Status" msgstr "الحالة الحالية" @@ -13554,8 +17837,8 @@ msgid "" "Outside working hours, only ON-CALL admins are notified via BOTH email and " "SMS." msgstr "" -"خارج ساعات العمل، يتم إخطار مسؤولي المناوبة فقط عبر البريد الإلكتروني ورسائل" -" SMS." +"خارج ساعات العمل، يتم إخطار مسؤولي المناوبة فقط عبر البريد الإلكتروني ورسائل " +"SMS." #: templates/complaints/oncall/schedule_detail.html:19 msgid "System-wide Configuration" @@ -13572,8 +17855,8 @@ msgid "Working Days" msgstr "أيام العمل" #: templates/complaints/oncall/schedule_detail.html:120 -#: templates/observations/observation_list.html:284 -#: templates/surveys/comment_list.html:344 +#: templates/observations/observation_list.html:286 +#: templates/surveys/comment_list.html:371 msgid "to" msgstr "إلى" @@ -13599,8 +17882,8 @@ msgstr "أضف أول مسؤول نوبات" #: templates/complaints/oncall/schedule_detail.html:191 msgid "" -"Are you sure you want to delete this schedule? All on-call admin assignments" -" will be removed." +"Are you sure you want to delete this schedule? All on-call admin assignments " +"will be removed." msgstr "" "هل أنت متأكد أنك تريد حذف هذا الجدول؟ سيتم إزالة جميع تعيينات المسؤولين في " "الجاهزية." @@ -13669,15 +17952,15 @@ msgstr "المنطقة الزمنية" #: templates/complaints/oncall/schedule_form.html:283 msgid "" -"During working hours, ALL PX Admins are notified of new complaints via email" -" only. Outside working hours (after work end time, before work start time, " -"or on non-working days), only the on-call admins assigned to this schedule " -"will be notified via BOTH email and SMS." +"During working hours, ALL PX Admins are notified of new complaints via email " +"only. Outside working hours (after work end time, before work start time, or " +"on non-working days), only the on-call admins assigned to this schedule will " +"be notified via BOTH email and SMS." msgstr "" "خلال ساعات العمل، يتم إخطار جميع مسؤولي PX بالشكاوى الجديدة عبر البريد " "الإلكتروني فقط. خارج ساعات العمل (بعد وقت انتهاء العمل، قبل وقت بدء العمل، " -"أو في أيام غير العمل)، سيتم إخطار المسؤولين المنوبين المعيّنين في هذا الجدول" -" فقط عبر البريد الإلكتروني والرسائل النصية." +"أو في أيام غير العمل)، سيتم إخطار المسؤولين المنوبين المعيّنين في هذا الجدول " +"فقط عبر البريد الإلكتروني والرسائل النصية." #: templates/complaints/oncall/schedule_form.html:297 msgid "Update Schedule" @@ -13709,18 +17992,27 @@ msgstr "" "قم بإنشاء جدول نوبات العمل الأول الخاص بك لتهيئة ساعات العمل وتعيين مسؤولي " "النوبات للإشعارات الخاصة بشكاوى ما بعد ساعات العمل." -#: templates/complaints/partials/actions_panel.html:28 -msgid "No PX actions created yet" -msgstr "لم يتم إنشاء أي إجراءات PX حتى الآن" - -#: templates/complaints/partials/actions_panel.html:31 -#: templates/complaints/partials/ai_panel.html:93 -#: templates/complaints/partials/ai_panel.html:112 +#: templates/complaints/partials/actions_panel.html:8 +#: templates/complaints/partials/ai_panel.html:94 +#: templates/complaints/partials/ai_panel.html:115 #: templates/observations/partials/ai_panel.html:81 #: templates/observations/partials/ai_panel.html:99 msgid "Create Action" msgstr "إنشاء إجراء" +#: templates/complaints/partials/actions_panel.html:16 +#: templates/feedback/feedback_detail.html:347 +msgid "Initiate RCA" +msgstr "بدء تحليل السبب الجذري" + +#: templates/complaints/partials/actions_panel.html:45 +msgid "No PX actions created yet" +msgstr "لم يتم إنشاء أي إجراءات PX حتى الآن" + +#: templates/complaints/partials/actions_panel.html:46 +msgid "Use the buttons above to create an action, QI project, or RCA." +msgstr "استخدم الأزرار أعلاه لإنشاء إجراء، أو مشروع تحسين الجودة، أو RCA." + #: templates/complaints/partials/adverse_actions_panel.html:15 msgid "Report" msgstr "تقرير" @@ -13757,203 +18049,267 @@ msgstr "لم يتم الإبلاغ عن أي إجراءات سلبية لهذه msgid "Report an adverse action" msgstr "الإبلاغ عن إجراء سلبي" -#: templates/complaints/partials/ai_panel.html:12 -#: templates/complaints/partials/ai_panel.html:191 -#, fuzzy -#| msgid "Re-analyze" -msgid "Reanalyze" -msgstr "إعادة التحليل" +#: templates/complaints/partials/ai_helper_panel.html:6 +msgid "Get AI Resolution Suggestions" +msgstr "الحصول على اقتراحات الحل بالذكاء الاصطناعي" -#: templates/complaints/partials/ai_panel.html:63 -#: templates/complaints/partials/ai_panel.html:218 +#: templates/complaints/partials/ai_helper_panel.html:8 +msgid "AI will analyze this complaint and suggest how to resolve it" +msgstr "سيقوم الذكاء الاصطناعي بتحليل هذه الشكوى واقتراح كيفية حلها" + +#: templates/complaints/partials/ai_helper_panel.html:15 +msgid "Analyzing complaint..." +msgstr "جارٍ تحليل الشكوى..." + +#: templates/complaints/partials/ai_helper_panel.html:31 +msgid "Resolution Suggestions" +msgstr "اقتراحات الحلول" + +#: templates/complaints/partials/ai_helper_panel.html:45 +#: templates/complaints/partials/ai_panel.html:353 +msgid "Recommended Next Steps" +msgstr "الخطوات التالية الموصى بها" + +#: templates/complaints/partials/ai_helper_panel.html:55 +#: templates/complaints/partials/ai_panel.html:363 +msgid "Communication Tip" +msgstr "نصيحة تواصلية" + +#: templates/complaints/partials/ai_helper_panel.html:60 +#: templates/complaints/partials/ai_panel.html:368 +msgid "Regenerate suggestions" +msgstr "إعادة توليد الاقتراحات" + +#: templates/complaints/partials/ai_panel.html:13 +#: templates/complaints/partials/ai_panel.html:198 +msgid "Reanalyze" +msgstr "إعادة تحليل" + +#: templates/complaints/partials/ai_panel.html:65 +#: templates/complaints/partials/ai_panel.html:225 +#: templates/feedback/feedback_detail.html:250 #: templates/observations/partials/ai_panel.html:51 msgid "Suggested Actions" msgstr "الإجراءات المقترحة" -#: templates/complaints/partials/ai_panel.html:123 +#: templates/complaints/partials/ai_panel.html:127 msgid "No AI analysis available for this complaint" msgstr "لا تتوفر تحليلات الذكاء الاصطناعي لهذه الشكوى" -#: templates/complaints/partials/ai_panel.html:125 -#, fuzzy -#| msgid "Click Nodes" +#: templates/complaints/partials/ai_panel.html:129 msgid "Click \\" -msgstr "انقر على العقد" +msgstr "انقر \\" -#: templates/complaints/partials/ai_panel.html:170 -#, fuzzy -#| msgid "Generating AI analysis... This may take a moment." +#: templates/complaints/partials/ai_panel.html:141 +msgid "AI Resolution Helper" +msgstr "مساعد الحلول بالذكاء الاصطناعي" + +#: templates/complaints/partials/ai_panel.html:144 +msgid "" +"Get AI-powered suggestions on how to resolve this complaint based on its " +"content and any explanations received." +msgstr "" +"احصل على اقتراحات مدعومة بالذكاء الاصطناعي حول كيفية حل هذه الشكوى بناءً على " +"محتواها وأي تفسيرات واردة." + +#: templates/complaints/partials/ai_panel.html:149 +msgid "Get Resolution Suggestions" +msgstr "الحصول على اقتراحات الحل" + +#: templates/complaints/partials/ai_panel.html:177 msgid "Analyzing complaint with AI, this may take a moment..." -msgstr "جاري إنشاء تحليل الذكاء الاصطناعي... قد يستغرق هذا بضع لحظات." +msgstr "تحليل الشكوى باستخدام الذكاء الاصطناعي، قد يستغرق ذلك لحظة..." -#: templates/complaints/partials/ai_panel.html:191 -#, fuzzy -#| msgid "Analysis confidence" +#: templates/complaints/partials/ai_panel.html:198 msgid "Analysis complete" -msgstr "مستوى الثقة في التحليل" - -#: templates/complaints/partials/ai_panel.html:240 -#, fuzzy -#| msgid "Refresh" -msgid "Refresh Page" -msgstr "تحديث" +msgstr "تم التحليل" #: templates/complaints/partials/ai_panel.html:247 +msgid "Refresh Page" +msgstr "تحديث الصفحة" + +#: templates/complaints/partials/ai_panel.html:254 #: templates/observations/partials/ai_panel.html:120 msgid "Are you sure you want to create a PX Action from this suggestion?" msgstr "هل أنت متأكد من رغبتك في إنشاء إجراء تجربة المريض من هذا الاقتراح؟" -#: templates/complaints/partials/ai_panel.html:277 -#: templates/observations/partials/ai_panel.html:148 +#: templates/complaints/partials/ai_panel.html:262 +#: templates/observations/partials/ai_panel.html:127 msgid "CSRF token not found. Please refresh the page." msgstr "لم يتم العثور على رمز CSRF. يرجي تحديث الصفحة." -#: templates/complaints/partials/ai_panel.html:298 -#: templates/observations/partials/ai_panel.html:168 +#: templates/complaints/partials/ai_panel.html:283 +#: templates/observations/partials/ai_panel.html:147 msgid "PX Action created successfully!" msgstr "تم إنشاء إجراء PX بنجاح!" -#: templates/complaints/partials/ai_panel.html:306 -#: templates/observations/partials/ai_panel.html:173 +#: templates/complaints/partials/ai_panel.html:291 +#: templates/observations/partials/ai_panel.html:152 msgid "Failed to create action" msgstr "فشل في إنشاء الإجراء" -#: templates/complaints/partials/ai_panel.html:311 -#: templates/observations/partials/ai_panel.html:178 +#: templates/complaints/partials/ai_panel.html:296 +#: templates/observations/partials/ai_panel.html:157 msgid "An error occurred while creating the action" msgstr "حدث خطأ أثناء إنشاء الإجراء" -#: templates/complaints/partials/departments_panel.html:8 -#: templates/organizations/department_list.html:100 -#: templates/organizations/department_list.html:217 -msgid "Add Department" -msgstr "إضافة قسم" +#: templates/complaints/partials/ai_panel.html:324 +msgid "Analyzing complaint for resolution suggestions..." +msgstr "جارٍ تحليل الشكوى لاقتراح الحلول..." + +#: templates/complaints/partials/departments_panel.html:18 +#: templates/surveys/comment_list.html:126 +msgid "AI" +msgstr "الذكاء الاصطناعي" #: templates/complaints/partials/departments_panel.html:23 -#, fuzzy -#| msgid "Suggestion" -msgid "AI Suggestion" -msgstr "اقتراح" - -#: templates/complaints/partials/departments_panel.html:25 -#, fuzzy -#| msgid "This department is already involved in this complaint." -msgid "AI suggested this department based on the complaint analysis." -msgstr "هذا القسم مشارك بالفعل في هذه الشكوى." - -#: templates/complaints/partials/departments_panel.html:31 -#, fuzzy -#| msgid "Configure" +#: templates/config/hospital_users.html:470 +#: templates/config/hospital_users.html:630 msgid "Confirm" -msgstr "إعداد" +msgstr "تأكيد" -#: templates/complaints/partials/departments_panel.html:55 -msgid "Assigned to:" -msgstr "مُعيَّن إلى:" +#: templates/complaints/partials/departments_panel.html:96 +#, fuzzy +#| msgid "Accepted" +msgid "Accept" +msgstr "مقبول" -#: templates/complaints/partials/departments_panel.html:72 -msgid "Response Submitted" -msgstr "تم إرسال الرد" +#: templates/complaints/partials/departments_panel.html:100 +#, fuzzy +#| msgid "Select Section (optional)" +msgid "Reason for rejection (optional):" +msgstr "اختر القسم (اختياري)" -#: templates/complaints/partials/departments_panel.html:87 -msgid "Submit Response" -msgstr "إرسال الرد" - -#: templates/complaints/partials/departments_panel.html:97 +#: templates/complaints/partials/departments_panel.html:114 msgid "Are you sure you want to remove this department?" msgstr "هل أنت متأكد من رغبتك في إزالة هذا القسم؟" -#: templates/complaints/partials/departments_panel.html:99 -#: templates/complaints/partials/staff_panel.html:81 -#: templates/projects/template_form.html:197 -msgid "Remove" -msgstr "إزالة" - -#: templates/complaints/partials/departments_panel.html:112 -msgid "No departments involved yet" -msgstr "لا توجد أقسام مشاركة حتى الآن" - -#: templates/complaints/partials/departments_panel.html:116 +#: templates/complaints/partials/departments_panel.html:135 msgid "Add First Department" msgstr "إضافة القسم الأول" -#: templates/complaints/partials/explanation_panel.html:10 -#: templates/complaints/partials/explanation_panel.html:21 -msgid "Explanation Delay Reason" -msgstr "شرح سبب التأخير" +#: templates/complaints/partials/explanation_panel.html:32 +#: templates/complaints/partials/explanation_panel.html:162 +msgid "Rejected by Manager" +msgstr "مرفوض من المدير" -#: templates/complaints/partials/explanation_panel.html:22 -msgid "Enter reason for delay in receiving explanation..." -msgstr "أدخل سبب التأخير في استلام التفسير..." +#: templates/complaints/partials/explanation_panel.html:36 +#, fuzzy +#| msgid "Reported - Awaiting Review" +msgid "Approved — Awaiting PX Review" +msgstr "تم الإبلاغ - بانتظار المراجعة" -#: templates/complaints/partials/explanation_panel.html:35 -msgid "Request More Explanations" -msgstr "طلب مزيد من التفسيرات" +#: templates/complaints/partials/explanation_panel.html:44 +#, fuzzy +#| msgid "Rejected by Manager" +msgid "Rejected by PX" +msgstr "مرفوض من المدير" -#: templates/complaints/partials/explanation_panel.html:81 +#: templates/complaints/partials/explanation_panel.html:57 +#, fuzzy +#| msgid "Manager Review" +msgid "Manager Review Answers" +msgstr "مراجعة المدير" + +#: templates/complaints/partials/explanation_panel.html:82 +#, fuzzy +#| msgid "Send to Department" +msgid "Send to Another Department" +msgstr "إرسال إلى القسم" + +#: templates/complaints/partials/explanation_panel.html:138 msgid "Escalated to Manager" msgstr "تم التصعيد إلى المدير" -#: templates/complaints/partials/explanation_panel.html:97 +#: templates/complaints/partials/explanation_panel.html:156 +msgid "Awaiting department manager approval." +msgstr "في انتظار موافقة مدير القسم." + +#: templates/complaints/partials/explanation_panel.html:164 +msgid "Champion needs to re-submit." +msgstr "يحتاج المشرف إلى إعادة التقديم" + +#: templates/complaints/partials/explanation_panel.html:172 msgid "attachment(s)" msgstr "مرفق(ات)" -#: templates/complaints/partials/explanation_panel.html:116 +#: templates/complaints/partials/explanation_panel.html:195 msgid "Not Acceptable & Escalate" msgstr "غير مقبول وتصعيد" -#: templates/complaints/partials/explanation_panel.html:119 +#: templates/complaints/partials/explanation_panel.html:198 msgid "Cannot escalate: Staff has no manager assigned" msgstr "لا يمكن التصعيد: لا يوجد مدير مُعيّن للموظف" -#: templates/complaints/partials/explanation_panel.html:120 +#: templates/complaints/partials/explanation_panel.html:199 msgid "No Manager to Escalate" msgstr "لا يوجد مدير للتصعيد إليه" -#: templates/complaints/partials/explanation_panel.html:126 +#: templates/complaints/partials/explanation_panel.html:205 msgid "Reviewed by:" msgstr "تمت المراجعة بواسطة:" -#: templates/complaints/partials/explanation_panel.html:141 -msgid "Send Reminder" -msgstr "إرسال تذكير" +#: templates/complaints/partials/explanation_panel.html:227 +#: templates/organizations/department_detail.html:265 +msgid "questions" +msgstr "الأسئلة" -#: templates/complaints/partials/explanation_panel.html:145 +#: templates/complaints/partials/explanation_panel.html:280 +#: templates/organizations/department_detail.html:293 +msgid "Review & Submit Reply" +msgstr "مراجعة وإرسال الرد" + +#: templates/complaints/partials/explanation_panel.html:286 +msgid "Final Reply" +msgstr "الرد النهائي" + +#: templates/complaints/partials/explanation_panel.html:294 +msgid "Negligence" +msgstr "إهمال" + +#: templates/complaints/partials/explanation_panel.html:297 +msgid "Policy Issue" +msgstr "مشكلة سياسات" + +#: templates/complaints/partials/explanation_panel.html:300 +msgid "Improvement Project" +msgstr "مشروع تحسين" + +#: templates/complaints/partials/explanation_panel.html:307 +msgid "Improvement Project Recommended" +msgstr "يُوصى بمشروع تحسين" + +#: templates/complaints/partials/explanation_panel.html:324 msgid "Send Second Reminder" msgstr "إرسال تذكير ثانٍ" -#: templates/complaints/partials/explanation_panel.html:149 +#: templates/complaints/partials/explanation_panel.html:328 msgid "Reminders Sent" msgstr "تم إرسال التذكيرات" -#: templates/complaints/partials/explanation_panel.html:153 +#: templates/complaints/partials/explanation_panel.html:332 msgid "Resend Link" msgstr "إعادة إرسال الرابط" -#: templates/complaints/partials/explanation_panel.html:158 +#: templates/complaints/partials/explanation_panel.html:337 msgid "1st reminder:" msgstr "التذكير الأول:" -#: templates/complaints/partials/explanation_panel.html:160 +#: templates/complaints/partials/explanation_panel.html:339 msgid "2nd reminder:" msgstr "التذكير الثاني:" -#: templates/complaints/partials/explanation_panel.html:172 -msgid "No explanation requests sent yet" -msgstr "لم يتم إرسال أي طلبات توضيح حتى الآن" +#: templates/complaints/partials/explanation_panel.html:352 +#, fuzzy +#| msgid "Not requests sent yet" +msgid "No requests sent yet" +msgstr "لم يتم إرسال أي طلبات بعد" -#: templates/complaints/partials/explanation_panel.html:175 -#: templates/complaints/request_explanation_form.html:4 -#: templates/complaints/request_explanation_form.html:103 -#: templates/complaints/request_explanation_form.html:105 -msgid "Request Explanation" -msgstr "طلب إيضاح" - -#: templates/complaints/partials/explanation_panel.html:189 +#: templates/complaints/partials/explanation_panel.html:370 msgid "Escalate to Manager" msgstr "تحويل إلى المدير" -#: templates/complaints/partials/explanation_panel.html:191 +#: templates/complaints/partials/explanation_panel.html:372 msgid "" "This will mark the explanation as not acceptable and send a request to the " "staff's manager for an explanation." @@ -13961,137 +18317,246 @@ msgstr "" "سيؤدي هذا إلى تحديد التفسير على أنه غير مقبول وإرسال طلب إلى مدير الموظفين " "للحصول على تفسير." -#: templates/complaints/partials/explanation_panel.html:196 +#: templates/complaints/partials/explanation_panel.html:377 msgid "Notes (Optional)" msgstr "ملاحظات (اختياري)" -#: templates/complaints/partials/explanation_panel.html:197 -msgid "Reason for escalation..." -msgstr "سبب التصعيد..." - -#: templates/complaints/partials/explanation_panel.html:215 +#: templates/complaints/partials/explanation_panel.html:396 msgid "first" msgstr "أولاً" -#: templates/complaints/partials/explanation_panel.html:215 +#: templates/complaints/partials/explanation_panel.html:396 msgid "second" msgstr "ثاني" -#: templates/complaints/partials/explanation_panel.html:216 +#: templates/complaints/partials/explanation_panel.html:397 msgid "Are you sure you want to send the" msgstr "هل أنت متأكد من رغبتك في إرسال" -#: templates/complaints/partials/explanation_panel.html:216 +#: templates/complaints/partials/explanation_panel.html:397 msgid "reminder?" msgstr "التذكير؟" -#: templates/complaints/partials/explanation_panel.html:238 +#: templates/complaints/partials/explanation_panel.html:419 msgid "Failed to send reminder. Please try again." msgstr "فشل في إرسال التذكير. يرجى المحاولة مرة أخرى." -#: templates/complaints/partials/explanation_panel.html:249 +#: templates/complaints/partials/explanation_panel.html:430 msgid "Are you sure you want to resend the explanation request?" msgstr "هل أنت متأكد من أنك تريد إعادة إرسال طلب التفسير؟" -#: templates/complaints/partials/explanation_panel.html:262 +#: templates/complaints/partials/explanation_panel.html:443 msgid "Explanation request resent successfully!" msgstr "تم إعادة إرسال طلب التفسير بنجاح!" -#: templates/complaints/partials/explanation_panel.html:264 +#: templates/complaints/partials/explanation_panel.html:445 msgid "Failed to resend explanation request. Please try again." msgstr "فشل في إعادة إرسال طلب التفسير. يرجى المحاولة مرة أخرى." -#: templates/complaints/partials/explanation_panel.html:274 +#: templates/complaints/partials/explanation_panel.html:455 msgid "mark as acceptable" msgstr "تحديد على أنه مقبول" -#: templates/complaints/partials/explanation_panel.html:274 +#: templates/complaints/partials/explanation_panel.html:455 msgid "mark as not acceptable" msgstr "تحديد على أنه غير مقبول" -#: templates/complaints/partials/explanation_panel.html:275 +#: templates/complaints/partials/explanation_panel.html:456 msgid "Are you sure you want to" msgstr "هل أنت متأكد من أنك تريد" -#: templates/complaints/partials/explanation_panel.html:297 +#: templates/complaints/partials/explanation_panel.html:478 msgid "Failed to update explanation status. Please try again." msgstr "فشل تحديث حالة التفسير. يرجى المحاولة مرة أخرى." -#: templates/complaints/partials/explanation_panel.html:312 +#: templates/complaints/partials/explanation_panel.html:492 msgid "Error: Invalid explanation ID. Please refresh the page and try again." msgstr "خطأ: معرف التفسير غير صالح. يرجى تحديث الصفحة والمحاولة مرة أخرى." -#: templates/complaints/partials/explanation_panel.html:354 +#: templates/complaints/partials/explanation_panel.html:532 msgid "Error: No explanation selected. Please try again." msgstr "خطأ: لم يتم اختيار أي تفسير. يرجى المحاولة مرة أخرى." -#: templates/complaints/partials/explanation_panel.html:375 +#: templates/complaints/partials/explanation_panel.html:553 msgid "Failed to escalate. Please try again." msgstr "فشل التصعيد. يرجى المحاولة مرة أخرى." +#: templates/complaints/partials/inquiry_timeline_panel.html:8 +#: templates/complaints/partials/timeline_panel.html:8 +#: templates/dashboard/my_dashboard.html:299 +#: templates/observations/partials/observation_timeline_panel.html:8 +msgid "No activity recorded yet" +msgstr "لا يوجد نشاط مسجل بعد" + +#: templates/complaints/partials/inquiry_timeline_panel.html:38 +#: templates/complaints/partials/timeline_panel.html:38 +#: templates/observations/partials/observation_timeline_panel.html:38 +msgid "Total Time" +msgstr "الوقت الإجمالي" + +#: templates/complaints/partials/pdf_summary_panel.html:10 +#, fuzzy +#| msgid "Generate a complaint report PDF with AI-generated summaries." +msgid "" +"Generate a complaint report PDF with the actual complaint and department " +"response." +msgstr "" +"إنشاء تقرير شكوى بصيغة PDF مع ملخصات تم إنشاؤها بواسطة الذكاء الاصطناعي." + +#: templates/complaints/partials/pdf_summary_panel.html:16 +msgid "Checking..." +msgstr "جارٍ التحقق..." + +#: templates/complaints/partials/pdf_summary_panel.html:31 +#, fuzzy +#| msgid "Search reports..." +msgid "Preparing report..." +msgstr "البحث في التقارير..." + +#: templates/complaints/partials/pdf_summary_panel.html:32 +#, fuzzy +#| msgid "No Complaint Data" +msgid "Compiling complaint data" +msgstr "لا توجد بيانات للشكاوى" + +#: templates/complaints/partials/pdf_summary_panel.html:38 +#, fuzzy +#| msgid "Complaint ID" +msgid "Complaint Info" +msgstr "رقم الشكوى" + +#: templates/complaints/partials/pdf_summary_panel.html:49 +#, fuzzy +#| msgid "Submission Time:" +msgid "Submission Date" +msgstr "وقت الإرسال:" + +#: templates/complaints/partials/pdf_summary_panel.html:62 +#: templates/organizations/staff_detail.html:4 +msgid "Staff Details" +msgstr "تفاصيل الموظف" + +#: templates/complaints/partials/pdf_summary_panel.html:65 +#: templates/dashboard/admin_evaluation.html:459 +#: templates/dashboard/admin_evaluation.html:536 +#: templates/dashboard/department_benchmarks.html:127 +msgid "Staff Name" +msgstr "اسم الموظف" + +#: templates/complaints/partials/pdf_summary_panel.html:69 +#: templates/organizations/department_detail.html:517 +#: templates/organizations/department_staff_detail.html:377 +#: templates/organizations/staff_form.html:189 +#: templates/organizations/staff_hierarchy.html:232 +#: templates/organizations/staff_list.html:267 +msgid "Job Title" +msgstr "المسمى الوظيفي" + +#: templates/complaints/partials/pdf_summary_panel.html:73 +#, fuzzy +#| msgid "Send to Dept" +msgid "Sent to Dept" +msgstr "إرسال إلى القسم" + +#: templates/complaints/partials/pdf_summary_panel.html:77 +#, fuzzy +#| msgid "Response Data" +msgid "Response Date" +msgstr "بيانات الاستجابة" + +#: templates/complaints/partials/pdf_summary_panel.html:95 +#, fuzzy +#| msgid "Generate" +msgid "Generate PDF" +msgstr "إنشاء" + +#: templates/complaints/partials/pdf_summary_panel.html:103 +msgid "Generating your PDF..." +msgstr "جارٍ إنشاء ملف PDF الخاص بك..." + +#: templates/complaints/partials/pdf_summary_panel.html:112 +msgid "PDF report ready" +msgstr "تقرير PDF جاهز" + +#: templates/complaints/partials/pdf_summary_panel.html:113 +msgid "You can download or regenerate the report" +msgstr "يمكنك تنزيل التقرير أو إعادة إنشائه" + +#: templates/complaints/partials/pdf_summary_panel.html:130 +#, fuzzy +#| msgid "Refresh Page" +msgid "Refresh Data" +msgstr "تحديث الصفحة" + +#: templates/complaints/partials/pdf_summary_panel.html:140 +msgid "Generation Failed" +msgstr "فشل في التوليد" + +#: templates/complaints/partials/pdf_summary_panel.html:270 +#: templates/complaints/partials/pdf_summary_panel.html:344 +msgid "An unexpected error occurred" +msgstr "حدث خطأ غير متوقع" + #: templates/complaints/partials/priority_badge.html:20 #: templates/complaints/partials/severity_badge.html:20 +#: templates/partials/notes_panel.html:35 #: templates/references/document_view.html:264 msgid "Unknown" msgstr "غير معروف" -#: templates/complaints/partials/rca_panel.html:5 -#: templates/rca/rca_list.html:5 templates/rca/rca_list.html:70 +#: templates/complaints/partials/rca_panel.html:3 templates/rca/rca_list.html:5 +#: templates/rca/rca_list.html:70 msgid "Root Cause Analysis" msgstr "تحليل السبب الجذري" -#: templates/complaints/partials/rca_panel.html:6 +#: templates/complaints/partials/rca_panel.html:4 msgid "" "Structured analysis to identify underlying causes and prevent recurrence." msgstr "تحليل منظم لتحديد الأسباب الأساسية ومنع التكرار." -#: templates/complaints/partials/rca_panel.html:48 +#: templates/complaints/partials/rca_panel.html:36 #: templates/rca/rca_detail.html:257 -#, fuzzy -#| msgid "Root Cause Analysis" msgid "Root Causes" -msgstr "تحليل السبب الجذري" +msgstr "الأسباب الجذرية" -#: templates/complaints/partials/rca_panel.html:59 -#, fuzzy -#| msgid "Root Cause Analyses" +#: templates/complaints/partials/rca_panel.html:51 msgid "No Root Cause Analyses yet" -msgstr "تحليلات السبب الجذري" +msgstr "لا توجد تحليلات للأسباب الجذرية بعد" -#: templates/complaints/partials/rca_panel.html:60 -msgid "Initiate an RCA to investigate the root causes of this complaint." -msgstr "بدء تحليل السبب الجذري للتحقق من الأسباب الأساسية لهذه الشكوى." +#: templates/complaints/partials/rca_panel.html:52 +msgid "Use the Initiate RCA button above to start investigating." +msgstr "استخدم زر بدء تحليل السبب الجذري (RCA) أعلاه لبدء التحقيق." -#: templates/complaints/partials/resolution_panel.html:18 -#: templates/complaints/partials/resolution_panel.html:107 +#: templates/complaints/partials/resolution_panel.html:19 +#: templates/complaints/partials/resolution_panel.html:164 msgid "Resolution Outcome" msgstr "نتيجة الحل" -#: templates/complaints/partials/resolution_panel.html:41 +#: templates/complaints/partials/resolution_panel.html:42 msgid "Resolved at:" msgstr "تم الحل في:" -#: templates/complaints/partials/resolution_panel.html:48 -msgid "Pending Resolution" -msgstr "قيد الانتظار للحل" +#: templates/complaints/partials/resolution_panel.html:44 +msgid "Pending External since:" +msgstr "معلق خارجي منذ:" -#: templates/complaints/partials/resolution_panel.html:50 -msgid "This complaint has not been resolved yet." -msgstr "لم يتم حل هذه الشكوى بعد." +#: templates/complaints/partials/resolution_panel.html:53 +msgid "Patient Satisfaction" +msgstr "رضا المريض" -#: templates/complaints/partials/resolution_panel.html:64 -msgid "Analyze Complaint & Generate Resolution Note" -msgstr "تحليل الشكوى وإنشاء مذكرة الحل" +#: templates/complaints/partials/resolution_panel.html:86 +msgid "Set satisfaction based on patient follow-up call:" +msgstr "تعيين مستوى الرضا بناءً على مكالمة متابعة المريض:" -#: templates/complaints/partials/resolution_panel.html:69 -msgid "AI is analyzing complaint and explanations..." -msgstr "يقوم الذكاء الاصطناعي بتحليل الشكوى والشرح..." +#: templates/complaints/partials/resolution_panel.html:115 +msgid "No satisfaction feedback recorded yet." +msgstr "لم يتم تسجيل أي ملاحظات عن الرضا حتى الآن." -#: templates/complaints/partials/resolution_panel.html:76 +#: templates/complaints/partials/resolution_panel.html:129 msgid "Select AI Generated Resolution" msgstr "اختر الحل المولّد بالذكاء الاصطناعي" -#: templates/complaints/partials/resolution_panel.html:96 +#: templates/complaints/partials/resolution_panel.html:149 msgid "" "Click on a card to select. You can edit the selected resolution in the text " "area below before submitting." @@ -14099,68 +18564,62 @@ msgstr "" "انقر على بطاقة للاختيار. يمكنك تعديل القرار المحدد في منطقة النص أدناه قبل " "الإرسال." -#: templates/complaints/partials/resolution_panel.html:108 -msgid "Who was in wrong / who was in right?" -msgstr "من كان في الخطأ / من كان في الصواب؟" +#: templates/complaints/partials/resolution_panel.html:158 +msgid "" +"This resolution will be sent to the patient via SMS and Email upon complaint " +"closure." +msgstr "" +"سيتم إرسال هذا القرار إلى المريض عبر الرسائل النصية والبريد الإلكتروني عند " +"إغلاق الشكوى." -#: templates/complaints/partials/resolution_panel.html:110 +#: templates/complaints/partials/resolution_panel.html:165 +msgid "who was in right?" +msgstr "من كان على حق؟" + +#: templates/complaints/partials/resolution_panel.html:167 msgid "Select Outcome" msgstr "اختر النتيجة" -#: templates/complaints/partials/resolution_panel.html:119 +#: templates/complaints/partials/resolution_panel.html:175 msgid "Please Specify" msgstr "يرجى التحديد" -#: templates/complaints/partials/resolution_panel.html:120 +#: templates/complaints/partials/resolution_panel.html:176 msgid "Specify who was in wrong/right..." msgstr "حدد من كان في الخطأ / من كان في الصواب..." -#: templates/complaints/partials/resolution_panel.html:124 +#: templates/complaints/partials/resolution_panel.html:185 +msgid "Analyze & Generate" +msgstr "تحليل وإنشاء" + +#: templates/complaints/partials/resolution_panel.html:189 msgid "Mark as Resolved" msgstr "وضع علامة على أنها محلولة" -#: templates/complaints/partials/resolution_panel.html:131 +#: templates/complaints/partials/resolution_panel.html:196 +msgid "AI is analyzing complaint and explanations..." +msgstr "يقوم الذكاء الاصطناعي بتحليل الشكوى والشرح..." + +#: templates/complaints/partials/resolution_panel.html:205 msgid "Activate this complaint to resolve it" msgstr "تنشيط هذه الشكوى لحلها" -#: templates/complaints/partials/resolution_panel.html:155 +#: templates/complaints/partials/resolution_panel.html:229 msgid "CSRF token not found. Please refresh the page and try again." msgstr "رمز CSRF غير موجود. يرجى تحديث الصفحة والمحاولة مرة أخرى." -#: templates/complaints/partials/resolution_panel.html:200 +#: templates/complaints/partials/resolution_panel.html:274 msgid "Failed to generate resolution. Please try again." msgstr "فشل في إنشاء القرار. يرجى المحاولة مرة أخرى." -#: templates/complaints/partials/staff_panel.html:8 -#: templates/organizations/staff_hierarchy_d3.html:92 -#: templates/organizations/staff_list.html:364 -msgid "Add Staff" -msgstr "إضافة موظف" - -#: templates/complaints/partials/staff_panel.html:57 -msgid "Explanation Requested" -msgstr "طلب توضيح" - -#: templates/complaints/partials/staff_panel.html:79 +#: templates/complaints/partials/staff_panel.html:73 msgid "Are you sure you want to remove this staff member?" msgstr "هل أنت متأكد من رغبتك في إزالة هذا الموظف؟" #: templates/complaints/partials/staff_panel.html:94 -msgid "No staff members involved yet" -msgstr "لا يوجد موظفون مشاركون حتى الآن" - -#: templates/complaints/partials/staff_panel.html:98 msgid "Add First Staff" msgstr "إضافة أول موظف" -#: templates/complaints/partials/timeline_panel.html:3 -msgid "Activity Timeline" -msgstr "الجدول الزمني للنشاط" - -#: templates/complaints/partials/timeline_panel.html:29 -msgid "No activity recorded yet" -msgstr "لا يوجد نشاط مسجل بعد" - #: templates/complaints/patient_complaint_expired.html:4 #: templates/complaints/patient_complaint_expired.html:12 msgid "Link Expired" @@ -14183,20 +18642,14 @@ msgstr "العودة إلى الصفحة الرئيسية" #: templates/complaints/patient_complaint_portal.html:4 #: templates/complaints/patient_complaint_visit_form.html:4 #: templates/complaints/patient_complaint_visit_form.html:140 -#: templates/complaints/public_complaint_form.html:331 -#: templates/px_sources/source_user_create_complaint.html:268 +#: templates/complaints/public_complaint_form.html:150 +#: templates/px_sources/source_user_create_complaint.html:259 msgid "Submit Complaint" msgstr "إرسال الشكوى" -# Additional common translations -#: templates/complaints/patient_complaint_portal.html:31 -#: templates/complaints/public_complaint_success.html:166 -#: templates/layouts/partials/breadcrumbs.html:8 -msgid "Home" -msgstr "الرئيسية" - #: templates/complaints/patient_complaint_portal.html:40 #: templates/complaints/public_complaint_form.html:4 +#: templates/complaints/public_complaint_form.html:25 msgid "Submit a Complaint" msgstr "تقديم شكوى" @@ -14206,10 +18659,6 @@ msgid "" "the incident occurred." msgstr "نأسف لسماع تجربتك. يرجى اختيار المستشفى الذي وقع فيه الحادث." -#: templates/complaints/patient_complaint_portal.html:82 -msgid "visits" -msgstr "زيارات" - #: templates/complaints/patient_complaint_portal.html:94 msgid "No visits found for this patient" msgstr "لم يتم العثور على زيارات لهذا المريض" @@ -14267,7 +18716,7 @@ msgstr "تتبع شكواك" #: templates/config/dashboard.html:166 #: templates/organizations/hospital_list.html:4 #: templates/organizations/hospital_list.html:95 -#: templates/organizations/patient_list.html:179 +#: templates/organizations/patient_list.html:199 msgid "Hospitals" msgstr "المستشفيات" @@ -14281,7 +18730,7 @@ msgid "Admission" msgstr "الاستشفاء" #: templates/complaints/patient_complaint_visit_form.html:92 -#: templates/organizations/patient_detail.html:306 +#: templates/organizations/patient_detail.html:301 #: templates/physicians/doctor_rating_review.html:174 #: templates/physicians/individual_ratings_list.html:184 msgid "Doctor" @@ -14333,121 +18782,56 @@ msgstr "الزيارة قيد التقدم" msgid "No visits found for this hospital" msgstr "لم يتم العثور على زيارات لهذا المستشفى" -#: templates/complaints/public_complaint_form.html:162 -msgid "About This Form" -msgstr "حول هذا النموذج" - -#: templates/complaints/public_complaint_form.html:165 +#: templates/complaints/public_complaint_form.html:27 +#: templates/core/public_submit.html:297 msgid "" -"Use this form to submit a complaint about your experience at one of our " -"hospitals. We will review your complaint and get back to you as soon as " -"possible." -msgstr "" -"استخدم هذا النموذج لتقديم شكوى حول تجربتك في أحد مستشفياتنا. سنراجع الشكوى " -"ونتواصل معك في أقرب وقت." +"Report an issue with our services. We take all concerns seriously and will " +"investigate thoroughly." +msgstr "الإبلاغ عن مشكلة في الخدمات. نأخذ جميع الشكاوى بجدية ونحقق فيها." -#: templates/complaints/public_complaint_form.html:175 -msgid "Complainant Information" -msgstr "بيانات مقدم الشكوى" - -#: templates/complaints/public_complaint_form.html:184 -msgid "Please provide your full name." -msgstr "يرجى إدخال اسمك الكامل." - -#: templates/complaints/public_complaint_form.html:192 +#: templates/complaints/public_complaint_form.html:40 msgid "Select Relation" msgstr "اختر العلاقة" -#: templates/complaints/public_complaint_form.html:195 -msgid "Friend" -msgstr "صديق" - -#: templates/complaints/public_complaint_form.html:226 +#: templates/complaints/public_complaint_form.html:65 msgid "Name of patient involved" msgstr "اسم المريض المعني" -#: templates/complaints/public_complaint_form.html:231 +#: templates/complaints/public_complaint_form.html:69 msgid "National ID / Iqama No." msgstr "رقم الهوية الوطنية / الإقامة" -#: templates/complaints/public_complaint_form.html:234 +#: templates/complaints/public_complaint_form.html:70 msgid "10-digit National ID or Iqama number" msgstr "رقم الهوية الوطنية أو الإقامة المكون من 10 أرقام" -#: templates/complaints/public_complaint_form.html:266 -msgid "Location Selection" -msgstr "اختيار الموقع" +#: templates/complaints/public_complaint_form.html:99 +#: templates/complaints/public_inquiry_form.html:70 +#: templates/core/public_submit.html:511 +#: templates/observations/public_new.html:93 +msgid "Emergency (ER)" +msgstr "الطوارئ (ER)" -#: templates/complaints/public_complaint_form.html:269 -msgid "" -"Select the location where the incident occurred. Start with the general " -"area, then section and subsection if applicable." -msgstr "" -"اختر الموقع الذي وقعت فيه الحادثة. ابدأ بالمنطقة العامة، ثم القسم والقسم " -"الفرعي إذا كان ذلك مطبقًا." - -#: templates/complaints/public_complaint_form.html:286 -msgid "Main Section" -msgstr "القسم الرئيسي" - -#: templates/complaints/public_complaint_form.html:289 -#: templates/complaints/public_complaint_form.html:406 -#: templates/core/public_submit.html:813 -msgid "Select Main Section" -msgstr "اختر القسم الرئيسي" - -#: templates/complaints/public_complaint_form.html:309 +#: templates/complaints/public_complaint_form.html:144 msgid "Please describe your complaint in detail..." msgstr "يرجى وصف شكواك بالتفصيل..." -#: templates/complaints/public_complaint_form.html:318 -#: templates/core/public_submit.html:533 -#: templates/observations/observation_create.html:323 -#: templates/observations/public_new.html:173 -msgid "Click to upload files" -msgstr "انقر لتحميل الملفات" - -#: templates/complaints/public_complaint_form.html:319 -msgid "Images, PDF, Word (max 10MB each)" -msgstr "الصور، PDF، Word (حد أقصى 10 ميجابايت لكل منها)" - -#: templates/complaints/public_complaint_form.html:396 -msgid "Error loading locations" -msgstr "خطأ في تحميل المواقع" - -#: templates/complaints/public_complaint_form.html:513 -#: templates/complaints/public_inquiry_form.html:134 -#: templates/core/public_submit.html:381 +#: templates/complaints/public_complaint_form.html:281 +#: templates/complaints/public_inquiry_form.html:260 +#: templates/core/public_submit.html:392 msgid "Submitted Successfully!" msgstr "تم الإرسال بنجاح!" -#: templates/complaints/public_complaint_form.html:514 -#: templates/complaints/public_inquiry_form.html:135 +#: templates/complaints/public_complaint_form.html:281 +#: templates/complaints/public_inquiry_form.html:261 msgid "Your reference number is: " msgstr "رقم مرجعيك هو:" -#: templates/complaints/public_complaint_form.html:524 -#: templates/complaints/public_complaint_form.html:533 -#: templates/complaints/public_inquiry_form.html:144 -#: templates/complaints/public_inquiry_form.html:154 -#: templates/core/public_submit.html:446 templates/core/public_submit.html:461 -#: templates/core/public_submit.html:620 templates/core/public_submit.html:623 -#: templates/core/public_submit.html:727 templates/core/public_submit.html:730 -#: templates/core/public_submit.html:1021 -#: templates/core/public_submit.html:1030 -#: templates/dashboard/my_dashboard.html:504 -#: templates/dashboard/my_dashboard.html:508 -#: templates/physicians/doctor_rating_job_status.html:255 -#: templates/physicians/doctor_rating_job_status.html:277 -msgid "Error" -msgstr "خطأ" - -#: templates/complaints/public_complaint_form.html:525 -#: templates/complaints/public_complaint_form.html:534 -#: templates/complaints/public_inquiry_form.html:145 -#: templates/complaints/public_inquiry_form.html:155 -#: templates/core/public_submit.html:1022 -#: templates/core/public_submit.html:1031 +#: templates/complaints/public_complaint_form.html:286 +#: templates/complaints/public_complaint_form.html:290 +#: templates/complaints/public_inquiry_form.html:271 +#: templates/complaints/public_inquiry_form.html:281 +#: templates/core/public_submit.html:464 msgid "Failed to submit. Please try again." msgstr "فشل الإرسال. يرجى المحاولة مرة أخرى." @@ -14465,14 +18849,18 @@ msgstr "شكرًا لملاحظاتك. تم استلام الشكوى وجارٍ msgid "Save this number for future tracking" msgstr "احفظ هذا الرقم لمتابعته في المستقبل" +#: templates/complaints/public_complaint_success.html:102 +msgid "What Happens Next?" +msgstr "ماذا بعد؟" + #: templates/complaints/public_complaint_success.html:109 msgid "Your complaint will be reviewed by our team within 24 hours" msgstr "ستتم مراجعة الشكوى خلال 24 ساعة." #: templates/complaints/public_complaint_success.html:115 msgid "" -"You will receive updates via phone or email based on the contact information" -" provided" +"You will receive updates via phone or email based on the contact information " +"provided" msgstr "ستصلك تحديثات عبر الهاتف أو البريد الإلكتروني." #: templates/complaints/public_complaint_success.html:121 @@ -14489,8 +18877,8 @@ msgstr "تحتاج مساعدة فورية؟" #: templates/complaints/public_complaint_success.html:139 msgid "" -"If your complaint is urgent, please contact our Patient Relations department" -" directly at:" +"If your complaint is urgent, please contact our Patient Relations department " +"directly at:" msgstr "إذا كانت الشكوى عاجلة، يرجى التواصل مباشرة مع قسم علاقات المرضى على:" #: templates/complaints/public_complaint_success.html:147 @@ -14498,12 +18886,12 @@ msgid "Available Saturday to Thursday, 8:00 AM - 8:00 PM" msgstr "متاح من السبت إلى الخميس، 8:00 ص – 8:00 م" #: templates/complaints/public_complaint_success.html:161 -#: templates/observations/public_success.html:172 +#: templates/observations/public_success.html:168 msgid "Submit Another" msgstr "إرسال ملاحظة أخرى" #: templates/complaints/public_complaint_success.html:188 -#: templates/layouts/public_base.html:228 +#: templates/layouts/public_base.html:215 msgid "Your feedback helps us improve our services" msgstr "ملاحظاتك تساعدنا على تحسين خدماتنا" @@ -14513,39 +18901,44 @@ msgid "" msgstr "أدخل رقم المرجع الخاص بك أدناه لترى تحديثات فورية على طلبك." #: templates/complaints/public_complaint_track.html:125 +#: templates/core/public_track.html:154 templates/core/public_track.html:329 msgid "e.g., CMP-20240101-123456" msgstr "مثال: CMP-20240101-123456" #: templates/complaints/public_complaint_track.html:132 -#: templates/observations/public_success.html:167 +#: templates/complaints/public_inquiry_track.html:132 +#: templates/core/public_track.html:196 +#: templates/observations/public_success.html:163 #: templates/observations/public_track.html:132 msgid "Track Status" msgstr "تتبع الحالة" #: templates/complaints/public_complaint_track.html:137 +#: templates/complaints/public_inquiry_track.html:137 #: templates/observations/public_track.html:137 msgid "Found in your confirmation email" msgstr "الموجود في بريدك الإلكتروني للتأكيد" #: templates/complaints/public_complaint_track.html:147 +#: templates/complaints/public_inquiry_track.html:147 msgid "Reference Not Found" msgstr "لم يتم العثور على المرجع" #: templates/complaints/public_complaint_track.html:158 +#: templates/core/public_track.html:393 msgid "Case Reference" msgstr "مرجع الحالة" -#: templates/complaints/public_complaint_track.html:213 -#: templates/observations/public_track.html:214 +#: templates/complaints/public_complaint_track.html:208 +#: templates/core/public_track.html:251 msgid "Resolution Journey" msgstr "مسار الحل" -#: templates/complaints/public_complaint_track.html:232 -#: templates/observations/public_track.html:240 +#: templates/complaints/public_complaint_track.html:225 msgid "Final Resolution" msgstr "الحل النهائي" -#: templates/complaints/public_complaint_track.html:251 +#: templates/complaints/public_complaint_track.html:247 msgid "Your complaint is being reviewed. Updates will appear here." msgstr "شكواك قيد المراجعة. ستظهر التحديثات هنا." @@ -14555,29 +18948,19 @@ msgid "" "hours." msgstr "اطرح سؤالًا أو اطلب معلومات، وسنرد خلال 24–48 ساعة." -#: templates/complaints/public_inquiry_form.html:68 -#: templates/core/public_submit.html:673 -msgid "General Inquiry" -msgstr "استفسار عام" - -#: templates/complaints/public_inquiry_form.html:69 -#: templates/core/public_submit.html:674 -msgid "Services Information" -msgstr "معلومات الخدمات" - -#: templates/complaints/public_inquiry_form.html:84 -#: templates/core/public_submit.html:684 +#: templates/complaints/public_inquiry_form.html:134 +#: templates/core/public_submit.html:451 msgid "Brief subject of your inquiry" msgstr "موضوع مختصر للاستفسار" -#: templates/complaints/public_inquiry_form.html:94 -#: templates/core/public_submit.html:690 +#: templates/complaints/public_inquiry_form.html:144 +#: templates/core/public_submit.html:453 msgid "Please describe your inquiry in detail..." msgstr "يرجى وصف استفسارك بالتفصيل..." -#: templates/complaints/public_inquiry_form.html:102 -#: templates/core/public_submit.html:696 -#: templates/px_sources/source_user_create_inquiry.html:140 +#: templates/complaints/public_inquiry_form.html:152 +#: templates/core/public_submit.html:454 +#: templates/px_sources/source_user_create_inquiry.html:167 msgid "Submit Inquiry" msgstr "إرسال الاستفسار" @@ -14607,65 +18990,43 @@ msgstr "يرجى حفظ رقم هذا المرجع لسجلاتك. قد تحتا msgid "Return to Home" msgstr "العودة للرئيسية" -#: templates/complaints/request_explanation_form.html:117 -msgid "Select Recipients" -msgstr "اختر المستلمين" +#: templates/complaints/public_inquiry_track.html:4 +#: templates/complaints/public_inquiry_track.html:106 +msgid "Track Your Inquiry" +msgstr "تتبع استفسارك" -#: templates/complaints/request_explanation_form.html:121 -msgid "Select All Staff" -msgstr "اختر جميع الموظفين" +#: templates/complaints/public_inquiry_track.html:108 +msgid "" +"Enter your reference number below to see real-time updates on your inquiry." +msgstr "أدخل رقم المرجع الخاص بك أدناه لمشاهدة التحديثات الفورية حول استفسارك." -#: templates/complaints/request_explanation_form.html:124 -msgid "Select All Managers" -msgstr "اختر جميع المديرين" +#: templates/complaints/public_inquiry_track.html:125 +#: templates/core/public_track.html:165 templates/core/public_track.html:330 +msgid "e.g., INQ-20260428-123456" +msgstr "مثال: INQ-20260428-123456" -#: templates/complaints/request_explanation_form.html:177 -msgid "Manager:" -msgstr "المدير:" +#: templates/complaints/public_inquiry_track.html:158 +#: templates/core/public_track.html:394 +msgid "Inquiry Reference" +msgstr "مرجع الاستفسار" -#: templates/complaints/request_explanation_form.html:182 -msgid "Will receive notification only (no explanation link)" -msgstr "سيتم إرسال الإشعار فقط (بدون رابط التفسير)" +#: templates/complaints/public_inquiry_track.html:257 +msgid "Your inquiry is being reviewed. Updates will appear here." +msgstr "يتم مراجعة استفسارك. ستظهر التحديثات هنا." -#: templates/complaints/request_explanation_form.html:189 -msgid "No manager assigned to this staff member" -msgstr "لا يوجد مدير معيّن لهذا الموظف" +#: templates/complaints/public_inquiry_track.html:265 +#: templates/core/public_track.html:301 +#: templates/observations/public_track.html:250 +msgid "" +"For privacy reasons, detailed notes and internal communications are not " +"shown here." +msgstr "" +"لأسباب تتعلق بالخصوصية، لا يتم عرض الملاحظات التفصيلية والمراسلات الداخلية " +"هنا." -#: templates/complaints/request_explanation_form.html:198 -msgid "This staff member has no email address. Request cannot be sent." -msgstr "هذا الموظف ليس لديه عنوان بريد إلكتروني. لا يمكن إرسال الطلب." - -#: templates/complaints/request_explanation_form.html:219 -msgid "Additional Message" -msgstr "رسالة إضافية" - -#: templates/complaints/request_explanation_form.html:223 -msgid "Optional message to include in the email" -msgstr "رسالة اختيارية لتضمينها في البريد الإلكتروني" - -#: templates/complaints/request_explanation_form.html:229 -msgid "Enter any additional context or instructions for the recipients..." -msgstr "أدخل أي سياق أو تعليمات إضافية للمستلمين..." - -#: templates/complaints/request_explanation_form.html:237 -#: templates/organizations/patient_detail.html:537 -#: templates/simulator/log_list.html:280 -#: templates/social/partials/ai_analysis_bilingual.html:75 -#: templates/surveys/instance_detail.html:419 -msgid "Summary" -msgstr "ملخص" - -#: templates/complaints/request_explanation_form.html:239 -msgid "staff will receive explanation links" -msgstr "سيتلقى الموظفون روابط التفسير" - -#: templates/complaints/request_explanation_form.html:241 -msgid "managers will be notified" -msgstr "سيتم إخطار المديرين" - -#: templates/complaints/request_explanation_form.html:253 -msgid "Send Requests" -msgstr "إرسال الطلبات" +#: templates/complaints/public_inquiry_track.html:274 +msgid "Track Another Submission" +msgstr "تتبع إرسالاً آخر" #: templates/complaints/sla_management.html:5 #: templates/complaints/sla_management.html:160 @@ -14803,8 +19164,8 @@ msgid "" "Select a source for source-based SLA, or leave empty for severity/priority-" "based" msgstr "" -"اختر مصدرًا لـ SLA القائم على المصدر، أو اتركه فارغًا للقائم على " -"الأولوية/الخطورة" +"اختر مصدرًا لـ SLA القائم على المصدر، أو اتركه فارغًا للقائم على الأولوية/" +"الخطورة" #: templates/complaints/sla_management_form.html:183 msgid "Severity & Priority" @@ -14869,15 +19230,79 @@ msgstr "حالة الإعدادات" msgid "Enable or disable this SLA configuration" msgstr "تمكين أو تعطيل تكوين هذا الاتفاقية" -#: templates/complaints/templates/template_list.html:158 -msgid "Pre-defined templates for common complaints" -msgstr "قوالب محددة مسبقاً للشكاوى الشائعة" +#: templates/complaints/templates/template_form.html:4 +#: templates/complaints/templates/template_form.html:14 +#: templates/projects/template_form.html:4 +#: templates/surveys/template_detail.html:74 +#: templates/surveys/template_detail.html:267 +msgid "Edit Template" +msgstr "تعديل القالب" +#: templates/complaints/templates/template_form.html:4 #: templates/complaints/templates/template_list.html:162 +#: templates/presentations/template_list.html:55 #: templates/projects/template_list.html:69 msgid "New Template" msgstr "قالب جديد" +#: templates/complaints/templates/template_form.html:10 +#: templates/layouts/partials/sidebar.html:432 +#: templates/presentations/presentation_list.html:53 +#: templates/projects/project_list.html:80 +#: templates/surveys/template_detail.html:61 +#: templates/surveys/template_list.html:75 +msgid "Templates" +msgstr "القوالب" + +#: templates/complaints/templates/template_form.html:14 +#: templates/complaints/templates/template_form.html:54 +#: templates/complaints/templates/template_list.html:268 +#: templates/journeys/template_form.html:334 +#: templates/presentations/template_create.html:75 +#: templates/presentations/template_list.html:86 +#: templates/projects/template_form.html:4 +#: templates/projects/template_form.html:215 +#: templates/surveys/template_form.html:764 +msgid "Create Template" +msgstr "إنشاء قالب" + +#: templates/complaints/templates/template_form.html:22 +#: templates/projects/project_save_as_template.html:40 +#: templates/projects/template_form.html:136 +msgid "Template Name" +msgstr "اسم القالب" + +#: templates/complaints/templates/template_form.html:25 +msgid "e.g., Service Delay Template" +msgstr "مثال: قالب تأخير الخدمة" + +#: templates/complaints/templates/template_form.html:39 +msgid "Title Pattern" +msgstr "نمط العنوان" + +#: templates/complaints/templates/template_form.html:42 +#, python-brace-format +msgid "e.g., {department} - Service Delay" +msgstr "مثال: {department} - تأخير الخدمة" + +#: templates/complaints/templates/template_form.html:46 +msgid "Default Description" +msgstr "الوصف الافتراضي" + +#: templates/complaints/templates/template_form.html:49 +msgid "Default complaint description text..." +msgstr "نص وصف الشكوى الافتراضي..." + +#: templates/complaints/templates/template_form.html:54 +#: templates/journeys/template_form.html:334 +#: templates/surveys/template_form.html:764 +msgid "Update Template" +msgstr "تحديث القالب" + +#: templates/complaints/templates/template_list.html:158 +msgid "Pre-defined templates for common complaints" +msgstr "قوالب محددة مسبقاً للشكاوى الشائعة" + #: templates/complaints/templates/template_list.html:188 msgid "Template name..." msgstr "اسم القالب..." @@ -14895,29 +19320,118 @@ msgstr "لا توجد قوالب" msgid "Create your first template to get started" msgstr "قم بإنشاء أول قالب للبدء" -#: templates/complaints/templates/template_list.html:268 -#: templates/journeys/template_form.html:334 -#: templates/projects/template_form.html:4 -#: templates/projects/template_form.html:215 -#: templates/surveys/template_form.html:560 -msgid "Create Template" -msgstr "إنشاء قالب" +#: templates/complaints/trash_list.html:4 +#: templates/complaints/trash_list.html:19 +msgid "Trash" +msgstr "سلة المهملات" + +#: templates/complaints/trash_list.html:20 +msgid "Deleted complaints and observations" +msgstr "الشكاوى والملاحظات المحذوفة" + +#: templates/complaints/trash_list.html:30 +#: templates/config/deleted_items.html:30 +msgid "Deleted Complaints" +msgstr "الشكاوى المحذوفة" + +#: templates/complaints/trash_list.html:39 +#: templates/complaints/trash_list.html:82 +#: templates/config/deleted_items.html:39 +#: templates/config/deleted_items.html:82 +#: templates/config/deleted_items.html:125 +#: templates/config/deleted_items.html:168 +msgid "Deleted By" +msgstr "تم الحذف بواسطة" + +#: templates/complaints/trash_list.html:40 +#: templates/complaints/trash_list.html:83 +#: templates/config/deleted_items.html:40 +#: templates/config/deleted_items.html:83 +#: templates/config/deleted_items.html:126 +#: templates/config/deleted_items.html:169 +msgid "Deleted At" +msgstr "وقت الحذف" + +#: templates/complaints/trash_list.html:56 +#: templates/complaints/trash_list.html:99 +#: templates/config/deleted_items.html:56 +#: templates/config/deleted_items.html:99 +#: templates/config/deleted_items.html:142 +#: templates/config/deleted_items.html:185 +msgid "Restore" +msgstr "استعادة" + +#: templates/complaints/trash_list.html:73 +#: templates/config/deleted_items.html:73 +msgid "Deleted Observations" +msgstr "الملاحظات المحذوفة" + +#: templates/complaints/trash_list.html:79 +#: templates/config/deleted_items.html:79 templates/core/public_track.html:395 +#: templates/observations/public_track.html:158 +#: templates/organizations/department_detail.html:828 +#: templates/organizations/department_observations.html:68 +#: templates/px_sources/source_user_observation_list.html:153 +msgid "Tracking Code" +msgstr "رمز التتبع" + +#: templates/complaints/trash_list.html:114 +msgid "Trash is empty" +msgstr "سلة المهملات فارغة" + +#: templates/complaints/trash_list.html:115 +msgid "Deleted complaints and observations will appear here." +msgstr "ستظهر الشكاوى والملاحظات المحذوفة هنا." + +#: templates/components/department_response_modal.html:27 +msgid "Enter your department's response..." +msgstr "أدخل رد قسمك..." + +#: templates/components/department_response_modal.html:74 +msgid "Please enter a response." +msgstr "يرجى إدخال رد." + +#: templates/components/department_response_modal.html:112 +#: templates/config/hospital_users.html:620 +msgid "An error occurred." +msgstr "حدث خطأ." + +#: templates/components/department_response_modal.html:117 +#: templates/config/hospital_users.html:625 +msgid "Network error. Please try again." +msgstr "خطأ في الشبكة. يرجى المحاولة مرة أخرى." + +#: templates/components/send_to_modal.html:25 +msgid "Select a person or department to send this item to for response." +msgstr "اختر شخصًا أو قسمًا لإرسال هذا العنصر إليه للحصول على رد." + +#: templates/components/send_to_modal.html:41 +msgid "Person" +msgstr "الشخص" + +#: templates/components/send_to_modal.html:71 +msgid "Sends directly to the department's champion and manager." +msgstr "يُرسل مباشرة إلى بطل القسم والمدير." + +#: templates/components/send_to_modal.html:76 +msgid "Note (Optional)" +msgstr "ملاحظة (اختياري)" + +#: templates/components/send_to_modal.html:224 +msgid "Sent successfully!" +msgstr "تم الإرسال بنجاح!" #: templates/config/dashboard.html:5 templates/config/dashboard.html:14 msgid "System Configuration" msgstr "إعدادات النظام" #: templates/config/dashboard.html:16 -#, fuzzy -#| msgid "Manage system settings and configurations" msgid "Manage system-wide settings and configurations" -msgstr "إدارة إعدادات وتكوينات النظام" +msgstr "إدارة الإعدادات والتكوينات على مستوى النظام" #: templates/config/dashboard.html:25 -#, fuzzy -#| msgid "Complaint SLA Management" msgid "Complaints Management" -msgstr "إدارة اتفاقيات مستوى الخدمة للشكاوى" +msgstr "إدارة الشكاوى" #: templates/config/dashboard.html:33 msgid "Complaint SLA" @@ -14952,16 +19466,12 @@ msgid "Users" msgstr "المستخدمون" #: templates/config/dashboard.html:132 -#, fuzzy -#| msgid "active rules" msgid "active users" -msgstr "القواعد النشطة" +msgstr "المستخدمون النشطون" #: templates/config/dashboard.html:135 -#, fuzzy -#| msgid "Manager" msgid "Manage Users" -msgstr "المدير" +msgstr "إدارة المستخدمين" #: templates/config/dashboard.html:144 msgid "Onboarding" @@ -14976,10 +19486,8 @@ msgid "Manage Onboarding" msgstr "إدارة الإعداد" #: templates/config/dashboard.html:158 -#, fuzzy -#| msgid "Survey Settings" msgid "System Settings" -msgstr "إعدادات الاستبيان" +msgstr "إعدادات النظام" #: templates/config/dashboard.html:167 msgid "active hospitals" @@ -14990,7 +19498,6 @@ msgid "Manage Hospitals" msgstr "إدارة المستشفيات" #: templates/config/dashboard.html:193 templates/config/dashboard.html:197 -#: templates/layouts/partials/sidebar.html:453 #: templates/notifications/send_sms_direct.html:4 #: templates/notifications/send_sms_direct.html:12 #: templates/notifications/send_sms_direct.html:81 @@ -15001,135 +19508,123 @@ msgstr "إرسال رسالة نصية" msgid "Send text messages directly to any phone number" msgstr "إرسال رسائل نصية مباشرة إلى أي رقم هاتف" -#: templates/config/dashboard.html:207 -#: templates/reports/report_detail.html:228 +#: templates/config/dashboard.html:207 templates/reports/report_detail.html:228 #: templates/standards/standard_confirm_delete.html:101 msgid "records" msgstr "السجلات" #: templates/config/dashboard.html:210 -#, fuzzy -#| msgid "View Report" msgid "View Records" -msgstr "عرض التقرير" +msgstr "عرض السجلات" + +#: templates/config/deleted_items.html:4 templates/config/deleted_items.html:19 +#: templates/layouts/partials/sidebar.html:692 +msgid "Deleted Items" +msgstr "العناصر المحذوفة" + +#: templates/config/deleted_items.html:9 +msgid "Back to System Config" +msgstr "العودة إلى إعدادات النظام" + +#: templates/config/deleted_items.html:20 +msgid "Deleted complaints, observations, inquiries, and appreciations" +msgstr "الشكاوى والملاحظات والاستفسارات والتقديرات المحذوفة" + +#: templates/config/deleted_items.html:116 +msgid "Deleted Inquiries" +msgstr "الاستفسارات المحذوفة" + +#: templates/config/deleted_items.html:159 +msgid "Deleted Appreciations" +msgstr "التقديرات المحذوفة" + +#: templates/config/deleted_items.html:200 +msgid "Deleted Items is empty" +msgstr "العناصر المحذوفة فارغة" + +#: templates/config/deleted_items.html:201 +msgid "Deleted items will appear here." +msgstr "ستظهر العناصر المحذوفة هنا." #: templates/config/emails/reset_password_email.html:4 -#, fuzzy -#| msgid "Your PX360 Account Credentials - Al Hammadi Hospital" msgid "Your PX360 Password Has Been Reset - Al Hammadi Hospital" -msgstr "بيانات دخول حساب PX360 الخاص بك - مستشفى الحمادي" +msgstr "تم إعادة تعيين كلمة مرور PX360 الخاصة بك - مستشفى الحمادي" -#: templates/config/emails/reset_password_email.html:6 -#, fuzzy -#| msgid "" -#| "Your PX360 account has been created. Find your login credentials below." +#: templates/config/emails/reset_password_email.html:5 msgid "" -"Your password has been reset by an administrator. Find your new credentials " -"below." +"Your password has been reset by an administrator. Set a new password " +"securely." msgstr "" -"تم إنشاء حساب PX360 الخاص بك. ابحث عن بيانات تسجيل الدخول الخاصة بك أدناه." +"تم إعادة تعيين كلمة المرور الخاصة بك بواسطة مسؤول. قم بتعيين كلمة مرور جديدة " +"بشكل آمن." -#: templates/config/emails/reset_password_email.html:8 -#, fuzzy -#| msgid "Password Reset Request" -msgid "Password Reset" -msgstr "طلب إعادة تعيين كلمة المرور" - -#: templates/config/emails/reset_password_email.html:10 -msgid "Your PX360 account password has been reset" -msgstr "" - -#: templates/config/emails/reset_password_email.html:17 -#: templates/emails/appointment_confirmation.html:17 -#: templates/emails/explanation_reminder.html:17 -#: templates/emails/explanation_request.html:11 -#: templates/emails/explanation_second_reminder.html:20 -#: templates/emails/invitation_expired.html:17 -#: templates/emails/new_complaint_admin_notification.html:18 -#: templates/emails/new_observation_notification.html:11 -#: templates/emails/observation_assigned.html:17 -#: templates/emails/observation_monthly_followup.html:17 -#: templates/emails/observation_resolved.html:17 -#: templates/emails/observation_sla_reminder.html:23 -#: templates/emails/observation_sla_second_reminder.html:33 -#: templates/emails/sla_reminder.html:23 -#: templates/emails/sla_second_reminder.html:26 -#: templates/emails/survey_invitation.html:11 -#: templates/emails/survey_results_notification.html:17 -#: templates/organizations/emails/staff_credentials.html:17 -msgid "Dear" -msgstr "عزيزي/عزيزتي" - -#: templates/config/emails/reset_password_email.html:20 -#, fuzzy -#| msgid "" -#| "Your PX360 account has been created. Find your login credentials below." +#: templates/config/emails/reset_password_email.html:13 msgid "" -"Your PX360 account password has been reset by an administrator. Please use " -"the new credentials below to login." +"Your PX360 account password has been reset by an administrator. For your " +"security, no password is sent by email. Use the button below to set a new " +"password." msgstr "" -"تم إنشاء حساب PX360 الخاص بك. ابحث عن بيانات تسجيل الدخول الخاصة بك أدناه." +"تم إعادة تعيين كلمة مرور حسابك في PX360 بواسطة مسؤول. لأمنك، لا يتم إرسال " +"كلمة المرور عبر البريد الإلكتروني. استخدم الزر أدناه لتعيين كلمة مرور جديدة." -#: templates/config/emails/reset_password_email.html:30 -#, fuzzy -#| msgid "Your credentials are ready" -msgid "Your New Credentials" -msgstr "بيانات الدخول جاهزة" - -#: templates/config/emails/reset_password_email.html:43 -#: templates/organizations/emails/staff_credentials.html:40 -msgid "Password:" -msgstr "كلمة المرور:" - -#: templates/config/emails/reset_password_email.html:58 -#: templates/organizations/emails/staff_credentials.html:63 +#: templates/config/emails/reset_password_email.html:19 +#: templates/organizations/emails/staff_credentials.html:20 msgid "Security Notice:" msgstr "ملاحظة الأمان:" -#: templates/config/emails/reset_password_email.html:61 -#, fuzzy -#| msgid "" -#| "Please change your password after your first login for security purposes." +#: templates/config/emails/reset_password_email.html:19 msgid "" "Please change your password immediately after logging in for security " "purposes." -msgstr "يرجى تغيير كلمة المرور بعد تسجيل الدخول الأول لأغراض الأمان." +msgstr "يرجى تغيير كلمة المرور الخاصة بك فور تسجيل الدخول لأغراض أمنية." -#: templates/config/emails/reset_password_email.html:69 -#: templates/organizations/emails/staff_credentials.html:74 -msgid "Login to PX360" -msgstr "تسجيل الدخول إلى PX360" - -#: templates/config/emails/reset_password_email.html:71 -#: templates/emails/explanation_reminder.html:104 -#: templates/emails/explanation_second_reminder.html:107 -#: templates/organizations/emails/staff_credentials.html:76 -msgid "Need Assistance?" -msgstr "هل تحتاج إلى مساعدة؟" - -#: templates/config/emails/reset_password_email.html:73 -#, fuzzy -#| msgid "" -#| "If you have any questions or need assistance, please contact your system " -#| "administrator." +#: templates/config/emails/reset_password_email.html:34 msgid "" "If you did not expect this password reset, please contact your system " "administrator immediately." msgstr "" -"إذا كان لديك أي أسئلة أو تحتاج إلى مساعدة، يرجى الاتصال بمسؤول النظام." +"إذا لم تكن تتوقع إعادة تعيين كلمة المرور هذه، فيرجى الاتصال بمسؤول النظام " +"الخاص بك فورًا." + +#: templates/config/emails/user_created_email.html:4 +msgid "Your PX360 Account Has Been Created - Al Hammadi Hospital" +msgstr "تم إنشاء حسابك في PX360 - مستشفى الحمادي" + +#: templates/config/emails/user_created_email.html:5 +msgid "Your account is ready. Use your temporary password to log in." +msgstr "حسابك جاهز. استخدم كلمة المرور المؤقتة الخاصة بك لتسجيل الدخول." + +#: templates/config/emails/user_created_email.html:13 +msgid "" +"An account has been created for you on PX360. You can log in using the " +"credentials below." +msgstr "" +"تم إنشاء حساب لك على PX360. يمكنك تسجيل الدخول باستخدام بيانات الاعتماد " +"أدناه." + +#: templates/config/emails/user_created_email.html:20 +msgid "Temporary Password:" +msgstr "كلمة المرور المؤقتة:" + +#: templates/config/emails/user_created_email.html:26 +msgid "For security, please change your password immediately after logging in." +msgstr "لأمنك، يُرجى تغيير كلمة مرورك فور تسجيل الدخول." + +#: templates/config/emails/user_created_email.html:41 +msgid "" +"If you did not expect this account creation, please contact your system " +"administrator immediately." +msgstr "" +"إذا لم تكن تتوقع إنشاء هذا الحساب، فيرجى الاتصال بمسؤول النظام على الفور." #: templates/config/hospital_users.html:4 #: templates/config/hospital_users.html:112 -#, fuzzy -#| msgid "Total Users" msgid "Hospital Users" -msgstr "إجمالي المستخدمين" +msgstr "مستخدمو المستشفى" #: templates/config/hospital_users.html:113 -#, fuzzy -#| msgid "Manage hospital sections and departments" msgid "Manage hospital user accounts and reset passwords" -msgstr "إدارة أقسام وفروع المستشفى" +msgstr "إدارة حسابات مستخدمي المستشفى وإعادة تعيين كلمات المرور" #: templates/config/hospital_users.html:116 #: templates/config/routing_rules.html:20 templates/config/sla_config.html:20 @@ -15137,104 +19632,121 @@ msgid "Back to Config" msgstr "العودة إلى التكوين" #: templates/config/hospital_users.html:204 -#, fuzzy -#| msgid "Name, ID..." msgid "Name, email, ID..." -msgstr "الاسم، الرقم التعريفي..." +msgstr "الاسم، البريد الإلكتروني، المعرف..." #: templates/config/hospital_users.html:221 -#, fuzzy -#| msgid "User Account" msgid "User Accounts" -msgstr "حساب المستخدم" +msgstr "حسابات المستخدمين" -#: templates/config/hospital_users.html:235 -#, fuzzy -#| msgid "Roles" +#: templates/config/hospital_users.html:240 msgid "Role(s)" -msgstr "الأدوار" +msgstr "الدور/الأدوار" -#: templates/config/hospital_users.html:298 -#, fuzzy -#| msgid "No surveys found" +#: templates/config/hospital_users.html:292 +#: templates/config/hospital_users.html:304 templates/config/user_form.html:4 +#: templates/config/user_form.html:127 +msgid "Edit User" +msgstr "تحرير المستخدم" + +#: templates/config/hospital_users.html:300 +#: templates/config/hospital_users.html:454 +#: templates/config/hospital_users.html:574 +msgid "Deactivate User" +msgstr "إلغاء تنشيط المستخدم" + +#: templates/config/hospital_users.html:300 +#: templates/config/hospital_users.html:579 +msgid "Activate User" +msgstr "تنشيط المستخدم" + +#: templates/config/hospital_users.html:320 msgid "No users found" -msgstr "لا توجد استبيانات" +msgstr "لم يتم العثور على مستخدمين" -#: templates/config/hospital_users.html:299 -#: templates/physicians/physician_list.html:271 -#: templates/physicians/ratings_list.html:298 -msgid "Try adjusting your filters" -msgstr "جرب تعديل عوامل التصفية الخاصة بك" +#: templates/config/hospital_users.html:343 +#: templates/organizations/patient_list.html:390 +#: templates/organizations/staff_hierarchy.html:347 +#: templates/organizations/staff_list.html:393 +#: templates/partials/pagination.html:14 templates/rca/rca_list.html:312 +#: templates/surveys/instance_list.html:234 +msgid "Show" +msgstr "إظهار" -#: templates/config/hospital_users.html:389 -#, fuzzy -#| msgid "Reset Password" +#: templates/config/hospital_users.html:411 msgid "Reset password for" -msgstr "إعادة تعيين كلمة المرور" - -#: templates/config/hospital_users.html:391 -#, fuzzy -#| msgid "A new password will be generated and sent to" -msgid "" -"A new temporary password will be generated and sent to this user's email." -msgstr "سيتم إنشاء كلمة مرور جديدة وإرسالها إلى" - -#: templates/config/hospital_users.html:406 -#, fuzzy -#| msgid "Password Reset Successful" -msgid "Password Reset Successfully" -msgstr "تمت إعادة تعيين كلمة المرور بنجاح" +msgstr "إعادة تعيين كلمة المرور لـ" #: templates/config/hospital_users.html:413 -#, fuzzy -#| msgid "A new password will be generated and sent to" -msgid "The password has been reset for" -msgstr "سيتم إنشاء كلمة مرور جديدة وإرسالها إلى" +msgid "A secure password reset link will be sent to this user's email." +msgstr "" +"سيتم إرسال رابط آمن لإعادة تعيين كلمة المرور إلى البريد الإلكتروني لهذا " +"المستخدم." -#: templates/config/hospital_users.html:415 -#, fuzzy -#| msgid "New Password" -msgid "New Temporary Password" -msgstr "كلمة المرور الجديدة" +#: templates/config/hospital_users.html:428 +msgid "Password Reset Successfully" +msgstr "تم إعادة تعيين كلمة المرور بنجاح" -#: templates/config/hospital_users.html:418 -#: templates/simulator/log_detail.html:268 -#: templates/simulator/log_detail.html:283 -#: templates/social/partials/ai_analysis_bilingual.html:83 -#: templates/social/partials/ai_analysis_bilingual.html:89 -msgid "Copy" -msgstr "نسخ" +#: templates/config/hospital_users.html:435 +msgid "The password reset link has been sent to" +msgstr "تم إرسال رابط إعادة تعيين كلمة المرور إلى" -#: templates/config/hospital_users.html:425 +#: templates/config/hospital_users.html:438 +#: templates/organizations/staff_detail.html:580 #: templates/surveys/generate_enhanced_report.html:88 #: templates/surveys/his_patient_import.html:155 msgid "Note:" msgstr "ملاحظة:" -#: templates/config/hospital_users.html:425 -#, fuzzy -#| msgid "" -#| "The new password will be displayed to you after reset. Make sure to share it" -#| " securely if needed." +#: templates/config/hospital_users.html:438 msgid "" -"This password has been sent to the user's email. Please share it securely if" -" needed." +"No password is shown or stored. The user must use the email link to set a " +"new password." msgstr "" -"سيتم عرض كلمة المرور الجديدة لك بعد إعادة التعيين. تأكد من مشاركتها بشكل آمن" -" عند الحاجة." +"لا يتم عرض كلمة المرور أو تخزينها. يجب على المستخدم استخدام رابط البريد " +"الإلكتروني لتعيين كلمة مرور جديدة." -#: templates/config/hospital_users.html:430 -#: templates/core/public_submit.html:388 -#: templates/organizations/staff_detail.html:397 +#: templates/config/hospital_users.html:443 +#: templates/config/hospital_users.html:491 +#: templates/core/public_submit.html:399 +#: templates/organizations/staff_detail.html:585 msgid "Done" msgstr "تم" -#: templates/config/hospital_users.html:459 +#: templates/config/hospital_users.html:463 +msgid "Confirm Your Password" +msgstr "تأكيد كلمة المرور" + +#: templates/config/hospital_users.html:464 +msgid "Enter your password to confirm" +msgstr "أدخل كلمة المرور الخاصة بك للتأكيد" + +#: templates/config/hospital_users.html:481 +msgid "User Status Updated" +msgstr "تم تحديث حالة المستخدم" + +#: templates/config/hospital_users.html:520 msgid "Resetting..." msgstr "جارٍ إعادة التعيين..." +#: templates/config/hospital_users.html:575 +msgid "Are you sure you want to deactivate" +msgstr "هل أنت متأكد من رغبتك في إلغاء تنشيط" + +#: templates/config/hospital_users.html:575 +msgid "This user will not be able to log in until reactivated." +msgstr "لن يتمكن هذا المستخدم من تسجيل الدخول حتى يتم إعادة تنشيطه." + +#: templates/config/hospital_users.html:580 +msgid "Are you sure you want to activate" +msgstr "هل أنت متأكد من رغبتك في تنشيط؟" + +#: templates/config/hospital_users.html:580 +msgid "This user will be able to log in immediately." +msgstr "سيتمكن هذا المستخدم من تسجيل الدخول فورًا." + #: templates/config/routing_rules.html:14 -#: templates/surveys/template_form.html:442 +#: templates/surveys/template_form.html:646 msgid "Routing Rules" msgstr "قواعد التوجيه" @@ -15294,14 +19806,122 @@ msgstr "الدقة (ساعات)" msgid "Escalation (hrs)" msgstr "التصعيد (ساعات)" -#: templates/config/sla_config.html:62 -msgid "All Hospitals" -msgstr "جميع المستشفيات" - #: templates/config/sla_config.html:88 msgid "No SLA configurations found" msgstr "لم يتم العثور على تكوينات SLA" +#: templates/config/user_form.html:130 +msgid "Update user account information and roles" +msgstr "تحديث معلومات حساب المستخدم والأدوار" + +#: templates/config/user_form.html:130 +msgid "Create a new user account with roles and permissions" +msgstr "إنشاء حساب مستخدم جديد مع الأدوار والصلاحيات" + +#: templates/config/user_form.html:159 +msgid "Link to Staff" +msgstr "ربط بالموظف" + +#: templates/config/user_form.html:161 +msgid "" +"Optionally link this user account to an existing staff member. Their " +"information will be auto-filled." +msgstr "" +"يمكنك اختيارياً ربط حساب المستخدم هذا بأحد أعضاء الموظفين الحاليين. سيتم ملء " +"معلوماته تلقائياً." + +#: templates/config/user_form.html:165 +#: templates/organizations/staff_hierarchy_d3.html:150 +msgid "Search Staff" +msgstr "بحث عن موظف" + +#: templates/config/user_form.html:168 +msgid "Type name, email, or employee ID..." +msgstr "اكتب الاسم، البريد الإلكتروني، أو معرف الموظف..." + +#: templates/config/user_form.html:189 +#: templates/organizations/staff_detail.html:60 +#: templates/organizations/staff_form.html:108 +msgid "Personal Information" +msgstr "المعلومات الشخصية" + +#: templates/config/user_form.html:291 +msgid "Roles & Permissions" +msgstr "الأدوار والصلاحيات" + +#: templates/config/user_form.html:293 +msgid "" +"Select the roles this user should have. Roles determine what actions the " +"user can perform in the system." +msgstr "" +"حدد الأدوار التي يجب أن يتمتع بها هذا المستخدم. تحدد الأدوار الإجراءات التي " +"يمكن للمستخدم تنفيذها في النظام." + +#: templates/config/user_form.html:304 +msgid "No roles available. Contact your administrator to set up roles." +msgstr "لا توجد أدوار متاحة. اتصل بمسؤول النظام لإعداد الأدوار." + +#: templates/config/user_form.html:330 +msgid "Generate Random Password" +msgstr "إنشاء كلمة مرور عشوائية" + +#: templates/config/user_form.html:333 +msgid "Copy Password" +msgstr "نسخ كلمة المرور" + +#: templates/config/user_form.html:361 +msgid "" +"Leave password blank and click Generate for a random password. The " +"credentials will be sent to the user's email." +msgstr "" +"اترك حقل كلمة المرور فارغاً وانقر على 'توليد' للحصول على كلمة مرور عشوائية. " +"سيتم إرسال بيانات الاعتماد إلى البريد الإلكتروني للمستخدم." + +#: templates/config/user_form.html:379 +msgid "Inactive users cannot log in to the system" +msgstr "لا يمكن للمستخدمين غير النشطين تسجيل الدخول إلى النظام" + +#: templates/config/user_form.html:410 +#: templates/organizations/staff_form.html:412 +msgid "All fields marked with * are required" +msgstr "جميع الحقول المعلّمة بعلامة * مطلوبة" + +#: templates/config/user_form.html:414 +msgid "Email must be unique and is used for login" +msgstr "يجب أن يكون البريد الإلكتروني فريداً ويستخدم لتسجيل الدخول" + +#: templates/config/user_form.html:418 +msgid "Assign at least one role for proper access" +msgstr "قم بتعيين دور واحد على الأقل للوصول المناسب" + +#: templates/config/user_form.html:422 +msgid "A password reset email will be sent automatically" +msgstr "سيتم إرسال بريد إلكتروني لإعادة تعيين كلمة المرور تلقائيًا" + +#: templates/config/user_form.html:432 +msgid "User Info" +msgstr "معلومات المستخدم" + +#: templates/config/user_form.html:440 +msgid "Joined" +msgstr "انضم" + +#: templates/config/user_form.html:444 +msgid "Last Login" +msgstr "آخر تسجيل دخول" + +#: templates/config/user_form.html:530 +msgid "No staff found" +msgstr "لم يتم العثور على موظفين" + +#: templates/config/user_form.html:542 +msgid "Search failed" +msgstr "فشل البحث" + +#: templates/config/user_form.html:586 +msgid "Password copied to clipboard" +msgstr "تم نسخ كلمة المرور إلى الحافظة" + #: templates/core/no_hospital_assigned.html:4 #: templates/core/no_hospital_assigned.html:17 msgid "No Hospital Assigned" @@ -15320,14 +19940,12 @@ msgid "Information:" msgstr "معلومات:" #: templates/core/no_hospital_assigned.html:36 -#: templates/layouts/partials/sidebar.html:627 -#: templates/layouts/partials/topbar.html:127 -#: templates/layouts/source_user_base.html:200 +#: templates/layouts/partials/topbar.html:128 +#: templates/layouts/source_user_base.html:223 msgid "Logout" msgstr "تسجيل الخروج" #: templates/core/no_hospital_assigned.html:46 -#: templates/emails/invitation_expired.html:43 msgid "Need Help?" msgstr "تحتاج مساعدة؟" @@ -15339,8 +19957,7 @@ msgstr "" "إذا كنت تعتقد أن هذا خطأ، يرجى التواصل مع مسؤول PX360 أو فريق الدعم الفني." #: templates/core/no_hospital_assigned.html:59 -#: templates/layouts/partials/sidebar.html:776 -#: templates/layouts/partials/topbar.html:138 +#: templates/layouts/partials/topbar.html:139 msgid "Are you sure you want to logout?" msgstr "هل أنت متأكد من رغبتك في تسجيل الخروج؟" @@ -15348,12 +19965,11 @@ msgstr "هل أنت متأكد من رغبتك في تسجيل الخروج؟" msgid "Submit Feedback" msgstr "إرسال ملاحظات" -#: templates/core/public_submit.html:287 -#: templates/emails/survey_invitation.html:8 +#: templates/core/public_submit.html:279 msgid "We Value Your Feedback" msgstr "نقدّر ملاحظاتك" -#: templates/core/public_submit.html:289 +#: templates/core/public_submit.html:281 msgid "" "Your feedback helps us improve our services and provide better care for " "everyone. Choose a category below to get started." @@ -15361,148 +19977,310 @@ msgstr "" "يساعدنا ملاحظاتك على تحسين خدماتنا وتقديم رعاية أفضل للجميع. اختر فئة أدناه " "للبدء." -#: templates/core/public_submit.html:305 -msgid "" -"Report an issue with our services. We take all concerns seriously and will " -"investigate thoroughly." -msgstr "الإبلاغ عن مشكلة في الخدمات. نأخذ جميع الشكاوى بجدية ونحقق فيها." - -#: templates/core/public_submit.html:316 +#: templates/core/public_submit.html:308 templates/core/public_track.html:175 +#: templates/organizations/department_detail.html:1298 +#: templates/organizations/department_observation_detail.html:39 +#: templates/px_sources/communication_request_detail.html:214 +#: templates/px_sources/source_user_dashboard.html:146 msgid "Observation" msgstr "ملاحظة" -#: templates/core/public_submit.html:318 +#: templates/core/public_submit.html:310 msgid "" -"Help us improve safety by sharing what you've noticed. Anonymous submissions" -" are welcome." +"Help us improve safety by sharing what you've noticed. Anonymous submissions " +"are welcome." msgstr "" "ساعدنا على تحسين السلامة من خلال مشاركة ما لاحظته. نرحب بالإرسال المجهول." -#: templates/core/public_submit.html:331 +#: templates/core/public_submit.html:323 msgid "" "Have questions? We're here to help with appointments, services, or general " "information." msgstr "" "لديك أسئلة؟ نحن هنا للمساعدة بخصوص المواعيد أو الخدمات أو المعلومات العامة." -#: templates/core/public_submit.html:343 +#: templates/core/public_submit.html:336 +msgid "" +"Recognize a staff member or team who made a positive difference in your " +"experience." +msgstr "قم بتكرييم عضو من الموظفين أو فريق عمل أحدث فرقاً إيجابياً في تجربتك" + +#: templates/core/public_submit.html:349 +msgid "" +"Share your ideas to help us improve our services and facilities for everyone." +msgstr "شارك بأفكارك لمساعدتنا في تحسين خدماتنا ومرافقنا للجميع" + +#: templates/core/public_submit.html:361 msgid "Back to Selection" msgstr "العودة للاختيار" -#: templates/core/public_submit.html:350 +#: templates/core/public_submit.html:368 msgid "Loading form..." msgstr "جارٍ تحميل النموذج..." -#: templates/core/public_submit.html:359 +#: templates/core/public_submit.html:377 msgid "Already submitted something?" msgstr "هل سبق أن قمت بإرسال شيء؟" -#: templates/core/public_submit.html:364 -msgid "Track Complaint" -msgstr "تتبع الشكوى" +#: templates/core/public_submit.html:381 templates/core/public_track.html:4 +#: templates/core/public_track.html:137 +msgid "Track Your Submission" +msgstr "تتبع طلبك" -#: templates/core/public_submit.html:369 -msgid "Track Observation" -msgstr "متابعة الملاحظة" - -#: templates/core/public_submit.html:382 +#: templates/core/public_submit.html:393 msgid "Your submission has been received and will be reviewed." msgstr "تم استلام طلبك وسيتم مراجعته." -#: templates/core/public_submit.html:384 +#: templates/core/public_submit.html:395 msgid "Reference Number:" msgstr "رقم المرجع:" -#: templates/core/public_submit.html:446 templates/core/public_submit.html:461 +#: templates/core/public_submit.html:407 msgid "Failed to load form." msgstr "فشل تحميل النموذج." -#: templates/core/public_submit.html:467 -#: templates/observations/observation_create.html:161 -#: templates/observations/observation_create.html:174 -#: templates/observations/observation_create.html:246 -#: templates/observations/observation_create.html:286 -#: templates/observations/observation_create.html:299 -#: templates/observations/public_new.html:92 -#: templates/observations/public_new.html:129 -#: templates/observations/public_new.html:150 -#: templates/observations/public_new.html:169 -#: templates/observations/public_new.html:187 -msgid "optional" -msgstr "اختياري" - -#: templates/core/public_submit.html:479 +#: templates/core/public_submit.html:410 #: templates/observations/public_new.html:5 -#: templates/observations/public_new.html:54 +#: templates/observations/public_new.html:34 msgid "Report an Observation" msgstr "الإبلاغ عن ملاحظة" -#: templates/core/public_submit.html:481 -msgid "" -"Help us improve by reporting issues you notice. Your input is valuable." +#: templates/core/public_submit.html:411 +msgid "Help us improve by reporting issues you notice. Your input is valuable." msgstr "" "ساعدنا على التحسين عن طريق الإبلاغ عن المشكلات التي تلاحظها. مدخلاتك قيّمة." -#: templates/core/public_submit.html:505 +#: templates/core/public_submit.html:419 msgid "Brief descriptive title" msgstr "عنوان وصفي موجز" -#: templates/core/public_submit.html:511 +#: templates/core/public_submit.html:421 msgid "Describe what you observed in detail..." msgstr "صف ما لاحظته بالتفصيل..." -#: templates/core/public_submit.html:518 +#: templates/core/public_submit.html:423 msgid "Where did this occur?" msgstr "أين حدث ذلك؟" -#: templates/core/public_submit.html:522 +#: templates/core/public_submit.html:424 msgid "When" msgstr "عندما" -#: templates/core/public_submit.html:534 +#: templates/core/public_submit.html:426 +#: templates/observations/public_new.html:188 +msgid "Click to upload files" +msgstr "انقر لتحميل الملفات" + +#: templates/core/public_submit.html:427 msgid "Images, PDF, Word (max 10MB)" msgstr "الصور، PDF، Word (الحد الأقصى 10 ميجابايت)" -#: templates/core/public_submit.html:541 +#: templates/core/public_submit.html:428 msgid "Your Info" msgstr "معلوماتك" -#: templates/core/public_submit.html:541 +#: templates/core/public_submit.html:429 msgid "optional - leave blank for anonymous" msgstr "اختياري - اتركه فارغًا للانضمام كمجهول" -#: templates/core/public_submit.html:543 -#: templates/observations/observation_detail.html:180 -#: templates/observations/public_new.html:193 +#: templates/core/public_submit.html:430 +#: templates/observations/public_new.html:208 +#: templates/organizations/staff_import.html:263 msgid "Staff ID" msgstr "معرّف الموظف" -#: templates/core/public_submit.html:552 -#: templates/observations/public_new.html:214 +#: templates/core/public_submit.html:434 +#: templates/observations/public_new.html:229 +#: templates/px_sources/source_user_create_observation.html:4 +#: templates/px_sources/source_user_create_observation.html:28 +#: templates/px_sources/source_user_create_observation.html:179 msgid "Submit Observation" msgstr "إرسال الملاحظة" -#: templates/core/public_submit.html:620 templates/core/public_submit.html:623 +#: templates/core/public_submit.html:436 msgid "Failed to submit" msgstr "فشل الإرسال" -#: templates/core/public_submit.html:639 -msgid "Ask a question. We'll respond within 24-48 hours." -msgstr "اطرح سؤالاً. سنرد خلال 24-48 ساعة." +#: templates/core/public_submit.html:445 +msgid "Services Information" +msgstr "معلومات الخدمات" -#: templates/core/public_submit.html:877 +#: templates/core/public_submit.html:457 +msgid "Main Section" +msgstr "القسم الرئيسي" + +#: templates/core/public_submit.html:459 +msgid "Select Main Section" +msgstr "اختر القسم الرئيسي" + +#: templates/core/public_submit.html:461 msgid "Select Domain" msgstr "اختر المجال" -#: templates/core/public_submit.html:914 +#: templates/core/public_submit.html:462 msgid "Select Subcategory" msgstr "اختر الفئة الفرعية" -#: templates/core/public_submit.html:935 +#: templates/core/public_submit.html:463 msgid "Select Classification" msgstr "اختر التصنيف" -#: templates/core/select_hospital.html:50 +#: templates/core/public_submit.html:465 +msgid "Share Your Appreciation" +msgstr "شارك تقديرك" + +#: templates/core/public_submit.html:466 +msgid "" +"Recognize a staff member or team who made a difference in your experience." +msgstr "قدِّر موظفًا أو فريقًا أحدث فرقًا في تجربتك." + +#: templates/core/public_submit.html:467 +#: templates/feedback/feedback_form.html:90 +msgid "Your Name" +msgstr "اسمك" + +#: templates/core/public_submit.html:468 +msgid "Your Phone" +msgstr "هاتفك" + +#: templates/core/public_submit.html:469 +msgid "Staff / Department Name" +msgstr "اسم الموظف / القسم" + +#: templates/core/public_submit.html:470 +msgid "Name of staff or department" +msgstr "اسم الموظف أو القسم" + +#: templates/core/public_submit.html:471 +msgid "Your Appreciation" +msgstr "تقديرك" + +#: templates/core/public_submit.html:472 +msgid "Share what this person or team did that made your experience special..." +msgstr "شاركنا ما فعله هذا الشخص أو الفريق مما جعل تجربتك مميزة..." + +#: templates/core/public_submit.html:473 +msgid "Submit Appreciation" +msgstr "إرسال التقدير" + +#: templates/core/public_submit.html:474 +#: templates/observations/public_success.html:71 +msgid "Thank You!" +msgstr "شكرًا لك!" + +#: templates/core/public_submit.html:475 +msgid "" +"Thank you for your appreciation! Your kind words will be reviewed and shared " +"with the staff member or department you recognized." +msgstr "" +"شكرًا لك على تقديرك! سيتم مراجعة كلماتك الطيبة ومشاركتها مع الموظف أو القسم " +"الذي قدّرته." + +#: templates/core/public_submit.html:476 +msgid "Share Your Suggestion" +msgstr "شارك اقتراحك" + +#: templates/core/public_submit.html:477 +msgid "" +"Your ideas help us improve. Share how we can make our services better for " +"everyone." +msgstr "أفكارك تساعدنا على التحسين. شاركنا كيف يمكننا جعل خدماتنا أفضل للجميع." + +#: templates/core/public_submit.html:478 +msgid "Suggestion Area" +msgstr "مجال الاقتراح" + +#: templates/core/public_submit.html:490 +msgid "" +"Describe your suggestion in detail. What would you like to see improved or " +"changed?" +msgstr "صِف اقتراحك بالتفصيل. ما الذي ترغب في رؤيته مُحسَّنًا أو متغيرًا؟" + +#: templates/core/public_submit.html:491 +#: templates/feedback/feedback_form.html:119 +#: templates/px_sources/source_user_create_suggestion.html:4 +#: templates/px_sources/source_user_create_suggestion.html:28 +#: templates/px_sources/source_user_create_suggestion.html:131 +msgid "Submit Suggestion" +msgstr "تقديم الاقتراح" + +#: templates/core/public_submit.html:492 +msgid "" +"Thank you for your suggestion! We appreciate your input and will review it " +"carefully." +msgstr "شكراً لك على اقتراحك! نحن نقدر مدخلاتك وسنقوم بمراجعتها بعناية." + +#: templates/core/public_submit.html:493 +msgid "Failed to load hospitals." +msgstr "فشل في تحميل المستشفيات." + +#: templates/core/public_submit.html:494 +msgid "Ask a question. We'll respond within 24-48 hours." +msgstr "اطرح سؤالاً. سنرد خلال 24-48 ساعة." + +#: templates/core/public_submit.html:503 +msgid "Sub-Section" +msgstr "القسم الفرعي" + +#: templates/core/public_submit.html:504 +msgid "Select Sub-Section" +msgstr "اختر القسم الفرعي" + +#: templates/core/public_track.html:139 +msgid "" +"Select a category below and enter your reference number to check the status." +msgstr "اختر فئة أدناه وأدخل رقم المرجع الخاص بك للتحقق من الحالة." + +#: templates/core/public_track.html:176 templates/core/public_track.html:331 +#: templates/observations/public_track.html:125 +msgid "e.g., OBS-ABC123" +msgstr "مثال: OBS-ABC123" + +#: templates/core/public_track.html:191 +msgid "Enter your reference number" +msgstr "أدخل رقم المرجع الخاص بك" + +#: templates/core/public_track.html:201 +msgid "Found in your confirmation email or SMS" +msgstr "موجود في رسالة التأكيد الإلكترونية أو الرسالة النصية" + +#: templates/core/public_track.html:211 +msgid "Not Found" +msgstr "غير موجود" + +#: templates/core/public_track.html:219 +msgid "Looking up your submission..." +msgstr "جارٍ البحث عن طلبك..." + +#: templates/core/public_track.html:258 +msgid "Your submission is being reviewed. Updates will appear here." +msgstr "طلبك قيد المراجعة. ستظهر التحديثات هنا." + +#: templates/core/public_track.html:274 +msgid "Was this resolution helpful?" +msgstr "هل كان هذا الحل مفيدًا؟" + +#: templates/core/public_track.html:292 +msgid "Thank you for your feedback!" +msgstr "شكرًا لك على ملاحظاتك!" + +#: templates/core/public_track.html:309 +msgid "Submit New Feedback" +msgstr "تقديم ملاحظات جديدة" + +#: templates/core/public_track.html:367 +msgid "" +"This tracking link has expired. Tracking is available for 5 days after " +"resolution. Please contact patient Experience team if you need assistance." +msgstr "" +"انتهت صلاحية رابط التتبع هذا. يتوفر التتبع لمدة 5 أيام بعد الحل. يُرجى " +"الاتصال بفريق علاقات المرضي إذا كنت بحاجة إلى مساعدة." + +#: templates/core/public_track.html:374 +msgid "No submission found with this reference number." +msgstr "لم يتم العثور على أي طلب بهذا الرقم المرجعي." + +#: templates/core/select_hospital.html:45 msgid "" "As a PX Admin, you must select a hospital to continue. You can change your " "selection later from the sidebar." @@ -15510,19 +20288,19 @@ msgstr "" "بصفتك مسؤول تجربة المريض، يجب عليك اختيار مستشفى للمتابعة. يمكنك تغيير " "اختيارك لاحقًا من الشريط الجانبي." -#: templates/core/select_hospital.html:149 +#: templates/core/select_hospital.html:144 msgid "No Hospitals Available" msgstr "لا توجد مستشفيات متاحة" -#: templates/core/select_hospital.html:152 +#: templates/core/select_hospital.html:147 msgid "No hospitals found in the system. Please contact your administrator." msgstr "لم يتم العثور على مستشفيات في النظام. يرجى التواصل مع المسؤول." -#: templates/core/select_hospital.html:161 +#: templates/core/select_hospital.html:156 msgid "Continue to Dashboard" msgstr "الاستمرار إلى لوحة التحكم" -#: templates/core/select_hospital.html:170 +#: templates/core/select_hospital.html:165 msgid "You must select a hospital to access the system" msgstr "يجب عليك اختيار مستشفى للوصول إلى النظام" @@ -15530,7 +20308,7 @@ msgstr "يجب عليك اختيار مستشفى للوصول إلى النظا #: templates/dashboard/admin_evaluation.html:223 #: templates/dashboard/department_benchmarks.html:13 #: templates/dashboard/staff_performance_detail.html:13 -#: templates/layouts/partials/sidebar.html:128 +#: templates/layouts/partials/sidebar.html:378 msgid "Admin Evaluation" msgstr "تقييم الإدارة" @@ -15538,107 +20316,220 @@ msgstr "تقييم الإدارة" msgid "Staff performance analysis for complaints and inquiries" msgstr "تحليل أداء الموظفين للشكاوى والاستفسارات" -#: templates/dashboard/admin_evaluation.html:289 +#: templates/dashboard/admin_evaluation.html:246 +#: templates/dashboard/employee_evaluation.html:700 +#: templates/dashboard/employee_evaluation_charts.html:179 +#: templates/dashboard/my_dashboard.html:131 +#: templates/reports/report_builder.html:66 +#: templates/surveys/comment_list.html:237 +msgid "Date Range" +msgstr "نطاق التاريخ" + +#: templates/dashboard/admin_evaluation.html:252 +#: templates/dashboard/employee_evaluation.html:706 +#: templates/dashboard/employee_evaluation_charts.html:185 +msgid "Last Month" +msgstr "الشهر الماضي" + +#: templates/dashboard/admin_evaluation.html:253 +#: templates/dashboard/employee_evaluation.html:707 +#: templates/dashboard/employee_evaluation_charts.html:186 +msgid "This Quarter" +msgstr "هذا الربع" + +#: templates/dashboard/admin_evaluation.html:254 +#: templates/dashboard/employee_evaluation.html:708 +#: templates/dashboard/employee_evaluation_charts.html:187 +msgid "This Year" +msgstr "هذا العام" + +#: templates/dashboard/admin_evaluation.html:255 +#: templates/dashboard/employee_evaluation.html:709 +#: templates/dashboard/employee_evaluation_charts.html:188 +#: templates/reports/report_builder.html:72 +msgid "Custom Range" +msgstr "نطاق مخصص" + +#: templates/dashboard/admin_evaluation.html:299 msgid "Compare Staff" msgstr "مقارنة الموظفين" -#: templates/dashboard/admin_evaluation.html:298 +#: templates/dashboard/admin_evaluation.html:308 msgid "Apply Filter" msgstr "تطبيق الفلتر" -#: templates/dashboard/admin_evaluation.html:309 +#: templates/dashboard/admin_evaluation.html:319 #: templates/dashboard/department_benchmarks.html:4 #: templates/dashboard/department_benchmarks.html:14 #: templates/dashboard/department_benchmarks.html:19 msgid "Department Benchmarks" msgstr "مؤشرات أداء الأقسام" -#: templates/dashboard/admin_evaluation.html:317 +#: templates/dashboard/admin_evaluation.html:327 msgid "Export JSON" msgstr "تصدير بصيغة JSON" -#: templates/dashboard/admin_evaluation.html:328 +#: templates/dashboard/admin_evaluation.html:338 #: templates/dashboard/department_benchmarks.html:42 -#: templates/organizations/staff_hierarchy.html:156 +#: templates/organizations/department_list.html:106 +#: templates/organizations/staff_hierarchy.html:138 #: templates/organizations/staff_hierarchy_d3.html:105 -#: templates/organizations/staff_list.html:139 +#: templates/organizations/staff_list.html:144 msgid "Total Staff" msgstr "إجمالي الموظفين" -#: templates/dashboard/admin_evaluation.html:332 +#: templates/dashboard/admin_evaluation.html:342 msgid "Active Staff" msgstr "الموظفون النشطون" -#: templates/dashboard/admin_evaluation.html:349 +#: templates/dashboard/admin_evaluation.html:359 msgid "Requires Attention" msgstr "يتطلب الانتباه" -#: templates/dashboard/admin_evaluation.html:366 +#: templates/dashboard/admin_evaluation.html:376 msgid "Open Requests" msgstr "الطلبات المفتوحة" -#: templates/dashboard/admin_evaluation.html:383 -#: templates/dashboard/employee_evaluation.html:715 -#: templates/layouts/partials/sidebar.html:121 +#: templates/dashboard/admin_evaluation.html:393 +#: templates/dashboard/employee_evaluation.html:779 +#: templates/layouts/partials/sidebar.html:371 #: templates/organizations/staff_hierarchy_d3.html:326 msgid "Performance" msgstr "الأداء" -#: templates/dashboard/admin_evaluation.html:417 -#: templates/dashboard/employee_evaluation.html:875 +#: templates/dashboard/admin_evaluation.html:427 +#: templates/dashboard/employee_evaluation.html:956 msgid "Complaint Source Breakdown" msgstr "توزيع مصادر الشكاوى" -#: templates/dashboard/admin_evaluation.html:428 +#: templates/dashboard/admin_evaluation.html:438 msgid "Complaint Status Distribution" msgstr "توزيع حالات الشكاوى" -#: templates/dashboard/admin_evaluation.html:442 +#: templates/dashboard/admin_evaluation.html:452 msgid "Staff Complaint Performance" msgstr "أداء الموظفين في الشكاوى" -#: templates/dashboard/admin_evaluation.html:449 -#: templates/dashboard/admin_evaluation.html:526 -#: templates/dashboard/department_benchmarks.html:127 -msgid "Staff Name" -msgstr "اسم الموظف" - -#: templates/dashboard/admin_evaluation.html:494 +#: templates/dashboard/admin_evaluation.html:504 msgid "Inquiry Status Distribution" msgstr "توزيع حالات الاستفسارات" -#: templates/dashboard/admin_evaluation.html:505 +#: templates/dashboard/admin_evaluation.html:515 msgid "Inquiry Response Time" msgstr "مدة الاستجابة للاستفسار" -#: templates/dashboard/admin_evaluation.html:519 +#: templates/dashboard/admin_evaluation.html:529 msgid "Staff Inquiry Performance" msgstr "أداء الموظفين في الاستفسارات" -#: templates/dashboard/admin_evaluation.html:561 -#: templates/dashboard/employee_evaluation.html:1477 +#: templates/dashboard/admin_evaluation.html:571 +#: templates/dashboard/employee_evaluation.html:1559 +#: templates/dashboard/employee_evaluation_charts.html:465 msgid "No Data Available" msgstr "لا توجد بيانات متاحة" -#: templates/dashboard/admin_evaluation.html:562 -#: templates/dashboard/employee_evaluation.html:1479 +#: templates/dashboard/admin_evaluation.html:572 +#: templates/dashboard/employee_evaluation.html:1561 msgid "" -"No staff members with assigned complaints or inquiries found in the selected" -" time period." +"No staff members with assigned complaints or inquiries found in the selected " +"time period." msgstr "" -"لم يتم العثور على موظفين لديهم شكاوى أو استفسارات مُسندة خلال الفترة الزمنية" -" المحددة." +"لم يتم العثور على موظفين لديهم شكاوى أو استفسارات مُسندة خلال الفترة الزمنية " +"المحددة." -#: templates/dashboard/admin_evaluation.html:752 -#: templates/dashboard/employee_evaluation.html:1530 +#: templates/dashboard/admin_evaluation.html:762 +#: templates/dashboard/employee_evaluation.html:1673 +#: templates/dashboard/employee_evaluation_charts.html:632 msgid "Please select both start and end dates." msgstr "يرجى تحديد تاريخي البدء والانتهاء." -#: templates/dashboard/admin_evaluation.html:756 -#: templates/dashboard/employee_evaluation.html:1534 +#: templates/dashboard/admin_evaluation.html:766 +#: templates/dashboard/employee_evaluation.html:1677 +#: templates/dashboard/employee_evaluation_charts.html:636 msgid "Start date must be before end date." msgstr "يجب أن يكون تاريخ البدء قبل تاريخ الانتهاء." +#: templates/dashboard/census_report.html:10 +#: templates/layouts/partials/sidebar.html:594 +msgid "Census Report" +msgstr "تقرير التعداد" + +#: templates/dashboard/census_report.html:11 +msgid "OPD, ER & Inpatient visit counts from HIS data" +msgstr "" +"أعداد زيارات العيادات الخارجية وقسم الطوارئ والمرضى المنومين من بيانات نظام " +"المعلومات الصحية" + +#: templates/dashboard/census_report.html:16 +#: templates/dashboard/complaint_monthly_report.html:17 +#: templates/dashboard/complaint_quarterly_report.html:17 +#: templates/dashboard/complaint_request_list.html:15 +#: templates/dashboard/employee_evaluation.html:801 +#: templates/dashboard/observation_report.html:17 +#: templates/organizations/staff_detail.html:196 +#: templates/projects/project_detail.html:108 +#: templates/reports/report_builder.html:147 +#: templates/reports/saved_reports.html:122 +msgid "Export Excel" +msgstr "تصدير Excel" + +#: templates/dashboard/census_report.html:25 +msgid "No Visit Data Available" +msgstr "لا توجد بيانات زيارات متاحة" + +#: templates/dashboard/census_report.html:26 +msgid "" +"There are no HIS patient visit records in the database for the selected " +"hospital and year." +msgstr "" +"لا توجد سجلات زيارات مرضى نظام المعلومات الصحية (HIS) في قاعدة البيانات " +"للمستشفى والسنة المحددين." + +#: templates/dashboard/census_report.html:61 +msgid "OPD Total" +msgstr "إجمالي العيادات الخارجية" + +#: templates/dashboard/census_report.html:72 +msgid "ER Total" +msgstr "إجمالي الطوارئ" + +#: templates/dashboard/census_report.html:83 +msgid "Inpatient Total" +msgstr "إجمالي المرضى المنومين" + +#: templates/dashboard/census_report.html:92 +msgid "Year-over-Year Comparison" +msgstr "مقارنة سنوية" + +#: templates/dashboard/census_report.html:96 +msgid "Monthly Trend" +msgstr "الاتجاه الشهري" + +#: templates/dashboard/census_report.html:103 +msgid "OPD Quarterly" +msgstr "ربع سنوي للعيادات الخارجية" + +#: templates/dashboard/census_report.html:107 +msgid "ER Quarterly" +msgstr "ربع سنوي لقسم الطوارئ" + +#: templates/dashboard/census_report.html:111 +msgid "Inpatient Quarterly" +msgstr "ربع سنوي للمرضى الداخليين" + +#: templates/dashboard/census_report.html:120 +msgid "Quarterly Breakdown" +msgstr "تفصيل ربع سنوي" + +#: templates/dashboard/census_report.html:121 +msgid "Selected" +msgstr "تم الاختيار" + +#: templates/dashboard/command_center.html:5 +#: templates/dashboard/command_center.html:113 +msgid "PX Command Center" +msgstr "مركز قيادة تجربة المرضى" + #: templates/dashboard/command_center.html:115 msgid "Real-time overview of your patient experience operations" msgstr "نظرة عامة فورية على عمليات تجربة المريض الخاصة بك" @@ -15712,17 +20603,6 @@ msgstr "جديد" msgid "resolved (30d)" msgstr "تم الحل (30 يومًا)" -#: templates/dashboard/command_center.html:302 -#: templates/dashboard/my_dashboard.html:183 -#: templates/dashboard/partials/observations_table.html:6 -#: templates/layouts/partials/sidebar.html:170 -#: templates/observations/category_form.html:11 -#: templates/observations/category_list.html:52 -#: templates/observations/category_list.html:90 -#: templates/observations/observation_detail.html:47 -msgid "Observations" -msgstr "الملاحظات" - #: templates/dashboard/command_center.html:341 msgid "NPS Score Trend" msgstr "اتجاه درجة NPS" @@ -15746,9 +20626,10 @@ msgstr "الشكاوى النشطة حسب الخطورة" #: templates/dashboard/partials/inquiries_table.html:13 #: templates/dashboard/partials/observations_table.html:13 #: templates/dashboard/partials/tasks_table.html:13 -#: templates/layouts/partials/topbar.html:51 -#: templates/px_sources/source_user_dashboard.html:150 -#: templates/px_sources/source_user_dashboard.html:243 +#: templates/layouts/partials/topbar.html:52 +#: templates/organizations/staff_detail.html:319 +#: templates/px_sources/source_user_dashboard.html:182 +#: templates/px_sources/source_user_dashboard.html:275 msgid "View All" msgstr "عرض الكل" @@ -15756,10 +20637,6 @@ msgstr "عرض الكل" msgid "PX Actions Pipeline" msgstr "خط أنابيب إجراءات تجربة المريض" -#: templates/dashboard/command_center.html:402 -msgid "Pending Approval" -msgstr "في انتظار الموافقة" - #: templates/dashboard/command_center.html:411 msgid "Closed (30d)" msgstr "مغلق (30 يومًا)" @@ -15768,14 +20645,6 @@ msgstr "مغلق (30 يومًا)" msgid "Latest High Severity Complaints" msgstr "أحدث الشكاوى ذات الخطورة العالية" -#: templates/dashboard/command_center.html:458 -#: templates/dashboard/command_center.html:524 -#: templates/dashboard/command_center.html:573 -#: templates/dashboard/command_center.html:618 -#: templates/notifications/inbox.html:81 -msgid "ago" -msgstr "منذ" - #: templates/dashboard/command_center.html:483 msgid "No high severity complaints" msgstr "لا توجد شكاوى عالية الخطورة" @@ -15790,7 +20659,7 @@ msgstr "لا توجد إجراءات متصاعدة" #: templates/dashboard/command_center.html:552 #: templates/dashboard/staff_performance_detail.html:215 -#: templates/px_sources/source_user_dashboard.html:237 +#: templates/px_sources/source_user_dashboard.html:269 msgid "Recent Inquiries" msgstr "الاستفسارات الأخيرة" @@ -15810,6 +20679,29 @@ msgstr "لا توجد ملاحظات نشطة" msgid "Top Physicians This Month" msgstr "أفضل الأطباء لهذا الشهر" +#: templates/dashboard/command_center.html:648 +#: templates/physicians/physician_ratings_dashboard.html:373 +msgid "View Leaderboard" +msgstr "عرض قائمة التصنيفات" + +#: templates/dashboard/command_center.html:660 +#: templates/layouts/partials/sidebar.html:419 +#: templates/organizations/patient_detail.html:276 +#: templates/organizations/patient_detail.html:549 +#: templates/physicians/department_overview.html:87 +#: templates/physicians/department_overview.html:110 +#: templates/physicians/leaderboard.html:202 +#: templates/physicians/physician_detail.html:412 +#: templates/physicians/physician_detail.html:500 +#: templates/physicians/physician_ratings_dashboard.html:460 +#: templates/physicians/physician_ratings_dashboard.html:712 +#: templates/physicians/ratings_list.html:202 +#: templates/physicians/specialization_overview.html:86 +#: templates/physicians/specialization_overview.html:110 +#: templates/surveys/instance_detail.html:52 +msgid "Surveys" +msgstr "الاستبيانات" + #: templates/dashboard/command_center.html:705 msgid "No physician ratings this month" msgstr "لا توجد تقييمات للأطباء هذا الشهر" @@ -15818,11 +20710,316 @@ msgstr "لا توجد تقييمات للأطباء هذا الشهر" msgid "Refreshes in" msgstr "يتم التحديث في" +#: templates/dashboard/comments_report.html:9 +msgid "Survey Comments Analysis" +msgstr "تحليل تعليقات الاستبيان" + +#: templates/dashboard/comments_report.html:10 +msgid "Comment classification, sentiment analysis, and action plan tracking" +msgstr "تصنيف التعليقات، تحليل المشاعر، وتتبع خطة العمل" + +#: templates/dashboard/comments_report.html:18 +msgid "No Comment Data" +msgstr "لا توجد بيانات تعليقات" + +#: templates/dashboard/comments_report.html:19 +msgid "No survey comments found for the selected hospital and period." +msgstr "لم يتم العثور على تعليقات استبيان للمستشفى والفترة المحددة." + +#: templates/dashboard/comments_report.html:40 +#: templates/presentations/presentation_generate.html:61 +msgid "Quarter" +msgstr "الربع" + +#: templates/dashboard/comments_report.html:56 +#: templates/social/comments_list.html:72 +#: templates/social/social_analytics.html:44 +#: templates/social/social_comment_list.html:115 +msgid "Total Comments" +msgstr "إجمالي التعليقات" + +#: templates/dashboard/comments_report.html:76 +msgid "By Sentiment" +msgstr "حسب المشاعر" + +#: templates/dashboard/comments_report.html:85 +msgid "Sub-Category Breakdown" +msgstr "تفصيل الفئات الفرعية" + +#: templates/dashboard/comments_report.html:92 +#: templates/feedback/comment_list.html:86 +#: templates/feedback/comment_list.html:156 +msgid "Sub-Category" +msgstr "الفئة الفرعية" + +#: templates/dashboard/comments_report.html:120 +#: templates/feedback/comment_list.html:154 +#: templates/social/comments_list.html:158 +#: templates/surveys/comment_list.html:275 +msgid "Comment" +msgstr "التعليق" + +#: templates/dashboard/comments_report.html:122 +msgid "Responsible" +msgstr "المسؤول" + +#: templates/dashboard/complaint_monthly_report.html:10 +msgid "Complaint Monthly Calculations" +msgstr "الحسابات الشهرية للشكاوى" + +#: templates/dashboard/complaint_monthly_report.html:11 +msgid "Step 1 — Complaint lifecycle tracking with stage timing" +msgstr "الخطوة 1 — تتبع دورة حياة الشكوى مع توقيت المراحل" + +#: templates/dashboard/complaint_monthly_report.html:26 +msgid "No Complaint Data" +msgstr "لا توجد بيانات للشكاوى" + +#: templates/dashboard/complaint_monthly_report.html:27 +msgid "There are no complaint records for the selected hospital and period." +msgstr "لا توجد سجلات شكاوى للمستشفى والفترة المحددين." + +#: templates/dashboard/complaint_monthly_report.html:97 +#: templates/dashboard/employee_evaluation.html:781 +#: templates/dashboard/employee_evaluation.html:1499 +#: templates/dashboard/employee_evaluation_charts.html:341 +#: templates/dashboard/employee_evaluation_charts.html:526 +msgid "Activation Rate" +msgstr "معدل التفعيل" + +#: templates/dashboard/complaint_monthly_report.html:119 +msgid "Avg Close Time" +msgstr "متوسط وقت الإغلاق" + +#: templates/dashboard/complaint_monthly_report.html:128 +#: templates/dashboard/observation_report.html:106 +msgid "Daily Trend" +msgstr "الاتجاه اليومي" + +#: templates/dashboard/complaint_monthly_report.html:132 +msgid "Stage Funnel" +msgstr "قمع المراحل" + +#: templates/dashboard/complaint_monthly_report.html:139 +#: templates/dashboard/observation_report.html:110 +#: templates/simulator/log_list.html:173 +msgid "By Status" +msgstr "حسب الحالة" + +#: templates/dashboard/complaint_monthly_report.html:143 +msgid "By Source Type" +msgstr "حسب نوع المصدر" + +#: templates/dashboard/complaint_monthly_report.html:147 +msgid "By Satisfaction" +msgstr "حسب مستوى الرضا" + +#: templates/dashboard/complaint_quarterly_report.html:10 +msgid "Complaints Yearly Report Card" +msgstr "بطاقة تقرير الشكاوى السنوية" + +#: templates/dashboard/complaint_quarterly_report.html:11 +msgid "" +"Step 2/Yearly — KPI tables, source breakdowns, escalated analysis, response " +"rates" +msgstr "" +"الخطوة 2/سنويًا — جداول مؤشرات الأداء الرئيسية، تحليلات المصادر، تحليل " +"التصعيد، معدلات الاستجابة" + +#: templates/dashboard/complaint_quarterly_report.html:26 +msgid "No Data" +msgstr "لا توجد بيانات" + +#: templates/dashboard/complaint_quarterly_report.html:27 +msgid "No complaint records for the selected hospital." +msgstr "لا توجد سجلات شكاوى للمستشفى المحدد." + +#: templates/dashboard/complaint_quarterly_report.html:42 +#: templates/projects/focus_phase_form.html:62 +#: templates/projects/partials/phase_form_modal.html:44 +#: templates/projects/pdca_phase_form.html:62 +#: templates/projects/project_form.html:271 +#: templates/surveys/analytics_reports.html:219 +msgid "Start Date" +msgstr "تاريخ البدء" + +#: templates/dashboard/complaint_quarterly_report.html:46 +#: templates/surveys/analytics_reports.html:226 +msgid "End Date" +msgstr "تاريخ الانتهاء" + +#: templates/dashboard/complaint_quarterly_report.html:95 +#, python-format +msgid "Target: 95%%" +msgstr "الهدف: 95%%" + +#: templates/dashboard/complaint_quarterly_report.html:98 +msgid "72h Resolution Rate" +msgstr "معدل الحل خلال 72 ساعة" + +#: templates/dashboard/complaint_quarterly_report.html:104 +#: templates/organizations/department_detail.html:1027 +msgid "Satisfaction Rate" +msgstr "معدل الرضا" + +#: templates/dashboard/complaint_quarterly_report.html:108 +msgid "surveyed" +msgstr "تم الاستطلاع" + +#: templates/dashboard/complaint_quarterly_report.html:113 +msgid "rate" +msgstr "المعدل" + +#: templates/dashboard/complaint_quarterly_report.html:119 +msgid "Resolution Rate Trend" +msgstr "اتجاه معدل الحل" + +#: templates/dashboard/complaint_quarterly_report.html:123 +msgid "Monthly Complaints" +msgstr "الشكاوى الشهرية" + +#: templates/dashboard/complaint_quarterly_report.html:130 +#: templates/dashboard/observation_report.html:121 +msgid "By Source" +msgstr "حسب المصدر" + +#: templates/dashboard/complaint_quarterly_report.html:134 +msgid "By Location" +msgstr "حسب الموقع" + +#: templates/dashboard/complaint_quarterly_report.html:138 +msgid "By Department Type" +msgstr "حسب نوع القسم" + +#: templates/dashboard/complaint_quarterly_report.html:146 +msgid "Internal Response Rate" +msgstr "معدل الاستجابة الداخلية" + +#: templates/dashboard/complaint_quarterly_report.html:151 +msgid "MOH Response Rate" +msgstr "معدل استجابة وزارة الصحة" + +#: templates/dashboard/complaint_quarterly_report.html:156 +msgid "CHI Response Rate" +msgstr "معدل استجابة هيئة التأمين الصحي" + +#: templates/dashboard/complaint_quarterly_report.html:201 +msgid "Source Breakdown" +msgstr "تفصيل المصادر" + +#: templates/dashboard/complaint_quarterly_report.html:281 +#: templates/dashboard/employee_evaluation.html:1106 +msgid "Department Type Breakdown" +msgstr "تفصيل نوع القسم" + +#: templates/dashboard/complaint_quarterly_report.html:333 +msgid "Total Complaints - External & Internal" +msgstr "إجمالي الشكاوى - الخارجية والداخلية" + +#: templates/dashboard/complaint_quarterly_report.html:340 +#: templates/dashboard/complaint_quarterly_report.html:588 +msgid "Source Totals" +msgstr "إجماليات المصادر" + +#: templates/dashboard/complaint_quarterly_report.html:390 +msgid "Department Type Monthly" +msgstr "نوع القسم شهريًا" + +#: templates/dashboard/complaint_quarterly_report.html:418 +msgid "Total Complaints - Main Department" +msgstr "إجمالي الشكاوى - القسم الرئيسي" + +#: templates/dashboard/complaint_quarterly_report.html:427 +msgid "Escalated Complaints by Category" +msgstr "الشكاوى المرفوعة حسب الفئة" + +#: templates/dashboard/complaint_quarterly_report.html:467 +msgid "Escalated Complaints Summary" +msgstr "ملخص الشكاوى المرفوعة" + +#: templates/dashboard/complaint_quarterly_report.html:471 +msgid "Total Number of Escalated Complaints" +msgstr "العدد الإجمالي للشكاوى المرفوعة" + +#: templates/dashboard/complaint_quarterly_report.html:475 +msgid "Internal Complaints" +msgstr "الشكاوى الداخلية" + +#: templates/dashboard/complaint_quarterly_report.html:479 +#: templates/dashboard/employee_evaluation.html:971 +#: templates/dashboard/employee_evaluation.html:1021 +msgid "MOH" +msgstr "MOH" + +#: templates/dashboard/complaint_quarterly_report.html:483 +#: templates/dashboard/employee_evaluation.html:1020 +msgid "CHI" +msgstr "CHI" + +#: templates/dashboard/complaint_quarterly_report.html:493 +msgid "Total Escalated Comp." +msgstr "إجمالي الشكاوى المُصعّدة" + +#: templates/dashboard/complaint_quarterly_report.html:494 +msgid "Total Number of Comp." +msgstr "إجمالي عدد الشكاوى" + +#: templates/dashboard/complaint_quarterly_report.html:495 +#: templates/dashboard/employee_evaluation.html:966 +#: templates/dashboard/employee_evaluation.html:1071 +#: templates/dashboard/employee_evaluation.html:1116 +#: templates/dashboard/employee_evaluation.html:1331 +#, python-format +msgid "%%" +msgstr "%%" + +#: templates/dashboard/complaint_quarterly_report.html:501 +msgid "Escalated by Source (External & Internal)" +msgstr "تم التصعيد حسب المصدر (خارجي وداخلي)" + +#: templates/dashboard/complaint_quarterly_report.html:505 +msgid "Escalated Rate by Department" +msgstr "معدل التصعيد حسب القسم" + +#: templates/dashboard/complaint_quarterly_report.html:509 +msgid "Escalated Count by Department" +msgstr "عدد الشكاوى المُصعّدة حسب القسم" + +#: templates/dashboard/complaint_quarterly_report.html:519 +msgid "Complaints by Sub-Department" +msgstr "الشكاوى حسب القسم الفرعي" + +#: templates/dashboard/complaint_quarterly_report.html:607 +msgid "Average Response Rate in Days" +msgstr "متوسط معدل الاستجابة بالأيام" + +#: templates/dashboard/complaint_quarterly_report.html:618 +msgid "Internal Complaints Response Rate" +msgstr "معدل الاستجابة للشكاوى الداخلية" + +#: templates/dashboard/complaint_quarterly_report.html:623 +msgid "MOH Complaints Response Rate" +msgstr "معدل الاستجابة لشكاوى وزارة الصحة" + +#: templates/dashboard/complaint_quarterly_report.html:628 +msgid "CHI Complaints Response Rate" +msgstr "معدل الاستجابة لشكاوى هيئة الصحة العامة" + +#: templates/dashboard/complaint_quarterly_report.html:637 +msgid "Individual Complaints" +msgstr "الشكاوى الفردية" + +#: templates/dashboard/complaint_quarterly_report.html:643 +msgid "Hours" +msgstr "ساعات" + +#: templates/dashboard/complaint_quarterly_report.html:644 +msgid "Bucket" +msgstr "المجموعة" + #: templates/dashboard/complaint_request_list.html:10 -#, fuzzy -#| msgid "Step 0 — Comment Imports" msgid "Step 0 — Complaint Requests Report" -msgstr "الخطوة 0 — استيراد التعليقات" +msgstr "الخطوة 0 — تقرير طلبات الشكاوى" #: templates/dashboard/complaint_request_list.html:11 msgid "Track complaint request filling, status, and timing" @@ -15830,19 +21027,19 @@ msgstr "تتبع طلب الشكوى وملئه، والحالة، والتوق #: templates/dashboard/complaint_request_list.html:55 #: templates/dashboard/complaint_request_list.html:108 -#: templates/dashboard/employee_evaluation.html:1255 +#: templates/dashboard/employee_evaluation.html:1336 msgid "Filled" msgstr "ممتلئ" #: templates/dashboard/complaint_request_list.html:56 #: templates/dashboard/complaint_request_list.html:110 -#: templates/dashboard/employee_evaluation.html:1260 +#: templates/dashboard/employee_evaluation.html:1341 msgid "Not Filled" msgstr "غير مكتمل" #: templates/dashboard/complaint_request_list.html:57 #: templates/dashboard/complaint_request_list.html:106 -#: templates/dashboard/employee_evaluation.html:1265 +#: templates/dashboard/employee_evaluation.html:1346 msgid "On Hold" msgstr "قيد الانتظار" @@ -15851,63 +21048,53 @@ msgid "Barcode (SELF)" msgstr "الباركود (ذاتي)" #: templates/dashboard/complaint_request_list.html:75 -#, fuzzy -#| msgid "Complaint Response" msgid "Complaint Requests" -msgstr "الاستجابة للشكاوى" +msgstr "طلبات الشكاوى" #: templates/dashboard/complaint_request_list.html:75 -#, fuzzy -#| msgid "Total" +#: templates/organizations/department_detail.html:108 +#: templates/organizations/department_detail.html:120 +#: templates/organizations/department_detail.html:132 +#: templates/organizations/department_detail.html:1785 msgid "total" msgstr "الإجمالي" #: templates/dashboard/complaint_request_list.html:82 -#: templates/feedback/action_plan_list.html:58 +#: templates/feedback/action_plan_list.html:119 msgid "#" msgstr "#" #: templates/dashboard/complaint_request_list.html:85 -#, fuzzy -#| msgid "File" msgid "File #" -msgstr "الملف" +msgstr "رقم الملف" #: templates/dashboard/complaint_request_list.html:89 -#, fuzzy -#| msgid "All Time" msgid "Fill Time" -msgstr "كل الوقت" +msgstr "وقت التعبئة" #: templates/dashboard/complaint_request_list.html:90 -#, fuzzy -#| msgid "From Barcode" msgid "Barcode" -msgstr "من الباركود" +msgstr "الباركود" #: templates/dashboard/complaint_request_list.html:91 -#, fuzzy -#| msgid "Activation Rate" msgid "Non-Activation Reason" -msgstr "معدل التفعيل" +msgstr "سبب عدم التفعيل" #: templates/dashboard/complaint_request_list.html:92 -#, fuzzy -#| msgid "Observations" msgid "PR Observations" -msgstr "الملاحظات" +msgstr "ملاحظات PR" #: templates/dashboard/complaint_request_list.html:134 -#, fuzzy, python-format -#| msgid "Page %(current)s of %(total)s" +#, python-format msgid "Showing %(start)s-%(end)s of %(total)s" -msgstr "الصفحة %(current)s من %(total)s" +msgstr "عرض %(start)s-%(end)s من %(total)s" #: templates/dashboard/department_benchmarks.html:20 msgid "Staff Performance Comparison" msgstr "مقارنة أداء الموظفين" #: templates/dashboard/department_benchmarks.html:24 +#: templates/dashboard/employee_evaluation_charts.html:248 msgid "Back to Evaluation" msgstr "العودة إلى التقييم" @@ -15952,7 +21139,7 @@ msgid "Performance Score" msgstr "درجة الأداء" #: templates/dashboard/department_benchmarks.html:132 -#: templates/dashboard/my_dashboard.html:36 +#: templates/dashboard/my_dashboard.html:42 msgid "Total Items" msgstr "إجمالي العناصر" @@ -15961,310 +21148,445 @@ msgid "No staff data available" msgstr "لا توجد بيانات موظفين متاحة" #: templates/dashboard/employee_evaluation.html:4 -#: templates/layouts/partials/sidebar.html:133 +#: templates/layouts/partials/sidebar.html:383 msgid "Employee Evaluation" msgstr "تقييم الموظفين" -#: templates/dashboard/employee_evaluation.html:623 +#: templates/dashboard/employee_evaluation.html:677 msgid "PAD Department – Patients Relations Weekly Dashboard" msgstr "قسم التعاملات مع المرضى – لوحة معلومات أسبوعية لعلاقات المرضى" -#: templates/dashboard/employee_evaluation.html:626 -#: templates/emails/public_inquiry_notification.html:40 +#: templates/dashboard/employee_evaluation.html:680 +#: templates/dashboard/employee_evaluation_charts.html:160 +#: templates/emails/communication_request_notification.html:16 +#: templates/emails/public_inquiry_notification.html:13 msgid "From:" msgstr "من:" -#: templates/dashboard/employee_evaluation.html:627 +#: templates/dashboard/employee_evaluation.html:681 +#: templates/dashboard/employee_evaluation_charts.html:161 msgid "To:" msgstr "إلى:" -#: templates/dashboard/employee_evaluation.html:704 +#: templates/dashboard/employee_evaluation.html:768 +#: templates/dashboard/my_performance.html:141 #: templates/surveys/analytics_dashboard.html:52 msgid "Response Time" msgstr "وقت الاستجابة" -#: templates/dashboard/employee_evaluation.html:705 -#: templates/dashboard/employee_evaluation.html:752 -#: templates/dashboard/employee_evaluation.html:1355 +#: templates/dashboard/employee_evaluation.html:769 +#: templates/dashboard/employee_evaluation.html:816 +#: templates/dashboard/employee_evaluation.html:1437 +#: templates/dashboard/employee_evaluation_charts.html:281 msgid "24h Response Rate" msgstr "معدل الاستجابة خلال 24 ساعة" -#: templates/dashboard/employee_evaluation.html:706 -#: templates/dashboard/employee_evaluation.html:1361 +#: templates/dashboard/employee_evaluation.html:770 +#: templates/dashboard/employee_evaluation.html:1443 +#: templates/dashboard/employee_evaluation_charts.html:287 msgid "48h Response Rate" msgstr "معدل الاستجابة خلال 48 ساعة" -#: templates/dashboard/employee_evaluation.html:707 -#: templates/dashboard/employee_evaluation.html:1367 +#: templates/dashboard/employee_evaluation.html:771 +#: templates/dashboard/employee_evaluation.html:1449 +#: templates/dashboard/employee_evaluation_charts.html:293 msgid ">72h Overdue Rate" msgstr "معدل التأخير >٧٢ ساعة" -#: templates/dashboard/employee_evaluation.html:711 -#: templates/dashboard/employee_evaluation.html:1386 +#: templates/dashboard/employee_evaluation.html:775 +#: templates/dashboard/employee_evaluation.html:1468 +#: templates/dashboard/employee_evaluation_charts.html:311 msgid "MOH Complaints" msgstr "شكاوى وزارة الصحة" -#: templates/dashboard/employee_evaluation.html:712 -#: templates/dashboard/employee_evaluation.html:1392 +#: templates/dashboard/employee_evaluation.html:776 +#: templates/dashboard/employee_evaluation.html:1474 +#: templates/dashboard/employee_evaluation_charts.html:317 msgid "CCHI Complaints" msgstr "شكاوى هيئة التعليمة الطبية" -#: templates/dashboard/employee_evaluation.html:713 -#: templates/dashboard/employee_evaluation.html:1398 +#: templates/dashboard/employee_evaluation.html:777 +#: templates/dashboard/employee_evaluation.html:1480 +#: templates/dashboard/employee_evaluation_charts.html:323 msgid "Patient Complaints" msgstr "شكاوى المرضى" -#: templates/dashboard/employee_evaluation.html:716 -#: templates/dashboard/employee_evaluation.html:755 -#: templates/dashboard/employee_evaluation.html:1411 +#: templates/dashboard/employee_evaluation.html:780 +#: templates/dashboard/employee_evaluation.html:819 +#: templates/dashboard/employee_evaluation.html:1493 +#: templates/dashboard/employee_evaluation_charts.html:335 +#: templates/dashboard/employee_evaluation_charts.html:525 msgid "Delay Rate" msgstr "معدل التأخير" -#: templates/dashboard/employee_evaluation.html:717 -#: templates/dashboard/employee_evaluation.html:1417 -msgid "Activation Rate" -msgstr "معدل التفعيل" - -#: templates/dashboard/employee_evaluation.html:720 -#: templates/dashboard/employee_evaluation.html:806 -#: templates/dashboard/employee_evaluation.html:1430 +#: templates/dashboard/employee_evaluation.html:784 +#: templates/dashboard/employee_evaluation.html:870 +#: templates/dashboard/employee_evaluation.html:1512 +#: templates/dashboard/employee_evaluation_charts.html:353 msgid "Total Escalated" msgstr "إجمالي الشكاوى المُقَدَّمة" -#: templates/dashboard/employee_evaluation.html:722 -#: templates/dashboard/employee_evaluation.html:793 -#: templates/dashboard/employee_evaluation.html:1217 -#: templates/dashboard/employee_evaluation.html:1442 +#: templates/dashboard/employee_evaluation.html:786 +#: templates/dashboard/employee_evaluation.html:857 +#: templates/dashboard/employee_evaluation.html:1298 +#: templates/dashboard/employee_evaluation.html:1524 +#: templates/dashboard/employee_evaluation_charts.html:365 msgid "Total Notes" msgstr "إجمالي الملاحظات" -#: templates/dashboard/employee_evaluation.html:723 -#: templates/dashboard/employee_evaluation.html:1448 +#: templates/dashboard/employee_evaluation.html:787 +#: templates/dashboard/employee_evaluation.html:1530 +#: templates/dashboard/employee_evaluation_charts.html:371 +#: templates/dashboard/employee_evaluation_charts.html:451 msgid "Report Completion" msgstr "إكمال التقرير" -#: templates/dashboard/employee_evaluation.html:729 +#: templates/dashboard/employee_evaluation.html:793 msgid "Comparison Mode" msgstr "وضع المقارنة" -#: templates/dashboard/employee_evaluation.html:749 +#: templates/dashboard/employee_evaluation.html:797 +#: templates/reports/report_builder.html:153 +msgid "Print" +msgstr "طباعة" + +#: templates/dashboard/employee_evaluation.html:813 msgid "Performance Trends (Last 4 Weeks)" msgstr "اتجاهات الأداء (آخر 4 أسابيع)" -#: templates/dashboard/employee_evaluation.html:754 +#: templates/dashboard/employee_evaluation.html:818 msgid "Escalations" msgstr "التصعيد" -#: templates/dashboard/employee_evaluation.html:834 +#: templates/dashboard/employee_evaluation.html:884 +#, fuzzy +#| msgid "Search reports..." +msgid "Search employees..." +msgstr "البحث في التقارير..." + +#: templates/dashboard/employee_evaluation.html:915 msgid "Complaints by Response Time" msgstr "شكاوى حسب وقت الاستجابة" -#: templates/dashboard/employee_evaluation.html:842 +#: templates/dashboard/employee_evaluation.html:923 +#: templates/dashboard/employee_evaluation_charts.html:492 +#: templates/dashboard/my_performance.html:143 msgid "24h" msgstr "24 ساعة" -#: templates/dashboard/employee_evaluation.html:843 +#: templates/dashboard/employee_evaluation.html:924 +#: templates/dashboard/employee_evaluation_charts.html:493 msgid "48h" msgstr "48 ساعة" -#: templates/dashboard/employee_evaluation.html:844 +#: templates/dashboard/employee_evaluation.html:925 +#: templates/dashboard/employee_evaluation_charts.html:494 msgid "72h" msgstr "72 ساعة" -#: templates/dashboard/employee_evaluation.html:845 +#: templates/dashboard/employee_evaluation.html:926 +#: templates/dashboard/employee_evaluation_charts.html:495 msgid ">72h" msgstr ">72 ساعة" -#: templates/dashboard/employee_evaluation.html:885 -#: templates/dashboard/employee_evaluation.html:990 -#: templates/dashboard/employee_evaluation.html:1035 -#: templates/dashboard/employee_evaluation.html:1250 -#, python-format -msgid "%%" -msgstr "%%" - -#: templates/dashboard/employee_evaluation.html:890 -#: templates/dashboard/employee_evaluation.html:940 -msgid "MOH" -msgstr "MOH" - -#: templates/dashboard/employee_evaluation.html:895 +#: templates/dashboard/employee_evaluation.html:976 msgid "CCHI" msgstr "CCHI" -#: templates/dashboard/employee_evaluation.html:900 -#: templates/layouts/partials/sidebar.html:323 +#: templates/dashboard/employee_evaluation.html:981 +#: templates/dashboard/employee_evaluation_charts.html:512 +#: templates/layouts/partials/sidebar.html:244 #: templates/organizations/patient_detail.html:133 #: templates/organizations/patient_list.html:6 -#: templates/organizations/patient_list.html:123 +#: templates/organizations/patient_list.html:143 #: templates/organizations/patient_visit_journey.html:72 msgid "Patients" msgstr "المرضى" -#: templates/dashboard/employee_evaluation.html:905 +#: templates/dashboard/employee_evaluation.html:986 msgid "Patient's relatives" msgstr "أقارب المريض" -#: templates/dashboard/employee_evaluation.html:910 +#: templates/dashboard/employee_evaluation.html:991 msgid "Insurance company" msgstr "شركة التأمين" -#: templates/dashboard/employee_evaluation.html:930 +#: templates/dashboard/employee_evaluation.html:1011 msgid "Response Time by Source (CHI vs MOH)" msgstr "وقت الاستجابة حسب المصدر (CHI مقابل MOH)" -#: templates/dashboard/employee_evaluation.html:938 +#: templates/dashboard/employee_evaluation.html:1019 msgid "Time" msgstr "الوقت" -#: templates/dashboard/employee_evaluation.html:939 -msgid "CHI" -msgstr "CHI" - -#: templates/dashboard/employee_evaluation.html:945 +#: templates/dashboard/employee_evaluation.html:1026 msgid "24 Hours" msgstr "٢٤ ساعة" -#: templates/dashboard/employee_evaluation.html:950 +#: templates/dashboard/employee_evaluation.html:1031 msgid "48 Hours" msgstr "48 ساعة" -#: templates/dashboard/employee_evaluation.html:955 +#: templates/dashboard/employee_evaluation.html:1036 msgid "72 Hours" msgstr "72 ساعة" -#: templates/dashboard/employee_evaluation.html:960 +#: templates/dashboard/employee_evaluation.html:1041 msgid ">72 Hours" msgstr ">72 ساعة" -#: templates/dashboard/employee_evaluation.html:980 +#: templates/dashboard/employee_evaluation.html:1061 msgid "Patient Type Breakdown" msgstr "تفصيل نوع المريض" -#: templates/dashboard/employee_evaluation.html:995 -msgid "In-Patient" -msgstr "مريض داخلي" - -#: templates/dashboard/employee_evaluation.html:1000 -msgid "Out-Patient" -msgstr "المرضى الخارجيين" - -#: templates/dashboard/employee_evaluation.html:1025 -msgid "Department Type Breakdown" -msgstr "تفصيل نوع القسم" - -#: templates/dashboard/employee_evaluation.html:1075 +#: templates/dashboard/employee_evaluation.html:1156 msgid "Delays and Activation" msgstr "التأخيرات والتفعيل" -#: templates/dashboard/employee_evaluation.html:1083 +#: templates/dashboard/employee_evaluation.html:1164 msgid "Delays" msgstr "التأخيرات" -#: templates/dashboard/employee_evaluation.html:1090 +#: templates/dashboard/employee_evaluation.html:1171 msgid "Activated ≤2h" msgstr "تم التفعيل ≤2 ساعة" -#: templates/dashboard/employee_evaluation.html:1104 +#: templates/dashboard/employee_evaluation.html:1185 msgid "Escalated Complaints" msgstr "الشكاوى المتصاعدة" -#: templates/dashboard/employee_evaluation.html:1112 +#: templates/dashboard/employee_evaluation.html:1193 msgid "Before 72h" msgstr "قبل 72 ساعة" -#: templates/dashboard/employee_evaluation.html:1113 +#: templates/dashboard/employee_evaluation.html:1194 msgid "Exactly 72h" msgstr "بالضبط 72 ساعة" -#: templates/dashboard/employee_evaluation.html:1114 +#: templates/dashboard/employee_evaluation.html:1195 msgid "After 72h" msgstr "بعد 72 ساعة" -#: templates/dashboard/employee_evaluation.html:1129 +#: templates/dashboard/employee_evaluation.html:1210 msgid "Total Escalated:" msgstr "إجمالي التصعيد:" -#: templates/dashboard/employee_evaluation.html:1148 +#: templates/dashboard/employee_evaluation.html:1229 msgid "Incoming" msgstr "الوارد" -#: templates/dashboard/employee_evaluation.html:1168 -#: templates/dashboard/employee_evaluation.html:1196 +#: templates/dashboard/employee_evaluation.html:1249 +#: templates/dashboard/employee_evaluation.html:1277 msgid "تحت الإجراء:" msgstr "تحت الإجراء:" -#: templates/dashboard/employee_evaluation.html:1169 -#: templates/dashboard/employee_evaluation.html:1197 +#: templates/dashboard/employee_evaluation.html:1250 +#: templates/dashboard/employee_evaluation.html:1278 msgid "تم التواصل:" msgstr "تم التواصل:" -#: templates/dashboard/employee_evaluation.html:1170 -#: templates/dashboard/employee_evaluation.html:1198 +#: templates/dashboard/employee_evaluation.html:1251 +#: templates/dashboard/employee_evaluation.html:1279 msgid "لم يتم الرد:" msgstr "لم يتم الرد:" -#: templates/dashboard/employee_evaluation.html:1176 +#: templates/dashboard/employee_evaluation.html:1257 msgid "Outgoing" msgstr "صادر" -#: templates/dashboard/employee_evaluation.html:1240 +#: templates/dashboard/employee_evaluation.html:1321 msgid "Complaint Request & Filling" msgstr "طلب الشكوى والإكمال" -#: templates/dashboard/employee_evaluation.html:1270 +#: templates/dashboard/employee_evaluation.html:1351 msgid "From Barcode" msgstr "من الباركود" -#: templates/dashboard/employee_evaluation.html:1277 -msgid "Total:" -msgstr "إجمالي:" - -#: templates/dashboard/employee_evaluation.html:1288 +#: templates/dashboard/employee_evaluation.html:1369 msgid "Report Completion Tracker" msgstr "تتبع إكمال التقرير" -#: templates/dashboard/employee_evaluation.html:1328 +#: templates/dashboard/employee_evaluation.html:1410 +#: templates/dashboard/employee_evaluation_charts.html:261 msgid "Comparison Table" msgstr "جدول المقارنة" -#: templates/dashboard/employee_evaluation.html:1333 -#: templates/dashboard/employee_evaluation.html:2289 +#: templates/dashboard/employee_evaluation.html:1415 +#: templates/dashboard/employee_evaluation.html:2402 msgid "Hide Table" msgstr "إخفاء الجدول" -#: templates/dashboard/employee_evaluation.html:1351 +#: templates/dashboard/employee_evaluation.html:1433 +#: templates/dashboard/employee_evaluation_charts.html:277 msgid "RESPONSE TIME" msgstr "وقت الاستجابة" -#: templates/dashboard/employee_evaluation.html:1376 +#: templates/dashboard/employee_evaluation.html:1458 +#: templates/dashboard/employee_evaluation_charts.html:301 msgid "COMPLAINTS" msgstr "الشكاوى" -#: templates/dashboard/employee_evaluation.html:1407 +#: templates/dashboard/employee_evaluation.html:1489 +#: templates/dashboard/employee_evaluation_charts.html:331 msgid "PERFORMANCE" msgstr "الأداء" -#: templates/dashboard/employee_evaluation.html:1426 +#: templates/dashboard/employee_evaluation.html:1508 +#: templates/dashboard/employee_evaluation_charts.html:349 msgid "OTHER" msgstr "أخرى" -#: templates/dashboard/employee_evaluation.html:1460 +#: templates/dashboard/employee_evaluation.html:1542 msgid "Best performer" msgstr "أفضل أداء" -#: templates/dashboard/employee_evaluation.html:1463 +#: templates/dashboard/employee_evaluation.html:1545 msgid "Needs improvement" msgstr "يحتاج إلى تحسين" -#: templates/dashboard/employee_evaluation.html:1466 +#: templates/dashboard/employee_evaluation.html:1548 msgid "Based on selected comparison criteria" msgstr "بناءً على معايير المقارنة المحددة" -#: templates/dashboard/employee_evaluation.html:2292 +#: templates/dashboard/employee_evaluation.html:2405 msgid "Show Table" msgstr "إظهار الجدول" +#: templates/dashboard/employee_evaluation_charts.html:4 +#: templates/layouts/partials/sidebar.html:388 +msgid "Evaluation Charts" +msgstr "رسوم التقييم البيانية" + +#: templates/dashboard/employee_evaluation_charts.html:157 +msgid "Employee Evaluation – Charts & Comparison" +msgstr "تقييم الموظف – الرسوم البيانية والمقارنة" + +#: templates/dashboard/employee_evaluation_charts.html:387 +msgid "Visual Comparison" +msgstr "مقارنة مرئية" + +#: templates/dashboard/employee_evaluation_charts.html:396 +msgid "Response Time Comparison" +msgstr "مقارنة وقت الاستجابة" + +#: templates/dashboard/employee_evaluation_charts.html:407 +msgid "Complaint Volume by Source" +msgstr "حجم الشكاوى حسب المصدر" + +#: templates/dashboard/employee_evaluation_charts.html:418 +msgid "Delay vs Activation Rate" +msgstr "معدل التأخير مقابل معدل التفعيل" + +#: templates/dashboard/employee_evaluation_charts.html:429 +msgid "Performance Radar" +msgstr "رادار الأداء" + +#: templates/dashboard/employee_evaluation_charts.html:440 +msgid "Escalations & Inquiries" +msgstr "التصعيدات والاستفسارات" + +#: templates/dashboard/employee_evaluation_charts.html:466 +msgid "Select staff members and a date range to generate comparison charts." +msgstr "اختر أعضاء الفريق ونطاق زمني لإنشاء مخططات المقارنة." + +#: templates/dashboard/employee_evaluation_charts.html:559 +msgid "24h Response" +msgstr "استجابة 24 ساعة" + +#: templates/dashboard/employee_evaluation_charts.html:560 +msgid "48h Response" +msgstr "استجابة 48 ساعة" + +#: templates/dashboard/employee_evaluation_charts.html:561 +msgid "Activation" +msgstr "التفعيل" + +#: templates/dashboard/employee_evaluation_charts.html:563 +msgid "Low Delay" +msgstr "تأخير منخفض" + +#: templates/dashboard/employee_evaluation_charts.html:564 +msgid "Low Overdue" +msgstr "تأخر منخفض" + +#: templates/dashboard/employee_evaluation_charts.html:603 +#: templates/physicians/leaderboard.html:359 +msgid "Average" +msgstr "متوسط" + +#: templates/dashboard/inquiry_report.html:10 +#: templates/layouts/partials/sidebar.html:599 +msgid "Inquiry Reports" +msgstr "تقارير الاستعلام" + +#: templates/dashboard/inquiry_report.html:11 +msgid "Incoming & Outgoing inquiry analysis from HIS data" +msgstr "تحليل الاستفسارات الواردة والصادرة من بيانات HIS" + +#: templates/dashboard/inquiry_report.html:18 +msgid "Export Incoming" +msgstr "تصدير الوارد" + +#: templates/dashboard/inquiry_report.html:24 +msgid "Export Outgoing" +msgstr "تصدير الصادر" + +#: templates/dashboard/inquiry_report.html:34 +msgid "No Inquiry Data Available" +msgstr "لا توجد بيانات استعلام متاحة" + +#: templates/dashboard/inquiry_report.html:35 +msgid "There are no inquiry records in the database for the selected hospital." +msgstr "لا توجد سجلات استفسارات في قاعدة البيانات للمستشفى المحدد." + +#: templates/dashboard/inquiry_report.html:86 +msgid "Incoming Total" +msgstr "إجمالي الوارد" + +#: templates/dashboard/inquiry_report.html:97 +msgid "Outgoing Total" +msgstr "الإجمالي الصادر" + +#: templates/dashboard/inquiry_report.html:108 +msgid "1st / 2nd Half" +msgstr "النصف الأول / النصف الثاني" + +#: templates/dashboard/inquiry_report.html:110 +msgid "Incoming split" +msgstr "التقسيم الوارد" + +#: templates/dashboard/inquiry_report.html:122 +msgid "Incoming contacted rate" +msgstr "معدل الاتصال الوارد" + +#: templates/dashboard/inquiry_report.html:130 +msgid "Incoming - Daily Trend" +msgstr "الوارد - الاتجاه اليومي" + +#: templates/dashboard/inquiry_report.html:134 +msgid "Outgoing - Daily Trend" +msgstr "الصادر - الاتجاه اليومي" + +#: templates/dashboard/inquiry_report.html:141 +msgid "Incoming by Status" +msgstr "الوارد حسب الحالة" + +#: templates/dashboard/inquiry_report.html:145 +msgid "Outgoing by Status" +msgstr "الصادر حسب الحالة" + +#: templates/dashboard/inquiry_report.html:149 +msgid "Timeline SLA Distribution" +msgstr "توزيع اتفاقية مستوى الخدمة الزمني" + +#: templates/dashboard/inquiry_report.html:158 +msgid "Incoming - Per Employee" +msgstr "الوارد - لكل موظف" + +#: templates/dashboard/inquiry_report.html:190 +msgid "Outgoing - Per Department" +msgstr "الصادر - لكل قسم" + #: templates/dashboard/my_dashboard.html:13 msgid "My Dashboard" msgstr "لوحتي الرئيسية" @@ -16277,47 +21599,29 @@ msgstr "نظرة عامة على العناصر والمهام المخصصة ل msgid "filtered" msgstr "مرشح" -#: templates/dashboard/my_dashboard.html:112 +#: templates/dashboard/my_dashboard.html:118 msgid "Completion Trend (Last 30 Days)" msgstr "اتجاه الإنجاز (آخر 30 يومًا)" -#: templates/dashboard/my_dashboard.html:127 -msgid "Last 7 days" -msgstr "آخر 7 أيام" - -#: templates/dashboard/my_dashboard.html:128 -#: templates/emails/survey_results_notification.html:100 -msgid "Last 30 days" -msgstr "آخر 30 يومًا" - -#: templates/dashboard/my_dashboard.html:129 -msgid "Last 90 days" -msgstr "آخر 90 يومًا" - -#: templates/dashboard/my_dashboard.html:130 +#: templates/dashboard/my_dashboard.html:136 msgid "All time" msgstr "طوال الفترة" -#: templates/dashboard/my_dashboard.html:148 +#: templates/dashboard/my_dashboard.html:154 msgid "Priority/Severity" msgstr "الأولوية/الخطورة" -#: templates/dashboard/my_dashboard.html:193 +#: templates/dashboard/my_dashboard.html:199 #: templates/dashboard/partials/tasks_table.html:6 -#: templates/projects/project_detail.html:63 #: templates/projects/project_list.html:169 msgid "Tasks" msgstr "المهام" -#: templates/dashboard/my_dashboard.html:198 -#: templates/dashboard/partials/feedback_table.html:6 -#: templates/feedback/feedback_delete_confirm.html:61 -#: templates/feedback/feedback_detail.html:154 -#: templates/feedback/feedback_form.html:129 -msgid "Feedback" -msgstr "ملاحظات" +#: templates/dashboard/my_dashboard.html:249 +msgid "My Recent Activity" +msgstr "نشاطي الأخير" -#: templates/dashboard/my_dashboard.html:243 +#: templates/dashboard/my_dashboard.html:312 #: templates/dashboard/partials/actions_table.html:10 #: templates/dashboard/partials/complaints_table.html:10 #: templates/dashboard/partials/feedback_table.html:10 @@ -16327,27 +21631,116 @@ msgstr "ملاحظات" msgid "Bulk Action" msgstr "الإجراء الجماعي" -#: templates/dashboard/my_dashboard.html:254 +#: templates/dashboard/my_dashboard.html:323 #: templates/observations/convert_to_action.html:86 msgid "Assign to User" msgstr "تعيين إلى المستخدم" -#: templates/dashboard/my_dashboard.html:258 +#: templates/dashboard/my_dashboard.html:327 msgid "New Status" msgstr "الحالة الجديدة" -#: templates/dashboard/my_dashboard.html:278 +#: templates/dashboard/my_dashboard.html:347 msgid "Execute" msgstr "تنفيذ" -#: templates/dashboard/my_dashboard.html:354 +#: templates/dashboard/my_dashboard.html:423 msgid "Completed Items" msgstr "العناصر المكتملة" -#: templates/dashboard/my_dashboard.html:501 +#: templates/dashboard/my_dashboard.html:570 msgid "Successfully processed" msgstr "تمت المعالجة بنجاح" +#: templates/dashboard/my_performance.html:66 +msgid "Back to My Dashboard" +msgstr "العودة إلى لوحة التحكم الخاصة بي" + +#: templates/dashboard/my_performance.html:89 +msgid "Last Year" +msgstr "العام الماضي" + +#: templates/dashboard/my_performance.html:110 +msgid "Overall Performance Score" +msgstr "درجة الأداء الإجمالية" + +#: templates/dashboard/my_performance.html:146 +msgid "within 48h" +msgstr "خلال 48 ساعة" + +#: templates/dashboard/my_performance.html:176 +#: templates/dashboard/staff_performance_detail.html:58 +msgid "Score Breakdown" +msgstr "تفصيل الدرجات" + +#: templates/dashboard/my_performance.html:198 +msgid "No performance data available" +msgstr "لا تتوفر بيانات الأداء" + +#: templates/dashboard/my_performance.html:199 +msgid "" +"Performance metrics will appear once you have assigned complaints or " +"inquiries." +msgstr "ستظهر مقاييس الأداء بمجرد تعيين الشكاوى أو الاستفسارات." + +#: templates/dashboard/my_performance.html:210 +msgid "Department Comparison" +msgstr "مقارنة الأقسام" + +#: templates/dashboard/my_performance.html:213 +msgid "How your performance compares to your department" +msgstr "كيفية مقارنة أدائك بأداء قسمك" + +#: templates/dashboard/my_performance.html:216 +msgid "Department Avg Score" +msgstr "متوسط درجة القسم" + +#: templates/dashboard/my_performance.html:220 +msgid "Staff in Dept" +msgstr "الموظفون في القسم" + +#: templates/dashboard/my_performance.html:224 +msgid "Your Rank" +msgstr "ترتيبك" + +#: templates/dashboard/my_performance.html:242 +msgid "Items" +msgstr "العناصر" + +#: templates/dashboard/observation_report.html:10 +#: templates/layouts/partials/sidebar.html:604 +msgid "Observation Report" +msgstr "تقرير الملاحظات" + +#: templates/dashboard/observation_report.html:11 +msgid "Staff observation analytics and breakdown" +msgstr "تحليلات وإحصائيات ملاحظات الموظفين" + +#: templates/dashboard/observation_report.html:26 +msgid "No Observation Data Available" +msgstr "لا توجد بيانات ملاحظات متاحة" + +#: templates/dashboard/observation_report.html:27 +msgid "" +"There are no observation records in the database for the selected hospital." +msgstr "لا توجد سجلات ملاحظات في قاعدة البيانات للمستشفى المحدد." + +#: templates/dashboard/observation_report.html:86 +msgid "Critical + High" +msgstr "حرجة + عالية" + +#: templates/dashboard/observation_report.html:117 +msgid "By Severity" +msgstr "حسب الشدة" + +#: templates/dashboard/observation_report.html:134 +msgid "Per Employee" +msgstr "لكل موظف" + +#: templates/dashboard/observation_report.html:166 +msgid "Per Department" +msgstr "لكل قسم" + #: templates/dashboard/partials/actions_table.html:78 msgid "No PX actions found" msgstr "لم يتم العثور على إجراءات PX" @@ -16370,12 +21763,14 @@ msgid "inquiries" msgstr "الاستفسارات" #: templates/dashboard/partials/observations_table.html:64 -#: templates/observations/observation_list.html:391 +#: templates/observations/observation_list.html:389 +#: templates/organizations/department_observations.html:118 +#: templates/px_sources/source_user_observation_list.html:207 msgid "No observations found" msgstr "لم يتم العثور على ملاحظات" #: templates/dashboard/partials/observations_table.html:74 -#: templates/observations/observation_list.html:284 +#: templates/observations/observation_list.html:286 msgid "observations" msgstr "ملاحظات" @@ -16384,6 +21779,9 @@ msgid "No tasks found" msgstr "لم يتم العثور على مهام" #: templates/dashboard/partials/tasks_table.html:82 +#: templates/projects/partials/phase_header.html:50 +#: templates/projects/project_detail.html:164 +#: templates/projects/project_detail.html:269 #: templates/projects/template_detail.html:58 #: templates/projects/template_list.html:105 msgid "tasks" @@ -16409,28 +21807,16 @@ msgstr "بناءً على" msgid "items handled" msgstr "عدد العناصر المُعالجة" -#: templates/dashboard/staff_performance_detail.html:58 -msgid "Score Breakdown" -msgstr "تفصيل الدرجات" - #: templates/dashboard/staff_performance_detail.html:64 -#: templates/surveys/comment_list.html:203 +#: templates/surveys/comment_list.html:217 #: templates/surveys/instance_list.html:103 msgid "Complaint Resolution" msgstr "حل الشكاوى" -#: templates/dashboard/staff_performance_detail.html:73 -msgid "Complaint Response" -msgstr "الاستجابة للشكاوى" - #: templates/dashboard/staff_performance_detail.html:82 msgid "Inquiry Resolution" msgstr "حل الاستفسارات" -#: templates/dashboard/staff_performance_detail.html:91 -msgid "Inquiry Response" -msgstr "الاستجابة للاستفسارات" - #: templates/dashboard/staff_performance_detail.html:100 msgid "Activation Time" msgstr "مدة التفعيل" @@ -16444,11 +21830,6 @@ msgstr "عبء العمل" msgid "resolution rate" msgstr "معدل الحل" -#: templates/dashboard/staff_performance_detail.html:145 -#: templates/physicians/ratings_list.html:196 -msgid "Period" -msgstr "الفترة" - #: templates/dashboard/staff_performance_detail.html:154 msgid "Items/Day" msgstr "عناصر/يوم" @@ -16462,7 +21843,7 @@ msgid "6-Month Performance Trend" msgstr "اتجاه الأداء خلال 6 أشهر" #: templates/dashboard/staff_performance_detail.html:185 -#: templates/px_sources/source_user_dashboard.html:144 +#: templates/px_sources/source_user_dashboard.html:176 msgid "Recent Complaints" msgstr "الشكاوى الأخيرة" @@ -16474,38 +21855,129 @@ msgstr "لا توجد شكاوى في الفترة المحددة" msgid "No inquiries in selected period" msgstr "لا توجد استفسارات في الفترة المحددة" -#: templates/emails/appointment_confirmation.html:4 -#, fuzzy -#| msgid "New Complaint Notification - Al Hammadi Hospital" -msgid "Appointment Confirmation - Al Hammadi Hospital" -msgstr "إشعار شكوى جديد - مستشفى الحمادي" +#: templates/dashboard/standards_dashboard.html:10 +#: templates/layouts/partials/sidebar.html:619 +#: templates/standards/department_standards.html:74 +msgid "Standards Compliance" +msgstr "الامتثال للمعايير" -#: templates/emails/appointment_confirmation.html:6 -#, fuzzy -#| msgid "Your complaint has been received and is being reviewed." -msgid "Your appointment has been confirmed. Please review the details." -msgstr "تم استلام شكواك وجارٍ مراجعتها." +#: templates/dashboard/standards_dashboard.html:11 +msgid "CBAHI & MOH accreditation standards tracking" +msgstr "" +"تتبع معايير الاعتماد الخاصة بالهيئة السعودية للمراكز الصحية (CBAHI) ووزارة " +"الصحة (MOH)" -#: templates/emails/appointment_confirmation.html:8 -#, fuzzy -#| msgid "Appointment" -msgid "Appointment Confirmed" -msgstr "موعد" +#: templates/dashboard/standards_dashboard.html:20 +msgid "No Standards Data" +msgstr "لا توجد بيانات للمعايير" -#: templates/emails/appointment_confirmation.html:10 +#: templates/dashboard/standards_dashboard.html:21 msgid "" -"Your healthcare appointment at Al Hammadi Hospital has been successfully " -"scheduled" -msgstr "لقد تم جدولة موعدك الصحي في مستشفى الحمادي بنجاح" +"No compliance records found. Import standards data using the management " +"command." +msgstr "" +"لم يتم العثور على سجلات الامتثال. قم باستيراد بيانات المعايير باستخدام أمر " +"الإدارة." -#: templates/emails/appointment_confirmation.html:17 -#: templates/emails/survey_invitation.html:11 -#, fuzzy -#| msgid "Save Patient" +#: templates/dashboard/standards_dashboard.html:57 +msgid "Total Standards" +msgstr "إجمالي المعايير" + +#: templates/dashboard/standards_dashboard.html:68 +#: templates/dashboard/standards_dashboard.html:139 +#: templates/organizations/department_detail.html:1129 +#: templates/standards/dashboard.html:119 +#: templates/standards/department_standards.html:334 +#: templates/standards/search.html:466 +#: templates/standards/standard_detail.html:213 +#: templates/standards/standard_detail.html:348 +#: templates/standards/standard_detail.html:486 +msgid "Met" +msgstr "مستوفى" + +#: templates/dashboard/standards_dashboard.html:80 +#: templates/dashboard/standards_dashboard.html:140 +#: templates/organizations/department_detail.html:1132 +#: templates/standards/department_standards.html:335 +#: templates/standards/search.html:467 +#: templates/standards/standard_detail.html:219 +#: templates/standards/standard_detail.html:349 +#: templates/standards/standard_detail.html:487 +msgid "Partially Met" +msgstr "مستوفى جزئياً" + +#: templates/dashboard/standards_dashboard.html:92 +#: templates/dashboard/standards_dashboard.html:141 +#: templates/organizations/department_detail.html:1135 +#: templates/standards/dashboard.html:147 +#: templates/standards/department_standards.html:336 +#: templates/standards/search.html:468 +#: templates/standards/standard_detail.html:225 +#: templates/standards/standard_detail.html:350 +#: templates/standards/standard_detail.html:488 +msgid "Not Met" +msgstr "غير مستوفى" + +#: templates/dashboard/standards_dashboard.html:103 +msgid "Overall Score" +msgstr "النتيجة الإجمالية" + +#: templates/dashboard/standards_dashboard.html:131 +msgid "Category Breakdown" +msgstr "تفصيل الفئات" + +#: templates/dashboard/standards_dashboard.html:142 +#, python-format +msgid "Compliance %%" +msgstr "الامتثال %%" + +#: templates/dashboard/standards_dashboard.html:175 +#: templates/rca/rca_detail.html:307 +msgid "Corrective Actions" +msgstr "الإجراءات التصحيحية" + +#: templates/dashboard/standards_dashboard.html:181 +#: templates/dashboard/standards_dashboard.html:239 +#: templates/standards/attachment_confirm_delete.html:90 +#: templates/standards/attachment_upload.html:139 +#: templates/standards/dashboard.html:252 +#: templates/standards/department_standards.html:151 +#: templates/standards/search.html:218 +msgid "Standard" +msgstr "المعيار" + +#: templates/dashboard/standards_dashboard.html:184 +msgid "Corrective Action" +msgstr "الإجراء التصحيحي" + +#: templates/dashboard/standards_dashboard.html:186 +#: templates/rca/rca_detail.html:500 +msgid "Target Date" +msgstr "التاريخ المستهدف" + +#: templates/dashboard/standards_dashboard.html:231 +#: templates/standards/search.html:168 +msgid "All Standards" +msgstr "جميع المعايير" + +#: templates/dashboard/standards_dashboard.html:267 +msgid "Recommendations:" +msgstr "التوصيات:" + +#: templates/emails/appointment_confirmation.html:4 +msgid "Appointment Confirmation - Al Hammadi Hospital" +msgstr "تأكيد الموعد - مستشفى الحمادي" + +#: templates/emails/appointment_confirmation.html:5 +msgid "Your appointment has been confirmed. Please review the details." +msgstr "تم تأكيد موعدك. يرجى مراجعة التفاصيل." + +#: templates/emails/appointment_confirmation.html:9 +#: templates/emails/survey_invitation.html:9 msgid "Valued Patient" -msgstr "حفظ المريض" +msgstr "المريض العزيز" -#: templates/emails/appointment_confirmation.html:20 +#: templates/emails/appointment_confirmation.html:13 msgid "" "Your appointment has been confirmed. Please find the details below and save " "this email for your records." @@ -16513,234 +21985,191 @@ msgstr "" "تم تأكيد موعدك. يرجى الاطلاع على التفاصيل أدناه وحفظ هذا البريد الإلكتروني " "لسجلاتك." -#: templates/emails/appointment_confirmation.html:30 -#, fuzzy -#| msgid "Appointments" -msgid "Appointment Details" -msgstr "المواعيد" - -#: templates/emails/appointment_confirmation.html:36 -#, fuzzy -#| msgid "Patient Name" -msgid "Patient Name:" -msgstr "اسم المريض" - -#: templates/emails/appointment_confirmation.html:44 -#, fuzzy -#| msgid "Appointment:" +#: templates/emails/appointment_confirmation.html:17 msgid "Appointment ID:" -msgstr "المواعيد:" +msgstr "معرف الموعد:" -#: templates/emails/appointment_confirmation.html:60 -#: templates/emails/new_complaint_admin_notification.html:126 +#: templates/emails/appointment_confirmation.html:19 +#: templates/emails/new_appreciation_notification.html:45 +#: templates/emails/new_complaint_admin_notification.html:46 +#: templates/emails/new_inquiry_notification.html:46 +#: templates/emails/new_suggestion_notification.html:46 msgid "Time:" msgstr "الوقت:" -#: templates/emails/appointment_confirmation.html:76 -#, fuzzy -#| msgid "Doctor" +#: templates/emails/appointment_confirmation.html:21 msgid "Doctor:" -msgstr "طبيب" +msgstr "الطبيب:" -#: templates/emails/appointment_confirmation.html:84 -#: templates/emails/observation_sla_reminder.html:92 -#, fuzzy -#| msgid "Location" +#: templates/emails/appointment_confirmation.html:22 +#: templates/emails/observation_assigned.html:22 +#: templates/emails/observation_sla_reminder.html:30 msgid "Location:" -msgstr "الموقع" +msgstr "الموقع:" -#: templates/emails/appointment_confirmation.html:87 -#: templates/emails/appointment_confirmation.html:160 -#: templates/emails/survey_results_notification.html:135 -#, fuzzy -#| msgid "Add Hospital" +#: templates/emails/appointment_confirmation.html:22 msgid "Al Hammadi Hospital" -msgstr "إضافة مستشفى" +msgstr "مستشفى الحمادي" -#: templates/emails/appointment_confirmation.html:99 -#, fuzzy -#| msgid "Important dates" +#: templates/emails/appointment_confirmation.html:24 msgid "Important Reminders:" -msgstr "التواريخ المهمة" +msgstr "تذكيرات مهمة:" -#: templates/emails/appointment_confirmation.html:112 +#: templates/emails/appointment_confirmation.html:25 msgid "Arrive Early:" msgstr "قدمو مبكراً:" -#: templates/emails/appointment_confirmation.html:112 +#: templates/emails/appointment_confirmation.html:25 msgid "Please arrive 15 minutes before your appointment time for registration" msgstr "يرجى الوصول قبل 15 دقيقة من موعدك لتسجيل الحضور" -#: templates/emails/appointment_confirmation.html:125 -#, fuzzy -#| msgid "Documents:" +#: templates/emails/appointment_confirmation.html:26 msgid "Bring Documents:" -msgstr "المستندات:" +msgstr "إحضار المستندات:" -#: templates/emails/appointment_confirmation.html:125 +#: templates/emails/appointment_confirmation.html:26 msgid "Please bring your ID and any relevant medical records" msgstr "يرجى إحضار بطاقتك الشخصية وأي سجلات طبية ذات صلة" -#: templates/emails/appointment_confirmation.html:138 -#, fuzzy -#| msgid "Delete Schedule" +#: templates/emails/appointment_confirmation.html:27 msgid "Need to Reschedule?" -msgstr "حذف الجدول" +msgstr "هل تحتاج إلى إعادة جدولة؟" -#: templates/emails/appointment_confirmation.html:138 +#: templates/emails/appointment_confirmation.html:27 msgid "Contact us at least 24 hours in advance" msgstr "اتصل بنا على الأقل قبل 24 ساعة" -#: templates/emails/appointment_confirmation.html:149 -#, fuzzy -#| msgid "Schedule is active" +#: templates/emails/appointment_confirmation.html:34 msgid "Reschedule or Cancel" -msgstr "الجدول نشط" +msgstr "إعادة الجدولة أو الإلغاء" -#: templates/emails/appointment_confirmation.html:155 -#, fuzzy -#| msgid "Emergency" +#: templates/emails/appointment_confirmation.html:43 msgid "Emergency:" -msgstr "الطوارئ" +msgstr "حالة طارئة:" -#: templates/emails/appointment_confirmation.html:155 +#: templates/emails/appointment_confirmation.html:43 msgid "For emergencies, please call 997 or visit our ER immediately" msgstr "" "للحالات الطارئة، يرجى الاتصال برقم 997 أو زيارة قسم الطوارئ لدينا على الفور" -#: templates/emails/appointment_confirmation.html:159 -#: templates/emails/survey_results_notification.html:134 -#, fuzzy -#| msgid "Patient Experience Management System" -msgid "Patient Experience Management Department" -msgstr "نظام إدارة تجربة المريض" - -#: templates/emails/base_email_template.html:68 -#, fuzzy -#| msgid "All rights reserved." +#: templates/emails/base_email_template.html:69 msgid "Al Hammadi Hospital. All rights reserved." -msgstr "جميع الحقوق محفوظة." +msgstr "مستشفى الحمادي. جميع الحقوق محفوظة." + +#: templates/emails/communication_request_notification.html:4 +msgid "New Communication Request - Al Hammadi Hospital" +msgstr "طلب تواصل جديد - مستشفى الحمادي" + +#: templates/emails/communication_request_notification.html:5 +msgid "A source user has submitted a communication request." +msgstr "قام مستخدم مصدر بتقديم طلب تواصل." + +#: templates/emails/communication_request_notification.html:8 +msgid "New Communication Request" +msgstr "طلب تواصل جديد" + +#: templates/emails/communication_request_notification.html:9 +msgid "A source user has submitted a communication request:" +msgstr "قام مستخدم مصدر بتقديم طلب تواصل:" + +#: templates/emails/communication_request_notification.html:12 +msgid "Reason:" +msgstr "السبب:" + +#: templates/emails/communication_request_notification.html:20 +msgid "Request ID:" +msgstr "معرف الطلب:" + +#: templates/emails/communication_request_notification.html:23 +msgid "View & Respond" +msgstr "عرض والرد" + +#: templates/emails/communication_request_notification.html:27 +msgid "Or log in to the PX360 system and go to PX Sources → Comm. Requests." +msgstr "" +"أو قم بتسجيل الدخول إلى نظام PX360 وانتقل إلى PX Sources → طلبات الاتصال." #: templates/emails/explanation_reminder.html:4 -msgid "Reminder: Explanation Request" -msgstr "تذكير: طلب توضيح" +msgid "Reminder: Department Response Due" +msgstr "تذكير: رد القسم مستحق" -#: templates/emails/explanation_reminder.html:6 -msgid "Reminder: Your explanation for a patient complaint is due soon" -msgstr "تذكير: يُرجى تقديم تفسيرك للشكوى المريض قريباً" +#: templates/emails/explanation_reminder.html:5 +msgid "Reminder: Your department's response to a patient complaint is due soon" +msgstr "تذكير: رد قسمكم على شكوى مريض مستحق قريباً" -#: templates/emails/explanation_reminder.html:8 -msgid "Explanation Reminder" -msgstr "تذكير التوضيح" - -#: templates/emails/explanation_reminder.html:10 +#: templates/emails/explanation_reminder.html:13 msgid "" -"Your response is due soon. Please submit your explanation to avoid " -"escalation." -msgstr "يجب تقديم ردك قريباً. يرجى تقديم تفسيرك لتجنب التصعيد." +"This is a reminder that your department has been requested to respond to the " +"following complaint." +msgstr "هذا تذكير بأنه قد طُلب من قسمكم الرد على الشكوى التالية." -#: templates/emails/explanation_reminder.html:20 -msgid "" -"This is a reminder that you have been requested to provide an explanation " -"for the following complaint." -msgstr "هذا تذكير بأنه يُطلب منك تقديم تفسير للشكوى التالية." - -#: templates/emails/explanation_reminder.html:61 -#: templates/emails/explanation_second_reminder.html:64 +#: templates/emails/explanation_reminder.html:21 +#: templates/emails/explanation_second_reminder.html:25 msgid "Due In:" msgstr "يجب تقديمها قبل:" -#: templates/emails/explanation_reminder.html:79 +#: templates/emails/explanation_reminder.html:24 msgid "" "Please submit your explanation before the deadline to avoid escalation to " "your manager." msgstr "يرجى تقديم توضيحك قبل الموعد النهائي لتجنب التصعيد إلى مديرك." -#: templates/emails/explanation_reminder.html:106 -#: templates/emails/explanation_second_reminder.html:109 -msgid "" -"If you have any questions, please contact the person who requested this " -"explanation." -msgstr "إذا كان لديك أي أسئلة، يرجى التواصل مع الشخص الذي طلب هذا التفسير." +#: templates/emails/explanation_reminder.html:32 +msgid "Submit Your Explanation" +msgstr "تقديم إيضاحك" #: templates/emails/explanation_request.html:4 -msgid "Explanation Request - Al Hammadi Hospital" -msgstr "طلب تفسير - مستشفى الحمادي" +msgid "Department Request - Al Hammadi Hospital" +msgstr "طلب القسم - مستشفى الحمادي" #: templates/emails/explanation_request.html:5 -msgid "" -"You have been assigned to provide an explanation for a patient complaint" -msgstr "لقد تم تكليفك بتقديم تفسير لشكوى مريض" +msgid "Your department has been assigned to respond to a patient complaint" +msgstr "تم تعيين قسمك للرد على شكوى مريض" -#: templates/emails/explanation_request.html:8 -msgid "Explanation Request" -msgstr "طلب إيضاح" - -#: templates/emails/explanation_request.html:14 +#: templates/emails/explanation_request.html:13 msgid "" -"You have been assigned to provide an explanation for the following patient " -"complaint. Please review the details and submit your response using the " -"button below." +"Your department has been assigned to respond to the following patient " +"complaint. Please review the details and submit your department's response " +"using the button below." msgstr "" -"لقد تم تكليفك بتقديم تفسير لشكوى المريض التالية. يرجى مراجعة التفاصيل وإرسال" -" ردك باستخدام الزر أدناه." +"تم تعيين قسمك للرد على شكوى المريض التالية. يرجى مراجعة التفاصيل وتقديم رد " +"قسمك باستخدام الزر أدناه." -#: templates/emails/explanation_request.html:20 +#: templates/emails/explanation_request.html:17 msgid "Note from PX Team:" msgstr "ملاحظة من فريق PX:" -#: templates/emails/explanation_request.html:50 -#, fuzzy -#| msgid "SLA Deadline:" -msgid "Deadline:" -msgstr "الموعد النهائي لاتفاقية SLA:" - -#: templates/emails/explanation_request.html:77 -#, fuzzy -#| msgid "" -#| "If you have any questions or concerns, please contact the PX team directly." +#: templates/emails/explanation_request.html:41 msgid "If you have any questions, please contact the PX team." -msgstr "في حال وجود أي استفسارات أو ملاحظات، يرجى التواصل مباشرة مع فريق PX." +msgstr "إذا كانت لديك أي استفسارات، يرجى التواصل مع فريق تجربة المريض (PX)." -#: templates/emails/explanation_request.html:78 -#, fuzzy -#| msgid "" -#| "This is an automated email. Please do not reply directly to this message." +#: templates/emails/explanation_request.html:42 msgid "This is an automated email. Please do not reply." -msgstr "هذه رسالة بريد إلكتروني آلية. يرجى عدم الرد مباشرة على هذه الرسالة." +msgstr "هذا بريد إلكتروني تلقائي. يرجى عدم الرد." #: templates/emails/explanation_second_reminder.html:4 -msgid "URGENT - Final Reminder: Explanation Request" -msgstr "تنبيه عاجل - تذكير نهائي: طلب تفسير" +msgid "URGENT - Final Reminder: Department Response Due" +msgstr "عاجل - تذكير أخير: رد القسم مستحق" -#: templates/emails/explanation_second_reminder.html:6 +#: templates/emails/explanation_second_reminder.html:5 msgid "" -"FINAL REMINDER: Your explanation is due soon. Submit immediately to avoid " -"escalation." -msgstr "" -"تنبيه نهائي: يجب تقديم تفسيرك قريبًا. قم بالإرسال فورًا لتجنب التصعيد." +"FINAL REMINDER: Your department's response is due soon. Submit immediately " +"to avoid escalation." +msgstr "تذكير أخير: رد قسمك مستحق قريباً. يرجى التقديم فوراً لتجنب التصعيد." -#: templates/emails/explanation_second_reminder.html:8 -msgid "Final Explanation Reminder" -msgstr "تذكير بتقديم التفسير النهائي" - -#: templates/emails/explanation_second_reminder.html:10 +#: templates/emails/explanation_second_reminder.html:13 msgid "" -"Your response is overdue. Please submit your explanation immediately to " -"avoid escalation to your manager." -msgstr "استجابتك متأخرة. يرجى تقديم تفسيرك فورًا لتجنب التصعيد إلى مديرك." +"This is your FINAL reminder that your department has been requested to " +"respond to the following complaint." +msgstr "هذا هو تذكيرك الأخير بأن قسمك قد طُلب منه الرد على الشكوى التالية." -#: templates/emails/explanation_second_reminder.html:23 +#: templates/emails/explanation_second_reminder.html:17 msgid "" "This is your FINAL reminder that you have been requested to provide an " "explanation for the following complaint." msgstr "هذا هو التنبيه النهائي لك بأنك طُلب منك تقديم تفسير للشكوى التالية." -#: templates/emails/explanation_second_reminder.html:79 -msgid "Escalation Warning:" -msgstr "تحذير التصعيد:" - -#: templates/emails/explanation_second_reminder.html:82 +#: templates/emails/explanation_second_reminder.html:28 msgid "" "If you do not submit your explanation before the deadline, this matter will " "be escalated to your manager for action." @@ -16748,37 +22177,109 @@ msgstr "" "إذا لم تقدم تفسيرك قبل الموعد النهائي، سيتم تصعيد هذه المسألة إلى مديرك " "للتعامل معها." -#: templates/emails/explanation_second_reminder.html:105 +#: templates/emails/explanation_second_reminder.html:36 msgid "Submit Your Explanation Now" msgstr "قدّم تفسيرك الآن" +#: templates/emails/inquiry_dept_response_escalation.html:4 +#: templates/emails/observation_dept_response_escalation.html:4 +msgid "ESCALATION - Department Response Overdue" +msgstr "تصعيد - رد القسم متأخر" + +#: templates/emails/inquiry_dept_response_escalation.html:5 +msgid "An inquiry department response is overdue and has been escalated." +msgstr "رد قسم الاستفسار متأخر وقد تم تصعيده." + +#: templates/emails/inquiry_dept_response_escalation.html:13 +msgid "" +"ESCALATION: A department response for an inquiry is overdue and requires " +"your immediate attention." +msgstr "تصعيد: رد القسم على استفسار متأخر ويتطلب انتباهك الفوري." + +#: templates/emails/inquiry_dept_response_escalation.html:19 +#: templates/emails/inquiry_dept_response_reminder.html:19 +#: templates/emails/observation_dept_response_escalation.html:21 +#: templates/emails/observation_dept_response_reminder.html:21 +msgid "Response Deadline:" +msgstr "الموعد النهائي للرد:" + +#: templates/emails/inquiry_dept_response_escalation.html:20 +#: templates/emails/observation_dept_response_escalation.html:22 +msgid "Hours Overdue:" +msgstr "ساعات التأخير:" + +#: templates/emails/inquiry_dept_response_reminder.html:4 +#: templates/emails/observation_dept_response_reminder.html:4 +msgid "Reminder - Department Response Required" +msgstr "تذكير - رد القسم مطلوب" + +#: templates/emails/inquiry_dept_response_reminder.html:5 +msgid "An inquiry is awaiting your department's response." +msgstr "هناك استفسار ينتظر رد قسمك." + +#: templates/emails/inquiry_dept_response_reminder.html:13 +msgid "" +"This is a reminder that an inquiry is awaiting your department's response. " +"Please submit your response before the deadline." +msgstr "" +"هذا تذكير بأن هناك استفسارًا ينتظر رد قسمك. يرجى تقديم ردك قبل الموعد النهائي." + +#: templates/emails/inquiry_dept_response_reminder.html:20 +#: templates/emails/observation_dept_response_reminder.html:22 +#: templates/emails/observation_sla_reminder.html:33 +#: templates/emails/observation_sla_second_reminder.html:24 +#: templates/emails/sla_reminder.html:30 +#: templates/emails/sla_second_reminder.html:30 +msgid "Time Remaining:" +msgstr "الوقت المتبقي:" + +#: templates/emails/inquiry_explanation_request.html:4 +msgid "Inquiry Response Request - Al Hammadi Hospital" +msgstr "طلب رد على استفسار - مستشفى الحمادي" + +#: templates/emails/inquiry_explanation_request.html:5 +msgid "You have been requested to provide a response regarding an inquiry." +msgstr "لقد تم طلب تقديم رد بخصوص استفسار." + +#: templates/emails/inquiry_explanation_request.html:8 +msgid "Inquiry Response Request" +msgstr "طلب الرد على الاستفسار" + +#: templates/emails/inquiry_explanation_request.html:10 +msgid "" +"You have been requested to provide a response regarding the following " +"inquiry:" +msgstr "لقد تم طلب تقديم رد بخصوص الاستفسار التالي:" + +#: templates/emails/inquiry_explanation_request.html:33 +msgid "" +"This link can only be used once. If you cannot click the button above, copy " +"and paste the following URL into your browser:" +msgstr "" +"يمكن استخدام هذا الرابط مرة واحدة فقط. إذا لم تتمكن من النقر على الزر أعلاه، " +"قم بنسخ ولصق عنوان URL التالي في متصفحك:" + #: templates/emails/invitation_expired.html:4 msgid "Your PX360 Invitation Has Expired" msgstr "انتهت صلاحية دعوتك لـ PX360" -#: templates/emails/invitation_expired.html:6 +#: templates/emails/invitation_expired.html:5 msgid "" "Your invitation to join PX360 has expired. Contact your administrator for a " "new invitation." msgstr "" -"لقد انتهت صلاحية دعوتك للانضمام إلى PX360. يرجى التواصل مع المسؤول لطلب دعوة" -" جديدة." +"لقد انتهت صلاحية دعوتك للانضمام إلى PX360. يرجى التواصل مع المسؤول لطلب دعوة " +"جديدة." -#: templates/emails/invitation_expired.html:10 -msgid "" -"Your invitation to join PX360 has expired. Please contact your " -"administrator." -msgstr "انتهت صلاحية دعوتك للانضمام إلى PX360. يرجى التواصل مع المسؤول." - -#: templates/emails/invitation_expired.html:20 +#: templates/emails/invitation_expired.html:13 msgid "Your invitation to join PX360 has expired." msgstr "لقد انتهت صلاحية دعوتك للانضمام إلى PX360." -#: templates/emails/invitation_expired.html:30 +#: templates/emails/invitation_expired.html:16 msgid "What to do next:" msgstr "ما يجب القيام به بعد ذلك:" -#: templates/emails/invitation_expired.html:33 +#: templates/emails/invitation_expired.html:18 msgid "" "Please contact your administrator to request a new invitation. A new " "invitation link will be generated for you to complete your account setup." @@ -16786,553 +22287,384 @@ msgstr "" "يرجى التواصل مع المسؤول لطلب دعوة جديدة. سيتم إنشاء رابط دعوة جديد لإتمام " "إعداد حسابك." -#: templates/emails/invitation_expired.html:45 +#: templates/emails/invitation_expired.html:22 msgid "" -"If you believe this is an error or need further assistance, please reach out" -" to your system administrator or the IT support team." +"If you believe this is an error or need further assistance, please reach out " +"to your system administrator or the IT support team." msgstr "" "إذا كنت تعتقد أن هذا خطأ أو تحتاج إلى مساعدة إضافية، يرجى التواصل مع مسؤول " "النظام لديك أو فريق دعم تقنية المعلومات." +#: templates/emails/new_appreciation_notification.html:4 +msgid "New Appreciation Received - Al Hammadi Hospital" +msgstr "تقدير جديد وارد - مستشفى الحمادي" + +#: templates/emails/new_appreciation_notification.html:5 +msgid "A new appreciation has been submitted" +msgstr "تم تقديم تقدير جديد" + +#: templates/emails/new_appreciation_notification.html:13 +msgid "A new appreciation has been submitted. Here are the details." +msgstr "تم تقديم تقدير جديد. إليك التفاصيل." + +#: templates/emails/new_appreciation_notification.html:23 +msgid "Message (English)" +msgstr "الرسالة (بالإنجليزية)" + +#: templates/emails/new_appreciation_notification.html:28 +msgid "Message (Arabic)" +msgstr "الرسالة (بالعربية)" + +#: templates/emails/new_appreciation_notification.html:37 +msgid "View Appreciation" +msgstr "عرض التقدير" + +#: templates/emails/new_appreciation_notification.html:46 +#: templates/emails/new_complaint_admin_notification.html:47 +#: templates/emails/new_inquiry_notification.html:47 +#: templates/emails/new_suggestion_notification.html:47 +msgid "This is an automated notification from the PX 360 system." +msgstr "هذه إشعار آلي من نظام PX 360." + #: templates/emails/new_complaint_admin_notification.html:4 msgid "New Complaint Notification - Al Hammadi Hospital" msgstr "إشعار شكوى جديد - مستشفى الحمادي" -#: templates/emails/new_complaint_admin_notification.html:21 +#: templates/emails/new_complaint_admin_notification.html:13 msgid "" "A new complaint has been submitted and requires your attention. Please " "review the details below." msgstr "تم تقديم شكوى جديدة وتتطلب انتباهك. يرجى مراجعة التفاصيل أدناه." -#: templates/emails/new_complaint_admin_notification.html:113 +#: templates/emails/new_inquiry_notification.html:4 +msgid "New Inquiry Submitted - Al Hammadi Hospital" +msgstr "تم تقديم استفسار جديد - مستشفى الحمادي" + +#: templates/emails/new_inquiry_notification.html:5 +msgid "A new inquiry requires your attention" +msgstr "يتطلب استفسار جديد اهتمامك" + +#: templates/emails/new_inquiry_notification.html:13 msgid "" -"Please review and activate this complaint at your earliest convenience." -msgstr "يرجى مراجعة وتفعيل هذه الشكوى في أقرب وقت مناسب لك." +"A new inquiry has been submitted and requires your attention. Please review " +"the details below." +msgstr "تم تقديم استفسار جديد ويتطلب اهتمامك. يرجى مراجعة التفاصيل أدناه." -#: templates/emails/new_complaint_admin_notification.html:123 -#: templates/emails/observation_resolved.html:130 -msgid "Notification Details" -msgstr "تفاصيل الإشعار" - -#: templates/emails/new_complaint_admin_notification.html:127 -#: templates/emails/observation_resolved.html:132 -msgid "This is an automated notification from the PX 360 system." -msgstr "هذه إشعار آلي من نظام PX 360." +#: templates/emails/new_inquiry_notification.html:30 +msgid "Please review and respond to this inquiry at your earliest convenience." +msgstr "يرجى مراجعة هذا الاستفسار والرد عليه في أقرب وقت ممكن." #: templates/emails/new_observation_notification.html:4 -#, fuzzy -#| msgid "Explanation Request - Al Hammadi Hospital" msgid "New Observation Submitted - Al Hammadi Hospital" -msgstr "طلب تفسير - مستشفى الحمادي" +msgstr "ملاحظة جديدة مقدمة - مستشفى الحمادي" #: templates/emails/new_observation_notification.html:5 msgid "A new observation requires your review and triage" msgstr "هناك ملاحظة جديدة تتطلب مراجعتك وتصنيفك" -#: templates/emails/new_observation_notification.html:8 -#, fuzzy -#| msgid "Observation Submitted" -msgid "New Observation Submitted" -msgstr "تم إرسال الملاحظة" - -#: templates/emails/new_observation_notification.html:14 -#, fuzzy -#| msgid "" -#| "A new complaint has been submitted and requires your attention. Please " -#| "review the details below." +#: templates/emails/new_observation_notification.html:13 msgid "" -"A new observation has been submitted and requires your review. Please review" -" the details below." -msgstr "تم تقديم شكوى جديدة وتتطلب انتباهك. يرجى مراجعة التفاصيل أدناه." +"A new observation has been submitted and requires your review. Please review " +"the details below." +msgstr "تم تقديم ملاحظة جديدة وتتطلب مراجعتك. يرجى مراجعة التفاصيل أدناه." -#: templates/emails/new_observation_notification.html:22 -#: templates/emails/observation_sla_reminder.html:47 -#: templates/emails/observation_sla_second_reminder.html:51 -#, fuzzy -#| msgid "Tracking Code" +#: templates/emails/new_observation_notification.html:16 +#: templates/emails/observation_assigned.html:16 +#: templates/emails/observation_dept_response_escalation.html:16 +#: templates/emails/observation_dept_response_reminder.html:16 +#: templates/emails/observation_monthly_followup.html:16 +#: templates/emails/observation_resolved.html:16 +#: templates/emails/observation_sla_reminder.html:22 +#: templates/emails/observation_sla_second_reminder.html:16 msgid "Tracking Code:" -msgstr "رمز التتبع" +msgstr "رمز التتبع:" -#: templates/emails/new_observation_notification.html:54 -#, fuzzy -#| msgid "This is an automated notification from the PX 360 system." +#: templates/emails/new_observation_notification.html:27 msgid "" "This is an automated notification. Please log in to PX360 for full details." -msgstr "هذه إشعار آلي من نظام PX 360." +msgstr "" +"هذا إشعار آلي. يرجى تسجيل الدخول إلى PX360 للحصول على التفاصيل الكاملة." + +#: templates/emails/new_suggestion_notification.html:4 +msgid "New Suggestion Submitted - Al Hammadi Hospital" +msgstr "اقتراح جديد مُقدم - مستشفى الحمادي" + +#: templates/emails/new_suggestion_notification.html:5 +msgid "A new suggestion has been submitted for review" +msgstr "تم تقديم اقتراح جديد للمراجعة" + +#: templates/emails/new_suggestion_notification.html:13 +msgid "A new suggestion has been submitted and is available for your review." +msgstr "تم تقديم اقتراح جديد وهو متاح لمراجعتك" + +#: templates/emails/new_suggestion_notification.html:30 +msgid "Please review this suggestion at your earliest convenience." +msgstr "يرجى مراجعة هذا الاقتراح في أقرب وقت ممكن." + +#: templates/emails/new_suggestion_notification.html:38 +msgid "View Suggestion" +msgstr "عرض الاقتراح" #: templates/emails/observation_assigned.html:4 -#, fuzzy -#| msgid "Explanation Request - Al Hammadi Hospital" msgid "Observation Assigned - Al Hammadi Hospital" -msgstr "طلب تفسير - مستشفى الحمادي" +msgstr "ملاحظة مسندة - مستشفى الحمادي" -#: templates/emails/observation_assigned.html:6 -#, fuzzy -#| msgid "Your observation has been submitted successfully." +#: templates/emails/observation_assigned.html:5 msgid "An observation has been assigned to you for action." -msgstr "تم إرسال ملاحظتك بنجاح." +msgstr "تم تعيين ملاحظة لك لاتخاذ الإجراء المناسب." -#: templates/emails/observation_assigned.html:8 -#, fuzzy -#| msgid "Activated (Assigned to You)" -msgid "Observation Assigned to You" -msgstr "تم التفعيل (مُعيّن إليك)" - -#: templates/emails/observation_assigned.html:10 -#, fuzzy -#| msgid "An unassigned complaint requires your immediate attention." -msgid "An observation requires your attention and action" -msgstr "شكو غير مسند يتطلب انتباهك الفوري." - -#: templates/emails/observation_assigned.html:20 -#, fuzzy -#| msgid "" -#| "A new complaint has been submitted and requires your attention. Please " -#| "review the details below." +#: templates/emails/observation_assigned.html:13 msgid "" "An observation has been assigned to you for review and action. Please find " "the details below." -msgstr "تم تقديم شكوى جديدة وتتطلب انتباهك. يرجى مراجعة التفاصيل أدناه." +msgstr "" +"تم تعيين ملاحظة لك للمراجعة واتخاذ الإجراء. يرجى الاطلاع على التفاصيل أدناه." -#: templates/emails/observation_assigned.html:33 -#: templates/emails/observation_monthly_followup.html:33 -#: templates/emails/observation_resolved.html:33 -#: templates/observations/public_track.html:158 -msgid "Tracking Code" -msgstr "رمز التتبع" +#: templates/emails/observation_assigned.html:30 +#: templates/emails/observation_sla_reminder.html:32 +#: templates/emails/observation_sla_second_reminder.html:23 +#: templates/emails/sla_reminder.html:29 +#: templates/emails/sla_second_reminder.html:29 +msgid "Due Date:" +msgstr "تاريخ الاستحقاق:" -#: templates/emails/observation_assigned.html:124 -#: templates/emails/observation_sla_reminder.html:136 -#: templates/emails/sla_reminder.html:146 -#: templates/emails/survey_results_notification.html:113 -msgid "Action Required:" -msgstr "الإجراء المطلوب:" - -#: templates/emails/observation_assigned.html:127 -#, fuzzy -#| msgid "Review notification logs regularly" +#: templates/emails/observation_assigned.html:38 msgid "Review the observation details carefully" -msgstr "مراجعة سجلات الإشعارات بانتظام" +msgstr "راجع تفاصيل الملاحظة بعناية" -#: templates/emails/observation_assigned.html:128 +#: templates/emails/observation_assigned.html:39 msgid "Investigate and assess the situation" msgstr "تحقق من الحالة وقيّمها" -#: templates/emails/observation_assigned.html:129 +#: templates/emails/observation_assigned.html:40 msgid "Update the observation status and add notes as needed" msgstr "تحديث حالة الملاحظة وإضافة ملاحظات حسب الحاجة" -#: templates/emails/observation_assigned.html:150 -#: templates/emails/observation_resolved.html:128 -#: templates/emails/observation_sla_reminder.html:171 -#, fuzzy -#| msgid "Observation" +#: templates/emails/observation_assigned.html:48 +#: templates/emails/observation_dept_response_escalation.html:30 +#: templates/emails/observation_dept_response_reminder.html:30 +#: templates/emails/observation_resolved.html:40 +#: templates/emails/observation_sla_reminder.html:51 msgid "View Observation" -msgstr "ملاحظة" +msgstr "عرض الملاحظة" -#: templates/emails/observation_assigned.html:155 -#, fuzzy -#| msgid "" -#| "This complaint is approaching its SLA deadline. Please review and take " -#| "immediate action." +#: templates/emails/observation_dept_response_escalation.html:5 +msgid "An observation department response is overdue and has been escalated." +msgstr "استجابة قسم الملاحظات متأخرة وتم تصعيدها." + +#: templates/emails/observation_dept_response_escalation.html:13 msgid "" -"This observation has an SLA deadline. Please ensure timely action to avoid " -"breach." +"ESCALATION: A department response for an observation is overdue and requires " +"your immediate attention." +msgstr "تصعيد: استجابة القسم لملاحظة متأخرة وتتطلب انتباهك الفوري." + +#: templates/emails/observation_dept_response_reminder.html:5 +msgid "An observation is awaiting your department's response." +msgstr "ملاحظة تنتظر رد قسمك." + +#: templates/emails/observation_dept_response_reminder.html:13 +msgid "" +"This is a reminder that an observation is awaiting your department's " +"response. Please submit your response before the deadline." msgstr "" -"تقترب هذه الشكوى من موعد نهائي لاتفاقية مستوى الخدمة (SLA). يرجى المراجعة " -"واتخاذ إجراء فوري." - -#: templates/emails/observation_assigned.html:157 -msgid "" -"Please update the observation status in the system once you have reviewed " -"it." -msgstr "يرجى تحديث حالة الملاحظة في النظام بمجرد مراجعتها." +"هذه رسالة تذكيرية بأن هناك ملاحظة تنتظر رد جهاتكم. يرجى تقديم ردكم قبل " +"الموعد النهائي." #: templates/emails/observation_monthly_followup.html:4 -#, fuzzy -#| msgid "Monthly observation patterns" msgid "Monthly Follow-Up Due - Observation" -msgstr "أنماط الملاحظات الشهرية" +msgstr "متابعة شهرية مستحقة - ملاحظة" -#: templates/emails/observation_monthly_followup.html:6 +#: templates/emails/observation_monthly_followup.html:5 msgid "A resolved observation requires monthly follow-up review." msgstr "تتطلب الملاحظة المحلولة مراجعة متابعة شهرية." -#: templates/emails/observation_monthly_followup.html:8 -msgid "Monthly Follow-Up Required" -msgstr "تتطلب متابعة شهرية" - -#: templates/emails/observation_monthly_followup.html:10 -msgid "A resolved observation is due for follow-up review" -msgstr "الملاحظة المحلولة مقرر إجراء مراجعة متابعة لها" - -#: templates/emails/observation_monthly_followup.html:20 +#: templates/emails/observation_monthly_followup.html:13 msgid "" "An observation previously resolved by your team is due for its monthly " "follow-up review. Please verify that the issue has been fully addressed and " "sustained." msgstr "" -"يوجد ملاحظة تم حلها سابقًا من قِبَل فريقك، ويجب إجراء مراجعة متابعة شهرية " -"لها. يرجى التحقق من أن المشكلة قد تمت معالجتها بالكامل وتم الحفاظ على " -"استمرارية حلها." +"يوجد ملاحظة تم حلها سابقًا من قِبَل فريقك، ويجب إجراء مراجعة متابعة شهرية لها. " +"يرجى التحقق من أن المشكلة قد تمت معالجتها بالكامل وتم الحفاظ على استمرارية " +"حلها." -#: templates/emails/observation_monthly_followup.html:75 -#, fuzzy -#| msgid "Resolved:" -msgid "Resolved On" -msgstr "المحلولة:" +#: templates/emails/observation_monthly_followup.html:26 +msgid "Resolved On:" +msgstr "تم الحل في:" -#: templates/emails/observation_monthly_followup.html:91 -#, fuzzy -#| msgid "Resolution Notes" -msgid "Previous Resolution Notes" -msgstr "ملاحظات الحل" +#: templates/emails/observation_monthly_followup.html:30 +msgid "Previous Resolution Notes:" +msgstr "ملاحظات القرار السابقة:" -#: templates/emails/observation_monthly_followup.html:105 -#, fuzzy -#| msgid "Follow-up Actions" -msgid "Follow-Up Actions:" -msgstr "إجراءات المتابعة" - -#: templates/emails/observation_monthly_followup.html:108 +#: templates/emails/observation_monthly_followup.html:34 msgid "Verify that the corrective actions are still effective" msgstr "تأكد من أن الإجراءات التصحيحية لا تزال فعالة" -#: templates/emails/observation_monthly_followup.html:109 +#: templates/emails/observation_monthly_followup.html:35 msgid "Confirm the issue has not recurred" msgstr "أكد من عدم تكرار المشكلة" -#: templates/emails/observation_monthly_followup.html:110 +#: templates/emails/observation_monthly_followup.html:36 msgid "Update the observation with follow-up notes" msgstr "حدّث الملاحظة بملاحظات المتابعة" -#: templates/emails/observation_monthly_followup.html:131 -#, fuzzy -#| msgid "Recent Observations" +#: templates/emails/observation_monthly_followup.html:44 msgid "Review Observation" -msgstr "الملاحظات الحديثة" - -#: templates/emails/observation_monthly_followup.html:135 -#, fuzzy -#| msgid "" -#| "Please complete the onboarding wizard to set up your account and learn about" -#| " the system." -msgid "" -"Please complete the follow-up review and update the observation status in " -"the system." -msgstr "يرجى إكمال معالج الإعداد لإعداد حسابك والتعرّف على النظام." +msgstr "مراجعة الملاحظة" #: templates/emails/observation_resolved.html:4 -#, fuzzy -#| msgid "Explanation Request - Al Hammadi Hospital" msgid "Observation Resolved - Al Hammadi Hospital" -msgstr "طلب تفسير - مستشفى الحمادي" +msgstr "تم حل الملاحظة - مستشفى الحمادي" -#: templates/emails/observation_resolved.html:6 +#: templates/emails/observation_resolved.html:5 msgid "An observation assigned to you has been resolved." msgstr "تم حل ملاحظة مُسندة إليك." -#: templates/emails/observation_resolved.html:8 -msgid "Observation {{ status_display|default:'Resolved' }}" -msgstr "ملاحظة {{ status_display|default:'تم الحل' }}" - -#: templates/emails/observation_resolved.html:10 -#, fuzzy -#| msgid "" -#| "A new complaint has been submitted and requires your attention. Please " -#| "review the details below." -msgid "An observation has been updated and requires your review" -msgstr "تم تقديم شكوى جديدة وتتطلب انتباهك. يرجى مراجعة التفاصيل أدناه." - -#: templates/emails/observation_resolved.html:20 -#, fuzzy, python-format -#| msgid "" -#| "A new complaint has been submitted and requires your attention. Please " -#| "review the details below." +#: templates/emails/observation_resolved.html:13 +#, python-format msgid "" "An observation assigned to you has been %(status)s. Please review the " "resolution details below." -msgstr "تم تقديم شكوى جديدة وتتطلب انتباهك. يرجى مراجعة التفاصيل أدناه." +msgstr "" +"تم تغيير حالة الملاحظة الموكلة إليك إلى %(status)s. يرجى مراجعة تفاصيل الحل " +"أدناه." -#: templates/emails/observation_resolved.html:77 -#, fuzzy -#| msgid "Resolved at:" -msgid "Resolved At" +#: templates/emails/observation_resolved.html:26 +msgid "Resolved At:" msgstr "تم الحل في:" -#: templates/emails/observation_resolved.html:106 -msgid "No resolution notes have been provided for this observation." -msgstr "لم يتم تقديم ملاحظات حل لهذه الملاحظة." +#: templates/emails/observation_resolved.html:30 +msgid "Resolution Notes:" +msgstr "ملاحظات القرار:" #: templates/emails/observation_sla_reminder.html:4 -#, fuzzy -#| msgid "SLA Reminder - Complaint" msgid "SLA Reminder - Observation" -msgstr "تذكير اتفاقية مستوى الخدمة - شكوى" +msgstr "تذكير باتفاقية مستوى الخدمة - ملاحظة" -#: templates/emails/observation_sla_reminder.html:6 -#, fuzzy -#| msgid "" -#| "A complaint is approaching its SLA deadline. Please take action." +#: templates/emails/observation_sla_reminder.html:5 msgid "An observation is approaching its SLA deadline. Please take action." msgstr "" -"يشكو قريبًا من الموعد النهائي لاتفاقية مستوى الخدمة (SLA). يرجى اتخاذ " -"الإجراء." - -#: templates/emails/observation_sla_reminder.html:8 -#: templates/emails/sla_reminder.html:8 -msgid "SLA Deadline Reminder" -msgstr "تذكير موعد اتفاقية مستوى الخدمة" - -#: templates/emails/observation_sla_reminder.html:12 -#, fuzzy -#| msgid "An unassigned complaint requires your immediate attention." -msgid "An unassigned observation requires your attention." -msgstr "شكو غير مسند يتطلب انتباهك الفوري." +"تقترب ملاحظة من الموعد النهائي لاتفاقية مستوى الخدمة. يرجى اتخاذ الإجراء " +"اللازم." #: templates/emails/observation_sla_reminder.html:14 -#, fuzzy -#| msgid "An assigned complaint is approaching its SLA deadline." -msgid "An observation assigned to you is approaching its SLA deadline." -msgstr "شكو مسند يقترب من موعد نهائي لاتفاقية مستوى الخدمة (SLA)." - -#: templates/emails/observation_sla_reminder.html:27 -#, fuzzy -#| msgid "" -#| "This is a reminder about an UNASSIGNED complaint that needs your attention. " -#| "This complaint has not yet been assigned to anyone. Please assign it to an " -#| "appropriate team member as soon as possible." msgid "" "This is a reminder about an unassigned observation that requires attention. " "The observation has not yet been assigned to any team member. Please assign " "it as soon as possible." msgstr "" -"هذا تذكير بشأن شكوى غير مسند يحتاج إلى انتباهك. لم يتم تعيين هذه الشكوى لأي " -"شخص حتى الآن. يرجى تعيينها لأحد أعضاء الفريق المناسب في أقرب وقت ممكن." +"هذا تذكير بخصوص ملاحظة غير مُعيَّنة تتطلب انتباهًا. لم يتم تعيين هذه الملاحظة " +"لأي عضو فريق بعد. يرجى تعيينها في أقرب وقت ممكن." -#: templates/emails/observation_sla_reminder.html:31 -#, fuzzy -#| msgid "" -#| "This is an automated reminder that you have an assigned complaint " -#| "approaching its SLA deadline. Please review and take appropriate action." +#: templates/emails/observation_sla_reminder.html:18 msgid "" "This is an automated reminder that an observation assigned to you is " "approaching its SLA deadline. Please review and take appropriate action." msgstr "" -"هذا تذكير آلي بأن لديك شكوى مُسندة تقترب من موعد SLA الخاص بها. يرجى " -"المراجعة واتخاذ الإجراء المناسب." +"هذا تذكير آلي بأن ملاحظة تم تعيينها لك تقترب من الموعد النهائي لاتفاقية " +"مستوى الخدمة (SLA). يرجى مراجعتها واتخاذ الإجراء المناسب." -#: templates/emails/observation_sla_reminder.html:42 -#: templates/emails/observation_sla_second_reminder.html:46 -#: templates/observations/observation_create.html:150 -#, fuzzy -#| msgid "Observation Detail" -msgid "Observation Details" -msgstr "تفاصيل الملاحظة" - -#: templates/emails/observation_sla_reminder.html:113 -#: templates/emails/observation_sla_second_reminder.html:107 -#: templates/emails/sla_reminder.html:115 -#: templates/emails/sla_second_reminder.html:118 -msgid "Due Date:" -msgstr "تاريخ الاستحقاق:" - -#: templates/emails/observation_sla_reminder.html:121 -#: templates/emails/observation_sla_second_reminder.html:115 -#: templates/emails/sla_reminder.html:123 -#: templates/emails/sla_second_reminder.html:126 -msgid "Time Remaining:" -msgstr "الوقت المتبقي:" - -#: templates/emails/observation_sla_reminder.html:140 -#, fuzzy -#| msgid "" -#| "Assign this complaint to an appropriate staff member immediately" +#: templates/emails/observation_sla_reminder.html:36 msgid "Assign this observation to an appropriate team member" -msgstr "أسند هذه الشكوى إلى الموظف المناسب على الفور" +msgstr "تعيين هذه الملاحظة لعضو فريق مناسب" -#: templates/emails/observation_sla_reminder.html:141 -#, fuzzy -#| msgid "" -#| "Ensure the assigned person is aware of the approaching SLA deadline" +#: templates/emails/observation_sla_reminder.html:37 msgid "Ensure the assigned person is aware of the approaching deadline" -msgstr "تأكد من أن الشخص المُسنَد على علم بالموعد القريب لموعد SLA" +msgstr "تأكد من أن الشخص المكلف على علم بالموعد النهائي القادم." -#: templates/emails/observation_sla_reminder.html:142 -#: templates/emails/sla_reminder.html:152 +#: templates/emails/observation_sla_reminder.html:38 +#: templates/emails/sla_reminder.html:36 msgid "Monitor progress to ensure timely resolution" msgstr "راقب التقدم لضمان الحل في الوقت المناسب" -#: templates/emails/observation_sla_reminder.html:146 -#, fuzzy -#| msgid "" -#| "Please review this complaint and take appropriate action before the SLA " -#| "deadline to avoid breach." +#: templates/emails/observation_sla_reminder.html:41 msgid "" "Please review this observation and take appropriate action before the SLA " "deadline to avoid breach." msgstr "" -"يرجى مراجعة هذه الشكوى واتخاذ الإجراء المناسب قبل موعد SLA لتجنب الإخلال." +"يرجى مراجعة هذه الملاحظة واتخاذ الإجراء المناسب قبل الموعد النهائي لاتفاقية " +"مستوى الخدمة (SLA) لتجنب الخرق." -#: templates/emails/observation_sla_reminder.html:175 -#, fuzzy -#| msgid "" -#| "If you have already addressed this complaint, please update its status in " -#| "the system." -msgid "" -"If you have already addressed this observation, please update its status in " -"the system." -msgstr "إذا كنت قد تناولت هذه الشكوى بالفعل، يرجى تحديث حالتها في النظام." - -#: templates/emails/observation_sla_second_reminder.html:11 -#, fuzzy -#| msgid "URGENT - Second SLA Reminder" +#: templates/emails/observation_sla_second_reminder.html:4 msgid "URGENT - Second SLA Reminder - Observation" -msgstr "عاجل - تذكير SLA الثاني" +msgstr "عاجل - التذكير الثاني لاتفاقية مستوى الخدمة (SLA) - ملاحظة" -#: templates/emails/observation_sla_second_reminder.html:13 -#, fuzzy -#| msgid "" -#| "FINAL REMINDER: A complaint is about to breach its SLA. Immediate action " -#| "required." +#: templates/emails/observation_sla_second_reminder.html:5 msgid "" "FINAL REMINDER: An observation is about to breach its SLA. Immediate action " "required." msgstr "" -"تذكير نهائي: شكوى على وشك انتهاك اتفاقية مستوى الخدمة (SLA). مطلوب إجراء " +"تذكير نهائي: ملاحظة على وشك خرق اتفاقية مستوى الخدمة (SLA). يلزم اتخاذ إجراء " "فوري." -#: templates/emails/observation_sla_second_reminder.html:19 -#, fuzzy -#| msgid "URGENT: Final SLA Reminder" -msgid "URGENT - Final Reminder" -msgstr "عاجل: تذكير SLA النهائي" - -#: templates/emails/observation_sla_second_reminder.html:22 -#, fuzzy -#| msgid "This observation was not accepted" -msgid "This observation is about to breach its SLA deadline" -msgstr "لم يتم قبول هذه الملاحظة" - -#: templates/emails/observation_sla_second_reminder.html:36 -#, fuzzy -#| msgid "" -#| "This is the second and final reminder that you have an assigned complaint " -#| "approaching its SLA deadline. Immediate action is required to avoid " -#| "escalation." +#: templates/emails/observation_sla_second_reminder.html:13 msgid "" "This is the final reminder that an observation is about to breach its SLA " "deadline. Immediate action is required." msgstr "" -"هذا هو التذكير الثاني والأخير بأن لديك شكوى مُسندة تقترب من موعد اتفاقية " -"مستوى الخدمة. مطلوب إجراء فوري لتجنب التصعيد." +"هذا هو التذكير النهائي بأن ملاحظة على وشك تجاوز الموعد النهائي لاتفاقية " +"مستوى الخدمة (SLA). يلزم اتخاذ إجراء فوري." -#: templates/emails/observation_sla_second_reminder.html:102 -#, fuzzy -#| msgid "SLA Deadline" -msgid "SLA Deadline - Critical" -msgstr "الموعد النهائي لاتفاقية مستوى الخدمة (SLA)" - -#: templates/emails/observation_sla_second_reminder.html:130 -#, fuzzy -#| msgid "Action Required:" -msgid "Immediate Action Required:" -msgstr "الإجراء المطلوب:" - -#: templates/emails/observation_sla_second_reminder.html:133 +#: templates/emails/observation_sla_second_reminder.html:26 msgid "Review and address this observation immediately" msgstr "راجع وتعامل مع هذه الملاحظة فوراً" -#: templates/emails/observation_sla_second_reminder.html:134 -#, fuzzy -#| msgid "Available to all hospitals in the system" +#: templates/emails/observation_sla_second_reminder.html:27 msgid "Update the observation status in the system" -msgstr "متاح لجميع المستشفيات في النظام" +msgstr "تحديث حالة الملاحظة في النظام" -#: templates/emails/observation_sla_second_reminder.html:135 +#: templates/emails/observation_sla_second_reminder.html:28 msgid "Add resolution notes to document actions taken" msgstr "أضف ملاحظات حل لتوثيق الإجراءات المتخذة" -#: templates/emails/observation_sla_second_reminder.html:136 -#, fuzzy -#| msgid "" -#| "Failure to assign and address this complaint may result in automatic " -#| "escalation to higher management." +#: templates/emails/observation_sla_second_reminder.html:29 msgid "Failure to act may result in automatic escalation" -msgstr "" -"فشل في تعيين ومعالجة هذه الشكوى قد يؤدي إلى تصعيدها تلقائيًا إلى الإدارة " -"العليا." +msgstr "قد يؤدي عدم اتخاذ الإجراء إلى التصعيد التلقائي" -#: templates/emails/observation_sla_second_reminder.html:158 -#, fuzzy -#| msgid "Observation" +#: templates/emails/observation_sla_second_reminder.html:37 msgid "View Observation Now" -msgstr "ملاحظة" - -#: templates/emails/observation_sla_second_reminder.html:160 -#: templates/projects/project_confirm_delete.html:39 -#: templates/projects/template_confirm_delete.html:39 -#: templates/px_sources/source_confirm_delete.html:50 -#: templates/standards/attachment_confirm_delete.html:63 -#: templates/standards/category_confirm_delete.html:85 -#: templates/standards/source_confirm_delete.html:85 -msgid "Warning" -msgstr "تحذير" - -#: templates/emails/observation_sla_second_reminder.html:162 -msgid "" -"This observation will be flagged as overdue if not addressed before the SLA " -"deadline. This may trigger automatic escalation to management." -msgstr "" -"سيتم وضع علامة على هذه الملاحظة كمتأخرة إذا لم يتم التعامل معها قبل موعد " -"نهائي للاتفاقية服务水平. قد يؤدي ذلك إلى تصعيد تلقائي إلى الإدارة." +msgstr "عرض الملاحظة الآن" #: templates/emails/public_inquiry_notification.html:4 -#: templates/emails/public_inquiry_notification.html:8 msgid "New Public Inquiry" msgstr "استفسار عام جديد" -#: templates/emails/public_inquiry_notification.html:6 +#: templates/emails/public_inquiry_notification.html:5 msgid "A new public inquiry has been submitted via the website." msgstr "تم تقديم استفسار عام جديد عبر الموقع الإلكتروني." -#: templates/emails/public_inquiry_notification.html:10 -msgid "A new inquiry has been submitted through the public contact form." -msgstr "تم تقديم استفسار جديد عبر نموذج الاتصال العام." - -#: templates/emails/public_inquiry_notification.html:17 +#: templates/emails/public_inquiry_notification.html:9 msgid "A new public inquiry has been received. Details are below." msgstr "تم استفسار جديد من الجمهور. التفاصيل أدناه." -#: templates/emails/public_inquiry_notification.html:56 -msgid "Message:" -msgstr "الرسالة:" - -#: templates/emails/public_inquiry_notification.html:73 +#: templates/emails/public_inquiry_notification.html:19 msgid "" "Please review this inquiry and respond to the sender at your earliest " "convenience." msgstr "يرجى مراجعة هذا الاستفسار والرد على المرسل في أقرب وقت ممكن." +#: templates/emails/px_digest_weekly.html:30 +msgid "Key Metrics" +msgstr "المقاييس الرئيسية" + +#: templates/emails/px_digest_weekly.html:45 +msgid "Early Warning Alerts" +msgstr "تنبيهات الإنذار المبكر" + +#: templates/emails/px_digest_weekly.html:81 +msgid "View Full Dashboard" +msgstr "عرض لوحة التحكم كاملة" + #: templates/emails/sla_reminder.html:4 msgid "SLA Reminder - Complaint" msgstr "تذكير اتفاقية مستوى الخدمة - شكوى" -#: templates/emails/sla_reminder.html:6 +#: templates/emails/sla_reminder.html:5 msgid "A complaint is approaching its SLA deadline. Please take action." msgstr "" -"يشكو قريبًا من الموعد النهائي لاتفاقية مستوى الخدمة (SLA). يرجى اتخاذ " -"الإجراء." - -#: templates/emails/sla_reminder.html:12 -msgid "An unassigned complaint requires your immediate attention." -msgstr "شكو غير مسند يتطلب انتباهك الفوري." +"يشكو قريبًا من الموعد النهائي لاتفاقية مستوى الخدمة (SLA). يرجى اتخاذ الإجراء." #: templates/emails/sla_reminder.html:14 -msgid "An assigned complaint is approaching its SLA deadline." -msgstr "شكو مسند يقترب من موعد نهائي لاتفاقية مستوى الخدمة (SLA)." - -#: templates/emails/sla_reminder.html:27 msgid "" "This is a reminder about an UNASSIGNED complaint that needs your attention. " "This complaint has not yet been assigned to anyone. Please assign it to an " @@ -17341,40 +22673,34 @@ msgstr "" "هذا تذكير بشأن شكوى غير مسند يحتاج إلى انتباهك. لم يتم تعيين هذه الشكوى لأي " "شخص حتى الآن. يرجى تعيينها لأحد أعضاء الفريق المناسب في أقرب وقت ممكن." -#: templates/emails/sla_reminder.html:31 +#: templates/emails/sla_reminder.html:18 msgid "" "This is an automated reminder that you have an assigned complaint " "approaching its SLA deadline. Please review and take appropriate action." msgstr "" -"هذا تذكير آلي بأن لديك شكوى مُسندة تقترب من موعد SLA الخاص بها. يرجى " -"المراجعة واتخاذ الإجراء المناسب." +"هذا تذكير آلي بأن لديك شكوى مُسندة تقترب من موعد SLA الخاص بها. يرجى المراجعة " +"واتخاذ الإجراء المناسب." -#: templates/emails/sla_reminder.html:150 +#: templates/emails/sla_reminder.html:34 msgid "Assign this complaint to an appropriate staff member immediately" msgstr "أسند هذه الشكوى إلى الموظف المناسب على الفور" -#: templates/emails/sla_reminder.html:151 +#: templates/emails/sla_reminder.html:35 msgid "Ensure the assigned person is aware of the approaching SLA deadline" msgstr "تأكد من أن الشخص المُسنَد على علم بالموعد القريب لموعد SLA" -#: templates/emails/sla_reminder.html:156 +#: templates/emails/sla_reminder.html:39 msgid "" "Please review this complaint and take appropriate action before the SLA " "deadline to avoid breach." msgstr "" "يرجى مراجعة هذه الشكوى واتخاذ الإجراء المناسب قبل موعد SLA لتجنب الإخلال." -#: templates/emails/sla_reminder.html:189 -msgid "" -"If you have already addressed this complaint, please update its status in " -"the system." -msgstr "إذا كنت قد تناولت هذه الشكوى بالفعل، يرجى تحديث حالتها في النظام." - #: templates/emails/sla_second_reminder.html:4 msgid "URGENT - Second SLA Reminder" msgstr "عاجل - تذكير SLA الثاني" -#: templates/emails/sla_second_reminder.html:6 +#: templates/emails/sla_second_reminder.html:5 msgid "" "FINAL REMINDER: A complaint is about to breach its SLA. Immediate action " "required." @@ -17382,35 +22708,18 @@ msgstr "" "تذكير نهائي: شكوى على وشك انتهاك اتفاقية مستوى الخدمة (SLA). مطلوب إجراء " "فوري." -#: templates/emails/sla_second_reminder.html:8 -msgid "URGENT: Final SLA Reminder" -msgstr "عاجل: تذكير SLA النهائي" - -#: templates/emails/sla_second_reminder.html:12 -msgid "" -"An unassigned complaint is about to breach its SLA. This is the FINAL " -"reminder." -msgstr "" -"شكوى غير مُسندة على وشك انتهاك اتفاقية مستوى الخدمة (SLA). هذا هو التذكير " -"النهائي." - #: templates/emails/sla_second_reminder.html:14 -msgid "This is the second and final SLA reminder. Immediate action required." -msgstr "" -"هذا هو التذكير الثاني والأخير لاتفاقية مستوى الخدمة. مطلوب إجراء فوري." - -#: templates/emails/sla_second_reminder.html:30 msgid "" "CRITICAL: This is an URGENT reminder about an UNASSIGNED complaint that " -"requires IMMEDIATE attention. This complaint has NOT been assigned to anyone" -" and is about to breach its SLA deadline. This is the FINAL reminder before " +"requires IMMEDIATE attention. This complaint has NOT been assigned to anyone " +"and is about to breach its SLA deadline. This is the FINAL reminder before " "automatic escalation." msgstr "" -"تنبيه بالغ الأهمية: هذا تذكير عاجل بشأن شكوى غير مُسندة تتطلب انتباهًا " -"فوريًا. لم يتم تخصيص هذه الشكوى لأي شخص وهي على وشك انتهاك موعد اتفاقية " -"مستوى الخدمة. هذا هو التذكير النهائي قبل التصعيد التلقائي." +"تنبيه بالغ الأهمية: هذا تذكير عاجل بشأن شكوى غير مُسندة تتطلب انتباهًا فوريًا. " +"لم يتم تخصيص هذه الشكوى لأي شخص وهي على وشك انتهاك موعد اتفاقية مستوى " +"الخدمة. هذا هو التذكير النهائي قبل التصعيد التلقائي." -#: templates/emails/sla_second_reminder.html:34 +#: templates/emails/sla_second_reminder.html:18 msgid "" "This is the second and final reminder that you have an assigned complaint " "approaching its SLA deadline. Immediate action is required to avoid " @@ -17419,23 +22728,19 @@ msgstr "" "هذا هو التذكير الثاني والأخير بأن لديك شكوى مُسندة تقترب من موعد اتفاقية " "مستوى الخدمة. مطلوب إجراء فوري لتجنب التصعيد." -#: templates/emails/sla_second_reminder.html:149 -msgid "URGENT Action Required:" -msgstr "مطلوب إجراء عاجل:" - -#: templates/emails/sla_second_reminder.html:153 +#: templates/emails/sla_second_reminder.html:34 msgid "ASSIGN this complaint to an appropriate staff member IMMEDIATELY" msgstr "خصص هذه الشكوى لموظف مناسب على الفور" -#: templates/emails/sla_second_reminder.html:154 +#: templates/emails/sla_second_reminder.html:35 msgid "ENSURE the assigned person is aware of the critical deadline" msgstr "تأكد أن الشخص المُسنَد على علم بالموعد الحرج" -#: templates/emails/sla_second_reminder.html:155 +#: templates/emails/sla_second_reminder.html:36 msgid "MONITOR progress continuously until resolved" msgstr "راقب التقدم باستمرار حتى يتم الحل" -#: templates/emails/sla_second_reminder.html:158 +#: templates/emails/sla_second_reminder.html:37 msgid "" "Failure to assign and address this complaint may result in automatic " "escalation to higher management." @@ -17443,181 +22748,123 @@ msgstr "" "فشل في تعيين ومعالجة هذه الشكوى قد يؤدي إلى تصعيدها تلقائيًا إلى الإدارة " "العليا." -#: templates/emails/sla_second_reminder.html:162 -msgid "" -"This complaint is approaching its SLA deadline. Please review and take " -"immediate action." -msgstr "" -"تقترب هذه الشكوى من موعد نهائي لاتفاقية مستوى الخدمة (SLA). يرجى المراجعة " -"واتخاذ إجراء فوري." - -#: templates/emails/sla_second_reminder.html:165 +#: templates/emails/sla_second_reminder.html:39 msgid "Update the complaint status to reflect current progress" msgstr "قم بتحديث حالة الشكوى لتعكس التقدم الحالي" -#: templates/emails/sla_second_reminder.html:166 +#: templates/emails/sla_second_reminder.html:40 msgid "Add a timeline update explaining the delay" msgstr "أضف تحديثًا للجدول الزمني يشرح التأخير" -#: templates/emails/sla_second_reminder.html:167 +#: templates/emails/sla_second_reminder.html:41 msgid "Contact your department manager if additional resources are needed" msgstr "اتصل بمدير قسمك إذا كانت هناك حاجة إلى موارد إضافية" -#: templates/emails/sla_second_reminder.html:195 +#: templates/emails/sla_second_reminder.html:49 msgid "View Complaint Now" msgstr "عرض الشكوى الآن" -#: templates/emails/sla_second_reminder.html:197 -msgid "Critical Notice" -msgstr "إشعار بالغ الأهمية" - -#: templates/emails/sla_second_reminder.html:199 -msgid "" -"This is the final reminder before automatic escalation. Failure to act may " -"result in SLA breach consequences." -msgstr "" -"هذا التذكير النهائي قبل التصعيد التلقائي. قد يؤدي الفشل في التصرف إلى عواقب " -"انتهاك اتفاقية مستوى الخدمة (SLA)." - #: templates/emails/survey_invitation.html:4 -#, fuzzy -#| msgid "New Complaint Notification - Al Hammadi Hospital" msgid "Patient Survey Invitation - Al Hammadi Hospital" -msgstr "إشعار شكوى جديد - مستشفى الحمادي" +msgstr "دعوة لاستبيان المريض - مستشفى الحمادي" #: templates/emails/survey_invitation.html:5 -#, fuzzy -#| msgid "Thank you for sharing your experience with us" msgid "We value your feedback! Please share your experience with us." -msgstr "شكرًا لمشاركتك تجربتك معنا" +msgstr "نحن نقدر ملاحظاتك! يرجى مشاركة تجربتك معنا." -#: templates/emails/survey_invitation.html:14 -#, fuzzy -#| msgid "No recent activity" +#: templates/emails/survey_invitation.html:13 msgid "your recent visit" -msgstr "لا يوجد نشاط حديث" +msgstr "زيارتك الأخيرة" -#: templates/emails/survey_invitation.html:14 +#: templates/emails/survey_invitation.html:13 #, python-format msgid "" "Thank you for choosing Al Hammadi Hospital for your healthcare needs. We " "hope your recent visit on %(visit)s met your expectations." msgstr "" -"نشكركم على اختياركم مستشفى الحمادي لتلبية احتياجاتكم الصحية. نأمل أن زيارتكم" -" الأخيرة في %(visit)s قد تحققت توقعاتكم." +"نشكركم على اختياركم مستشفى الحمادي لتلبية احتياجاتكم الصحية. نأمل أن زيارتكم " +"الأخيرة في %(visit)s قد تحققت توقعاتكم." #: templates/emails/survey_invitation.html:17 msgid "" "We would greatly appreciate it if you could take a few minutes to complete " "our satisfaction survey. Your feedback helps us improve our services." msgstr "" +"سنقدر كثيرًا إذا تفضلت بتخصيص بضع دقائق لإكمال استبيان رضانا. تساعدنا " +"ملاحظاتك في تحسين خدماتنا." -#: templates/emails/survey_invitation.html:23 -msgid "Takes only 3-5 minutes" -msgstr "تستغرق 3-5 دقائق فقط" +#: templates/emails/survey_invitation.html:21 +msgid "The survey takes only 3-5 minutes and your responses are confidential." +msgstr "يستغرق الاستبيان من 3 إلى 5 دقائق فقط، وإجاباتك سرية." -#: templates/emails/survey_invitation.html:24 -#, fuzzy -#| msgid "Your responses are completely confidential" -msgid "Your responses are confidential" -msgstr "إجاباتك سرية تماماً" - -#: templates/emails/survey_invitation.html:34 -#, fuzzy -#| msgid "Create Survey" +#: templates/emails/survey_invitation.html:29 msgid "Take Survey" -msgstr "إنشاء استبيان" +msgstr "إجراء الاستبيان" -#: templates/emails/survey_invitation.html:41 +#: templates/emails/survey_invitation.html:36 msgid "Thank you for your time and feedback." msgstr "نشكركم على وقتكم وردودكم." #: templates/emails/survey_results_notification.html:4 -#, fuzzy -#| msgid "Your PX360 Account Credentials - Al Hammadi Hospital" msgid "Survey Results Available - Al Hammadi Hospital" -msgstr "بيانات دخول حساب PX360 الخاص بك - مستشفى الحمادي" +msgstr "نتائج الاستبيان متاحة - مستشفى الحمادي" -#: templates/emails/survey_results_notification.html:6 -#, fuzzy -#| msgid "No department data available for this period" +#: templates/emails/survey_results_notification.html:5 msgid "Your department's survey results are now available for review." -msgstr "لا توجد بيانات للقسم لهذه الفترة" +msgstr "نتائج استبيان قسمك متاحة الآن للمراجعة." -#: templates/emails/survey_results_notification.html:8 -#, fuzzy -#| msgid "Survey Responses" -msgid "Survey Results Ready" -msgstr "إجابات الاستبيان" - -#: templates/emails/survey_results_notification.html:10 -msgid "View the latest patient experience survey results for your department" -msgstr "عرض نتائج استبيان تجربة المرضى האחרונים لقسمك" - -#: templates/emails/survey_results_notification.html:17 -#, fuzzy -#| msgid "Team Members" +#: templates/emails/survey_results_notification.html:9 msgid "Team Member" -msgstr "أعضاء الفريق" +msgstr "عضو الفريق" -#: templates/emails/survey_results_notification.html:20 -#, fuzzy -#| msgid "No Department" +#: templates/emails/survey_results_notification.html:13 msgid "your department" -msgstr "لا يوجد قسم" +msgstr "قسمك" -#: templates/emails/survey_results_notification.html:20 +#: templates/emails/survey_results_notification.html:13 #, python-format msgid "" "The patient experience survey results for %(dept)s are now available for " "review." msgstr "نتائج استبيان تجربة المرضى لقسم %(dept)s أصبحت متاحة للمراجعة." -#: templates/emails/survey_results_notification.html:33 -#, fuzzy -#| msgid "Average Score" -msgid "Overall Score" -msgstr "متوسط التقييم" +#: templates/emails/survey_results_notification.html:16 +msgid "Overall Score:" +msgstr "النتيجة الإجمالية:" -#: templates/emails/survey_results_notification.html:42 -#, fuzzy -#| msgid "Response" -msgid "Responses" -msgstr "الرد" +#: templates/emails/survey_results_notification.html:17 +msgid "Responses:" +msgstr "الردود:" -#: templates/emails/survey_results_notification.html:61 -msgid "Key Highlights:" -msgstr "النقاط الرئيسية:" +#: templates/emails/survey_results_notification.html:18 +msgid "Response Rate:" +msgstr "معدل الاستجابة:" -#: templates/emails/survey_results_notification.html:74 +#: templates/emails/survey_results_notification.html:20 msgid "Strengths:" msgstr "النقاط القوية:" -#: templates/emails/survey_results_notification.html:74 +#: templates/emails/survey_results_notification.html:20 msgid "Patient care and communication received high ratings" msgstr "حصلت رعاية المرضى والتواصل على تقييمات عالية" -#: templates/emails/survey_results_notification.html:87 -#, fuzzy -#| msgid "Needs improvement" +#: templates/emails/survey_results_notification.html:21 msgid "Areas for Improvement:" -msgstr "يحتاج إلى تحسين" +msgstr "مجالات التحسين:" -#: templates/emails/survey_results_notification.html:87 +#: templates/emails/survey_results_notification.html:21 msgid "Wait times and facility comfort can be enhanced" msgstr "يمكن تحسين أوقات الانتظار وراحة المرفق" -#: templates/emails/survey_results_notification.html:100 -#, fuzzy -#| msgid "Active Period" +#: templates/emails/survey_results_notification.html:22 msgid "Survey Period:" -msgstr "فترة النشاط" +msgstr "فترة الاستبيان:" -#: templates/emails/survey_results_notification.html:116 +#: templates/emails/survey_results_notification.html:25 msgid "end of month" msgstr "نهاية الشهر" -#: templates/emails/survey_results_notification.html:116 +#: templates/emails/survey_results_notification.html:25 #, python-format msgid "" "Please review the detailed results and prepare an action plan to address " @@ -17626,73 +22873,52 @@ msgstr "" "يرجى مراجعة النتائج التفصيلية وإعداد خطة عمل لمعالجة مجالات التحسين المحددة " "بحلول %(deadline)s." -#: templates/emails/survey_results_notification.html:124 -#, fuzzy -#| msgid "View All Reports" +#: templates/emails/survey_results_notification.html:33 msgid "View Full Report" -msgstr "عرض جميع التقارير" +msgstr "عرض التقرير الكامل" -#: templates/emails/survey_results_notification.html:126 -#: templates/reports/report_detail.html:205 -#, fuzzy -#| msgid "Request Details" -msgid "Report Details" -msgstr "تفاصيل الطلب" - -#: templates/emails/survey_results_notification.html:128 -#, fuzzy -#| msgid "Generated:" +#: templates/emails/survey_results_notification.html:40 msgid "Report Generated:" -msgstr "تم إنشاء:" +msgstr "تم إنشاء التقرير:" -#: templates/emails/survey_results_notification.html:128 +#: templates/emails/survey_results_notification.html:40 #: templates/social/social_platform.html:163 msgid "Today" msgstr "اليوم" -#: templates/emails/survey_results_notification.html:129 -#, fuzzy -#| msgid "Survey Type" +#: templates/emails/survey_results_notification.html:41 msgid "Survey Type:" -msgstr "نوع الاستبيان" +msgstr "نوع الاستبيان:" -#: templates/emails/survey_results_notification.html:129 -#, fuzzy -#| msgid "Patient Experience" +#: templates/emails/survey_results_notification.html:41 msgid "Patient Experience Survey" -msgstr "تجربة المريض" +msgstr "استبيان تجربة المريض" -#: templates/emails/survey_results_notification.html:130 -#, fuzzy -#| msgid "Access denied." +#: templates/emails/survey_results_notification.html:42 msgid "Access Level:" -msgstr "تم رفض الوصول." +msgstr "مستوى الوصول:" #: templates/feedback/action_plan_list.html:4 msgid "Comment Action Plans" msgstr "خطط إجراءات التعليق" -#: templates/feedback/action_plan_list.html:10 +#: templates/feedback/action_plan_list.html:63 msgid "Steps 3-5 — Comment Action Plans" msgstr "الخطوات 3-5 — خطط إجراء التعليقات" -#: templates/feedback/action_plan_list.html:11 +#: templates/feedback/action_plan_list.html:64 msgid "Track action plans derived from patient comments" msgstr "تتبع خطط الإجراءات المستندة إلى تعليقات المرضى" -#: templates/feedback/action_plan_list.html:14 +#: templates/feedback/action_plan_list.html:67 msgid "Export Action Plans" msgstr "تصدير خطط الإجراءات" -#: templates/feedback/action_plan_list.html:60 -msgid "Frequency" -msgstr "التكرار" - -#: templates/feedback/action_plan_list.html:62 +#: templates/feedback/action_plan_list.html:123 msgid "Timeframe" msgstr "الإطار الزمني" -#: templates/feedback/action_plan_list.html:91 +#: templates/feedback/action_plan_list.html:156 msgid "No action plans found." msgstr "لم يتم العثور على خطط عمل." @@ -17700,31 +22926,37 @@ msgstr "لم يتم العثور على خطط عمل." msgid "Comment Imports" msgstr "استيراد التعليقات" -#: templates/feedback/comment_import_list.html:8 +#: templates/feedback/comment_import_list.html:51 msgid "Step 0 — Comment Imports" msgstr "الخطوة 0 — استيراد التعليقات" -#: templates/feedback/comment_import_list.html:9 +#: templates/feedback/comment_import_list.html:52 msgid "Monthly patient comment data imports from IT department" msgstr "استيراد بيانات تعليقات المرضى الشهرية من قسم تكنولوجيا المعلومات" -#: templates/feedback/comment_import_list.html:20 +#: templates/feedback/comment_import_list.html:63 +#: templates/physicians/doctor_rating_fetch.html:42 +#: templates/physicians/doctor_rating_import.html:42 +#: templates/physicians/doctor_rating_job_list.html:70 +#: templates/physicians/doctor_rating_job_list.html:72 +#: templates/physicians/individual_ratings_list.html:87 +msgid "Import History" +msgstr "سجل الاستيراد" + +#: templates/feedback/comment_import_list.html:74 +#: templates/organizations/staff_import.html:231 msgid "Total Rows" msgstr "إجمالي الصفوف" -#: templates/feedback/comment_import_list.html:21 +#: templates/feedback/comment_import_list.html:75 msgid "Imported" msgstr "مستورد" -#: templates/feedback/comment_import_list.html:22 -msgid "Errors" -msgstr "أخطاء" - -#: templates/feedback/comment_import_list.html:23 +#: templates/feedback/comment_import_list.html:77 msgid "Imported By" msgstr "مستورد بواسطة" -#: templates/feedback/comment_import_list.html:51 +#: templates/feedback/comment_import_list.html:108 msgid "No imports yet." msgstr "لا توجد عمليات استيراد بعد." @@ -17732,190 +22964,175 @@ msgstr "لا توجد عمليات استيراد بعد." msgid "Patient Comments" msgstr "تعليقات المريض" -#: templates/feedback/comment_list.html:10 +#: templates/feedback/comment_list.html:51 msgid "Step 1 — Classified Patient Comments" msgstr "الخطوة 1 — تعليقات المرضى المصنفة" -#: templates/feedback/comment_list.html:11 +#: templates/feedback/comment_list.html:52 msgid "Classified comments with categories and sentiment" msgstr "التعليقات المصنفة مع الفئات والمشاعر" -#: templates/feedback/comment_list.html:16 +#: templates/feedback/comment_list.html:57 msgid "Export Classification" msgstr "تصدير التصنيف" -#: templates/feedback/comment_list.html:20 +#: templates/feedback/comment_list.html:61 msgid "Export by Dept" msgstr "تصدير حسب القسم" -#: templates/feedback/comment_list.html:38 -msgid "Sub-Category" -msgstr "الفئة الفرعية" +#: templates/feedback/comment_list.html:143 +#: templates/social/comments_list.html:4 templates/social/comments_list.html:50 +#: templates/social/dashboard.html:198 +#: templates/social/social_analytics.html:246 +#: templates/surveys/comment_list.html:91 +msgid "Comments" +msgstr "التعليقات" + +#: templates/feedback/comment_list.html:190 +msgid "No comments found." +msgstr "لم يتم العثور على أي تعليقات." + +#: templates/feedback/feedback_delete_confirm.html:5 +#: templates/feedback/feedback_delete_confirm.html:59 +msgid "Delete Suggestion" +msgstr "حذف الاقتراح" #: templates/feedback/feedback_delete_confirm.html:62 -msgid "Detail" -msgstr "التفاصيل" +msgid "Back to Detail" +msgstr "العودة إلى التفاصيل" + +#: templates/feedback/feedback_delete_confirm.html:73 +#: templates/px_sources/source_confirm_delete.html:41 +#: templates/px_sources/source_user_confirm_delete.html:41 +msgid "Confirm Deletion" +msgstr "تأكيد الحذف" #: templates/feedback/feedback_delete_confirm.html:80 -msgid "Are you sure you want to delete this feedback?" -msgstr "هل أنت متأكد أنك تريد حذف هذه الملاحظة؟" +msgid "Are you sure you want to delete this suggestion?" +msgstr "هل أنت متأكد من رغبتك في حذف هذا الاقتراح؟" -#: templates/feedback/feedback_delete_confirm.html:89 -msgid "Feedback Information" -msgstr "معلومات الملاحظة" +#: templates/feedback/feedback_delete_confirm.html:82 +msgid "" +"This action will soft delete the suggestion. It will be marked as deleted " +"but remain in the database for audit purposes." +msgstr "" +"سيؤدي هذا الإجراء إلى حذف الاقتراح بشكل ناعم. سيتم وضع علامة عليه كمحذوف " +"ولكنه سيبقى في قاعدة البيانات لأغراض التدقيق." -#: templates/feedback/feedback_detail.html:464 -msgid "Add a note (optional)..." -msgstr "أضف ملاحظة (اختياري)..." +#: templates/feedback/feedback_delete_confirm.html:150 +#: templates/journeys/template_confirm_delete.html:20 +#: templates/px_sources/source_user_confirm_delete.html:49 +msgid "Warning:" +msgstr "تحذير:" -#: templates/feedback/feedback_detail.html:494 -msgid "Add Response" -msgstr "إضافة رد" +#: templates/feedback/feedback_delete_confirm.html:150 +msgid "" +"All associated responses and timeline entries will be preserved for audit " +"purposes." +msgstr "" +"سيتم الاحتفاظ بجميع الردود وإدخالات الجدول الزمني المرتبطة لأغراض التدقيق." -#: templates/feedback/feedback_detail.html:501 -msgid "Enter your response..." -msgstr "أدخل ردك..." +#: templates/feedback/feedback_delete_confirm.html:160 +msgid "Yes, Delete Suggestion" +msgstr "نعم، حذف الاقتراح" -#: templates/feedback/feedback_detail.html:617 -#, fuzzy -#| msgid "No tasks yet" -msgid "No RCAs yet" -msgstr "لا توجد مهام بعد" +#: templates/feedback/feedback_delete_confirm.html:167 +msgid "Deleted suggestions can be restored by system administrators if needed." +msgstr "يمكن لمسؤولي النظام استعادة الاقتراحات المحذوفة إذا لزم الأمر." -#: templates/feedback/feedback_detail.html:625 -#, fuzzy -#| msgid "Settings" -msgid "Flags & Settings" -msgstr "الإعدادات" +#: templates/feedback/feedback_detail.html:4 +#: templates/feedback/feedback_detail.html:49 +msgid "Suggestion Detail" +msgstr "تفاصيل الاقتراح" -#: templates/feedback/feedback_detail.html:648 -#, fuzzy -#| msgid "Follow-up Actions" -msgid "Follow-up Required" -msgstr "إجراءات المتابعة" +#: templates/feedback/feedback_detail.html:45 +#: templates/feedback/feedback_list.html:240 +msgid "FEATURED" +msgstr "مميز" -#: templates/feedback/feedback_form.html:136 -msgid "Create New Feedback" -msgstr "إنشاء ملاحظات جديدة" +#: templates/feedback/feedback_detail.html:78 +#: templates/feedback/feedback_form.html:69 +msgid "Suggestion Details" +msgstr "تفاصيل الاقتراحات" -#: templates/feedback/feedback_form.html:136 -msgid "Edit Feedback" -msgstr "تعديل الملاحظات" +#: templates/feedback/feedback_detail.html:112 +#: templates/observations/public_success.html:127 +#: templates/observations/public_track.html:193 +#: templates/standards/standard_detail.html:158 +#: templates/standards/standard_detail.html:168 +#: templates/standards/standard_detail.html:178 +msgid "Not specified" +msgstr "غير محدد" -#: templates/feedback/feedback_form.html:162 -msgid "Patient/Contact Information" -msgstr "معلومات المريض/المرتبط" +#: templates/feedback/feedback_detail.html:199 +msgid "Anonymous Suggestion" +msgstr "اقتراح مجهول" -#: templates/feedback/feedback_form.html:170 -msgid "Submit as Anonymous Feedback" -msgstr "إرسال كملاحظات مجهولة" +#: templates/feedback/feedback_detail.html:272 +#: templates/observations/convert_to_action.html:98 +#: templates/social/social_comment_detail.html:271 +msgid "Create PX Action" +msgstr "إنشاء إجراء PX" -#: templates/feedback/feedback_form.html:223 -msgid "Feedback Details" -msgstr "تفاصيل الملاحظات" +#: templates/feedback/feedback_detail.html:305 +#: templates/partials/notes_panel.html:15 +msgid "Add a note..." +msgstr "أضف ملاحظة..." -#: templates/feedback/feedback_form.html:248 -msgid "Please provide detailed feedback" -msgstr "يرجى تقديم ملاحظات مفصلة" +#: templates/feedback/feedback_detail.html:334 +msgid "Change Department" +msgstr "تغيير القسم" -#: templates/feedback/feedback_form.html:274 -msgid "Rating (Optional)" -msgstr "التقييم (اختياري)" +#: templates/feedback/feedback_detail.html:343 +msgid "Linked Actions" +msgstr "الإجراءات المرتبطة" -#: templates/feedback/feedback_form.html:287 -msgid "Rate your experience from 1 to 5 stars" -msgstr "قيّم تجربتك من 1 إلى 5 نجوم" +#: templates/feedback/feedback_detail.html:352 +#: templates/projects/convert_action.html:89 +#: templates/projects/project_form.html:4 +#: templates/projects/project_form.html:103 +msgid "Create QI Project" +msgstr "إنشاء مشروع الجودة والتحسين" -#: templates/feedback/feedback_form.html:307 -msgid "Organization Information" -msgstr "معلومات المؤسسة" +#: templates/feedback/feedback_detail.html:372 +msgid "PUBLIC" +msgstr "عام" -#: templates/feedback/feedback_form.html:327 -msgid "Select the department related to this feedback (optional)" -msgstr "اختر القسم المتعلق بهذه الملاحظات (اختياري)" +#: templates/feedback/feedback_form.html:4 +#: templates/feedback/feedback_form.html:56 +#: templates/feedback/feedback_list.html:71 +#: templates/layouts/source_user_base.html:155 +msgid "New Suggestion" +msgstr "اقتراح جديد" -#: templates/feedback/feedback_form.html:337 -msgid "Select the physician mentioned in this feedback (optional)" -msgstr "اختر الطبيب المذكور في هذه الملاحظات (اختياري)" +#: templates/feedback/feedback_list.html:67 +msgid "Manage and review submitted suggestions" +msgstr "إدارة ومراجعة الاقتراحات المقدمة" -#: templates/feedback/feedback_form.html:347 -msgid "Related encounter ID if applicable (optional)" -msgstr "معرف المقابلة المتعلق إذا كان منطبقًا (اختياري)" +#: templates/feedback/feedback_list.html:85 +msgid "Total Suggestions" +msgstr "إجمالي الاقتراحات" -#: templates/feedback/feedback_form.html:362 -msgid "Create Feedback" -msgstr "إنشاء ملاحظات" - -#: templates/feedback/feedback_form.html:362 -msgid "Update Feedback" -msgstr "تحديث ملاحظات" - -#: templates/feedback/feedback_list.html:5 -msgid "Feedback Console" -msgstr "وحدة تحكم الملاحظات" - -#: templates/feedback/feedback_list.html:144 -msgid "New Feedback" -msgstr "ملاحظات جديدة" - -#: templates/feedback/feedback_list.html:157 -msgid "Total Feedback" -msgstr "إجمالي الملاحظات" - -#: templates/feedback/feedback_list.html:172 +#: templates/feedback/feedback_list.html:96 +#: templates/feedback/feedback_list.html:140 msgid "Compliments" msgstr "الإشادات" -#: templates/feedback/feedback_list.html:187 +#: templates/feedback/feedback_list.html:107 +#: templates/organizations/department_detail.html:1820 #: templates/physicians/department_overview.html:79 #: templates/physicians/specialization_overview.html:78 msgid "Avg Rating" msgstr "متوسط التقييم" -#: templates/feedback/feedback_list.html:233 -msgid "Title, message, patient..." -msgstr "العنوان، الرسالة، المريض..." - -#: templates/feedback/feedback_list.html:289 -#: templates/physicians/individual_ratings_list.html:112 -msgid "Min Rating" -msgstr "أقل تقييم" +#: templates/feedback/feedback_list.html:159 +msgid "Title, message..." +msgstr "العنوان، الرسالة..." #: templates/feedback/feedback_list.html:291 -#: templates/feedback/feedback_list.html:296 -msgid "1-5" -msgstr "1-5" - -#: templates/feedback/feedback_list.html:294 -#: templates/physicians/individual_ratings_list.html:122 -msgid "Max Rating" -msgstr "أعلى تقييم" - -#: templates/feedback/feedback_list.html:301 -#: templates/journeys/instance_list.html:204 -#: templates/observations/observation_list.html:253 -#: templates/simulator/log_list.html:248 -#: templates/social/social_comment_list.html:196 -#: templates/social/social_platform.html:178 -msgid "Date From" -msgstr "من التاريخ" - -#: templates/feedback/feedback_list.html:305 -#: templates/journeys/instance_list.html:208 -#: templates/observations/observation_list.html:258 -#: templates/simulator/log_list.html:252 -#: templates/social/social_comment_list.html:200 -#: templates/social/social_platform.html:182 -msgid "Date To" -msgstr "إلى التاريخ" - -#: templates/feedback/feedback_list.html:330 -msgid "Feedback List" -msgstr "قائمة الملاحظات" - -#: templates/feedback/feedback_list.html:355 -msgid "Patient/Contact" -msgstr "المريض / جهة الاتصال" +#: templates/px_sources/source_user_suggestion_list.html:201 +msgid "No suggestions found" +msgstr "لم يتم العثور على اقتراحات" #: templates/integrations/survey_mapping_settings.html:14 msgid "" @@ -17930,15 +23147,13 @@ msgstr "إضافة ربط" #: templates/integrations/survey_mapping_settings.html:28 #: templates/integrations/survey_mapping_settings.html:151 -#: templates/surveys/comment_list.html:211 +#: templates/surveys/comment_list.html:225 msgid "Patient Type" msgstr "نوع المريض" #: templates/integrations/survey_mapping_settings.html:30 -#, fuzzy -#| msgid "Survey Delay (Hours)" msgid "Delay (hours)" -msgstr "تأخير الاستبيان (ساعات)" +msgstr "التأخير (ساعات)" #: templates/integrations/survey_mapping_settings.html:85 msgid "No Mappings Configured" @@ -17949,8 +23164,8 @@ msgid "" "No survey template mappings configured yet. Click 'Add Mapping' to create " "your first mapping." msgstr "" -"لا توجد إعدادات ربط لقوالب الاستبيانات حتى الآن. انقر على 'إضافة ربط' لإنشاء" -" أول ربط." +"لا توجد إعدادات ربط لقوالب الاستبيانات حتى الآن. انقر على 'إضافة ربط' لإنشاء " +"أول ربط." #: templates/integrations/survey_mapping_settings.html:103 #: templates/integrations/survey_mapping_settings.html:483 @@ -17967,26 +23182,17 @@ msgstr "اختر قالب الاستبيان" msgid "Select Patient Type" msgstr "اختر نوع المريض" -#: templates/integrations/survey_mapping_settings.html:158 -#: templates/surveys/comment_list.html:217 -msgid "Emergency" -msgstr "الطوارئ" - #: templates/integrations/survey_mapping_settings.html:159 msgid "Day Case" msgstr "حالة يومية" #: templates/integrations/survey_mapping_settings.html:167 -#, fuzzy -#| msgid "Survey Delay (Hours)" msgid "Send Delay (hours)" -msgstr "تأخير الاستبيان (ساعات)" +msgstr "تأخير الإرسال (ساعات)" #: templates/integrations/survey_mapping_settings.html:172 -#, fuzzy -#| msgid "Hours after discharge to send the survey" msgid "Hours after discharge to send survey" -msgstr "ساعات بعد الخروج من المستشفى لإرسال الاستبيان" +msgstr "الساعات بعد الخروج من المستشفى لإرسال الاستبيان" #: templates/integrations/survey_mapping_settings.html:196 msgid "Save Mapping" @@ -18010,8 +23216,7 @@ msgstr "تعديل ربط قالب الاستبيان" #: templates/integrations/survey_mapping_settings.html:382 #: templates/integrations/survey_mapping_settings.html:442 -msgid "" -"Error: Unable to get CSRF token. Please refresh the page and try again." +msgid "Error: Unable to get CSRF token. Please refresh the page and try again." msgstr "خطأ: تعذر الحصول على رمز CSRF. يرجى تحديث الصفحة والمحاولة مرة أخرى." #: templates/integrations/survey_mapping_settings.html:396 @@ -18024,44 +23229,44 @@ msgid "Error saving mapping" msgstr "خطأ في حفظ الربط" #: templates/journeys/instance_detail.html:152 -#, fuzzy -#| msgid "Back to Sources" msgid "Back to Journeys" -msgstr "العودة إلى المصادر" +msgstr "العودة إلى الرحلات" #: templates/journeys/instance_detail.html:163 -#, fuzzy -#| msgid "Encounter ID" msgid "Encounter ID:" -msgstr "معرّف الزيارة" +msgstr "معرف المواجهة:" + +#: templates/journeys/instance_detail.html:166 +#: templates/organizations/department_detail.html:1303 +#: templates/organizations/department_staff_detail.html:468 +#: templates/organizations/patient_detail.html:161 +#: templates/organizations/patient_list.html:282 +#: templates/surveys/his_patient_survey_send.html:120 +#: templates/surveys/instance_detail.html:478 +msgid "MRN" +msgstr "الرقم الطبي (MRN)" #: templates/journeys/instance_detail.html:181 -#: templates/organizations/patient_detail.html:359 +#: templates/organizations/patient_detail.html:354 #: templates/organizations/patient_visit_journey.html:98 msgid "Complete" msgstr "إكمال" #: templates/journeys/instance_detail.html:193 -#, fuzzy -#| msgid "Badge Progress" msgid "Stage Progress" -msgstr "تقدم الشارات" +msgstr "تقدم المرحلة" #: templates/journeys/instance_detail.html:248 #: templates/journeys/instance_detail.html:258 -#, fuzzy -#| msgid "Survey" msgid "Survey:" -msgstr "الاستبيان" +msgstr "استبيان:" #: templates/journeys/instance_detail.html:269 -#, fuzzy -#| msgid "No badges found" msgid "No stages defined" -msgstr "لم يتم العثور على شارات" +msgstr "لا توجد مراحل محددة" #: templates/journeys/instance_detail.html:282 -#: templates/surveys/instance_detail.html:657 +#: templates/surveys/instance_detail.html:519 msgid "Journey Information" msgstr "معلومات الرحلة" @@ -18085,10 +23290,8 @@ msgid "Started" msgstr "بدأت" #: templates/journeys/instance_list.html:96 -#, fuzzy -#| msgid "Monitor call center interactions and satisfaction" msgid "Monitor patient journey instances and stage completion" -msgstr "مراقبة تفاعلات مركز الاتصال ورضا العملاء" +msgstr "مراقبة حالات رحلة المريض وإكمال المراحل" #: templates/journeys/instance_list.html:108 #: templates/journeys/template_detail.html:34 @@ -18100,26 +23303,36 @@ msgid "Encounter ID, MRN, Patient name..." msgstr "رقم الزيارة، الرقم الطبي، اسم المريض..." #: templates/journeys/instance_list.html:175 -#, fuzzy -#| msgid "SMS" msgid "EMS" -msgstr "رسائل نصية" +msgstr "EMS" #: templates/journeys/instance_list.html:177 -#, fuzzy -#| msgid "PDF" msgid "OPD" -msgstr "PDF" +msgstr "OPD" + +#: templates/journeys/instance_list.html:204 +#: templates/observations/observation_list.html:255 +#: templates/simulator/log_list.html:248 +#: templates/social/social_comment_list.html:196 +#: templates/social/social_platform.html:178 +msgid "Date From" +msgstr "من التاريخ" + +#: templates/journeys/instance_list.html:208 +#: templates/observations/observation_list.html:260 +#: templates/simulator/log_list.html:252 +#: templates/social/social_comment_list.html:200 +#: templates/social/social_platform.html:182 +msgid "Date To" +msgstr "إلى التاريخ" #: templates/journeys/instance_list.html:231 msgid "Patient Journeys" msgstr "رحلات المرضى" #: templates/journeys/instance_list.html:292 -#, fuzzy -#| msgid "No surveys found" msgid "No journeys found" -msgstr "لا توجد استبيانات" +msgstr "لم يتم العثور على أي رحلات" #: templates/journeys/stage_surveys_form.html:137 msgid "Back to Template" @@ -18171,54 +23384,44 @@ msgstr "إضافة أول استبيان" #: templates/journeys/stage_surveys_form.html:248 msgid "" -"Surveys will be sent to patients automatically after the specified number of" -" hours from when the stage is triggered." +"Surveys will be sent to patients automatically after the specified number of " +"hours from when the stage is triggered." msgstr "" "سيتم إرسال الاستبيانات إلى المرضى تلقائيًا بعد عدد الساعات المحدد من وقت " "تفعيل المرحلة." -#: templates/journeys/template_confirm_delete.html:20 -#: templates/px_sources/source_user_confirm_delete.html:49 -msgid "Warning:" -msgstr "تحذير:" - #: templates/journeys/template_confirm_delete.html:20 #: templates/px_sources/source_user_confirm_delete.html:50 msgid "This action cannot be undone!" msgstr "لا يمكن التراجع عن هذا الإجراء!" #: templates/journeys/template_confirm_delete.html:24 -#, fuzzy, python-format -#| msgid "Are you sure you want to delete the survey template" +#, python-format msgid "" "Are you sure you want to delete the journey template " "\"%(template.name)s\"?" -msgstr "هل أنت متأكد من رغبتك في حذف نموذج الاستبيان" +msgstr "" +"هل أنت متأكد من رغبتك في حذف قالب الرحلة \"%(template.name)s\"؟" #: templates/journeys/template_confirm_delete.html:29 #: templates/projects/project_save_as_template.html:31 #: templates/projects/template_form.html:127 -#: templates/surveys/template_detail.html:192 +#: templates/surveys/template_detail.html:215 msgid "Template Information" msgstr "معلومات القالب" #: templates/journeys/template_confirm_delete.html:40 -#, fuzzy -#| msgid "Journey Type" msgid "Journey Type:" -msgstr "نوع الرحلة" +msgstr "نوع الرحلة:" #: templates/journeys/template_confirm_delete.html:44 -#, fuzzy -#| msgid "Stages" msgid "Stages:" -msgstr "المراحل" +msgstr "المراحل:" #: templates/journeys/template_confirm_delete.html:48 -#, fuzzy -#| msgid "Survey Instances" msgid "Journey Instances:" -msgstr "حالات الاستبيانات" +msgstr "حالات الرحلة:" #: templates/journeys/template_confirm_delete.html:57 msgid "" @@ -18238,7 +23441,7 @@ msgstr "" #: templates/projects/template_delete_confirm.html:14 #: templates/projects/template_delete_confirm.html:39 #: templates/surveys/template_confirm_delete.html:124 -#: templates/surveys/template_detail.html:247 +#: templates/surveys/template_detail.html:270 msgid "Delete Template" msgstr "حذف القالب" @@ -18249,7 +23452,7 @@ msgstr "حذف القالب" #: templates/projects/template_form.html:104 #: templates/surveys/template_confirm_delete.html:80 #: templates/surveys/template_detail.html:54 -#: templates/surveys/template_form.html:142 +#: templates/surveys/template_form.html:248 msgid "Back to Templates" msgstr "العودة إلى القوالب" @@ -18269,34 +23472,24 @@ msgid "Created At:" msgstr "تاريخ الإنشاء:" #: templates/journeys/template_detail.html:100 -#, fuzzy -#| msgid "Detailed Statistics" msgid "Statistics" -msgstr "الإحصائيات التفصيلية" +msgstr "الإحصائيات" #: templates/journeys/template_detail.html:105 -#, fuzzy -#| msgid "Total Staff" msgid "Total Stages:" -msgstr "إجمالي الموظفين" +msgstr "إجمالي المراحل:" #: templates/journeys/template_detail.html:109 -#, fuzzy -#| msgid "Total Journeys" msgid "Total Journeys:" -msgstr "إجمالي الرحلات" +msgstr "إجمالي المسارات:" #: templates/journeys/template_detail.html:113 -#, fuzzy -#| msgid "Patient Journeys" msgid "Active Journeys:" -msgstr "رحلات المرضى" +msgstr "المسارات النشطة:" #: templates/journeys/template_detail.html:117 -#, fuzzy -#| msgid "Completed Items" msgid "Completed Journeys:" -msgstr "العناصر المكتملة" +msgstr "المسارات المكتملة:" #: templates/journeys/template_detail.html:129 #: templates/journeys/template_form.html:250 @@ -18304,41 +23497,34 @@ msgid "Journey Stages" msgstr "مراحل الرحلة" #: templates/journeys/template_detail.html:138 -#, fuzzy -#| msgid "Stage Name:" msgid "Stage Name (EN)" -msgstr "اسم المرحلة:" +msgstr "اسم المرحلة (إنجليزي)" #: templates/journeys/template_detail.html:139 -#, fuzzy -#| msgid "Stage Name:" msgid "Stage Name (AR)" -msgstr "اسم المرحلة:" +msgstr "اسم المرحلة (عربي)" #: templates/journeys/template_detail.html:158 -#, fuzzy -#| msgid "No surveys assigned yet" msgid "No survey assigned" -msgstr "لا توجد استبيانات مخصصة بعد" +msgstr "لم يتم تعيين أي استبيان" #: templates/journeys/template_detail.html:169 msgid "Edit template to change survey assignment" msgstr "تعديل القالب لتغيير تعيين الاستبيان" #: templates/journeys/template_detail.html:181 -#, fuzzy -#| msgid "No badges earned yet" msgid "No stages defined yet" -msgstr "لم يتم الحصول على أي شارات حتى الآن" +msgstr "لم يتم تحديد أي مراحل بعد" #: templates/journeys/template_detail.html:197 #: templates/journeys/template_list.html:187 -#, fuzzy, python-format -#| msgid "Are you sure you want to delete the survey template" +#, python-format msgid "" "Are you sure you want to delete the journey template " "\"%(template.name)s\"?" -msgstr "هل أنت متأكد من رغبتك في حذف نموذج الاستبيان" +msgstr "" +"هل أنت متأكد من رغبتك في حذف قالب الرحلة \"%(template.name)s\"؟" #: templates/journeys/template_detail.html:198 msgid "" @@ -18378,6 +23564,10 @@ msgid "Add Stage" msgstr "إضافة مرحلة" #: templates/journeys/template_form.html:263 +#: templates/organizations/orgsection_detail.html:141 +#: templates/organizations/orgsection_list.html:122 +#: templates/organizations/orgsubsection_form.html:119 +#: templates/organizations/orgsubsection_list.html:122 #: templates/px_sources/source_list.html:196 msgid "Name (EN)" msgstr "الاسم (بالإنجليزية)" @@ -18390,10 +23580,6 @@ msgstr "تشغيل الحدث" msgid "Opt" msgstr "خيار" -#: templates/journeys/template_form.html:268 -msgid "Act" -msgstr "تعديل" - #: templates/journeys/template_form.html:316 #: templates/journeys/template_list.html:81 msgid "Stages" @@ -18401,8 +23587,8 @@ msgstr "المراحل" #: templates/journeys/template_form.html:316 msgid "" -"Define stages for patient journeys. Each stage has a trigger event code that" -" completes the stage. Survey templates assigned here will have their " +"Define stages for patient journeys. Each stage has a trigger event code that " +"completes the stage. Survey templates assigned here will have their " "questions merged into the post-discharge survey." msgstr "" "حدد المراحل لرحلات المرضى. لكل مرحلة حدث تشغيل يكمل المرحلة. سيتم دمج " @@ -18416,144 +23602,109 @@ msgstr "" "سيتم تنفيذ المراحل بالترتيب. بعد إنشاء القالب، يمكنك تعيين الاستبيانات لكل " "مرحلة." -#: templates/journeys/template_form.html:334 -#: templates/surveys/template_form.html:560 -msgid "Update Template" -msgstr "تحديث القالب" - #: templates/journeys/template_list.html:58 -#, fuzzy -#| msgid "Manage your tasks and responsibilities" msgid "Manage journey templates and stages" -msgstr "إدارة مهامك ومسؤولياتك" +msgstr "إدارة قوالب الرحلة والمراحل" #: templates/journeys/template_list.html:72 msgid "Journey Templates" msgstr "قوالب الرحلة" #: templates/journeys/template_list.html:92 -#, fuzzy -#| msgid "Stages" msgid "stages" msgstr "المراحل" #: templates/journeys/template_list.html:118 -#, fuzzy -#| msgid "Survey Instances" msgid "View Instances" -msgstr "حالات الاستبيانات" +msgstr "عرض الحالات" #: templates/journeys/template_list.html:188 msgid "This will also delete all associated stages and cannot be undone." msgstr "سيؤدي هذا أيضًا إلى حذف جميع المراحل المرتبطة ولا يمكن التراجع عنه." -#: templates/layouts/base.html:8 templates/layouts/public_base.html:10 +#: templates/layouts/base.html:9 templates/layouts/public_base.html:11 #: templates/layouts/source_user_base.html:8 msgid "PX360 - Patient Experience Management" msgstr "PX360 - إدارة تجربة المريض" -#: templates/layouts/base.html:204 +#: templates/layouts/base.html:221 msgid "No new notifications" msgstr "لا توجد إشعارات جديدة" -#: templates/layouts/base.html:205 templates/notifications/inbox.html:150 +#: templates/layouts/base.html:222 templates/notifications/inbox.html:150 +#: templates/projects/my_tasks.html:117 msgid "You're all caught up!" msgstr "أنت على اطلاع بكل شيء!" -#: templates/layouts/base.html:233 +#: templates/layouts/base.html:250 msgid "View all notifications" msgstr "عرض جميع الإشعارات" -#: templates/layouts/base.html:249 +#: templates/layouts/base.html:266 msgid "Just now" msgstr "الآن" -#: templates/layouts/base.html:250 +#: templates/layouts/base.html:267 msgid "min ago" msgstr "دقيقة مضت" -#: templates/layouts/base.html:251 +#: templates/layouts/base.html:268 msgid "hours ago" msgstr "ساعات مضت" -#: templates/layouts/base.html:252 +#: templates/layouts/base.html:269 msgid "days ago" msgstr "أيام مضت" -#: templates/layouts/partials/sidebar.html:111 +#: templates/layouts/partials/sidebar.html:148 +#: templates/projects/my_tasks.html:4 templates/projects/my_tasks.html:10 +#: templates/projects/my_tasks.html:12 +msgid "My Tasks" +msgstr "مهامي" + +#: templates/layouts/partials/sidebar.html:157 +#: templates/layouts/partials/sidebar.html:332 +#: templates/layouts/partials/sidebar.html:350 +msgid "My Department" +msgstr "قسمي" + +#: templates/layouts/partials/sidebar.html:171 msgid "Command Center" msgstr "مركز القيادة" -#: templates/layouts/partials/sidebar.html:145 +#: templates/layouts/partials/sidebar.html:180 msgid "My Source Dashboard" msgstr "لوحة تحكم مصوري" -#: templates/layouts/partials/sidebar.html:179 -#: templates/projects/project_list.html:4 -msgid "QI Projects" -msgstr "مشاريع تحسين الجودة" +#: templates/layouts/partials/sidebar.html:256 +#: templates/organizations/physician_list.html:4 +#: templates/organizations/physician_list.html:56 +#: templates/physicians/department_overview.html:5 +#: templates/physicians/department_overview.html:14 +#: templates/physicians/department_overview.html:83 +#: templates/physicians/physician_detail.html:5 +#: templates/physicians/physician_detail.html:320 +#: templates/physicians/physician_list.html:5 +#: templates/physicians/physician_list.html:74 +#: templates/physicians/physician_list.html:186 +#: templates/physicians/physician_ratings_dashboard.html:712 +#: templates/physicians/specialization_overview.html:5 +#: templates/physicians/specialization_overview.html:14 +#: templates/physicians/specialization_overview.html:82 +msgid "Physicians" +msgstr "الأطباء" -#: templates/layouts/partials/sidebar.html:186 -#: templates/projects/project_list.html:142 -msgid "All Projects" -msgstr "جميع المشاريع" - -#: templates/layouts/partials/sidebar.html:192 -#: templates/projects/project_form.html:303 -#: templates/projects/project_list.html:83 -msgid "Create Project" -msgstr "إنشاء مشروع" - -#: templates/layouts/partials/sidebar.html:199 -#: templates/layouts/partials/sidebar.html:245 -#: templates/projects/project_list.html:80 -#: templates/surveys/template_detail.html:61 -#: templates/surveys/template_list.html:75 -msgid "Templates" -msgstr "القوالب" - -#: templates/layouts/partials/sidebar.html:240 -#: templates/surveys/instance_list.html:123 -msgid "Survey List" -msgstr "قائمة الاستبيانات" - -#: templates/layouts/partials/sidebar.html:250 -msgid "Create Survey" -msgstr "إنشاء استبيان" - -#: templates/layouts/partials/sidebar.html:255 -msgid "Manual Send" -msgstr "إرسال يدوي" - -#: templates/layouts/partials/sidebar.html:260 -msgid "HIS Import" -msgstr "استيراد نظام معلومات المستشفى" - -#: templates/layouts/partials/sidebar.html:277 -msgid "Mapping" -msgstr "التعيين" - -#: templates/layouts/partials/sidebar.html:296 -msgid "All Staff" -msgstr "كل الموظفين" - -#: templates/layouts/partials/sidebar.html:301 -#: templates/organizations/staff_detail.html:158 -msgid "Hierarchy" -msgstr "الهيكل التنظيمي" - -#: templates/layouts/partials/sidebar.html:353 +#: templates/layouts/partials/sidebar.html:268 +#: templates/physicians/leaderboard.html:148 msgid "All Physicians" msgstr "جميع الأطباء" -#: templates/layouts/partials/sidebar.html:364 +#: templates/layouts/partials/sidebar.html:279 #: templates/physicians/doctor_rating_fetch.html:151 -#, fuzzy -#| msgid "Ratings" msgid "Fetch Ratings" -msgstr "التقييمات" +msgstr "جلب التقييمات" -#: templates/layouts/partials/sidebar.html:369 +#: templates/layouts/partials/sidebar.html:284 #: templates/physicians/doctor_rating_job_list.html:217 #: templates/physicians/individual_ratings_list.html:82 #: templates/physicians/individual_ratings_list.html:297 @@ -18561,45 +23712,81 @@ msgstr "التقييمات" msgid "Import Ratings" msgstr "استيراد التقييمات" -#: templates/layouts/partials/sidebar.html:374 -#: templates/physicians/individual_ratings_list.html:74 -msgid "Individual Ratings" -msgstr "التقييمات الفردية" +#: templates/layouts/partials/sidebar.html:306 +msgid "All Staff" +msgstr "كل الموظفين" -#: templates/layouts/partials/sidebar.html:387 +#: templates/layouts/partials/sidebar.html:311 +#: templates/organizations/staff_detail.html:154 +msgid "Hierarchy" +msgstr "الهيكل التنظيمي" + +#: templates/layouts/partials/sidebar.html:317 +msgid "Staff Activity" +msgstr "نشاط الموظفين" + +#: templates/layouts/partials/sidebar.html:403 +#: templates/projects/project_list.html:4 +msgid "QI Projects" +msgstr "مشاريع تحسين الجودة" + +#: templates/layouts/partials/sidebar.html:426 +#: templates/surveys/instance_list.html:123 +msgid "Survey List" +msgstr "قائمة الاستبيانات" + +#: templates/layouts/partials/sidebar.html:437 +msgid "Create Survey" +msgstr "إنشاء استبيان" + +#: templates/layouts/partials/sidebar.html:454 +msgid "Mapping" +msgstr "التعيين" + +#: templates/layouts/partials/sidebar.html:468 +#: templates/organizations/department_detail.html:435 +msgid "Standards" +msgstr "المعايير" + +#: templates/layouts/partials/sidebar.html:480 +#: templates/standards/department_standards.html:106 +#: templates/standards/search.html:4 templates/standards/search.html:66 +msgid "Standards List" +msgstr "قائمة المعايير" + +#: templates/layouts/partials/sidebar.html:486 +#: templates/standards/source_list.html:111 +msgid "Sources" +msgstr "المصادر" + +#: templates/layouts/partials/sidebar.html:496 +#: templates/standards/activity_type_list.html:4 +#: templates/standards/activity_type_list.html:95 +#: templates/standards/activity_type_list.html:111 +msgid "Activity Types" +msgstr "أنواع الأنشطة" + +#: templates/layouts/partials/sidebar.html:515 #: templates/px_sources/source_confirm_delete.html:11 #: templates/px_sources/source_detail.html:84 #: templates/px_sources/source_form.html:140 #: templates/px_sources/source_list.html:4 #: templates/px_sources/source_list.html:135 #: templates/px_sources/source_user_confirm_delete.html:11 -#: templates/px_sources/source_user_form.html:108 +#: templates/px_sources/source_user_form.html:60 msgid "PX Sources" msgstr "مصادر PX" -#: templates/layouts/partials/sidebar.html:394 -#: templates/physicians/individual_ratings_list.html:148 -#: templates/px_sources/source_list.html:153 -#: templates/reports/saved_reports.html:62 templates/standards/search.html:105 -msgid "All Sources" -msgstr "جميع المصادر" +#: templates/layouts/partials/sidebar.html:532 +msgid "Comm. Requests" +msgstr "طلبات الاتصالات" -#: templates/layouts/partials/sidebar.html:423 -#: templates/reports/report_detail.html:27 -#: templates/reports/saved_reports.html:26 -#: templates/surveys/analytics_reports.html:42 -#: templates/surveys/analytics_reports.html:55 -#: templates/surveys/analytics_reports.html:68 -#: templates/surveys/analytics_reports.html:81 -msgid "Reports" -msgstr "التقارير" - -#: templates/layouts/partials/sidebar.html:430 +#: templates/layouts/partials/sidebar.html:578 #: templates/reports/saved_reports.html:177 msgid "Create Report" msgstr "إنشاء تقرير" -#: templates/layouts/partials/sidebar.html:435 +#: templates/layouts/partials/sidebar.html:584 #: templates/reports/report_builder.html:44 #: templates/reports/report_detail.html:29 #: templates/reports/saved_reports.html:5 @@ -18608,22 +23795,20 @@ msgstr "إنشاء تقرير" msgid "Saved Reports" msgstr "التقارير المحفوظة" -#: templates/layouts/partials/sidebar.html:464 -#, fuzzy -#| msgid "System Configuration" -msgid "System Config" -msgstr "إعدادات النظام" +#: templates/layouts/partials/sidebar.html:614 +msgid "Comments Analysis" +msgstr "تحليل التعليقات" -#: templates/layouts/partials/sidebar.html:489 +#: templates/layouts/partials/sidebar.html:637 msgid "References" msgstr "المراجع" -#: templates/layouts/partials/sidebar.html:501 +#: templates/layouts/partials/sidebar.html:649 #: templates/references/search.html:4 templates/references/search.html:162 msgid "Search Documents" msgstr "بحث في المستندات" -#: templates/layouts/partials/sidebar.html:506 +#: templates/layouts/partials/sidebar.html:655 #: templates/references/document_form.html:5 #: templates/references/document_form.html:173 #: templates/references/folder_view.html:288 @@ -18631,7 +23816,7 @@ msgstr "بحث في المستندات" msgid "Upload Document" msgstr "رفع مستند" -#: templates/layouts/partials/sidebar.html:511 +#: templates/layouts/partials/sidebar.html:660 #: templates/references/dashboard.html:136 #: templates/references/folder_form.html:5 #: templates/references/folder_form.html:152 @@ -18640,69 +23825,88 @@ msgstr "رفع مستند" msgid "New Folder" msgstr "مجلد جديد" -#: templates/layouts/partials/sidebar.html:524 -msgid "Standards" -msgstr "المعايير" +#: templates/layouts/partials/sidebar.html:744 +#: templates/layouts/partials/sidebar.html:924 +msgid "Pin Sidebar" +msgstr "تثبيت الشريط الجانبي" -#: templates/layouts/partials/sidebar.html:536 -#: templates/standards/dashboard.html:85 templates/standards/search.html:4 -#: templates/standards/search.html:66 -msgid "Search Standards" -msgstr "بحث المعايير" - -#: templates/layouts/partials/sidebar.html:541 -#: templates/standards/source_list.html:111 -msgid "Sources" -msgstr "المصادر" - -#: templates/layouts/partials/sidebar.html:669 +#: templates/layouts/partials/sidebar.html:802 msgid "Failed to switch hospital: " msgstr "فشل في تبديل المستشفى:" -#: templates/layouts/partials/sidebar.html:669 -#: templates/standards/department_standards.html:505 -#: templates/standards/department_standards.html:570 -#: templates/standards/department_standards.html:786 +#: templates/layouts/partials/sidebar.html:802 +#: templates/standards/department_standards.html:604 +#: templates/standards/department_standards.html:669 +#: templates/standards/department_standards.html:885 +#: templates/standards/search.html:699 templates/standards/search.html:728 +#: templates/standards/search.html:850 +#: templates/standards/standard_detail.html:688 +#: templates/standards/standard_detail.html:735 +#: templates/standards/standard_detail.html:880 msgid "Unknown error" msgstr "خطأ غير معروف" -#: templates/layouts/partials/sidebar.html:675 +#: templates/layouts/partials/sidebar.html:808 msgid "An error occurred while switching hospitals" msgstr "حدث خطأ أثناء تبديل المستشفيات" +#: templates/layouts/partials/sidebar.html:921 +msgid "Unpin Sidebar" +msgstr "إلغاء تثبيت الشريط الجانبي" + #: templates/layouts/partials/stat_cards.html:18 msgid "from last period" msgstr "من الفترة السابقة" #: templates/layouts/partials/topbar.html:13 -msgid "Good morning" -msgstr "صباح الخير" +#: templates/px_sources/source_user_dashboard.html:31 +msgid "Welcome" +msgstr "مرحبًا" #: templates/layouts/partials/topbar.html:20 msgid "Welcome to PX360 Patient Experience Management" msgstr "مرحبًا بك في نظام إدارة تجربة المريض PX360" -#: templates/layouts/public_base.html:191 +#: templates/layouts/public_base.html:178 msgid "Patient Experience Management" msgstr "إدارة تجربة المريض" -#: templates/layouts/public_base.html:225 +#: templates/layouts/public_base.html:212 msgid "All rights reserved." msgstr "جميع الحقوق محفوظة." -#: templates/layouts/source_user_base.html:130 +#: templates/layouts/source_user_base.html:110 msgid "Source Portal" msgstr "بوابة المصدر" -#: templates/layouts/source_user_base.html:168 +#: templates/layouts/source_user_base.html:147 +#: templates/observations/observation_create.html:5 +#: templates/observations/observation_create.html:50 +#: templates/observations/observation_list.html:91 +msgid "New Observation" +msgstr "ملاحظة جديدة" + +#: templates/layouts/source_user_base.html:162 msgid "My Feedback" msgstr "ملاحظاتي" -#: templates/layouts/source_user_base.html:213 +#: templates/layouts/source_user_base.html:202 +#: templates/px_sources/source_user_create_communication_request.html:4 +#: templates/px_sources/source_user_create_communication_request.html:19 +msgid "Contact PX Team" +msgstr "الاتصال بفريق تجربة المريض" + +#: templates/layouts/source_user_base.html:208 +msgid "My Requests" +msgstr "طلباتي" + +#: templates/layouts/source_user_base.html:236 msgid "Your Source" msgstr "مصدرك" -#: templates/layouts/source_user_base.html:248 +#: templates/layouts/source_user_base.html:271 +#: templates/px_sources/communication_request_detail.html:96 +#: templates/px_sources/communication_request_list.html:109 msgid "Source User" msgstr "مستخدم المصدر" @@ -18726,14 +23930,7 @@ msgstr "غير مقروء" msgid "Read" msgstr "مقروء" -#: templates/notifications/inbox.html:83 -#: templates/observations/observation_list.html:121 -#: templates/surveys/his_patient_review.html:196 -msgid "New" -msgstr "جديد" - -#: templates/notifications/inbox.html:93 -#: templates/notifications/inbox.html:198 +#: templates/notifications/inbox.html:93 templates/notifications/inbox.html:215 msgid "Mark as read" msgstr "وضع علامة مقروء" @@ -18757,7 +23954,7 @@ msgstr "لا توجد إشعارات" msgid "You don't have any notifications yet." msgstr "ليس لديك أي إشعارات حتى الآن." -#: templates/notifications/inbox.html:252 +#: templates/notifications/inbox.html:281 msgid "Are you sure you want to dismiss all notifications?" msgstr "هل أنت متأكد أنك تريد إخفاء جميع الإشعارات؟" @@ -18818,8 +24015,8 @@ msgid "" "During quiet hours, SMS and WhatsApp notifications will be queued and sent " "after the quiet period ends." msgstr "" -"خلال ساعات الهدوء، سيتم وضع إشعارات الرسائل النصية وواتساب في قائمة الانتظار" -" وإرسالها بعد انتهاء فترة الهدوء." +"خلال ساعات الهدوء، سيتم وضع إشعارات الرسائل النصية وواتساب في قائمة الانتظار " +"وإرسالها بعد انتهاء فترة الهدوء." #: templates/notifications/settings.html:334 msgid "Enable Quiet Hours" @@ -18862,8 +24059,8 @@ msgid "Sending Test..." msgstr "جاري إرسال الاختبار..." #: templates/notifications/settings.html:399 -#: templates/simulator/log_detail.html:67 -#: templates/simulator/log_list.html:216 templates/simulator/log_list.html:278 +#: templates/simulator/log_detail.html:67 templates/simulator/log_list.html:216 +#: templates/simulator/log_list.html:278 msgid "Channel" msgstr "القناة" @@ -18920,7 +24117,6 @@ msgstr "إضافة أول فئة" #: templates/observations/convert_to_action.html:5 #: templates/observations/convert_to_action.html:14 -#: templates/observations/observation_detail.html:96 msgid "Convert to Action" msgstr "تحويل إلى إجراء" @@ -18945,193 +24141,188 @@ msgstr "عنوان واضح وقابل للتنفيذ للإجراء PX" msgid "Assign to Department" msgstr "تعيين إلى القسم" -#: templates/observations/convert_to_action.html:98 -#: templates/social/social_comment_detail.html:271 -msgid "Create PX Action" -msgstr "إنشاء إجراء PX" - -#: templates/observations/observation_create.html:5 -#: templates/observations/observation_create.html:124 -#: templates/observations/observation_list.html:91 -#, fuzzy -#| msgid "Observation" -msgid "New Observation" -msgstr "ملاحظة" - -#: templates/observations/observation_create.html:117 +#: templates/observations/observation_create.html:48 +#: templates/px_sources/source_user_create_observation.html:38 msgid "Back to Observations" msgstr "العودة إلى الملاحظات" -#: templates/observations/observation_create.html:125 -#, fuzzy -#| msgid "Submit a new observation" -msgid "Submit a staff observation report" -msgstr "إرسال ملاحظة جديدة" - -#: templates/observations/observation_create.html:151 -#, fuzzy -#| msgid "Describe what you observed in detail..." -msgid "Describe what was observed" -msgstr "صف ما لاحظته بالتفصيل..." - -#: templates/observations/observation_create.html:193 -#, fuzzy -#| msgid "Please describe what you observed in detail." -msgid "Please describe what you observed in detail (at least 10 characters)." -msgstr "يرجى وصف ما لاحظته بالتفصيل." - -#: templates/observations/observation_create.html:235 -#, fuzzy -#| msgid "Location Information" -msgid "Location & Timing" -msgstr "معلومات الموقع" - -#: templates/observations/observation_create.html:236 -#, fuzzy -#| msgid "Where did this occur?" -msgid "Where and when did this occur?" -msgstr "أين حدث ذلك؟" - -#: templates/observations/observation_create.html:258 -#: templates/observations/public_new.html:159 +#: templates/observations/observation_create.html:115 +#: templates/observations/public_new.html:174 msgid "When did this occur?" msgstr "متى حدث ذلك؟" -#: templates/observations/observation_create.html:276 -#, fuzzy -#| msgid "PX actions assigned to each department" -msgid "Optionally assign to a department or user" -msgstr "إجراءات PX المخصصة لكل قسم" +#: templates/observations/observation_create.html:125 +msgid "Patient File Number" +msgstr "رقم ملف المريض" -#: templates/observations/observation_create.html:317 -#, fuzzy -#| msgid "You can attach supporting documents to your explanation" -msgid "Upload supporting documents or images" -msgstr "يمكنك إرفاق مستندات داعمة لإيضاحك" - -#: templates/observations/observation_create.html:324 -#: templates/observations/public_new.html:174 -msgid "Images, PDF, Word, Excel (max 10MB each)" -msgstr "صور، PDF، Word، Excel (بحد أقصى 10MB لكل ملف)" - -#: templates/observations/observation_create.html:340 -#, fuzzy -#| msgid "Track Observation" +#: templates/observations/observation_create.html:146 +#: templates/px_sources/source_user_observation_list.html:74 msgid "Create Observation" -msgstr "متابعة الملاحظة" +msgstr "إنشاء ملاحظة" -#: templates/observations/observation_create.html:379 -#: templates/observations/observation_create.html:386 -#, fuzzy -#| msgid "Select source (optional)" +#: templates/observations/observation_create.html:155 msgid "Select assignee (optional)" -msgstr "اختر المصدر (اختياري)" +msgstr "اختيار المسؤول (اختياري)" #: templates/observations/observation_detail.html:5 msgid "Observation Detail" msgstr "تفاصيل الملاحظة" -#: templates/observations/observation_detail.html:133 -#: templates/observations/observation_detail.html:137 -#: templates/observations/public_success.html:127 -#: templates/observations/public_track.html:197 -#: templates/standards/standard_detail.html:135 -#: templates/standards/standard_detail.html:145 -msgid "Not specified" -msgstr "غير محدد" +#: templates/observations/observation_detail.html:158 +msgid "Incident" +msgstr "حادث" -#: templates/observations/observation_detail.html:140 -msgid "Incident Date/Time" -msgstr "تاريخ/وقت الحادثة" +#: templates/observations/observation_detail.html:184 +msgid "Anonymous submission" +msgstr "تقديم مجهول" -#: templates/observations/observation_detail.html:153 -msgid "Triaged" -msgstr "تم الفرز" +#: templates/observations/observation_detail.html:201 +msgid "Reporter info not available" +msgstr "معلومات المبلغ غير متوفرة" -#: templates/observations/observation_detail.html:167 -msgid "Reporter Information" -msgstr "معلومات المبلّغ" +#: templates/observations/observation_detail.html:225 +msgid "Awaiting" +msgstr "قيد الانتظار" -#: templates/observations/observation_detail.html:174 -msgid "This observation was submitted anonymously" -msgstr "تم إرسال هذه الملاحظة بشكل مجهول" +#: templates/observations/observation_detail.html:366 +#: templates/observations/observation_detail.html:908 +msgid "Update Response" +msgstr "تحديث الرد" -#: templates/observations/observation_detail.html:278 -msgid "No timeline entries yet" -msgstr "لا توجد إدخالات في الجدول الزمني بعد" +#: templates/observations/observation_detail.html:377 +msgid "No department assigned to this observation" +msgstr "لا يوجد قسم مخصص لهذه الملاحظة" -#: templates/observations/observation_detail.html:309 +#: templates/observations/observation_detail.html:384 +msgid "Response to Reporter" +msgstr "الرد على المبلغ" + +#: templates/observations/observation_detail.html:465 +msgid "No Root Cause Analyses linked to this observation" +msgstr "لا توجد تحليلات أسباب جذرية مرتبطة بهذه الملاحظة" + +#: templates/observations/observation_detail.html:492 +msgid "Are you sure you want to cancel this observation?" +msgstr "هل أنت متأكد من رغبتك في إلغاء هذه الملاحظة؟" + +#: templates/observations/observation_detail.html:497 +msgid "Cancel Observation" +msgstr "إلغاء الملاحظة" + +#: templates/observations/observation_detail.html:503 +msgid "Activate this observation to perform actions" +msgstr "تفعيل هذه الملاحظة لتنفيذ الإجراءات" + +#: templates/observations/observation_detail.html:510 +msgid "Respond to Reporter" +msgstr "الرد على المبلغ" + +#: templates/observations/observation_detail.html:522 +#: templates/px_sources/source_detail.html:432 +msgid "Convert" +msgstr "تحويل" + +#: templates/observations/observation_detail.html:532 +msgid "Mark this observation as resolved?" +msgstr "تحديد هذه الملاحظة كمحلولة؟" + +#: templates/observations/observation_detail.html:572 +msgid "Are you sure you want to delete this observation?" +msgstr "هل أنت متأكد من رغبتك في حذف هذه الملاحظة؟" + +#: templates/observations/observation_detail.html:632 +#: templates/surveys/bulk_job_status.html:117 +#: templates/surveys/his_patient_review.html:157 +msgid "File Number" +msgstr "رقم الملف" + +#: templates/observations/observation_detail.html:638 +msgid "Person Noted" +msgstr "تمت ملاحظة الشخص" + +#: templates/observations/observation_detail.html:644 +msgid "Department Noted" +msgstr "تمت ملاحظة القسم" + +#: templates/observations/observation_detail.html:650 +msgid "Via" +msgstr "عبر" + +#: templates/observations/observation_detail.html:656 +msgid "Contacted At" +msgstr "وقت الاتصال" + +#: templates/observations/observation_detail.html:667 msgid "Linked PX Action" msgstr "الإجراء المرتبط بـ PX" -#: templates/observations/observation_detail.html:313 +#: templates/observations/observation_detail.html:671 msgid "View Action" msgstr "عرض الإجراء" -#: templates/observations/observation_detail.html:352 +#: templates/observations/observation_detail.html:679 msgid "Triage" msgstr "فرز" -#: templates/observations/observation_detail.html:398 -msgid "Internal note (not visible to public)" -msgstr "ملاحظة داخلية (غير مرئية للعامة)" +#: templates/observations/observation_detail.html:846 +msgid "Send Response to Reporter" +msgstr "إرسال الرد إلى المبلغ" -#: templates/observations/observation_detail.html:412 -msgid "Quick Status Change" -msgstr "تغيير سريع للحالة" +#: templates/observations/observation_detail.html:897 +msgid "Enter your response to the reporter..." +msgstr "أدخل ردك على المبلغ..." -#: templates/observations/observation_list.html:5 -#: templates/observations/observation_list.html:84 -msgid "Observations Console" -msgstr "لوحة تحكم الملاحظات" +#: templates/observations/observation_detail.html:902 +msgid "" +"At least one language is required. The response will be visible to the " +"reporter on the tracking page." +msgstr "مطلوب لغة واحدة على الأقل. سيكون الرد مرئيًا للمبلغ في صفحة التتبع." + +#: templates/observations/observation_detail.html:908 +msgid "Send Response" +msgstr "إرسال الرد" + +#: templates/observations/observation_detail.html:925 +msgid "Escalate Observation" +msgstr "رفع الملاحظة" #: templates/observations/observation_list.html:86 msgid "Manage and triage staff-reported observations" msgstr "إدارة وفرز الملاحظات المُبلّغ عنها من قِبل الموظفين" -#: templates/observations/observation_list.html:172 +#: templates/observations/observation_list.html:173 msgid "Tracking code, description..." msgstr "رمز التتبع، الوصف..." -#: templates/observations/observation_list.html:232 +#: templates/observations/observation_list.html:233 msgid "All Users" msgstr "جميع المستخدمين" -#: templates/observations/observation_list.html:243 -msgid "Reporter Type" -msgstr "نوع المُبلّغ" - -#: templates/observations/observation_list.html:246 -msgid "Anonymous Only" -msgstr "مجهول فقط" - -#: templates/observations/observation_list.html:247 -msgid "Identified Only" -msgstr "معرّف فقط" - -#: templates/observations/observation_list.html:282 +#: templates/observations/observation_list.html:284 msgid "Observations List" msgstr "قائمة الملاحظات" -#: templates/observations/observation_list.html:301 +#: templates/observations/observation_list.html:303 +#: templates/organizations/department_detail.html:1318 +#: templates/organizations/department_observation_detail.html:106 +#: templates/organizations/department_observation_detail.html:112 +#: templates/organizations/department_staff_detail.html:483 msgid "Reporter" msgstr "المُبلّغ" #: templates/observations/partials/ai_panel.html:113 -#, fuzzy -#| msgid "No AI analysis available for this complaint" msgid "No AI analysis available for this observation" -msgstr "لا تتوفر تحليلات الذكاء الاصطناعي لهذه الشكوى" +msgstr "لا يوجد تحليل ذكاء اصطناعي متاح لهذه الملاحظة" -#: templates/observations/public_new.html:55 +#: templates/observations/public_new.html:35 msgid "Help us improve by reporting issues you notice" msgstr "ساعدنا في التحسين من خلال الإبلاغ عن المشكلات التي تلاحظها" -#: templates/observations/public_new.html:63 +#: templates/observations/public_new.html:43 msgid "Anonymous Reporting" msgstr "إبلاغ مجهول" -#: templates/observations/public_new.html:65 +#: templates/observations/public_new.html:45 msgid "" "You can submit this report anonymously. Providing your information is " "optional but may help us follow up if needed." @@ -19139,15 +24330,27 @@ msgstr "" "يمكنك إرسال هذا البلاغ بشكل مجهول. تقديم معلوماتك اختياري ولكنه قد يساعدنا " "في المتابعة إذا لزم الأمر." -#: templates/observations/public_new.html:142 +#: templates/observations/public_new.html:75 +msgid "Select hospital" +msgstr "اختر المستشفى" + +#: templates/observations/public_new.html:157 msgid "Please describe what you observed in detail." msgstr "يرجى وصف ما لاحظته بالتفصيل." -#: templates/observations/public_new.html:186 +#: templates/observations/public_new.html:164 +msgid "Location Details" +msgstr "تفاصيل الموقع" + +#: templates/observations/public_new.html:189 +msgid "Images, PDF, Word, Excel (max 10MB each)" +msgstr "صور، PDF، Word، Excel (بحد أقصى 10MB لكل ملف)" + +#: templates/observations/public_new.html:201 msgid "Your Information" msgstr "معلوماتك الشخصية" -#: templates/observations/public_new.html:189 +#: templates/observations/public_new.html:204 msgid "" "Providing your information helps us follow up if needed. Leave blank to " "submit anonymously." @@ -19155,7 +24358,7 @@ msgstr "" "تقديم معلوماتك يساعدنا في المتابعة عند الحاجة. اتركها فارغة لتقديم البلاغ " "بشكل مجهول." -#: templates/observations/public_new.html:221 +#: templates/observations/public_new.html:236 msgid "Track an existing observation" msgstr "تتبع ملاحظة موجودة" @@ -19163,10 +24366,6 @@ msgstr "تتبع ملاحظة موجودة" msgid "Observation Submitted" msgstr "تم إرسال الملاحظة" -#: templates/observations/public_success.html:71 -msgid "Thank You!" -msgstr "شكرًا لك!" - #: templates/observations/public_success.html:73 msgid "Your observation has been submitted successfully." msgstr "تم إرسال ملاحظتك بنجاح." @@ -19176,7 +24375,7 @@ msgid "Your Reference Number" msgstr "رقم مرجعك" #: templates/observations/public_success.html:88 -#: templates/observations/public_success.html:192 +#: templates/observations/public_success.html:188 msgid "Copy Code" msgstr "نسخ الرمز" @@ -19193,9 +24392,9 @@ msgid "" "You can track your observation status anytime using the reference number." msgstr "يمكنك تتبع حالة ملاحظتك في أي وقت باستخدام الرقم المرجعي." -#: templates/observations/public_success.html:188 +#: templates/observations/public_success.html:184 #: templates/social/partials/ai_analysis_bilingual.html:332 -#: templates/surveys/instance_detail.html:514 +#: templates/surveys/instance_detail.html:376 msgid "Copied!" msgstr "تم النسخ!" @@ -19205,102 +24404,754 @@ msgid "Track Your Observation" msgstr "تتبع ملاحظتك" #: templates/observations/public_track.html:108 -#, fuzzy -#| msgid "" -#| "Enter your reference number below to see real-time updates on your request." msgid "" "Enter your tracking code below to see real-time updates on your observation." -msgstr "أدخل رقم المرجع الخاص بك أدناه لترى تحديثات فورية على طلبك." - -#: templates/observations/public_track.html:125 -msgid "e.g., OBS-ABC123" -msgstr "مثال: OBS-ABC123" +msgstr "أدخل رمز التتبع الخاص بك أدناه لرؤية التحديثات الفورية على ملاحظتك." #: templates/observations/public_track.html:147 -#, fuzzy -#| msgid "Tracking Code" msgid "Tracking Code Not Found" -msgstr "رمز التتبع" +msgstr "رمز التتبع غير موجود" -#: templates/observations/public_track.html:259 -#, fuzzy -#| msgid "Your complaint is being reviewed. Updates will appear here." +#: templates/observations/public_track.html:242 msgid "Your observation is being reviewed. Updates will appear here." -msgstr "شكواك قيد المراجعة. ستظهر التحديثات هنا." +msgstr "يتم مراجعة ملاحظاتك. ستظهر التحديثات هنا." -#: templates/observations/public_track.html:267 +#: templates/observations/response_form_token.html:4 +msgid "Respond to Observation" +msgstr "الرد على الملاحظة" + +#: templates/observations/response_form_token.html:21 +#: templates/px_sources/source_user_create_observation.html:144 +msgid "Observation Details" +msgstr "تفاصيل الملاحظة" + +#: templates/observations/response_success_token.html:14 +msgid "Thank you for your response to observation" +msgstr "شكرًا لك على ردك على الملاحظة" + +#: templates/organizations/department_complaint_detail.html:69 +msgid "Review Response" +msgstr "مراجعة الرد" + +#: templates/organizations/department_complaint_detail.html:73 +msgid "Back to complaints" +msgstr "العودة إلى الشكاوى" + +#: templates/organizations/department_complaint_detail.html:93 +msgid "Short Description" +msgstr "الوصف المختصر" + +#: templates/organizations/department_complaint_detail.html:113 +#: templates/physicians/doctor_rating_import.html:86 +#: templates/px_sources/communication_request_detail.html:116 +#: templates/px_sources/source_user_create_communication_request.html:40 +#: templates/simulator/log_detail.html:244 +msgid "Patient MRN" +msgstr "الرقم الطبي للمريض (MRN)" + +#: templates/organizations/department_complaints.html:19 +msgid "Department Complaints" +msgstr "شكاوى القسم" + +#: templates/organizations/department_complaints.html:28 +msgid "Search complaints..." +msgstr "البحث في الشكاوى..." + +#: templates/organizations/department_confirm_delete.html:4 +#: templates/organizations/department_confirm_delete.html:14 +msgid "Delete Department" +msgstr "حذف القسم" + +#: templates/organizations/department_confirm_delete.html:16 +#, python-format msgid "" -"For privacy reasons, detailed notes and internal communications are not " -"shown here." +"Are you sure you want to delete %(department.name)s? This " +"action cannot be undone." msgstr "" -"لأسباب تتعلق بالخصوصية، لا يتم عرض الملاحظات التفصيلية والمراسلات الداخلية " -"هنا." +"هل أنت متأكد من رغبتك في حذف %(department.name)s؟ لا يمكن " +"التراجع عن هذا الإجراء." -#: templates/organizations/department_list.html:96 -msgid "Manage hospital departments and their structure" -msgstr "إدارة أقسام المستشفى وهيكلها" +#: templates/organizations/department_detail.html:76 +#: templates/organizations/department_list.html:161 +msgid "Sub of" +msgstr "تابع لـ" -#: templates/organizations/department_list.html:116 -msgid "Total Departments" -msgstr "إجمالي الأقسام" +#: templates/organizations/department_detail.html:83 +#: templates/organizations/department_form.html:4 +#: templates/organizations/department_form.html:75 +msgid "Edit Department" +msgstr "تعديل القسم" -#: templates/organizations/department_list.html:142 +#: templates/organizations/department_detail.html:106 +#: templates/px_sources/source_user_dashboard.html:67 +msgid "Open Complaints" +msgstr "الشكاوى المفتوحة" + +#: templates/organizations/department_detail.html:118 +msgid "Pending Inquiries" +msgstr "الاستفسارات المعلقة" + +#: templates/organizations/department_detail.html:130 +msgid "Open Observations" +msgstr "الملاحظات المفتوحة" + +#: templates/organizations/department_detail.html:145 +msgid "Pending Actions" +msgstr "الإجراءات المعلقة" + +#: templates/organizations/department_detail.html:146 +msgid "items awaiting response" +msgstr "العناصر بانتظار الرد" + +#: templates/organizations/department_detail.html:229 +msgid "Showing 10 of" +msgstr "عرض 10 من" + +#: templates/organizations/department_detail.html:229 +msgid "respond to items to see more" +msgstr "الرد على العناصر لرؤية المزيد" + +#: templates/organizations/department_detail.html:242 +msgid "Active Investigations" +msgstr "التحقيقات النشطة" + +#: templates/organizations/department_detail.html:243 +msgid "investigation(s) in progress" +msgstr "تحقيق/تحقيقات قيد التقدم" + +#: templates/organizations/department_detail.html:270 +msgid "staff" +msgstr "الموظفون" + +#: templates/organizations/department_detail.html:295 +#, fuzzy +#| msgid "View Progress" +msgid "View progress" +msgstr "عرض التقدم" + +#: templates/organizations/department_detail.html:312 +msgid "Action Required From You" +msgstr "إجراء مطلوب منك" + +#: templates/organizations/department_detail.html:313 +msgid "Items assigned to you that need your response" +msgstr "العناصر المسندة إليك والتي تحتاج ردك" + +#: templates/organizations/department_detail.html:327 +msgid "Investigation" +msgstr "التحقيق" + +#: templates/organizations/department_detail.html:333 +msgid "questions to answer" +msgstr "أسئلة يجب الإجابة عليها" + +#: templates/organizations/department_detail.html:344 +msgid "Answer Questions" +msgstr "الإجابة على الأسئلة" + +#: templates/organizations/department_detail.html:359 +msgid "Assigned to You" +msgstr "المسند إليك" + +#: templates/organizations/department_detail.html:417 +#: templates/organizations/section_list.html:4 +#: templates/organizations/section_list.html:56 +msgid "Sections" +msgstr "الأقسام" + +#: templates/organizations/department_detail.html:452 +#: templates/px_sources/source_user_complaint_list.html:174 +#: templates/px_sources/source_user_dashboard.html:39 +msgid "All Complaints" +msgstr "جميع الشكاوى" + +#: templates/organizations/department_detail.html:472 +#: templates/px_sources/source_user_observation_list.html:145 +msgid "All Observations" +msgstr "جميع الملاحظات" + +#: templates/organizations/department_detail.html:483 +#: templates/px_sources/source_user_suggestion_list.html:148 +msgid "All Suggestions" +msgstr "جميع الاقتراحات" + +#: templates/organizations/department_detail.html:520 +#: templates/organizations/staff_detail.html:392 +#: templates/organizations/staff_form.html:380 +#: templates/organizations/staff_list.html:270 +msgid "User Account" +msgstr "حساب المستخدم" + +#: templates/organizations/department_detail.html:536 +msgid "HEAD" +msgstr "الرأس" + +#: templates/organizations/department_detail.html:552 +msgid "No account" +msgstr "لا يوجد حساب" + +#: templates/organizations/department_detail.html:566 +msgid "No staff members in this department" +msgstr "لا يوجد أعضاء هيئة تدريس في هذا القسم" + +#: templates/organizations/department_detail.html:581 +msgid "" +"Manage who receives complaints, inquiries, and observations for this " +"department." +msgstr "إدارة من يتلقى الشكاوى والاستفسارات والملاحظات لهذا القسم." + +#: templates/organizations/department_detail.html:596 +msgid "Primary Contact" +msgstr "جهة الاتصال الرئيسية" + +#: templates/organizations/department_detail.html:625 +msgid "Change" +msgstr "تغيير" + +#: templates/organizations/department_detail.html:640 +msgid "Department Sections" +msgstr "أقسام القسم" + +#: templates/organizations/department_detail.html:642 +#: templates/organizations/orgsection_form.html:4 +#: templates/organizations/orgsection_form.html:76 +#: templates/organizations/orgsection_list.html:60 +#: templates/organizations/section_form.html:4 +#: templates/organizations/section_form.html:76 +#: templates/organizations/section_list.html:60 +msgid "Add Section" +msgstr "إضافة قسم" + +#: templates/organizations/department_detail.html:648 +msgid "Section Name" +msgstr "اسم القسم" + +#: templates/organizations/department_detail.html:650 +#: templates/organizations/orgsection_list.html:127 +msgid "Champion" +msgstr "الرائد" + +#: templates/organizations/department_detail.html:651 +msgid "Supervisor" +msgstr "مشرف" + +#: templates/organizations/department_detail.html:652 +msgid "Deputy" +msgstr "نائب" + +#: templates/organizations/department_detail.html:653 +#: templates/organizations/orgsection_detail.html:117 +#: templates/organizations/orgsection_detail.html:131 +msgid "Sub-Sections" +msgstr "الأقسام الفرعية" + +#: templates/organizations/department_detail.html:688 +msgid "No sections in this department" +msgstr "لا توجد أقسام في هذه الإدارة" + +#: templates/organizations/department_detail.html:748 +msgid "No complaints for this department" +msgstr "لا توجد شكاوى لهذه الإدارة" + +#: templates/organizations/department_detail.html:756 +#, python-format +msgid "View all %(counter)s complaint" +msgid_plural "View all %(counter)s complaints" +msgstr[0] "عرض جميع %(counter)s شكوى" +msgstr[1] "عرض جميع %(counter)s شكويين" +msgstr[2] "عرض جميع %(counter)s شكاوى" +msgstr[3] "عرض جميع %(counter)s شكوى" +msgstr[4] "عرض جميع %(counter)s شكوى" +msgstr[5] "عرض جميع %(counter)s شكوى" + +#: templates/organizations/department_detail.html:808 +msgid "No inquiries for this department" +msgstr "لا توجد استفسارات لهذه الإدارة" + +#: templates/organizations/department_detail.html:816 +#, python-format +msgid "View all %(counter)s inquiry" +msgid_plural "View all %(counter)s inquiries" +msgstr[0] "عرض جميع %(counter)s استفسار" +msgstr[1] "عرض جميع %(counter)s استفسارين" +msgstr[2] "عرض جميع %(counter)s استفسارات" +msgstr[3] "عرض جميع %(counter)s استفسارًا" +msgstr[4] "عرض جميع %(counter)s استفساراً" +msgstr[5] "عرض جميع %(counter)s استفسار" + +#: templates/organizations/department_detail.html:872 +msgid "No observations for this department" +msgstr "لا توجد ملاحظات لهذا القسم" + +#: templates/organizations/department_detail.html:880 +#, python-format +msgid "View all %(counter)s observation" +msgid_plural "View all %(counter)s observations" +msgstr[0] "عرض جميع %(counter)s ملاحظة" +msgstr[1] "عرض جميع %(counter)s ملاحظتين" +msgstr[2] "عرض جميع %(counter)s ملاحظات" +msgstr[3] "عرض جميع %(counter)s ملاحظة" +msgstr[4] "عرض جميع %(counter)s ملاحظة" +msgstr[5] "عرض جميع %(counter)s ملاحظة" + +#: templates/organizations/department_detail.html:938 +msgid "No suggestions for this department" +msgstr "لا توجد اقتراحات لهذا القسم" + +#: templates/organizations/department_detail.html:951 +#: templates/organizations/department_detail.html:1321 +#: templates/organizations/department_staff_detail.html:486 +msgid "Sender" +msgstr "المرسل" + +#: templates/organizations/department_detail.html:995 +msgid "No appreciations for this department" +msgstr "لا توجد تقديرات لهذا القسم" + +#: templates/organizations/department_detail.html:1006 +msgid "Loading analytics..." +msgstr "جارٍ تحميل التحليلات..." + +#: templates/organizations/department_detail.html:1014 +msgid "out of 5.0" +msgstr "من 5.0" + +#: templates/organizations/department_detail.html:1024 +msgid "PX actions pending" +msgstr "إجراءات PX المعلقة" + +#: templates/organizations/department_detail.html:1029 +msgid "resolution satisfaction" +msgstr "رضا الحل" + +#: templates/organizations/department_detail.html:1034 +msgid "reopened complaints" +msgstr "الشكاوى المعاد فتحها" + +#: templates/organizations/department_detail.html:1039 +msgid "reassigned complaints" +msgstr "الشكاوى المعاد تخصيصها" + +#: templates/organizations/department_detail.html:1045 +msgid "Complaint Trend" +msgstr "اتجاه الشكاوى" + +#: templates/organizations/department_detail.html:1049 +msgid "Physician Rating Trend" +msgstr "اتجاه تقييم الأطباء" + +#: templates/organizations/department_detail.html:1053 +msgid "Complaint Status" +msgstr "حالة الشكوى" + +#: templates/organizations/department_detail.html:1057 +msgid "Actions Overview" +msgstr "نظرة عامة على الإجراءات" + +#: templates/organizations/department_detail.html:1061 +msgid "Complaint Severity" +msgstr "شدة الشكوى" + +#: templates/organizations/department_detail.html:1065 +msgid "Satisfaction Distribution" +msgstr "توزيع الرضا" + +#: templates/organizations/department_detail.html:1069 +msgid "Top Physicians" +msgstr "أفضل الأطباء" + +#: templates/organizations/department_detail.html:1118 +#: templates/standards/department_standards.html:158 +#: templates/standards/search.html:225 +#: templates/standards/standard_detail.html:105 +msgid "Informational" +msgstr "معلوماتي" + +#: templates/organizations/department_detail.html:1126 +#: templates/standards/dashboard.html:161 +#: templates/standards/department_standards.html:181 +#: templates/standards/department_standards.html:264 +#: templates/standards/department_standards.html:333 +#: templates/standards/search.html:248 templates/standards/search.html:331 +#: templates/standards/search.html:465 +#: templates/standards/standard_detail.html:231 +#: templates/standards/standard_detail.html:485 +msgid "Not Assessed" +msgstr "غير مُقيَّم" + +#: templates/organizations/department_detail.html:1156 +msgid "Upload evidence" +msgstr "رفع الأدلة" + +#: templates/organizations/department_detail.html:1166 +msgid "No standards for this department" +msgstr "لا توجد معايير لهذا القسم" + +#: templates/organizations/department_detail.html:1184 +msgid "Set Role" +msgstr "تعيين الدور" + +#: templates/organizations/department_detail.html:1194 +msgid "-- Clear / Remove --" +msgstr "-- مسح / إزالة --" + +#: templates/organizations/department_detail.html:1201 +msgid "Leave blank to remove the current assignee." +msgstr "اتركه فارغًا لإزالة المسؤول الحالي." + +#: templates/organizations/department_detail.html:1220 +#: templates/standards/attachment_upload.html:4 +msgid "Upload Evidence" +msgstr "رفع الأدلة" + +#: templates/organizations/department_detail.html:1221 +msgid "Standard: " +msgstr "المعيار: " + +#: templates/organizations/department_detail.html:1237 +msgid "Accepted: PDF, DOC, XLS, images, ZIP (max 50MB)" +msgstr "المقبول: PDF, DOC, XLS, صور, ZIP (الحد الأقصى 50 ميغابايت)" + +#: templates/organizations/department_detail.html:1244 +msgid "Add a description for this evidence..." +msgstr "أضف وصفًا لهذا الدليل..." + +#: templates/organizations/department_detail.html:1253 +#: templates/references/dashboard.html:139 +#: templates/references/document_form.html:363 +#: templates/references/folder_view.html:178 +#: templates/references/folder_view.html:182 +#: templates/standards/attachment_upload.html:116 +#: templates/standards/compliance_form.html:262 +#: templates/standards/department_standards.html:434 +#: templates/standards/search.html:552 +#: templates/standards/standard_detail.html:561 +msgid "Upload" +msgstr "رفع" + +#: templates/organizations/department_detail.html:1320 +#: templates/organizations/department_staff_detail.html:485 +#: templates/standards/department_standards.html:758 +#: templates/standards/search.html:767 +#: templates/standards/standard_detail.html:788 +msgid "No description" +msgstr "لا يوجد وصف" + +#: templates/organizations/department_detail.html:1679 +#: templates/standards/department_standards.html:804 +#: templates/standards/search.html:790 +#: templates/standards/standard_detail.html:817 +msgid "Please select a file" +msgstr "الرجاء اختيار ملف" + +#: templates/organizations/department_detail.html:1687 +#: templates/standards/department_standards.html:812 +#: templates/standards/search.html:796 +#: templates/standards/standard_detail.html:824 +msgid "File size must be less than 50MB" +msgstr "يجب أن يكون حجم الملف أقل من 50 ميجابايت" + +#: templates/organizations/department_detail.html:1717 +#: templates/organizations/department_detail.html:1721 +#: templates/organizations/department_detail.html:1727 +#: templates/standards/department_standards.html:845 +#: templates/standards/department_standards.html:849 +#: templates/standards/department_standards.html:856 +#: templates/standards/search.html:822 templates/standards/search.html:826 +#: templates/standards/search.html:832 +#: templates/standards/standard_detail.html:850 +#: templates/standards/standard_detail.html:854 +#: templates/standards/standard_detail.html:860 +msgid "Upload failed" +msgstr "فشل التحميل" + +#: templates/organizations/department_detail.html:1814 +msgid "No trend data available" +msgstr "لا توجد بيانات اتجاهات متاحة" + +#: templates/organizations/department_detail.html:1833 +msgid "No physician rating data" +msgstr "لا توجد بيانات تقييم الأطباء" + +#: templates/organizations/department_detail.html:1849 +msgid "No status data" +msgstr "لا توجد بيانات الحالة" + +#: templates/organizations/department_detail.html:1865 +msgid "No actions data" +msgstr "لا توجد بيانات الإجراءات" + +#: templates/organizations/department_detail.html:1884 +msgid "No severity data" +msgstr "لا توجد بيانات الخطورة" + +#: templates/organizations/department_detail.html:1900 +msgid "No satisfaction data" +msgstr "لا توجد بيانات رضا" + +#: templates/organizations/department_detail.html:1916 +msgid "No physician data" +msgstr "لا توجد بيانات الأطباء" + +#: templates/organizations/department_detail.html:1932 +msgid "No category data" +msgstr "لا توجد بيانات الفئة" + +#: templates/organizations/department_form.html:4 +#: templates/organizations/department_form.html:75 +#: templates/organizations/department_list.html:59 +#: templates/organizations/department_list.html:240 +msgid "Add Department" +msgstr "إضافة قسم" + +#: templates/organizations/department_form.html:78 +msgid "Update department information" +msgstr "تحديث معلومات القسم" + +#: templates/organizations/department_form.html:78 +msgid "Create a new hospital department" +msgstr "إنشاء قسم مستشفى جديد" + +#: templates/organizations/department_form.html:90 +msgid "Enter department name" +msgstr "أدخل اسم القسم" + +#: templates/organizations/department_form.html:95 +msgid "Enter department name in Arabic" +msgstr "أدخل اسم القسم بالعربية" + +#: templates/organizations/department_form.html:100 +msgid "Enter department code" +msgstr "أدخل رمز القسم" + +#: templates/organizations/department_form.html:117 +msgid "No Manager" +msgstr "لا يوجد مدير" + +#: templates/organizations/department_form.html:148 +msgid "Building/Floor/Room" +msgstr "مبنى/طابق/غرفة" + +#: templates/organizations/department_inquiries.html:18 +msgid "Department Inquiries" +msgstr "استفسارات القسم" + +#: templates/organizations/department_inquiries.html:27 +msgid "Search inquiries..." +msgstr "البحث في الاستفسارات..." + +#: templates/organizations/department_inquiries.html:72 +#: templates/organizations/department_observations.html:73 +msgid "Response SLA" +msgstr "مستوى الخدمة للرد (SLA)" + +#: templates/organizations/department_inquiry_detail.html:46 +msgid "Back to inquiries" +msgstr "العودة إلى الاستفسارات" + +#: templates/organizations/department_list.html:54 +msgid "Manage hospital departments, staff, and assigned items" +msgstr "إدارة أقسام المستشفى والموظفين والعناصر المخصصة" + +#: templates/organizations/department_list.html:95 msgid "With Managers" msgstr "مع المديرين" -#: templates/organizations/department_list.html:155 +#: templates/organizations/department_list.html:119 msgid "Department List" msgstr "قائمة الأقسام" -#: templates/organizations/department_list.html:164 -#: templates/organizations/staff_list.html:264 -msgid "Manager" -msgstr "المدير" +#: templates/organizations/department_list.html:124 +msgid "Search departments..." +msgstr "البحث في الأقسام..." -#: templates/organizations/department_list.html:213 +#: templates/organizations/department_list.html:236 #: templates/standards/dashboard.html:228 msgid "No departments found" msgstr "لا توجد أقسام" -#: templates/organizations/department_list.html:214 -msgid "Add your first department to get started" -msgstr "أضف قسمك الأول للبدء" +#: templates/organizations/department_manager_review.html:21 +msgid "Review Champion Response" +msgstr "مراجعة رد البطل" + +#: templates/organizations/department_manager_review.html:74 +#, fuzzy +#| msgid "Select Accused Staff" +msgid "Accused Staff" +msgstr "اختيار الموظفين المتهمين" + +#: templates/organizations/department_manager_review.html:107 +#, fuzzy +#| msgid "Investigation Questions" +msgid "Investigation Questions & Answers" +msgstr "أسئلة التحقيق" + +#: templates/organizations/department_manager_review.html:135 +msgid "Q" +msgstr "" + +#: templates/organizations/department_manager_review.html:137 +msgid "Answer" +msgstr "" + +#: templates/organizations/department_manager_review.html:154 +msgid "Champion Response" +msgstr "رد البطل" + +#: templates/organizations/department_manager_review.html:182 +msgid "Review Questions" +msgstr "مراجعة الأسئلة" + +#: templates/organizations/department_manager_review.html:246 +msgid "Rejection Reason" +msgstr "سبب الرفض" + +#: templates/organizations/department_manager_review.html:250 +msgid "Please explain why you are rejecting this response..." +msgstr "يرجى توضيح سبب رفضك لهذا الرد..." + +#: templates/organizations/department_manager_review.html:256 +msgid "Approve & Forward to PX Team" +msgstr "الموافقة وإرسال إلى فريق تجربة المريض" + +#: templates/organizations/department_manager_review.html:260 +msgid "Reject & Return to Champion" +msgstr "الرفض والإرجاع إلى الممثل الرئيسي" + +#: templates/organizations/department_observation_detail.html:50 +msgid "Back to observations" +msgstr "العودة إلى الملاحظات" + +#: templates/organizations/department_observation_detail.html:73 +msgid "Assigned Department" +msgstr "القسم المخصص" + +#: templates/organizations/department_observation_detail.html:92 +msgid "Forwarded At" +msgstr "تم الإرسال في" + +#: templates/organizations/department_observations.html:18 +msgid "Department Observations" +msgstr "ملاحظات القسم" + +#: templates/organizations/department_observations.html:27 +msgid "Search observations..." +msgstr "البحث في الملاحظات..." + +#: templates/organizations/department_staff_detail.html:28 +#: templates/organizations/section_list.html:126 +#: templates/organizations/subsection_list.html:126 +msgid "Head" +msgstr "الرئيس" + +#: templates/organizations/department_staff_detail.html:46 +msgid "Back to staff" +msgstr "العودة إلى الموظفين" + +#: templates/organizations/department_staff_detail.html:55 +msgid "Personal Info" +msgstr "المعلومات الشخصية" + +#: templates/organizations/department_staff_detail.html:73 +#: templates/organizations/staff_form.html:171 +msgid "Staff Type" +msgstr "نوع الموظف" + +#: templates/organizations/department_staff_detail.html:78 +#: templates/organizations/department_staff_detail.html:406 +msgid "License No." +msgstr "رقم الترخيص" + +#: templates/organizations/department_staff_detail.html:116 +#: templates/organizations/staff_detail.html:158 +#: templates/organizations/staff_hierarchy.html:235 +msgid "Reports To" +msgstr "يتبع إداريًا لـ" + +#: templates/organizations/department_staff_detail.html:150 +#: templates/organizations/staff_detail.html:170 +#: templates/organizations/staff_hierarchy.html:236 +msgid "Direct Reports" +msgstr "المرؤوسون المباشرون" + +#: templates/organizations/department_staff_detail.html:269 +msgid "No complaints found for this staff member in this department." +msgstr "لم يتم العثور على شكاوى لهذا الموظف في هذا القسم." + +#: templates/organizations/department_staff_detail.html:342 +msgid "Edit Staff Info" +msgstr "تعديل معلومات الموظف" + +#: templates/organizations/department_staff_detail.html:365 +#: templates/organizations/staff_detail.html:72 +#: templates/organizations/staff_form.html:143 +msgid "First Name (Arabic)" +msgstr "الاسم الأول (بالعربية)" + +#: templates/organizations/department_staff_detail.html:370 +#: templates/organizations/staff_detail.html:76 +#: templates/organizations/staff_form.html:152 +msgid "Last Name (Arabic)" +msgstr "اسم العائلة (بالعربية)" + +#: templates/organizations/department_staff_detail.html:382 +msgid "Job Title (Arabic)" +msgstr "المسمى الوظيفي (بالعربية)" + +#: templates/organizations/department_staff_detail.html:401 +#: templates/organizations/physician_list.html:79 +#: templates/organizations/staff_detail.html:87 +#: templates/organizations/staff_form.html:261 +#: templates/physicians/department_overview.html:108 +#: templates/physicians/leaderboard.html:199 +#: templates/physicians/physician_detail.html:367 +#: templates/physicians/physician_list.html:194 +#: templates/physicians/physician_ratings_dashboard.html:456 +#: templates/physicians/ratings_list.html:198 +msgid "Specialization" +msgstr "التخصص" + +#: templates/organizations/department_staff_detail.html:412 +#: templates/organizations/patient_detail.html:232 +#: templates/organizations/patient_list.html:240 +msgid "Gender" +msgstr "الجنس" #: templates/organizations/emails/staff_credentials.html:4 -msgid "Your PX360 Account Credentials - Al Hammadi Hospital" -msgstr "بيانات دخول حساب PX360 الخاص بك - مستشفى الحمادي" +msgid "Set Your PX360 Password - Al Hammadi Hospital" +msgstr "تعيين كلمة مرور PX360 - مستشفى الحمادي" -#: templates/organizations/emails/staff_credentials.html:6 -msgid "" -"Your PX360 account has been created. Find your login credentials below." +#: templates/organizations/emails/staff_credentials.html:5 +msgid "Your PX360 account has been created. Set your password securely." msgstr "" -"تم إنشاء حساب PX360 الخاص بك. ابحث عن بيانات تسجيل الدخول الخاصة بك أدناه." +"تم إنشاء حساب PX360 الخاص بك. قم بتعيين كلمة المرور الخاصة بك بشكل آمن." -#: templates/organizations/emails/staff_credentials.html:10 +#: templates/organizations/emails/staff_credentials.html:13 msgid "" -"Your account has been created successfully. Below are your login " -"credentials." -msgstr "تم إنشاء حسابك بنجاح. أدناه هي بيانات تسجيل الدخول الخاصة بك." +"Your PX360 account has been created. For your security, no password is sent " +"by email. Use the button below to set your password." +msgstr "" +"تم إنشاء حساب PX360 الخاص بك. ولأمنك، لا يتم إرسال كلمة المرور عبر البريد " +"الإلكتروني. استخدم الزر أدناه لتعيين كلمة المرور الخاصة بك." -#: templates/organizations/emails/staff_credentials.html:27 -msgid "Your Account Details" -msgstr "تفاصيل حسابك" - -#: templates/organizations/emails/staff_credentials.html:32 +#: templates/organizations/emails/staff_credentials.html:16 msgid "Username:" msgstr "اسم المستخدم:" -#: templates/organizations/emails/staff_credentials.html:66 +#: templates/organizations/emails/staff_credentials.html:20 msgid "" "Please change your password after your first login for security purposes." msgstr "يرجى تغيير كلمة المرور بعد تسجيل الدخول الأول لأغراض الأمان." -#: templates/organizations/emails/staff_credentials.html:78 +#: templates/organizations/emails/staff_credentials.html:28 +msgid "Set Password" +msgstr "تعيين كلمة المرور" + +#: templates/organizations/emails/staff_credentials.html:35 msgid "" "If you have any questions or need assistance, please contact your system " "administrator." -msgstr "" -"إذا كان لديك أي أسئلة أو تحتاج إلى مساعدة، يرجى الاتصال بمسؤول النظام." +msgstr "إذا كان لديك أي أسئلة أو تحتاج إلى مساعدة، يرجى الاتصال بمسؤول النظام." #: templates/organizations/hierarchy_node.html:55 msgid "Direct Report" @@ -19328,7 +25179,7 @@ msgid "Hospital List" msgstr "قائمة المستشفيات" #: templates/organizations/hospital_list.html:163 -#: templates/organizations/patient_detail.html:257 +#: templates/organizations/patient_detail.html:252 msgid "City" msgstr "المدينة" @@ -19340,6 +25191,281 @@ msgstr "لم يتم العثور على مستشفيات" msgid "Add your first hospital to get started" msgstr "أضف مستشفاك الأول للبدء" +#: templates/organizations/manager_review_question_form.html:4 +#: templates/organizations/manager_review_question_form.html:18 +msgid "Edit Question" +msgstr "تعديل السؤال" + +#: templates/organizations/manager_review_question_form.html:4 +#: templates/organizations/manager_review_question_form.html:18 +msgid "Create Question" +msgstr "إنشاء سؤال" + +#: templates/organizations/manager_review_question_form.html:9 +#: templates/organizations/manager_review_questions.html:4 +#: templates/organizations/manager_review_questions.html:10 +msgid "Manager Review Questions" +msgstr "أسئلة مراجعة المدير" + +#: templates/organizations/manager_review_question_form.html:26 +msgid "Question Text (English)" +msgstr "نص السؤال (بالإنجليزية)" + +#: templates/organizations/manager_review_question_form.html:30 +msgid "Enter the question in English..." +msgstr "أدخل السؤال باللغة الإنجليزية..." + +#: templates/organizations/manager_review_question_form.html:35 +msgid "Question Text (Arabic)" +msgstr "نص السؤال (بالعربية)" + +#: templates/organizations/manager_review_question_form.html:39 +msgid "أدخل السؤال باللغة العربية..." +msgstr "أدخل السؤال باللغة العربية..." + +#: templates/organizations/manager_review_question_form.html:44 +#: templates/surveys/template_form.html:389 +#: templates/surveys/template_form.html:538 +msgid "Question Type" +msgstr "نوع السؤال" + +#: templates/organizations/manager_review_question_form.html:61 +msgid "Choices (for Multiple Choice)" +msgstr "الخيارات (للاختيار من متعدد)" + +#: templates/organizations/manager_review_question_form.html:66 +msgid "e.g. Option A, Option B, Option C" +msgstr "مثال: الخيار أ، الخيار ب، الخيار ج" + +#: templates/organizations/manager_review_question_form.html:67 +msgid "" +"Comma-separated values or JSON array. Only used for Multiple Choice type." +msgstr "قيم مفصولة بفواصل أو مصفوفة JSON. تُستخدم فقط لنوع الاختيار من متعدد." + +#: templates/organizations/manager_review_questions.html:11 +msgid "" +"Configure questions shown to department managers when reviewing champion " +"responses." +msgstr "تكوين الأسئلة التي تظهر لمديري الأقسام عند مراجعة ردود الممثلين." + +#: templates/organizations/manager_review_questions.html:25 +#: templates/surveys/instance_detail.html:134 +msgid "Question" +msgstr "سؤال" + +#: templates/organizations/manager_review_questions.html:58 +msgid "Delete this question?" +msgstr "حذف هذا السؤال؟" + +#: templates/organizations/manager_review_questions.html:74 +msgid "No questions configured yet." +msgstr "لم يتم تكوين أي أسئلة بعد." + +#: templates/organizations/manager_review_questions.html:77 +msgid "Add First Question" +msgstr "إضافة السؤال الأول" + +#: templates/organizations/orgsection_confirm_delete.html:4 +#: templates/organizations/orgsection_confirm_delete.html:14 +#: templates/organizations/section_confirm_delete.html:4 +#: templates/organizations/section_confirm_delete.html:14 +msgid "Delete Section" +msgstr "حذف القسم" + +#: templates/organizations/orgsection_confirm_delete.html:16 +#, python-format +msgid "" +"Are you sure you want to delete %(section.name_en)s? This " +"action cannot be undone." +msgstr "" +"هل أنت متأكد من رغبتك في حذف %(section.name_en)s؟ لا يمكن " +"التراجع عن هذا الإجراء." + +#: templates/organizations/orgsection_detail.html:4 +msgid "Org Section" +msgstr "قسم المؤسسة" + +#: templates/organizations/orgsection_detail.html:103 +#: templates/organizations/orgsection_form.html:4 +#: templates/organizations/orgsection_form.html:76 +#: templates/organizations/section_form.html:4 +#: templates/organizations/section_form.html:76 +msgid "Edit Section" +msgstr "تعديل القسم" + +#: templates/organizations/orgsection_detail.html:134 +#: templates/organizations/orgsubsection_form.html:4 +#: templates/organizations/orgsubsection_form.html:88 +#: templates/organizations/orgsubsection_list.html:60 +msgid "Add Sub-Section" +msgstr "إضافة قسم فرعي" + +#: templates/organizations/orgsection_detail.html:142 +#: templates/organizations/orgsection_list.html:123 +#: templates/organizations/orgsubsection_form.html:124 +#: templates/organizations/orgsubsection_list.html:123 +#: templates/px_sources/source_list.html:197 +msgid "Name (AR)" +msgstr "الاسم (بالعربية)" + +#: templates/organizations/orgsection_detail.html:182 +#: templates/organizations/orgsubsection_list.html:173 +msgid "No sub-sections found" +msgstr "لم يتم العثور على أقسام فرعية" + +#: templates/organizations/orgsection_form.html:79 +#: templates/organizations/section_form.html:79 +msgid "Update section information" +msgstr "تحديث معلومات القسم" + +#: templates/organizations/orgsection_form.html:79 +msgid "Create a new org section" +msgstr "إنشاء قسم مؤسسة جديد" + +#: templates/organizations/orgsection_form.html:100 +msgid "Section Name (EN)" +msgstr "اسم القسم (بالإنجليزية)" + +#: templates/organizations/orgsection_form.html:101 +msgid "Enter section name in English" +msgstr "أدخل اسم القسم باللغة الإنجليزية" + +#: templates/organizations/orgsection_form.html:105 +msgid "Section Name (AR)" +msgstr "اسم القسم (بالعربية)" + +#: templates/organizations/orgsection_form.html:106 +#: templates/organizations/section_form.html:96 +msgid "Enter section name in Arabic" +msgstr "أدخل اسم القسم باللغة العربية" + +#: templates/organizations/orgsection_form.html:111 +#: templates/organizations/section_form.html:101 +msgid "Enter section code" +msgstr "أدخل رمز القسم" + +#: templates/organizations/orgsection_form.html:118 +#: templates/surveys/template_form.html:438 +#: templates/surveys/template_form.html:586 +msgid "OP" +msgstr "العيادات الخارجية" + +#: templates/organizations/orgsection_form.html:120 +msgid "ER" +msgstr "الطوارئ" + +#: templates/organizations/orgsection_form.html:126 +msgid "Sub Location" +msgstr "الموقع الفرعي" + +#: templates/organizations/orgsection_form.html:127 +msgid "Enter sub location" +msgstr "أدخل الموقع الفرعي" + +#: templates/organizations/orgsection_form.html:132 +msgid "Enter floor" +msgstr "أدخل الطابق" + +#: templates/organizations/orgsection_list.html:4 +#: templates/organizations/orgsection_list.html:56 +msgid "Org Sections" +msgstr "أقسام المؤسسة" + +#: templates/organizations/orgsection_list.html:57 +msgid "Manage organization sections" +msgstr "إدارة أقسام المؤسسة" + +#: templates/organizations/orgsection_list.html:77 +#: templates/organizations/section_list.html:77 +msgid "Search sections..." +msgstr "البحث في الأقسام..." + +#: templates/organizations/orgsection_list.html:116 +#: templates/organizations/section_list.html:116 +msgid "Sections List" +msgstr "قائمة الأقسام" + +#: templates/organizations/orgsection_list.html:180 +#: templates/organizations/section_list.html:173 +msgid "No sections found" +msgstr "لم يتم العثور على أقسام" + +#: templates/organizations/orgsection_list.html:192 +#: templates/organizations/orgsubsection_list.html:185 +#: templates/organizations/section_list.html:185 +#: templates/organizations/subsection_list.html:185 +#, python-format +msgid "%(current)s of %(total)s" +msgstr "%(current)s من %(total)s" + +#: templates/organizations/orgsubsection_confirm_delete.html:4 +#: templates/organizations/orgsubsection_confirm_delete.html:14 +msgid "Delete Sub-Section" +msgstr "حذف القسم الفرعي" + +#: templates/organizations/orgsubsection_confirm_delete.html:16 +#, python-format +msgid "" +"Are you sure you want to delete %(sub_section.name_en)s? " +"This action cannot be undone." +msgstr "" +"هل أنت متأكد من أنك تريد حذف %(sub_section.name_en)s؟ لا " +"يمكن التراجع عن هذا الإجراء." + +#: templates/organizations/orgsubsection_confirm_delete.html:30 +#: templates/organizations/orgsubsection_form.html:102 +#: templates/organizations/orgsubsection_list.html:80 +#: templates/organizations/orgsubsection_list.html:125 +msgid "Parent Section" +msgstr "القسم الأصلي" + +#: templates/organizations/orgsubsection_form.html:4 +#: templates/organizations/orgsubsection_form.html:88 +msgid "Edit Sub-Section" +msgstr "تعديل القسم الفرعي" + +#: templates/organizations/orgsubsection_form.html:91 +msgid "Update sub-section information" +msgstr "تحديث معلومات القسم الفرعي" + +#: templates/organizations/orgsubsection_form.html:91 +msgid "Create a new sub-section" +msgstr "إنشاء قسم فرعي جديد" + +#: templates/organizations/orgsubsection_form.html:120 +msgid "Enter sub-section name in English" +msgstr "أدخل اسم القسم الفرعي باللغة الإنجليزية" + +#: templates/organizations/orgsubsection_form.html:125 +msgid "Enter sub-section name in Arabic" +msgstr "أدخل اسم القسم الفرعي باللغة العربية" + +#: templates/organizations/orgsubsection_form.html:130 +msgid "Enter sub-section code" +msgstr "أدخل رمز القسم الفرعي" + +#: templates/organizations/orgsubsection_list.html:4 +#: templates/organizations/orgsubsection_list.html:56 +msgid "Org Sub-Sections" +msgstr "الأقسام الفرعية للمؤسسة" + +#: templates/organizations/orgsubsection_list.html:57 +msgid "Manage organization sub-sections" +msgstr "إدارة الأقسام الفرعية للمؤسسة" + +#: templates/organizations/orgsubsection_list.html:77 +msgid "Search sub-sections..." +msgstr "البحث في الأقسام الفرعية..." + +#: templates/organizations/orgsubsection_list.html:82 +#: templates/organizations/subsection_list.html:82 +msgid "All Sections" +msgstr "جميع الأقسام" + +#: templates/organizations/orgsubsection_list.html:116 +msgid "Sub-Sections List" +msgstr "قائمة الأقسام الفرعية" + #: templates/organizations/patient_confirm_delete.html:5 #: templates/organizations/patient_confirm_delete.html:15 #: templates/organizations/patient_confirm_delete.html:51 @@ -19356,90 +25482,75 @@ msgid "Patient Details" msgstr "تفاصيل المريض" #: templates/organizations/patient_detail.html:167 -#: templates/organizations/patient_list.html:503 +#: templates/organizations/patient_list.html:523 msgid "SSN" msgstr "رقم الضمان الاجتماعي" -#: templates/organizations/patient_detail.html:170 -#: templates/organizations/patient_list.html:294 -msgid "Toggle" -msgstr "تبديل" - -#: templates/organizations/patient_detail.html:194 -msgid "No phone number on file" -msgstr "لا يوجد رقم هاتف مسجل" - -#: templates/organizations/patient_detail.html:198 -#, fuzzy -#| msgid "Send Complaint Notification" -msgid "Send Complaint Link To Patient" -msgstr "إرسال إشعار الشكوى" - -#: templates/organizations/patient_detail.html:237 -#: templates/organizations/patient_list.html:220 -msgid "Gender" -msgstr "الجنس" - -#: templates/organizations/patient_detail.html:241 +#: templates/organizations/patient_detail.html:236 msgid "Date of Birth" msgstr "تاريخ الميلاد" -#: templates/organizations/patient_detail.html:245 -#: templates/organizations/patient_list.html:228 -#: templates/organizations/patient_list.html:265 -#: templates/organizations/patient_list.html:505 -#: templates/organizations/patient_visit_journey.html:333 +#: templates/organizations/patient_detail.html:240 +#: templates/organizations/patient_list.html:248 +#: templates/organizations/patient_list.html:285 +#: templates/organizations/patient_list.html:525 +#: templates/organizations/patient_visit_journey.html:392 msgid "Nationality" msgstr "الجنسية" -#: templates/organizations/patient_detail.html:276 -#: templates/organizations/patient_detail.html:545 +#: templates/organizations/patient_detail.html:271 +#: templates/organizations/patient_detail.html:540 msgid "HIS Visits" msgstr "زيارات نظام معلومات المستشفى" -#: templates/organizations/patient_detail.html:303 +#: templates/organizations/patient_detail.html:298 msgid "Adm ID" msgstr "رقم المريض" -#: templates/organizations/patient_detail.html:305 -#: templates/standards/standard_form.html:311 +#: templates/organizations/patient_detail.html:300 +#: templates/projects/focus_phase_detail.html:88 +#: templates/projects/pdca_phase_detail.html:87 +#: templates/standards/standard_form.html:381 msgid "Dates" msgstr "التواريخ" -#: templates/organizations/patient_detail.html:307 -#: templates/organizations/patient_visit_journey.html:135 -msgid "Insurance" -msgstr "التأمين" - -#: templates/organizations/patient_detail.html:309 +#: templates/organizations/patient_detail.html:304 #: templates/simulator/log_detail.html:145 -#: templates/surveys/instance_detail.html:661 +#: templates/surveys/instance_detail.html:523 msgid "Journey" msgstr "رحلة المريض" -#: templates/organizations/patient_detail.html:361 +#: templates/organizations/patient_detail.html:356 #: templates/organizations/patient_visit_journey.html:100 msgid "Survey Sent" msgstr "تم إرسال الاستبيان" -#: templates/organizations/patient_detail.html:369 +#: templates/organizations/patient_detail.html:364 msgid "View visit journey" msgstr "عرض مسار الزيارة" -#: templates/organizations/patient_detail.html:382 +#: templates/organizations/patient_detail.html:377 msgid "No HIS visits found" msgstr "لم يتم العثور على زيارات HIS" -#: templates/organizations/patient_detail.html:442 +#: templates/organizations/patient_detail.html:437 #: templates/surveys/instance_list.html:212 msgid "No surveys found" msgstr "لا توجد استبيانات" -#: templates/organizations/patient_detail.html:601 +#: templates/organizations/patient_detail.html:532 +#: templates/simulator/log_list.html:280 +#: templates/social/comment_detail.html:171 +#: templates/social/partials/ai_analysis_bilingual.html:75 +#: templates/surveys/instance_detail.html:281 +msgid "Summary" +msgstr "ملخص" + +#: templates/organizations/patient_detail.html:596 msgid "Record Info" msgstr "معلومات السجل" -#: templates/organizations/patient_detail.html:653 +#: templates/organizations/patient_detail.html:648 msgid "Complaint Link" msgstr "رابط الشكوى" @@ -19456,84 +25567,81 @@ msgstr "المعلومات الأساسية" msgid "Save Patient" msgstr "حفظ المريض" -#: templates/organizations/patient_list.html:124 +#: templates/organizations/patient_list.html:144 msgid "Manage patient records and information" msgstr "إدارة سجلات وبيانات المرضى" -#: templates/organizations/patient_list.html:129 -#: templates/organizations/patient_list.html:445 +#: templates/organizations/patient_list.html:149 +#: templates/organizations/patient_list.html:457 msgid "Search HIS" msgstr "البحث في نظام معلومات المستشفى" -#: templates/organizations/patient_list.html:137 +#: templates/organizations/patient_list.html:157 msgid "Add Patient" msgstr "إضافة مريض" -#: templates/organizations/patient_list.html:153 +#: templates/organizations/patient_list.html:173 msgid "Total Patients" msgstr "إجمالي المرضى" -#: templates/organizations/patient_list.html:192 +#: templates/organizations/patient_list.html:212 msgid "Encounters" msgstr "المواعيد" -#: templates/organizations/patient_list.html:208 +#: templates/organizations/patient_list.html:228 msgid "Name, MRN, SSN, Phone..." msgstr "الاسم، رقم المريض، رقم الضمان الاجتماعي، الهاتف..." -#: templates/organizations/patient_list.html:241 +#: templates/organizations/patient_list.html:261 #: templates/px_sources/source_user_complaint_list.html:158 #: templates/px_sources/source_user_inquiry_list.html:146 +#: templates/px_sources/source_user_observation_list.html:130 +#: templates/px_sources/source_user_suggestion_list.html:133 msgid "Clear filters" msgstr "مسح عوامل التصفية" -#: templates/organizations/patient_list.html:254 +#: templates/organizations/patient_list.html:274 msgid "Patient List" msgstr "قائمة المرضى" -#: templates/organizations/patient_list.html:263 -#: templates/surveys/his_patient_import.html:135 -msgid "National ID" -msgstr "رقم الهوية الوطنية" - -#: templates/organizations/patient_list.html:350 -#: templates/organizations/patient_list.html:521 +#: templates/organizations/patient_list.html:362 +#: templates/organizations/patient_list.html:542 msgid "No patients found" msgstr "لم يتم العثور على مرضى" -#: templates/organizations/patient_list.html:351 +#: templates/organizations/patient_list.html:363 msgid "Try adjusting your filters or add a new patient" msgstr "جرب تعديل عوامل التصفية أو أضف مريضًا جديدًا" -#: templates/organizations/patient_list.html:355 +#: templates/organizations/patient_list.html:367 msgid "Add First Patient" msgstr "إضافة أول مريض" -#: templates/organizations/patient_list.html:446 +#: templates/organizations/patient_list.html:458 msgid "Search for patients in the Hospital Information System" msgstr "ابحث عن المرضى في نظام معلومات المستشفى" -#: templates/organizations/patient_list.html:458 +#: templates/organizations/patient_list.html:470 msgid "National ID (SSN)" msgstr "الهوية الوطنية (رقم الضمان الاجتماعي)" -#: templates/organizations/patient_list.html:469 +#: templates/organizations/patient_list.html:481 msgid "Enter SSN or mobile number to search" msgstr "أدخل رقم السجل المدني أو رقم الجوال للبحث" -#: templates/organizations/patient_list.html:490 +#: templates/organizations/patient_list.html:502 msgid "Searching HIS..." msgstr "جاري البحث في نظام HIS..." -#: templates/organizations/patient_list.html:504 +#: templates/organizations/patient_list.html:524 msgid "Mobile" msgstr "الجوال" -#: templates/organizations/patient_list.html:522 +#: templates/organizations/patient_list.html:543 msgid "Try a different SSN or mobile number" msgstr "جرب رقم سجل مدني أو رقم جوال مختلف" -#: templates/organizations/patient_list.html:530 +#: templates/organizations/patient_list.html:551 msgid "Enter a National ID or Mobile number to search" msgstr "أدخل رقم الهوية الوطنية أو رقم الجوال للبحث" @@ -19543,53 +25651,95 @@ msgstr "أدخل رقم الهوية الوطنية أو رقم الجوال ل msgid "Visit Journey" msgstr "مسار الزيارة" -#: templates/organizations/patient_visit_journey.html:150 -#: templates/surveys/instance_detail.html:633 +#: templates/organizations/patient_visit_journey.html:142 +#: templates/organizations/patient_visit_journey.html:235 +msgid "Total Duration" +msgstr "المدة الإجمالية" + +#: templates/organizations/patient_visit_journey.html:144 +msgid "First → Last event" +msgstr "الحدث الأول ← الأخير" + +#: templates/organizations/patient_visit_journey.html:155 +#: templates/surveys/instance_detail.html:495 msgid "Visit Timeline" msgstr "الجدول الزمني للزيارة" -#: templates/organizations/patient_visit_journey.html:151 +#: templates/organizations/patient_visit_journey.html:156 msgid "events" msgstr "الأحداث" -#: templates/organizations/patient_visit_journey.html:203 +#: templates/organizations/patient_visit_journey.html:218 msgid "No timeline events recorded for this visit" msgstr "لا توجد أحداث مسجلة في الجدول الزمني لهذه الزيارة" -#: templates/organizations/patient_visit_journey.html:257 +#: templates/organizations/patient_visit_journey.html:239 +msgid "Avg Step Time" +msgstr "متوسط وقت الخطوة" + +#: templates/organizations/patient_visit_journey.html:243 +msgid "Longest Wait" +msgstr "أطول انتظار" + +#: templates/organizations/patient_visit_journey.html:247 +msgid "Total Steps" +msgstr "إجمالي الخطوات" + +#: templates/organizations/patient_visit_journey.html:256 +msgid "Time Between Events (min)" +msgstr "الوقت بين الأحداث (دقيقة)" + +#: templates/organizations/patient_visit_journey.html:261 +msgid "Time Distribution" +msgstr "توزيع الوقت" + +#: templates/organizations/patient_visit_journey.html:316 msgid "Medical Team" msgstr "الفريق الطبي" -#: templates/organizations/patient_visit_journey.html:262 -#: templates/organizations/patient_visit_journey.html:279 +#: templates/organizations/patient_visit_journey.html:321 +#: templates/organizations/patient_visit_journey.html:338 msgid "Primary Doctor" msgstr "الطبيب الرئيسي" -#: templates/organizations/patient_visit_journey.html:286 -#: templates/organizations/patient_visit_journey.html:303 +#: templates/organizations/patient_visit_journey.html:345 +#: templates/organizations/patient_visit_journey.html:362 msgid "Consultant" msgstr "استشاري" -#: templates/organizations/patient_visit_journey.html:316 +#: templates/organizations/patient_visit_journey.html:375 msgid "Visit Details" msgstr "تفاصيل الزيارة" -#: templates/organizations/patient_visit_journey.html:321 +#: templates/organizations/patient_visit_journey.html:380 msgid "Company" msgstr "الشركة" -#: templates/organizations/patient_visit_journey.html:327 +#: templates/organizations/patient_visit_journey.html:386 msgid "Grade" msgstr "الدرجة" -#: templates/organizations/patient_visit_journey.html:338 +#: templates/organizations/patient_visit_journey.html:397 msgid "Patient ID (HIS)" msgstr "معرف المريض (HIS)" -#: templates/organizations/patient_visit_journey.html:343 +#: templates/organizations/patient_visit_journey.html:402 msgid "Last HIS Sync" msgstr "آخر مزامنة مع نظام معلومات المستشفى" +#: templates/organizations/patient_visit_journey.html:448 +msgid "Minutes" +msgstr "دقائق" + +#: templates/organizations/patient_visit_journey.html:455 +msgid "No intervals" +msgstr "لا توجد فترات زمنية" + +#: templates/organizations/patient_visit_journey.html:490 +#: templates/physicians/physician_list.html:243 +msgid "No data" +msgstr "لا توجد بيانات" + #: templates/organizations/physician_list.html:57 msgid "Manage hospital physicians and medical staff" msgstr "إدارة أطباء المستشفى والطاقم الطبي" @@ -19609,15 +25759,10 @@ msgstr "الترخيص" #: templates/organizations/physician_list.html:128 #: templates/physicians/physician_list.html:270 -#: templates/physicians/physician_ratings_dashboard.html:765 +#: templates/physicians/physician_ratings_dashboard.html:774 msgid "No physicians found" msgstr "لم يتم العثور على أطباء" -#: templates/organizations/section_confirm_delete.html:4 -#: templates/organizations/section_confirm_delete.html:14 -msgid "Delete Section" -msgstr "حذف القسم" - #: templates/organizations/section_confirm_delete.html:16 #, python-format msgid "" @@ -19627,21 +25772,6 @@ msgstr "" "هل أنت متأكد من رغبتك في حذف %(section.name)s؟ لا يمكن " "التراجع عن هذا الإجراء." -#: templates/organizations/section_form.html:4 -#: templates/organizations/section_form.html:76 -msgid "Edit Section" -msgstr "تعديل القسم" - -#: templates/organizations/section_form.html:4 -#: templates/organizations/section_form.html:76 -#: templates/organizations/section_list.html:60 -msgid "Add Section" -msgstr "إضافة قسم" - -#: templates/organizations/section_form.html:79 -msgid "Update section information" -msgstr "تحديث معلومات القسم" - #: templates/organizations/section_form.html:79 msgid "Create a new hospital section" msgstr "إنشاء قسم مستشفى جديد" @@ -19650,59 +25780,14 @@ msgstr "إنشاء قسم مستشفى جديد" msgid "Enter section name" msgstr "أدخل اسم القسم" -#: templates/organizations/section_form.html:96 -msgid "Enter section name in Arabic" -msgstr "أدخل اسم القسم باللغة العربية" - -#: templates/organizations/section_form.html:101 -msgid "Enter section code" -msgstr "أدخل رمز القسم" - -#: templates/organizations/section_list.html:4 -#: templates/organizations/section_list.html:56 -msgid "Sections" -msgstr "الأقسام" - #: templates/organizations/section_list.html:57 msgid "Manage hospital sections and departments" msgstr "إدارة أقسام وفروع المستشفى" -#: templates/organizations/section_list.html:77 -msgid "Search sections..." -msgstr "البحث في الأقسام..." - -#: templates/organizations/section_list.html:116 -msgid "Sections List" -msgstr "قائمة الأقسام" - -#: templates/organizations/section_list.html:126 -#: templates/organizations/subsection_list.html:126 -msgid "Head" -msgstr "الرئيس" - -#: templates/organizations/section_list.html:173 -msgid "No sections found" -msgstr "لم يتم العثور على أقسام" - -#: templates/organizations/section_list.html:185 -#: templates/organizations/subsection_list.html:185 -#, python-format -msgid "%(current)s of %(total)s" -msgstr "%(current)s من %(total)s" - -#: templates/organizations/staff_detail.html:4 -msgid "Staff Details" -msgstr "تفاصيل الموظف" - #: templates/organizations/staff_detail.html:10 msgid "Back to Staff List" msgstr "العودة إلى قائمة الموظفين" -#: templates/organizations/staff_detail.html:60 -#: templates/organizations/staff_form.html:108 -msgid "Personal Information" -msgstr "المعلومات الشخصية" - #: templates/organizations/staff_detail.html:64 msgid "First Name (English)" msgstr "الاسم الأول (بالإنجليزية)" @@ -19711,152 +25796,136 @@ msgstr "الاسم الأول (بالإنجليزية)" msgid "Last Name (English)" msgstr "اسم العائلة (بالإنجليزية)" -#: templates/organizations/staff_detail.html:72 -#: templates/organizations/staff_form.html:143 -msgid "First Name (Arabic)" -msgstr "الاسم الأول (بالعربية)" - -#: templates/organizations/staff_detail.html:76 -#: templates/organizations/staff_form.html:152 -msgid "Last Name (Arabic)" -msgstr "اسم العائلة (بالعربية)" - #: templates/organizations/staff_detail.html:81 #: templates/organizations/staff_form.html:245 #: templates/physicians/physician_detail.html:363 msgid "License Number" msgstr "رقم الترخيص" -#: templates/organizations/staff_detail.html:162 -msgid "Reports To" -msgstr "يتبع إداريًا لـ" +#: templates/organizations/staff_detail.html:235 +msgid "Ref #" +msgstr "رقم المرجع" -#: templates/organizations/staff_detail.html:174 -msgid "Direct Reports" -msgstr "المرؤوسون المباشرون" +#: templates/organizations/staff_detail.html:304 +msgid "No complaints found for this staff member" +msgstr "لم يتم العثور على أي شكوى لهذا الموظف" -#: templates/organizations/staff_detail.html:198 -#: templates/organizations/staff_form.html:380 -#: templates/organizations/staff_list.html:265 -msgid "User Account" -msgstr "حساب المستخدم" - -#: templates/organizations/staff_detail.html:205 +#: templates/organizations/staff_detail.html:399 msgid "Account Linked" msgstr "الحساب مرتبط" -#: templates/organizations/staff_detail.html:206 +#: templates/organizations/staff_detail.html:400 msgid "Staff can log in to the system" msgstr "يمكن للموظفين تسجيل الدخول إلى النظام" -#: templates/organizations/staff_detail.html:232 +#: templates/organizations/staff_detail.html:426 msgid "Resend Invitation" msgstr "إعادة إرسال الدعوة" -#: templates/organizations/staff_detail.html:238 +#: templates/organizations/staff_detail.html:432 msgid "Unlink Account" msgstr "فصل الحساب" -#: templates/organizations/staff_detail.html:246 +#: templates/organizations/staff_detail.html:440 msgid "No User Account" msgstr "لا يوجد حساب مستخدم" -#: templates/organizations/staff_detail.html:247 +#: templates/organizations/staff_detail.html:441 msgid "Staff cannot log in yet" msgstr "لا يمكن للموظفين تسجيل الدخول بعد" -#: templates/organizations/staff_detail.html:251 +#: templates/organizations/staff_detail.html:445 msgid "" "Create a user account to allow this staff member to log in to the system." msgstr "قم بإنشاء حساب مستخدم للسماح لهذا الموظف بتسجيل الدخول إلى النظام." -#: templates/organizations/staff_detail.html:256 -#: templates/organizations/staff_detail.html:302 -#: templates/organizations/staff_list.html:447 +#: templates/organizations/staff_detail.html:450 +#: templates/organizations/staff_detail.html:496 +#: templates/organizations/staff_list.html:452 msgid "Create User Account" msgstr "إنشاء حساب مستخدم" -#: templates/organizations/staff_detail.html:261 +#: templates/organizations/staff_detail.html:455 msgid "Add email address first" msgstr "أضف عنوان البريد الإلكتروني أولاً" -#: templates/organizations/staff_detail.html:272 +#: templates/organizations/staff_detail.html:466 msgid "System Info" msgstr "معلومات النظام" -#: templates/organizations/staff_detail.html:308 -#: templates/organizations/staff_list.html:453 +#: templates/organizations/staff_detail.html:502 +#: templates/organizations/staff_list.html:458 msgid "Create a user account for" msgstr "إنشاء حساب مستخدم لـ" -#: templates/organizations/staff_detail.html:309 +#: templates/organizations/staff_detail.html:503 msgid "Credentials will be emailed to" msgstr "سيتم إرسال بيانات الاعتماد عبر البريد الإلكتروني إلى" -#: templates/organizations/staff_detail.html:322 -#: templates/organizations/staff_list.html:467 +#: templates/organizations/staff_detail.html:524 +#: templates/organizations/staff_list.html:472 msgid "Send Invitation" msgstr "إرسال دعوة" -#: templates/organizations/staff_detail.html:328 -#: templates/organizations/staff_list.html:473 +#: templates/organizations/staff_detail.html:530 +#: templates/organizations/staff_list.html:478 msgid "Send invitation email to" msgstr "إرسال بريد إلكتروني للدعوة إلى" -#: templates/organizations/staff_detail.html:329 -#: templates/organizations/staff_list.html:474 -msgid "A new password will be generated and emailed." -msgstr "سيتم إنشاء كلمة مرور جديدة وإرسالها عبر البريد الإلكتروني." +#: templates/organizations/staff_detail.html:531 +#: templates/organizations/staff_list.html:479 +msgid "A secure password reset link will be emailed." +msgstr "سيتم إرسال رابط إعادة تعيين كلمة المرور الآمن عبر البريد الإلكتروني." -#: templates/organizations/staff_detail.html:342 +#: templates/organizations/staff_detail.html:544 msgid "Unlink User Account" msgstr "فصل حساب المستخدم" -#: templates/organizations/staff_detail.html:348 +#: templates/organizations/staff_detail.html:550 msgid "Unlink user account from" msgstr "إلغاء ربط حساب المستخدم من" -#: templates/organizations/staff_detail.html:352 +#: templates/organizations/staff_detail.html:554 msgid "" -"This will remove login access. The user account will still exist but will no" -" longer be linked to this staff profile." +"This will remove login access. The user account will still exist but will no " +"longer be linked to this staff profile." msgstr "" "سيؤدي هذا إلى إزالة وصول تسجيل الدخول. ستظل حساب المستخدم موجودًا ولكن لن " "يكون مرتبطًا بعدًا بملف تعريف الموظف هذا." -#: templates/organizations/staff_detail.html:358 -#: templates/organizations/staff_detail.html:500 +#: templates/organizations/staff_detail.html:560 +#: templates/organizations/staff_detail.html:692 msgid "Unlink" msgstr "إلغاء الربط" -#: templates/organizations/staff_detail.html:368 -msgid "Password Reset Successful" -msgstr "تمت إعادة تعيين كلمة المرور بنجاح" +#: templates/organizations/staff_detail.html:570 +msgid "Password Reset Link Sent" +msgstr "تم إرسال رابط إعادة تعيين كلمة المرور" -#: templates/organizations/staff_detail.html:378 -msgid "Password reset and email sent successfully!" -msgstr "تم إعادة تعيين كلمة المرور وإرسال البريد الإلكتروني بنجاح!" +#: templates/organizations/staff_detail.html:577 +msgid "Password reset email sent successfully." +msgstr "تم إرسال بريد إلكتروني لإعادة تعيين كلمة المرور بنجاح." -#: templates/organizations/staff_detail.html:386 -msgid "Copy this password:" -msgstr "انسخ كلمة المرور هذه:" +#: templates/organizations/staff_detail.html:580 +msgid "" +"No password is shown or stored. The staff member must use the email link to " +"set a new password." +msgstr "" +"لا يتم عرض أو تخزين أي كلمة مرور. يجب على الموظف استخدام رابط البريد " +"الإلكتروني لتعيين كلمة مرور جديدة." -#: templates/organizations/staff_detail.html:421 -#: templates/organizations/staff_list.html:508 +#: templates/organizations/staff_detail.html:611 +#: templates/organizations/staff_list.html:514 msgid "Creating..." msgstr "جاري الإنشاء..." -#: templates/organizations/staff_detail.html:481 +#: templates/organizations/staff_detail.html:673 msgid "Unlinking..." msgstr "جاري إلغاء الربط..." -#: templates/organizations/staff_detail.html:505 -msgid "Reset password and resend credentials?" -msgstr "إعادة تعيين كلمة المرور وإعادة إرسال بيانات الاعتماد؟" - -#: templates/organizations/staff_detail.html:548 -msgid "Password copied!" -msgstr "تم نسخ كلمة المرور!" +#: templates/organizations/staff_detail.html:697 +msgid "Send a password reset link?" +msgstr "هل تريد إرسال رابط إعادة تعيين كلمة المرور؟" #: templates/organizations/staff_form.html:4 #: templates/organizations/staff_form.html:90 @@ -19865,8 +25934,8 @@ msgstr "تعديل بيانات الموظف" #: templates/organizations/staff_form.html:4 #: templates/organizations/staff_form.html:90 -#: templates/organizations/staff_hierarchy.html:139 -#: templates/organizations/staff_list.html:123 +#: templates/organizations/staff_hierarchy.html:121 +#: templates/organizations/staff_list.html:127 msgid "Add New Staff" msgstr "إضافة موظف جديد" @@ -19882,15 +25951,6 @@ msgstr "إنشاء سجل جديد لموظف" msgid "Role Information" msgstr "معلومات الدور الوظيفي" -#: templates/organizations/staff_form.html:171 -msgid "Staff Type" -msgstr "نوع الموظف" - -#: templates/organizations/staff_form.html:189 -#: templates/organizations/staff_list.html:262 -msgid "Job Title" -msgstr "المسمى الوظيفي" - #: templates/organizations/staff_form.html:209 msgid "Professional Information" msgstr "المعلومات المهنية" @@ -19919,10 +25979,6 @@ msgstr "" msgid "Email address is required to create a user account." msgstr "عنوان البريد الإلكتروني مطلوب لإنشاء حساب مستخدم." -#: templates/organizations/staff_form.html:412 -msgid "All fields marked with * are required" -msgstr "جميع الحقول المعلّمة بعلامة * مطلوبة" - #: templates/organizations/staff_form.html:416 msgid "Employee ID must be unique" msgstr "يجب أن يكون الرقم الوظيفي فريدًا" @@ -19936,73 +25992,52 @@ msgid "License number is required for physicians" msgstr "رقم الترخيص مطلوب للأطباء" # Staff Hierarchy -#: templates/organizations/staff_hierarchy.html:5 -#: templates/organizations/staff_hierarchy.html:130 +#: templates/organizations/staff_hierarchy.html:4 +#: templates/organizations/staff_hierarchy.html:112 +#: templates/organizations/staff_hierarchy.html:220 #: templates/organizations/staff_hierarchy_d3.html:4 #: templates/organizations/staff_hierarchy_d3.html:83 msgid "Staff Hierarchy" msgstr "الهيكل التنظيمي للموظفين" -#: templates/organizations/staff_hierarchy.html:131 +#: templates/organizations/staff_hierarchy.html:113 msgid "View organizational structure and reporting relationships" msgstr "عرض الهيكل التنظيمي وعلاقات التقارير الإدارية" -#: templates/organizations/staff_hierarchy.html:135 +#: templates/organizations/staff_hierarchy.html:117 #: templates/organizations/staff_hierarchy_d3.html:89 msgid "List View" msgstr "عرض القائمة" -#: templates/organizations/staff_hierarchy.html:171 +#: templates/organizations/staff_hierarchy.html:151 #: templates/organizations/staff_hierarchy_d3.html:116 msgid "Top Managers" msgstr "المديرون التنفيذيون" -#: templates/organizations/staff_hierarchy.html:186 +#: templates/organizations/staff_hierarchy.html:164 msgid "Hierarchy Levels" msgstr "مستويات الهيكل التنظيمي" -#: templates/organizations/staff_hierarchy.html:187 +#: templates/organizations/staff_hierarchy.html:165 msgid "Multi-level" msgstr "متعدد المستويات" -#: templates/organizations/staff_hierarchy.html:211 -#: templates/organizations/staff_hierarchy_d3.html:150 -msgid "Search Staff" -msgstr "بحث عن موظف" +#: templates/organizations/staff_hierarchy.html:203 +msgid "Name, Employee ID..." +msgstr "الاسم، معرف الموظف..." -#: templates/organizations/staff_hierarchy.html:213 -#: templates/organizations/staff_hierarchy_d3.html:153 -msgid "Search by name or employee ID..." -msgstr "البحث بالاسم أو الرقم الوظيفي..." +#: templates/organizations/staff_hierarchy.html:283 +msgid "Top Level" +msgstr "المستوى الأعلى" -#: templates/organizations/staff_hierarchy.html:232 -msgid "Found staff member:" -msgstr "تم العثور على الموظف:" +#: templates/organizations/staff_hierarchy.html:319 +msgid "There are no staff members matching the selected filters." +msgstr "لا يوجد أعضاء طاقم طبي يطابقون عوامل التصفية المحددة." -#: templates/organizations/staff_hierarchy.html:242 -msgid "Organizational Structure" -msgstr "الهيكل التنظيمي" - -#: templates/organizations/staff_hierarchy.html:244 -msgid "Expand All" -msgstr "توسيع الكل" - -#: templates/organizations/staff_hierarchy.html:247 -msgid "Collapse All" -msgstr "طي الكل" - -#: templates/organizations/staff_hierarchy.html:262 -msgid "No Staff Hierarchy Found" -msgstr "لم يتم العثور على هيكل تنظيمي للموظفين" - -#: templates/organizations/staff_hierarchy.html:263 -msgid "" -"There are no staff members with reporting relationships in the selected " -"filters." -msgstr "لا يوجد موظفون لديهم علاقات تقارير إدارية ضمن عوامل التصفية المحددة." - -#: templates/organizations/staff_hierarchy.html:266 -msgid "Add Staff Member" +#: templates/organizations/staff_hierarchy.html:323 +#: templates/organizations/staff_hierarchy_d3.html:92 +#: templates/organizations/staff_list.html:369 +msgid "Add Staff" msgstr "إضافة موظف" #: templates/organizations/staff_hierarchy_d3.html:85 @@ -20021,7 +26056,12 @@ msgstr "وقت التحميل" msgid "milliseconds" msgstr "مللي ثانية" +#: templates/organizations/staff_hierarchy_d3.html:153 +msgid "Search by name or employee ID..." +msgstr "البحث بالاسم أو الرقم الوظيفي..." + #: templates/organizations/staff_hierarchy_d3.html:160 +#: templates/presentations/slide_form.html:31 msgid "Layout" msgstr "التخطيط" @@ -20154,6 +26194,143 @@ msgstr "انقر مرتين على أي عقدة لعرض ملف الموظف" msgid "Reduce Max Depth for faster loading with large teams" msgstr "قلل الحد الأقصى للعمق لتحميل أسرع مع الفرق الكبيرة" +#: templates/organizations/staff_import.html:4 +#: templates/organizations/staff_import.html:41 +#: templates/organizations/staff_import.html:372 +msgid "Import Staff" +msgstr "استيراد أعضاء الطاقم الطبي" + +#: templates/organizations/staff_import.html:42 +msgid "Upload a CSV file to bulk-import staff into" +msgstr "تحميل ملف CSV لاستيراد أعضاء الطاقم الطبي بشكل جماعي" + +#: templates/organizations/staff_import.html:46 +msgid "Sample CSV" +msgstr "نموذج CSV" + +#: templates/organizations/staff_import.html:65 +msgid "CSV files only. UTF-8 encoding recommended." +msgstr "ملفات CSV فقط. يُوصى باستخدام ترميز UTF-8." + +#: templates/organizations/staff_import.html:74 +msgid "Import Options" +msgstr "خيارات الاستيراد" + +#: templates/organizations/staff_import.html:78 +msgid "Default Staff Type" +msgstr "نوع الموظف الافتراضي" + +#: templates/organizations/staff_import.html:91 +msgid "Update existing staff" +msgstr "تحديث الموظفين الحاليين" + +#: templates/organizations/staff_import.html:92 +msgid "When Staff ID matches, update the record instead of skipping" +msgstr "عند تطابق معرف الموظف، قم بتحديث السجل بدلاً من تخطيه" + +#: templates/organizations/staff_import.html:98 +msgid "Auto-create departments" +msgstr "إنشاء الأقسام تلقائيًا" + +#: templates/organizations/staff_import.html:99 +msgid "Create departments, sections, and subsections that don't exist yet" +msgstr "" +"إنشاء الأقسام والأقسام الفرعية والأقسام الفرعية الفرعية غير الموجودة بعد" + +#: templates/organizations/staff_import.html:105 +msgid "Dry run (preview only)" +msgstr "تشغيل تجريبي (معاينة فقط)" + +#: templates/organizations/staff_import.html:106 +msgid "Preview results without making any changes to the database" +msgstr "معاينة النتائج دون إجراء أي تغييرات على قاعدة البيانات" + +#: templates/organizations/staff_import.html:112 +msgid "Deactivate staff not in CSV" +msgstr "إلغاء تنشيط الموظفين غير الموجودين في ملف CSV" + +#: templates/organizations/staff_import.html:113 +msgid "" +"Active staff in the hospital whose ID is not in the CSV will be set to " +"inactive" +msgstr "" +"سيتم تعيين الموظفين النشطين في المستشفى الذين لا توجد هوياتهم في ملف CSV على " +"أنهم غير نشطين" + +#: templates/organizations/staff_import.html:123 +#: templates/organizations/staff_import.html:372 +msgid "Preview Import" +msgstr "معاينة الاستيراد" + +#: templates/organizations/staff_import.html:137 +msgid "Expected Columns" +msgstr "الأعمدة المتوقعة" + +#: templates/organizations/staff_import.html:184 +msgid "Download the sample CSV for the exact format with an example row." +msgstr "قم بتنزيل ملف CSV النموذجي للحصول على التنسيق الدقيق مع صف مثال." + +#: templates/organizations/staff_import.html:197 +msgid "Start with a dry run to preview results before importing." +msgstr "ابدأ بتشغيل تجريبي لمعاينة النتائج قبل الاستيراد." + +#: templates/organizations/staff_import.html:201 +msgid "Staff ID must be unique within the hospital." +msgstr "يجب أن يكون معرف الموظف فريداً داخل المستشفى." + +#: templates/organizations/staff_import.html:205 +msgid "Manager format: \\" +msgstr "تنسيق المدير: \\" + +#: templates/organizations/staff_import.html:209 +msgid "Save your CSV as UTF-8 for Arabic text support." +msgstr "احفظ ملف CSV الخاص بك بتنسيق UTF-8 لدعم النص العربي." + +#: templates/organizations/staff_import.html:213 +msgid "" +"Use 'Deactivate missing' to sync: staff not in the CSV will be set to " +"inactive." +msgstr "" +"استخدم خيار 'إلغاء تنشيط المفقودين' للمزامنة: سيتم تعيين الموظفين غير " +"الموجودين في ملف CSV كغير نشطين." + +#: templates/organizations/staff_import.html:225 +msgid "Preview Results" +msgstr "معاينة النتائج" + +#: templates/organizations/staff_import.html:225 +msgid "Import Results" +msgstr "استيراد النتائج" + +#: templates/organizations/staff_import.html:243 +#: templates/physicians/doctor_rating_job_status.html:228 +msgid "Skipped" +msgstr "تم التخطي" + +#: templates/organizations/staff_import.html:247 +msgid "Deactivated" +msgstr "مُعطَّل" + +#: templates/organizations/staff_import.html:262 +#: templates/physicians/doctor_rating_job_status.html:276 +msgid "Row" +msgstr "الصف" + +#: templates/organizations/staff_import.html:310 +msgid "No rows found in the CSV file." +msgstr "لم يتم العثور على أي صفوف في ملف CSV." + +#: templates/organizations/staff_import.html:322 +msgid "" +"Preview looks good! Uncheck 'Dry run' and submit again to apply the import." +msgstr "" +"تبدو المعاينة جيدة! قم بإلغاء تحديد 'تشغيل تجريبي' وأرسل مرة أخرى لتطبيق " +"الاستيراد." + +#: templates/organizations/staff_import.html:324 +msgid "staff would be deactivated" +msgstr "سيتم إلغاء تنشيط الموظف" + #: templates/organizations/staff_list.html:4 #: templates/organizations/staff_list.html:118 msgid "Staff Management" @@ -20163,40 +26340,40 @@ msgstr "إدارة الموظفين" msgid "Manage hospital staff and their user accounts" msgstr "إدارة موظفي المستشفى وحسابات المستخدمين الخاصة بهم" -#: templates/organizations/staff_list.html:165 +#: templates/organizations/staff_list.html:170 msgid "Linked Users" msgstr "المستخدمون المرتبطون" -#: templates/organizations/staff_list.html:178 +#: templates/organizations/staff_list.html:183 msgid "Dept Heads" msgstr "رؤساء الأقسام" -#: templates/organizations/staff_list.html:233 +#: templates/organizations/staff_list.html:238 msgid "Name, ID..." msgstr "الاسم، الرقم التعريفي..." -#: templates/organizations/staff_list.html:250 +#: templates/organizations/staff_list.html:255 msgid "Staff List" msgstr "قائمة الموظفين" -#: templates/organizations/staff_list.html:318 +#: templates/organizations/staff_list.html:323 msgid "Linked" msgstr "مرتبط" -#: templates/organizations/staff_list.html:322 +#: templates/organizations/staff_list.html:327 #: templates/px_sources/source_user_confirm_delete.html:102 msgid "None" msgstr "لا يوجد" -#: templates/organizations/staff_list.html:345 +#: templates/organizations/staff_list.html:350 msgid "Send Invite" msgstr "إرسال دعوة" -#: templates/organizations/staff_list.html:361 +#: templates/organizations/staff_list.html:366 msgid "Add your first staff member to get started" msgstr "أضف أول عضو في طاقم العمل للبدء" -#: templates/organizations/staff_list.html:454 +#: templates/organizations/staff_list.html:459 msgid "Credentials will be emailed to the staff member." msgstr "سيتم إرسال بيانات الاعتماد عبر البريد الإلكتروني لعضو طاقم العمل." @@ -20258,10 +26435,6 @@ msgstr "إدارة الأقسام الفرعية للمستشفى داخل ال msgid "Search subsections..." msgstr "البحث في الأقسام الفرعية..." -#: templates/organizations/subsection_list.html:82 -msgid "All Sections" -msgstr "جميع الأقسام" - #: templates/organizations/subsection_list.html:116 msgid "Subsections List" msgstr "قائمة الأقسام الفرعية" @@ -20270,6 +26443,14 @@ msgstr "قائمة الأقسام الفرعية" msgid "No subsections found" msgstr "لم يتم العثور على أقسام فرعية" +#: templates/partials/notes_panel.html:47 +msgid "No notes yet" +msgstr "لا توجد ملاحظات حتى الآن" + +#: templates/partials/stage_timeline.html:6 templates/rca/rca_detail.html:198 +msgid "Status Timeline" +msgstr "الجدول الزمني للحالة" + #: templates/physicians/department_overview.html:5 #: templates/physicians/department_overview.html:15 #: templates/physicians/department_overview.html:20 @@ -20296,53 +26477,38 @@ msgid "Dept Rank" msgstr "ترتيب القسم" #: templates/physicians/department_overview.html:161 +#: templates/physicians/physician_ratings_dashboard.html:694 msgid "No department data available for this period" msgstr "لا توجد بيانات للقسم لهذه الفترة" #: templates/physicians/doctor_rating_fetch.html:5 #: templates/physicians/doctor_rating_fetch.html:29 -#, fuzzy -#| msgid "Import doctor ratings from HIS CSV export" msgid "Fetch Doctor Ratings from HIS" -msgstr "استورد تقييمات الأطباء من تصدير CSV الخاص بـ HIS" +msgstr "جلب تقييمات الأطباء من نظام المعلومات الصحية" #: templates/physicians/doctor_rating_fetch.html:31 msgid "Fetch doctor ratings directly from HIS API by date range" msgstr "جلب تقييمات الأطباء مباشرة من واجهة HIS البرمجية حسب نطاق التاريخ" #: templates/physicians/doctor_rating_fetch.html:37 -#, fuzzy -#| msgid "HIS Import" msgid "CSV Import" -msgstr "استيراد نظام معلومات المستشفى" - -#: templates/physicians/doctor_rating_fetch.html:42 -#: templates/physicians/doctor_rating_import.html:42 -#: templates/physicians/doctor_rating_job_list.html:70 -#: templates/physicians/doctor_rating_job_list.html:72 -#: templates/physicians/individual_ratings_list.html:87 -msgid "Import History" -msgstr "سجل الاستيراد" +msgstr "استيراد من ملف CSV" #: templates/physicians/doctor_rating_fetch.html:56 -#, fuzzy -#| msgid "How it works" msgid "How It Works" msgstr "كيف يعمل" #: templates/physicians/doctor_rating_fetch.html:62 -#, fuzzy -#| msgid "On Process" msgid "Fetch Process:" -msgstr "قيد المعالجة" +msgstr "عملية الجلب:" #: templates/physicians/doctor_rating_fetch.html:64 msgid "" -"Ratings are fetched from the HIS FetchDoctorRatingMAPI1 endpoint for the " +"Ratings are fetched from the HIS FetchDoctorRatingMAPI endpoint for the " "selected date range." msgstr "" -"يتم جلب التقييمات من نقطة النهاية HIS FetchDoctorRatingMAPI1 لنطاق التاريخ " -"المحدد." +"يتم جلب التقييمات من نقطة نهاية FetchDoctorRatingMAPI في نظام HIS للنطاق " +"الزمني المحدد." #: templates/physicians/doctor_rating_fetch.html:69 msgid "Select a date range and submit" @@ -20357,16 +26523,12 @@ msgid "Track progress on the job status page" msgstr "تتبع التقدم على صفحة حالة المهمة" #: templates/physicians/doctor_rating_fetch.html:82 -#, fuzzy -#| msgid "Response Time" msgid "HIS Response Fields:" -msgstr "وقت الاستجابة" +msgstr "حقول استجابة نظام المعلومات الصحية:" #: templates/physicians/doctor_rating_fetch.html:90 -#, fuzzy -#| msgid "Failed to switch hospital: " msgid "Matched to PX360 hospital" -msgstr "فشل في تبديل المستشفى:" +msgstr "مطابق لمستشفى PX360" #: templates/physicians/doctor_rating_fetch.html:94 #: templates/physicians/doctor_rating_import.html:94 @@ -20374,28 +26536,20 @@ msgid "1-5 rating value" msgstr "قيمة تقييم من 1 إلى 5" #: templates/physicians/doctor_rating_fetch.html:109 -#, fuzzy -#| msgid "Date Range" msgid "Select Date Range" -msgstr "نطاق التاريخ" +msgstr "تحديد نطاق التاريخ" #: templates/physicians/doctor_rating_fetch.html:112 -#, fuzzy -#| msgid "Searching..." msgid "Fetching..." -msgstr "جارٍ البحث..." +msgstr "جارٍ الجلب..." #: templates/physicians/doctor_rating_fetch.html:125 -#, fuzzy -#| msgid "Due date for implementing actions" msgid "Start date for fetching ratings" -msgstr "تاريخ الاستحقاق لتنفيذ الإجراءات" +msgstr "تاريخ البداية لجلب التقييمات" #: templates/physicians/doctor_rating_fetch.html:136 -#, fuzzy -#| msgid "Due date for implementing actions" msgid "End date for fetching ratings" -msgstr "تاريخ الاستحقاق لتنفيذ الإجراءات" +msgstr "تاريخ النهاية لجلب التقييمات" #: templates/physicians/doctor_rating_fetch.html:169 msgid "About HIS Fetch" @@ -20404,10 +26558,10 @@ msgstr "حول HIS Fetch" #: templates/physicians/doctor_rating_fetch.html:174 msgid "" "This fetches ratings directly from the HIS system via the " -"FetchDoctorRatingMAPI1 API endpoint." +"FetchDoctorRatingMAPI API endpoint." msgstr "" -"يقوم هذا بجلب التقييمات مباشرةً من نظام HIS عبر نقطة نهاية واجهة برمجة " -"التطبيقات FetchDoctorRatingMAPI1." +"يقوم هذا بجلب التقييمات مباشرة من نظام HIS عبر نقطة نهاية API " +"FetchDoctorRatingMAPI." #: templates/physicians/doctor_rating_fetch.html:177 msgid "# HIS API Endpoint" @@ -20426,10 +26580,8 @@ msgid "Hospitals are matched by name from HIS data" msgstr "يتم مطابقة المستشفيات بالاسم من بيانات نظام معلومات المستشفيات" #: templates/physicians/doctor_rating_fetch.html:203 -#, fuzzy -#| msgid "Duplicate ratings for same patient/doctor are ignored" msgid "Duplicate ratings for same doctor/date are skipped" -msgstr "سيتم تجاهل التقييمات المكررة لنفس المريض/الطبيب" +msgstr "يتم تخطي التقييمات المكررة لنفس الطبيب/التاريخ" #: templates/physicians/doctor_rating_fetch.html:207 msgid "Job runs in background — you can leave the page" @@ -20449,10 +26601,6 @@ msgstr "استورد تقييمات الأطباء من تصدير CSV الخا msgid "Fetch from HIS" msgstr "جلب من نظام HIS" -#: templates/physicians/doctor_rating_import.html:56 -msgid "Instructions" -msgstr "التعليمات" - #: templates/physicians/doctor_rating_import.html:62 msgid "Expected CSV Format:" msgstr "التنسيق المتوقع لملف CSV:" @@ -20477,11 +26625,6 @@ msgstr "يتم استخراج معرفات الأطباء من الأسماء م msgid "Required Columns:" msgstr "الأعمدة المطلوبة:" -#: templates/physicians/doctor_rating_import.html:86 -#: templates/simulator/log_detail.html:244 -msgid "Patient MRN" -msgstr "الرقم الطبي للمريض (MRN)" - #: templates/physicians/doctor_rating_import.html:90 msgid "With or without ID prefix" msgstr "مع أو بدون بادئة المعرف" @@ -20652,19 +26795,11 @@ msgstr "ثوانٍ" msgid "Successful" msgstr "ناجح" -#: templates/physicians/doctor_rating_job_status.html:228 -msgid "Skipped" -msgstr "تم التخطي" - #: templates/physicians/doctor_rating_job_status.html:238 #: templates/surveys/bulk_job_status.html:63 msgid "Processed" msgstr "تمت المعالجة" -#: templates/physicians/doctor_rating_job_status.html:276 -msgid "Row" -msgstr "الصف" - #: templates/physicians/doctor_rating_job_status.html:278 msgid "Data" msgstr "البيانات" @@ -20760,10 +26895,6 @@ msgstr "" "سيؤدي هذا إلى إضافة مهمة في الخلفية لاستيراد جميع التقييمات. ستتمكن من تتبع " "التقدم." -#: templates/physicians/doctor_rating_review.html:332 -msgid "Import" -msgstr "استيراد" - #: templates/physicians/doctor_rating_review.html:332 #: templates/physicians/individual_ratings_list.html:177 #: templates/physicians/ratings_list.html:190 @@ -20774,6 +26905,10 @@ msgstr "التقييمات" msgid "Individual Doctor Ratings" msgstr "تقييمات الأطباء الفردية" +#: templates/physicians/individual_ratings_list.html:74 +msgid "Individual Ratings" +msgstr "التقييمات الفردية" + #: templates/physicians/individual_ratings_list.html:75 msgid "View and filter individual doctor ratings" msgstr "عرض وتصفية تقييمات الأطباء الفردية" @@ -20786,6 +26921,16 @@ msgstr "معرف الطبيب" msgid "e.g., 10738" msgstr "مثال: 10738" +#: templates/physicians/individual_ratings_list.html:112 +#: templates/physicians/leaderboard.html:158 +msgid "Min Rating" +msgstr "أقل تقييم" + +#: templates/physicians/individual_ratings_list.html:122 +#: templates/physicians/leaderboard.html:164 +msgid "Max Rating" +msgstr "أعلى تقييم" + #: templates/physicians/individual_ratings_list.html:185 msgid "Patient (if available)" msgstr "المريض (إن وجد)" @@ -20812,6 +26957,11 @@ msgstr "لم يتم العثور على تقييمات" msgid "Try adjusting your filters or import new ratings" msgstr "جرب تعديل عوامل التصفية الخاصة بك أو استيراد تقييمات جديدة" +#: templates/physicians/leaderboard.html:5 +#: templates/physicians/leaderboard.html:44 +msgid "Physician Leaderboard" +msgstr "لوحة صدارة الأطباء" + #: templates/physicians/leaderboard.html:46 msgid "Top-rated physicians for" msgstr "أفضل الأطباء تقييماً لـ" @@ -20826,63 +26976,55 @@ msgstr "إجمالي الأطباء" #: templates/physicians/physician_detail.html:407 #: templates/physicians/physician_ratings_dashboard.html:318 #: templates/physicians/physician_ratings_dashboard.html:568 -#: templates/physicians/physician_ratings_dashboard.html:668 msgid "Average Rating" msgstr "متوسط التقييم" -#: templates/physicians/leaderboard.html:90 -#: templates/physicians/physician_ratings_dashboard.html:331 -msgid "Total Surveys" -msgstr "إجمالي الاستبيانات" - #: templates/physicians/leaderboard.html:101 #: templates/physicians/physician_ratings_dashboard.html:344 msgid "Excellent (4.5+)" msgstr "ممتاز (4.5+)" -#: templates/physicians/leaderboard.html:145 -msgid "Limit" -msgstr "الحد" - -#: templates/physicians/leaderboard.html:170 +#: templates/physicians/leaderboard.html:191 msgid "Top Performers" msgstr "أفضل المؤدين" -#: templates/physicians/leaderboard.html:183 -msgid "Trend" -msgstr "الاتجاه" +#: templates/physicians/leaderboard.html:203 +msgid "1★" +msgstr "نجمة واحدة" -#: templates/physicians/leaderboard.html:258 -msgid "Up" -msgstr "ارتفاع" +#: templates/physicians/leaderboard.html:204 +msgid "2★" +msgstr "نجمتان" -#: templates/physicians/leaderboard.html:263 -msgid "Down" -msgstr "انخفاض" +#: templates/physicians/leaderboard.html:205 +msgid "3★" +msgstr "3★" -#: templates/physicians/leaderboard.html:268 -msgid "Stable" -msgstr "ثابت" +#: templates/physicians/leaderboard.html:206 +msgid "4★" +msgstr "4★" -#: templates/physicians/leaderboard.html:289 +#: templates/physicians/leaderboard.html:207 +msgid "5★" +msgstr "5★" + +#: templates/physicians/leaderboard.html:208 +msgid "Rating Trend" +msgstr "اتجاه التقييم" + +#: templates/physicians/leaderboard.html:320 msgid "No ratings available for this period" msgstr "لا توجد تقييمات متاحة لهذه الفترة" -#: templates/physicians/leaderboard.html:290 +#: templates/physicians/leaderboard.html:321 msgid "Try adjusting your filters or date range" msgstr "جرب تعديل عوامل التصفية الخاصة بك أو نطاق التاريخ" -#: templates/physicians/leaderboard.html:303 +#: templates/physicians/leaderboard.html:334 msgid "Performance Distribution" msgstr "توزيع الأداء" -#: templates/physicians/leaderboard.html:328 -#: templates/surveys/instance_detail.html:316 -#: templates/surveys/instance_detail.html:321 -msgid "Average" -msgstr "متوسط" - -#: templates/physicians/leaderboard.html:336 +#: templates/physicians/leaderboard.html:367 msgid "Poor" msgstr "ضعيف" @@ -20943,10 +27085,6 @@ msgstr "إدارة ملفات الأطباء وأدائهم" msgid "By Specialization" msgstr "حسب التخصص" -#: templates/physicians/physician_list.html:87 -msgid "By Department" -msgstr "حسب القسم" - #: templates/physicians/physician_list.html:114 msgid "Active Physicians" msgstr "الأطباء النشطون" @@ -20963,15 +27101,15 @@ msgstr "التقييم الحالي" msgid "surveys" msgstr "استبيانات" -#: templates/physicians/physician_list.html:243 -msgid "No data" -msgstr "لا توجد بيانات" - #: templates/physicians/physician_ratings_dashboard.html:4 #: templates/physicians/physician_ratings_dashboard.html:243 msgid "Physician Ratings Dashboard" msgstr "لوحة تحكم تقييمات الأطباء" +#: templates/physicians/physician_ratings_dashboard.html:235 +msgid "Loading dashboard data..." +msgstr "جارٍ تحميل بيانات لوحة التحكم..." + #: templates/physicians/physician_ratings_dashboard.html:245 msgid "Comprehensive physician performance analytics and insights" msgstr "تحليلات وأفكار شاملة لأداء الأطباء" @@ -21001,8 +27139,8 @@ msgid "" "There are no physician ratings for the selected period. Physician ratings " "are automatically calculated from patient survey responses." msgstr "" -"لا توجد تقييمات للطبيب خلال الفترة المحددة. يتم حساب تقييمات الطبيب تلقائيًا" -" من استجابات استبيان المرضى." +"لا توجد تقييمات للطبيب خلال الفترة المحددة. يتم حساب تقييمات الطبيب تلقائيًا " +"من استجابات استبيان المرضى." #: templates/physicians/physician_ratings_dashboard.html:387 msgid "Rating Trend (6 Months)" @@ -21020,6 +27158,14 @@ msgstr "أفضل 10 أطباء" msgid "View Full Leaderboard" msgstr "عرض لوحة المتصدرين الكاملة" +#: templates/physicians/physician_ratings_dashboard.html:702 +msgid "department" +msgstr "قسم" + +#: templates/physicians/physician_ratings_dashboard.html:702 +msgid "departments" +msgstr "أقسام" + #: templates/physicians/ratings_list.html:99 msgid "Monthly physician performance ratings" msgstr "تقييم أداء الأطباء الشهري" @@ -21054,6 +27200,311 @@ msgstr "عرض الأقسام" msgid "No specialization data available for this period" msgstr "لا توجد بيانات متاحة للتخصص خلال هذه الفترة" +#: templates/presentations/presentation_detail.html:89 +#: templates/presentations/presentation_form.html:9 +#: templates/presentations/presentation_generate.html:9 +#: templates/presentations/presentation_list.html:4 +#: templates/presentations/presentation_list.html:47 +#: templates/presentations/slide_form.html:13 +msgid "Presentations" +msgstr "العروض التقديمية" + +# Explanation Status +#: templates/presentations/presentation_detail.html:103 +msgid "Present" +msgstr "تقديم" + +#: templates/presentations/presentation_detail.html:114 +msgid "PPTX" +msgstr "PPTX" + +#: templates/presentations/presentation_detail.html:136 +#: templates/presentations/presentation_form.html:46 +msgid "Theme" +msgstr "سمة" + +#: templates/presentations/presentation_detail.html:140 +#: templates/presentations/presentation_detail.html:155 +msgid "Slides" +msgstr "الشرائح" + +#: templates/presentations/presentation_detail.html:159 +#: templates/presentations/presentation_detail.html:192 +#: templates/presentations/slide_form.html:17 +#: templates/presentations/slide_form.html:78 +msgid "Add Slide" +msgstr "إضافة شريحة" + +#: templates/presentations/presentation_detail.html:176 +msgid "Delete this slide?" +msgstr "حذف هذه الشريحة؟" + +#: templates/presentations/presentation_detail.html:187 +msgid "No slides yet" +msgstr "لا توجد شرائح بعد" + +#: templates/presentations/presentation_detail.html:188 +msgid "Add your first slide to get started." +msgstr "أضف شريحتك الأولى للبدء." + +#: templates/presentations/presentation_form.html:4 +#: templates/presentations/presentation_form.html:16 +msgid "Edit Presentation" +msgstr "تعديل العرض التقديمي" + +#: templates/presentations/presentation_form.html:4 +#: templates/presentations/presentation_list.html:61 +msgid "New Presentation" +msgstr "عرض تقديمي جديد" + +#: templates/presentations/presentation_form.html:16 +#: templates/presentations/presentation_form.html:93 +msgid "Create Presentation" +msgstr "إنشاء عرض تقديمي" + +#: templates/presentations/presentation_form.html:27 +msgid "e.g., Q1 2026 Complaints Report" +msgstr "مثال: تقرير شكاوى الربع الأول 2026" + +#: templates/presentations/presentation_form.html:31 +#: templates/presentations/slide_form.html:53 +msgid "Subtitle" +msgstr "ترجمة" + +#: templates/presentations/presentation_form.html:34 +msgid "e.g., Al Hammadi Hospital — Patient Experience" +msgstr "مثال: مستشفى الحمادي — تجربة المريض" + +#: templates/presentations/presentation_form.html:41 +msgid "Brief description of this presentation" +msgstr "وصف موجز لهذا العرض التقديمي" + +#: templates/presentations/presentation_form.html:58 +msgid "e.g., quarterly, monthly" +msgstr "مثال: ربع سنوي، شهري" + +#: templates/presentations/presentation_form.html:85 +msgid "Share with other users in the same hospital" +msgstr "مشاركة مع مستخدمين آخرين في نفس المستشفى" + +#: templates/presentations/presentation_generate.html:4 +#: templates/presentations/presentation_generate.html:110 +msgid "Generate Presentation" +msgstr "إنشاء العرض التقديمي" + +#: templates/presentations/presentation_generate.html:19 +msgid "AI-Powered Presentation" +msgstr "عرض تقديمي مدعوم بالذكاء الاصطناعي" + +#: templates/presentations/presentation_generate.html:22 +msgid "" +"Select a hospital and period to automatically generate a complaints report " +"presentation with AI-enhanced insights." +msgstr "" +"اختر مستشفى وفترة لإنشاء عرض تقرير الشكاوى تلقائيًا مع رؤى معززة بالذكاء " +"الاصطناعي." + +#: templates/presentations/presentation_generate.html:33 +msgid "Complaints Report" +msgstr "تقرير الشكاوى" + +#: templates/presentations/presentation_generate.html:34 +msgid "Doctor Ratings Report" +msgstr "تقرير تقييم الأطباء" + +#: templates/presentations/presentation_generate.html:42 +msgid "Select a hospital" +msgstr "اختيار مستشفى" + +#: templates/presentations/presentation_generate.html:64 +msgid "Full Year" +msgstr "السنة كاملة" + +#: templates/presentations/presentation_generate.html:65 +msgid "Q1 (Jan–Mar)" +msgstr "الربع الأول (يناير–مارس)" + +#: templates/presentations/presentation_generate.html:66 +msgid "Q2 (Apr–Jun)" +msgstr "الربع الثاني (أبريل–يونيو)" + +#: templates/presentations/presentation_generate.html:67 +msgid "Q3 (Jul–Sep)" +msgstr "الربع الثالث (يوليو–سبتمبر)" + +#: templates/presentations/presentation_generate.html:68 +msgid "Q4 (Oct–Dec)" +msgstr "الربع الرابع (أكتوبر–ديسمبر)" + +#: templates/presentations/presentation_generate.html:77 +#: templates/presentations/presentation_generate.html:88 +msgid "The presentation will include:" +msgstr "سيتضمن العرض التقديمي ما يلي:" + +#: templates/presentations/presentation_generate.html:79 +#: templates/presentations/presentation_generate.html:90 +msgid "Cover page with hospital branding" +msgstr "صفحة الغلاف مع العلامة التجارية للمستشفى" + +#: templates/presentations/presentation_generate.html:80 +msgid "KPI dashboard with key metrics" +msgstr "لوحة مؤشرات الأداء الرئيسية مع المقاييس الأساسية" + +#: templates/presentations/presentation_generate.html:81 +msgid "Complaint source & location breakdowns" +msgstr "تحليلات مصدر الشكوى والموقع" + +#: templates/presentations/presentation_generate.html:82 +msgid "Department & escalation analysis" +msgstr "تحليل الأقسام والتصعيد" + +#: templates/presentations/presentation_generate.html:83 +msgid "Response time analytics" +msgstr "تحليلات وقت الاستجابة" + +#: templates/presentations/presentation_generate.html:84 +msgid "AI-generated insights & recommendations" +msgstr "الرؤى والتوصيات المُولَّدة بالذكاء الاصطناعي" + +#: templates/presentations/presentation_generate.html:91 +#, python-format +msgid "KPI dashboard — avg rating, positive/negative %%" +msgstr "" +"لوحة مؤشرات الأداء الرئيسية — متوسط التقييم، النسبة المئوية الإيجابية/" +"السلبية %%" + +#: templates/presentations/presentation_generate.html:92 +msgid "Rating distribution chart (1–5 stars)" +msgstr "مخطط توزيع التقييمات (نجوم 1–5)" + +#: templates/presentations/presentation_generate.html:93 +msgid "Monthly rating trend" +msgstr "اتجاه التقييم الشهري" + +#: templates/presentations/presentation_generate.html:94 +msgid "Per-department physician rating tables (color-coded)" +msgstr "جداول تقييم الأطباء حسب القسم (مرمزة بالألوان)" + +#: templates/presentations/presentation_generate.html:95 +msgid "Top 10 performers + AI-generated insights" +msgstr "أفضل 10 أداءً + رؤى مولّدة بالذكاء الاصطناعي" + +#: templates/presentations/presentation_generate.html:105 +msgid "Use Template Builder" +msgstr "استخدام منشئ القوالب" + +#: templates/presentations/presentation_list.html:48 +msgid "Create and present beautiful slide decks from your reports" +msgstr "أنشئ وقدم عروض شرائح جميلة من تقاريرك" + +#: templates/presentations/presentation_list.html:82 +msgid "slides" +msgstr "شرائح" + +#: templates/presentations/presentation_list.html:112 +msgid "No Presentations Yet" +msgstr "لا توجد عروض تقديمية بعد" + +#: templates/presentations/presentation_list.html:113 +msgid "" +"Create your first presentation to replace PDF and PowerPoint reports with " +"beautiful in-app slides." +msgstr "" +"أنشئ عرضك التقديمي الأول لاستبدال تقارير PDF وPowerPoint بشرائح جميلة داخل " +"التطبيق." + +#: templates/presentations/presentation_list.html:117 +msgid "Generate with AI" +msgstr "توليد باستخدام الذكاء الاصطناعي" + +#: templates/presentations/presentation_list.html:121 +msgid "Create Manually" +msgstr "إنشاء يدويًا" + +#: templates/presentations/slide_form.html:4 +#: templates/presentations/slide_form.html:17 +#: templates/presentations/slide_form.html:22 +msgid "Edit Slide" +msgstr "تحرير الشريحة" + +#: templates/presentations/slide_form.html:22 +msgid "Add New Slide" +msgstr "إضافة شريحة جديدة" + +#: templates/presentations/slide_form.html:39 +msgid "Background Color" +msgstr "لون الخلفية" + +#: templates/presentations/slide_form.html:49 +msgid "Slide title" +msgstr "عنوان الشريحة" + +#: templates/presentations/slide_form.html:56 +msgid "Slide subtitle" +msgstr "عنوان الشريحة الفرعي" + +#: templates/presentations/slide_form.html:60 +msgid "JSON" +msgstr "JSON" + +#: templates/presentations/slide_form.html:64 +msgid "Enter JSON content matching the selected layout type" +msgstr "أدخل محتوى JSON المطابق لنوع التخطيط المحدد" + +#: templates/presentations/slide_form.html:68 +msgid "Speaker Notes" +msgstr "ملاحظات المتحدث" + +#: templates/presentations/slide_form.html:71 +msgid "Notes for the presenter (not shown on slide)" +msgstr "ملاحظات للمقدم (لا تظهر في الشريحة)" + +#: templates/presentations/slide_form.html:78 +msgid "Save Slide" +msgstr "حفظ الشريحة" + +#: templates/presentations/slides/_chart_metrics.html:23 +msgid "Key Insight" +msgstr "الرؤية الأساسية" + +#: templates/presentations/slides/_closing.html:12 +msgid "Thank You" +msgstr "شكرًا لك" + +#: templates/presentations/slides/_cover.html:34 +msgid "Prepared by" +msgstr "من إعداد" + +#: templates/presentations/template_create.html:4 +#: templates/presentations/template_create.html:29 +msgid "Create Report Template" +msgstr "إنشاء قالب تقرير" + +#: templates/presentations/template_create.html:30 +msgid "" +"Upload a reference PDF and select a data source to auto-generate a slide " +"template." +msgstr "تحميل ملف PDF مرجعي واختيار مصدر بيانات لتوليد قالب شريحة تلقائيًا." + +#: templates/presentations/template_list.html:4 +#: templates/presentations/template_list.html:50 +#: templates/reports/report_templates.html:4 +#: templates/reports/report_templates.html:11 +msgid "Report Templates" +msgstr "قوالب التقارير" + +#: templates/presentations/template_list.html:51 +msgid "Define reusable report structures from reference PDFs" +msgstr "تحديد هياكل التقارير القابلة لإعادة الاستخدام من ملفات PDF المرجعية" + +#: templates/presentations/template_list.html:83 +msgid "No templates yet" +msgstr "لا توجد قوالب بعد" + +#: templates/presentations/template_list.html:84 +msgid "Create your first report template by uploading a reference PDF." +msgstr "أنشئ أول قالب تقرير لك عن طريق تحميل ملف PDF مرجعي." + #: templates/projects/convert_action.html:4 msgid "Convert to QI Project" msgstr "تحويل إلى مشروع الجودة والتحسين" @@ -21080,82 +27531,243 @@ msgid "" "project" msgstr "اختر نموذجًا لملء تفاصيل المشروع مسبقًا، أو اتركه فارغًا لمشروع فارغ" -#: templates/projects/convert_action.html:89 -#: templates/projects/project_form.html:4 -#: templates/projects/project_form.html:103 -msgid "Create QI Project" -msgstr "إنشاء مشروع الجودة والتحسين" - #: templates/projects/convert_action.html:106 msgid "PX Action Details" msgstr "تفاصيل إجراء تجربة المريض" -#: templates/projects/convert_action.html:158 -msgid "What happens next?" -msgstr "ماذا سيحدث بعد ذلك؟" - #: templates/projects/convert_action.html:159 msgid "" -"Converting this action to a QI Project will create a structured project with" -" tasks, team members, and outcome tracking." +"Converting this action to a QI Project will create a structured project with " +"tasks, team members, and outcome tracking." msgstr "" "سيؤدي تحويل هذا الإجراء إلى مشروع تحسين جودة إلى إنشاء مشروع منظم مع المهام " "وأعضاء الفريق وتتبع النتائح." +#: templates/projects/focus_phase_detail.html:25 +#: templates/projects/focus_phase_form.html:11 +#: templates/projects/pdca_phase_detail.html:25 +#: templates/projects/pdca_phase_form.html:11 +#: templates/projects/project_confirm_delete.html:11 +#: templates/projects/project_save_as_template.html:11 +#: templates/projects/task_confirm_delete.html:11 +#: templates/projects/task_form.html:104 +msgid "Back to Project" +msgstr "العودة إلى المشروع" + +#: templates/projects/focus_phase_detail.html:54 +#: templates/projects/partials/phase_header.html:34 +#: templates/projects/pdca_phase_detail.html:53 +#: templates/projects/project_detail.html:170 +#: templates/projects/project_detail.html:275 +#: templates/projects/project_detail.html:367 +msgid "Edit Phase" +msgstr "تحرير المرحلة" + +#: templates/projects/focus_phase_detail.html:57 +#: templates/projects/focus_phase_detail.html:123 +#: templates/projects/partials/phase_column.html:21 +#: templates/projects/partials/phase_column.html:24 +#: templates/projects/partials/task_form_modal.html:96 +#: templates/projects/pdca_phase_detail.html:56 +#: templates/projects/pdca_phase_detail.html:122 +#: templates/projects/project_detail.html:213 +#: templates/projects/project_detail.html:216 +#: templates/projects/project_detail.html:318 +#: templates/projects/project_detail.html:321 +#: templates/projects/project_detail.html:352 +#: templates/projects/task_form.html:4 templates/projects/task_form.html:115 +#: templates/projects/task_form.html:227 +msgid "Add Task" +msgstr "إضافة مهمة" + +#: templates/projects/focus_phase_detail.html:72 +#: templates/projects/pdca_phase_detail.html:71 +msgid "Phase Information" +msgstr "معلومات المرحلة" + +#: templates/projects/focus_phase_detail.html:84 +#: templates/projects/focus_phase_form.html:53 +#: templates/projects/partials/phase_form_modal.html:35 +#: templates/projects/pdca_phase_detail.html:83 +#: templates/projects/pdca_phase_form.html:53 +msgid "Owner" +msgstr "المالك" + +#: templates/projects/focus_phase_detail.html:106 +#: templates/projects/focus_phase_form.html:72 +#: templates/projects/partials/phase_form_modal.html:56 +#: templates/projects/pdca_phase_detail.html:105 +#: templates/projects/pdca_phase_form.html:72 +msgid "Findings" +msgstr "النتائج" + +#: templates/projects/focus_phase_detail.html:118 +#: templates/projects/pdca_phase_detail.html:117 +msgid "Phase Tasks" +msgstr "مهام المرحلة" + +#: templates/projects/focus_phase_detail.html:193 +#: templates/projects/pdca_phase_detail.html:192 +msgid "No tasks in this phase yet" +msgstr "لا توجد مهام في هذه المرحلة بعد" + +#: templates/projects/focus_phase_detail.html:196 +#: templates/projects/pdca_phase_detail.html:195 +msgid "Add First Task" +msgstr "إضافة المهمة الأولى" + +#: templates/projects/focus_phase_detail.html:210 +#: templates/projects/focus_phase_form.html:25 +#: templates/projects/project_detail.html:232 +msgid "FOCUS Methodology" +msgstr "منهجية FOCUS" + +#: templates/projects/focus_phase_form.html:21 +#: templates/projects/pdca_phase_form.html:21 +#, python-format +msgid "" +"\n" +" %(phase_label)s Phase - %(project_name)s\n" +" " +msgstr "" +"\n" +"%(phase_label)s المرحلة - %(project_name)s " + +#: templates/projects/focus_phase_form.html:33 +#: templates/projects/partials/phase_form_modal.html:13 +#: templates/projects/pdca_phase_form.html:33 +msgid "Phase Title" +msgstr "عنوان المرحلة" + +#: templates/projects/focus_phase_form.html:73 +#: templates/projects/pdca_phase_form.html:73 +msgid "Key findings and observations for this phase..." +msgstr "النتائج والملاحظات الرئيسية لهذه المرحلة..." + +#: templates/projects/focus_phase_form.html:78 +#: templates/projects/partials/phase_form_modal.html:64 +#: templates/projects/pdca_phase_form.html:78 +msgid "Save Phase" +msgstr "حفظ المرحلة" + +#: templates/projects/my_tasks.html:13 +msgid "All pending items assigned to you across the system" +msgstr "جميع العناصر المعلقة المخصصة لك عبر النظام" + +#: templates/projects/my_tasks.html:118 +msgid "No pending tasks assigned to you." +msgstr "لا توجد مهام معلقة مخصصة لك." + +#: templates/projects/partials/phase_form_modal.html:59 +msgid "Key findings and observations..." +msgstr "النتائج والملاحظات الرئيسية..." + +#: templates/projects/partials/phase_header.html:55 +#: templates/projects/project_detail.html:175 +#: templates/projects/project_detail.html:280 +msgid "Not set up" +msgstr "لم يتم الإعداد" + +#: templates/projects/partials/phase_task_list.html:8 +msgid "No tasks yet" +msgstr "لا توجد مهام بعد" + +#: templates/projects/partials/task_form_modal.html:14 +#: templates/projects/task_form.html:140 +#: templates/projects/template_form.html:182 +#: templates/projects/template_form.html:287 +msgid "Task Title" +msgstr "عنوان المهمة" + +#: templates/projects/partials/task_form_modal.html:76 +#: templates/projects/task_form.html:187 +msgid "PDCA Phase" +msgstr "مرحلة PDCA" + +#: templates/projects/partials/task_form_modal.html:84 +#: templates/projects/task_form.html:202 +msgid "FOCUS Phase" +msgstr "مرحلة FOCUS" + +#: templates/projects/partials/task_row.html:48 +#: templates/projects/partials/task_row.html:100 +#: templates/projects/task_form.html:4 templates/projects/task_form.html:115 +msgid "Edit Task" +msgstr "تعديل المهمة" + +#: templates/projects/partials/task_row.html:106 +#: templates/projects/task_delete_confirm.html:19 +msgid "Are you sure you want to delete this task?" +msgstr "هل أنت متأكد أنك تريد حذف هذه المهمة؟" + +#: templates/projects/pdca_phase_detail.html:209 +#: templates/projects/project_detail.html:128 +msgid "PDCA Cycle" +msgstr "دورة التخطيط والتنفيذ والفحص والتصحيح (PDCA)" + +#: templates/projects/pdca_phase_form.html:25 +msgid "PDCA Cycle Management" +msgstr "إدارة دورة PDCA" + #: templates/projects/project_confirm_delete.html:4 #: templates/projects/project_confirm_delete.html:20 #: templates/projects/project_delete_confirm.html:45 msgid "Delete Project" msgstr "حذف المشروع" -#: templates/projects/project_confirm_delete.html:11 -#: templates/projects/project_save_as_template.html:11 -#: templates/projects/task_confirm_delete.html:11 -#: templates/projects/task_form.html:93 -msgid "Back to Project" -msgstr "العودة إلى المشروع" - #: templates/projects/project_confirm_delete.html:29 -#, fuzzy -#| msgid "Are you sure you want to delete this report?" msgid "Are you sure you want to delete the project" -msgstr "هل أنت متأكد أنك تريد حذف هذا التقرير؟" +msgstr "هل أنت متأكد من رغبتك في حذف المشروع" #: templates/projects/project_confirm_delete.html:41 #, python-format msgid "" "\n" -" This project has %(counter)s task that will also be deleted.\n" +" This project has %(counter)s task that will also " +"be deleted.\n" " " msgid_plural "" "\n" -" This project has %(counter)s tasks that will also be deleted.\n" +" This project has %(counter)s tasks that will " +"also be deleted.\n" " " msgstr[0] "" +"\n" +"يحتوي هذا المشروع على %(counter)s مهمة سيتم حذفها " +"أيضًا. " msgstr[1] "" +"\n" +"يحتوي هذا المشروع على %(counter)s مهمتين سيتم حذفهما " +"أيضًا. " msgstr[2] "" +"\n" +"يحتوي هذا المشروع على %(counter)s مهام سيتم حذفها " +"أيضًا. " msgstr[3] "" +"\n" +"يحتوي هذا المشروع على %(counter)s مهمة سيتم حذفها " +"أيضًا. " msgstr[4] "" +"\n" +"يحتوي هذا المشروع على %(counter)s مهمة سيتم حذفها " +"أيضًا. " msgstr[5] "" +"\n" +"يحتوي هذا المشروع على %(counter)s مهمة سيتم حذفها " +"أيضًا. " #: templates/projects/project_confirm_delete.html:56 -#, fuzzy -#| msgid "Yes, Delete" msgid "Yes, Delete Project" -msgstr "نعم، حذف" +msgstr "نعم، احذف المشروع" #: templates/projects/project_delete_confirm.html:4 #: templates/projects/project_delete_confirm.html:14 -#, fuzzy -#| msgid "QI Projects" msgid "Delete QI Project" -msgstr "مشاريع تحسين الجودة" +msgstr "احذف مشروع تحسين الجودة" #: templates/projects/project_delete_confirm.html:19 -#, fuzzy -#| msgid "Are you sure you want to delete this report?" msgid "Are you sure you want to delete this QI Project?" -msgstr "هل أنت متأكد أنك تريد حذف هذا التقرير؟" +msgstr "هل أنت متأكد من رغبتك في حذف مشروع تحسين الجودة هذا؟" #: templates/projects/project_delete_confirm.html:23 #: templates/projects/task_delete_confirm.html:24 @@ -21166,73 +27778,56 @@ msgstr "المشروع:" #, python-format msgid "" "\n" -" This project has %(count)s task(s) that will also be deleted.\n" +" This project has %(count)s task(s) that will " +"also be deleted.\n" " " msgstr "" "\n" -" هذا المشروع يحتوي على %(count)s مهمة (مهام) سيتم حذفها أيضًا. " +" هذا المشروع يحتوي على %(count)s مهمة (مهام) سيتم " +"حذفها أيضًا. " #: templates/projects/project_delete_confirm.html:38 #: templates/projects/task_delete_confirm.html:28 #: templates/projects/template_delete_confirm.html:32 +#: templates/standards/activity_type_confirm_delete.html:86 #: templates/standards/category_confirm_delete.html:86 #: templates/standards/source_confirm_delete.html:86 msgid "This action cannot be undone." msgstr "لا يمكن التراجع عن هذا الإجراء." -#: templates/projects/project_detail.html:24 +#: templates/projects/project_detail.html:87 #: templates/projects/project_form.html:93 msgid "Back to Projects" msgstr "العودة إلى المشاريع" -#: templates/projects/project_detail.html:45 +#: templates/projects/project_detail.html:111 #: templates/projects/project_save_as_template.html:4 #: templates/projects/project_save_as_template.html:83 msgid "Save as Template" msgstr "حفظ كقالب" -#: templates/projects/project_detail.html:67 -#: templates/projects/task_form.html:4 templates/projects/task_form.html:103 -#: templates/projects/task_form.html:183 -msgid "Add Task" -msgstr "إضافة مهمة" +#: templates/projects/project_detail.html:130 +msgid "Plan - Do - Check - Act" +msgstr "التخطيط - التنفيذ - الفحص - التصحيح" -#: templates/projects/project_detail.html:137 -msgid "No tasks yet" -msgstr "لا توجد مهام بعد" +#: templates/projects/project_detail.html:187 +#: templates/projects/project_detail.html:292 +msgid "Task" +msgstr "مهمة" -#: templates/projects/project_detail.html:140 -msgid "Add First Task" -msgstr "إضافة المهمة الأولى" +#: templates/projects/project_detail.html:205 +#: templates/projects/project_detail.html:310 +msgid "No tasks in this phase" +msgstr "لا توجد مهام في هذه المرحلة" -#: templates/projects/project_detail.html:153 +#: templates/projects/project_detail.html:234 +msgid "Find, Organize, Clarify, Understand, Select" +msgstr "البحث، التنظيم، التوضيح، الفهم، الاختيار" + +#: templates/projects/project_detail.html:338 msgid "Outcomes" msgstr "النتائج" -#: templates/projects/project_detail.html:170 -msgid "Project Info" -msgstr "معلومات المشروع" - -#: templates/projects/project_detail.html:198 -#: templates/projects/project_form.html:265 -#: templates/surveys/analytics_reports.html:219 -msgid "Start Date" -msgstr "تاريخ البدء" - -#: templates/projects/project_detail.html:204 -#: templates/rca/rca_detail.html:500 -msgid "Target Date" -msgstr "التاريخ المستهدف" - -#: templates/projects/project_detail.html:217 -#: templates/projects/project_form.html:252 -msgid "Team Members" -msgstr "أعضاء الفريق" - -#: templates/projects/project_detail.html:239 -msgid "Related Actions" -msgstr "الإجراءات المرتبطة" - #: templates/projects/project_form.html:4 #: templates/projects/project_form.html:103 msgid "Edit QI Project" @@ -21275,26 +27870,35 @@ msgstr "المزيد..." msgid "No predefined tasks in this template." msgstr "لا توجد مهام محددة مسبقاً في هذا القالب." -#: templates/projects/project_form.html:176 +#: templates/projects/project_form.html:182 msgid "Project Name (Arabic)" msgstr "اسم المشروع (بالعربية)" -#: templates/projects/project_form.html:194 +#: templates/projects/project_form.html:200 msgid "Describe the project objectives and scope" msgstr "وصف أهداف المشروع ونطاقه" #: templates/projects/project_form.html:258 +msgid "Team Members" +msgstr "أعضاء الفريق" + +#: templates/projects/project_form.html:264 msgid "Hold Ctrl/Cmd to select multiple team members" msgstr "اضغط باستمرار على مفتاح Ctrl/Cmd لتحديد عدة أعضاء في الفريق" -#: templates/projects/project_form.html:289 +#: templates/projects/project_form.html:295 msgid "Outcome Description" msgstr "وصف النتائج" -#: templates/projects/project_form.html:295 +#: templates/projects/project_form.html:301 msgid "Document project outcomes and results" msgstr "وثّق نتائج و مخرجات المشروع" +#: templates/projects/project_form.html:309 +#: templates/projects/project_list.html:83 +msgid "Create Project" +msgstr "إنشاء مشروع" + #: templates/projects/project_list.html:67 msgid "Quality Improvement Projects" msgstr "مشاريع تحسين الجودة" @@ -21311,6 +27915,10 @@ msgstr "البحث في المشاريع..." msgid "Total Projects" msgstr "إجمالي المشاريع" +#: templates/projects/project_list.html:142 +msgid "All Projects" +msgstr "جميع المشاريع" + #: templates/projects/project_list.html:165 msgid "Project" msgstr "المشروع" @@ -21331,11 +27939,6 @@ msgstr "حفظ المشروع كقالب" msgid "Create a reusable template from" msgstr "إنشاء قالب قابل لإعادة الاستخدام من" -#: templates/projects/project_save_as_template.html:40 -#: templates/projects/template_form.html:136 -msgid "Template Name" -msgstr "اسم القالب" - #: templates/projects/project_save_as_template.html:47 msgid "Enter template name" msgstr "أدخل اسم القالب" @@ -21396,36 +27999,30 @@ msgstr "من المشروع" msgid "Yes, Delete Task" msgstr "نعم، حذف المهمة" -#: templates/projects/task_delete_confirm.html:19 -msgid "Are you sure you want to delete this task?" -msgstr "هل أنت متأكد أنك تريد حذف هذه المهمة؟" - #: templates/projects/task_delete_confirm.html:23 msgid "Task:" msgstr "المهمة:" -#: templates/projects/task_form.html:4 templates/projects/task_form.html:103 -msgid "Edit Task" -msgstr "تعديل المهمة" +#: templates/projects/task_form.html:94 templates/projects/task_form.html:99 +msgid "Back to Phase" +msgstr "العودة إلى المرحلة" -#: templates/projects/task_form.html:107 +#: templates/projects/task_form.html:119 msgid "Create a new task for" msgstr "إنشاء مهمة جديدة لـ" -#: templates/projects/task_form.html:109 +#: templates/projects/task_form.html:120 templates/projects/task_form.html:121 +msgid "phase" +msgstr "مرحلة" + +#: templates/projects/task_form.html:123 msgid "Update task details" msgstr "تحديث تفاصيل المهمة" -#: templates/projects/task_form.html:118 +#: templates/projects/task_form.html:132 msgid "Task Information" msgstr "معلومات المهمة" -#: templates/projects/task_form.html:126 -#: templates/projects/template_form.html:182 -#: templates/projects/template_form.html:287 -msgid "Task Title" -msgstr "عنوان المهمة" - #: templates/projects/template_confirm_delete.html:29 msgid "Are you sure you want to delete the template" msgstr "هل تريد بالتأكيد حذف القالب" @@ -21434,18 +28031,38 @@ msgstr "هل تريد بالتأكيد حذف القالب" #, python-format msgid "" "\n" -" This template has %(counter)s task template that will also be deleted.\n" +" This template has %(counter)s task template that " +"will also be deleted.\n" " " msgid_plural "" "\n" -" This template has %(counter)s task templates that will also be deleted.\n" +" This template has %(counter)s task templates " +"that will also be deleted.\n" " " msgstr[0] "" +"\n" +"يحتوي هذا القالب على %(counter)s قالب مهمة سيتم حذفه " +"أيضًا. " msgstr[1] "" +"\n" +"يحتوي هذا القالب على %(counter)s قالبي مهمة سيتم حذفهما " +"أيضًا. " msgstr[2] "" +"\n" +"يحتوي هذا القالب على %(counter)s قوالب مهام سيتم حذفها " +"أيضًا. " msgstr[3] "" +"\n" +"يحتوي هذا القالب على %(counter)s قوالب مهام سيتم حذفها " +"أيضًا. " msgstr[4] "" +"\n" +"يحتوي هذا القالب على %(counter)s قالب مهمة سيتم حذفه " +"أيضًا. " msgstr[5] "" +"\n" +"يحتوي هذا القالب على %(counter)s قالب مهمة سيتم حذفه " +"أيضًا. " #: templates/projects/template_confirm_delete.html:56 msgid "Yes, Delete Template" @@ -21503,12 +28120,6 @@ msgstr "" msgid "Create Project from Template" msgstr "إنشاء مشروع من القالب" -#: templates/projects/template_form.html:4 -#: templates/surveys/template_detail.html:74 -#: templates/surveys/template_detail.html:244 -msgid "Edit Template" -msgstr "تعديل القالب" - #: templates/projects/template_form.html:112 msgid "Create Project Template" msgstr "إنشاء نموذج مشروع" @@ -21543,8 +28154,7 @@ msgid "" "Templates let you define standard project structures that can be reused " "across your organization." msgstr "" -"تتيح لك القوالب تعريف هياكل معيارية للمشاريع يمكن إعادة استخدامها عبر " -"مؤسستك." +"تتيح لك القوالب تعريف هياكل معيارية للمشاريع يمكن إعادة استخدامها عبر مؤسستك." #: templates/projects/template_form.html:237 msgid "" @@ -21581,6 +28191,120 @@ msgstr "إنشاء قوالب لبدء مشاريع تحسين الجودة بس msgid "Create First Template" msgstr "إنشاء النموذج الأول" +#: templates/px_sources/communication_request_detail.html:4 +#: templates/px_sources/communication_request_detail.html:55 +msgid "Communication Request" +msgstr "طلب اتصال" + +#: templates/px_sources/communication_request_detail.html:88 +#: templates/simulator/log_detail.html:188 +msgid "Request Details" +msgstr "تفاصيل الطلب" + +#: templates/px_sources/communication_request_detail.html:110 +#: templates/px_sources/source_user_create_communication_request.html:35 +msgid "Patient Phone" +msgstr "هاتف المريض" + +#: templates/px_sources/communication_request_detail.html:147 +msgid "Linked Record" +msgstr "السجل المرتبط" + +#: templates/px_sources/communication_request_detail.html:171 +msgid "View Record" +msgstr "عرض السجل" + +#: templates/px_sources/communication_request_detail.html:183 +msgid "Create Record" +msgstr "إنشاء سجل" + +#: templates/px_sources/communication_request_detail.html:186 +msgid "Convert this communication request into a record:" +msgstr "تحويل طلب التواصل هذا إلى سجل:" + +#: templates/px_sources/communication_request_detail.html:195 +msgid "Patient complaint" +msgstr "شكوى المريض" + +#: templates/px_sources/communication_request_detail.html:205 +msgid "Patient inquiry" +msgstr "استفسار المريض" + +#: templates/px_sources/communication_request_detail.html:215 +msgid "Safety observation" +msgstr "ملاحظة سلامة" + +#: templates/px_sources/communication_request_detail.html:225 +msgid "Patient suggestion" +msgstr "اقتراح المريض" + +#: templates/px_sources/communication_request_detail.html:258 +msgid "Add notes about the resolution..." +msgstr "أضف ملاحظات حول الحل..." + +#: templates/px_sources/communication_request_list.html:4 +#: templates/px_sources/communication_request_list.html:49 +#: templates/px_sources/source_user_communication_request_list.html:4 +#: templates/px_sources/source_user_communication_request_list.html:43 +msgid "Communication Requests" +msgstr "طلبات التواصل" + +#: templates/px_sources/communication_request_list.html:51 +msgid "Manage patient communication requests" +msgstr "إدارة طلبات التواصل مع المرضى" + +#: templates/px_sources/communication_request_list.html:63 +#, python-format +msgid "" +"\n" +" %(counter)s pending request requires attention\n" +" " +msgid_plural "" +"\n" +" %(counter)s pending requests require attention\n" +" " +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" +msgstr[5] "" + +#: templates/px_sources/communication_request_list.html:101 +msgid "Requests" +msgstr "الطلبات" + +#: templates/px_sources/communication_request_list.html:169 +msgid "No communication requests found" +msgstr "لم يتم العثور على أي طلبات تواصل" + +#: templates/px_sources/convert_to_complaint_modal.html:4 +#: templates/px_sources/convert_to_complaint_modal.html:17 +msgid "Convert to System Complaint" +msgstr "تحويل إلى شكوى نظامية" + +#: templates/px_sources/convert_to_complaint_modal.html:10 +#: templates/px_sources/source_user_confirm_delete.html:31 +#: templates/px_sources/source_user_form.html:80 +msgid "Back to Source" +msgstr "العودة إلى المصدر" + +#: templates/px_sources/convert_to_complaint_modal.html:18 +msgid "" +"Review and edit the details below before creating the system complaint. " +"Fields are pre-filled from the source complaint." +msgstr "" +"راجع وعدّل التفاصيل أدناه قبل إنشاء شكوى النظام. الحقول مملوءة مسبقًا من " +"الشكوى الأصلية." + +#: templates/px_sources/convert_to_complaint_modal.html:26 +msgid "Source Complaint" +msgstr "الشكوى المصدرية" + +#: templates/px_sources/convert_to_complaint_modal.html:87 +msgid "Create System Complaint" +msgstr "إنشاء شكوى نظامية" + #: templates/px_sources/source_confirm_delete.html:4 #: templates/px_sources/source_confirm_delete.html:24 #: templates/standards/source_confirm_delete.html:4 @@ -21589,11 +28313,6 @@ msgstr "إنشاء النموذج الأول" msgid "Delete Source" msgstr "حذف المصدر" -#: templates/px_sources/source_confirm_delete.html:41 -#: templates/px_sources/source_user_confirm_delete.html:41 -msgid "Confirm Deletion" -msgstr "تأكيد الحذف" - #: templates/px_sources/source_confirm_delete.html:51 msgid "" "Are you sure you want to delete this source? This action cannot be undone." @@ -21637,6 +28356,8 @@ msgstr "نعم، حذف" #: templates/px_sources/source_form.html:174 #: templates/px_sources/source_user_create_complaint.html:47 #: templates/px_sources/source_user_create_inquiry.html:47 +#: templates/px_sources/source_user_create_observation.html:47 +#: templates/px_sources/source_user_create_suggestion.html:47 #: templates/standards/source_form.html:84 msgid "Source Information" msgstr "معلومات المصدر" @@ -21650,58 +28371,100 @@ msgid "Total Usage" msgstr "إجمالي الاستخدام" #: templates/px_sources/source_detail.html:223 -#, fuzzy -#| msgid "Create Item" msgid "Related Items" -msgstr "إنشاء عنصر" +msgstr "العناصر ذات الصلة" -#: templates/px_sources/source_detail.html:302 -#, fuzzy -#| msgid "No complaints from this source yet." +#: templates/px_sources/source_detail.html:243 +msgid "Source Complaints" +msgstr "الشكاوى المصدرية" + +#: templates/px_sources/source_detail.html:309 msgid "No complaints from this source" -msgstr "لا توجد شكاوى من هذا المصدر حتى الآن." +msgstr "لا توجد شكاوى من هذا المصدر" -#: templates/px_sources/source_detail.html:303 +#: templates/px_sources/source_detail.html:310 msgid "Complaints will appear here when submitted through this source" msgstr "ستظهر الشكاوى هنا عند إرسالها من خلال هذا المصدر" -#: templates/px_sources/source_detail.html:366 -#, fuzzy -#| msgid "No inquiries from this source yet." +#: templates/px_sources/source_detail.html:373 msgid "No inquiries from this source" -msgstr "لا توجد استفسارات من هذا المصدر حتى الآن." +msgstr "لا توجد استفسارات من هذا المصدر" -#: templates/px_sources/source_detail.html:367 +#: templates/px_sources/source_detail.html:374 msgid "Inquiries will appear here when submitted through this source" msgstr "ستظهر الاستفسارات هنا عند إرسالها من خلال هذا المصدر" -#: templates/px_sources/source_detail.html:418 +#: templates/px_sources/source_detail.html:383 +msgid "" +"External complaints registered for this source. Convert to system complaints " +"when ready." +msgstr "" +"الشكاوى الخارجية المسجلة لهذا المصدر. قم بتحويلها إلى شكاوى نظامية عند " +"الاستعداد." + +#: templates/px_sources/source_detail.html:386 +msgid "Register Complaint" +msgstr "تسجيل شكوى" + +#: templates/px_sources/source_detail.html:398 +msgid "System Complaint" +msgstr "شكوى النظام" + +#: templates/px_sources/source_detail.html:451 +msgid "No source complaints registered yet" +msgstr "لم يتم تسجيل أي شكاوى من المصادر بعد" + +#: templates/px_sources/source_detail.html:452 +msgid "Click 'Register Complaint' to create one" +msgstr "انقر على 'تسجيل شكوى' لإنشاء واحدة" + +#: templates/px_sources/source_detail.html:504 msgid "No usage records found" msgstr "لم يتم العثور على سجلات استخدام" -#: templates/px_sources/source_detail.html:419 +#: templates/px_sources/source_detail.html:505 msgid "Activity will appear here once feedback is submitted" msgstr "ستظهر النشاطات هنا بمجرد تقديم الملاحظات" -#: templates/px_sources/source_detail.html:433 +#: templates/px_sources/source_detail.html:519 msgid "Quick Stats" msgstr "إحصائيات سريعة" -#: templates/px_sources/source_detail.html:447 +#: templates/px_sources/source_detail.html:533 msgid "Source Users" msgstr "مستخدمو المصدر" -#: templates/px_sources/source_detail.html:487 +#: templates/px_sources/source_detail.html:573 msgid "Add Source User" msgstr "إضافة مستخدم مصدر" -#: templates/px_sources/source_detail.html:493 +#: templates/px_sources/source_detail.html:579 #: templates/px_sources/source_form.html:4 #: templates/px_sources/source_form.html:143 #: templates/px_sources/source_form.html:154 msgid "Edit Source" msgstr "تعديل المصدر" +#: templates/px_sources/source_detail.html:608 +msgid "Register Source Complaint" +msgstr "تسجيل شكوى من مصدر" + +#: templates/px_sources/source_detail.html:610 +msgid "Register a complaint received from this source." +msgstr "تسجيل شكوى وردت من هذا المصدر." + +#: templates/px_sources/source_detail.html:618 +msgid "Brief description of the complaint" +msgstr "وصف مختصر للشكوى" + +#: templates/px_sources/source_detail.html:624 +msgid "Full details of the complaint" +msgstr "التفاصيل الكاملة للشكوى" + +#: templates/px_sources/source_detail.html:631 +msgid "Patient name" +msgstr "اسم المريض" + #: templates/px_sources/source_form.html:4 #: templates/px_sources/source_form.html:143 #: templates/px_sources/source_form.html:154 @@ -21755,10 +28518,6 @@ msgstr "إضافة مصدر" msgid "Search by name, code, or description..." msgstr "البحث بالاسم أو الكود أو الوصف..." -#: templates/px_sources/source_list.html:197 -msgid "Name (AR)" -msgstr "الاسم (بالعربية)" - #: templates/px_sources/source_list.html:199 msgid "Usage" msgstr "الاستخدام" @@ -21772,6 +28531,30 @@ msgstr "لم يتم العثور على مصادر" msgid "Add your first source to get started" msgstr "أضف مصدرك الأول للبدء" +#: templates/px_sources/source_user_communication_request_list.html:45 +msgid "Your requests to the PX team" +msgstr "طلباتك لفريق تجربة المريض" + +#: templates/px_sources/source_user_communication_request_list.html:53 +msgid "New Request" +msgstr "طلب جديد" + +#: templates/px_sources/source_user_communication_request_list.html:61 +msgid "Pending requests:" +msgstr "الطلبات المعلقة:" + +#: templates/px_sources/source_user_communication_request_list.html:71 +msgid "All Requests" +msgstr "جميع الطلبات" + +#: templates/px_sources/source_user_communication_request_list.html:125 +msgid "No communication requests yet" +msgstr "لا توجد طلبات تواصل بعد" + +#: templates/px_sources/source_user_communication_request_list.html:127 +msgid "Create your first request" +msgstr "أنشئ طلبك الأول" + #: templates/px_sources/source_user_complaint_list.html:4 #: templates/px_sources/source_user_complaint_list.html:70 msgid "My Complaints" @@ -21787,14 +28570,10 @@ msgstr "العنوان، اسم المريض..." #: templates/px_sources/source_user_complaint_list.html:141 #: templates/px_sources/source_user_inquiry_list.html:130 +#: templates/px_sources/source_user_suggestion_list.html:117 msgid "Facility" msgstr "المنشأة" -#: templates/px_sources/source_user_complaint_list.html:174 -#: templates/px_sources/source_user_dashboard.html:39 -msgid "All Complaints" -msgstr "جميع الشكاوى" - #: templates/px_sources/source_user_complaint_list.html:251 msgid "Create your first complaint" msgstr "أنشئ شكواك الأولى" @@ -21807,10 +28586,13 @@ msgid "" " " msgstr "" "\n" -" عرض %(start)s إلى %(end)s من %(total)s شكوى " +" عرض %(start)s إلى %(end)s من %(total)s " +"شكوى " #: templates/px_sources/source_user_complaint_list.html:280 #: templates/px_sources/source_user_inquiry_list.html:259 +#: templates/px_sources/source_user_observation_list.html:237 +#: templates/px_sources/source_user_suggestion_list.html:231 #, python-format msgid "Page %(num)s of %(total)s" msgstr "الصفحة %(num)s من %(total)s" @@ -21821,11 +28603,6 @@ msgstr "الصفحة %(num)s من %(total)s" msgid "Delete Source User" msgstr "حذف مستخدم المصدر" -#: templates/px_sources/source_user_confirm_delete.html:31 -#: templates/px_sources/source_user_form.html:128 -msgid "Back to Source" -msgstr "العودة إلى المصدر" - #: templates/px_sources/source_user_confirm_delete.html:56 msgid "Are you sure you want to remove the following source user?" msgstr "هل أنت متأكد من رغبتك في إزالة مستخدم المصدر التالي؟" @@ -21838,6 +28615,30 @@ msgstr "" "سيفقد المستخدم صلاحية الوصول إلى لوحة تحكم المصدر، ولن يتمكن من إنشاء شكاوى " "أو استفسارات من هذا المصدر." +#: templates/px_sources/source_user_create_communication_request.html:10 +msgid "Back to My Requests" +msgstr "العودة إلى طلباتي" + +#: templates/px_sources/source_user_create_communication_request.html:21 +msgid "Request the PX team to communicate with a patient" +msgstr "اطلب من فريق تجربة المريض (PX) التواصل مع مريض" + +#: templates/px_sources/source_user_create_communication_request.html:30 +msgid "Patient full name" +msgstr "الاسم الكامل للمريض" + +#: templates/px_sources/source_user_create_communication_request.html:42 +msgid "Medical Record Number" +msgstr "رقم الملف الطبي" + +#: templates/px_sources/source_user_create_communication_request.html:62 +msgid "Describe what the patient needs..." +msgstr "صف ما يحتاجه المريض..." + +#: templates/px_sources/source_user_create_communication_request.html:68 +msgid "Send Request" +msgstr "إرسال الطلب" + #: templates/px_sources/source_user_create_complaint.html:31 msgid "Submit a new complaint from" msgstr "قدم شكوى جديدة من" @@ -21848,6 +28649,8 @@ msgstr "سيتم ربط هذه الشكوى تلقائيًا بـ" #: templates/px_sources/source_user_create_complaint.html:50 #: templates/px_sources/source_user_create_inquiry.html:50 +#: templates/px_sources/source_user_create_observation.html:50 +#: templates/px_sources/source_user_create_suggestion.html:50 msgid "All required fields are marked with" msgstr "جميع الحقول المطلوبة محددة بـ" @@ -21855,7 +28658,7 @@ msgstr "جميع الحقول المطلوبة محددة بـ" msgid "Optional - Name of staff involved" msgstr "اختياري - اسم الموظف المشارك" -#: templates/px_sources/source_user_create_complaint.html:252 +#: templates/px_sources/source_user_create_complaint.html:243 msgid "What do you expect as a resolution? (Optional)" msgstr "ما الذي تتوقعه كحل؟ (اختياري)" @@ -21863,18 +28666,42 @@ msgstr "ما الذي تتوقعه كحل؟ (اختياري)" msgid "Submit a new inquiry from" msgstr "إرسال استفسار جديد من" +#: templates/px_sources/source_user_create_inquiry.html:38 +msgid "Back to Inquiries" +msgstr "العودة إلى الاستفسارات" + #: templates/px_sources/source_user_create_inquiry.html:49 msgid "This inquiry will be automatically linked to" msgstr "سيتم ربط هذا الاستفسار تلقائيًا بـ" +#: templates/px_sources/source_user_create_observation.html:31 +msgid "Report a safety observation from" +msgstr "الإبلاغ عن ملاحظة سلامة من" + +#: templates/px_sources/source_user_create_observation.html:49 +msgid "This observation will be automatically linked to" +msgstr "سيتم ربط هذه الملاحظة تلقائياً بـ" + +#: templates/px_sources/source_user_create_observation.html:65 +msgid "Reporter Information" +msgstr "معلومات المبلّغ" + +#: templates/px_sources/source_user_create_suggestion.html:31 +msgid "Share your ideas from" +msgstr "شارك أفكارك من" + +#: templates/px_sources/source_user_create_suggestion.html:38 +msgid "Back to Suggestions" +msgstr "العودة إلى الاقتراحات" + +#: templates/px_sources/source_user_create_suggestion.html:49 +msgid "This suggestion will be automatically linked to" +msgstr "سيتم ربط هذا الاقتراح تلقائياً بـ" + #: templates/px_sources/source_user_dashboard.html:4 msgid "Source User Dashboard" msgstr "لوحة تحكم مستخدم المصدر" -#: templates/px_sources/source_user_dashboard.html:31 -msgid "Welcome" -msgstr "مرحبًا" - #: templates/px_sources/source_user_dashboard.html:61 #: templates/px_sources/source_user_dashboard.html:87 msgid "From your source" @@ -21900,42 +28727,56 @@ msgstr "تقديم شكوى جديدة" msgid "Submit a new inquiry" msgstr "تقديم استفسار جديد" -#: templates/px_sources/source_user_dashboard.html:226 +#: templates/px_sources/source_user_dashboard.html:147 +msgid "Report an observation" +msgstr "الإبلاغ عن ملاحظة" + +#: templates/px_sources/source_user_dashboard.html:163 +msgid "Share an improvement idea" +msgstr "مشاركة فكرة تحسين" + +#: templates/px_sources/source_user_dashboard.html:258 msgid "No complaints from this source yet." msgstr "لا توجد شكاوى من هذا المصدر حتى الآن." -#: templates/px_sources/source_user_dashboard.html:299 +#: templates/px_sources/source_user_dashboard.html:331 msgid "No inquiries from this source yet." msgstr "لا توجد استفسارات من هذا المصدر حتى الآن." #: templates/px_sources/source_user_form.html:4 -#: templates/px_sources/source_user_form.html:112 -#: templates/px_sources/source_user_form.html:122 -#: templates/px_sources/source_user_form.html:342 +#: templates/px_sources/source_user_form.html:64 +#: templates/px_sources/source_user_form.html:74 +msgid "Edit Source User" +msgstr "تعديل مستخدم المصدر" + +#: templates/px_sources/source_user_form.html:4 +#: templates/px_sources/source_user_form.html:64 +#: templates/px_sources/source_user_form.html:74 +#: templates/px_sources/source_user_form.html:330 msgid "Create Source User" msgstr "إنشاء مستخدم مصدر" -#: templates/px_sources/source_user_form.html:142 +#: templates/px_sources/source_user_form.html:95 msgid "Select Existing User" msgstr "اختر مستخدمًا موجودًا" -#: templates/px_sources/source_user_form.html:166 +#: templates/px_sources/source_user_form.html:134 msgid "Choose a user..." msgstr "اختر مستخدمًا..." -#: templates/px_sources/source_user_form.html:181 +#: templates/px_sources/source_user_form.html:149 msgid "" -"Select an existing user to assign as source user. A user can only manage one" -" source." +"Select an existing user to assign as source user. A user can only manage one " +"source." msgstr "" -"اختر مستخدمًا موجودًا لتعيينه كالمستخدم المصدر. يمكن للمستخدم إدارة مصدر " -"واحد فقط." +"اختر مستخدمًا موجودًا لتعيينه كالمستخدم المصدر. يمكن للمستخدم إدارة مصدر واحد " +"فقط." -#: templates/px_sources/source_user_form.html:190 +#: templates/px_sources/source_user_form.html:158 msgid "Quick Tip" msgstr "نصيحة سريعة" -#: templates/px_sources/source_user_form.html:192 +#: templates/px_sources/source_user_form.html:160 msgid "" "If you need to create a new user account first, switch to the 'Create New " "User' tab above." @@ -21943,41 +28784,49 @@ msgstr "" "إذا كنت بحاجة إلى إنشاء حساب مستخدم جديد أولاً، انتقل إلى علامة التبويب " "'إنشاء مستخدم جديد' أعلاه." -#: templates/px_sources/source_user_form.html:211 +#: templates/px_sources/source_user_form.html:179 msgid "This will be the user's login email" msgstr "سيكون هذا البريد الإلكتروني لتسجيل دخول المستخدم" -#: templates/px_sources/source_user_form.html:222 +#: templates/px_sources/source_user_form.html:190 msgid "John" msgstr "جون" -#: templates/px_sources/source_user_form.html:232 +#: templates/px_sources/source_user_form.html:200 msgid "Doe" msgstr "دوا" -#: templates/px_sources/source_user_form.html:284 +#: templates/px_sources/source_user_form.html:252 msgid "Auto-Assignment" msgstr "التعيين التلقائي" -#: templates/px_sources/source_user_form.html:286 +#: templates/px_sources/source_user_form.html:254 msgid "" "The new user will be automatically assigned the PX Admin role and linked to " "this source." msgstr "سيتم تعيين دور مسؤول PX للمستخدم الجديد تلقائيًا وربطه بهذا المصدر." -#: templates/px_sources/source_user_form.html:304 +#: templates/px_sources/source_user_form.html:274 msgid "Inactive users will not be able to access their dashboard." msgstr "لن يتمكن المستخدمون غير النشطين من الوصول إلى لوحة التحكم الخاصة بهم." -#: templates/px_sources/source_user_form.html:318 +#: templates/px_sources/source_user_form.html:289 msgid "Can create complaints" msgstr "يمكنه إنشاء شكاوى" -#: templates/px_sources/source_user_form.html:325 +#: templates/px_sources/source_user_form.html:297 msgid "Can create inquiries" msgstr "يمكنه إنشاء استفسارات" -#: templates/px_sources/source_user_form.html:334 +#: templates/px_sources/source_user_form.html:305 +msgid "Can create observations" +msgstr "يمكن إنشاء ملاحظات" + +#: templates/px_sources/source_user_form.html:313 +msgid "Can create suggestions" +msgstr "يمكن إنشاء اقتراحات" + +#: templates/px_sources/source_user_form.html:322 msgid "" "Permissions control what the source user can do in their dashboard. Uncheck " "to restrict access." @@ -21985,27 +28834,22 @@ msgstr "" "تتحكم الصلاحيات في ما يمكن لمستخدم المصدر القيام به داخل لوحة التحكم. قم " "بإلغاء التحديد لتقييد الصلاحيات." -#: templates/px_sources/source_user_form.html:368 +#: templates/px_sources/source_user_form.html:356 msgid "Please select a user" msgstr "الرجاء اختيار مستخدم" -#: templates/px_sources/source_user_form.html:382 +#: templates/px_sources/source_user_form.html:370 msgid "Please fill in all required fields" msgstr "الرجاء ملء جميع الحقول المطلوبة" -#: templates/px_sources/source_user_form.html:388 +#: templates/px_sources/source_user_form.html:376 msgid "Password must be at least 8 characters" msgstr "يجب أن تكون كلمة المرور 8 أحرف على الأقل" -#: templates/px_sources/source_user_form.html:395 +#: templates/px_sources/source_user_form.html:383 msgid "Passwords do not match" msgstr "كلمتا المرور غير متطابقتين" -#: templates/px_sources/source_user_inquiry_list.html:4 -#: templates/px_sources/source_user_inquiry_list.html:70 -msgid "My Inquiries" -msgstr "استفساراتي" - #: templates/px_sources/source_user_inquiry_list.html:73 msgid "View all inquiries from your source" msgstr "عرض جميع الاستفسارات من مصدرك" @@ -22022,94 +28866,126 @@ msgid "" " " msgstr "" "\n" -" عرض %(start)s إلى %(end)s من %(total)s استفسارات " +" عرض %(start)s إلى %(end)s من %(total)s " +"استفسارات " + +#: templates/px_sources/source_user_observation_list.html:4 +#: templates/px_sources/source_user_observation_list.html:63 +msgid "My Observations" +msgstr "ملاحظاتي" + +#: templates/px_sources/source_user_observation_list.html:65 +msgid "View all observations from your source" +msgstr "عرض جميع الملاحظات من مصدرك" + +#: templates/px_sources/source_user_observation_list.html:95 +msgid "Description, tracking code, location..." +msgstr "الوصف، رمز التتبع، الموقع..." + +#: templates/px_sources/source_user_observation_list.html:210 +msgid "Submit your first observation" +msgstr "تقديم ملاحظتك الأولى" + +#: templates/px_sources/source_user_observation_list.html:225 +#, python-format +msgid "" +"\n" +" Showing %(start)s to %(end)s of %(total)s observations\n" +" " +msgstr "" +"\n" +"عرض %(start)s إلى %(end)s من %(total)s ملاحظة " + +#: templates/px_sources/source_user_suggestion_list.html:4 +#: templates/px_sources/source_user_suggestion_list.html:63 +msgid "My Suggestions" +msgstr "اقتراحاتي" + +#: templates/px_sources/source_user_suggestion_list.html:65 +msgid "View all suggestions from your source" +msgstr "عرض جميع الاقتراحات من مصدرك" + +#: templates/px_sources/source_user_suggestion_list.html:74 +msgid "Create Suggestion" +msgstr "إنشاء اقتراح" + +#: templates/px_sources/source_user_suggestion_list.html:95 +msgid "Title or message..." +msgstr "العنوان أو الرسالة..." + +#: templates/px_sources/source_user_suggestion_list.html:114 +msgid "All Areas" +msgstr "جميع المناطق" + +#: templates/px_sources/source_user_suggestion_list.html:119 +msgid "Technology" +msgstr "تكنولوجيا" + +#: templates/px_sources/source_user_suggestion_list.html:204 +msgid "Submit your first suggestion" +msgstr "قدم اقتراحك الأول" + +#: templates/px_sources/source_user_suggestion_list.html:219 +#, python-format +msgid "" +"\n" +" Showing %(start)s to %(end)s of %(total)s suggestions\n" +" " +msgstr "" +"\n" +"عرض %(start)s إلى %(end)s من %(total)s من الاقتراحات " #: templates/rca/rca_detail.html:58 templates/rca/rca_form.html:29 -#, fuzzy -#| msgid "Linked to:" msgid "Linked to" -msgstr "مرتبط بـ:" - -#: templates/rca/rca_detail.html:73 -#, fuzzy -#| msgid "Approved" -msgid "Approve" -msgstr "معتمد" +msgstr "مرتبط بـ" #: templates/rca/rca_detail.html:109 -#, fuzzy -#| msgid "Patient Details" msgid "Incident Details" -msgstr "تفاصيل المريض" +msgstr "تفاصيل الحادثة" #: templates/rca/rca_detail.html:160 templates/rca/rca_form.html:109 -#, fuzzy -#| msgid "Target Completion Date" msgid "Target Completion" -msgstr "تاريخ الإنجاز المستهدف" +msgstr "الإنجاز المستهدف" #: templates/rca/rca_detail.html:174 templates/rca/rca_form.html:64 msgid "Background" msgstr "الخلفية" #: templates/rca/rca_detail.html:182 templates/rca/rca_form.html:70 -#, fuzzy -#| msgid "Root Cause Analysis" msgid "Root Cause Summary" -msgstr "تحليل السبب الجذري" - -#: templates/rca/rca_detail.html:198 -#, fuzzy -#| msgid "Suggested Timeline" -msgid "Status Timeline" -msgstr "الجدول الزمني المقترح" +msgstr "ملخص السبب الجذري" #: templates/rca/rca_detail.html:241 -#, fuzzy -#| msgid "No usage records found" msgid "No status changes recorded." -msgstr "لم يتم العثور على سجلات استخدام" +msgstr "لم يتم تسجيل أي تغييرات في الحالة." #: templates/rca/rca_detail.html:261 templates/rca/rca_detail.html:406 #: templates/rca/rca_detail.html:447 -#, fuzzy -#| msgid "Add Note" msgid "Add Root Cause" -msgstr "إضافة ملاحظة" +msgstr "إضافة سبب جذري" #: templates/rca/rca_detail.html:294 msgid "No root causes added." msgstr "لا توجد أسباب جوهرية مضافة." -#: templates/rca/rca_detail.html:307 -#, fuzzy -#| msgid "Create Action" -msgid "Corrective Actions" -msgstr "إنشاء إجراء" - #: templates/rca/rca_detail.html:311 templates/rca/rca_detail.html:508 -#, fuzzy -#| msgid "Add Section" msgid "Add Action" -msgstr "إضافة قسم" +msgstr "إضافة إجراء" #: templates/rca/rca_detail.html:352 -#, fuzzy -#| msgid "Status of corrective actions" msgid "No corrective actions added." -msgstr "حالة الإجراءات التصحيحية" +msgstr "لم تتم إضافة أي إجراءات تصحيحية." #: templates/rca/rca_detail.html:390 -#, fuzzy -#| msgid "Note Added" msgid "No notes added." -msgstr "تمت إضافة ملاحظة" +msgstr "لم تتم إضافة أي ملاحظات." #: templates/rca/rca_detail.html:431 msgid "Likelihood" msgstr "الاحتمال" #: templates/rca/rca_detail.html:435 +#: templates/standards/activity_type_confirm_delete.html:131 #: templates/standards/category_confirm_delete.html:139 #: templates/standards/source_confirm_delete.html:147 msgid "Impact" @@ -22120,79 +28996,53 @@ msgid "Contributing Factors" msgstr "العوامل المساعدة" #: templates/rca/rca_detail.html:461 -#, fuzzy -#| msgid "Create Action" msgid "Add Corrective Action" -msgstr "إنشاء إجراء" +msgstr "إضافة إجراء تصحيحي" #: templates/rca/rca_detail.html:481 -#, fuzzy -#| msgid "Related To" msgid "Related Root Cause" -msgstr "مرتبط بـ" +msgstr "السبب الجذري المرتبط" #: templates/rca/rca_detail.html:533 -#, fuzzy -#| msgid "Internal" msgid "Internal note" -msgstr "داخلي" +msgstr "ملاحظة داخلية" #: templates/rca/rca_form.html:4 templates/rca/rca_form.html:12 #: templates/rca/rca_list.html:75 -#, fuzzy -#| msgid "New Case" msgid "New RCA" -msgstr "حالة جديدة" +msgstr "RCA جديد" #: templates/rca/rca_form.html:18 -#, fuzzy -#| msgid "Root Cause Analysis" msgid "New Root Cause Analysis" -msgstr "تحليل السبب الجذري" +msgstr "تحليل جديد لسبب جذري" #: templates/rca/rca_list.html:72 msgid "Investigate incidents and implement corrective actions" msgstr "التحقيق في الحوادث وتنفيذ الإجراءات التصحيحية" -#: templates/rca/rca_list.html:100 templates/rca/rca_list.html:154 -msgid "Draft" -msgstr "مسودة" - #: templates/rca/rca_list.html:122 templates/rca/rca_list.html:160 -#, fuzzy -#| msgid "Reviewed" msgid "Review" -msgstr "تم المراجعة" - -#: templates/rca/rca_list.html:133 templates/rca/rca_list.html:163 -msgid "Approved" -msgstr "معتمد" +msgstr "مراجعة" #: templates/rca/rca_list.html:147 -#, fuzzy -#| msgid "Complaints Registry" msgid "RCA Registry" -msgstr "سجل الشكاوى" +msgstr "سجل RCA" #: templates/rca/rca_list.html:289 -#, fuzzy -#| msgid "Root Cause Analyses" msgid "No Root Cause Analyses found." -msgstr "تحليلات السبب الجذري" +msgstr "لم يتم العثور على تحليلات للأسباب الجذرية." #: templates/rca/rca_list.html:291 -#, fuzzy -#| msgid "Create First Project" msgid "Create First RCA" -msgstr "إنشاء المشروع الأول" +msgstr "إنشاء أول تحليل للأسباب الجذرية" #: templates/references/dashboard.html:4 #: templates/references/dashboard.html:128 #: templates/references/document_view.html:4 #: templates/references/document_view.html:195 #: templates/references/folder_view.html:4 -#: templates/references/folder_view.html:140 -#: templates/references/search.html:4 templates/references/search.html:156 +#: templates/references/folder_view.html:140 templates/references/search.html:4 +#: templates/references/search.html:156 msgid "Reference Section" msgstr "قسم المراجع" @@ -22204,16 +29054,6 @@ msgstr "PX360" msgid "Access and manage reference documents" msgstr "الوصول إلى مستندات المراجع وإدارتها" -#: templates/references/dashboard.html:139 -#: templates/references/document_form.html:363 -#: templates/references/folder_view.html:178 -#: templates/references/folder_view.html:182 -#: templates/standards/attachment_upload.html:116 -#: templates/standards/compliance_form.html:262 -#: templates/standards/department_standards.html:335 -msgid "Upload" -msgstr "رفع" - #: templates/references/dashboard.html:155 msgid "Total Folders" msgstr "إجمالي المجلدات" @@ -22268,11 +29108,14 @@ msgid "Upload a new document" msgstr "تحميل مستند جديد" #: templates/references/document_form.html:182 -#: templates/standards/department_standards.html:329 +#: templates/standards/department_standards.html:428 +#: templates/standards/search.html:546 +#: templates/standards/standard_detail.html:557 msgid "Uploading..." msgstr "جاري التحميل..." #: templates/references/document_form.html:197 +#: templates/standards/standard_form.html:152 msgid "Please fix the following errors:" msgstr "يرجى تصحيح الأخطاء التالية:" @@ -22303,10 +29146,10 @@ msgstr "اسحب وأفلت الملف هنا" #: templates/references/document_form.html:237 msgid "" -"Supported: PDF, DOC, DOCX, XLS, XLSX, PPT, PPTX, TXT, JPG, PNG (Max 50MB)" +"Supported: PDF, DOC, DOCX, XLS, XLSX, PPT, PPTX, TXT, JPG, PNG (Max 100MB)" msgstr "" -"المدعوم: PDF, DOC, DOCX, XLS, XLSX, PPT, PPTX, TXT, JPG, PNG (الحد الأقصى 50" -" ميجابايت)" +"المدعومة: PDF، DOC، DOCX، XLS، XLSX، PPT، PPTX، TXT، JPG، PNG (الحد الأقصى " +"100 ميجابايت)" #: templates/references/document_form.html:254 msgid "Document Information" @@ -22366,6 +29209,10 @@ msgstr "تم التحديث:" msgid "File selected" msgstr "تم اختيار الملف" +#: templates/references/document_form.html:431 +msgid "File size exceeds the 100MB limit." +msgstr "حجم الملف يتجاوز الحد الأقصى البالغ 100 ميجابايت." + #: templates/references/document_view.html:234 msgid "Document Details" msgstr "تفاصيل المستند" @@ -22382,7 +29229,7 @@ msgstr "حجم الملف" #: templates/references/document_view.html:250 #: templates/references/document_view.html:301 -#: templates/references/document_view.html:422 +#: templates/references/document_view.html:421 #: templates/references/folder_view.html:242 #: templates/references/search.html:235 msgid "Version" @@ -22407,12 +29254,12 @@ msgid "Last Modified" msgstr "آخر تعديل" #: templates/references/document_view.html:295 -#: templates/references/document_view.html:415 +#: templates/references/document_view.html:414 msgid "Version History" msgstr "سجل الإصدارات" #: templates/references/document_view.html:303 -#: templates/references/document_view.html:424 +#: templates/references/document_view.html:423 #: templates/references/folder_view.html:241 #: templates/references/search.html:234 #: templates/surveys/analytics_report_info.html:31 @@ -22424,32 +29271,31 @@ msgid "Size" msgstr "الحجم" #: templates/references/document_view.html:341 -#: templates/references/document_view.html:464 +#: templates/references/document_view.html:463 msgid "Download Document" msgstr "تنزيل المستند" #: templates/references/document_view.html:344 -#: templates/references/document_view.html:467 +#: templates/references/document_view.html:466 msgid "Edit Metadata" msgstr "تعديل البيانات الوصفية" #: templates/references/document_view.html:348 -#: templates/references/document_view.html:471 +#: templates/references/document_view.html:470 msgid "Upload New Version" msgstr "رفع إصدار جديد" #: templates/references/document_view.html:352 -#: templates/references/document_view.html:475 +#: templates/references/document_view.html:474 msgid "Delete Document" msgstr "حذف المستند" #: templates/references/document_view.html:379 -#: templates/references/document_view.html:503 +#: templates/references/document_view.html:502 msgid "Related Documents" msgstr "مستندات ذات صلة" #: templates/references/document_view.html:401 -#: templates/references/document_view.html:527 msgid "Are you sure you want to delete this document?" msgstr "هل أنت متأكد من حذف هذا المستند؟" @@ -22539,25 +29385,21 @@ msgstr "تصفية المستندات" msgid "Search by title..." msgstr "البحث حسب العنوان..." -#: templates/references/search.html:298 -msgid "First" -msgstr "الأول" - -#: templates/references/search.html:326 -msgid "Last" -msgstr "الأخيرة" - #: templates/references/search.html:336 msgid "No documents found matching your search criteria" msgstr "لم يتم العثور على مستندات مطابقة لمعايير البحث" +#: templates/references/search.html:338 templates/standards/search.html:438 +#: templates/surveys/comment_list.html:252 +#: templates/surveys/comment_list.html:416 +msgid "Clear Filters" +msgstr "مسح الفلاتر" + #: templates/reports/report_builder.html:5 #: templates/reports/report_builder.html:26 #: templates/reports/report_builder.html:38 -#, fuzzy -#| msgid "Reporter" msgid "Report Builder" -msgstr "المُبلّغ" +msgstr "منشئ التقارير" #: templates/reports/report_builder.html:39 msgid "Create custom reports with filters and export options" @@ -22565,16 +29407,12 @@ msgstr "إنشاء تقارير مخصصة باستخدام عوامل التص #: templates/reports/report_builder.html:56 #: templates/reports/report_detail.html:208 -#, fuzzy -#| msgid "Delete Source" msgid "Data Source" -msgstr "حذف المصدر" +msgstr "مصدر البيانات" #: templates/reports/report_builder.html:71 -#, fuzzy -#| msgid "Start Date" msgid "Year to Date" -msgstr "تاريخ البدء" +msgstr "منذ بداية العام" #: templates/reports/report_builder.html:99 #: templates/reports/report_builder.html:156 @@ -22583,10 +29421,8 @@ msgid "Columns" msgstr "الأعمدة" #: templates/reports/report_builder.html:103 -#, fuzzy -#| msgid "Clear All Logs" msgid "Clear All" -msgstr "مسح جميع السجلات" +msgstr "مسح الكل" #: templates/reports/report_builder.html:108 msgid "Select a data source to see available columns" @@ -22595,44 +29431,32 @@ msgstr "اختر مصدر بيانات لرؤية الأعمدة المتاحة" #: templates/reports/report_builder.html:118 #: templates/reports/report_builder.html:181 #: templates/reports/report_builder.html:203 -#, fuzzy -#| msgid "Saved Reports" msgid "Save Report" -msgstr "التقارير المحفوظة" +msgstr "حفظ التقرير" #: templates/reports/report_builder.html:150 -#, fuzzy -#| msgid "Copied to clipboard!" msgid "Copy to Clipboard" -msgstr "تم النسخ إلى الحافظة!" +msgstr "نسخ إلى الحافظة" #: templates/reports/report_builder.html:166 msgid "Configure your report and click \\" msgstr "قم بتكوين التقرير ثم انقر على \\" #: templates/reports/report_builder.html:186 -#, fuzzy -#| msgid "Reporter" msgid "Report Name" -msgstr "المُبلّغ" +msgstr "اسم التقرير" #: templates/reports/report_builder.html:187 -#, fuzzy -#| msgid "Enter project name" msgid "Enter report name" -msgstr "أدخل اسم المشروع" +msgstr "أدخل اسم التقرير" #: templates/reports/report_builder.html:191 -#, fuzzy -#| msgid "Enter folder description (English)" msgid "Enter description (optional)" -msgstr "أدخل وصف المجلد (بالإنجليزية)" +msgstr "أدخل الوصف (اختياري)" #: templates/reports/report_builder.html:195 -#, fuzzy -#| msgid "Failed to switch hospital: " msgid "Share with my hospital" -msgstr "فشل في تبديل المستشفى:" +msgstr "مشاركة مع مستشفاي" #: templates/reports/report_detail.html:52 #: templates/reports/saved_reports.html:112 @@ -22640,16 +29464,12 @@ msgid "Shared" msgstr "مشترك" #: templates/reports/report_detail.html:58 -#, fuzzy -#| msgid "Last Month" msgid "Last run:" -msgstr "الشهر الماضي" +msgstr "آخر تشغيل:" #: templates/reports/report_detail.html:72 -#, fuzzy -#| msgid "Excellent" msgid "Excel" -msgstr "ممتاز" +msgstr "إكسل" #: templates/reports/report_detail.html:78 #: templates/reports/saved_reports.html:129 @@ -22663,55 +29483,40 @@ msgid "Showing 100 of %(count)s records" msgstr "عرض 100 من %(count)s سجل" #: templates/reports/report_detail.html:170 -#, fuzzy -#| msgid "No tasks found" msgid "No data found" -msgstr "لم يتم العثور على مهام" +msgstr "لم يتم العثور على بيانات" #: templates/reports/report_detail.html:171 msgid "" -"The report filters may be too restrictive or no data exists for the selected" -" criteria." +"The report filters may be too restrictive or no data exists for the selected " +"criteria." msgstr "" "قد تكون مرشحات التقرير مقيدة للغاية أو لا توجد بيانات للمعايير المحددة." #: templates/reports/report_detail.html:190 -#, fuzzy -#| msgid "Reminder Configuration" msgid "Filter Configuration" -msgstr "إعداد التذكير" +msgstr "تكوين الفلتر" #: templates/reports/report_detail.html:200 -#, fuzzy -#| msgid "No Mappings Configured" msgid "No filters configured" -msgstr "لم يتم تكوين أي تعيينات" +msgstr "لم يتم تكوين أي فلاتر" + +#: templates/reports/report_detail.html:205 +msgid "Report Details" +msgstr "تفاصيل التقرير" #: templates/reports/report_detail.html:221 -#, fuzzy -#| msgid "Last Month" msgid "Last Run" -msgstr "الشهر الماضي" +msgstr "آخر تشغيل" #: templates/reports/report_detail.html:227 -#, fuzzy -#| msgid "Last Month" msgid "Last Run Count" -msgstr "الشهر الماضي" - -#: templates/reports/report_templates.html:4 -#: templates/reports/report_templates.html:11 -msgid "Report Templates" -msgstr "قوالب التقارير" +msgstr "عدد مرات التشغيل الأخيرة" #: templates/reports/report_templates.html:12 msgid "Pre-built report templates for quick report generation" msgstr "قوالب تقارير جاهزة لإنشاء التقارير بسرعة" -#: templates/reports/report_templates.html:16 -msgid "Custom Report" -msgstr "تقرير مخصص" - #: templates/reports/report_templates.html:27 msgid "Complaints Reports" msgstr "تقارير الشكاوى" @@ -22876,10 +29681,6 @@ msgstr "تحليل وقت الحل" msgid "Average resolution time metrics" msgstr "متوسط وقت حل المقاييس" -#: templates/reports/report_templates.html:168 -msgid "Monthly Summary" -msgstr "ملخص شهري" - #: templates/reports/report_templates.html:169 msgid "Overall monthly performance summary" msgstr "ملخص الأداء الشهري الشامل" @@ -22889,52 +29690,35 @@ msgid "Back to Saved Reports" msgstr "العودة إلى التقارير المحفوظة" #: templates/reports/saved_reports.html:41 -#, fuzzy -#| msgid "View and manage your notifications" msgid "View and manage your saved reports" -msgstr "عرض وإدارة إشعاراتك" +msgstr "عرض وإدارة تقاريرك المحفوظة" #: templates/reports/saved_reports.html:45 -#, fuzzy -#| msgid "Create Report" msgid "Create New Report" -msgstr "إنشاء تقرير" +msgstr "إنشاء تقرير جديد" #: templates/reports/saved_reports.html:55 -#, fuzzy -#| msgid "Search projects..." msgid "Search reports..." -msgstr "البحث في المشاريع..." +msgstr "البحث في التقارير..." #: templates/reports/saved_reports.html:106 -#, fuzzy -#| msgid "Last Month" msgid "Last run" -msgstr "الشهر الماضي" +msgstr "آخر تشغيل" #: templates/reports/saved_reports.html:143 -#, fuzzy, python-format -#| msgid "" -#| "\n" -#| " Showing %(start)s to %(end)s of %(total)s inquiries\n" -#| " " +#, python-format msgid "Showing %(start)s to %(end)s of %(total)s reports" -msgstr "عرض %(start)s إلى %(end)s من %(total)s استفسارات" +msgstr "عرض %(start)s إلى %(end)s من إجمالي %(total)s تقريرًا" #: templates/reports/saved_reports.html:174 -#, fuzzy -#| msgid "No enhanced reports found" msgid "No saved reports found" -msgstr "لم يتم العثور على تقارير متقدمة" +msgstr "لم يتم العثور على تقارير محفوظة" #: templates/reports/saved_reports.html:175 -#, fuzzy -#| msgid "Create your first rule to get started" msgid "Create your first report using the Report Builder" -msgstr "قم بإنشاء قاعدتك الأولى للبدء" +msgstr "أنشئ تقريرك الأول باستخدام أداة إنشاء التقارير" -#: templates/simulator/log_detail.html:4 -#: templates/simulator/log_detail.html:54 +#: templates/simulator/log_detail.html:4 templates/simulator/log_detail.html:54 msgid "HIS Log" msgstr "سجل نظام المعلومات الصحية" @@ -22946,16 +29730,11 @@ msgstr "تفاصيل الطلب والاستجابة" msgid "Back to Logs" msgstr "العودة إلى السجلات" -#: templates/simulator/log_detail.html:72 -#: templates/simulator/log_list.html:221 templates/simulator/log_list.html:295 +#: templates/simulator/log_detail.html:72 templates/simulator/log_list.html:221 +#: templates/simulator/log_list.html:295 msgid "HIS Event" msgstr "حدث نظام المعلومات الصحية" -#: templates/simulator/log_detail.html:83 -#: templates/simulator/log_list.html:277 -msgid "Timestamp" -msgstr "الطابع الزمني" - #: templates/simulator/log_detail.html:105 msgid "IP Address" msgstr "عنوان IP" @@ -22968,13 +29747,9 @@ msgstr "وكيل المستخدم" msgid "Related Objects" msgstr "العناصر المرتبطة" -#: templates/simulator/log_detail.html:188 -msgid "Request Details" -msgstr "تفاصيل الطلب" - #: templates/simulator/log_detail.html:214 -#: templates/surveys/template_form.html:312 -#: templates/surveys/template_form.html:411 +#: templates/surveys/template_form.html:416 +#: templates/surveys/template_form.html:564 msgid "Event Type" msgstr "نوع الحدث" @@ -22993,6 +29768,13 @@ msgstr "معرّف الرحلة" msgid "Request Payload" msgstr "محتوى الطلب (Payload)" +#: templates/simulator/log_detail.html:268 +#: templates/simulator/log_detail.html:283 +#: templates/social/partials/ai_analysis_bilingual.html:83 +#: templates/social/partials/ai_analysis_bilingual.html:89 +msgid "Copy" +msgstr "نسخ" + #: templates/simulator/log_detail.html:280 msgid "Response Data" msgstr "بيانات الاستجابة" @@ -23028,12 +29810,6 @@ msgstr "مسح جميع السجلات" msgid "Total Requests" msgstr "إجمالي الطلبات" -#: templates/simulator/log_list.html:124 templates/simulator/log_list.html:228 -#: templates/surveys/bulk_job_list.html:87 -#: templates/surveys/bulk_job_status.html:55 -msgid "Success" -msgstr "ناجح" - #: templates/simulator/log_list.html:136 msgid "Success Rate" msgstr "نسبة النجاح" @@ -23050,10 +29826,6 @@ msgstr "حسب القناة" msgid "HIS Events" msgstr "أحداث نظام المعلومات الصحية" -#: templates/simulator/log_list.html:173 -msgid "By Status" -msgstr "حسب الحالة" - #: templates/simulator/log_list.html:191 msgid "By Hospital" msgstr "حسب المستشفى" @@ -23066,11 +29838,285 @@ msgstr "وقت المعالجة" msgid "No HIS logs found." msgstr "لم يتم العثور على سجلات لنظام المعلومات الصحية." +#: templates/social/comment_detail.html:4 +#, fuzzy +#| msgid "Comment Details" +msgid "Comment Detail" +msgstr "تفاصيل التعليق" + +#: templates/social/comment_detail.html:45 +#, fuzzy +#| msgid "Back to Content" +msgid "Back to Comments" +msgstr "العودة إلى المحتوى" + +#: templates/social/comment_detail.html:51 +#, fuzzy +#| msgid "Comments Analysis" +msgid "Comment Detail & AI Analysis" +msgstr "تحليل التعليقات" + +#: templates/social/comment_detail.html:64 +#, fuzzy +#| msgid "Internal Comment" +msgid "Original Comment" +msgstr "تعليق داخلي" + +#: templates/social/comment_detail.html:93 +#, fuzzy +#| msgid "Likes" +msgid "likes" +msgstr "إعجابات" + +#: templates/social/comment_detail.html:99 +#, fuzzy +#| msgid "Replies" +msgid "replies" +msgstr "ردود" + +#: templates/social/comment_detail.html:105 +msgid "Real-time" +msgstr "" + +#: templates/social/comment_detail.html:145 +#, fuzzy +#| msgid "Score" +msgid "Score:" +msgstr "النتيجة" + +#: templates/social/comment_detail.html:159 +#, fuzzy +#| msgid "Emergency:" +msgid "Urgency:" +msgstr "حالة طارئة:" + +#: templates/social/comment_detail.html:204 #: templates/social/partials/ai_analysis_bilingual.html:128 #: templates/social/social_comment_detail.html:159 msgid "Topics" msgstr "الموضوعات" +#: templates/social/comment_detail.html:238 +#, fuzzy +#| msgid "Predictive Insights" +msgid "Actionable Insights" +msgstr "بصائر تنبؤية" + +#: templates/social/comment_detail.html:242 +#, fuzzy +#| msgid "Primary Contact" +msgid "Primary Concern" +msgstr "جهة الاتصال الرئيسية" + +#: templates/social/comment_detail.html:248 +#, fuzzy +#| msgid "Add Department" +msgid "Affected Department" +msgstr "إضافة قسم" + +#: templates/social/comment_detail.html:254 +#, fuzzy +#| msgid "PR Follow-up" +msgid "Requires Follow-up" +msgstr "متابعة العلاقات العامة" + +#: templates/social/comment_detail.html:286 +#, fuzzy +#| msgid "AI Analysis" +msgid "AI Analysis Pending" +msgstr "تحليل الذكاء الاصطناعي" + +#: templates/social/comment_detail.html:287 +#, fuzzy +#| msgid "Patient has not been contacted yet." +msgid "This comment has not been analyzed yet" +msgstr "لم يتم الاتصال بالمريض بعد." + +#: templates/social/comment_detail.html:298 +#: templates/social/social_comment_detail.html:85 +msgid "Replies" +msgstr "ردود" + +#: templates/social/comment_detail.html:327 +#: templates/social/comment_detail.html:353 +#, fuzzy +#| msgid "Submit Reply" +msgid "Post Reply" +msgstr "إرسال الرد" + +#: templates/social/comment_detail.html:333 +#, fuzzy +#| msgid "Your Final Reply" +msgid "Your Reply" +msgstr "ردك النهائي" + +#: templates/social/comment_detail.html:336 +#, fuzzy +#| msgid "Type your answer here..." +msgid "Type your reply..." +msgstr "اكتب إجابتك هنا..." + +#: templates/social/comment_detail.html:369 templates/social/dashboard.html:169 +#: templates/social/social_analytics.html:245 +#: templates/social/social_comment_detail.html:212 +#: templates/social/social_comment_list.html:176 +msgid "Platform" +msgstr "المنصة" + +#: templates/social/comment_detail.html:373 +#: templates/social/social_comment_detail.html:204 +msgid "Comment ID" +msgstr "معرّف التعليق" + +#: templates/social/comment_detail.html:383 +#, fuzzy +#| msgid "Post ID" +msgid "Posted" +msgstr "معرف المنشور" + +#: templates/social/comment_detail.html:387 +#, fuzzy +#| msgid "Collector:" +msgid "Collected" +msgstr "المُجمِّع:" + +#: templates/social/comment_detail.html:394 +#, fuzzy +#| msgid "Viewed" +msgid "View Media" +msgstr "تمت المشاهدة" + +#: templates/social/comments_list.html:52 +msgid "Monitor and analyze social media comments and reviews" +msgstr "" + +#: templates/social/comments_list.html:117 +#: templates/social/social_platform.html:188 +msgid "Search comments..." +msgstr "البحث في التعليقات..." + +#: templates/social/comments_list.html:133 +msgid "Webhook" +msgstr "" + +#: templates/social/comments_list.html:134 +msgid "Synced" +msgstr "" + +#: templates/social/comments_list.html:157 +msgid "Author" +msgstr "" + +#: templates/social/comments_list.html:161 +#: templates/social/social_comment_detail.html:78 +msgid "Likes" +msgstr "إعجابات" + +#: templates/social/comments_list.html:232 +#: templates/social/social_comment_list.html:298 +msgid "No comments found" +msgstr "لم يتم العثور على تعليقات" + +#: templates/social/comments_list.html:233 +#, fuzzy +#| msgid "Try adjusting your filters or add a new patient" +msgid "Try adjusting your filters or sync new comments" +msgstr "جرب تعديل عوامل التصفية أو أضف مريضًا جديدًا" + +#: templates/social/comments_list.html:245 +#, fuzzy, python-format +#| msgid "" +#| "\n" +#| " Showing %(start)s to %(end)s of %(total)s inquiries\n" +#| " " +msgid "" +"\n" +" Showing %(start)s-%(end)s of %(total)s\n" +" " +msgstr "" +"\n" +" عرض %(start)s إلى %(end)s من %(total)s " +"استفسارات " + +#: templates/social/dashboard.html:5 templates/social/dashboard.html:60 +#, fuzzy +#| msgid "Social Media" +msgid "Social Media Dashboard" +msgstr "وسائل التواصل الاجتماعي" + +#: templates/social/dashboard.html:62 +#, fuzzy +#| msgid "Manage hospital sections and departments" +msgid "Manage connected social accounts and monitor comments" +msgstr "إدارة أقسام وفروع المستشفى" + +#: templates/social/dashboard.html:96 +#, fuzzy +#| msgid "Not Contacted" +msgid "Not connected" +msgstr "لم يتم الاتصال" + +#: templates/social/dashboard.html:117 +#, fuzzy, python-format +#| msgid "Last Assessed Date" +msgid "Last synced: %(date)s" +msgstr "تاريخ آخر تقييم" + +#: templates/social/dashboard.html:122 +msgid "Never synced" +msgstr "" + +#: templates/social/dashboard.html:129 +#, fuzzy +#| msgid "Comments" +msgid "View Comments" +msgstr "التعليقات" + +#: templates/social/dashboard.html:133 +#, fuzzy +#| msgid "Quick Search" +msgid "Quick Sync" +msgstr "بحث سريع" + +#: templates/social/dashboard.html:135 +msgid "Full sync may take several minutes. Continue?" +msgstr "" + +#: templates/social/dashboard.html:137 +#, fuzzy +#| msgid "Full name" +msgid "Full Sync" +msgstr "الاسم الكامل" + +#: templates/social/dashboard.html:146 +#, fuzzy +#| msgid "Continue to Account Setup" +msgid "Connect Account" +msgstr "المتابعة إلى إعداد الحساب" + +#: templates/social/dashboard.html:162 +#, fuzzy +#| msgid "Contacted At" +msgid "Connected Accounts" +msgstr "وقت الاتصال" + +#: templates/social/dashboard.html:172 +#, fuzzy +#| msgid "Last HIS Sync" +msgid "Last Synced" +msgstr "آخر مزامنة مع نظام معلومات المستشفى" + +#: templates/social/dashboard.html:211 +#, fuzzy +#| msgid "All Accounts Activated" +msgid "No Accounts Connected" +msgstr "جميع الحسابات مفعلة" + +#: templates/social/dashboard.html:212 +msgid "" +"Connect your social media accounts to start monitoring comments and reviews" +msgstr "" + #: templates/social/partials/ai_analysis_bilingual.html:221 msgid "Analyzed with" msgstr "تم التحليل باستخدام" @@ -23099,11 +30145,6 @@ msgstr "من تاريخ" msgid "Date to" msgstr "إلى تاريخ" -#: templates/social/social_analytics.html:44 -#: templates/social/social_comment_list.html:115 -msgid "Total Comments" -msgstr "إجمالي التعليقات" - #: templates/social/social_analytics.html:55 msgid "analyzed" msgstr "تم تحليلها" @@ -23144,17 +30185,6 @@ msgstr "لم يتم العثور على موضوعات" msgid "Platform Breakdown" msgstr "تفصيل حسب المنصة" -#: templates/social/social_analytics.html:245 -#: templates/social/social_comment_detail.html:212 -#: templates/social/social_comment_list.html:176 -msgid "Platform" -msgstr "المنصة" - -#: templates/social/social_analytics.html:246 -#: templates/surveys/comment_list.html:91 -msgid "Comments" -msgstr "التعليقات" - #: templates/social/social_analytics.html:247 #: templates/social/social_platform.html:146 msgid "Avg Sentiment" @@ -23180,14 +30210,6 @@ msgstr "لم يتم العثور على كيانات" msgid "Comment Details" msgstr "تفاصيل التعليق" -#: templates/social/social_comment_detail.html:78 -msgid "Likes" -msgstr "إعجابات" - -#: templates/social/social_comment_detail.html:85 -msgid "Replies" -msgstr "ردود" - #: templates/social/social_comment_detail.html:92 msgid "Ago" msgstr "مضت" @@ -23216,18 +30238,10 @@ msgstr "البيانات الخام" msgid "Comment Info" msgstr "معلومات التعليق" -#: templates/social/social_comment_detail.html:204 -msgid "Comment ID" -msgstr "معرّف التعليق" - #: templates/social/social_comment_detail.html:208 msgid "Post ID" msgstr "معرف المنشور" -#: templates/social/social_comment_detail.html:216 -msgid "Published" -msgstr "منشور" - #: templates/social/social_comment_detail.html:226 msgid "Scraped" msgstr "تم الجمع آليًا" @@ -23248,10 +30262,6 @@ msgstr "حذف التعليق" msgid "Track social media mentions and sentiment across all platforms" msgstr "تتبع الإشارات والانطباعات عبر جميع منصات التواصل الاجتماعي" -#: templates/social/social_comment_list.html:76 -msgid "Analytics" -msgstr "التحليلات" - #: templates/social/social_comment_list.html:99 #: templates/social/social_platform.html:111 msgid "comments" @@ -23279,10 +30289,6 @@ msgstr "موجز التعليقات" msgid "Not Analyzed" msgstr "غير محلل" -#: templates/social/social_comment_list.html:298 -msgid "No comments found" -msgstr "لم يتم العثور على تعليقات" - #: templates/social/social_platform.html:111 msgid "Monitor and analyze" msgstr "المراقبة والتحليل" @@ -23308,14 +30314,122 @@ msgstr "كل الوقت" msgid "This Week" msgstr "هذا الأسبوع" -#: templates/social/social_platform.html:188 -msgid "Search comments..." -msgstr "البحث في التعليقات..." - #: templates/social/social_platform.html:286 msgid "No comments found for this platform" msgstr "لم يتم العثور على تعليقات لهذه المنصة" +#: templates/standards/activity_type_confirm_delete.html:4 +#: templates/standards/activity_type_confirm_delete.html:66 +#: templates/standards/activity_type_confirm_delete.html:114 +msgid "Delete Activity Type" +msgstr "حذف نوع النشاط" + +#: templates/standards/activity_type_confirm_delete.html:67 +msgid "Confirm deletion of activity type" +msgstr "تأكيد حذف نوع النشاط" + +#: templates/standards/activity_type_confirm_delete.html:71 +#: templates/standards/activity_type_form.html:71 +msgid "Back to Activity Types" +msgstr "العودة إلى أنواع الأنشطة" + +#: templates/standards/activity_type_confirm_delete.html:91 +msgid "Are you sure you want to delete this activity type?" +msgstr "هل أنت متأكد من رغبتك في حذف نوع النشاط هذا؟" + +#: templates/standards/activity_type_confirm_delete.html:100 +#: templates/standards/activity_type_list.html:123 +#: templates/standards/category_confirm_delete.html:108 +#: templates/standards/category_list.html:126 +#: templates/standards/source_confirm_delete.html:104 +#: templates/standards/source_list.html:126 +msgid "Arabic Name" +msgstr "الاسم بالعربية" + +#: templates/standards/activity_type_confirm_delete.html:135 +msgid "Deleting this activity type will affect:" +msgstr "سيؤثر حذف نوع النشاط هذا على:" + +#: templates/standards/activity_type_confirm_delete.html:140 +msgid "" +"All standards linked to this activity type will have their activity type set " +"to null" +msgstr "" +"سيتم تعيين نوع النشاط لجميع المعايير المرتبطة بنوع النشاط هذا إلى قيمة فارغة." + +#: templates/standards/activity_type_confirm_delete.html:145 +#: templates/standards/category_confirm_delete.html:161 +#: templates/standards/source_confirm_delete.html:169 +msgid "Consider:" +msgstr "يُفضّل مراعاة ما يلي:" + +#: templates/standards/activity_type_confirm_delete.html:145 +msgid "" +"You may want to mark this activity type as inactive instead of deleting it." +msgstr "قد ترغب في تعيين نوع النشاط هذا كغير نشط بدلاً من حذفه." + +#: templates/standards/activity_type_form.html:4 +#: templates/standards/activity_type_form.html:66 +#: templates/standards/activity_type_form.html:129 +msgid "Update Activity Type" +msgstr "تحديث نوع النشاط" + +#: templates/standards/activity_type_form.html:4 +#: templates/standards/activity_type_form.html:66 +#: templates/standards/activity_type_form.html:129 +msgid "Create Activity Type" +msgstr "إنشاء نوع النشاط" + +#: templates/standards/activity_type_form.html:67 +msgid "Edit activity type" +msgstr "تعديل نوع النشاط" + +#: templates/standards/activity_type_form.html:67 +msgid "Add new activity type" +msgstr "إضافة نوع نشاط جديد" + +#: templates/standards/activity_type_form.html:84 +msgid "Activity Type Information" +msgstr "معلومات نوع النشاط" + +#: templates/standards/activity_type_form.html:152 +msgid "" +"Activity types categorize standards by the type of activity they relate to." +msgstr "تصنف أنواع الأنشطة المعايير حسب نوع النشاط الذي تتعلق به." + +#: templates/standards/activity_type_form.html:155 +#: templates/standards/source_form.html:177 +#: templates/standards/standard_form.html:366 +msgid "Examples:" +msgstr "أمثلة:" + +#: templates/standards/activity_type_form.html:163 +#: templates/standards/category_form.html:194 +#: templates/standards/source_form.html:185 +msgid "Active Status" +msgstr "الحالة النشطة" + +#: templates/standards/activity_type_form.html:165 +msgid "Only active activity types can be used when creating new standards." +msgstr "يمكن استخدام أنواع الأنشطة النشطة فقط عند إنشاء معايير جديدة." + +#: templates/standards/activity_type_list.html:96 +msgid "Manage activity types for standards" +msgstr "إدارة أنواع الأنشطة للمعايير" + +#: templates/standards/activity_type_list.html:100 +#: templates/standards/activity_type_list.html:183 +msgid "Add Activity Type" +msgstr "إضافة نوع نشاط" + +#: templates/standards/activity_type_list.html:180 +msgid "No activity types found" +msgstr "لم يتم العثور على أنواع أنشطة" + +#: templates/standards/activity_type_list.html:181 +msgid "Add your first activity type to get started" +msgstr "أضف أول نوع نشاط للبدء" + #: templates/standards/attachment_confirm_delete.html:4 #: templates/standards/attachment_confirm_delete.html:44 #: templates/standards/attachment_confirm_delete.html:104 @@ -23336,7 +30450,9 @@ msgid "This action cannot be undone. The file will be permanently deleted." msgstr "هذا الإجراء لا يمكن التراجع عنه. سيتم حذف الملف بشكل دائم." #: templates/standards/attachment_confirm_delete.html:69 -#: templates/standards/department_standards.html:767 +#: templates/standards/department_standards.html:866 +#: templates/standards/search.html:841 +#: templates/standards/standard_detail.html:869 msgid "Are you sure you want to delete this attachment?" msgstr "هل أنت متأكد من رغبتك في حذف هذا المرفق؟" @@ -23344,22 +30460,14 @@ msgstr "هل أنت متأكد من رغبتك في حذف هذا المرفق؟ msgid "Upload Date" msgstr "تاريخ التحميل" -#: templates/standards/attachment_confirm_delete.html:90 -#: templates/standards/attachment_upload.html:139 -#: templates/standards/dashboard.html:252 -msgid "Standard" -msgstr "المعيار" - -#: templates/standards/attachment_upload.html:4 -msgid "Upload Evidence" -msgstr "رفع الأدلة" - #: templates/standards/attachment_upload.html:66 msgid "Upload Evidence Attachment" msgstr "رفع مرفق الأدلة" #: templates/standards/attachment_upload.html:85 -#: templates/standards/department_standards.html:304 +#: templates/standards/department_standards.html:403 +#: templates/standards/search.html:522 +#: templates/standards/standard_detail.html:541 msgid "Upload New Attachment" msgstr "رفع مرفق جديد" @@ -23372,7 +30480,9 @@ msgid "Compliance Details" msgstr "تفاصيل الامتثال" #: templates/standards/attachment_upload.html:184 -#: templates/standards/department_standards.html:346 +#: templates/standards/department_standards.html:445 +#: templates/standards/search.html:561 +#: templates/standards/standard_detail.html:568 msgid "Existing Attachments" msgstr "المرفقات الحالية" @@ -23386,13 +30496,6 @@ msgstr "حذف الفئة" msgid "Confirm deletion of standard category" msgstr "تأكيد حذف فئة المعيار" -#: templates/standards/category_confirm_delete.html:108 -#: templates/standards/category_list.html:126 -#: templates/standards/source_confirm_delete.html:104 -#: templates/standards/source_list.html:126 -msgid "Arabic Name" -msgstr "الاسم بالعربية" - #: templates/standards/category_confirm_delete.html:143 msgid "Deleting this category will affect:" msgstr "سيؤثر حذف هذه الفئة على:" @@ -23411,11 +30514,6 @@ msgstr "سجلات الامتثال لتلك المعايير" msgid "Any reports or analytics using this data" msgstr "أي تقارير أو تحليلات تستخدم هذه البيانات" -#: templates/standards/category_confirm_delete.html:161 -#: templates/standards/source_confirm_delete.html:169 -msgid "Consider:" -msgstr "يُفضّل مراعاة ما يلي:" - #: templates/standards/category_confirm_delete.html:161 msgid "You may want to mark this category as inactive instead of deleting it." msgstr "قد ترغب في تعيين هذه الفئة كغير نشطة بدلاً من حذفها." @@ -23432,38 +30530,33 @@ msgstr "إضافة فئة معيار جديدة" msgid "Category Information" msgstr "معلومات الفئة" -#: templates/standards/category_form.html:115 +#: templates/standards/category_form.html:125 msgid "Lower numbers appear first in lists" msgstr "تظهر الأرقام الأصغر أولاً في القوائم" -#: templates/standards/category_form.html:161 +#: templates/standards/category_form.html:181 msgid "Category Order" msgstr "ترتيب الفئة" -#: templates/standards/category_form.html:163 +#: templates/standards/category_form.html:183 msgid "" -"Use the order field to control how categories appear in lists and dropdowns." -" Lower numbers appear first." +"Use the order field to control how categories appear in lists and dropdowns. " +"Lower numbers appear first." msgstr "" -"استخدم حقل الترتيب للتحكم في كيفية ظهور الفئات في القوائم والقوائم المنسدلة." -" تظهر الأرقام الأصغر أولاً." +"استخدم حقل الترتيب للتحكم في كيفية ظهور الفئات في القوائم والقوائم المنسدلة. " +"تظهر الأرقام الأصغر أولاً." -#: templates/standards/category_form.html:166 +#: templates/standards/category_form.html:186 msgid "Example:" msgstr "مثال:" -#: templates/standards/category_form.html:174 -#: templates/standards/source_form.html:185 -msgid "Active Status" -msgstr "الحالة النشطة" - -#: templates/standards/category_form.html:176 +#: templates/standards/category_form.html:196 msgid "" "Only active categories can be used when creating new standards. Inactive " "categories remain in the system but are not available for selection." msgstr "" -"يمكن استخدام الفئات النشطة فقط عند إنشاء معايير جديدة. تظل الفئات غير النشطة" -" موجودة في النظام لكنها غير متاحة للاختيار." +"يمكن استخدام الفئات النشطة فقط عند إنشاء معايير جديدة. تظل الفئات غير النشطة " +"موجودة في النظام لكنها غير متاحة للاختيار." #: templates/standards/category_list.html:4 #: templates/standards/category_list.html:95 @@ -23487,6 +30580,7 @@ msgid "Update Compliance Assessment" msgstr "تحديث تقييم الامتثال" #: templates/standards/compliance_form.html:123 +#: templates/standards/standard_detail.html:117 msgid "Back to Standards" msgstr "العودة إلى المعايير" @@ -23496,7 +30590,8 @@ msgid "Standard Details" msgstr "تفاصيل المعيار" #: templates/standards/compliance_form.html:170 -#: templates/standards/department_standards.html:218 +#: templates/standards/department_standards.html:317 +#: templates/standards/search.html:452 msgid "Compliance Assessment" msgstr "تقييم الامتثال" @@ -23505,8 +30600,10 @@ msgid "Last Assessed Date" msgstr "تاريخ آخر تقييم" #: templates/standards/compliance_form.html:198 -#: templates/standards/department_standards.html:250 -#: templates/standards/standard_detail.html:227 +#: templates/standards/department_standards.html:349 +#: templates/standards/search.html:477 +#: templates/standards/standard_detail.html:389 +#: templates/standards/standard_detail.html:500 msgid "Assessor" msgstr "المقيّم" @@ -23515,12 +30612,18 @@ msgid "Assessment Notes" msgstr "ملاحظات التقييم" #: templates/standards/compliance_form.html:218 -#: templates/standards/department_standards.html:263 +#: templates/standards/department_standards.html:362 +#: templates/standards/search.html:487 +#: templates/standards/standard_detail.html:360 +#: templates/standards/standard_detail.html:511 msgid "Evidence Summary" msgstr "ملخص الأدلة" #: templates/standards/compliance_form.html:228 -#: templates/standards/department_standards.html:275 +#: templates/standards/department_standards.html:374 +#: templates/standards/search.html:497 +#: templates/standards/standard_detail.html:365 +#: templates/standards/standard_detail.html:518 msgid "Save Assessment" msgstr "حفظ التقييم" @@ -23532,31 +30635,16 @@ msgstr "مرفقات الأدلة" msgid "Standards Compliance Dashboard" msgstr "لوحة متابعة الامتثال للمعايير" +#: templates/standards/dashboard.html:85 +msgid "Search Standards" +msgstr "بحث المعايير" + #: templates/standards/dashboard.html:89 templates/standards/search.html:72 #: templates/standards/standard_form.html:4 -#: templates/standards/standard_form.html:261 +#: templates/standards/standard_form.html:331 msgid "Create Standard" msgstr "إنشاء معيار" -#: templates/standards/dashboard.html:119 -#: templates/standards/department_standards.html:235 -#: templates/standards/standard_detail.html:162 -msgid "Met" -msgstr "مستوفى" - -#: templates/standards/dashboard.html:147 -#: templates/standards/department_standards.html:237 -#: templates/standards/standard_detail.html:174 -msgid "Not Met" -msgstr "غير مستوفى" - -#: templates/standards/dashboard.html:161 -#: templates/standards/department_standards.html:166 -#: templates/standards/department_standards.html:234 -#: templates/standards/standard_detail.html:180 -msgid "Not Assessed" -msgstr "غير مُقيَّم" - #: templates/standards/dashboard.html:214 msgid "View Standards" msgstr "عرض المعايير" @@ -23573,10 +30661,6 @@ msgstr "لا توجد تحديثات حديثة" msgid "Department Standards" msgstr "معايير القسم" -#: templates/standards/department_standards.html:74 -msgid "Standards Compliance" -msgstr "الامتثال للمعايير" - #: templates/standards/department_standards.html:79 msgid "Add Standard" msgstr "إضافة معيار" @@ -23585,116 +30669,132 @@ msgstr "إضافة معيار" msgid "Search standards..." msgstr "بحث في المعايير..." -#: templates/standards/department_standards.html:106 -msgid "Standards List" -msgstr "قائمة المعايير" +#: templates/standards/department_standards.html:140 +#: templates/standards/search.html:205 +msgid "Toggle sub-standards" +msgstr "تبديل المعايير الفرعية" -#: templates/standards/department_standards.html:187 -#: templates/standards/department_standards.html:192 +#: templates/standards/department_standards.html:210 +#: templates/standards/department_standards.html:215 +#: templates/standards/department_standards.html:285 +#: templates/standards/department_standards.html:290 +#: templates/standards/search.html:277 templates/standards/search.html:282 +#: templates/standards/search.html:352 templates/standards/search.html:357 +#: templates/standards/standard_detail.html:442 msgid "Assess" msgstr "تقييم" -#: templates/standards/department_standards.html:202 -#: templates/standards/search.html:217 +#: templates/standards/department_standards.html:240 +#: templates/standards/search.html:216 templates/standards/search.html:307 +msgid "Sub-Standard" +msgstr "معيار فرعي" + +#: templates/standards/department_standards.html:301 +#: templates/standards/search.html:435 msgid "No standards found" msgstr "لا توجد معايير" -#: templates/standards/department_standards.html:231 +#: templates/standards/department_standards.html:330 +#: templates/standards/search.html:462 +#: templates/standards/standard_detail.html:345 +#: templates/standards/standard_detail.html:483 msgid "Compliance Status" msgstr "حالة الامتثال" -#: templates/standards/department_standards.html:236 -#: templates/standards/standard_detail.html:168 -msgid "Partially Met" -msgstr "مستوفى جزئياً" - -#: templates/standards/department_standards.html:243 +#: templates/standards/department_standards.html:342 +#: templates/standards/search.html:472 +#: templates/standards/standard_detail.html:494 msgid "Assessment Date" msgstr "تاريخ التقييم" -#: templates/standards/department_standards.html:246 +#: templates/standards/department_standards.html:345 +#: templates/standards/search.html:474 msgid "Auto-filled with today's date" msgstr "يُعبّأ تلقائياً بتاريخ اليوم" -#: templates/standards/department_standards.html:253 +#: templates/standards/department_standards.html:352 msgid "Current logged-in user" msgstr "المستخدم الحالي المسجّل دخوله" -#: templates/standards/department_standards.html:259 +#: templates/standards/department_standards.html:358 +#: templates/standards/search.html:484 msgid "Add any notes about the assessment..." msgstr "أضف ملاحظات حول التقييم..." -#: templates/standards/department_standards.html:265 +#: templates/standards/department_standards.html:364 +#: templates/standards/search.html:489 msgid "Summarize the evidence supporting this assessment..." msgstr "لخّص الأدلة الداعمة لهذا التقييم..." -#: templates/standards/department_standards.html:288 +#: templates/standards/department_standards.html:387 +#: templates/standards/search.html:509 +#: templates/standards/standard_detail.html:530 msgid "Evidence Management" msgstr "إدارة الأدلة" -#: templates/standards/department_standards.html:314 +#: templates/standards/department_standards.html:413 +#: templates/standards/search.html:531 +#: templates/standards/standard_detail.html:547 msgid "Accepted: PDF, DOC, DOCX, XLS, XLSX, JPG, PNG, ZIP (max 50MB)" msgstr "" "مقبول: PDF، DOC، DOCX، XLS، XLSX، JPG، PNG، ZIP (الحد الأقصى 50 ميجابايت)" -#: templates/standards/department_standards.html:321 +#: templates/standards/department_standards.html:420 +#: templates/standards/search.html:538 msgid "Add a description for this attachment..." msgstr "أضف وصفًا لهذه المرفقات..." -#: templates/standards/department_standards.html:359 +#: templates/standards/department_standards.html:458 +#: templates/standards/search.html:569 +#: templates/standards/standard_detail.html:576 msgid "Uploaded" msgstr "تم الرفع" -#: templates/standards/department_standards.html:505 -#: templates/standards/department_standards.html:510 +#: templates/standards/department_standards.html:604 +#: templates/standards/department_standards.html:609 +#: templates/standards/search.html:699 templates/standards/search.html:701 msgid "Error creating compliance record:" msgstr "خطأ في إنشاء سجل الامتثال:" -#: templates/standards/department_standards.html:531 +#: templates/standards/department_standards.html:630 +#: templates/standards/search.html:718 +#: templates/standards/standard_detail.html:713 msgid "Missing required fields" msgstr "حقول مطلوبة مفقودة" -#: templates/standards/department_standards.html:570 -#: templates/standards/department_standards.html:575 +#: templates/standards/department_standards.html:669 +#: templates/standards/department_standards.html:674 +#: templates/standards/search.html:728 templates/standards/search.html:730 msgid "Error updating compliance:" msgstr "خطأ في تحديث الامتثال:" -#: templates/standards/department_standards.html:628 -#: templates/standards/department_standards.html:633 +#: templates/standards/department_standards.html:727 +#: templates/standards/department_standards.html:732 +#: templates/standards/search.html:752 templates/standards/search.html:754 +#: templates/standards/standard_detail.html:764 +#: templates/standards/standard_detail.html:767 msgid "Error loading attachments" msgstr "خطأ في تحميل المرفقات" -#: templates/standards/department_standards.html:641 +#: templates/standards/department_standards.html:740 +#: templates/standards/search.html:760 +#: templates/standards/standard_detail.html:775 msgid "No attachments yet" msgstr "لا توجد مرفقات حتى الآن" -#: templates/standards/department_standards.html:641 +#: templates/standards/department_standards.html:740 +#: templates/standards/standard_detail.html:775 msgid "Upload files above" msgstr "تحميل الملفات أعلاه" -#: templates/standards/department_standards.html:659 -msgid "No description" -msgstr "لا يوجد وصف" - -#: templates/standards/department_standards.html:705 -msgid "Please select a file" -msgstr "الرجاء اختيار ملف" - -#: templates/standards/department_standards.html:713 -msgid "File size must be less than 50MB" -msgstr "يجب أن يكون حجم الملف أقل من 50 ميجابايت" - -#: templates/standards/department_standards.html:746 -#: templates/standards/department_standards.html:750 -#: templates/standards/department_standards.html:757 -msgid "Upload failed" -msgstr "فشل التحميل" - -#: templates/standards/department_standards.html:786 +#: templates/standards/department_standards.html:885 +#: templates/standards/search.html:850 msgid "Error deleting attachment:" msgstr "خطأ في حذف المرفق:" -#: templates/standards/department_standards.html:791 +#: templates/standards/department_standards.html:890 +#: templates/standards/search.html:852 +#: templates/standards/standard_detail.html:882 msgid "Error deleting attachment" msgstr "خطأ في حذف المرفق" @@ -23706,13 +30806,17 @@ msgstr "تصفية البحث" msgid "Search by code, title, or description..." msgstr "البحث بالرمز أو العنوان أو الوصف..." -#: templates/standards/search.html:145 +#: templates/standards/search.html:166 msgid "Search Results" msgstr "نتائج البحث" -#: templates/standards/search.html:147 -msgid "All Standards" -msgstr "جميع المعايير" +#: templates/standards/search.html:409 +msgid "Sub" +msgstr "فرعي" + +#: templates/standards/search.html:411 +msgid "Parent" +msgstr "الرئيسي" #: templates/standards/source_confirm_delete.html:67 msgid "Confirm deletion of standard source" @@ -23770,11 +30874,6 @@ msgstr "رابط الموقع الرسمي (اختياري)" msgid "Use a unique code to identify the standard source organization." msgstr "استخدم رمزًا فريدًا لتعريف جهة مصدر المعيار." -#: templates/standards/source_form.html:177 -#: templates/standards/standard_form.html:296 -msgid "Examples:" -msgstr "أمثلة:" - #: templates/standards/source_form.html:187 msgid "" "Only active sources can be used when creating new standards. Inactive " @@ -23814,8 +30913,8 @@ msgstr "تحذير: لا يمكن التراجع عن هذا الإجراء" #: templates/standards/standard_confirm_delete.html:64 msgid "" -"Deleting this standard will permanently remove it from the system along with" -" all associated compliance records and attachments." +"Deleting this standard will permanently remove it from the system along with " +"all associated compliance records and attachments." msgstr "" "سيؤدي حذف هذا المعيار إلى إزالته بشكل دائم من النظام مع جميع سجلات الامتثال " "المرتبطة به والمرفقات." @@ -23832,39 +30931,128 @@ msgstr "الكود القياسي" msgid "Compliance Records" msgstr "سجلات الامتثال" -#: templates/standards/standard_detail.html:107 +#: templates/standards/standard_detail.html:94 +msgid "Sub-standard of" +msgstr "معيار فرعي لـ" + +#: templates/standards/standard_detail.html:101 +#: templates/standards/standard_detail.html:278 +msgid "Assessable" +msgstr "قابل للتقييم" + +#: templates/standards/standard_detail.html:130 #: templates/standards/standard_form.html:144 msgid "Standard Information" msgstr "معلومات المعيار" -#: templates/standards/standard_detail.html:130 +#: templates/standards/standard_detail.html:153 +msgid "Assessment Method" +msgstr "طريقة التقييم" + +#: templates/standards/standard_detail.html:163 msgid "Effective Date" msgstr "تاريخ السريان" -#: templates/standards/standard_detail.html:140 +#: templates/standards/standard_detail.html:173 msgid "Review Date" msgstr "تاريخ المراجعة" -#: templates/standards/standard_detail.html:158 +#: templates/standards/standard_detail.html:184 +#: templates/standards/standard_form.html:272 +msgid "Parent Standard" +msgstr "المعيار الرئيسي" + +#: templates/standards/standard_detail.html:194 +#: templates/standards/standard_detail.html:269 +msgid "Sub-Standards" +msgstr "المعايير الفرعية" + +#: templates/standards/standard_detail.html:209 msgid "Assessments" msgstr "التقييمات" -#: templates/standards/standard_detail.html:209 +#: templates/standards/standard_detail.html:241 +#: templates/standards/standard_detail.html:328 +msgid "New Assessment" +msgstr "تقييم جديد" + +#: templates/standards/standard_detail.html:317 +msgid "Informational Standard" +msgstr "المعيار المعلوماتي" + +#: templates/standards/standard_detail.html:318 +msgid "" +"This standard is informational only and does not require assessment or " +"evidence upload." +msgstr "هذا المعيار إعلامي فقط ولا يتطلب تقييمًا أو تحميل أدلة." + +#: templates/standards/standard_detail.html:338 +msgid "Select Department..." +msgstr "اختر القسم..." + +#: templates/standards/standard_detail.html:347 +msgid "Select Status..." +msgstr "اختر الحالة..." + +#: templates/standards/standard_detail.html:351 +#: templates/standards/standard_detail.html:489 +msgid "Not Applicable" +msgstr "غير قابل للتطبيق" + +#: templates/standards/standard_detail.html:357 +#: templates/standards/standard_detail.html:507 +msgid "Assessment notes..." +msgstr "ملاحظات التقييم..." + +#: templates/standards/standard_detail.html:361 +#: templates/standards/standard_detail.html:512 +msgid "Summarize the evidence..." +msgstr "تلخيص الأدلة..." + +#: templates/standards/standard_detail.html:378 msgid "Compliance by Department" msgstr "الامتثال حسب القسم" -#: templates/standards/standard_detail.html:224 +#: templates/standards/standard_detail.html:388 msgid "Last Assessed" msgstr "آخر تقييم" -#: templates/standards/standard_detail.html:265 +#: templates/standards/standard_detail.html:425 msgid "Not assessed" msgstr "غير مُقيَّم" -#: templates/standards/standard_detail.html:288 +#: templates/standards/standard_detail.html:458 msgid "No compliance assessments yet" msgstr "لا توجد تقييمات امتثال بعد" +#: templates/standards/standard_detail.html:460 +msgid "Create First Assessment" +msgstr "إنشاء التقييم الأول" + +#: templates/standards/standard_detail.html:473 +msgid "Update Assessment" +msgstr "تحديث التقييم" + +#: templates/standards/standard_detail.html:496 +msgid "Defaults to today" +msgstr "الافتراضي هو اليوم" + +#: templates/standards/standard_detail.html:551 +msgid "Add a description..." +msgstr "إضافة وصف..." + +#: templates/standards/standard_detail.html:666 +msgid "Please select a department and status." +msgstr "يرجى اختيار قسم وحالة." + +#: templates/standards/standard_detail.html:688 +#: templates/standards/standard_detail.html:691 +#: templates/standards/standard_detail.html:735 +#: templates/standards/standard_detail.html:738 +#: templates/standards/standard_detail.html:880 +msgid "Error:" +msgstr "خطأ:" + #: templates/standards/standard_form.html:116 msgid "Create New Standard" msgstr "إنشاء معيار جديد" @@ -23877,36 +31065,61 @@ msgstr "إضافة معيار امتثال جديد" msgid "Back to Department Standards" msgstr "العودة إلى معايير القسم" -#: templates/standards/standard_form.html:224 -msgid "Leave empty to apply to all departments" -msgstr "اتركه فارغاً للتطبيق على جميع الأقسام" +#: templates/standards/standard_form.html:163 +msgid "Please fix the errors below." +msgstr "يرجى تصحيح الأخطاء أدناه." -#: templates/standards/standard_form.html:291 +#: templates/standards/standard_form.html:240 +msgid "" +"Select departments this standard applies to. Leave all unchecked to apply to " +"all departments." +msgstr "" +"حدد الأقسام التي ينطبق عليها هذا المعيار. اترك جميع الخيارات غير محددة " +"لتطبيقه على جميع الأقسام." + +#: templates/standards/standard_form.html:249 +msgid "No departments available" +msgstr "لا توجد أقسام متاحة." + +#: templates/standards/standard_form.html:277 +msgid "" +"Select a parent standard if this is a sub-standard (e.g., 4.3.1 under 4.3)" +msgstr "اختر معيارًا أبويًا إذا كان هذا معيارًا فرعيًا (مثل 4.3.1 تحت 4.3)" + +#: templates/standards/standard_form.html:310 +msgid "Section headers don't require assessment" +msgstr "رؤوس الأقسام لا تتطلب تقييمًا" + +#: templates/standards/standard_form.html:317 +msgid "Uncheck for informational standards only" +msgstr "قم بإلغاء التحديد للمعايير الإعلامية فقط" + +#: templates/standards/standard_form.html:361 msgid "Standard Code Format" msgstr "تنسيق رمز المعيار" -#: templates/standards/standard_form.html:293 +#: templates/standards/standard_form.html:363 msgid "Use a unique code to identify this standard" msgstr "استخدم رمزاً فريداً لتعريف هذا المعيار" -#: templates/standards/standard_form.html:304 +#: templates/standards/standard_form.html:374 msgid "Department Assignment" msgstr "تعيين القسم" -#: templates/standards/standard_form.html:306 +#: templates/standards/standard_form.html:376 msgid "" -"Leave the department field empty if this standard applies to all " -"departments. Select a specific department only if the standard is " -"department-specific." +"Select one or more departments this standard applies to. Leave all " +"departments unchecked if the standard is global and applies to all " +"departments." msgstr "" -"اترك حقل القسم فارغاً إذا كان المعيار ينطبق على جميع الأقسام. اختر قسماً " -"محدداً فقط إذا كان المعيار خاصاً بقسم معين." +"اختر قسمًا واحدًا أو أكثر ينطبق عليها هذا المعيار. اترك جميع الأقسام غير محددة " +"إذا كان المعيار عالميًا وينطبق على جميع الأقسام." -#: templates/standards/standard_form.html:313 +#: templates/standards/standard_form.html:383 msgid "Effective date: When the standard becomes mandatory" msgstr "تاريخ السريان: متى يصبح المعيار إلزامياً" -#: templates/standards/standard_form.html:314 +#: templates/standards/standard_form.html:384 msgid "Review date: When the standard should be reviewed for updates" msgstr "تاريخ المراجعة: متى يجب مراجعة المعيار للتحديث" @@ -23924,12 +31137,12 @@ msgid "-- Choose a template --" msgstr "-- اختر قالبًا --" #: templates/surveys/analytics_dashboard.html:37 -#: templates/surveys/template_detail.html:85 +#: templates/surveys/template_detail.html:100 msgid "Total Sent" msgstr "إجمالي المرسل" #: templates/surveys/analytics_dashboard.html:42 -#: templates/surveys/template_detail.html:97 +#: templates/surveys/template_detail.html:120 msgid "Completion Rate" msgstr "معدل الإكمال" @@ -23951,8 +31164,8 @@ msgid "Detailed Statistics" msgstr "الإحصائيات التفصيلية" #: templates/surveys/analytics_dashboard.html:86 -#: templates/surveys/template_form.html:475 -#: templates/surveys/template_form.html:521 +#: templates/surveys/template_form.html:679 +#: templates/surveys/template_form.html:725 msgid "Value" msgstr "القيمة" @@ -24024,8 +31237,8 @@ msgstr "تنسيق JSON" #: templates/surveys/analytics_report_info.html:107 msgid "" -"Structured data format suitable for programmatic access and API integration." -" Can be imported into data analysis tools or custom applications." +"Structured data format suitable for programmatic access and API integration. " +"Can be imported into data analysis tools or custom applications." msgstr "" "تنسيق البيانات المهيكلة المناسب للوصول البرمجي وتكامل واجهة برمجة التطبيقات " "(API). يمكن استيراده إلى أدوات تحليل البيانات أو التطبيقات المخصصة." @@ -24139,10 +31352,6 @@ msgstr "جميع القوالب" msgid "Output Format" msgstr "تنسيق الإخراج" -#: templates/surveys/analytics_reports.html:226 -msgid "End Date" -msgstr "تاريخ الانتهاء" - #: templates/surveys/analytics_reports.html:236 msgid "Save report to server for later access" msgstr "حفظ التقرير على الخادم للوصول إليه لاحقًا" @@ -24210,15 +31419,6 @@ msgstr "تاريخ البدء:" msgid "Failed Deliveries" msgstr "التسليمات الفاشلة" -#: templates/surveys/bulk_job_status.html:117 -#: templates/surveys/his_patient_review.html:157 -msgid "File Number" -msgstr "رقم الملف" - -#: templates/surveys/bulk_job_status.html:119 -msgid "Reason" -msgstr "السبب" - #: templates/surveys/bulk_job_status.html:139 msgid "Back to Jobs" msgstr "العودة إلى الوظائف" @@ -24227,9 +31427,8 @@ msgstr "العودة إلى الوظائف" msgid "View Surveys" msgstr "عرض الاستبيانات" -#: templates/surveys/comment_list.html:4 -#: templates/surveys/comment_list.html:72 -#: templates/surveys/instance_detail.html:529 +#: templates/surveys/comment_list.html:4 templates/surveys/comment_list.html:72 +#: templates/surveys/instance_detail.html:391 msgid "Survey Comments" msgstr "تعليقات الاستبيانات" @@ -24237,10 +31436,6 @@ msgstr "تعليقات الاستبيانات" msgid "View all patient comments with AI-powered sentiment analysis" msgstr "عرض جميع تعليقات المرضى مع تحليل المشاعر المدعوم بالذكاء الاصطناعي" -#: templates/surveys/comment_list.html:126 -msgid "AI" -msgstr "الذكاء الاصطناعي" - #: templates/surveys/comment_list.html:130 msgid "Analyzed" msgstr "تم التحليل" @@ -24261,40 +31456,36 @@ msgstr "البحث والتصفية" msgid "MRN, name, or comment..." msgstr "رقم الملف الطبي، الاسم، أو التعليق..." -#: templates/surveys/comment_list.html:198 -#: templates/surveys/template_detail.html:206 -#: templates/surveys/template_form.html:188 +#: templates/surveys/comment_list.html:212 +#: templates/surveys/template_detail.html:229 +#: templates/surveys/template_form.html:294 #: templates/surveys/template_list.html:84 msgid "Survey Type" msgstr "نوع الاستبيان" -#: templates/surveys/comment_list.html:202 +#: templates/surveys/comment_list.html:216 #: templates/surveys/instance_list.html:102 msgid "Journey Stage" msgstr "مرحلة الرحلة" -#: templates/surveys/comment_list.html:205 +#: templates/surveys/comment_list.html:219 #: templates/surveys/instance_list.html:105 msgid "NPS" msgstr "صافي نقاط الترويج (NPS)" -#: templates/surveys/comment_list.html:251 +#: templates/surveys/comment_list.html:265 msgid "Comments List" msgstr "قائمة التعليقات" -#: templates/surveys/comment_list.html:261 -msgid "Comment" -msgstr "التعليق" - -#: templates/surveys/comment_list.html:346 +#: templates/surveys/comment_list.html:373 msgid "results" msgstr "النتائج" -#: templates/surveys/comment_list.html:385 +#: templates/surveys/comment_list.html:412 msgid "No Comments Found" msgstr "لم يتم العثور على تعليقات" -#: templates/surveys/comment_list.html:386 +#: templates/surveys/comment_list.html:413 msgid "No survey comments match your current filters." msgstr "لا توجد تعليقات استبيان تطابق عوامل التصفية الحالية." @@ -24328,10 +31519,6 @@ msgstr "عدد التقارير" msgid "Total Size" msgstr "الحجم الإجمالي" -#: templates/surveys/enhanced_reports_list.html:145 -msgid "reports" -msgstr "تقارير" - #: templates/surveys/enhanced_reports_list.html:157 msgid "View Index" msgstr "عرض الفهرس" @@ -24445,8 +31632,8 @@ msgid "" "Report generation may take a few moments depending on the amount of survey " "data. Please wait for the process to complete." msgstr "" -"قد يستغرق إنشاء التقرير بضع لحظات حسب كمية بيانات الاستبيانات. يرجى الانتظار" -" حتى اكتمال العملية." +"قد يستغرق إنشاء التقرير بضع لحظات حسب كمية بيانات الاستبيانات. يرجى الانتظار " +"حتى اكتمال العملية." #: templates/surveys/his_patient_import.html:5 #: templates/surveys/his_patient_import.html:19 @@ -24454,7 +31641,7 @@ msgid "Import HIS Patient Data" msgstr "استيراد بيانات المرضى من نظام معلومات المستشفى" #: templates/surveys/his_patient_import.html:14 -#: templates/surveys/instance_detail.html:113 +#: templates/surveys/instance_detail.html:45 #: templates/surveys/manual_send.html:19 #: templates/surveys/manual_send_csv.html:19 #: templates/surveys/manual_send_phone.html:19 @@ -24476,50 +31663,36 @@ msgid "Upload a MOH Statistics CSV file with the following columns:" msgstr "تحميل ملف CSV لإحصائيات وزارة الصحة بالعمود التالي:" #: templates/surveys/his_patient_import.html:107 -#, fuzzy -#| msgid "File Number" msgid "Serial number" -msgstr "رقم الملف" +msgstr "الرقم التسلسلي" #: templates/surveys/his_patient_import.html:111 -#, fuzzy -#| msgid "Hospital List" msgid "Hospital/Facility" -msgstr "قائمة المستشفيات" +msgstr "المستشفى/المنشأة" #: templates/surveys/his_patient_import.html:115 msgid "EMERGENCY, INPATIENT, OPD" msgstr "الطوارئ، الداخلي، العيادات الخارجية" #: templates/surveys/his_patient_import.html:119 -#, fuzzy -#| msgid "Admission" msgid "Admission date" -msgstr "الاستشفاء" +msgstr "تاريخ القبول" #: templates/surveys/his_patient_import.html:123 -#, fuzzy -#| msgid "Discharged" msgid "Discharge date" -msgstr "تم الإفراج" +msgstr "تاريخ الخروج" #: templates/surveys/his_patient_import.html:127 -#, fuzzy -#| msgid "Title, patient name..." msgid "Full patient name" -msgstr "العنوان، اسم المريض..." +msgstr "الاسم الكامل للمريض" #: templates/surveys/his_patient_import.html:131 -#, fuzzy -#| msgid "Medical Records" msgid "MRN (Medical Record Number)" -msgstr "السجلات الطبية" +msgstr "رقم السجل الطبي (MRN)" #: templates/surveys/his_patient_import.html:143 -#, fuzzy -#| msgid "Female" msgid "Male/Female" -msgstr "أنثى" +msgstr "ذكر/أنثى" #: templates/surveys/his_patient_import.html:147 msgid "Country" @@ -24530,8 +31703,8 @@ msgid "" "The CSV may have header/metadata rows at the top. Adjust 'Skip Header Rows' " "accordingly (default: 5)." msgstr "" -"قد يحتوي ملف CSV على صفوف رأس/بيانات وصفية في الأعلى. اضبط 'تخطي صفوف الرأس'" -" وفقاً لذلك (الافتراضي: 5)." +"قد يحتوي ملف CSV على صفوف رأس/بيانات وصفية في الأعلى. اضبط 'تخطي صفوف الرأس' " +"وفقاً لذلك (الافتراضي: 5)." #: templates/surveys/his_patient_import.html:169 msgid "Import Process" @@ -24690,172 +31863,141 @@ msgstr "" "يمكن فقط للمرضى الذين يمتلكون أرقام هواتف استلام استبيانات الرسائل النصية. " "سيتم تخطي المرضى الذين لا يمتلكون أرقام هواتف أثناء عملية الإرسال." -#: templates/surveys/instance_detail.html:144 +#: templates/surveys/instance_detail.html:76 msgid "Patient Score" msgstr "درجة المريض" -#: templates/surveys/instance_detail.html:149 -#: templates/surveys/instance_detail.html:304 +#: templates/surveys/instance_detail.html:81 msgid "Template Average" msgstr "متوسط القالب" -#: templates/surveys/instance_detail.html:157 +#: templates/surveys/instance_detail.html:89 msgid "Above average" msgstr "أعلى من المتوسط" -#: templates/surveys/instance_detail.html:161 +#: templates/surveys/instance_detail.html:93 msgid "Below average" msgstr "أقل من المتوسط" -#: templates/surveys/instance_detail.html:166 +#: templates/surveys/instance_detail.html:98 msgid "Negative feedback" msgstr "ملاحظات سلبية" -#: templates/surveys/instance_detail.html:183 +#: templates/surveys/instance_detail.html:115 msgid "Survey Responses" msgstr "إجابات الاستبيان" -#: templates/surveys/instance_detail.html:187 -#, fuzzy -#| msgid "Completed" +#: templates/surveys/instance_detail.html:119 msgid "Completed in" -msgstr "مكتملة" +msgstr "أُكمل في" -#: templates/surveys/instance_detail.html:218 -#, fuzzy -#| msgid "Add Response" -msgid "Patient Response" -msgstr "إضافة رد" +#: templates/surveys/instance_detail.html:135 +msgid "Question (AR)" +msgstr "سؤال (AR)" -#: templates/surveys/instance_detail.html:253 -#, fuzzy -#| msgid "Net Promoter Score" +#: templates/surveys/instance_detail.html:168 msgid "Promoter" -msgstr "مؤشر صافي الترويج" +msgstr "مروّج" -#: templates/surveys/instance_detail.html:254 -#, fuzzy -#| msgid "assigned" +#: templates/surveys/instance_detail.html:169 msgid "Passive" -msgstr "مُعيّن" +msgstr "محايد" -#: templates/surveys/instance_detail.html:255 -#, fuzzy -#| msgid "Doctor" +#: templates/surveys/instance_detail.html:170 msgid "Detractor" -msgstr "طبيب" +msgstr "منتقد" -#: templates/surveys/instance_detail.html:292 -msgid "characters" -msgstr "حرفًا" - -#: templates/surveys/instance_detail.html:312 -#, fuzzy -#| msgid "Min Rating" -msgid "Patient Rating" -msgstr "أقل تقييم" - -#: templates/surveys/instance_detail.html:335 -msgid "Response Distribution" -msgstr "توزيع الإجابات" - -#: templates/surveys/instance_detail.html:362 +#: templates/surveys/instance_detail.html:224 msgid "No responses yet" msgstr "لا توجد إجابات بعد" -#: templates/surveys/instance_detail.html:363 -#, fuzzy -#| msgid "No explanation has been submitted yet." +#: templates/surveys/instance_detail.html:225 msgid "The patient hasn't submitted any answers" -msgstr "لم يتم تقديم أي إيضاح حتى الآن." +msgstr "لم يقدم المريض أي إجابات" -#: templates/surveys/instance_detail.html:373 +#: templates/surveys/instance_detail.html:235 msgid "Patient Comment" msgstr "تعليق المريض" -#: templates/surveys/instance_detail.html:409 +#: templates/surveys/instance_detail.html:271 msgid "Emotion" msgstr "العاطفة" -#: templates/surveys/instance_detail.html:427 +#: templates/surveys/instance_detail.html:289 msgid "Key Topics" msgstr "الموضوعات الرئيسية" -#: templates/surveys/instance_detail.html:439 +#: templates/surveys/instance_detail.html:301 msgid "Comment analysis failed. Check system logs for details." msgstr "فشل تحليل التعليق. يرجى التحقق من سجلات النظام لمزيد من التفاصيل." -#: templates/surveys/instance_detail.html:444 +#: templates/surveys/instance_detail.html:306 msgid "Comment is being analyzed by AI..." msgstr "يتم تحليل التعليق بواسطة الذكاء الاصطناعي..." -#: templates/surveys/instance_detail.html:450 +#: templates/surveys/instance_detail.html:312 msgid "No comment provided by patient" msgstr "لم يتم تقديم أي تعليق من قبل المريض" -#: templates/surveys/instance_detail.html:461 +#: templates/surveys/instance_detail.html:323 msgid "Related Surveys from Patient" msgstr "استبيانات ذات صلة من نفس المريض" -#: templates/surveys/instance_detail.html:509 -#: templates/surveys/invalid_token.html:38 +#: templates/surveys/instance_detail.html:371 +#: templates/surveys/invalid_token.html:34 msgid "Survey Link" msgstr "رابط الاستبيان" -#: templates/surveys/instance_detail.html:514 -#: templates/surveys/instance_detail.html:516 +#: templates/surveys/instance_detail.html:376 +#: templates/surveys/instance_detail.html:378 msgid "Copy Link" msgstr "نسخ الرابط" -#: templates/surveys/instance_detail.html:538 +#: templates/surveys/instance_detail.html:400 msgid "Survey Information" msgstr "معلومات الاستبيان" -#: templates/surveys/instance_detail.html:557 +#: templates/surveys/instance_detail.html:419 msgid "Total Score" msgstr "الدرجة الإجمالية" -#: templates/surveys/instance_detail.html:666 +#: templates/surveys/instance_detail.html:528 msgid "Stage" msgstr "المرحلة" -#: templates/surveys/instance_detail.html:673 +#: templates/surveys/instance_detail.html:535 msgid "View Journey" msgstr "عرض الرحلة" -#: templates/surveys/instance_detail.html:683 +#: templates/surveys/instance_detail.html:545 msgid "Follow-up Actions" msgstr "إجراءات المتابعة" -#: templates/surveys/instance_detail.html:691 +#: templates/surveys/instance_detail.html:553 msgid "Contact patient to discuss negative feedback" msgstr "التواصل مع المريض لمناقشة الملاحظات السلبية" -#: templates/surveys/instance_detail.html:698 +#: templates/surveys/instance_detail.html:560 msgid "Contact Notes" msgstr "ملاحظات التواصل" -#: templates/surveys/instance_detail.html:701 +#: templates/surveys/instance_detail.html:563 msgid "Document your conversation..." msgstr "توثيق محادثتك..." -#: templates/surveys/instance_detail.html:707 +#: templates/surveys/instance_detail.html:569 msgid "Issue resolved" msgstr "تم حل المشكلة" -#: templates/surveys/instance_detail.html:712 +#: templates/surveys/instance_detail.html:574 msgid "Log Contact" msgstr "تسجيل الاتصال" -#: templates/surveys/instance_detail.html:719 -msgid "Patient Contacted" -msgstr "تم التواصل مع المريض" - -#: templates/surveys/instance_detail.html:736 +#: templates/surveys/instance_detail.html:598 msgid "Send Satisfaction Feedback" msgstr "إرسال استبيان رضا" -#: templates/surveys/instance_detail.html:743 +#: templates/surveys/instance_detail.html:605 msgid "Feedback Sent" msgstr "تم إرسال الملاحظات" @@ -24880,40 +32022,39 @@ msgstr "استبيان سلبي" msgid "Invalid Survey Link" msgstr "رابط الاستبيان غير صالح" -#: templates/surveys/invalid_token.html:37 +#: templates/surveys/invalid_token.html:33 msgid "Invalid" msgstr "غير صالح" -#: templates/surveys/invalid_token.html:54 +#: templates/surveys/invalid_token.html:50 msgid "We're sorry, but this survey link is no longer valid or has expired" msgstr "نأسف، رابط الاستبيان هذا غير صالح أو انتهت صلاحيته" -#: templates/surveys/invalid_token.html:59 +#: templates/surveys/invalid_token.html:55 msgid "This could be because:" msgstr "قد يكون السبب:" -#: templates/surveys/invalid_token.html:65 +#: templates/surveys/invalid_token.html:61 msgid "The survey has already been completed" msgstr "تم إكمال الاستبيان مسبقًا" -#: templates/surveys/invalid_token.html:71 +#: templates/surveys/invalid_token.html:67 msgid "The link has expired (surveys are valid for 30 days)" msgstr "انتهت صلاحية الرابط (الاستبيانات صالحة لمدة 30 يومًا)" -#: templates/surveys/invalid_token.html:77 +#: templates/surveys/invalid_token.html:73 msgid "The link was entered incorrectly" msgstr "تم إدخال الرابط بشكل غير صحيح" -#: templates/surveys/invalid_token.html:83 +#: templates/surveys/invalid_token.html:79 msgid "The survey has been canceled" msgstr "تم إلغاء الاستبيان" -#: templates/surveys/invalid_token.html:90 +#: templates/surveys/invalid_token.html:86 msgid "" -"If you believe this is an error, please contact your healthcare provider for" -" assistance" -msgstr "" -"إذا كنت تعتقد أن هذا خطأ، يرجى التواصل مع مقدم الرعاية الصحية للمساعدة" +"If you believe this is an error, please contact your healthcare provider for " +"assistance" +msgstr "إذا كنت تعتقد أن هذا خطأ، يرجى التواصل مع مقدم الرعاية الصحية للمساعدة" #: templates/surveys/manual_send.html:4 templates/surveys/manual_send.html:13 #: templates/surveys/manual_send_csv.html:13 @@ -24959,12 +32100,6 @@ msgstr "يرجى اختيار مستلم من نتائج البحث" msgid "Start typing to search. Select a recipient from the dropdown." msgstr "ابدأ بالكتابة للبحث، ثم اختر المستلم من القائمة المنسدلة." -#: templates/surveys/manual_send.html:182 -#: templates/surveys/manual_send_csv.html:146 -#: templates/surveys/manual_send_phone.html:126 -msgid "Custom Message" -msgstr "رسالة مخصصة" - #: templates/surveys/manual_send.html:188 #: templates/surveys/manual_send_csv.html:152 #: templates/surveys/manual_send_phone.html:132 @@ -25067,8 +32202,8 @@ msgstr "أدخل اسم المستلم..." #: templates/surveys/manual_send_phone.html:152 msgid "" -"The survey will be sent via SMS to the phone number you enter. The recipient" -" does not need to be in the system. They will receive a unique link to " +"The survey will be sent via SMS to the phone number you enter. The recipient " +"does not need to be in the system. They will receive a unique link to " "complete the survey." msgstr "" "سيتم إرسال الاستبيان عبر الرسائل النصية القصيرة إلى رقم الهاتف الذي تدخله. " @@ -25103,189 +32238,197 @@ msgstr "جميع الأسئلة المرتبطة بهذا القالب" msgid "All survey instances and responses linked to this template" msgstr "جميع نسخ الاستبيان والردود المرتبطة بهذا النموذج" -#: templates/surveys/template_detail.html:119 -#: templates/surveys/template_form.html:236 +#: templates/surveys/template_detail.html:92 +msgid "Showing data for" +msgstr "عرض البيانات لـ" + +#: templates/surveys/template_detail.html:116 +msgid "Positive Rate" +msgstr "معدل الإيجابية" + +#: templates/surveys/template_detail.html:142 +#: templates/surveys/template_form.html:342 #: templates/surveys/template_list.html:86 msgid "Questions" msgstr "الأسئلة" -#: templates/surveys/template_detail.html:121 +#: templates/surveys/template_detail.html:144 msgid "question" msgstr "سؤال" -#: templates/surveys/template_detail.html:131 -#: templates/surveys/template_form.html:256 -#: templates/surveys/template_form.html:370 +#: templates/surveys/template_detail.html:154 +#: templates/surveys/template_form.html:375 +#: templates/surveys/template_form.html:524 msgid "Question (English)" msgstr "سؤال (إنجليزي)" -#: templates/surveys/template_detail.html:132 -#: templates/surveys/template_form.html:265 -#: templates/surveys/template_form.html:376 +#: templates/surveys/template_detail.html:155 +#: templates/surveys/template_form.html:381 +#: templates/surveys/template_form.html:530 msgid "Question (Arabic)" msgstr "سؤال (عربي)" -#: templates/surveys/template_detail.html:175 +#: templates/surveys/template_detail.html:198 msgid "No Questions Yet" msgstr "لا توجد أسئلة حتى الآن" -#: templates/surveys/template_detail.html:176 +#: templates/surveys/template_detail.html:199 msgid "Add questions to this template." msgstr "إضافة أسئلة إلى هذا القالب." -#: templates/surveys/template_detail.html:178 +#: templates/surveys/template_detail.html:201 msgid "Add Questions" msgstr "إضافة أسئلة" -#: templates/surveys/template_detail.html:210 +#: templates/surveys/template_detail.html:233 #: templates/surveys/template_list.html:87 msgid "Scoring" msgstr "التقييم" -#: templates/surveys/template_detail.html:215 -#: templates/surveys/template_form.html:209 +#: templates/surveys/template_detail.html:238 +#: templates/surveys/template_form.html:315 msgid "Negative Threshold" msgstr "الحد السلبي" -#: templates/surveys/template_form.html:124 -#: templates/surveys/template_form.html:134 +#: templates/surveys/template_form.html:230 +#: templates/surveys/template_form.html:240 msgid "Edit Survey Template" msgstr "تعديل نموذج الاستبيان" -#: templates/surveys/template_form.html:124 -#: templates/surveys/template_form.html:134 +#: templates/surveys/template_form.html:230 +#: templates/surveys/template_form.html:240 #: templates/surveys/template_list.html:64 #: templates/surveys/template_list.html:181 msgid "Create Survey Template" msgstr "إنشاء نموذج الاستبيان" -#: templates/surveys/template_form.html:137 +#: templates/surveys/template_form.html:243 msgid "Modify this survey template and its questions" msgstr "تعديل هذا النموذج وأسئلته" -#: templates/surveys/template_form.html:137 +#: templates/surveys/template_form.html:243 msgid "Create a new survey template with questions" msgstr "إنشاء نموذج استبيان جديد مع الأسئلة" -#: templates/surveys/template_form.html:160 +#: templates/surveys/template_form.html:266 msgid "General Settings" msgstr "الإعدادات العامة" -#: templates/surveys/template_form.html:166 +#: templates/surveys/template_form.html:272 msgid "Template Name (English)" msgstr "اسم النموذج (بالإنجليزية)" -#: templates/surveys/template_form.html:175 +#: templates/surveys/template_form.html:281 msgid "Template Name (Arabic)" msgstr "اسم النموذج (بالعربية)" -#: templates/surveys/template_form.html:197 +#: templates/surveys/template_form.html:303 msgid "Scoring Method" msgstr "طريقة التقييم" -#: templates/surveys/template_form.html:215 +#: templates/surveys/template_form.html:321 msgid "Score below this is flagged as negative" msgstr "يتم تصنيف النتيجة الأقل من هذا كسلبية" -#: templates/surveys/template_form.html:220 +#: templates/surveys/template_form.html:326 msgid "Active template" msgstr "القالب النشط" -#: templates/surveys/template_form.html:246 -#: templates/surveys/template_form.html:360 -msgid "Question" -msgstr "سؤال" +#: templates/surveys/template_form.html:344 +#: templates/surveys/template_form.html:351 +#: templates/surveys/template_form.html:501 +msgid "Drag to reorder" +msgstr "اسحب لإعادة الترتيب" -#: templates/surveys/template_form.html:248 #: templates/surveys/template_form.html:362 +#: templates/surveys/template_form.html:511 +msgid "Edit question" +msgstr "تعديل السؤال" + +#: templates/surveys/template_form.html:365 +#: templates/surveys/template_form.html:514 msgid "Remove question" msgstr "إزالة السؤال" -#: templates/surveys/template_form.html:276 -#: templates/surveys/template_form.html:384 -msgid "Question Type" -msgstr "نوع السؤال" +#: templates/surveys/template_form.html:410 +#: templates/surveys/template_form.html:559 +msgid "Base Question" +msgstr "السؤال الأساسي" -#: templates/surveys/template_form.html:306 -#: templates/surveys/template_form.html:405 -msgid "Base Question (always included)" -msgstr "السؤال الأساسي (مُدرج دائماً)" +#: templates/surveys/template_form.html:412 +msgid "Always shown regardless of events" +msgstr "يُعرض دائمًا بغض النظر عن الأحداث" -#: templates/surveys/template_form.html:308 -#: templates/surveys/template_form.html:407 -msgid "Base questions are always shown regardless of patient events" -msgstr "تظهر الأسئلة الأساسية دائماً بغض النظر عن أحداث المريض" +#: templates/surveys/template_form.html:421 +#: templates/surveys/template_form.html:569 +msgid "Show Events" +msgstr "عرض الأحداث" -#: templates/surveys/template_form.html:318 -#: templates/surveys/template_form.html:414 -msgid "HIS event type that triggers this question (leave blank for base)" -msgstr "" -"نوع حدث نظام معلومات المستشفى الذي يُفعّل هذا السؤال (اتركه فارغاً للأسئلة " -"الأساسية)" +#: templates/surveys/template_form.html:450 +#: templates/surveys/template_form.html:598 +msgid "ED" +msgstr "ED" -#: templates/surveys/template_form.html:323 -#: templates/surveys/template_form.html:419 -msgid "Choices (JSON)" -msgstr "الخيارات (JSON)" +#: templates/surveys/template_form.html:465 +#: templates/surveys/template_form.html:613 +msgid "Choices" +msgstr "خيارات" -#: templates/surveys/template_form.html:329 -#: templates/surveys/template_form.html:422 -msgid "" -"JSON array of choices. Format: [{"value": "1", " -""label": "Option 1", "label_ar": "خيار " -"1"}]" -msgstr "" -"مصفوفة JSON للخيارات. التنسيق: [{"value": "1", " -""label": "Option 1", "label_ar": "خيار " -"1"}]" - -#: templates/surveys/template_form.html:334 -#: templates/surveys/template_form.html:427 -msgid "Conditional (hidden by default, shown only via routing rules)" -msgstr "مشروط (مخفي افتراضيًا، يظهر فقط عبر قواعد التوجيه)" - -#: templates/surveys/template_form.html:350 -msgid "Add Question" -msgstr "إضافة سؤال" - -#: templates/surveys/template_form.html:443 -msgid "" -"Define conditional logic to skip questions or end the survey based on " -"answers" -msgstr "" -"حدد المنطق المشروط لتخطي الأسئلة أو إنهاء الاستبيان بناءً على الإجابات" - -#: templates/surveys/template_form.html:448 -#, fuzzy -#| msgid "Add Survey" -msgid "Add Rule" -msgstr "إضافة استبيان" - -#: templates/surveys/template_form.html:458 -#: templates/surveys/template_form.html:504 -#, fuzzy -#| msgid "Rule Name" -msgid "Rule" -msgstr "اسم القاعدة" - -#: templates/surveys/template_form.html:460 -#: templates/surveys/template_form.html:506 -#, fuzzy -#| msgid "Remove" -msgid "Remove rule" -msgstr "إزالة" +#: templates/surveys/template_form.html:470 +#: templates/surveys/template_form.html:618 +msgid "English label" +msgstr "التسمية الإنجليزية" #: templates/surveys/template_form.html:471 -#: templates/surveys/template_form.html:517 -#, fuzzy -#| msgid "Communication" -msgid "Condition" -msgstr "التواصل" +#: templates/surveys/template_form.html:619 +msgid "Arabic label" +msgstr "التسمية العربية" -#: templates/surveys/template_form.html:556 +#: templates/surveys/template_form.html:482 +#: templates/surveys/template_form.html:630 +msgid "Conditional" +msgstr "شرطي" + +#: templates/surveys/template_form.html:506 +msgid "New question" +msgstr "سؤال جديد" + +#: templates/surveys/template_form.html:647 +msgid "" +"Define conditional logic to skip questions or end the survey based on answers" +msgstr "حدد المنطق المشروط لتخطي الأسئلة أو إنهاء الاستبيان بناءً على الإجابات" + +#: templates/surveys/template_form.html:652 +msgid "Add Rule" +msgstr "إضافة قاعدة" + +#: templates/surveys/template_form.html:662 +#: templates/surveys/template_form.html:708 +msgid "Rule" +msgstr "قاعدة" + +#: templates/surveys/template_form.html:664 +#: templates/surveys/template_form.html:710 +msgid "Remove rule" +msgstr "إزالة القاعدة" + +#: templates/surveys/template_form.html:675 +#: templates/surveys/template_form.html:721 +msgid "Condition" +msgstr "شرط" + +#: templates/surveys/template_form.html:760 msgid "Save & Continue Editing" msgstr "حفظ ومتابعة التحرير" +#: templates/surveys/template_form.html:874 +msgid "Hide Visit Timeline Events" +msgstr "إخفاء أحداث الجدول الزمني للزيارة" + +#: templates/surveys/template_form.html:877 +msgid "Show Visit Timeline Events" +msgstr "إظهار أحداث الجدول الزمني للزيارة" + #: templates/surveys/template_list.html:4 #: templates/surveys/template_list.html:59 msgid "Survey Templates" @@ -25311,6 +32454,1207 @@ msgstr "لا يمكن التراجع عن هذا الإجراء" msgid "Are you sure you want to delete the survey template" msgstr "هل أنت متأكد من رغبتك في حذف نموذج الاستبيان" +#~ msgid "Are you sure you want to cancel this complaint?" +#~ msgstr "هل أنت متأكد أنك تريد إلغاء هذه الشكوى؟" + +#~ msgid "Cancel Complaint" +#~ msgstr "إلغاء الشكوى" + +#~ msgid "Activate this complaint to perform actions" +#~ msgstr "تفعيل هذه الشكوى لتنفيذ الإجراءات" + +#~ msgid "Explanation Submitted" +#~ msgstr "تم تقديم الإيضاح" + +#~ msgid "Explanation Submitted Successfully!" +#~ msgstr "تم تقديم الإيضاح بنجاح!" + +#~ msgid "" +#~ "Thank you for providing your explanation. It has been received and will " +#~ "be reviewed by the PX team." +#~ msgstr "شكرًا لتقديمك الإيضاح. تم استلامه وسيتم مراجعته من قبل فريق PX." + +#~ msgid "Complaint Summary" +#~ msgstr "ملخص الشكوى" + +#~ msgid "Attachments:" +#~ msgstr "المرفقات:" + +#~ msgid "Your explanation will be reviewed by the complaint assignee" +#~ msgstr "سيتم مراجعة إيضاحك من قبل المسؤول عن الشكوى" + +#~ msgid "The PX team may contact you if additional information is needed" +#~ msgstr "قد يتواصل معك فريق PX في حال الحاجة إلى معلومات إضافية" + +#~ msgid "" +#~ "Your explanation will be considered during the complaint investigation" +#~ msgstr "سيؤخذ إيضاحك بعين الاعتبار أثناء التحقيق في الشكوى" + +#~ msgid "Submission Time:" +#~ msgstr "وقت الإرسال:" + +#~ msgid "A confirmation email has been sent to the complaint assignee." +#~ msgstr "تم إرسال رسالة تأكيد إلى المسؤول عن الشكوى." + +#~ msgid "Review Staff Feedback" +#~ msgstr "مراجعة ملاحظات الموظفين" + +#~ msgid "Review staff responses and write your final reply" +#~ msgstr "مراجعة ردود الموظفين وكتابة ردك النهائي" + +#~ msgid "Submit Explanation" +#~ msgstr "تقديم الإيضاح" + +#~ msgid "ID:" +#~ msgstr "المعرف:" + +#~ msgid "Original Staff Explanation" +#~ msgstr "شرح الموظف الأصلي" + +#~ msgid "Escalation Notes:" +#~ msgstr "ملاحظات التصعيد:" + +#~ msgid "" +#~ "As the manager, please review the above explanation from your team member " +#~ "and provide your own perspective on this complaint." +#~ msgstr "" +#~ "بصفتك المدير، يرجى مراجعة الشرح المذكور أعلاه من فريقك وتقديم وجهة نظرك " +#~ "الخاصة بشأن هذه الشكوى." + +#~ msgid "" +#~ "You can submit your reply directly, or collect feedback first by sending " +#~ "questions to the involved staff member(s)." +#~ msgstr "" +#~ "يمكنك تقديم ردك مباشرةً، أو تجميع الملاحظات أولاً عن طريق إرسال أسئلة إلى " +#~ "الموظفين المعنيين." + +#~ msgid "Write your explanation and submit directly for manager review" +#~ msgstr "اكتب شرحك وقدمه مباشرة لمراجعة المدير" + +#~ msgid "Collect Feedback First" +#~ msgstr "تجميع الملاحظات أولاً" + +#~ msgid "" +#~ "Send questions to staff, review their responses, then write your reply" +#~ msgstr "أرسل أسئلة إلى الموظفين، راجع إجاباتهم، ثم اكتب ردك" + +#~ msgid "Your Explanation" +#~ msgstr "إيضاحك" + +#~ msgid "" +#~ "Please provide your perspective about the complaint mentioned above. Your " +#~ "explanation will help us understand the situation better." +#~ msgstr "" +#~ "يرجى توضيح وجهة نظرك حول الشكوى المذكورة أعلاه. سيساعدنا إيضاحك على فهم " +#~ "الوضع بشكل أفضل." + +#~ msgid "Write your explanation here..." +#~ msgstr "اكتب إيضاحك هنا..." + +#~ msgid "" +#~ "You can attach relevant documents, images, or other files to support your " +#~ "explanation." +#~ msgstr "يمكنك إرفاق مستندات أو صور أو ملفات أخرى ذات صلة لدعم إيضاحك." + +#~ msgid "" +#~ "Accepted file types: PDF, DOC, DOCX, JPG, PNG, etc. Maximum file size: " +#~ "10MB." +#~ msgstr "" +#~ "أنواع الملفات المقبولة: PDF، DOC، DOCX، JPG، PNG، وغيرها. الحد الأقصى " +#~ "لحجم الملف: 10 ميجابايت." + +#~ msgid "Important Note:" +#~ msgstr "ملاحظة مهمة:" + +#~ msgid "" +#~ "This link can only be used once. After submitting your explanation, it " +#~ "will expire and cannot be used again." +#~ msgstr "" +#~ "يمكن استخدام هذا الرابط مرة واحدة فقط. بعد تقديم الإيضاح، ستنتهي صلاحيته " +#~ "ولا يمكن استخدامه مرة أخرى." + +#~ msgid "Secure token-based submission" +#~ msgstr "إرسال مضمّن بالرمز الآمن" + +#~ msgid "Create feedback questions for each staff member" +#~ msgstr "أنشئ أسئلة الملاحظات لكل موظف" + +#~ msgid "Collecting feedback as" +#~ msgstr "تجميع الملاحظات بصفتك" + +#~ msgid "Questions for" +#~ msgstr "أسئلة لـ" + +#, fuzzy +#~| msgid "Create questions for the accused staff member(s)" +#~ msgid "Enter a question for this staff member..." +#~ msgstr "إنشاء أسئلة للموظفين المتهمين" + +#~ msgid "No staff linked to this complaint. Add involved staff first." +#~ msgstr "لا يوجد موظفون مرتبطون بهذه الشكوى. أضف الموظفين المعنيين أولاً." + +#~ msgid "Feedback Request" +#~ msgstr "طلب ملاحظات" + +#~ msgid "Requested by" +#~ msgstr "مطلوب من قبل" + +#~ msgid "Department Champion" +#~ msgstr "بطل القسم" + +#~ msgid "This link can only be used once. After submitting, it will expire." +#~ msgstr "يمكن استخدام هذا الرابط مرة واحدة فقط. بعد الإرسال، سينتهي صلاحيته." + +#~ msgid "Submit My Answers" +#~ msgstr "تقديم إجاباتي" + +#~ msgid "Submit Final Reply" +#~ msgstr "إرسال الرد النهائي" + +#~ msgid "Generating summaries..." +#~ msgstr "جارٍ إنشاء الملخصات..." + +#~ msgid "PDF report unavailable" +#~ msgstr "تقرير PDF غير متاح" + +#~ msgid "You don't have permission to request explanations." +#~ msgstr "ليس لديك إذن لطلب التفسيرات." + +#~ msgid "" +#~ "Cannot request explanation for complaint with status '{}'. Complaint must " +#~ "be Open, In Progress, or Partially Resolved." +#~ msgstr "" +#~ "لا يمكن طلب شرح للشكوى ذات الحالة '{}'. يجب أن تكون الشكوى مفتوحة، أو قيد " +#~ "التنفيذ، أو محلولة جزئيًا." + +#~ msgid "" +#~ "No departments are involved in this complaint. Please add a department " +#~ "first." +#~ msgstr "لا توجد أقسام مشاركة في هذه الشكوى. يرجى إضافة قسم أولاً." + +#~ msgid "Please select at least one department." +#~ msgstr "يرجى اختيار قسم واحد على الأقل." + +#~ msgid "" +#~ "No explanation requests were sent. {} department(s) have champions " +#~ "without email addresses." +#~ msgstr "" +#~ "لم يتم إرسال أي طلبات توضيح. {} قسم (أقسام) لديه أبطال بدون عناوين بريد " +#~ "إلكتروني." + +#~ msgid "" +#~ "No explanation requests were sent. Please check department champion " +#~ "configuration." +#~ msgstr "لم يتم إرسال أي طلبات توضيح. يرجى التحقق من تكوين بطل القسم." + +#~ msgid "" +#~ "Only department manager notifications were sent ({}). Champion " +#~ "explanation requests could not be sent." +#~ msgstr "تم إرسال إشعارات مدير القسم فقط ({}). تعذر إرسال طلبات توضيح البطل." + +#~ msgid "" +#~ "Explanation requests sent! Champions: {}, Department managers notified: " +#~ "{}." +#~ msgstr "تم إرسال طلبات التوضيح! الأبطال: {}، مديرو الأقسام المُبلّغون: {}." + +#~ msgid "Select Departments" +#~ msgstr "اختيار الأقسام" + +#~ msgid "Department Champion:" +#~ msgstr "رائد القسم:" + +#~ msgid "No champion assigned" +#~ msgstr "لم يتم تعيين رائد" + +#~ msgid "Champion has no email address. Request cannot be sent." +#~ msgstr "الرائد ليس لديه عنوان بريد إلكتروني. لا يمكن إرسال الطلب." + +#~ msgid "No champion assigned. Please assign a champion before sending." +#~ msgstr "لم يتم تعيين مسؤول. يرجى تعيين مسؤول قبل الإرسال." + +#~ msgid "Loading contacts..." +#~ msgstr "جارٍ تحميل جهات الاتصال..." + +#~ msgid "Department Manager:" +#~ msgstr "مدير القسم:" + +#~ msgid "Will receive escalation notification" +#~ msgstr "سيتلقى إشعار التصعيد" + +#~ msgid "Involved Staff:" +#~ msgstr "الموظفون المعنيون:" + +#~ msgid "No departments involved in this complaint. Add departments first." +#~ msgstr "لا توجد أقسام مشاركة في هذه الشكوى. أضف الأقسام أولاً." + +#~ msgid "Staff Without Department" +#~ msgstr "الموظفون بدون قسم" + +#~ msgid "These staff members are not assigned to any department." +#~ msgstr "هؤلاء الموظفون غير معينين في أي قسم." + +#~ msgid "Additional Message" +#~ msgstr "رسالة إضافية" + +#~ msgid "Optional message to include in the email" +#~ msgstr "رسالة اختيارية لتضمينها في البريد الإلكتروني" + +#~ msgid "" +#~ "Enter any additional context or instructions for the department " +#~ "champions..." +#~ msgstr "أدخل أي سياق إضافي أو تعليمات لأبطال القسم..." + +#~ msgid "department champions will receive explanation links" +#~ msgstr "سيحصل أبطال القسم على روابط الشرح" + +#~ msgid "Preview Messages" +#~ msgstr "معاينة الرسائل" + +#~ msgid "Preview Department Requests" +#~ msgstr "معاينة طلبات القسم" + +#~ msgid "Review messages before sending to department champions" +#~ msgstr "مراجعة الرسائل قبل إرسالها إلى منسقي الأقسام" + +#~ msgid "Review each message below" +#~ msgstr "مراجعة كل رسالة أدناه" + +#~ msgid "" +#~ "Department requests will be sent to department champions. Department " +#~ "managers will receive notification." +#~ msgstr "" +#~ "سيتم إرسال طلبات القسم إلى مسؤولي الأقسام. وسيتلقى مدراء الأقسام إشعارًا." + +#~ msgid "Send To:" +#~ msgstr "إرسال إلى:" + +#~ msgid "Manager notification:" +#~ msgstr "إشعار المدير:" + +#~ msgid "Send All Requests" +#~ msgstr "إرسال جميع الطلبات" + +#~ msgid "Selected person is not an active staff member in this department." +#~ msgstr "الشخص المحدد ليس عضوًا نشطًا في هذا القسم." + +#~ msgid "Key Performance Indicator Report" +#~ msgstr "تقرير مؤشرات الأداء الرئيسية" + +#~ msgid "Risk Level:" +#~ msgstr "مستوى المخاطر:" + +#~ msgid "On Target" +#~ msgstr "في الهدف" + +#~ msgid "Below Target" +#~ msgstr "أقل من الهدف" + +#~ msgid "KPI" +#~ msgstr "مؤشر أداء رئيسي" + +#~ msgid "Indicator" +#~ msgstr "مؤشر" + +#~ msgid "Measure" +#~ msgstr "مقياس" + +#~ msgid "Report Metadata" +#~ msgstr "بيانات التعريف للتقرير" + +#~ msgid "Frequency:" +#~ msgstr "التكرار:" + +#~ msgid "Performance Analytics" +#~ msgstr "تحليلات الأداء" + +#~ msgid "Monthly Performance Trend" +#~ msgstr "اتجاه الأداء الشهري" + +#~ msgid "Distribution by Source" +#~ msgstr "التوزيع حسب المصدر" + +#~ msgid "Department Performance Breakdown" +#~ msgstr "تفصيل أداء الأقسام" + +#~ msgid "resolved" +#~ msgstr "تم الحل" + +#~ msgid "Location Distribution" +#~ msgstr "توزيع المواقع" + +#~ msgid "AI-Powered Performance Analysis" +#~ msgstr "تحليل الأداء المدعوم بالذكاء الاصطناعي" + +#~ msgid "Reviewed and Approved By:" +#~ msgstr "تم المراجعة والموافقة من قبل:" + +#~ msgid "Generated by PX360 Patient Experience Management System" +#~ msgstr "تم إنشاؤه بواسطة نظام إدارة تجربة المرضى PX360" + +#~ msgid "Confidential - For Internal Use Only" +#~ msgstr "سري - للاستخدام الداخلي فقط" + +#~ msgid "Error generating PDF. Please try again." +#~ msgstr "خطأ في إنشاء ملف PDF. يرجى المحاولة مرة أخرى." + +#~ msgid "Configure recipients and customize the message before sending." +#~ msgstr "قم بتكوين المستلمين وتخصيص الرسالة قبل الإرسال." + +#~ msgid "Notify Manager" +#~ msgstr "إبلاغ المدير" + +#~ msgid "Notify Dept" +#~ msgstr "إبلاغ القسم" + +#~ msgid "Add a personal note..." +#~ msgstr "أضف ملاحظة شخصية..." + +#~ msgid "CC Recipients" +#~ msgstr "المستلمون في نسخة كربونية (CC)" + +#~ msgid "email@example.com" +#~ msgstr "email@example.com" + +#~ msgid "Investigate First" +#~ msgstr "التحقيق أولاً" + +#~ msgid "Investigation In Progress" +#~ msgstr "التحقيق جارٍ" + +#~ msgid "Investigation Already Started" +#~ msgstr "بدأ التحقيق بالفعل" + +#~ msgid "Investigation Started" +#~ msgstr "بدأ التحقيق" + +#~ msgid "Investigating as" +#~ msgstr "التحقيق كـ" + +#~ msgid "Send Questions to Staff" +#~ msgstr "إرسال الأسئلة إلى الموظفين" + +#~ msgid "Investigation Response" +#~ msgstr "الاستجابة للتحقيق" + +#~ msgid "Review Investigation" +#~ msgstr "مراجعة التحقيق" + +#~ msgid "Review Investigation Answers" +#~ msgstr "مراجعة إجابات التحقيق" + +#~ msgid "Select a department first to see available contacts" +#~ msgstr "اختر قسمًا أولاً لعرض جهات الاتصال المتاحة" + +#~ msgid "No contact persons assigned to this department" +#~ msgstr "لا توجد جهات اتصال معينة لهذا القسم" + +#~ msgid "contact(s) available" +#~ msgstr "جهات اتصال متاحة" + +#~ msgid "Manual Send" +#~ msgstr "إرسال يدوي" + +#~ msgid "HIS Import" +#~ msgstr "استيراد نظام معلومات المستشفى" + +#~ msgid "Activate & Assign to Me" +#~ msgstr "تفعيل وتعيين لي" + +#~ msgid "No phone number on file" +#~ msgstr "لا يوجد رقم هاتف مسجل" + +#~ msgid "Send Complaint Link To Patient" +#~ msgstr "إرسال رابط الشكوى إلى المريض" + +#~ msgid "System Config" +#~ msgstr "تكوين النظام" + +#~ msgid "Comprehensive Patient Experience Analytics Dashboard" +#~ msgstr "لوحة تحليلات شاملة لتجربة المرضى" + +#~ msgid "KPI Category" +#~ msgstr "فئة مؤشرات الأداء" + +#~ msgid "Resolved Complaints" +#~ msgstr "الشكاوى المغلقة" + +#~ msgid "Negative Surveys" +#~ msgstr "الاستبيانات السلبية" + +#~ msgid "Complaints by Category" +#~ msgstr "الشكاوى حسب الفئة" + +#~ msgid "Survey Satisfaction Trend" +#~ msgstr "اتجاه رضا الاستبيانات" + +#~ msgid "Survey Distribution" +#~ msgstr "توزيع الاستبيانات" + +#~ msgid "Top Performing Physicians" +#~ msgstr "أفضل الأطباء أداءً" + +#~ msgid "Early Warnings" +#~ msgstr "الإنذارات المبكرة" + +#~ msgid "Forecast" +#~ msgstr "التنبؤ" + +#~ msgid "SLA Risk" +#~ msgstr "مخاطر SLA" + +#~ msgid "Risk" +#~ msgstr "المخاطر" + +#~ msgid "" +#~ "AI summary loading — click Refresh AI or wait for daily generation at 6 AM" +#~ msgstr "" +#~ "جاري تحميل ملخص الذكاء الاصطناعي — انقر على تحديث الذكاء الاصطناعي أو " +#~ "انتظر التوليد اليومي في الساعة ٦ صباحًا" + +#~ msgid "Signals" +#~ msgstr "الإشارات" + +#~ msgid "No departments currently showing risk signals" +#~ msgstr "لا توجد أقسام تعرض حالياً إشارات خطر" + +#~ msgid "Predicted 30d" +#~ msgstr "متوقع 30 يوم" + +#~ msgid "Insufficient historical data for forecasting (need 14+ days)" +#~ msgstr "بيانات تاريخية غير كافية للتنبؤ (تتطلب 14 يوماً أو أكثر)" + +#~ msgid "No complaints currently at risk of SLA breach" +#~ msgstr "لا توجد شكاوى حالية معرضة لانتهاء اتفاقية مستوى الخدمة" + +#~ msgid "No actionable patterns detected yet — need more complaint data" +#~ msgstr "" +#~ "لم يتم الكشف عن أنماط قابلة للتنفيذ حتى الآن — هناك حاجة إلى المزيد من " +#~ "بيانات الشكاوى" + +#~ msgid "PX Staff" +#~ msgstr "موظف تجربة المرضى" + +#~ msgid "Patient Experience Score (MOH-1)" +#~ msgstr "درجة تجربة المريض (MOH-1)" + +#~ msgid "Main section is required" +#~ msgstr "القسم الرئيسي مطلوب" + +#~ msgid "" +#~ "No explanation requests were sent. {} staff member(s) do not have email " +#~ "addresses. Please update staff records with email addresses before " +#~ "sending explanation requests." +#~ msgstr "" +#~ "لم يتم إرسال أي طلبات شرح. {} موظف(ين) لا يحتوي(ون) على عناوين بريد " +#~ "إلكتروني. يرجى تحديث سجلات الموظفين بعناوين البريد الإلكتروني قبل إرسال " +#~ "طلبات الشرح." + +#~ msgid "Access denied. PX Staff privileges required." +#~ msgstr "تم رفض الوصول. يلزم وجود صلاحيات موظف تجربة المرضى." + +#~ msgid "User Onboarding Completed" +#~ msgstr "اكتملت عملية إعداد المستخدم" + +#~ msgid "A new team member has joined PX360" +#~ msgstr "انضم عضو جديد إلى فريق PX360" + +#~ msgid "" +#~ "If you need to make any changes to this user's account, please visit the " +#~ "admin panel or contact support." +#~ msgstr "" +#~ "إذا كنت بحاجة إلى إجراء أي تغييرات على حساب هذا المستخدم، يرجى زيارة لوحة " +#~ "التحكم أو الاتصال بالدعم." + +#~ msgid "Reminder: Complete Your Setup" +#~ msgstr "تذكير: إكمال إعدادك" + +#~ msgid "Your PX360 account invitation is still active" +#~ msgstr "دعوة حساب PX360 الخاصة بك لا تزال نشطة" + +#~ msgid "Why Complete Your Setup?" +#~ msgstr "لماذا إكمال إعدادك؟" + +#~ msgid "Access Your Dashboard:" +#~ msgstr "الوصول إلى لوحة التحكم الخاصة بك:" + +#~ msgid "Manage your tasks and responsibilities" +#~ msgstr "إدارة مهامك ومسؤولياتك" + +#~ msgid "Collaborate with Your Team:" +#~ msgstr "التعاون مع فريقك:" + +#~ msgid "Connect with colleagues across departments" +#~ msgstr "تواصل مع الزملاء عبر الأقسام" + +#~ msgid "Stay Updated:" +#~ msgstr "ابق على اطلاع:" + +#~ msgid "Get real-time notifications and alerts" +#~ msgstr "احصل على إشعارات وتنبيهات فورية" + +#~ msgid "Improve Patient Experience:" +#~ msgstr "تحسين تجربة المريض:" + +#~ msgid "Contribute to better healthcare outcomes" +#~ msgstr "ساهم في تحسين نتائج الرعاية الصحية" + +#~ msgid "Need help? Contact our support team at" +#~ msgstr "هل تحتاج إلى مساعدة؟ تواصل مع فريق الدعم لدينا على" + +#~ msgid "or call" +#~ msgstr "أو اتصل" + +#~ msgid "Status, sources, and severity breakdown" +#~ msgstr "الحالة والمصادر وتفصيل الشدة" + +#~ msgid "Send appreciation to colleagues and celebrate achievements" +#~ msgstr "أرسل تقديرًا لزملائك واحتفل بالإنجازات" + +#~ msgid "My Appreciations" +#~ msgstr "تقديراتي" + +#~ msgid "Sent by Me" +#~ msgstr "مرسلة من قبلي" + +#~ msgid "No appreciations sent yet" +#~ msgstr "لا توجد تقديرات مرسلة بعد" + +#~ msgid "Start sharing appreciation with your colleagues!" +#~ msgstr "ابدأ بمشاركة التقدير مع زملائك!" + +#~ msgid "Send Your First Appreciation" +#~ msgstr "أرسل أول تقدير لك" + +#~ msgid "Select Recipient" +#~ msgstr "اختر المستلم" + +#~ msgid "Select a hospital first" +#~ msgstr "يرجى اختيار المستشفى أولًا" + +#~ msgid "Optional: Select if related to a specific department" +#~ msgstr "اختياري: اختر إذا كان مرتبطًا بقسم معين" + +#~ msgid "Write your appreciation message here..." +#~ msgstr "اكتب رسالة التقدير هنا..." + +#~ msgid "Required: Appreciation message in English" +#~ msgstr "مطلوب: رسالة التقدير باللغة الإنجليزية" + +#~ msgid "اكتب رسالة التقدير هنا..." +#~ msgstr "اكتب رسالة التقدير هنا..." + +#~ msgid "Optional: Appreciation message in Arabic" +#~ msgstr "اختياري: رسالة التقدير باللغة العربية" + +#~ msgid "Send anonymously" +#~ msgstr "إرسال بشكل مجهول" + +#~ msgid "Your name will not be shown to the recipient" +#~ msgstr "لن يتم عرض اسمك للمستلم" + +#~ msgid "Tips for Writing Appreciation" +#~ msgstr "نصائح لكتابة التقدير" + +#~ msgid "Be specific about what you appreciate" +#~ msgstr "كن محددًا بشأن ما تقدّره" + +#~ msgid "Use the person's name when addressing them" +#~ msgstr "استخدم اسم الشخص عند مخاطبته" + +#~ msgid "Mention the impact of their actions" +#~ msgstr "اذكر تأثير أفعالهم" + +#~ msgid "Be sincere and authentic" +#~ msgstr "كن صادقًا وأصيلًا" + +#~ msgid "Keep it positive and uplifting" +#~ msgstr "اجعلها إيجابية وملهمة" + +#~ msgid "Visibility Levels" +#~ msgstr "مستويات الظهور" + +#~ msgid "Private:" +#~ msgstr "خاص:" + +#~ msgid "Only you and the recipient can see this appreciation" +#~ msgstr "فقط أنت والمستلم يمكنكما رؤية هذا التقدير" + +#~ msgid "Visible to everyone in the selected department" +#~ msgstr "مرئي للجميع في القسم المحدد" + +#~ msgid "Visible to everyone in the selected hospital" +#~ msgstr "مرئي للجميع في المستشفى المحدد" + +#~ msgid "Public:" +#~ msgstr "عام:" + +#~ msgid "Visible to all PX360 users" +#~ msgstr "مرئي لجميع مستخدمي PX360" + +#~ msgid "View List" +#~ msgstr "عرض القائمة" + +#~ msgid "Inquiry Categories" +#~ msgstr "فئات الاستفسار" + +#~ msgid "Explanation" +#~ msgstr "إيضاح" + +#~ msgid "Date Created" +#~ msgstr "تاريخ الإنشاء" + +#~ msgid "72h Closure Delay Reason" +#~ msgstr "سبب تأخير الإغلاق خلال 72 ساعة" + +#~ msgid "Reason for not closing within 72 hours..." +#~ msgstr "سبب عدم الإغلاق خلال 72 ساعة..." + +#~ msgid "Save Reason" +#~ msgstr "حفظ السبب" + +#~ msgid "View all" +#~ msgstr "عرض الكل" + +#~ msgid "Assigned To:" +#~ msgstr "مُسند إلى:" + +#~ msgid "TAT Goal:" +#~ msgstr "الهدف الزمني للإكمال:" + +#~ msgid "PRIMARY" +#~ msgstr "أساسي" + +#~ msgid "Escalate this complaint to a manager or higher authority." +#~ msgstr "قم بتصعيد هذه الشكوى إلى المدير أو الجهة المختصة." + +#~ msgid "Select Manager (Optional)" +#~ msgstr "اختر المدير (اختياري)" + +#~ msgid "(Manager)" +#~ msgstr "(المدير)" + +#~ msgid "If not selected, will escalate to the staff's direct manager." +#~ msgstr "في حال عدم الاختيار، سيتم التصعيد إلى المدير المباشر للموظف." + +# Escalation Rules +#~ msgid "Enter escalation reason..." +#~ msgstr "أدخل سبب التصعيد..." + +#~ msgid "Error loading subsections" +#~ msgstr "خطأ في تحميل الأقسام الفرعية" + +#~ msgid "Staff Explanations" +#~ msgstr "إيضاحات الموظفين" + +#~ msgid "Created by" +#~ msgstr "تم الإنشاء بواسطة" + +#~ msgid "Status Changed" +#~ msgstr "تم تغيير الحالة" + +#, python-format +#~ msgid "" +#~ "\n" +#~ " Showing %(start)s to %(end)s of %(total)s " +#~ "inquiries\n" +#~ " " +#~ msgstr "" +#~ "\n" +#~ " عرض %(start)s إلى %(end)s من %(total)s " +#~ "الاستفسارات " + +#~ msgid "PX Staff:" +#~ msgstr "موظف تجربة المرضى:" + +#~ msgid "AI suggested this department based on the complaint analysis." +#~ msgstr "اقترح الذكاء الاصطناعي هذا القسم بناءً على تحليل الشكوى." + +#~ msgid "Explanation Delay Reason" +#~ msgstr "شرح سبب التأخير" + +#~ msgid "Enter reason for delay in receiving explanation..." +#~ msgstr "أدخل سبب التأخير في استلام التفسير..." + +#~ msgid "Request More Explanations" +#~ msgstr "طلب مزيد من التفسيرات" + +#~ msgid "Request Explanation" +#~ msgstr "طلب إيضاح" + +#~ msgid "Initiate an RCA to investigate the root causes of this complaint." +#~ msgstr "بدء تحليل السبب الجذري للتحقق من الأسباب الأساسية لهذه الشكوى." + +#~ msgid "Pending Resolution" +#~ msgstr "قيد الانتظار للحل" + +#~ msgid "Analyze Complaint & Generate Resolution Note" +#~ msgstr "تحليل الشكوى وإنشاء مذكرة الحل" + +#~ msgid "Explanation Requested" +#~ msgstr "طلب توضيح" + +#~ msgid "About This Form" +#~ msgstr "حول هذا النموذج" + +#~ msgid "" +#~ "Use this form to submit a complaint about your experience at one of our " +#~ "hospitals. We will review your complaint and get back to you as soon as " +#~ "possible." +#~ msgstr "" +#~ "استخدم هذا النموذج لتقديم شكوى حول تجربتك في أحد مستشفياتنا. سنراجع " +#~ "الشكوى ونتواصل معك في أقرب وقت." + +#~ msgid "Please provide your full name." +#~ msgstr "يرجى إدخال اسمك الكامل." + +#~ msgid "" +#~ "Select the location where the incident occurred. Start with the general " +#~ "area, then section and subsection if applicable." +#~ msgstr "" +#~ "اختر الموقع الذي وقعت فيه الحادثة. ابدأ بالمنطقة العامة، ثم القسم والقسم " +#~ "الفرعي إذا كان ذلك مطبقًا." + +#~ msgid "Images, PDF, Word (max 10MB each)" +#~ msgstr "الصور، PDF، Word (حد أقصى 10 ميجابايت لكل منها)" + +#~ msgid "Error loading locations" +#~ msgstr "خطأ في تحميل المواقع" + +#~ msgid "Select Recipients" +#~ msgstr "اختر المستلمين" + +#~ msgid "Will receive notification only (no explanation link)" +#~ msgstr "سيتم إرسال الإشعار فقط (بدون رابط التفسير)" + +#~ msgid "No manager assigned to this staff member" +#~ msgstr "لا يوجد مدير معيّن لهذا الموظف" + +#~ msgid "managers will be notified" +#~ msgstr "سيتم إخطار المديرين" + +#, fuzzy +#~ msgid "Password Reset" +#~ msgstr "طلب إعادة تعيين كلمة المرور" + +#~ msgid "Your New Credentials" +#~ msgstr "بيانات اعتمادك الجديدة" + +#~ msgid "Password:" +#~ msgstr "كلمة المرور:" + +#~ msgid "Login to PX360" +#~ msgstr "تسجيل الدخول إلى PX360" + +#~ msgid "Need Assistance?" +#~ msgstr "هل تحتاج إلى مساعدة؟" + +#~ msgid "" +#~ "This password has been sent to the user's email. Please share it securely " +#~ "if needed." +#~ msgstr "" +#~ "تم إرسال كلمة المرور هذه إلى البريد الإلكتروني للمستخدم. يُرجى مشاركتها " +#~ "بشكل آمن إذا لزم الأمر." + +#~ msgid "Track Complaint" +#~ msgstr "تتبع الشكوى" + +#~ msgid "In-Patient" +#~ msgstr "مريض داخلي" + +#~ msgid "Out-Patient" +#~ msgstr "المرضى الخارجيين" + +#~ msgid "Appointment Confirmed" +#~ msgstr "تم تأكيد الموعد" + +#~ msgid "" +#~ "Your healthcare appointment at Al Hammadi Hospital has been successfully " +#~ "scheduled" +#~ msgstr "لقد تم جدولة موعدك الصحي في مستشفى الحمادي بنجاح" + +#~ msgid "Appointment Details" +#~ msgstr "تفاصيل الموعد" + +#~ msgid "Patient Experience Management Department" +#~ msgstr "إدارة تجربة المريض" + +#~ msgid "Explanation Reminder" +#~ msgstr "تذكير التوضيح" + +#~ msgid "" +#~ "Your response is due soon. Please submit your explanation to avoid " +#~ "escalation." +#~ msgstr "يجب تقديم ردك قريباً. يرجى تقديم تفسيرك لتجنب التصعيد." + +#~ msgid "" +#~ "If you have any questions, please contact the person who requested this " +#~ "explanation." +#~ msgstr "إذا كان لديك أي أسئلة، يرجى التواصل مع الشخص الذي طلب هذا التفسير." + +#~ msgid "Explanation Request" +#~ msgstr "طلب إيضاح" + +#~ msgid "Final Explanation Reminder" +#~ msgstr "تذكير بتقديم التفسير النهائي" + +#~ msgid "" +#~ "Your response is overdue. Please submit your explanation immediately to " +#~ "avoid escalation to your manager." +#~ msgstr "استجابتك متأخرة. يرجى تقديم تفسيرك فورًا لتجنب التصعيد إلى مديرك." + +#~ msgid "Escalation Warning:" +#~ msgstr "تحذير التصعيد:" + +#~ msgid "" +#~ "Your invitation to join PX360 has expired. Please contact your " +#~ "administrator." +#~ msgstr "انتهت صلاحية دعوتك للانضمام إلى PX360. يرجى التواصل مع المسؤول." + +#~ msgid "Notification Details" +#~ msgstr "تفاصيل الإشعار" + +#~ msgid "New Observation Submitted" +#~ msgstr "تم تقديم ملاحظة جديدة" + +#~ msgid "Observation Assigned to You" +#~ msgstr "ملاحظة معينة لك" + +#~ msgid "An observation requires your attention and action" +#~ msgstr "ملاحظة تتطلب انتباهك وإجراءك" + +#~ msgid "" +#~ "This observation has an SLA deadline. Please ensure timely action to " +#~ "avoid breach." +#~ msgstr "" +#~ "تحتوي هذه الملاحظة على موعد نهائي لمستوى الخدمة. يُرجى اتخاذ الإجراء " +#~ "المناسب في الوقت المحدد لتجنب حدوث خرق." + +#~ msgid "" +#~ "Please update the observation status in the system once you have reviewed " +#~ "it." +#~ msgstr "يرجى تحديث حالة الملاحظة في النظام بمجرد مراجعتها." + +#~ msgid "Monthly Follow-Up Required" +#~ msgstr "تتطلب متابعة شهرية" + +#~ msgid "A resolved observation is due for follow-up review" +#~ msgstr "الملاحظة المحلولة مقرر إجراء مراجعة متابعة لها" + +#~ msgid "Follow-Up Actions:" +#~ msgstr "إجراءات المتابعة:" + +#~ msgid "" +#~ "Please complete the follow-up review and update the observation status in " +#~ "the system." +#~ msgstr "يرجى إكمال مراجعة المتابعة وتحديث حالة الملاحظة في النظام." + +#~ msgid "Observation {{ status_display|default:'Resolved' }}" +#~ msgstr "ملاحظة {{ status_display|default:'تم الحل' }}" + +#~ msgid "An observation has been updated and requires your review" +#~ msgstr "تم تحديث ملاحظة وتتطلب مراجعتك" + +#~ msgid "No resolution notes have been provided for this observation." +#~ msgstr "لم يتم تقديم ملاحظات حل لهذه الملاحظة." + +#~ msgid "SLA Deadline Reminder" +#~ msgstr "تذكير موعد اتفاقية مستوى الخدمة" + +#~ msgid "An observation assigned to you is approaching its SLA deadline." +#~ msgstr "" +#~ "ملاحظة تم تعيينها لك تقترب من الموعد النهائي لاتفاقية مستوى الخدمة (SLA)." + +#~ msgid "" +#~ "If you have already addressed this observation, please update its status " +#~ "in the system." +#~ msgstr "" +#~ "إذا كنت قد تعاملت بالفعل مع هذه الملاحظة، فيرجى تحديث حالتها في النظام." + +#~ msgid "URGENT - Final Reminder" +#~ msgstr "عاجل - تذكير نهائي" + +#~ msgid "This observation is about to breach its SLA deadline" +#~ msgstr "" +#~ "هذه الملاحظة على وشك تجاوز الموعد النهائي لاتفاقية مستوى الخدمة (SLA)" + +#~ msgid "SLA Deadline - Critical" +#~ msgstr "الموعد النهائي لاتفاقية مستوى الخدمة (SLA) - حرج" + +#~ msgid "Immediate Action Required:" +#~ msgstr "إجراء فوري مطلوب:" + +#~ msgid "" +#~ "This observation will be flagged as overdue if not addressed before the " +#~ "SLA deadline. This may trigger automatic escalation to management." +#~ msgstr "" +#~ "سيتم وضع علامة على هذه الملاحظة كمتأخرة إذا لم يتم التعامل معها قبل موعد " +#~ "نهائي للاتفاقية服务水平. قد يؤدي ذلك إلى تصعيد تلقائي إلى الإدارة." + +#~ msgid "A new inquiry has been submitted through the public contact form." +#~ msgstr "تم تقديم استفسار جديد عبر نموذج الاتصال العام." + +#~ msgid "An assigned complaint is approaching its SLA deadline." +#~ msgstr "شكو مسند يقترب من موعد نهائي لاتفاقية مستوى الخدمة (SLA)." + +#~ msgid "" +#~ "If you have already addressed this complaint, please update its status in " +#~ "the system." +#~ msgstr "إذا كنت قد تناولت هذه الشكوى بالفعل، يرجى تحديث حالتها في النظام." + +#~ msgid "URGENT: Final SLA Reminder" +#~ msgstr "عاجل: تذكير SLA النهائي" + +#~ msgid "" +#~ "An unassigned complaint is about to breach its SLA. This is the FINAL " +#~ "reminder." +#~ msgstr "" +#~ "شكوى غير مُسندة على وشك انتهاك اتفاقية مستوى الخدمة (SLA). هذا هو التذكير " +#~ "النهائي." + +#~ msgid "" +#~ "This is the second and final SLA reminder. Immediate action required." +#~ msgstr "" +#~ "هذا هو التذكير الثاني والأخير لاتفاقية مستوى الخدمة. مطلوب إجراء فوري." + +#~ msgid "URGENT Action Required:" +#~ msgstr "مطلوب إجراء عاجل:" + +#~ msgid "" +#~ "This complaint is approaching its SLA deadline. Please review and take " +#~ "immediate action." +#~ msgstr "" +#~ "تقترب هذه الشكوى من موعد نهائي لاتفاقية مستوى الخدمة (SLA). يرجى المراجعة " +#~ "واتخاذ إجراء فوري." + +#~ msgid "Critical Notice" +#~ msgstr "إشعار بالغ الأهمية" + +#~ msgid "" +#~ "This is the final reminder before automatic escalation. Failure to act " +#~ "may result in SLA breach consequences." +#~ msgstr "" +#~ "هذا التذكير النهائي قبل التصعيد التلقائي. قد يؤدي الفشل في التصرف إلى " +#~ "عواقب انتهاك اتفاقية مستوى الخدمة (SLA)." + +#~ msgid "Takes only 3-5 minutes" +#~ msgstr "تستغرق 3-5 دقائق فقط" + +#~ msgid "Your responses are confidential" +#~ msgstr "ردودك سرية" + +#~ msgid "Survey Results Ready" +#~ msgstr "نتائج الاستبيان جاهزة" + +#~ msgid "" +#~ "View the latest patient experience survey results for your department" +#~ msgstr "عرض نتائج استبيان تجربة المرضى האחרונים لقسمك" + +#~ msgid "Are you sure you want to delete this feedback?" +#~ msgstr "هل أنت متأكد أنك تريد حذف هذه الملاحظة؟" + +#~ msgid "Feedback Information" +#~ msgstr "معلومات الملاحظة" + +#~ msgid "Add Response" +#~ msgstr "إضافة رد" + +#~ msgid "No RCAs yet" +#~ msgstr "لا توجد تحليلات للأسباب الجذرية بعد" + +#~ msgid "Flags & Settings" +#~ msgstr "العلامات والإعدادات" + +#~ msgid "Follow-up Required" +#~ msgstr "مطلوب متابعة" + +#~ msgid "Create New Feedback" +#~ msgstr "إنشاء ملاحظات جديدة" + +#~ msgid "Edit Feedback" +#~ msgstr "تعديل الملاحظات" + +#~ msgid "Patient/Contact Information" +#~ msgstr "معلومات المريض/المرتبط" + +#~ msgid "Submit as Anonymous Feedback" +#~ msgstr "إرسال كملاحظات مجهولة" + +#~ msgid "Feedback Details" +#~ msgstr "تفاصيل الملاحظات" + +#~ msgid "Please provide detailed feedback" +#~ msgstr "يرجى تقديم ملاحظات مفصلة" + +#~ msgid "Rate your experience from 1 to 5 stars" +#~ msgstr "قيّم تجربتك من 1 إلى 5 نجوم" + +#~ msgid "Organization Information" +#~ msgstr "معلومات المؤسسة" + +#~ msgid "Select the department related to this feedback (optional)" +#~ msgstr "اختر القسم المتعلق بهذه الملاحظات (اختياري)" + +#~ msgid "Select the physician mentioned in this feedback (optional)" +#~ msgstr "اختر الطبيب المذكور في هذه الملاحظات (اختياري)" + +#~ msgid "Related encounter ID if applicable (optional)" +#~ msgstr "معرف المقابلة المتعلق إذا كان منطبقًا (اختياري)" + +#~ msgid "Update Feedback" +#~ msgstr "تحديث ملاحظات" + +#~ msgid "Feedback Console" +#~ msgstr "وحدة تحكم الملاحظات" + +#~ msgid "Total Feedback" +#~ msgstr "إجمالي الملاحظات" + +#~ msgid "1-5" +#~ msgstr "1-5" + +#~ msgid "Patient/Contact" +#~ msgstr "المريض / جهة الاتصال" + +#~ msgid "Good morning" +#~ msgstr "صباح الخير" + +#~ msgid "Submit a staff observation report" +#~ msgstr "تقديم تقرير ملاحظة للموظف" + +#~ msgid "Describe what was observed" +#~ msgstr "صف ما تم ملاحظته" + +#~ msgid "" +#~ "Please describe what you observed in detail (at least 10 characters)." +#~ msgstr "يرجى وصف ما لاحظته بالتفصيل (10 أحرف على الأقل)." + +#~ msgid "Location & Timing" +#~ msgstr "الموقع والتوقيت" + +#~ msgid "Where and when did this occur?" +#~ msgstr "أين ومتى حدث ذلك؟" + +#~ msgid "Optionally assign to a department or user" +#~ msgstr "يمكنك اختيارًا تعيينه إلى قسم أو مستخدم" + +#~ msgid "Upload supporting documents or images" +#~ msgstr "رفع المستندات الداعمة أو الصور" + +#~ msgid "Incident Date/Time" +#~ msgstr "تاريخ/وقت الحادثة" + +#~ msgid "This observation was submitted anonymously" +#~ msgstr "تم إرسال هذه الملاحظة بشكل مجهول" + +#~ msgid "No timeline entries yet" +#~ msgstr "لا توجد إدخالات في الجدول الزمني بعد" + +#~ msgid "Internal note (not visible to public)" +#~ msgstr "ملاحظة داخلية (غير مرئية للعامة)" + +#~ msgid "Quick Status Change" +#~ msgstr "تغيير سريع للحالة" + +#~ msgid "Observations Console" +#~ msgstr "لوحة تحكم الملاحظات" + +#~ msgid "Reporter Type" +#~ msgstr "نوع المُبلّغ" + +#~ msgid "Identified Only" +#~ msgstr "معرّف فقط" + +#~ msgid "Add your first department to get started" +#~ msgstr "أضف قسمك الأول للبدء" + +#~ msgid "" +#~ "Your account has been created successfully. Below are your login " +#~ "credentials." +#~ msgstr "تم إنشاء حسابك بنجاح. أدناه هي بيانات تسجيل الدخول الخاصة بك." + +#~ msgid "Your Account Details" +#~ msgstr "تفاصيل حسابك" + +#~ msgid "Toggle" +#~ msgstr "تبديل" + +#~ msgid "A new password will be generated and emailed." +#~ msgstr "سيتم إنشاء كلمة مرور جديدة وإرسالها عبر البريد الإلكتروني." + +#~ msgid "Password Reset Successful" +#~ msgstr "تمت إعادة تعيين كلمة المرور بنجاح" + +#~ msgid "Copy this password:" +#~ msgstr "انسخ كلمة المرور هذه:" + +#~ msgid "Reset password and resend credentials?" +#~ msgstr "إعادة تعيين كلمة المرور وإعادة إرسال بيانات الاعتماد؟" + +#~ msgid "Password copied!" +#~ msgstr "تم نسخ كلمة المرور!" + +#~ msgid "Found staff member:" +#~ msgstr "تم العثور على الموظف:" + +#~ msgid "Organizational Structure" +#~ msgstr "الهيكل التنظيمي" + +#~ msgid "Expand All" +#~ msgstr "توسيع الكل" + +#~ msgid "Collapse All" +#~ msgstr "طي الكل" + +#~ msgid "No Staff Hierarchy Found" +#~ msgstr "لم يتم العثور على هيكل تنظيمي للموظفين" + +#~ msgid "Add Staff Member" +#~ msgstr "إضافة موظف" + +#~ msgid "Limit" +#~ msgstr "الحد" + +#~ msgid "Up" +#~ msgstr "ارتفاع" + +#~ msgid "Down" +#~ msgstr "انخفاض" + +#~ msgid "Project Info" +#~ msgstr "معلومات المشروع" + +#~ msgid "Leave empty to apply to all departments" +#~ msgstr "اتركه فارغاً للتطبيق على جميع الأقسام" + +#~ msgid "characters" +#~ msgstr "حرفًا" + +#~ msgid "Patient Rating" +#~ msgstr "تقييم المريض" + +#~ msgid "Response Distribution" +#~ msgstr "توزيع الإجابات" + +#~ msgid "Base Question (always included)" +#~ msgstr "السؤال الأساسي (مُدرج دائماً)" + +#~ msgid "HIS event type that triggers this question (leave blank for base)" +#~ msgstr "" +#~ "نوع حدث نظام معلومات المستشفى الذي يُفعّل هذا السؤال (اتركه فارغاً للأسئلة " +#~ "الأساسية)" + +#~ msgid "" +#~ "JSON array of choices. Format: [{"value": "1", "" +#~ "label": "Option 1", "label_ar": "خيار " +#~ "1"}]" +#~ msgstr "" +#~ "مصفوفة JSON للخيارات. التنسيق: [{"value": "1", "" +#~ "label": "Option 1", "label_ar": "خيار " +#~ "1"}]" + +#~ msgid "Conditional (hidden by default, shown only via routing rules)" +#~ msgstr "مشروط (مخفي افتراضيًا، يظهر فقط عبر قواعد التوجيه)" + #~ msgid "Your comprehensive Patient Experience management platform" #~ msgstr "منصة إدارة تجربة المريض الشاملة الخاصة بك" @@ -25318,8 +33662,8 @@ msgstr "هل أنت متأكد من رغبتك في حذف نموذج الاست #~ msgstr "تفعيل حسابك والبدء باستخدام PX360" #~ msgid "" -#~ "This invitation link will expire in 7 days. If you don't complete the setup " -#~ "within this period, you'll need to request a new invitation." +#~ "This invitation link will expire in 7 days. If you don't complete the " +#~ "setup within this period, you'll need to request a new invitation." #~ msgstr "" #~ "ستنتهي صلاحية رابط الدعوة هذا خلال 7 أيام. إذا لم تكمل الإعداد خلال هذه " #~ "الفترة، ستحتاج إلى طلب دعوة جديدة." @@ -25328,8 +33672,8 @@ msgstr "هل أنت متأكد من رغبتك في حذف نموذج الاست #~ "If you have any questions or need assistance, please contact our support " #~ "team at" #~ msgstr "" -#~ "إذا كان لديك أي أسئلة أو تحتاج إلى مساعدة، يرجى التواصل مع فريق الدعم لدينا " -#~ "على" +#~ "إذا كان لديك أي أسئلة أو تحتاج إلى مساعدة، يرجى التواصل مع فريق الدعم " +#~ "لدينا على" #~ msgid "or call us at" #~ msgstr "أو اتصل بنا على" @@ -25414,15 +33758,9 @@ msgstr "هل أنت متأكد من رغبتك في حذف نموذج الاست #~ msgid "Important Information:" #~ msgstr "معلومات مهمة:" -#~ msgid "This link is unique and can only be used once" -#~ msgstr "هذا الرابط فريد ويمكن استخدامه مرة واحدة فقط" - #~ msgid "You can attach supporting documents to your explanation" #~ msgstr "يمكنك إرفاق مستندات داعمة لإيضاحك" -#~ msgid "Your response will be reviewed by the PX team" -#~ msgstr "سيتم مراجعة ردك من قبل فريق PX" - #~ msgid "Please submit your explanation at your earliest convenience" #~ msgstr "يرجى تقديم إيضاحك في أقرب وقت ممكن" @@ -25430,26 +33768,22 @@ msgstr "هل أنت متأكد من رغبتك في حذف نموذج الاست #~ msgid "New Observation Notification - Al Hammadi Hospital" #~ msgstr "إشعار شكوى جديد - مستشفى الحمادي" -#, fuzzy -#~ msgid "A new observation has been submitted and requires review." -#~ msgstr "تم إرسال ملاحظتك بنجاح." - #, fuzzy #~ msgid "" -#~ "A new observation has been submitted and requires your review. Please assess" -#~ " the details below and take appropriate action." +#~ "A new observation has been submitted and requires your review. Please " +#~ "assess the details below and take appropriate action." #~ msgstr "تم تقديم شكوى جديدة وتتطلب انتباهك. يرجى مراجعة التفاصيل أدناه." #, fuzzy #~ msgid "" -#~ "Please review this observation and assign it to the appropriate team member " -#~ "for further action." +#~ "Please review this observation and assign it to the appropriate team " +#~ "member for further action." #~ msgstr "" #~ "يرجى مراجعة هذه الشكوى واتخاذ الإجراء المناسب قبل موعد SLA لتجنب الإخلال." #~ msgid "" -#~ "Help us improve our services by sharing your recent experience at Al Hammadi" -#~ " Hospital" +#~ "Help us improve our services by sharing your recent experience at Al " +#~ "Hammadi Hospital" #~ msgstr "" #~ "ساعدنا في تحسين خدماتنا من خلال مشاركة تجربتك الأخيرة في مستشفى الحمادي" @@ -25459,13 +33793,13 @@ msgstr "هل أنت متأكد من رغبتك في حذف نموذج الاست #, python-format #~ msgid "" -#~ "Your feedback is invaluable in helping us maintain and improve the quality " -#~ "of care we provide. Would you mind taking %(duration)s minutes to complete " -#~ "our patient experience survey?" +#~ "Your feedback is invaluable in helping us maintain and improve the " +#~ "quality of care we provide. Would you mind taking %(duration)s minutes to " +#~ "complete our patient experience survey?" #~ msgstr "" -#~ "ملاحظاتكم لا تقدر بثمن في مساعدتنا على الحفاظ على جودة الرعاية التي نقدمها " -#~ "وتحسينها. هل تمانعون في تخصيص %(duration)s دقيقة لإكمال استبيان تجربة المريض" -#~ " الخاص بنا؟" +#~ "ملاحظاتكم لا تقدر بثمن في مساعدتنا على الحفاظ على جودة الرعاية التي " +#~ "نقدمها وتحسينها. هل تمانعون في تخصيص %(duration)s دقيقة لإكمال استبيان " +#~ "تجربة المريض الخاص بنا؟" #, fuzzy #~ msgid "Why Your Feedback Matters:" @@ -25504,9 +33838,6 @@ msgstr "هل أنت متأكد من رغبتك في حذف نموذج الاست #~ msgid "Approximately" #~ msgstr "تقريباً" -#~ msgid "minutes" -#~ msgstr "دقيقة" - #, fuzzy #~ msgid "Confidentiality:" #~ msgstr "الثقة" @@ -25518,9 +33849,6 @@ msgstr "هل أنت متأكد من رغبتك في حذف نموذج الاست #~ msgid "the end of this week" #~ msgstr "نهاية هذا الأسبوع" -#~ msgid "Enter your reference number to check the status" -#~ msgstr "أدخل رقمك المرجعي للتحقق من الحالة" - #~ msgid "Track" #~ msgstr "تتبع" @@ -25533,21 +33861,12 @@ msgstr "هل أنت متأكد من رغبتك في حذف نموذج الاست #~ msgid "Action is being taken" #~ msgstr "يتم اتخاذ إجراء" -#~ msgid "Rejected" -#~ msgstr "مرفوض" - -#~ msgid "This observation was not accepted" -#~ msgstr "لم يتم قبول هذه الملاحظة" - #~ msgid "Duplicate" #~ msgstr "مكررة" #~ msgid "This observation was marked as duplicate" #~ msgstr "تم تحديد هذه الملاحظة كمكررة" -#~ msgid "Submit a new observation" -#~ msgstr "إرسال ملاحظة جديدة" - #~ msgid "Medical Director" #~ msgstr "المدير الطبي" @@ -25656,9 +33975,6 @@ msgstr "هل أنت متأكد من رغبتك في حذف نموذج الاست #~ msgid "Notes on effectiveness verification" #~ msgstr "ملاحظات حول التحقق من الفعالية" -#~ msgid "In Review" -#~ msgstr "قيد المراجعة" - #~ msgid "RCA status" #~ msgstr "حالة تحليل السبب الجذري" @@ -25677,9 +33993,6 @@ msgstr "هل أنت متأكد من رغبتك في حذف نموذج الاست #~ msgid "Enter one email address per line" #~ msgstr "أدخل عنوان بريد إلكتروني واحد في كل سطر" -#~ msgid "All Roles" -#~ msgstr "جميع الأدوار" - #~ msgid "Step 1 of 3" #~ msgstr "الخطوة 1 من 3" @@ -25696,10 +34009,8 @@ msgstr "هل أنت متأكد من رغبتك في حذف نموذج الاست #~ msgstr "الخطوة 2 من 3" #~ msgid "You can complete these tasks later from your dashboard if needed." -#~ msgstr "يمكنك إكمال هذه المهام لاحقًا من لوحة التحكم الخاصة بك إذا لزم الأمر." - -#~ msgid "SLA" -#~ msgstr "اتفاقية مستوى الخدمة" +#~ msgstr "" +#~ "يمكنك إكمال هذه المهام لاحقًا من لوحة التحكم الخاصة بك إذا لزم الأمر." #~ msgid "Hospital Notification Configuration" #~ msgstr "إعدادات إشعارات المستشفى" @@ -25723,22 +34034,17 @@ msgstr "هل أنت متأكد من رغبتك في حذف نموذج الاست #~ msgid "WhatsApp" #~ msgstr "واتساب" -#~ msgid "Rich Messages" -#~ msgstr "رسائل تفاعلية" - #~ msgid "Do Not Disturb" #~ msgstr "عدم الإزعاج" -#~ msgid "Complaint Notifications" -#~ msgstr "إشعارات الشكاوى" - #~ msgid "5 events" #~ msgstr "5 أحداث" #~ msgid "" #~ "Complaint acknowledgment, assignment, status changes, resolution, and " #~ "closure notifications." -#~ msgstr "إشعارات استلام الشكوى، التعيين، تغييرات الحالة، الحل، وإغلاق الشكوى." +#~ msgstr "" +#~ "إشعارات استلام الشكوى، التعيين، تغييرات الحالة، الحل، وإغلاق الشكوى." #~ msgid "Explanation Workflow" #~ msgstr "سير عمل التوضيحات" @@ -25773,7 +34079,8 @@ msgstr "هل أنت متأكد من رغبتك في حذف نموذج الاست #~ "تذكيرات اتفاقية مستوى الخدمة وتنبيهات التجاوز لضمان الحل في الوقت المحدد." #~ msgid "" -#~ "Invitation, reminder, and completion notifications for new user onboarding." +#~ "Invitation, reminder, and completion notifications for new user " +#~ "onboarding." #~ msgstr "إشعارات الدعوة، التذكير، والإكمال لتهيئة المستخدمين الجدد." #~ msgid "Notification Best Practices" @@ -25795,7 +34102,8 @@ msgstr "هل أنت متأكد من رغبتك في حذف نموذج الاست #~ "Configure Service Level Agreements, escalation rules, and complaint " #~ "thresholds for your organization." #~ msgstr "" -#~ "قم بإعداد اتفاقيات مستوى الخدمة وقواعد التصعيد وحدود الشكاوى الخاصة بمؤسستك." +#~ "قم بإعداد اتفاقيات مستوى الخدمة وقواعد التصعيد وحدود الشكاوى الخاصة " +#~ "بمؤسستك." #~ msgid "Manage deadline settings for complaint resolution" #~ msgstr "إدارة إعدادات المهل الزمنية لمعالجة الشكاوى" @@ -25816,9 +34124,6 @@ msgstr "هل أنت متأكد من رغبتك في حذف نموذج الاست #~ msgid "Review and adjust SLA settings regularly" #~ msgstr "مراجعة وتحديث إعدادات اتفاقية مستوى الخدمة بشكل دوري" -#~ msgid "Active Users" -#~ msgstr "المستخدمون النشطون" - #~ msgid "Provisional Users" #~ msgstr "المستخدمون المؤقتون" @@ -25826,18 +34131,18 @@ msgstr "هل أنت متأكد من رغبتك في حذف نموذج الاست #~ msgstr "إدارة الحسابات المعلقة" #~ msgid "" -#~ "View and manage pending user accounts awaiting activation. Create new users " -#~ "and track their onboarding progress." +#~ "View and manage pending user accounts awaiting activation. Create new " +#~ "users and track their onboarding progress." #~ msgstr "" -#~ "عرض وإدارة حسابات المستخدمين المعلقة في انتظار التفعيل. إنشاء مستخدمين جدد " -#~ "وتتبع تقدم إعدادهم." +#~ "عرض وإدارة حسابات المستخدمين المعلقة في انتظار التفعيل. إنشاء مستخدمين " +#~ "جدد وتتبع تقدم إعدادهم." #~ msgid "Import via CSV" #~ msgstr "الاستيراد عبر ملف CSV" #~ msgid "" -#~ "Import multiple users at once using a CSV file. Great for onboarding entire " -#~ "departments." +#~ "Import multiple users at once using a CSV file. Great for onboarding " +#~ "entire departments." #~ msgstr "" #~ "استيراد مستخدمين متعددين دفعة واحدة باستخدام ملف CSV. ممتاز لإعداد أقسام " #~ "كاملة." @@ -25867,20 +34172,17 @@ msgstr "هل أنت متأكد من رغبتك في حذف نموذج الاست #~ msgid "Acknowledgement Content" #~ msgstr "محتوى الإقرار" -#~ msgid "Manage content sections" -#~ msgstr "إدارة أقسام المحتوى" - #~ msgid "" -#~ "Create and manage educational content sections and acknowledgement materials" -#~ " for new users." +#~ "Create and manage educational content sections and acknowledgement " +#~ "materials for new users." #~ msgstr "إنشاء وإدارة أقسام المحتوى التعليمي ومواد الإقرار للمستخدمين الجدد." #~ msgid "Manage checklists" #~ msgstr "إدارة قوائم التحقق" #~ msgid "" -#~ "Manage the acknowledgement checklist items that users must complete during " -#~ "onboarding." +#~ "Manage the acknowledgement checklist items that users must complete " +#~ "during onboarding." #~ msgstr "" #~ "إدارة عناصر قائمة الإقرار التي يجب على المستخدمين إكمالها أثناء التسجيل." @@ -25900,8 +34202,8 @@ msgstr "هل أنت متأكد من رغبتك في حذف نموذج الاست #~ msgstr "إعادة إرسال الدعوات منتهية الصلاحية" #~ msgid "" -#~ "Monitor pending users and resend invitations to those who haven't activated " -#~ "their accounts." +#~ "Monitor pending users and resend invitations to those who haven't " +#~ "activated their accounts." #~ msgstr "" #~ "مراقبة المستخدمين المعلقين وإعادة إرسال الدعوات لمن لم ينشطوا حساباتهم." @@ -25922,24 +34224,15 @@ msgstr "هل أنت متأكد من رغبتك في حذف نموذج الاست #~ "Export user data regularly for audit trails and compliance reporting " #~ "requirements." #~ msgstr "" -#~ "قم بتصدير بيانات المستخدمين بانتظام لمسارات التدقيق ومتطلبات إعداد التقارير " -#~ "الخاصة بالامتثال." - -#~ msgid "Select staff" -#~ msgstr "اختر الموظف" +#~ "قم بتصدير بيانات المستخدمين بانتظام لمسارات التدقيق ومتطلبات إعداد " +#~ "التقارير الخاصة بالامتثال." #~ msgid "Status changed to" #~ msgstr "تم تغيير الحالة إلى" -#~ msgid "Response Sent" -#~ msgstr "تم إرسال الرد" - #~ msgid "Response sent by" #~ msgstr "تم إرسال الرد بواسطة" -#~ msgid "Enter your response to the inquiry..." -#~ msgstr "أدخل ردك على الاستفسار..." - #~ msgid "Back to Home" #~ msgstr "العودة إلى الصفحة الرئيسية" @@ -25952,9 +34245,6 @@ msgstr "هل أنت متأكد من رغبتك في حذف نموذج الاست #~ msgid "Complaint Source" #~ msgstr "مصدر الشكوى" -#~ msgid "Any Source" -#~ msgstr "أي مصدر" - #~ msgid "" #~ "Select a specific source for source-based SLA, or leave blank for " #~ "severity/priority-based SLA" @@ -25962,12 +34252,6 @@ msgstr "هل أنت متأكد من رغبتك في حذف نموذج الاست #~ "اختر مصدرًا محددًا لـ SLA القائم على المصدر، أو اتركه فارغًا لـ SLA القائم " #~ "على خطورة/أولوية" -#~ msgid "Any Severity" -#~ msgstr "أي شدة" - -#~ msgid "Any Priority" -#~ msgstr "أي أولوية" - #~ msgid "SLA Deadline (Hours)" #~ msgstr "المهلة الزمنية لاتفاقية مستوى الخدمة (بالساعات)" @@ -25978,8 +34262,8 @@ msgstr "هل أنت متأكد من رغبتك في حذف نموذج الاست #~ msgstr "توقيت التذكير (قائم على المصدر)" #~ msgid "" -#~ "Configure when reminders are sent after complaint creation. Set to 0 to use " -#~ "legacy timing (hours before deadline)." +#~ "Configure when reminders are sent after complaint creation. Set to 0 to " +#~ "use legacy timing (hours before deadline)." #~ msgstr "" #~ "قم بضبط متى يتم إرسال التذكيرات بعد إنشاء الشكوى. اضبط على 0 لاستخدام " #~ "التوقيت التقليدي (ساعات قبل الموعد النهائي)." @@ -25991,7 +34275,8 @@ msgstr "هل أنت متأكد من رغبتك في حذف نموذج الاست #~ msgstr "مثال، 12" #~ msgid "" -#~ "Send first reminder X hours after complaint creation (0 = use legacy timing)" +#~ "Send first reminder X hours after complaint creation (0 = use legacy " +#~ "timing)" #~ msgstr "" #~ "إرسال التذكير الأول بعد X ساعات من إنشاء الشكوى (0 = استخدام التوقيت " #~ "التقليدي)" @@ -26012,8 +34297,8 @@ msgstr "هل أنت متأكد من رغبتك في حذف نموذج الاست #~ msgstr "توقيت التذكير القديم (قبل الموعد النهائي)" #~ msgid "" -#~ "These settings are used when the new source-based timing is set to 0. Kept " -#~ "for backward compatibility." +#~ "These settings are used when the new source-based timing is set to 0. " +#~ "Kept for backward compatibility." #~ msgstr "" #~ "يتم استخدام هذه الإعدادات عندما يكون التوقيت الجديد القائم على المصدر " #~ "مضبوطًا على 0. تم الاحتفاظ بها للتوافق مع الإصدارات السابقة." @@ -26066,8 +34351,8 @@ msgstr "هل أنت متأكد من رغبتك في حذف نموذج الاست #~ msgstr "توقيت مبني على المصدر:" #~ msgid "" -#~ "Set reminder hours after creation (e.g., remind 12h after creation for 24h " -#~ "SLA)" +#~ "Set reminder hours after creation (e.g., remind 12h after creation for " +#~ "24h SLA)" #~ msgstr "" #~ "تعيين ساعات التذكير بعد الإنشاء (على سبيل المثال، تذكير بعد 12 ساعة من " #~ "الإنشاء لمدة SLA تبلغ 24 ساعة)" @@ -26077,8 +34362,8 @@ msgstr "هل أنت متأكد من رغبتك في حذف نموذج الاست #~ msgid "Set reminder hours before deadline (e.g., remind 6h before deadline)" #~ msgstr "" -#~ "تعيين ساعات التذكير قبل الموعد النهائي (على سبيل المثال، تذكير قبل 6 ساعات " -#~ "من الموعد النهائي)" +#~ "تعيين ساعات التذكير قبل الموعد النهائي (على سبيل المثال، تذكير قبل 6 " +#~ "ساعات من الموعد النهائي)" #~ msgid "Best Practices" #~ msgstr "أفضل الممارسات" @@ -26117,11 +34402,13 @@ msgstr "هل أنت متأكد من رغبتك في حذف نموذج الاست #, python-format #~ msgid "" #~ "\n" -#~ " Showing %(start)s to %(end)s of %(total)s configurations\n" +#~ " Showing %(start)s to %(end)s of %(total)s " +#~ "configurations\n" #~ " " #~ msgstr "" #~ "\n" -#~ " عرض %(start)s إلى %(end)s من %(total)s تكوينات " +#~ " عرض %(start)s إلى %(end)s من %(total)s " +#~ "تكوينات " #~ msgid "Create your first configuration to get started" #~ msgstr "قم بإنشاء أول تكوين للبدء" @@ -26132,9 +34419,6 @@ msgstr "هل أنت متأكد من رغبتك في حذف نموذج الاست #~ msgid "Manage Call Records" #~ msgstr "إدارة سجلات المكالمات" -#~ msgid "out of" -#~ msgstr "من أصل" - #~ msgid "responses" #~ msgstr "استجابات" @@ -26144,23 +34428,13 @@ msgstr "هل أنت متأكد من رغبتك في حذف نموذج الاست #~ msgid "Avg Resolution:" #~ msgstr "متوسط المدة:" -#, fuzzy -#~ msgid "No complaints received for these departments." -#~ msgstr "لم يتم العثور على شكاوى لهذا المصدر." - #, fuzzy #~ msgid "Generated by PX360" #~ msgstr "تم الإنشاء" -#~ msgid "Open PX Actions" -#~ msgstr "إجراءات PX المفتوحة" - #~ msgid "Negative Social Mentions" #~ msgstr "الذكر السلبي في وسائل التواصل الاجتماعي" -#~ msgid "Low Call Center Ratings" -#~ msgstr "تقييمات منخفضة لمركز الاتصال" - #~ msgid "Password Reset - PX360" #~ msgstr "إعادة تعيين كلمة المرور - PX360" @@ -26179,14 +34453,11 @@ msgstr "هل أنت متأكد من رغبتك في حذف نموذج الاست #~ msgid "Go to Login" #~ msgstr "الانتقال إلى تسجيل الدخول" -#~ msgid "Select CSV File" -#~ msgstr "اختر ملف CSV" - #~ msgid "" #~ "Upload a CSV file with the required columns. Maximum 500 users per upload." #~ msgstr "" -#~ "قم برفع ملف CSV يحتوي على الأعمدة المطلوبة. الحد الأقصى 500 مستخدم لكل عملية" -#~ " رفع." +#~ "قم برفع ملف CSV يحتوي على الأعمدة المطلوبة. الحد الأقصى 500 مستخدم لكل " +#~ "عملية رفع." #~ msgid "User's email address (required)" #~ msgstr "عنوان البريد الإلكتروني للمستخدم (مطلوب)" @@ -26231,7 +34502,8 @@ msgstr "هل أنت متأكد من رغبتك في حذف نموذج الاست #~ msgstr "مرحبًا بك!" #~ msgid "You can now log in to PX360 with your new username and password." -#~ msgstr "يمكنك الآن تسجيل الدخول إلى PX360 باستخدام اسم المستخدم وكلمة المرور" +#~ msgstr "" +#~ "يمكنك الآن تسجيل الدخول إلى PX360 باستخدام اسم المستخدم وكلمة المرور" #~ msgid "Learning Complete" #~ msgstr "اكتمل التعلم" @@ -26251,12 +34523,6 @@ msgstr "هل أنت متأكد من رغبتك في حذف نموذج الاست #~ msgid "• Start improving patient experience!" #~ msgstr "• ابدأ بتحسين تجربة المرضى!" -#~ msgid "A confirmation email has been sent to your registered email address." -#~ msgstr "تم إرسال رسالة تأكيد إلى بريدك الإلكتروني المسجل" - -#~ msgid "Search content..." -#~ msgstr "بحث في المحتوى..." - #~ msgid "No content found" #~ msgstr "لا يوجد محتوى" @@ -26278,9 +34544,6 @@ msgstr "هل أنت متأكد من رغبتك في حذف نموذج الاست #~ msgid "Completion by Hospital" #~ msgstr "نسبة الإكمال حسب المستشفى" -#~ msgid "Back to Content" -#~ msgstr "العودة إلى المحتوى" - #~ msgid "Arabic:" #~ msgstr "العربية:" @@ -26310,8 +34573,8 @@ msgstr "هل أنت متأكد من رغبتك في حذف نموذج الاست #~ msgstr "يقوم المستخدمون بتقديم توقيع رقمي وإنشاء حسابهم." #~ msgid "" -#~ "You can see exactly what users with different roles will experience during " -#~ "onboarding." +#~ "You can see exactly what users with different roles will experience " +#~ "during onboarding." #~ msgstr "يمكنك رؤية ما سيختبره المستخدمون بمختلف الأدوار بدقة أثناء التهيئة." #~ msgid "Back to Provisional Users" @@ -26341,15 +34604,12 @@ msgstr "هل أنت متأكد من رغبتك في حذف نموذج الاست #~ msgid "Create & Send Invitation" #~ msgstr "إنشاء وإرسال الدعوة" -#~ msgid "Invitation sent successfully!" -#~ msgstr "تم إرسال الدعوة بنجاح!" - #~ msgid "Failed to send invitation." #~ msgstr "فشل إرسال الدعوة." #~ msgid "" -#~ "Congratulations! You have completed the onboarding process. Now create your " -#~ "account credentials to get started." +#~ "Congratulations! You have completed the onboarding process. Now create " +#~ "your account credentials to get started." #~ msgstr "تهانينا! لقد أكملت عملية الإعداد. أنشئ بيانات حسابك للبدء." #~ msgid "Username can only contain letters, numbers, underscores, and hyphens" @@ -26389,12 +34649,13 @@ msgstr "هل أنت متأكد من رغبتك في حذف نموذج الاست #~ msgid "" #~ "By providing your digital signature below, you acknowledge that you have " -#~ "read, understood, and agreed to all the items listed above. Your signature " -#~ "will be recorded with your IP address and timestamp for compliance purposes." +#~ "read, understood, and agreed to all the items listed above. Your " +#~ "signature will be recorded with your IP address and timestamp for " +#~ "compliance purposes." #~ msgstr "" -#~ "من خلال تقديم توقيعك الرقمي أدناه، فإنك تقر بأنك قرأت وفهمت ووافقت على جميع " -#~ "العناصر المذكورة أعلاه. سيتم تسجيل توقيعك مع عنوان IP والطابع الزمني لأغراض " -#~ "الامتثال." +#~ "من خلال تقديم توقيعك الرقمي أدناه، فإنك تقر بأنك قرأت وفهمت ووافقت على " +#~ "جميع العناصر المذكورة أعلاه. سيتم تسجيل توقيعك مع عنوان IP والطابع الزمني " +#~ "لأغراض الامتثال." #~ msgid "Sign here using your mouse or finger" #~ msgstr "وقّع هنا باستخدام الفأرة أو إصبعك" @@ -26459,9 +34720,6 @@ msgstr "هل أنت متأكد من رغبتك في حذف نموذج الاست #~ msgid "My Actions" #~ msgstr "إجراءاتي" -#~ msgid "Export" -#~ msgstr "تصدير" - #~ msgid "Export to Excel" #~ msgstr "تصدير إلى إكسل" @@ -26471,18 +34729,9 @@ msgstr "هل أنت متأكد من رغبتك في حذف نموذج الاست #~ msgid "Overall Compliance Rate" #~ msgstr "معدل الامتثال العام" -#~ msgid "Resolution Metrics" -#~ msgstr "مقاييس الحلول" - -#~ msgid "Ref #" -#~ msgstr "رقم المرجع" - #~ msgid "External (Patient)" #~ msgstr "خارجي (المريض)" -#~ msgid "remaining" -#~ msgstr "متبقية" - #~ msgid "PDF View" #~ msgstr "عرض PDF" @@ -26510,29 +34759,21 @@ msgstr "هل أنت متأكد من رغبتك في حذف نموذج الاست #~ msgid "Explanation from Manager (Escalated)" #~ msgstr "توضيح من المدير (تم التصعيد)" -#~ msgid "Explanation from Staff" -#~ msgstr "توضيح من الموظف" - #~ msgid "Staff Member:" #~ msgstr "الموظف:" -#~ msgid "Request Message:" -#~ msgstr "رسالة الطلب:" - #~ msgid "Token:" #~ msgstr "الرمز:" #~ msgid "" -#~ "Send explanation link to the assigned staff member. Manager will be notified" -#~ " for awareness." -#~ msgstr "إرسال رابط طلب التوضيح إلى الموظف المعيّن. سيتم إشعار المدير للاطلاع." +#~ "Send explanation link to the assigned staff member. Manager will be " +#~ "notified for awareness." +#~ msgstr "" +#~ "إرسال رابط طلب التوضيح إلى الموظف المعيّن. سيتم إشعار المدير للاطلاع." #~ msgid "Explanation link will be sent to:" #~ msgstr "سيتم إرسال رابط التوضيح إلى:" -#~ msgid "Manager - Notification Only" -#~ msgstr "المدير - إشعار فقط" - #~ msgid "Will receive link only if staff doesn't respond within SLA" #~ msgstr "" #~ "سيستلم الرابط فقط إذا لم يستجب الموظف خلال مدة اتفاقية مستوى الخدمة (SLA)" @@ -26548,9 +34789,6 @@ msgstr "هل أنت متأكد من رغبتك في حذف نموذج الاست #~ msgid "Needs Review" #~ msgstr "يحتاج إلى مراجعة" -#~ msgid "Extracted from Complaint" -#~ msgstr "مستخرج من نص الشكوى" - #~ msgid "confidence" #~ msgstr "مستوى الثقة" @@ -26569,16 +34807,14 @@ msgstr "هل أنت متأكد من رغبتك في حذف نموذج الاست #~ msgid "Resolution Category" #~ msgstr "فئة الحل" -#~ msgid "Re-open Complaint" -#~ msgstr "إعادة فتح الشكوى" - #~ msgid "Complaint Not Resolved" #~ msgstr "الشكوى غير محلولة" #~ msgid "" -#~ "This complaint has not been resolved yet. Provide resolution details below " -#~ "to close this complaint." -#~ msgstr "لم يتم حل هذه الشكوى بعد. يرجى إدخال تفاصيل الحل أدناه لإغلاق الشكوى." +#~ "This complaint has not been resolved yet. Provide resolution details " +#~ "below to close this complaint." +#~ msgstr "" +#~ "لم يتم حل هذه الشكوى بعد. يرجى إدخال تفاصيل الحل أدناه لإغلاق الشكوى." #~ msgid "Refund/Compensation" #~ msgstr "استرداد / تعويض" @@ -26589,17 +34825,12 @@ msgstr "هل أنت متأكد من رغبتك في حذف نموذج الاست #~ msgid "Apology Only" #~ msgstr "اعتذار فقط" -#~ msgid "Information Provided" -#~ msgstr "تم تقديم معلومات" - -#~ msgid "Complaint Rejected" -#~ msgstr "تم رفض الشكوى" - #~ msgid "" #~ "Provide clear details about the resolution taken. This will be visible to " #~ "the patient." #~ msgstr "" -#~ "قدّم تفاصيل واضحة حول الإجراء المتخذ للحل. ستكون هذه المعلومات مرئية للمريض." +#~ "قدّم تفاصيل واضحة حول الإجراء المتخذ للحل. ستكون هذه المعلومات مرئية " +#~ "للمريض." #~ msgid "The patient will receive an email with the resolution details." #~ msgstr "سيستلم المريض بريدًا إلكترونيًا يتضمن تفاصيل الحل." @@ -26627,8 +34858,8 @@ msgstr "هل أنت متأكد من رغبتك في حذف نموذج الاست #~ "details, including AI analysis, staff assignment, and resolution " #~ "information." #~ msgstr "" -#~ "سيتم إنشاء ملف PDF بتنسيق احترافي يتضمن جميع تفاصيل الشكوى، بما في ذلك تحليل" -#~ " الذكاء الاصطناعي، تعيين الموظف، ومعلومات المعالجة." +#~ "سيتم إنشاء ملف PDF بتنسيق احترافي يتضمن جميع تفاصيل الشكوى، بما في ذلك " +#~ "تحليل الذكاء الاصطناعي، تعيين الموظف، ومعلومات المعالجة." #~ msgid "PDF Contents" #~ msgstr "محتويات ملف PDF" @@ -26646,8 +34877,8 @@ msgstr "هل أنت متأكد من رغبتك في حذف نموذج الاست #~ "PDF generation requires WeasyPrint to be installed. If you see an error " #~ "message, please contact your system administrator." #~ msgstr "" -#~ "يتطلب إنشاء ملف PDF تثبيت WeasyPrint. في حال ظهور رسالة خطأ، يرجى التواصل مع" -#~ " مدير النظام." +#~ "يتطلب إنشاء ملف PDF تثبيت WeasyPrint. في حال ظهور رسالة خطأ، يرجى التواصل " +#~ "مع مدير النظام." #~ msgid "Staff member that complaint is about" #~ msgstr "الموظف المعني بالشكوى" @@ -26658,9 +34889,6 @@ msgstr "هل أنت متأكد من رغبتك في حذف نموذج الاست #~ msgid "Convert to Appreciation" #~ msgstr "تحويل إلى إشادة" -#~ msgid "Close complaint after conversion" -#~ msgstr "إغلاق الشكوى بعد التحويل" - #~ msgid "Converted to Appreciation" #~ msgstr "تم التحويل إلى إشادة" @@ -26690,11 +34918,11 @@ msgstr "هل أنت متأكد من رغبتك في حذف نموذج الاست #~ msgstr "في حال تركه دون تعيين، يمكنك تعيين الإجراء لاحقًا." #~ msgid "" -#~ "Update the 4-level SHCT taxonomy classification for this complaint. Select " -#~ "from the dropdown menus below." +#~ "Update the 4-level SHCT taxonomy classification for this complaint. " +#~ "Select from the dropdown menus below." #~ msgstr "" -#~ "قم بتحديث تصنيف الشكوى وفق تصنيف SHCT ذي المستويات الأربعة. اختر من القوائم " -#~ "المنسدلة أدناه." +#~ "قم بتحديث تصنيف الشكوى وفق تصنيف SHCT ذي المستويات الأربعة. اختر من " +#~ "القوائم المنسدلة أدناه." #~ msgid "Top-level classification (Clinical, Management, Relationships)" #~ msgstr "التصنيف الأعلى (سريري، إداري، علاقات)" @@ -26708,21 +34936,12 @@ msgstr "هل أنت متأكد من رغبتك في حذف نموذج الاست #~ msgid "Specific classification within the subcategory" #~ msgstr "تصنيف محدد ضمن الفئة الفرعية" -#~ msgid "Explain why you are updating the classification..." -#~ msgstr "اشرح سبب تحديث التصنيف..." - -#~ msgid "Loading taxonomy options..." -#~ msgstr "جاري تحميل خيارات التصنيف..." - #~ msgid "Save Classification" #~ msgstr "حفظ التصنيف" #~ msgid "Assign Admin" #~ msgstr "تعيين مشرف" -#~ msgid "Search Admins" -#~ msgstr "البحث عن المشرفين" - #~ msgid "Shows PX Admins and Hospital Admins from this hospital" #~ msgstr "يعرض مشرفي PX ومشرفي المستشفى من هذا المستشفى" @@ -26733,7 +34952,8 @@ msgstr "هل أنت متأكد من رغبتك في حذف نموذج الاست #~ msgstr "يمكنك تعديل هذا قبل الإرسال" #~ msgid "This is AI-generated summary. You can edit it before sending." -#~ msgstr "هذا ملخص تم إنشاؤه بواسطة الذكاء الاصطناعي. يمكنك تعديله قبل الإرسال." +#~ msgstr "" +#~ "هذا ملخص تم إنشاؤه بواسطة الذكاء الاصطناعي. يمكنك تعديله قبل الإرسال." #~ msgid "Department Head of" #~ msgstr "رئيس قسم" @@ -26742,12 +34962,8 @@ msgstr "هل أنت متأكد من رغبتك في حذف نموذج الاست #~ msgstr "لا يوجد مستلم متاح" #~ msgid "" -#~ "The assigned staff has no user account and no department manager is set." -#~ msgstr "الموظف المعيّن لا يملك حساب مستخدم ولم يتم تعيين مدير للقسم." - -#~ msgid "" -#~ "Create an Appreciation record from this positive feedback. The appreciation " -#~ "will be linked to this complaint." +#~ "Create an Appreciation record from this positive feedback. The " +#~ "appreciation will be linked to this complaint." #~ msgstr "" #~ "أنشئ سجل إشادة من هذه الملاحظات الإيجابية. سيتم ربط الإشادة بهذه الشكوى." @@ -26772,30 +34988,18 @@ msgstr "هل أنت متأكد من رغبتك في حذف نموذج الاست #~ msgid "Patient (show patient as sender)" #~ msgstr "المريض (إظهار المريض كمرسل)" -#~ msgid "Convert" -#~ msgstr "تحويل" - #~ msgid "Are you sure you want to request an explanation?" #~ msgstr "هل أنت متأكد من رغبتك في طلب إيضاح؟" -#~ msgid "Error:" -#~ msgstr "خطأ:" - #~ msgid "Resend explanation request email?" #~ msgstr "هل ترغب في إعادة إرسال بريد طلب الإيضاح؟" -#~ msgid "Email resent successfully!" -#~ msgstr "تمت إعادة إرسال البريد الإلكتروني بنجاح!" - #~ msgid "" -#~ "Are you sure you want to activate this complaint? This will assign it to you" -#~ " and set the status to In Progress." +#~ "Are you sure you want to activate this complaint? This will assign it to " +#~ "you and set the status to In Progress." #~ msgstr "" -#~ "هل أنت متأكد من رغبتك في تفعيل هذه الشكوى؟ سيتم تعيينها لك وتغيير حالتها إلى" -#~ " قيد المعالجة." - -#~ msgid "Complaint activated successfully!" -#~ msgstr "تم تفعيل الشكوى بنجاح!" +#~ "هل أنت متأكد من رغبتك في تفعيل هذه الشكوى؟ سيتم تعيينها لك وتغيير حالتها " +#~ "إلى قيد المعالجة." #~ msgid "Failed to activate complaint. Please try again." #~ msgstr "فشل في تفعيل الشكوى. يرجى المحاولة مرة أخرى." @@ -26825,15 +35029,9 @@ msgstr "هل أنت متأكد من رغبتك في حذف نموذج الاست #~ msgid "Incident From" #~ msgstr "تاريخ الحادثة من" -#~ msgid "Incident To" -#~ msgstr "تاريخ الحادثة إلى" - #~ msgid "SLA Status" #~ msgstr "حالة اتفاقية مستوى الخدمة (SLA)" -#~ msgid "Taxonomy" -#~ msgstr "التصنيف" - #~ msgid "Unclassified" #~ msgstr "غير مصنفة" @@ -26849,9 +35047,6 @@ msgstr "هل أنت متأكد من رغبتك في حذف نموذج الاست #~ msgid "Fill in the inquiry details. Fields marked with * are required." #~ msgstr "يرجى تعبئة تفاصيل الاستفسار. الحقول المعلّمة بعلامة * إلزامية." -#~ msgid "Select department" -#~ msgstr "اختر القسم" - #~ msgid "Select your relationship to the patient." #~ msgstr "اختر صلتك بالمريض." @@ -26863,10 +35058,8 @@ msgstr "هل أنت متأكد من رغبتك في حذف نموذج الاست #~ msgid "" #~ "Select the general location (e.g., Outpatient, Inpatient, Emergency, etc.)" -#~ msgstr "اختر الموقع العام (مثل: العيادات الخارجية، التنويم، الطوارئ، وغيرها)." - -#~ msgid "Sub-Section" -#~ msgstr "القسم الفرعي" +#~ msgstr "" +#~ "اختر الموقع العام (مثل: العيادات الخارجية، التنويم، الطوارئ، وغيرها)." #~ msgid "Select the most specific area related to your complaint" #~ msgstr "اختر المنطقة الأكثر تحديدًا المتعلقة بشكواك." @@ -26879,14 +35072,15 @@ msgstr "هل أنت متأكد من رغبتك في حذف نموذج الاست #~ "Please describe your complaint in detail. Include dates, names of staff " #~ "involved, and any other relevant information." #~ msgstr "" -#~ "يرجى وصف شكواك بالتفصيل. اذكر التواريخ وأسماء الموظفين المعنيين وأي معلومات " -#~ "أخرى ذات صلة." +#~ "يرجى وصف شكواك بالتفصيل. اذكر التواريخ وأسماء الموظفين المعنيين وأي " +#~ "معلومات أخرى ذات صلة." #~ msgid "Describe what you expect as a resolution to your complaint." #~ msgstr "يرجى توضيح ما تتوقعه كحل لمعالجة شكواك." #~ msgid "" -#~ "We typically respond to complaints within 24-48 hours depending on severity." +#~ "We typically respond to complaints within 24-48 hours depending on " +#~ "severity." #~ msgstr "نستجيب عادةً خلال 24–48 ساعة حسب درجة الخطورة." #~ msgid "Please save this reference number for your records." @@ -26907,9 +35101,6 @@ msgstr "هل أنت متأكد من رغبتك في حذف نموذج الاست #~ msgid "Your reference number was provided when you submitted your complaint" #~ msgstr "تم تزويدك برقم المرجع عند تقديم الشكوى" -#~ msgid "Response Overdue" -#~ msgstr "تأخر الرد" - #~ msgid "Expected Response Time" #~ msgstr "الوقت المتوقع للرد" @@ -26977,24 +35168,15 @@ msgstr "هل أنت متأكد من رغبتك في حذف نموذج الاست #~ msgid "Failed to load observation form. Please try again." #~ msgstr "فشل تحميل نموذج الملاحظات. يرجى المحاولة مرة أخرى." -#~ msgid "Brief title of your observation" -#~ msgstr "عنوان مختصر للملاحظة" - #~ msgid "No locations available" #~ msgstr "لا توجد مواقع متاحة" -#~ msgid "Loading subsections..." -#~ msgstr "جارٍ تحميل الأقسام الفرعية..." - #~ msgid "" -#~ "As a PX Admin, you can view and manage data for any hospital. Please select " -#~ "the hospital you want to work with:" +#~ "As a PX Admin, you can view and manage data for any hospital. Please " +#~ "select the hospital you want to work with:" #~ msgstr "" -#~ "بصفتك مشرف PX، يمكنك عرض وإدارة بيانات أي مستشفى. يرجى اختيار المستشفى التي " -#~ "تريد العمل معها:" - -#~ msgid "Selected" -#~ msgstr "تم الاختيار" +#~ "بصفتك مشرف PX، يمكنك عرض وإدارة بيانات أي مستشفى. يرجى اختيار المستشفى " +#~ "التي تريد العمل معها:" #~ msgid "Admin Evaluation Dashboard" #~ msgstr "لوحة تقييم الإدارة" @@ -27071,15 +35253,12 @@ msgstr "هل أنت متأكد من رغبتك في حذف نموذج الاست #~ msgid "Reset Password & Resend" #~ msgstr "إعادة تعيين كلمة المرور وإعادة الإرسال" -#~ msgid "No user account" -#~ msgstr "لا يوجد حساب مستخدم" - #~ msgid "Staff Status" #~ msgstr "حالة الموظف" #~ msgid "" -#~ "A username will be generated automatically and credentials will be emailed " -#~ "to" +#~ "A username will be generated automatically and credentials will be " +#~ "emailed to" #~ msgstr "" #~ "سيتم إنشاء اسم مستخدم تلقائيًا وإرسال بيانات الدخول عبر البريد الإلكتروني " #~ "إلى" @@ -27126,8 +35305,8 @@ msgstr "هل أنت متأكد من رغبتك في حذف نموذج الاست #~ msgstr "توسيع/طي" #~ msgid "" -#~ "Type in the search box to find a staff member. The chart will automatically " -#~ "navigate to them" +#~ "Type in the search box to find a staff member. The chart will " +#~ "automatically navigate to them" #~ msgstr "" #~ "اكتب في مربع البحث للعثور على موظف، وسيتم الانتقال إليه تلقائيًا في المخطط" @@ -27184,15 +35363,9 @@ msgstr "هل أنت متأكد من رغبتك في حذف نموذج الاست #~ msgid "You're managing feedback from this source." #~ msgstr "أنت تدير الملاحظات الواردة من هذا المصدر." -#~ msgid "Edit Source User" -#~ msgstr "تعديل مستخدم المصدر" - #~ msgid "Source User Details" #~ msgstr "تفاصيل مستخدم المصدر" -#~ msgid "No inquiries found for your source." -#~ msgstr "لم يتم العثور على استفسارات لهذا المصدر." - #~ msgid "Update document information or upload a new version" #~ msgstr "تحديث معلومات المستند أو رفع إصدار جديد" @@ -27236,9 +35409,6 @@ msgstr "هل أنت متأكد من رغبتك في حذف نموذج الاست #~ msgid "Enter folder name in Arabic (optional)" #~ msgstr "أدخل اسم المجلد بالعربية (اختياري)" -#~ msgid "Optional description of this folder" -#~ msgstr "وصف اختياري للمجلد" - #~ msgid "Optional Arabic description" #~ msgstr "وصف عربي اختياري" @@ -27290,24 +35460,15 @@ msgstr "هل أنت متأكد من رغبتك في حذف نموذج الاست #~ msgid "Survey Template (optional)" #~ msgstr "قالب الاستبيان (اختياري)" -#~ msgid "Start Date (optional)" -#~ msgstr "تاريخ البدء (اختياري)" - #~ msgid "End Date (optional)" #~ msgstr "تاريخ الانتهاء (اختياري)" -#~ msgid "AI Analyzed" -#~ msgstr "تم التحليل بالذكاء الاصطناعي" - #~ msgid "View Full Survey" #~ msgstr "عرض الاستبيان الكامل" #~ msgid "Your rating" #~ msgstr "تقييمك" -#~ msgid "Your response" -#~ msgstr "إجابتك" - #~ msgid "Contact Notes *" #~ msgstr "ملاحظات التواصل *" @@ -27317,42 +35478,28 @@ msgstr "هل أنت متأكد من رغبتك في حذف نموذج الاست #~ msgid "Log Patient Contact" #~ msgstr "تسجيل التواصل مع المريض" -#~ msgid "By" -#~ msgstr "بواسطة" - #~ msgid "Issue Discussed" #~ msgstr "تمت مناقشة المشكلة" #~ msgid "" -#~ "Send a feedback form to patient to assess their satisfaction with how their " -#~ "concerns were addressed" +#~ "Send a feedback form to patient to assess their satisfaction with how " +#~ "their concerns were addressed" #~ msgstr "" -#~ "إرسال نموذج تغذية راجعة إلى المريض لتقييم مدى رضاه عن كيفية معالجة ملاحظاته" +#~ "إرسال نموذج تغذية راجعة إلى المريض لتقييم مدى رضاه عن كيفية معالجة " +#~ "ملاحظاته" #~ msgid "All surveys" #~ msgstr "جميع الاستبيانات" -#~ msgid "Opened" -#~ msgstr "تم الفتح" - #~ msgid "response rate" #~ msgstr "معدل الاستجابة" -#~ msgid "Viewed" -#~ msgstr "تمت المشاهدة" - #~ msgid "Opened but not started" #~ msgstr "تم الفتح ولم يتم البدء" #~ msgid "Left incomplete" #~ msgstr "تم تركه غير مكتمل" -#~ msgid "Avg Completion Time" -#~ msgstr "متوسط وقت الإكمال" - -#~ msgid "Engagement Funnel" -#~ msgstr "مسار التفاعل" - #~ msgid "Device Types" #~ msgstr "أنواع الأجهزة" diff --git a/mockups/complaint_detail/index.html b/mockups/complaint_detail/index.html new file mode 100644 index 0000000..3e302ef --- /dev/null +++ b/mockups/complaint_detail/index.html @@ -0,0 +1,95 @@ + + + + + +Complaint Detail — Redesign Options + + + + + + + + + + + diff --git a/mockups/complaint_detail/sample-a.html b/mockups/complaint_detail/sample-a.html new file mode 100644 index 0000000..34755ac --- /dev/null +++ b/mockups/complaint_detail/sample-a.html @@ -0,0 +1,251 @@ + + + + + +Option A — Linear Reader · CMP-2025-NOV-8842 + + + + + + + + + + + +
+
+
+ + + + + + CMP-2025-NOV-8842 +
+
+ + In Progress + + + + +
+
+
+ +
+ + +
+
+ MOH Tawasul + High severity +
+

ER Admission Delay & Poor Communication

+

Created 12 Nov 2025, 09:14 AM · Due 14 Nov 2025, 08:00 AM

+
+ + +
+
+

+ "The patient's relative complained about the delay in the ER admission process. The doctor was unavailable and nursing staff did not provide updates for over 45 minutes, causing distress to the family." +

+
+
+ + +
+
+
+

Location

+

Emergency Room

+

Ground Floor · Zone B

+
+
+

Assigned to

+
+ SM +

Dr. Sara Mansoor

+
+

Patient Experience

+
+
+

Patient

+

Ahmed Al-Rashid

+

MRN: H-29481

+
+
+

Taxonomy

+

Clinical Care

+

Emergency › Wait Time

+
+
+

Patient contact

+

Contacted

+

Nov 12, 02:15 PM

+
+
+

Departments

+

2 involved

+

Emergency · Nursing

+
+
+
+ + +
+

Activity

+
+
+ +

ER department submitted a response

+

Nov 13, 08:45 AM

+
+
+ +

Patient contacted by phone

+

Nov 12, 02:15 PM

+
+
+ +

Escalated to ER Department Head

+

Nov 12, 11:30 AM

+
+
+ +

Assigned to Dr. Sara Mansoor (PX)

+

Nov 12, 10:02 AM

+
+
+ +

Complaint received via MOH Tawasul

+

Nov 12, 09:14 AM

+
+
+
+ + +
+
+ + Departments & Staff + + +
+
+
+

Emergency Medicine PRIMARY

+

Response received · accepted

+
+ +
+
+
+

Nursing Services

+

Awaiting response

+
+ +
+
+
+
+ + AI Summary + + +
+ Communication breakdown during high-acuity ER triage. Recurrence risk: medium. Suggested actions: nursing handover protocol refresh & real-time patient-status board. +
+
+
+ + Resolution & PDF + + +
Resolution notes will appear here once the case is resolved. A formal PDF report can be generated for MOH submission.
+
+
+ +
+ + +
+
+ + + +
+
+ + + + + + + diff --git a/mockups/complaint_detail/sample-b.html b/mockups/complaint_detail/sample-b.html new file mode 100644 index 0000000..5484b8f --- /dev/null +++ b/mockups/complaint_detail/sample-b.html @@ -0,0 +1,265 @@ + + + + + +Option B — Workspace · CMP-2025-NOV-8842 + + + + + + + + + + + +
+
+
+ + + + CMP-2025-NOV-8842 + + In Progress + +
+ +
+
+ + +
+
+
+

ER Admission Delay & Poor Communication

+

Emergency Room · Ground Floor, Zone B · Created 12 Nov 2025

+
+
+ High + MOH Tawasul + +
+
+
+ + +
+ + +
+ + +
+

Complaint

+
+

"The patient's relative complained about the delay in the ER admission process. The doctor was unavailable and nursing staff did not provide updates for over 45 minutes, causing distress to the family."

+
+
+
+

Patient

+

Ahmed Al-Rashid

+

MRN: H-29481

+
+
+

Severity

+

High

+
+
+

Taxonomy

+

Emergency

+

Clinical › Wait Time

+
+
+

Due

+

14 Nov, 08:00

+
+
+
+ + +
+
+

Involved Departments

+ +
+
+
+
+
+
+

Emergency Medicine PRIMARY

+

Response received · accepted

+
+
+ +
+
+
+
+
+

Nursing Services

+

Awaiting response · 14h left

+
+
+ +
+
+
+ + +
+

Activity

+
    +
  1. + +

    ER department submitted a response

    +

    Nov 13, 08:45 AM

    +
  2. +
  3. + +

    Patient contacted by phone

    +

    Nov 12, 02:15 PM

    +
  4. +
  5. + +

    Escalated to ER Department Head

    +

    Nov 12, 11:30 AM

    +
  6. +
  7. + +

    Assigned to Dr. Sara Mansoor

    +

    Nov 12, 10:02 AM

    +
  8. +
+
+
+ + + +
+ + + + diff --git a/mockups/complaint_detail/sample-c.html b/mockups/complaint_detail/sample-c.html new file mode 100644 index 0000000..1f3f5f8 --- /dev/null +++ b/mockups/complaint_detail/sample-c.html @@ -0,0 +1,204 @@ + + + + + +Option C — Workflow Stepper · CMP-2025-NOV-8842 + + + + + + + + + + + +
+
+
+ + CMP-2025-NOV-8842 +
+
+ +
+ + +
+
+
+
+ +
+ + +
+
+ Stage 3 of 5 · Investigating + High +
+

ER Admission Delay & Poor Communication

+

Emergency Room · Ground Floor, Zone B · Created 12 Nov 2025

+
+ + +
+
+ +
+
+

Received

+

Nov 12

+
+
+ +
+
+

Assigned

+

Sara Mansoor

+
+
+ +
+
+

Investigating

+

In progress

+
+
+ +
+
+

Resolved

+

Pending

+
+
+ +
+
+

Closed

+
+
+
+ + +
+
+
What to do now
+

Gather remaining responses, then resolve

+

Emergency Medicine has responded and is accepted. Nursing Services hasn't responded yet. You can nudge them, or resolve now if their input isn't blocking.

+ +
+
+ +
+

Emergency Medicine

+

Responded · accepted

+
+
+
+ +
+

Nursing Services

+

No response · 14h left

+
+
+
+
+
+ +
+ + +
+
+
+ + +
+
+ + Case details + + +
+
+

"The patient's relative complained about the delay in the ER admission process. The doctor was unavailable and nursing staff did not provide updates for over 45 minutes, causing distress to the family."

+
+
+

Patient

Ahmed Al-Rashid

MRN: H-29481

+

Severity

High

+

Source

MOH Tawasul

+

Taxonomy

Emergency

Clinical › Wait Time

+

Owner

Dr. Sara Mansoor

+

Patient contact

Contacted

+

Created

12 Nov, 09:14

+

Due

14 Nov, 08:00

+
+
+
+
+ + +
+

Recent activity

+
+
+ +

ER department submitted a response

Nov 13, 08:45 AM

+
+
+ +

Patient contacted by phone

Nov 12, 02:15 PM

+
+
+ +

Escalated to ER Department Head

Nov 12, 11:30 AM

+
+
+
+
+ + + + diff --git a/mockups/complaint_detail/sample-d.html b/mockups/complaint_detail/sample-d.html new file mode 100644 index 0000000..15ee1f2 --- /dev/null +++ b/mockups/complaint_detail/sample-d.html @@ -0,0 +1,352 @@ + + + + + +Option D — Detail + Modals · CMP-2025-NOV-8842 + + + + + + + + + + + +
+
+
+ + CMP-2025-NOV-8842 +
+
+ In Progress + +
+
+
+ +
+ + +
+
+ High severity + MOH Tawasul +
+

ER Admission Delay & Poor Communication

+

Created 12 Nov 2025 · Due 14 Nov 2025, 08:00 AM

+
+ + +
+
+

"The patient's relative complained about the delay in the ER admission process. The doctor was unavailable and nursing staff did not provide updates for over 45 minutes, causing distress to the family."

+
+
+ + +
+
+
+

Location

+

Emergency Room

+

Ground Floor · Zone B

+
+
+

Assigned to

+
+ SM +

Dr. Sara Mansoor

+
+
+
+

Patient

+

Ahmed Al-Rashid

+

MRN: H-29481

+
+
+

Taxonomy

+

Emergency

+

Clinical › Wait Time

+
+
+
+ + +
+

Explore

+ + + + + + + + +
+ + +
+ + + +
+ +
+ + +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pyproject.toml b/pyproject.toml index 5e3a29b..06dbdcc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -34,6 +34,11 @@ dependencies = [ "google-auth-oauthlib>=1.2.3", "user-agents>=2.2.0", "polib>=1.2.0", + "sentry-sdk>=2.0.0", + "cryptography>=42.0.0", + "django-appconf>=1.0.0", + "django-cryptography>=1.1", + "django-ai-po>=0.1.2", ] [project.optional-dependencies] diff --git a/requirements.txt b/requirements.txt index 1d8dd03..231442b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -18,11 +18,14 @@ click==8.3.1 click-didyoumean==0.3.1 click-plugins==1.1.1.2 click-repl==0.3.0 +cryptography==46.0.7 cron-descriptor==1.4.5 cssselect2==0.8.0 distro==1.9.0 django==6.0.1 +django-appconf==1.2.0 django-celery-beat==2.9.0 +django-cryptography==1.1 django-environ==0.12.0 django-extensions==4.1 django-filter==25.1 @@ -133,9 +136,12 @@ vine==5.1.0 watchdog==6.0.0 wcwidth==0.2.14 weasyprint==67.0 +matplotlib==3.11.0 webencodings==0.5.1 whitenoise==6.11.0 xlrd==2.0.2 yarl==1.22.0 zipp==3.23.0 zopfli==0.4.0 +sentry-sdk==2.20.0 +django-ai-po diff --git a/scripts/db_sync.sh b/scripts/db_sync.sh new file mode 100755 index 0000000..3abd92e --- /dev/null +++ b/scripts/db_sync.sh @@ -0,0 +1,315 @@ +#!/bin/bash +# ============================================================ +# PX360 Database Sync Script +# ============================================================ +# Copies the local Docker PostgreSQL database + media files +# to a production DB server. +# +# Usage: +# ./scripts/db_sync.sh # Dry-run: dump locally only +# ./scripts/db_sync.sh --deploy user@host # Full: dump → scp → restore +# +# Prerequisites: +# - Docker containers running locally (px360_db) +# - SSH access to the DB server +# - PostgreSQL client tools on the DB server (pg_restore, createdb) +# - .env.production file with DB_HOST, DB_USER, DB_NAME +# ============================================================ + +set -euo pipefail + +# Colors +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' # No Color + +# Paths +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +PROJECT_DIR="$(dirname "$SCRIPT_DIR")" +BACKUP_DIR="$PROJECT_DIR/backups" + +# Default config (overridden by .env.production if available) +LOCAL_DB_CONTAINER="px360_db" +LOCAL_DB_USER="px360" +LOCAL_DB_NAME="px360" + +PROD_DB_HOST="" +PROD_DB_USER="px360" +PROD_DB_NAME="px360" +PROD_SSH="" + +# Tables to exclude from dump (dev-only data) +EXCLUDE_TABLES=( + "django_session" + "simulator_hisrequestlog" + "simulator_emaillog" + "simulator_smslog" +) + +# Flags +DEPLOY=false + +# ============================================================ +# Parse arguments +# ============================================================ +while [[ $# -gt 0 ]]; do + case $1 in + --deploy) + DEPLOY=true + PROD_SSH="$2" + shift 2 + ;; + --help|-h) + echo "Usage: ./scripts/db_sync.sh [--deploy user@db-server-ip]" + echo "" + echo " Without --deploy: Creates a local dump only (dry-run)" + echo " With --deploy: Dumps locally, copies to prod DB server, restores" + echo "" + echo "Example:" + echo " ./scripts/db_sync.sh # local dump" + echo " ./scripts/db_sync.sh --deploy root@10.10.1.100 # full deploy" + exit 0 + ;; + *) + echo -e "${RED}Unknown option: $1${NC}" + exit 1 + ;; + esac +done + +# ============================================================ +# Load production config +# ============================================================ +if [ "$DEPLOY" = true ]; then + if [ -z "$PROD_SSH" ]; then + echo -e "${RED}Error: --deploy requires SSH target (user@host)${NC}" + exit 1 + fi + + ENV_FILE="$PROJECT_DIR/.env.production" + if [ -f "$ENV_FILE" ]; then + PROD_DB_HOST=$(grep -E "^DB_HOST=" "$ENV_FILE" | cut -d= -f2 || echo "") + PROD_DB_USER=$(grep -E "^DB_USER=" "$ENV_FILE" | cut -d= -f2 || echo "px360") + PROD_DB_NAME=$(grep -E "^DB_NAME=" "$ENV_FILE" | cut -d= -f2 || echo "px360") + if [ -z "$PROD_DB_HOST" ]; then + PROD_DB_HOST=$(grep -E "^DATABASE_URL=" "$ENV_FILE" | sed -E 's/.*@([^:]+):.*/\1/' || echo "") + fi + fi + + if [ -z "$PROD_DB_HOST" ]; then + echo -e "${YELLOW}Warning: DB_HOST not found in .env.production${NC}" + echo -e "Enter DB server IP/hostname: " + read -r PROD_DB_HOST + fi + + echo -e "${BLUE}Production target:${NC}" + echo -e " SSH: $PROD_SSH" + echo -e " DB Host: $PROD_DB_HOST" + echo -e " DB User: $PROD_DB_USER" + echo -e " DB Name: $PROD_DB_NAME" + echo "" + echo -e "${YELLOW}This will OVERWRITE production database data. Continue? (y/N)${NC}" + read -r CONFIRM + if [[ ! "$CONFIRM" =~ ^[Yy]$ ]]; then + echo "Aborted." + exit 0 + fi +fi + +# ============================================================ +# Setup +# ============================================================ +mkdir -p "$BACKUP_DIR" + +TIMESTAMP=$(date +%Y%m%d_%H%M%S) +DB_DUMP="$BACKUP_DIR/px360_${TIMESTAMP}.dump" +MEDIA_DUMP="$BACKUP_DIR/media_${TIMESTAMP}.tar.gz" + +echo "" +echo -e "${BLUE}========================================${NC}" +echo -e "${BLUE} PX360 Database Sync${NC}" +echo -e "${BLUE} $(date '+%Y-%m-%d %H:%M:%S')${NC}" +echo -e "${BLUE}========================================${NC}" +echo "" + +# ============================================================ +# Step 1: Dump local database +# ============================================================ +echo -e "${BLUE}[1/5] Dumping local database...${NC}" + +# Build exclude flags +EXCLUDE_FLAGS="" +for table in "${EXCLUDE_TABLES[@]}"; do + EXCLUDE_FLAGS="$EXCLUDE_FLAGS --exclude-table-data=$table" +done + +# Check if Docker DB is running +if ! docker ps --format '{{.Names}}' | grep -q "^${LOCAL_DB_CONTAINER}$"; then + echo -e "${YELLOW}Docker DB container not found. Trying local PostgreSQL...${NC}" + # Fall back to local pg_dump (for SQLite → PG migration or local PG) + if command -v pg_dump &> /dev/null; then + PGPASSWORD="${LOCAL_DB_USER}" pg_dump -U "$LOCAL_DB_USER" -d "$LOCAL_DB_NAME" \ + --no-owner --no-privileges -Fc $EXCLUDE_FLAGS \ + -f "$DB_DUMP" 2>/dev/null || { + echo -e "${RED}Failed to dump database. Neither Docker nor local PostgreSQL available.${NC}" + exit 1 + } + else + echo -e "${RED}No Docker DB container and no pg_dump found.${NC}" + exit 1 + fi +else + docker exec "$LOCAL_DB_CONTAINER" pg_dump -U "$LOCAL_DB_USER" -d "$LOCAL_DB_NAME" \ + --no-owner --no-privileges -Fc $EXCLUDE_FLAGS > "$DB_DUMP" +fi + +DB_SIZE=$(du -h "$DB_DUMP" | cut -f1) +echo -e "${GREEN} Database dump: $DB_DUMP ($DB_SIZE)${NC}" + +# Show table counts +echo -e "${BLUE} Table counts:${NC}" +if docker ps --format '{{.Names}}' | grep -q "^${LOCAL_DB_CONTAINER}$"; then + docker exec "$LOCAL_DB_CONTAINER" psql -U "$LOCAL_DB_USER" -d "$LOCAL_DB_NAME" -t -c " + SELECT ' ' || relname || ': ' || n_live_tup + FROM pg_stat_user_tables + WHERE n_live_tup > 0 + ORDER BY n_live_tup DESC + LIMIT 10; + " 2>/dev/null || true +fi + +# ============================================================ +# Step 2: Dump media files +# ============================================================ +echo "" +echo -e "${BLUE}[2/5] Dumping media files...${NC}" + +if [ -d "$PROJECT_DIR/media" ] && [ "$(ls -A "$PROJECT_DIR/media" 2>/dev/null)" ]; then + tar -czf "$MEDIA_DUMP" -C "$PROJECT_DIR/media" . + MEDIA_SIZE=$(du -h "$MEDIA_DUMP" | cut -f1) + echo -e "${GREEN} Media dump: $MEDIA_DUMP ($MEDIA_SIZE)${NC}" +else + echo -e "${YELLOW} No media files found, skipping.${NC}" + MEDIA_DUMP="" +fi + +# ============================================================ +# Step 3: Cleanup old local backups (keep last 3) +# ============================================================ +echo "" +echo -e "${BLUE}[3/5] Cleaning old local backups (keeping last 3)...${NC}" + +ls -t "$BACKUP_DIR"/px360_*.dump 2>/dev/null | tail -n +4 | while read -r old_file; do + rm -f "$old_file" + echo -e " ${YELLOW}Removed: $(basename "$old_file")${NC}" +done +ls -t "$BACKUP_DIR"/media_*.tar.gz 2>/dev/null | tail -n +4 | while read -r old_file; do + rm -f "$old_file" + echo -e " ${YELLOW}Removed: $(basename "$old_file")${NC}" +done + +# ============================================================ +# Dry-run check +# ============================================================ +if [ "$DEPLOY" = false ]; then + echo "" + echo -e "${GREEN}========================================${NC}" + echo -e "${GREEN} Dry-run complete!${NC}" + echo -e "${GREEN} Dump saved locally.${NC}" + echo -e "${GREEN} Run with --deploy user@host to push to prod.${NC}" + echo -e "${GREEN}========================================${NC}" + echo "" + echo -e "Database: ${DB_DUMP} (${DB_SIZE})" + if [ -n "$MEDIA_DUMP" ]; then + echo -e "Media: ${MEDIA_DUMP} (${MEDIA_SIZE})" + fi + exit 0 +fi + +# ============================================================ +# Step 4: Copy to production DB server +# ============================================================ +echo "" +echo -e "${BLUE}[4/5] Copying to production server ($PROD_SSH)...${NC}" + +echo -e " Copying database dump..." +scp -q "$DB_DUMP" "${PROD_SSH}:/tmp/px360_restore.dump" +echo -e "${GREEN} Database dump uploaded.${NC}" + +if [ -n "$MEDIA_DUMP" ]; then + echo -e " Copying media files..." + scp -q "$MEDIA_DUMP" "${PROD_SSH}:/tmp/px360_media.tar.gz" + echo -e "${GREEN} Media files uploaded.${NC}" +fi + +# ============================================================ +# Step 5: Restore on production DB server +# ============================================================ +echo "" +echo -e "${BLUE}[5/5] Restoring on production database...${NC}" + +ssh "$PROD_SSH" bash -s << REMOTE_SCRIPT + set -e + DB_USER="${PROD_DB_USER}" + DB_NAME="${PROD_DB_NAME}" + DB_HOST="${PROD_DB_HOST}" + + echo " Creating database if not exists..." + createdb -U "\$DB_USER" "\$DB_NAME" 2>/dev/null || echo " Database already exists." + + echo " Restoring database (this may take a minute)..." + pg_restore -U "\$DB_USER" -d "\$DB_NAME" \ + --no-owner --no-privileges --clean --if-exists \ + --no-tablespaces \ + /tmp/px360_restore.dump 2>&1 | grep -v "does not exist" || true + + echo " Verifying restore..." + psql -U "\$DB_USER" -d "\$DB_NAME" -t -c " + SELECT ' Total tables: ' || count(*) FROM pg_stat_user_tables; + " 2>/dev/null || true + + psql -U "\$DB_USER" -d "\$DB_NAME" -t -c " + SELECT ' ' || relname || ': ' || n_live_tup + FROM pg_stat_user_tables + WHERE n_live_tup > 0 + ORDER BY n_live_tup DESC + LIMIT 10; + " 2>/dev/null || true + + echo " Cleaning up temp files..." + rm -f /tmp/px360_restore.dump /tmp/px360_media.tar.gz + + echo " Restore complete." +REMOTE_SCRIPT + +# ============================================================ +# Media restore on app server (if separate from DB server) +# ============================================================ +if [ -n "$MEDIA_DUMP" ]; then + echo "" + echo -e "${YELLOW}Note: Media files were uploaded to the DB server at /tmp/px360_media.tar.gz${NC}" + echo -e "${YELLOW}If your app server is separate, copy and extract there:${NC}" + echo -e " scp ${PROD_SSH}:/tmp/px360_media.tar.gz app-server:/tmp/" + echo -e " ssh app-server 'mkdir -p /path/to/media && tar -xzf /tmp/px360_media.tar.gz -C /path/to/media'" +fi + +# ============================================================ +# Summary +# ============================================================ +echo "" +echo -e "${GREEN}========================================${NC}" +echo -e "${GREEN} Sync complete!${NC}" +echo -e "${GREEN} $(date '+%Y-%m-%d %H:%M:%S')${NC}" +echo -e "${GREEN}========================================${NC}" +echo "" +echo -e "Local backup: ${DB_DUMP} (${DB_SIZE})" +if [ -n "$MEDIA_DUMP" ]; then + echo -e "Media backup: ${MEDIA_DUMP} (${MEDIA_SIZE})" +fi +echo "" +echo -e "${YELLOW}Next steps:${NC}" +echo -e " 1. Run migrations on app server: docker compose -f docker-compose.prod.yml exec web python manage.py migrate" +echo -e " 2. Clear sessions: docker compose -f docker-compose.prod.yml exec web python manage.py shell -c \"from django.contrib.sessions.models import Session; Session.objects.all().delete()\"" +echo -e " 3. Restart services: docker compose -f docker-compose.prod.yml restart" diff --git a/static/js/report-charts.js b/static/js/report-charts.js new file mode 100644 index 0000000..9fc0500 --- /dev/null +++ b/static/js/report-charts.js @@ -0,0 +1,39 @@ +(function () { + "use strict"; + + window.PX360 = window.PX360 || {}; + + // Series value formatter: shows the raw count on each slice. + var countFormatter = function (val, opts) { + return opts.w.globals.series[opts.seriesIndex]; + }; + + // Grand total formatter for the donut center. + var totalFormatter = function (w) { + return w.globals.seriesTotals.reduce(function (a, b) { return a + b; }, 0); + }; + + // Spread into donut chart configs: slice counts + center total. + PX360.donutValueLabels = function () { + return { + dataLabels: { enabled: true, formatter: countFormatter }, + plotOptions: { + pie: { + donut: { + labels: { + show: true, + total: { show: true, label: "Total", formatter: totalFormatter } + } + } + } + } + }; + }; + + // Spread into pie chart configs: slice counts only (no center). + PX360.pieValueLabels = function () { + return { + dataLabels: { enabled: true, formatter: countFormatter } + }; + }; +})(); diff --git a/static/vendor/datastar/datastar.js b/static/vendor/datastar/datastar.js new file mode 100644 index 0000000..75bd6c6 --- /dev/null +++ b/static/vendor/datastar/datastar.js @@ -0,0 +1,9 @@ +// Datastar v1.0.2 +var ht=/🖕JS_DS🚀/.source,Je=ht.slice(0,5),Ke=ht.slice(4),j="datastar-fetch",ge="datastar-prop-change",yt="datastar-ready",ze="datastar-scope-children",ee="datastar-signal-patch";var x=Object.hasOwn??Object.prototype.hasOwnProperty.call;var J=e=>e!==null&&typeof e=="object"&&(Object.getPrototypeOf(e)===Object.prototype||Object.getPrototypeOf(e)===null),vt=e=>{for(let t in e)if(x(e,t))return!1;return!0},te=(e,t)=>{for(let n in e){let r=e[n];J(r)||Array.isArray(r)?te(r,t):e[n]=t(r)}},xe=e=>{let t={};for(let[n,r]of e){let s=n.split("."),i=s.pop(),o=s.reduce((a,l)=>a[l]??={},t);o[i]=r}return t};var Le=[],Ze=[],He=0,Ne=0,Qe=0,Ye,B,Pe=0,L=()=>{He++},N=()=>{--He||(St(),K())},H=e=>{Ye=B,B=e},_=()=>{B=Ye,Ye=void 0},he=e=>an.bind(0,{previousValue:e,t:e,e:1}),Xe=Symbol("computed"),_e=e=>{let t=cn.bind(0,{e:17,getter:e});return t[Xe]=1,t},w=e=>{let t={d:e,e:2};B&&tt(t,B),H(t),L();try{t.d()}finally{N(),_()}return wt.bind(0,t)},St=()=>{for(;Ne"getter"in e?Tt(e):At(e,e.t),Tt=e=>{H(e),Mt(e);try{let t=e.t;return t!==(e.t=e.getter(t))}finally{_(),xt(e)}},At=(e,t)=>(e.e=1,e.previousValue!==(e.previousValue=t)),et=e=>{let t=e.e;if(!(t&64)){e.e=t|64;let n=e.r;n?et(n.o):Ze[Qe++]=e}},Rt=(e,t)=>{if(t&16||t&32&&Lt(e.s,e)){H(e),Mt(e),L();try{e.d()}finally{N(),_(),xt(e)}return}t&32&&(e.e=t&-33);let n=e.s;for(;n;){let r=n.c,s=r.e;s&64&&Rt(r,r.e=s&-65),n=n.i}},an=(e,...t)=>{if(t.length){if(e.t!==(e.t=t[0])){e.e=17;let r=e.r;return r&&(ln(r),He||St()),!0}return!1}let n=e.t;if(e.e&16&&At(e,n)){let r=e.r;r&&Fe(r)}return B&&tt(e,B),n},cn=e=>{let t=e.e;if(t&16||t&32&&Lt(e.s,e)){if(Tt(e)){let n=e.r;n&&Fe(n)}}else t&32&&(e.e=t&-33);return B&&tt(e,B),e.t},wt=e=>{let t=e.s;for(;t;)t=Ce(t,e);let n=e.r;n&&Ce(n),e.e=0},tt=(e,t)=>{let n=t.a;if(n&&n.c===e)return;let r=n?n.i:t.s;if(r&&r.c===e){r.p=Pe,t.a=r;return}let s=e.m;if(s&&s.p===Pe&&s.o===t)return;let i=t.a=e.m={p:Pe,c:e,o:t,l:n,i:r,u:s};r&&(r.l=i),n?n.i=i:t.s=i,s?s.n=i:e.r=i},Ce=(e,t=e.o)=>{let n=e.c,r=e.l,s=e.i,i=e.n,o=e.u;if(s?s.l=r:t.a=r,r?r.i=s:t.s=s,i?i.u=o:n.m=o,o)o.n=i;else if(!(n.r=i))if("getter"in n){let a=n.s;if(a){n.e=17;do a=Ce(a,n);while(a)}}else"previousValue"in n||wt(n);return s},ln=e=>{let t=e.n,n;e:for(;;){let r=e.o,s=r.e;if(s&60?s&12?s&4?!(s&48)&&un(e,r)?(r.e=s|40,s&=1):s=0:r.e=s&-9|32:s=0:r.e=s|32,s&2&&et(r),s&1){let i=r.r;if(i){let o=(e=i).n;o&&(n={t,f:n},t=o);continue}}if(e=t){t=e.n;continue}for(;n;)if(e=n.t,n=n.f,e){t=e.n;continue e}break}},Mt=e=>{Pe++,e.a=void 0,e.e=e.e&-57|4},xt=e=>{let t=e.a,n=t?t.i:e.s;for(;n;)n=Ce(n,e);e.e&=-5},Lt=(e,t)=>{let n,r=0,s=!1;e:for(;;){let i=e.c,o=i.e;if(t.e&16)s=!0;else if((o&17)===17){if(bt(i)){let a=i.r;a.n&&Fe(a),s=!0}}else if((o&33)===33){(e.n||e.u)&&(n={t:e,f:n}),e=i.s,t=i,++r;continue}if(!s){let a=e.i;if(a){e=a;continue}}for(;r--;){let a=t.r,l=a.n;if(l?(e=n.t,n=n.f):e=a,s){if(bt(t)){l&&Fe(a),t=e.o;continue}s=!1}else t.e&=-33;if(t=e.o,e.i){e=e.i;continue e}}return s}},Fe=e=>{do{let t=e.o,n=t.e;(n&48)===32&&(t.e=n|16,n&2&&et(t))}while(e=e.n)},un=(e,t)=>{let n=t.a;for(;n;){if(n===e)return!0;n=n.l}return!1},oe=e=>{let t=ne,n=e.split(".");for(let r of n){if(t==null||!x(t,r))return;t=t[r]}return t},Oe=(e,t="")=>{let n=Array.isArray(e);if(n||J(e)){let r=n?[]:{};for(let i in e)r[i]=he(Oe(e[i],`${t+i}.`));let s=he(0);return new Proxy(r,{get(i,o){if(!(o==="toJSON"&&!x(r,o)))return n&&o in Array.prototype?(s(),r[o]):typeof o=="symbol"?r[o]:((!x(r,o)||r[o]()==null)&&(r[o]=he(""),K(t+o,""),s(s()+1)),r[o]())},set(i,o,a){let l=t+o;if(n&&o==="length"){let c=r[o]-a;if(r[o]=a,c>0){let u={};for(let f=a;f{if(e!==void 0&&t!==void 0&&Le.push([e,t]),!He&&Le.length){let n=xe(Le);Le.length=0,document.dispatchEvent(new CustomEvent(ee,{detail:n}))}},k=(e,{ifMissing:t}={})=>{L();for(let n in e)e[n]==null?t||delete ne[n]:Nt(e[n],n,ne,"",t);N()},R=(e,t)=>k(xe(e),t),Nt=(e,t,n,r,s)=>{if(J(e)){x(n,t)&&(J(n[t])||Array.isArray(n[t]))||(n[t]={});for(let i in e)e[i]==null?s||delete n[t][i]:Nt(e[i],i,n[t],`${r+t}.`,s)}else s&&x(n,t)||(n[t]=e)},Et=e=>typeof e=="string"?RegExp(e.replace(/^\/|\/$/g,"")):e,V=({include:e=/.*/,exclude:t=/(?!)/}={},n=ne)=>{let r=Et(e),s=Et(t),i=[],o=[[n,""]];for(;o.length;){let[a,l]=o.pop();for(let c in a){let u=l+c;J(a[c])?o.push([a[c],`${u}.`]):r.test(u)&&!s.test(u)&&i.push([u,oe(u)])}}return xe(i)},ne=Oe({});var z=e=>e instanceof HTMLElement||e instanceof SVGElement||e instanceof MathMLElement;var ae=e=>e.replace(/([A-Z]+)([A-Z][a-z])/g,"$1-$2").replace(/([a-z0-9])([A-Z])/g,"$1-$2").replace(/([a-z])([0-9]+)/gi,"$1-$2").replace(/([0-9]+)([a-z])/gi,"$1-$2").replace(/[\s_]+/g,"-").toLowerCase(),Pt=e=>ae(e).replace(/-./g,t=>t[1].toUpperCase()),Ot=e=>ae(e).replace(/-/g,"_");var fn=/^(?:(?:async\s+)?function\b|(?:async\s*)?(?:\([^)]*\)|[A-Za-z_$][\w$]*)\s*=>)/,ce=(e,t={})=>{let{reviveFunctionStrings:n=!1}=t;try{return n?JSON.parse(e,(r,s)=>{if(typeof s!="string")return s;let i=s.trim();if(!fn.test(i))return s;try{let o=Function(`return (${i})`)();return typeof o=="function"?o:s}catch{return s}}):JSON.parse(e)}catch{return Function(`return (${e})`)()}},Ct={camel:e=>e.replace(/-[a-z]/g,t=>t[1].toUpperCase()),snake:e=>e.replace(/-/g,"_"),pascal:e=>e[0].toUpperCase()+Ct.camel(e.slice(1))},P=(e,t,n="camel")=>{for(let r of t.get("case")||[n])e=Ct[r]?.(e)||e;return e},W=e=>`data-${e}`,nt=e=>e;var dn="https://data-star.dev/errors",ye=(e,t,n={})=>{Object.assign(n,e);let r=new Error,s=Ot(t),i=new URLSearchParams({metadata:JSON.stringify(n)}).toString(),o=JSON.stringify(n,null,2);return r.message=`${t} +More info: ${dn}/${s}?${i} +Context: ${o}`,r},ve=new Map,rt=new Map,_t=new Map,kt=new Proxy({},{get:(e,t)=>ve.get(t)?.apply,has:(e,t)=>ve.has(t),ownKeys:()=>Reflect.ownKeys(ve),set:()=>!1,deleteProperty:()=>!1}),Ee=new Map,ke=[],st=new Set,be=new Set,Ft=!1,p=e=>{ke.push(e),ke.length===1&&setTimeout(()=>{for(let n of ke)st.add(n.name),rt.set(n.name,n);ke.length=0;let t=be.size?[...be]:[document.documentElement];for(let n of t)bn(n,!be.has(n));st.clear()})},D=e=>{ve.set(e.name,e)};document.addEventListener(j,e=>{let t=_t.get(e.detail.type);t&&t.apply({error:ye.bind(0,{plugin:{type:"watcher",name:t.name},element:{id:e.target.id,tag:e.target.tagName}})},e.detail.argsRaw)});var Se=e=>{_t.set(e.name,e)},Ht=e=>{for(let t of e){let n=Ee.get(t);if(n&&Ee.delete(t))for(let r of n.values())for(let s of r.values())s()}},Dt=W("ignore"),pn=`[${Dt}]`,It=e=>e.hasAttribute(`${Dt}__self`)||!!e.closest(pn),De=(e,t)=>{for(let n of e)if(!It(n)){let r=new Set;for(let s in n.dataset){let i=s.replace(/[A-Z]/g,"-$&").toLowerCase();r.add(i),it(n,i,n.dataset[s],t)}for(let s of Array.from(n.attributes)){if(!s.name.startsWith("data-"))continue;let i=s.name.slice(5);r.has(i)||it(n,i,s.value,t)}}},mn=e=>{for(let{target:t,type:n,attributeName:r,addedNodes:s,removedNodes:i}of e)if(n==="childList"){for(let o of i)z(o)&&(Ht([o]),Ht(o.querySelectorAll("*")));for(let o of s)z(o)&&(De([o]),De(o.querySelectorAll("*")))}else if(n==="attributes"&&r.startsWith("data-")&&z(t)&&!It(t)){let o=r.slice(5),a=nt(o);if(!a)continue;let l=t.getAttribute(r);if(l===null){let c=Ee.get(t);if(c){let u=c.get(a);if(u){for(let f of u.values())f();c.delete(a)}}}else it(t,o,l)}},gn=new MutationObserver(mn),hn=e=>{let[t,...n]=e.split("__"),[r,s]=t.split(/:(.+)/),i=new Map;for(let o of n){let[a,...l]=o.split(".");i.set(a,new Set(l))}return{pluginName:r,key:s,mods:i}},yn=()=>be.has(document.documentElement),vn=()=>{Ft||!yn()||(Ft=!0,document.dispatchEvent(new Event(yt)))},bn=(e=document.documentElement,t=!0)=>{z(e)&&De([e],!0),De(e.querySelectorAll("*"),!0),t&&(gn.observe(e,{subtree:!0,childList:!0,attributes:!0}),be.add(e),vn())};var it=(e,t,n,r)=>{let s=nt(t);if(!s)return;let{pluginName:i,key:o,mods:a}=hn(s),l=rt.get(i);if((!r||st.has(i))&&!!l){let u={el:e,rawKey:s,mods:a,error:ye.bind(0,{plugin:{type:"attribute",name:l.name},element:{id:e.id,tag:e.tagName},expression:{rawKey:s,key:o,value:n}}),key:o,value:n,loadedPluginNames:{actions:new Set(ve.keys()),attributes:new Set(rt.keys())},rx:void 0},f=l.requirement&&(typeof l.requirement=="string"?l.requirement:l.requirement.key)||"allowed",m=l.requirement&&(typeof l.requirement=="string"?l.requirement:l.requirement.value)||"allowed",h=o!=null&&o!=="",v=n!=null&&n!=="";if(h){if(f==="denied")throw u.error("KeyNotAllowed")}else if(f==="must")throw u.error("KeyRequired");if(v){if(m==="denied")throw u.error("ValueNotAllowed")}else if(m==="must")throw u.error("ValueRequired");if(f==="exclusive"||m==="exclusive"){if(h&&v)throw u.error("KeyAndValueProvided");if(!h&&!v)throw u.error("KeyOrValueRequired")}let d=new Map;if(v){let y;u.rx=(...$)=>(y||(y=En(n,{returnsValue:l.returnsValue,argNames:l.argNames,cleanups:d})),y(e,...$))}let g=l.apply(u);g&&d.set("attribute",g);let b=Ee.get(e);if(b){let y=b.get(s);if(y)for(let $ of y.values())$()}else b=new Map,Ee.set(e,b);b.set(s,d)}},En=(e,{returnsValue:t=!1,argNames:n=[],cleanups:r=new Map}={})=>{let s="";if(t){let l=/(\/(\\\/|[^/])*\/|"(\\"|[^"])*"|'(\\'|[^'])*'|`(\\`|[^`])*`|\(\s*((function)\s*\(\s*\)|(\(\s*\))\s*=>)\s*(?:\{[\s\S]*?\}|[^;){]*)\s*\)\s*\(\s*\)|[^;])+/gm,c=e.trim().match(l);if(c){let u=c.length-1,f=c[u].trim();f.startsWith("return")||(c[u]=`return (${f});`),s=c.join(`; +`)}}else s=e.trim();let i=new Map,o=RegExp(`(?:${Je})(.*?)(?:${Ke})`,"gm"),a=0;for(let l of s.matchAll(o)){let c=l[1],u=`__escaped${a++}`;i.set(u,c),s=s.replace(Je+c+Ke,u)}s=s.replace(/("(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|`(?:\\.|[^`\\$]|\$(?!\{))*`)|\$\{([^{}]*)\}|\$([a-zA-Z_\d]\w*(?:[.-]\w+)*)/g,(l,c,u,f)=>c?l:u!==void 0?`\${${u.replace(/\$([a-zA-Z_\d]\w*(?:[.-]\w+)*)/g,(m,h)=>h.split(".").reduce((v,d)=>`${v}['${d}']`,"$"))}}`:f.split(".").reduce((m,h)=>`${m}['${h}']`,"$")),s=s.replaceAll(/@([A-Za-z_$][\w$]*)\(/g,'__action("$1",evt,');for(let[l,c]of i)s=s.replace(l,c);try{let l=Function("el","$","__action","evt",...n,s);return(c,...u)=>{let f=(m,h,...v)=>{let d=ye.bind(0,{plugin:{type:"action",name:m},element:{id:c.id,tag:c.tagName},expression:{fnContent:s,value:e}}),g=kt[m];if(g)return g({el:c,evt:h,error:d,cleanups:r},...v);throw d("UndefinedAction")};try{return l(c,ne,f,void 0,...u)}catch(m){throw console.error(m),ye({element:{id:c.id,tag:c.tagName},expression:{fnContent:s,value:e},error:m.message},"ExecuteExpression")}}}catch(l){throw console.error(l),ye({expression:{fnContent:s,value:e},error:l.message},"GenerateExpression")}};D({name:"peek",apply(e,t){H();try{return t()}finally{_()}}});D({name:"setAll",apply(e,t,n){H();let r=V(n);te(r,()=>t),k(r),_()}});D({name:"toggleAll",apply(e,t){H();let n=V(t);te(n,r=>!r),k(n),_()}});var Ie=new Map,ot=e=>!["GET","DELETE"].includes(e),Te=(e,t,n=!0)=>D({name:e,apply:async({el:r,evt:s,error:i,cleanups:o},a,{selector:l,headers:c,contentType:u="json",filterSignals:{include:f=/.*/,exclude:m=/(^|\.)_/}={},openWhenHidden:h=n,payload:v,requestCancellation:d="auto",retry:g="auto",retryInterval:b=1e3,retryScaler:y=2,retryMaxWait:$=3e4,retryMaxCount:O=10}={})=>{let C=d instanceof AbortController?d:new AbortController;(d==="auto"||d==="cleanup")&&(Ie.get(t)?.get(a)?.abort(),Ie.has(t)||Ie.set(t,new Map),Ie.get(t).set(a,C)),d==="cleanup"&&(o.get(`@${e}`)?.(),o.set(`@${e}`,async()=>{C.abort(),await Promise.resolve()}));let de=()=>{};try{if(!a?.length)throw i("FetchNoUrlProvided",{action:D});let ie={Accept:"text/event-stream, text/html, application/json","Datastar-Request":!0};u==="json"&&ot(t)&&(ie["Content-Type"]="application/json");let q=Object.assign({},ie,c),Y={input:"",method:t,headers:q,openWhenHidden:h,retry:g,retryInterval:b,retryScaler:y,retryMaxWait:$,retryMaxCount:O,signal:C.signal,onopen:async E=>{E.status>=400&&re(Sn,r,{status:E.status.toString()})},onmessage:E=>{if(!E.event.startsWith("datastar"))return;let U=E.event,T={};for(let S of E.data.split(` +`)){let A=S.indexOf(" "),X=S.slice(0,A),M=S.slice(A+1);(T[X]||=[]).push(M)}let F=Object.fromEntries(Object.entries(T).map(([S,A])=>[S,A.join(` +`)]));re(U,r,F)},onerror:E=>{if(Vt(E))throw i("FetchExpectedTextEventStream",{url:a})}},Ge=()=>{let E=new URL(a,document.baseURI),U=new URLSearchParams(E.search);if(u==="json"){H();let T=v!==void 0?v:V({include:f,exclude:m});_();let F=JSON.stringify(T);ot(t)?Y.body=F:U.set("datastar",F)}else if(u==="form"){let T=l?document.querySelector(l):r.closest("form");if(!T)throw i("FetchFormNotFound",{action:D,selector:l});if(!T.noValidate&&!T.checkValidity()){T.reportValidity();return}let F=new FormData(T),S=r;if(r===T&&s instanceof SubmitEvent)S=s.submitter;else{let M=pe=>pe.preventDefault();T.addEventListener("submit",M),de=()=>{T.removeEventListener("submit",M)}}if(S instanceof HTMLButtonElement||S instanceof HTMLInputElement&&S.type==="submit"){let M=S.getAttribute("name");M&&F.append(M,S.value)}let A=T.getAttribute("enctype")==="multipart/form-data";A||(q["Content-Type"]="application/x-www-form-urlencoded");let X=new URLSearchParams(F);if(ot(t))A?Y.body=F:Y.body=X;else for(let[M,pe]of X)U.append(M,pe)}else throw i("FetchInvalidContentType",{action:D,contentType:u});return E.search=U.toString(),Y.input=E.toString(),Y};re(at,r,{});try{await Ln(r,Ge)}catch(E){if(!Vt(E))throw i("FetchFailed",{method:t,url:a,error:E.message})}}finally{re(ct,r,{}),de(),o.delete(`@${e}`)}}});Te("get","GET",!1);Te("patch","PATCH");Te("post","POST");Te("put","PUT");Te("delete","DELETE");var at="started",ct="finished",Sn="error",Tn="retrying",An="retries-failed",re=(e,t,n)=>document.dispatchEvent(new CustomEvent(j,{detail:{type:e,el:t,argsRaw:n}})),Vt=e=>`${e}`.includes("text/event-stream"),Rn=async(e,t)=>{let n=e.getReader(),r=await n.read();for(;!r.done;)t(r.value),r=await n.read()},wn=e=>{let t,n,r,s=!1;return i=>{t?t=xn(t,i):(t=i,n=0,r=-1);let o=t.length,a=0;for(;n{let r=$t(),s=new TextDecoder;return(i,o)=>{if(!i.length)n?.(r),r=$t();else if(o>0){let a=s.decode(i.subarray(0,o)),l=o+(i[o+1]===32?2:1),c=s.decode(i.subarray(l));switch(a){case"data":r.data=r.data?`${r.data} +${c}`:c;break;case"event":r.event=c;break;case"id":e(r.id=c);break;case"retry":{let u=+c;Number.isNaN(u)||t(r.retry=u);break}}}}},xn=(e,t)=>{let n=new Uint8Array(e.length+t.length);return n.set(e),n.set(t,e.length),n},$t=()=>({data:"",event:"",id:"",retry:void 0}),Ln=(e,t)=>new Promise((n,r)=>{let s=t();if(!s)return;let{input:i,signal:o,headers:a,onopen:l,onmessage:c,onclose:u,openWhenHidden:f,fetch:m,retry:h="auto",retryInterval:v=1e3,retryScaler:d=2,retryMaxWait:g=3e4,retryMaxCount:b=10,responseOverrides:y,...$}=s,O={...a},C,de=()=>{if(C.abort(),!document.hidden){let S=t();if(!S)return;i=S.input,$.body=S.body,F()}};f||document.addEventListener("visibilitychange",de);let ie,q=()=>{document.removeEventListener("visibilitychange",de),clearTimeout(ie),C.abort()};o?.addEventListener("abort",()=>{q(),n()});let Y=m||window.fetch,Ge=l||(()=>{}),E=0,U=v,T=()=>{E{C=new AbortController;let S=C.signal;try{let A=await Y(i,{...$,headers:O,signal:S});await Ge(A);let X=async(G,me,Be,we,...on)=>{let gt={[Be]:await me.text()};for(let We of on){let Ue=me.headers.get(`datastar-${ae(We)}`);if(we){let Me=we[We];Me&&(Ue=typeof Me=="string"?Me:JSON.stringify(Me))}Ue&&(gt[We]=Ue)}re(G,e,gt),q(),n()},M=A.status,pe=M===204,mt=M>=300&&M<400,sn=M>=400&&M<600;if(M!==200){if(u?.(),h!=="never"&&!pe&&!mt&&(h==="always"||h==="error"&&sn)){T();return}q(),n();return}E=0,v=U;let je=A.headers.get("Content-Type");if(je?.includes("text/html"))return await X("datastar-patch-elements",A,"elements",y,"selector","mode","namespace","useViewTransition");if(je?.includes("application/json"))return await X("datastar-patch-signals",A,"signals",y,"onlyIfMissing");if(je?.includes("text/javascript")){let G=document.createElement("script"),me=A.headers.get("datastar-script-attributes");if(me)for(let[Be,we]of Object.entries(JSON.parse(me)))G.setAttribute(Be,we);G.textContent=await A.text(),document.head.appendChild(G),q();return}if(await Rn(A.body,wn(Mn(G=>{G?O["last-event-id"]=G:delete O["last-event-id"]},G=>{U=v=G},c))),u?.(),h==="always"&&!mt){T();return}q(),n()}catch{if(!S.aborted)try{T()}catch(A){q(),r(A)}}};F()});p({name:"attr",requirement:{value:"must"},returnsValue:!0,apply({el:e,key:t,rx:n}){let r=(a,l)=>{l===""||l===!0?e.setAttribute(a,""):l===!1||l==null?e.removeAttribute(a):typeof l=="string"?e.setAttribute(a,l):typeof l=="function"?e.setAttribute(a,l.toString()):e.setAttribute(a,JSON.stringify(l,(c,u)=>typeof u=="function"?u.toString():u))},s=t?()=>{i.disconnect();let a=n();r(t,a),i.observe(e,{attributeFilter:[t]})}:()=>{i.disconnect();let a=n(),l=Object.keys(a);for(let c of l)r(c,a[c]);i.observe(e,{attributeFilter:l})},i=new MutationObserver(s),o=w(s);return()=>{i.disconnect(),o()}}});var Ve=(e,...t)=>({get:n=>n[e],set:(n,r)=>{n[e]=r},events:t}),qt=(e,...t)=>({get:n=>n.getAttribute(e),set:(n,r)=>{n.setAttribute(e,`${r}`)},events:t}),lt=(e=!1,...t)=>({get:(n,r)=>r==="string"||e&&r==="undefined"?n.value:+n.value,set:(n,r)=>{n.value=`${r}`},events:t}),Nn=/^data:(?[^;]+);base64,(?.*)$/,Gt=Symbol("empty"),Pn=(e,t,n,r,s,i)=>{let o=W(CSS.escape(n)),a=t?`[${o}]`:`[${o}="${CSS.escape(r)}"]`;if(i===void 0&&e instanceof HTMLInputElement&&e.type==="radio"){let f=[...document.querySelectorAll(a)].find(m=>m instanceof HTMLInputElement&&m.checked);f&&R([[r,f.value]],{ifMissing:!0})}if(!Array.isArray(i)||e instanceof HTMLSelectElement&&e.multiple)return R([[r,s.get(e,typeof i)]],{ifMissing:!0}),r;let l=document.querySelectorAll(a),c=[],u=0;for(let f of l){if(c.push([`${r}.${u}`,s.get(f,typeof(x(i,u)?i[u]:void 0))]),e===f)break;u++}return R(c,{ifMissing:!0}),`${r}.${u}`};p({name:"bind",requirement:"exclusive",apply({el:e,key:t,rawKey:n,mods:r,value:s,error:i}){let o=t!=null?P(t,r):s,a=r.get("prop"),l=r.get("event"),c=null;if(e instanceof HTMLInputElement)switch(e.type){case"range":case"number":c=lt(!1,"input");break;case"checkbox":c={get:(d,g)=>d.value!=="on"?g==="boolean"?d.checked:d.checked?d.value:"":g==="string"?d.checked?d.value:"":d.checked,set:(d,g)=>{d.checked=typeof g=="string"?g===d.value:g},events:["input"]};break;case"radio":e.getAttribute("name")?.length||e.setAttribute("name",o),c={get:(d,g)=>d.checked?g==="number"?+d.value:d.value:Gt,set:(d,g)=>{d.checked=g===(typeof g=="number"?+d.value:d.value)},events:["input"]};break;case"file":{let d=()=>{let g=[...e.files||[]],b=[];Promise.all(g.map(y=>new Promise($=>{let O=new FileReader;O.onload=()=>{if(typeof O.result!="string")throw i("InvalidFileResultType",{resultType:typeof O.result});let C=O.result.match(Nn);if(!C?.groups)throw i("InvalidDataUri",{result:O.result});b.push({name:y.name,contents:C.groups.contents,mime:C.groups.mime})},O.onloadend=()=>$(),O.readAsDataURL(y)}))).then(()=>{R([[o,b]])})};return e.addEventListener("change",d),()=>{e.removeEventListener("change",d)}}default:c=lt(!0,"input")}else if(e instanceof HTMLSelectElement&&e.multiple){let d=new Map;c={get:g=>[...g.selectedOptions].map(b=>{let y=d.get(b.value);return y==="string"||y==null?b.value:+b.value}),set:(g,b)=>{for(let y of g.options)b.includes(y.value)?(d.set(y.value,"string"),y.selected=!0):b.includes(+y.value)?(d.set(y.value,"number"),y.selected=!0):y.selected=!1},events:["change"]}}else e instanceof HTMLSelectElement?c=lt(!0,"change"):e instanceof HTMLTextAreaElement?c=Ve("value","input"):e instanceof HTMLElement&&e.tagName.includes("-")?c="value"in e?Ve("value","input","change"):qt("value","input","change"):e instanceof HTMLElement&&"value"in e?c=Ve("value","change"):c=qt("value","change");if(!c)throw i("InvalidBindAdapter");let u=a&&[...a][0];if(a&&!u)throw i("BindPropNameMissing");if(u){let d=Pt(u);c=Ve(d,...l?[...l]:c.events)}else l&&(c.events=[...l]);let f=oe(o),m=Pn(e,t,n,o,c,f),h=()=>{let d=oe(m);if(d!=null){let g=c.get(e,typeof d);g!==Gt&&R([[m,g]])}};for(let d of c.events)e.addEventListener(d,h);e.addEventListener(ge,h);let v=w(()=>{c.set(e,oe(m))});return()=>{v();for(let d of c.events)e.removeEventListener(d,h);e.removeEventListener(ge,h)}}});p({name:"class",requirement:{value:"must"},returnsValue:!0,apply({key:e,el:t,mods:n,rx:r}){e&&=P(e,n,"kebab");let s,i=()=>{o.disconnect(),s=e?{[e]:r()}:r();for(let l in s){let c=l.split(/\s+/).filter(u=>u.length>0);if(s[l])for(let u of c)t.classList.contains(u)||t.classList.add(u);else for(let u of c)t.classList.contains(u)&&t.classList.remove(u)}o.observe(t,{attributeFilter:["class"]})},o=new MutationObserver(i),a=w(i);return()=>{o.disconnect(),a();for(let l in s){let c=l.split(/\s+/).filter(u=>u.length>0);for(let u of c)t.classList.remove(u)}}}});p({name:"computed",requirement:{value:"must"},returnsValue:!0,apply({key:e,mods:t,rx:n,error:r}){if(e)R([[P(e,t),_e(n)]]);else{let s=Object.assign({},n());te(s,i=>{if(typeof i=="function")return _e(i);throw r("ComputedExpectedFunction")}),k(s)}}});p({name:"effect",requirement:{key:"denied",value:"must"},apply:({rx:e})=>w(e)});p({name:"indicator",requirement:"exclusive",apply({el:e,key:t,mods:n,value:r}){let s=t!=null?P(t,n):r,i=0;R([[s,!1]]);let o=a=>{let{type:l,el:c}=a.detail;if(c===e)switch(l){case at:i++,R([[s,!0]]);break;case ct:i=Math.max(0,i-1),R([[s,i>0]]);break}};return document.addEventListener(j,o),()=>{i=0,R([[s,!1]]),document.removeEventListener(j,o)}}});var Z=e=>{if(!e||e.size<=0)return 0;for(let t of e){if(t.endsWith("ms"))return+t.replace("ms","");if(t.endsWith("s"))return+t.replace("s","")*1e3;try{return Number.parseFloat(t)}catch{}}return 0},se=(e,t,n=!1)=>e?e.has(t.toLowerCase()):n,jt=(e,t="")=>{if(e&&e.size>0)for(let n of e)return n;return t};var ut=(e,t)=>(...n)=>{setTimeout(()=>{e(...n)},t)},Bt=(e,t,n=!0,r=!1,s=!1)=>{let i=null,o=0;return(...a)=>{n&&!o?(e(...a),i=null):i=a,(!o||s)&&(o&&clearTimeout(o),o=setTimeout(()=>{r&&i!==null&&e(...i),i=null,o=0},t))}},le=(e,t)=>{let n=t.get("delay");if(n){let i=Z(n);e=ut(e,i)}let r=t.get("debounce");if(r){let i=Z(r),o=se(r,"leading",!1),a=!se(r,"notrailing",!1);e=Bt(e,i,o,a,!0)}let s=t.get("throttle");if(s){let i=Z(s),o=!se(s,"noleading",!1),a=se(s,"trailing",!1);e=Bt(e,i,o,a)}return e};var $e=(e=document.documentElement)=>"startViewTransition"in e,Q=(e,t)=>{if(t.has("viewtransition")&&$e()){let n=e;e=(...r)=>document.startViewTransition(()=>n(...r))}return e};p({name:"init",requirement:{key:"denied",value:"must"},apply({rx:e,mods:t}){let n=()=>{L(),e(),N()};n=Q(n,t);let r=0,s=t.get("delay");s&&(r=Z(s),r>0&&(n=ut(n,r))),n()}});p({name:"json-signals",requirement:{key:"denied"},apply({el:e,value:t,mods:n}){let r=n.has("terse")?0:2,s={};t&&(s=ce(t));let i=()=>{o.disconnect(),e.textContent=JSON.stringify(V(s),null,r),o.observe(e,{childList:!0,characterData:!0,subtree:!0})},o=new MutationObserver(i),a=w(i);return()=>{o.disconnect(),a()}}});p({name:"on",requirement:"must",argNames:["evt"],apply({el:e,key:t,mods:n,rx:r}){let s=e;n.has("window")?s=window:n.has("document")&&(s=document);let i=c=>{L(),r(c),N()};i=Q(i,n),i=le(i,n);let o=P(t,n,"kebab"),a={capture:n.has("capture"),passive:n.has("passive"),once:n.has("once")};if(n.has("outside")){s=document;let c=i;i=u=>{e.contains(u?.target)||c(u)}}(o===j||o===ee)&&(s=document);let l=c=>{c&&(n.has("prevent")&&c.preventDefault(),n.has("stop")&&c.stopPropagation(),e instanceof HTMLFormElement&&o==="submit"&&c.preventDefault()),i(c)};return s.addEventListener(o,l,a),()=>{s.removeEventListener(o,l,a)}}});var Wt=(e,t,n)=>Math.max(t,Math.min(n,e));var ft=new WeakSet;p({name:"on-intersect",requirement:{key:"denied",value:"must"},apply({el:e,mods:t,rx:n}){let r=()=>{L(),n(),N()};r=Q(r,t),r=le(r,t);let s={threshold:0};if(t.has("full"))s.threshold=1;else if(t.has("half"))s.threshold=.5;else{let a=t.get("threshold");a&&(s.threshold=Wt(Number(jt(a)),0,100)/100)}let i=t.has("exit"),o=new IntersectionObserver(a=>{for(let l of a)l.isIntersecting!==i&&(r(),o&&ft.has(e)&&o.disconnect())},s);return o.observe(e),t.has("once")&&ft.add(e),()=>{t.has("once")||ft.delete(e),o&&(o.disconnect(),o=null)}}});p({name:"on-interval",requirement:{key:"denied",value:"must"},apply({mods:e,rx:t}){let n=()=>{L(),t(),N()};n=Q(n,e);let r=1e3,s=e.get("duration");s&&(r=Z(s),se(s,"leading",!1)&&n());let i=setInterval(n,r);return()=>{clearInterval(i)}}});p({name:"on-signal-patch",requirement:{value:"must"},argNames:["patch"],returnsValue:!0,apply({el:e,key:t,mods:n,rx:r,error:s}){if(t&&t!=="filter")throw s("KeyNotAllowed");let i=W(`${this.name}-filter`),o=e.getAttribute(i),a={};o&&(a=ce(o));let l=!1,c=le(u=>{if(l)return;let f=V(a,u.detail);if(!vt(f)){l=!0,L();try{r(f)}finally{N(),l=!1}}},n);return document.addEventListener(ee,c),()=>{document.removeEventListener(ee,c)}}});p({name:"ref",requirement:"exclusive",apply({el:e,key:t,mods:n,value:r}){let s=t!=null?P(t,n):r;R([[s,e]])}});var Ut="none",Jt="display";p({name:"show",requirement:{key:"denied",value:"must"},returnsValue:!0,apply({el:e,rx:t}){let n=()=>{r.disconnect(),t()?e.style.display===Ut&&e.style.removeProperty(Jt):e.style.setProperty(Jt,Ut),r.observe(e,{attributeFilter:["style"]})},r=new MutationObserver(n),s=w(n);return()=>{r.disconnect(),s()}}});p({name:"signals",returnsValue:!0,apply({key:e,mods:t,rx:n}){let r=t.has("ifmissing");if(e){e=P(e,t);let s=n?.();R([[e,s]],{ifMissing:r})}else{let s=Object.assign({},n?.());k(s,{ifMissing:r})}}});p({name:"style",requirement:{value:"must"},returnsValue:!0,apply({key:e,el:t,rx:n}){let{style:r}=t,s=new Map,i=(c,u)=>{let f=s.get(c);!u&&u!==0?f!==void 0&&(f?r.setProperty(c,f):r.removeProperty(c)):(f===void 0&&s.set(c,r.getPropertyValue(c)),r.setProperty(c,String(u)))},o=()=>{if(a.disconnect(),e)i(e,n());else{let c=n();for(let[u,f]of s)u in c||(f?r.setProperty(u,f):r.removeProperty(u));for(let u in c)i(ae(u),c[u])}a.observe(t,{attributeFilter:["style"]})},a=new MutationObserver(o),l=w(o);return()=>{a.disconnect(),l();for(let[c,u]of s)u?r.setProperty(c,u):r.removeProperty(c)}}});p({name:"text",requirement:{key:"denied",value:"must"},returnsValue:!0,apply({el:e,rx:t}){let n=()=>{r.disconnect(),e.textContent=`${t()}`,r.observe(e,{childList:!0,characterData:!0,subtree:!0})},r=new MutationObserver(n),s=w(n);return()=>{r.disconnect(),s()}}});var Kt=(e,t)=>e.includes(t),On=["remove","outer","inner","replace","prepend","append","before","after"],Cn=["html","svg","mathml"];Se({name:"datastar-patch-elements",apply(e,t){let n=typeof t.selector=="string"?t.selector:"",r=typeof t.mode=="string"?t.mode:"outer",s=typeof t.namespace=="string"?t.namespace:"html",i=typeof t.useViewTransition=="string"&&t.useViewTransition.trim()==="true",o=typeof t.viewTransitionSelector=="string"?t.viewTransitionSelector:"",a=t.elements;if(!Kt(On,r))throw e.error("PatchElementsInvalidMode",{mode:r});if(!n&&r!=="outer"&&r!=="replace")throw e.error("PatchElementsExpectedSelector");if(!Kt(Cn,s))throw e.error("PatchElementsInvalidNamespace",{namespace:s});let l={selector:n,mode:r,namespace:s,elements:a};if(i&&$e()){let c=document.documentElement;if(o){let u=document.querySelector(o);u&&$e(u)&&(c=u)}c.startViewTransition(()=>zt(e,l))}else zt(e,l)}});var zt=({error:e},{selector:t,mode:n,namespace:r,elements:s})=>{let i=document.createDocumentFragment(),o=typeof s!="string"&&!!s;if(typeof s=="string"){let a=s.replace(/]*>|>)([\s\S]*?)<\/svg>/gim,""),l=/<\/html>/.test(a),c=/<\/head>/.test(a),u=/<\/body>/.test(a),f=r==="svg"?"svg":r==="mathml"?"math":"",m=f?`<${f}>${s}`:s,h=new DOMParser().parseFromString(l||c||u?s:``,"text/html");if(l)i.appendChild(h.documentElement);else if(c&&u)i.appendChild(h.head),i.appendChild(h.body);else if(c)i.appendChild(h.head);else if(u)i.appendChild(h.body);else if(f){let v=h.querySelector("template").content.querySelector(f);for(let d of v.childNodes)i.appendChild(d)}else i=h.querySelector("template").content}else s&&(s instanceof DocumentFragment?i=s:s instanceof Element&&i.appendChild(s));if(!t&&(n==="outer"||n==="replace")){let a=Array.from(i.children);for(let l of a){let c;if(l instanceof HTMLHtmlElement)c=document.documentElement;else if(l instanceof HTMLBodyElement)c=document.body;else if(l instanceof HTMLHeadElement)c=document.head;else if(c=document.getElementById(l.id),!c){console.warn(e("PatchElementsNoTargetsFound"),{element:{id:l.id}});continue}Qt(n,l,[c],!0)}}else{let a=document.querySelectorAll(t);if(!a.length){console.warn(e("PatchElementsNoTargetsFound"),{selector:t});return}let l=o&&n!=="remove"?[a[0]]:a;l.length===1&&(o=!0),Qt(n,i,l,o)}},pt=new WeakSet;for(let e of document.querySelectorAll("script"))pt.add(e);var tn=e=>{let t=e instanceof HTMLScriptElement?[e]:e.querySelectorAll("script");for(let n of t)if(!pt.has(n)){let r=document.createElement("script");for(let{name:s,value:i}of n.attributes)r.setAttribute(s,i);r.text=n.text,n.replaceWith(r),pt.add(r)}},Zt=(e,t,n,r)=>{let s=!1;for(let i of e){if(r&&s)break;let o=r?t:t.cloneNode(!0);tn(o),i[n](o),s=!0}},Qt=(e,t,n,r)=>{switch(e){case"remove":for(let s of n)s.remove();break;case"outer":case"inner":{let s=!1;for(let i of n){if(r&&s)break;let o=r?t:t.cloneNode(!0);Hn(i,o,e),tn(i);let a=i.closest("[data-scope-children]");a&&a.dispatchEvent(new CustomEvent(ze,{bubbles:!1})),s=!0}}break;case"replace":Zt(n,t,"replaceWith",r);break;case"prepend":case"append":case"before":case"after":Zt(n,t,e,r)}},I=new Map,fe=new Set,ue=new Map,Ae=new Set,qe=document.createElement("div");qe.hidden=!0;var Re=W("ignore-morph"),Fn=`[${Re}]`,Hn=(e,t,n="outer")=>{if(z(e)&&z(t)&&e.hasAttribute(Re)&&t.hasAttribute(Re)||e.parentElement?.closest(Fn))return;let r=document.createElement("div");r.append(t),document.body.insertAdjacentElement("afterend",qe);let s=e.querySelectorAll("[id]");for(let{id:a,tagName:l}of s)ue.has(a)?Ae.add(a):ue.set(a,l);e instanceof Element&&e.id&&(ue.has(e.id)?Ae.add(e.id):ue.set(e.id,e.tagName)),fe.clear();let i=r.querySelectorAll("[id]");for(let{id:a,tagName:l}of i)fe.has(a)?Ae.add(a):ue.get(a)===l&&fe.add(a);for(let a of Ae)fe.delete(a);ue.clear(),Ae.clear(),I.clear();let o=n==="outer"?e.parentElement:e;en(o,s),en(r,i),nn(o,r,n==="outer"?e:null,e.nextSibling),qe.remove()},nn=(e,t,n=null,r=null)=>{e instanceof HTMLTemplateElement&&t instanceof HTMLTemplateElement&&(e=e.content,t=t.content),n??=e.firstChild;for(let s of t.childNodes){if(n&&n!==r){let i=_n(s,n,r);if(i){if(i!==n){let o=n;for(;o&&o!==i;){let a=o;o=o.nextSibling,Xt(a)}}dt(i,s),n=i.nextSibling;continue}}if(s instanceof Element&&fe.has(s.id)){let i=document.getElementById(s.id),o=i;for(;o=o.parentNode;){let a=I.get(o);a&&(a.delete(s.id),a.size||I.delete(o))}rn(e,i,n),dt(i,s),n=i.nextSibling;continue}if(I.has(s)){let i=s.namespaceURI,o=s.tagName,a=i&&i!=="http://www.w3.org/1999/xhtml"?document.createElementNS(i,o):document.createElement(o);e.insertBefore(a,n),dt(a,s),n=a.nextSibling}else{let i=document.importNode(s,!0);e.insertBefore(i,n),n=i.nextSibling}}for(;n&&n!==r;){let s=n;n=n.nextSibling,Xt(s)}},_n=(e,t,n)=>{let r=null,s=e.nextSibling,i=0,o=0,a=I.get(e)?.size||0,l=t;for(;l&&l!==n;){if(Yt(l,e)){let c=!1,u=I.get(l),f=I.get(e);if(f&&u){for(let m of u)if(f.has(m)){c=!0;break}}if(c)return l;if(!r&&!I.has(l)){if(!a)return l;r=l}}if(o+=I.get(l)?.size||0,o>a)break;r===null&&s&&Yt(l,s)&&(i++,s=s.nextSibling,i>=2&&(r=void 0)),l=l.nextSibling}return r||null},Yt=(e,t)=>e.nodeType===t.nodeType&&e.tagName===t.tagName&&(!e.id||e.id===t.id),Xt=e=>{I.has(e)?rn(qe,e,null):e.parentNode?.removeChild(e)},rn=(e,t,n)=>{if("moveBefore"in e){e.moveBefore(t,n);return}e.insertBefore(t,n)},kn=W("preserve-attr"),dt=(e,t)=>{let n=t.nodeType;if(n===1){let r=e,s=t,i=r.hasAttribute("data-scope-children");if(r.hasAttribute(Re)&&s.hasAttribute(Re))return e;let o=(t.getAttribute(kn)??"").split(" "),a=(c,u,f)=>{let m=u.hasAttribute(f);return c.hasAttribute(f)!==m&&!o.includes(f)?(c[f]=m,!0):!1},l=!1;if(r instanceof HTMLInputElement&&s instanceof HTMLInputElement&&s.type!=="file"){let c=s.getAttribute("value");r.getAttribute("value")!==c&&!o.includes("value")&&(r.value=c??"",l=!0),l=a(r,s,"checked")||l,a(r,s,"disabled")}else if(r instanceof HTMLTextAreaElement&&s instanceof HTMLTextAreaElement){let c=s.value;r.defaultValue!==c&&(r.value=c,l=!0)}else r instanceof HTMLOptionElement&&s instanceof HTMLOptionElement&&(l=a(r,s,"selected")||l);for(let{name:c,value:u}of s.attributes)r.getAttribute(c)!==u&&!o.includes(c)&&r.setAttribute(c,u);for(let{name:c}of Array.from(r.attributes))!s.hasAttribute(c)&&!o.includes(c)&&r.removeAttribute(c);l&&(r instanceof HTMLOptionElement?r.closest("select"):r)?.dispatchEvent(new Event(ge,{bubbles:!0})),i&&!r.hasAttribute("data-scope-children")&&r.setAttribute("data-scope-children",""),r instanceof HTMLTemplateElement&&s instanceof HTMLTemplateElement?r.innerHTML=s.innerHTML:r.isEqualNode(s)||nn(r,s),i&&r.dispatchEvent(new CustomEvent(ze,{bubbles:!1}))}return(n===8||n===3)&&e.nodeValue!==t.nodeValue&&(e.nodeValue=t.nodeValue),e},en=(e,t)=>{for(let n of t)if(fe.has(n.id)){let r=n;for(;r&&r!==e;){let s=I.get(r);s||(s=new Set,I.set(r,s)),s.add(n.id),r=r.parentElement}}};Se({name:"datastar-patch-signals",apply({error:e},{signals:t,onlyIfMissing:n}){if(typeof t!="string")throw e("PatchSignalsExpectedSignals");let r=typeof n=="string"&&n.trim()==="true";k(ce(t),{ifMissing:r})}});export{D as action,kt as actions,p as attribute,L as beginBatch,_e as computed,w as effect,N as endBatch,V as filtered,oe as getPath,k as mergePatch,R as mergePaths,ne as root,he as signal,H as startPeeking,_ as stopPeeking,Se as watcher}; +//# sourceMappingURL=datastar.js.map diff --git a/templates/accounts/onboarding/bulk_invite.html b/templates/accounts/onboarding/bulk_invite.html index 182683f..a5519c4 100644 --- a/templates/accounts/onboarding/bulk_invite.html +++ b/templates/accounts/onboarding/bulk_invite.html @@ -82,7 +82,7 @@ diff --git a/templates/accounts/onboarding/provisional_list.html b/templates/accounts/onboarding/provisional_list.html index 355ed6c..f0b91ae 100644 --- a/templates/accounts/onboarding/provisional_list.html +++ b/templates/accounts/onboarding/provisional_list.html @@ -308,7 +308,7 @@ class="w-full px-4 py-3 border-2 border-gray-200 rounded-xl focus:border-navy focus:ring-2 focus:ring-navy/20 transition bg-white"> {% for hospital in hospitals %} - + {% endfor %} diff --git a/templates/accounts/settings.html b/templates/accounts/settings.html index 7ef05f8..b5a1846 100644 --- a/templates/accounts/settings.html +++ b/templates/accounts/settings.html @@ -138,7 +138,20 @@ -
+
+ +
+
+ + {% trans "My Performance" %} +
+

{% trans "View your performance metrics and evaluations" %}

+ + + {% trans "View Performance" %} + +
+
diff --git a/templates/analytics/command_center.html b/templates/analytics/command_center.html deleted file mode 100644 index 37780ba..0000000 --- a/templates/analytics/command_center.html +++ /dev/null @@ -1,1139 +0,0 @@ -{% extends 'layouts/base.html' %} -{% load i18n %} - -{% block title %}{% trans "PX Command Center" %}{% endblock %} - -{% block extra_css %} - -{% endblock %} - -{% block content %} -
- -
-
-
-

{% trans "Loading dashboard data..." %}

-
-
- - -
-
-

- - {% trans "PX Command Center" %} -

-

{% trans "Comprehensive Patient Experience Analytics Dashboard" %}

-
-
- - - -
-
- - -
-
-

- - {% trans "Filters" %} -

- -
-
-
-
- -
- - -
- - - - - -
- - -
- - -
- - -
- - -
- - -
-
-
-
-
- - -
- -
-
-
-
{% trans "Total Complaints" %}
-
0
-
-
- - {% if kpis.complaints_trend.percentage_change > 0 %} - {{ kpis.complaints_trend.percentage_change|floatformat:1 }}% - {% elif kpis.complaints_trend.percentage_change < 0 %} - {{ kpis.complaints_trend.percentage_change|floatformat:1 }}% - {% else %} - 0% - {% endif %} - -
{% trans "vs last period" %}
-
-
-
- - -
-
-
-
{% trans "Open Complaints" %}
-
0
-
-
- -
-
-
- - -
-
-
-
{% trans "Overdue Complaints" %}
-
0
-
-
- -
-
-
- - -
-
-
-
{% trans "Resolved Complaints" %}
-
0
-
-
- -
-
-
- - -
-
-
-
{% trans "Total Actions" %}
-
0
-
-
- -
-
-
- - -
-
-
-
{% trans "Overdue Actions" %}
-
0
-
-
- -
-
-
- - -
-
-
-
{% trans "Avg Survey Score" %}
-
0.0
-
-
- -
-
-
- - -
-
-
-
{% trans "Negative Surveys" %}
-
0
-
-
- -
-
-
- - -
-
-
-
{% trans "Reopened" %}
-
0
-
-
- -
-
-
- - -
-
-
-
{% trans "Escalated OVR" %}
-
0
-
-
- -
-
-
-
- - -
- -
-
-

- - {% trans "Complaints Trend" %} -

-
-
-
- - -
-
-

- - {% trans "Complaints by Category" %} -

-
-
-
-
- - -
- -
-
-

- - {% trans "Survey Satisfaction Trend" %} -

-
-
-
- - -
-
-

- - {% trans "Survey Distribution" %} -

-
-
-
-
- - -
- -
-
-

- - {% trans "Department Performance" %} -

-
-
-
- - -
-
-

- - {% trans "Physician Leaderboard" %} -

-
-
-
-
- - -
-
-

- - {% trans "Overdue Complaints" %} -

-
-
- - - - - - - - - - - - - - - - -
{% trans "ID" %}{% trans "Title" %}{% trans "Patient" %}{% trans "Severity" %}{% trans "Hospital" %}{% trans "Department" %}{% trans "Due Date" %}{% trans "Actions" %}
-
-
- - -
-
-

- - {% trans "Top Performing Physicians" %} -

-
-
- - - - - - - - - - - - - - - - - -
{% trans "Rank" %}{% trans "Physician" %}{% trans "Specialization" %}{% trans "Department" %}{% trans "Rating" %}{% trans "Surveys" %}{% trans "Positive" %}{% trans "Neutral" %}{% trans "Negative" %}
-
-
- - -
-
-

- - {% trans "AI-Powered Insights" %} -

- -
- - -
- -
- - -
- -
- {% if exec_summary %} -
-
-
- - {{ exec_summary.risk_level|title }} {% trans "Risk" %} - -
-

{% trans "English Summary" %}

-

{{ exec_summary.summary_en }}

- {% if exec_summary.key_findings_en %} -
    - {% for f in exec_summary.key_findings_en %} -
  • - - {{ f }} -
  • - {% endfor %} -
- {% endif %} -
-
-

{% trans "الملخص العربي" %}

-

{{ exec_summary.summary_ar }}

- {% if exec_summary.key_findings_ar %} -
    - {% for f in exec_summary.key_findings_ar %} -
  • - - {{ f }} -
  • - {% endfor %} -
- {% endif %} -
-
- {% if exec_summary.recommendations_en %} -
-

{% trans "Recommended Actions" %}

-
- {% for r in exec_summary.recommendations_en %} -
- - {{ r }} -
- {% endfor %} -
-
- {% endif %} - {% else %} -
- -

{% trans "AI summary loading — click Refresh AI or wait for daily generation at 6 AM" %}

-
- {% endif %} -
- - - - - - - - - - - - -
-
-
- - - -{% endblock %} \ No newline at end of file diff --git a/templates/analytics/kpi_report_pdf.html b/templates/analytics/kpi_report_pdf.html deleted file mode 100644 index 250d304..0000000 --- a/templates/analytics/kpi_report_pdf.html +++ /dev/null @@ -1,1347 +0,0 @@ -{% load i18n %} -{% load static %} - - - - - - - {{ report.indicator_title }} - {% trans "KPI Report" %} - - - - - - - - - - - - - - - - - -
- - - - - {% trans "Back" %} - -
- - -
- - -
-
-
- Al Hammadi Hospital -
-

{% trans "Key Performance Indicator Report" %}

-

{{ report.hospital.name }}

-
-
-
-
{{ report.kpi_id }}
-

{{ report.report_period_display }}

-

{% trans "Generated:" %} {% now "M d, Y" %}

-
-
-
- - -
-
-
-

{{ report.indicator_title }}

- -
-
- {% if report.overall_result >= report.target_percentage %} - {% trans "On Target" %} - {% elif report.overall_result >= report.threshold_percentage %} - {% trans "Below Target" %} - {% else %} - {% trans "Critical" %} - {% endif %} -
-
- -
-
-
{{ report.overall_result }}%
-
{% trans "Overall Result" %}
-
-
-
{{ report.target_percentage }}%
-
{% trans "Target" %}
-
-
-
{{ report.total_numerator }}
-
{{ report.numerator_label }}
-
-
-
{{ report.total_denominator }}
-
{{ report.denominator_label }}
-
-
- -
-
{% trans "Progress vs Target" %}
-
-
-
-
- 0% - {% trans "Threshold:" %} {{ report.threshold_percentage }}% - {% trans "Target:" %} {{ report.target_percentage }}% - 100% -
-
-
- - -
-
- - {% trans "Monthly Performance Data" %} -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {% for m in monthly_data %} - - {% endfor %} - - - - - - - - - {% for m in monthly_data %} - - {% endfor %} - - - - - - - {% for m in monthly_data %} - - {% endfor %} - - - -
{% trans "KPI" %}{% trans "Indicator" %}{% trans "Measure" %}{% trans "Jan" %}{% trans "Feb" %}{% trans "Mar" %}{% trans "Apr" %}{% trans "May" %}{% trans "Jun" %}{% trans "Jul" %}{% trans "Aug" %}{% trans "Sep" %}{% trans "Oct" %}{% trans "Nov" %}{% trans "Dec" %}{% trans "TOTAL" %}{% trans "Target" %}{% trans "Threshold" %}
- {{ report.kpi_id }} - - {{ report.indicator_title }} - - {{ report.numerator_label }} - {% if m %}{{ m.numerator }}{% else %}-{% endif %}{{ report.total_numerator }}{{ report.target_percentage }}%{{ report.threshold_percentage }}%
- {{ report.denominator_label }} - {% if m %}{{ m.denominator }}{% else %}-{% endif %}{{ report.total_denominator }}
- {% trans "Result (%)" %} - - {% if m %}{{ m.percentage }}%{% else %}-{% endif %} - - {{ report.overall_result }}% -
-
- - -
-
- - {% trans "Report Metadata" %} -
- -
- - -
- - {% trans "Performance Analytics" %} -
- -
- -
-
- - {% trans "Monthly Performance Trend" %} -
-
- {% trans "Target:" %} {{ report.target_percentage }}% | - {% trans "Threshold:" %} {{ report.threshold_percentage }}% -
-
-
- - -
-
- - {% trans "Distribution by Source" %} -
-
-
-
- - - {% if department_breakdowns %} -
-
- - {% trans "Department Performance Breakdown" %} -
- -
- {% for dept in department_breakdowns %} -
-
{{ dept.get_department_category_display }}
-
-
-
{{ dept.complaint_count }}
-
{% trans "complaints" %}
-
-
-
{{ dept.resolved_count }}
-
{% trans "resolved" %}
-
-
- {% if dept.avg_resolution_days %} -
- {% trans "Avg:" %} {{ dept.avg_resolution_days }} {% trans "days" %} -
- {% endif %} -
- {% endfor %} -
-
- {% endif %} - - - {% if location_breakdowns %} -
-
- - {% trans "Location Distribution" %} -
- -
- {% for loc in location_breakdowns %} -
-
{{ loc.location_type }}
-
-
{{ loc.complaint_count }}
-
{{ loc.percentage }}%
-
-
- {% endfor %} -
-
- {% endif %} - - - {% if report.ai_analysis %} -
-
-
- - {% trans "AI-Powered Performance Analysis" %} -
- - {% with analysis=report.ai_analysis %} - - - {% if analysis.executive_summary %} -
-

- {% trans "Executive Summary" %} -

-

{{ analysis.executive_summary }}

-
- {% endif %} - -
- - {% if analysis.performance_analysis %} -
-

- {% trans "Performance Analysis" %} -

-

{{ analysis.performance_analysis }}

-
- {% endif %} - - - {% if analysis.comparison_to_target %} -
-

- {% trans "Comparison to Target" %} -

-

{{ analysis.comparison_to_target }}

-
- {% endif %} - - - {% if analysis.key_findings %} -
-

- {% trans "Key Findings" %} -

-
    - {% for finding in analysis.key_findings %} -
  • {{ finding }}
  • - {% endfor %} -
-
- {% endif %} - - - {% if analysis.reasons_for_delays %} -
-

- {% trans "Reasons for Delays" %} -

-
    - {% for reason in analysis.reasons_for_delays %} -
  • {{ reason }}
  • - {% endfor %} -
-
- {% endif %} -
- - - {% if analysis.resolution_time_analysis %} -
-

{% trans "Resolution Time Breakdown" %}

-
- {% if analysis.resolution_time_analysis.within_24h %} -
-

{% trans "Within 24h" %}

-

{{ analysis.resolution_time_analysis.within_24h.count }}

-

{{ analysis.resolution_time_analysis.within_24h.percentage }}

-
- {% endif %} - {% if analysis.resolution_time_analysis.within_48h %} -
-

{% trans "Within 48h" %}

-

{{ analysis.resolution_time_analysis.within_48h.count }}

-

{{ analysis.resolution_time_analysis.within_48h.percentage }}

-
- {% endif %} - {% if analysis.resolution_time_analysis.within_72h %} -
-

{% trans "Within 72h" %}

-

{{ analysis.resolution_time_analysis.within_72h.count }}

-

{{ analysis.resolution_time_analysis.within_72h.percentage }}

-
- {% endif %} - {% if analysis.resolution_time_analysis.over_72h %} -
-

{% trans "Over 72h" %}

-

{{ analysis.resolution_time_analysis.over_72h.count }}

-

{{ analysis.resolution_time_analysis.over_72h.percentage }}

-
- {% endif %} -
-
- {% endif %} - - - {% if analysis.recommendations %} -
-

{% trans "Recommendations" %}

-
    - {% for rec in analysis.recommendations %} -
  • {{ rec }}
  • - {% endfor %} -
-
- {% endif %} - {% endwith %} -
- {% endif %} - - -
-
-

{% trans "Review and Approval" %}

- -
- -
-

{% trans "Reviewed By:" %}

-
-

 

-

{% trans "Name & Signature" %}

-

{% trans "Date:" %} _______________

-
-
- - -
-

{% trans "Reviewed and Approved By:" %}

-
-

 

-

{% trans "Name & Signature" %}

-

{% trans "Date:" %} _______________

-
-
- - -
-

{% trans "Reviewed and Approved By:" %}

-
-

 

-

{% trans "Name & Signature" %}

-

{% trans "Date:" %} _______________

-
-
-
-
- - - -
- - - - diff --git a/templates/analytics/kpi_report_weasyprint.html b/templates/analytics/kpi_report_weasyprint.html new file mode 100644 index 0000000..730083c --- /dev/null +++ b/templates/analytics/kpi_report_weasyprint.html @@ -0,0 +1,617 @@ +{% load i18n %} + + + + {{ report.kpi_id }} - {{ report.indicator_title }} - PX360 + + + + + +
+
+
{{ report.kpi_id }}
+

{{ report.indicator_title }}

+
+ {{ report.hospital.name }}  |  + {{ report.report_period_display }}  |  + {% trans "Generated" %}: {{ report.generated_at|default:report.created_at|date:"M d, Y H:i" }} +
+
+ {% if logo_path %} + + {% endif %} +
+ + +
+
+
{% trans "Overall Result" %}
+
+ {{ report.overall_result|floatformat:1 }}% +
+
+
+
{{ report.numerator_label }}
+
{{ report.total_numerator }}
+
+
+
{{ report.denominator_label }}
+
{{ report.total_denominator }}
+
+
+
{% trans "Target" %}
+
{{ report.target_percentage|floatformat:0 }}%
+
+
+
{% trans "Threshold" %}
+
{{ report.threshold_percentage|floatformat:0 }}%
+
+
+ + +
+
+ {% trans "Performance vs Target" %} + {{ report.overall_result|floatformat:1 }}% / {{ report.target_percentage|floatformat:0 }}% +
+
+
+
+
+ + +
{% trans "Monthly Performance Data" %}
+ + + + + + + + + + + + + + + {% for m in monthly_data %}{% endfor %} + + + + + + {% for m in monthly_data %}{% endfor %} + + + + + + {% for m in monthly_data %} + + {% endfor %} + + + + + + + + + + + + + + + +
{% trans "Month" %}JanFebMarAprMayJunJulAugSepOctNovDec{% trans "TOTAL" %}
{{ report.numerator_label }}{% if m %}{{ m.numerator }}{% else %}-{% endif %}{{ report.total_numerator }}
{{ report.denominator_label }}{% if m %}{{ m.denominator }}{% else %}-{% endif %}{{ report.total_denominator }}
{% trans "Result %" %} + {% if m %}{{ m.percentage|floatformat:1 }}{% else %}-{% endif %} + {{ report.overall_result|floatformat:1 }}
{% trans "Target" %}{{ report.target_percentage|floatformat:0 }}%{{ report.target_percentage|floatformat:0 }}%
{% trans "Threshold" %}{{ report.threshold_percentage|floatformat:0 }}%{{ report.threshold_percentage|floatformat:0 }}%
+ + + + + +{% if trend_chart or source_chart %} +
+ {% if trend_chart %} +
+ Monthly Performance Trend +
+ {% endif %} + {% if source_chart %} +
+ Complaints by Source +
+ {% endif %} +
+{% endif %} + + +{% if department_breakdowns %} +
{% trans "Department Breakdown" %}
+
+ {% for dept in department_breakdowns %} +
+

{{ dept.get_department_category_display }}

+
{% trans "Complaints" %}: {{ dept.complaint_count }}
+
{% trans "Resolved" %}: {{ dept.resolved_count }}
+ {% if dept.avg_resolution_days %} +
{% trans "Avg Resolution" %}: {{ dept.avg_resolution_days|floatformat:1 }} {% trans "days" %}
+ {% endif %} +
+ {% endfor %} +
+{% endif %} + + +{% if location_breakdowns %} +
{% trans "Location Breakdown" %}
+
+ {% for loc in location_breakdowns %} +
+

{{ loc.location_type }}

+
{% trans "Complaints" %}: {{ loc.complaint_count }}
+
{% trans "Share" %}: {{ loc.percentage|floatformat:1 }}%
+
+ {% endfor %} +
+{% endif %} + + +{% if ai_analysis %} +
+
{% trans "AI-Generated Analysis" %}
+ +{% if ai_analysis.executive_summary %} +
+

{% trans "Executive Summary" %}

+

{{ ai_analysis.executive_summary }}

+
+{% endif %} + +{% if ai_analysis.performance_analysis %} +
+

{% trans "Performance Analysis" %}

+

{{ ai_analysis.performance_analysis }}

+
+{% endif %} + +{% if ai_analysis.key_findings %} +
+

{% trans "Key Findings" %}

+ {% for finding in ai_analysis.key_findings %} +
{{ finding }}
+ {% endfor %} +
+{% endif %} + +{% if ai_analysis.reasons_for_delays %} +
+

{% trans "Reasons for Delays" %}

+
    + {% for reason in ai_analysis.reasons_for_delays %} +
  • {{ reason }}
  • + {% endfor %} +
+
+{% endif %} + +{% if ai_analysis.recommendations %} +
+

{% trans "Recommendations" %}

+ {% for rec in ai_analysis.recommendations %} +
{{ rec }}
+ {% endfor %} +
+{% endif %} + +{% if ai_analysis.comparison_to_target %} +
+

{% trans "Comparison to Target" %}

+

{{ ai_analysis.comparison_to_target }}

+
+{% endif %} +{% endif %} + + +
+
+
{% trans "Prepared By" %}
+
+
{% trans "Name & Signature" %}
+
+
+
{% trans "Reviewed By" %}
+
+
{% trans "Name & Signature" %}
+
+
+
{% trans "Approved By" %}
+
+
{% trans "Name & Signature" %}
+
+
+ + + + + + diff --git a/templates/appreciation/appreciation_detail.html b/templates/appreciation/appreciation_detail.html index b630db7..eca7e90 100644 --- a/templates/appreciation/appreciation_detail.html +++ b/templates/appreciation/appreciation_detail.html @@ -62,15 +62,26 @@ {% else %}bg-slate-100 text-slate-600{% endif %}"> {{ appreciation.get_status_display }} + {% if can_send %} + + {% trans "Not Sent to Dept" %} + + {% endif %}

{% trans "Appreciation Detail" %}

- - {{ appreciation.created_at|date:"Y-m-d H:i" }} — {{ appreciation.hospital.name }} - +
+ + {% trans "PDF" %} + + + {{ appreciation.created_at|date:"Y-m-d H:i" }} — {{ appreciation.hospital.get_localized_name }} + +
@@ -151,7 +162,7 @@

{{ appreciation.get_recipient_name }}

{% if appreciation.department %} -

{{ appreciation.department.name }}

+

{{ appreciation.department.get_localized_name }}

{% endif %}
@@ -279,7 +290,7 @@
@@ -288,7 +299,7 @@ @@ -297,7 +308,7 @@ @@ -312,53 +323,25 @@ {% if can_send %}

- {% trans "Send Appreciation" %} + {% trans "Send to Department" %}

-
- {% csrf_token %} -

{% trans "Configure recipients and customize the message before sending." %}

-
-
-
-

{% trans "Notify Manager" %}

-
- -
-
-
-

{% trans "Notify Dept" %}

-
- -
-
-
- - -
-
- - -
- -
+

{% trans "Route this appreciation to a department or a specific person for acknowledgment." %}

+
{% endif %} +{% include "components/send_to_modal.html" with users=send_to_users departments=hospital_departments %} + -{% include "components/send_to_modal.html" with users=send_to_users departments=hospital_departments email_subject=send_to_email_subject email_body=send_to_email_body %} -{% include "components/department_response_modal.html" %} - {% endblock %} diff --git a/templates/complaints/complaint_detail_ds.html b/templates/complaints/complaint_detail_ds.html new file mode 100644 index 0000000..ef89c00 --- /dev/null +++ b/templates/complaints/complaint_detail_ds.html @@ -0,0 +1,1503 @@ +{% extends 'layouts/base.html' %} +{% load i18n %} +{% load static %} +{% get_current_language as LANG %} + +{% block title %}{{ complaint.reference_number }} - PX360{% endblock %} + +{% block extra_css %} + +{% endblock %} + +{% block content %} + + + +
+
+ {% trans "Cases" %} + + {{ complaint.reference_number }} + + {{ complaint.get_status_display }} + + {% if not complaint.sent_to_any_department %} + + {% trans "Not Sent to Dept" %} + + {% endif %} +
+ {% if complaint.source_complaint.exists %} + {% with sc=complaint.source_complaint.first %} +
+ +

+ {% trans "Converted from source complaint" %} + {{ sc.reference_number }} + {% if sc.px_source %}({{ sc.px_source.get_localized_name }}){% endif %} +

+
+ {% endwith %} + {% endif %} + {% if complaint.reopened_from %} + + {% endif %} + {% if complaint.reopenings.exists %} +
+ +

+ {% trans "This complaint has been reopened as" %}: + {% for r in complaint.reopenings.all %} + {{ r.reference_number|default:r.pk }}{% if not forloop.last %}, {% endif %} + {% endfor %} +

+
+ {% endif %} +
+

{{ complaint.title }}

+
+ {% comment %} + {% trans "PDF View" %} + {% endcomment %} + {% if can_edit and complaint.is_active_status and complaint.assigned_to == current_user %} + + {% endif %} +
+
+
+ + +{% if not workflow_steps.cancelled %} +
+
+ +
+
+ +
+ {% trans "Created" %} +
+
+ + +
+ {% if workflow_steps.activated %} +
+ {% else %} +
+ {% endif %} + {% trans "Activate" %} +
+
+ + +
+ {% if workflow_steps.sent_to_department %} +
+ {% elif workflow_steps.activated %} +
+ {% else %} +
+ {% endif %} + {% trans "Send to Dept" %} +
+
+ + +
+ {% if workflow_steps.department_responded %} +
+ {% elif workflow_steps.sent_to_department %} +
+ {% else %} +
+ {% endif %} + {% trans "Response" %} +
+
+ + +
+ {% if workflow_steps.resolved %} +
+ {% elif workflow_steps.department_responded %} +
+ {% else %} +
+ {% endif %} + {% trans "Resolve" %} +
+
+ + + {% if complaint.is_active_status and can_edit %} + {% if not workflow_steps.activated %} +
+
+
+

{% trans "Activate this complaint" %}

{% trans "Assign it to yourself to start working on it" %}

+
+
{% csrf_token %} + +
+
+ {% elif not workflow_steps.sent_to_department %} +
+
+
+

{% trans "Send to department" %}

{% trans "Notify the champion and manager to collect their response" %}

+
+ +
+ {% elif not workflow_steps.department_responded %} +
+
+

{% trans "Awaiting department response" %}

{% trans "The department champion and manager have been notified. You'll be notified when they respond." %}

+
+ {% elif not workflow_steps.resolved %} +
+
+
+

{% trans "Resolve this complaint" %}

{% trans "The department has responded. Review and close the complaint." %}

+
+ +
+ {% endif %} + {% elif workflow_steps.resolved %} + {% if complaint.satisfaction %} + +
+
+
+

{% trans "Complaint resolved" %}

+

{% trans "This complaint has been successfully resolved." %}

+
+ {% if complaint.resolution_outcome %} + + {% trans "Outcome:" %} {{ complaint.get_resolution_outcome_display }} + + {% endif %} + {% if complaint.resolution_sent_at %} + + + {% trans "Sent to patient" %} + + {% endif %} + + {% if complaint.satisfaction == 'satisfied' %} + {% elif complaint.satisfaction == 'neutral' %} + {% elif complaint.satisfaction == 'dissatisfied' %} + {% else %}{% endif %} + {% if complaint.satisfaction_locked_by_patient %}{% endif %} + {% if complaint.satisfaction_locked_by_patient %}{% trans "Patient (locked):" %}{% else %}{% trans "Patient:" %}{% endif %} {{ complaint.get_satisfaction_display }} + + {% if complaint.satisfaction_set_at %} + {{ complaint.satisfaction_set_at|date:"Y-m-d H:i" }} + {% endif %} +
+
+
+ {% else %} + +
+
+
+
+

{% trans "Record patient satisfaction" %}

+

{% trans "Call the patient to confirm resolution, then capture their satisfaction level." %}

+
+
+ +
+ {% endif %} + {% endif %} +
+{% endif %} + + + + + +
+ + +
+ + +
+
+ {% if complaint.description %} +
+ +

{% trans "Description" %}

+
+

{{ complaint.description }}

+ {% endif %} + +
+ +
+
+ + {% trans "Location" %} + {% if can_manage_actions and complaint.is_active_status %} + + {% endif %} +
+
+ {% if complaint.department or complaint.location_type or complaint.area or complaint.section %} + {% if complaint.department %}{{ complaint.department.get_localized_name }}{% else %}-{% endif %} + {% if complaint.location_type %} + {{ complaint.get_location_type_display }} + {% endif %} + {% if complaint.area %}· {% trans "Area" %}: {% if LANG == 'ar' and complaint.area.name_ar %}{{ complaint.area.name_ar }}{% else %}{{ complaint.area.name_en }}{% endif %}{% endif %} + {% if complaint.department and complaint.department.category %}· {% trans "Category" %}: {{ complaint.department.get_category_display }}{% endif %} + {% if complaint.section %}· {% trans "Section" %}: {{ complaint.section.get_localized_name }}{% endif %} + {% if complaint.zone %}· {% trans "Zone" %}: {{ complaint.zone }}{% endif %} + {% if complaint.floor %}· {% trans "Floor" %}: {{ complaint.floor }}{% endif %} + {% else %} + {% if complaint.legacy_location %}{{ complaint.legacy_location.name_en }}{% else %}-{% endif %} + {% if complaint.legacy_main_section %}{{ complaint.legacy_main_section.name_en }}{% if complaint.legacy_subsection %} > {{ complaint.legacy_subsection.name_en }}{% endif %}{% endif %} + {% endif %} +
+
+ +
+
+ + {% trans "Severity" %} +
+
+ {{ complaint.get_severity_display }} +
+
+ +
+
+ + {% trans "Classification" %} +
+
+ {% if complaint.ai_brief_en %} + {% if LANG == 'ar' and complaint.ai_brief_ar %}{{ complaint.ai_brief_ar }}{% else %}{{ complaint.ai_brief_en }}{% endif %} + {% else %}-{% endif %} +
+
+ +
+
+ + {% trans "Created" %} +
+
{{ complaint.created_at|date:"d M Y, h:i A" }}
+
+ +
+
+ + {% trans "Deadline" %} +
+
+ {{ complaint.due_at|date:"d M Y, h:i A" }} + {% if complaint.is_overdue %} + {% trans "Overdue" %} + {% endif %} + {% if complaint.due_at and complaint.status != 'resolved' and complaint.status != 'closed' and complaint.status != 'cancelled' %} +

+

+ {% elif complaint.sla_is_overdue_display %} +

{{ complaint.sla_is_overdue_display }}

+ {% endif %} +
+
+
+ + {% if complaint.domain or complaint.category or complaint.subcategory_obj or complaint.classification_obj %} +
+ {% trans "Taxonomy" %}: + {% if complaint.domain %}{{ complaint.domain.get_localized_name }}{% endif %} + {% if complaint.category %}{{ complaint.category.get_localized_name }}{% endif %} + {% if complaint.subcategory_obj %}{{ complaint.subcategory_obj.get_localized_name }}{% endif %} + {% if complaint.classification_obj %}{{ complaint.classification_obj.get_localized_name }}{% endif %} +
+ {% endif %} + + {% if complaint.source %} +
+ {% trans "Source" %}: + {{ complaint.source.get_localized_name }} +
+ {% endif %} + + {% if complaint.escalated_at %} +
+ +
+

{% trans "Escalated" %}

+

{% trans "Escalated on" %} {{ complaint.escalated_at|date:"d M Y, h:i A" }}

+
+
+ {% endif %} + + {% if complaint.status == 'ovr_pending' %} +
+
+ OVR + {% trans "Pending Approval" %} +
+

{% trans "OVR escalation requested. Please review and approve or reject." %}

+ {% if request.user.is_px_admin or request.user.is_hospital_admin or request.user.is_px_management %} +
+
+ {% csrf_token %} + +
+
+ {% csrf_token %} + +
+
+ {% else %} +

{% trans "Waiting for admin approval." %}

+ {% endif %} +
+ {% endif %} + + {% if complaint.expected_result %} +
+

{% trans "Expected Result" %}

+

{{ complaint.expected_result }}

+
+ {% endif %} + + {% if complaint.patient %} +
+ + {{ complaint.patient.get_full_name }} + | + {% trans "MRN:" %} {{ complaint.patient.mrn|default:"-" }} + {% if complaint.patient.phone %} + | + {{ complaint.patient.phone }} + {% endif %} +
+ {% endif %} +
+ {% if complaint.activated_at %} + {% include "complaints/partials/pdf_summary_panel.html" %} + {% else %} +
+
+ +
+

{% trans "PDF Report" %}

+

{% trans "Activate this complaint to enable PDF report generation." %}

+
+ {% endif %} +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + +
+

{% trans "Quick Actions" %}

+
+ {% if can_edit and complaint.is_active_status %} + {% if can_manage_actions or complaint.assigned_to == current_user %} + + {% endif %} + +
+ {% csrf_token %} + +
+ + {% if complaint.assigned_to == current_user or can_manage_actions %} + + + + +
+ {% csrf_token %} + +
+ + + {% else %} + + {% if can_manage_actions %} +
+ {% csrf_token %} + + +
+ {% else %} +
+ +

{% trans "Activate this complaint to perform actions" %}

+
+ {% endif %} + {% endif %} + {% elif complaint.status == 'resolved' or complaint.status == 'closed' %} + {% if can_edit %} +
+ {% csrf_token %} + + +
+ {% if current_user.is_px_admin or current_user.is_hospital_admin or complaint.assigned_to == current_user %} + + {% endif %} + {% endif %} + {% else %} +
+ {% trans "No actions available for this status" %} +
+ {% endif %} + {% if current_user.is_px_admin or current_user.is_hospital_admin %} +
+
+ {% csrf_token %} + +
+
+ {% endif %} +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +{% endblock %} + +{% block extra_js %} + +{% endblock %} diff --git a/templates/complaints/complaint_explanation_pdf.html b/templates/complaints/complaint_explanation_pdf.html new file mode 100644 index 0000000..7d730ec --- /dev/null +++ b/templates/complaints/complaint_explanation_pdf.html @@ -0,0 +1,194 @@ + + + + + تقرير الشكوى - {{ complaint.reference_number }} + + + + +
+ {% include "complaints/partials/pdf_letterhead_header.html" %} +
+ +
+ + + + + + + + + + + + + + {% if staff_title %} + + + + + + + {% endif %} +
رقم الشكوى{{ complaint.reference_number }}تاريخ الإرسال{{ sent_date }}
القسم{{ department_name|default:"—" }}الموظف المشكو عليه{{ staff_name|default:"—" }}
الوظيفة{{ staff_title }}
+ + + + + +
{{ complaint.description }}
+
+ + {% include "complaints/partials/pdf_letterhead_footer.html" %} +
+ + + diff --git a/templates/complaints/complaint_list.html b/templates/complaints/complaint_list.html index 0725df1..bcaad45 100644 --- a/templates/complaints/complaint_list.html +++ b/templates/complaints/complaint_list.html @@ -300,11 +300,6 @@ {% else %}bg-slate-100 text-slate-600{% endif %}"> {{ complaint.get_status_display }} - {% if complaint.patient_contact_status == 'contacted' %} - {% trans "Contacted" %} - {% elif complaint.patient_contact_status == 'contacted_no_response' %} - {% trans "No Response" %} - {% endif %} {% if complaint.due_at and complaint.status != 'resolved' and complaint.status != 'closed' and complaint.status != 'cancelled' %} diff --git a/templates/complaints/complaint_pdf.html b/templates/complaints/complaint_pdf.html index 6d75e05..bc1a6dc 100644 --- a/templates/complaints/complaint_pdf.html +++ b/templates/complaints/complaint_pdf.html @@ -1,786 +1,330 @@ {% load i18n %} - + - - {% trans "Complaint Report" %} - {{ complaint.reference_number }} + تقرير الشكوى - {{ complaint.reference_number }} - -
-

{{ complaint.title }}

-
-
- {% trans "Ref:" %} {{ complaint.reference_number }} -
-
- {% trans "Status:" %} - {{ complaint.get_status_display }} -
-
- {% trans "Severity:" %} - {{ complaint.get_severity_display }} -
-
- {% trans "Priority:" %} {{ complaint.get_priority_display }} -
-
-
- -
-

👤 {% trans "Patient Information" %}

-
-
-
{% trans "Patient Name" %}
-
- {% if complaint.patient %} - {{ complaint.patient.get_full_name }} - {% else %} - {{ complaint.contact_name|default:"Anonymous" }} - {% endif %} -
-
-
-
{% trans "MRN / National ID" %}
-
- {% if complaint.patient %} - {{ complaint.patient.mrn }} - {% else %} - {{ complaint.national_id|default:"N/A" }} - {% endif %} -
-
-
-
{% trans "Hospital" %}
-
{{ complaint.hospital.name }}
-
-
-
{% trans "Department" %}
-
{{ complaint.department.name|default:"Not Assigned" }}
-
-
-
{% trans "Location" %}
-
- {% if complaint.legacy_location %}{{ complaint.legacy_location.name }}{% endif %} - {% if complaint.legacy_main_section %} / {{ complaint.legacy_main_section.name }}{% endif %} - {% if complaint.legacy_subsection %} / {{ complaint.legacy_subsection.name }}{% endif %} -
-
-
-
{% trans "Incident Date" %}
-
{{ complaint.incident_date|date:"M d, Y"|default:"Not Specified" }}
-
-
-
+
+ {% include "complaints/partials/pdf_letterhead_header.html" %} +
- -
-

📝 {% trans "Complaint Details" %}

-
-
-
{% trans "Category" %}
-
{{ complaint.get_category_display|default:"Not Categorized" }}
-
-
-
{% trans "Source" %}
-
{{ complaint.get_source_display }}
-
-
-
{% trans "Created Date" %}
-
{{ complaint.created_at|date:"M d, Y H:i" }}
-
-
-
{% trans "SLA Deadline" %}
-
{{ complaint.due_at|date:"M d, Y H:i" }}
-
-
- -
-
{% trans "Description" %}
- {{ complaint.description|linebreaks }} -
- - {% if complaint.expected_result %} -
-
{% trans "Patient Expected Result" %}
- {{ complaint.expected_result|linebreaks }} -
- {% endif %} -
+
+
تقرير الشكوى
- - {% if complaint.staff %} -
-

👨‍⚕️ {% trans "Staff Assignment" %}

-
-
{{ complaint.staff.first_name|first|upper }}
-
-
{{ complaint.staff.get_full_name }}
-
- {% if complaint.staff.job_title %}{{ complaint.staff.job_title }}{% endif %} - {% if complaint.staff.department %} | {{ complaint.staff.department.name }}{% endif %} -
- {% if complaint.staff.report_to %} -
- {% trans "Reports to:" %} {{ complaint.staff.report_to.get_full_name }} -
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
رقم الشكوى{{ complaint.reference_number }}الحالة{{ complaint.get_status_display }}
العنوان{{ complaint.title }}نوع الشكوى{{ complaint.get_complaint_type_display }}
القسم{% if complaint.department %}{{ complaint.department.name_ar|default:complaint.department.name_en }}{% else %}—{% endif %}الخطورة{{ complaint.get_severity_display }}
الموظف المشكو عليه{% if complaint.staff %}{{ complaint.staff.get_full_name }}{% else %}—{% endif %}جهة الادعاء{% if complaint.source %}{{ complaint.source.name_ar|default:complaint.source.name_en }}{% else %}—{% endif %}
تاريخ التقديم{{ complaint.created_at|date:"Y/m/d H:i" }}تاريخ الحادثة{% if complaint.incident_date %}{{ complaint.incident_date|date:"Y/m/d" }}{% else %}—{% endif %}
+ + +
مختصر الشكوى
+ + + + +
{{ complaint.description }}
+ + + {% if complaint.patient %} +
بيانات المريض
+ + + + + + + +
اسم المريض{{ complaint.patient.get_full_name }}رقم الملف{{ complaint.patient.mrn|default:"—" }}
+ {% endif %} + + + {% if complaint.contact_name or complaint.contact_phone %} +
بيانات مقدم الشكوى
+ + + + + + + +
الاسم{{ complaint.contact_name|default:"—" }}الهاتف{{ complaint.contact_phone|default:"—" }}
+ {% endif %} + + + {% if complaint.involved_departments.exists %} +
ردود الأقسام
+ {% for dept in complaint.involved_departments.all %} + + + + + + + + {% if dept.response_notes %} + + + {% endif %} - +
القسم{{ dept.department.name_ar|default:dept.department.name_en }}تاريخ الرد{% if dept.response_submitted_at %}{{ dept.response_submitted_at|date:"Y/m/d H:i" }}{% else %}—{% endif %}
{{ dept.response_notes }}
+ {% endfor %} + {% endif %} + + + {% if explanations %} +
الردود المباشرة
+ {% for exp in explanations %} + {% if exp.explanation %} + + + + + + + + + + +
الموظف{{ exp.staff.get_full_name|default:"—" }}تاريخ الرد{% if exp.responded_at %}{{ exp.responded_at|date:"Y/m/d H:i" }}{% else %}—{% endif %}
{{ exp.explanation }}
+ {% endif %} + {% endfor %} + {% endif %} + + + {% if complaint.resolution %} +
الحل
+ + + + +
{{ complaint.resolution }}
+ {% endif %} + + + {% if timeline %} +
السجل الزمني
+ + {% for update in timeline %} + + + + + {% endfor %} +
{{ update.created_at|date:"Y/m/d H:i" }}{{ update.message }}
+ {% endif %} +
+ + {% include "complaints/partials/pdf_letterhead_footer.html" %}
- {% endif %} - - {% if explanations %} -
-

💬 {% trans "Send To Department" %}

- {% for exp in explanations %} -
-
-
-
- {% if exp.staff.get_full_name %}{{ exp.staff.get_full_name }}{% else %}{% trans "Unknown Staff" %}{% endif %} - {% if exp.metadata.is_escalation %} - ({% trans "Manager - Escalated" %}) - {% endif %} -
-
- {% if exp.submitted_via == 'email_link' %}{% trans "Via Email Link" %}{% else %}{% trans "Direct Entry" %}{% endif %} - | {% trans "Submitted:" %} {{ exp.responded_at|date:"M d, Y H:i" }} -
-
- {% if exp.is_used %} - {% if exp.acceptance_status == 'acceptable' %} - ✓ {% trans "Acceptable" %} - {% elif exp.acceptance_status == 'not_acceptable' %} - ✗ {% trans "Not Acceptable" %} - {% else %} - ⏳ {% trans "Pending Review" %} - {% endif %} - {% else %} - ⏳ {% trans "Awaiting Response" %} - {% endif %} -
- - {% if exp.is_used and exp.explanation %} -
- {{ exp.explanation|linebreaks }} -
- - {% if exp.acceptance_notes %} -
- {% trans "Review Notes:" %} {{ exp.acceptance_notes }} -
- {% endif %} - -
- {% if exp.accepted_by %} - {% trans "Reviewed by" %} {{ exp.accepted_by.get_full_name }} {% trans "on" %} {{ exp.accepted_at|date:"M d, Y" }} - {% endif %} - {% if exp.attachments.count > 0 %} - | {% blocktrans count counter=exp.attachments.count %}{{ counter }} attachment{% plural %}{{ counter }} attachments{% endblocktrans %} - {% endif %} -
- {% else %} -
- {% trans "Explanation not yet submitted." %} {% trans "Request sent on" %} {{ exp.email_sent_at|date:"M d, Y" }} -
- {% endif %} -
- {% endfor %} -
- {% endif %} - - - {% if complaint.short_description_en or complaint.suggested_action_en or complaint.emotion %} -
-

🤖 {% trans "AI Analysis" %}

-
- {% if complaint.emotion %} -
-
{% trans "Emotion Analysis" %}
-
- - {{ complaint.get_emotion_display }} - - - {% trans "Confidence:" %} {{ complaint.emotion_confidence|floatformat:0 }}% - -
-
- {% trans "Intensity" %} -
-
-
- {{ complaint.emotion_intensity|floatformat:2 }} -
-
- {% endif %} - - {% if complaint.short_description_en %} -
-
{% trans "AI Summary" %}
-
{{ complaint.short_description_en }}
- {% if complaint.short_description_ar %} -
- {{ complaint.short_description_ar }} -
- {% endif %} -
- {% endif %} - - {% if complaint.suggested_action_en %} -
-
💡 {% trans "Suggested Action" %}
-
{{ complaint.suggested_action_en }}
- {% if complaint.suggested_action_ar %} -
- {{ complaint.suggested_action_ar }} -
- {% endif %} -
- {% endif %} - - {% if complaint.reasoning_en %} -
-
{% trans "AI Reasoning" %}
-
{{ complaint.reasoning_en }}
-
- {% endif %} -
-
- {% endif %} - - - {% if px_actions %} -
-

{% trans "Related PX Actions" %}

- {% for action in px_actions %} -
-
{{ action.title }}
-
- {% trans "Status:" %} {{ action.get_status_display }} | - {% trans "Priority:" %} {{ action.get_priority_display }} | - {% trans "Created:" %} {{ action.created_at|date:"M d, Y" }} -
-
- {% endfor %} -
- {% endif %} - - - {% if complaint.resolution %} -
-

{% trans "Resolution" %}

-
-
- - {% trans "Complaint Resolved" %} -
-
- {{ complaint.resolution|linebreaks }} -
- {% if complaint.resolution_category %} -
- {% trans "Category:" %} {{ complaint.get_resolution_category_display }} -
- {% endif %} -
- {% trans "Resolved by:" %} {{ complaint.resolved_by.get_full_name|default:"N/A" }} -
- {% trans "Resolved on:" %} {{ complaint.resolved_at|date:"F d, Y at H:i"|default:"N/A" }} -
-
-
- {% endif %} - - - {% if timeline %} -
-

📋 {% trans "Recent Activity" %}

- {% for update in timeline %} -
-
{{ update.created_at|date:"M d, Y H:i" }}
-
{{ update.message }}
- {% if update.created_by %} -
{% trans "by" %} {{ update.created_by.get_full_name }}
- {% endif %} -
- {% endfor %} -
- {% endif %} - - - diff --git a/templates/complaints/complaint_review_pdf.html b/templates/complaints/complaint_review_pdf.html new file mode 100644 index 0000000..c6575a0 --- /dev/null +++ b/templates/complaints/complaint_review_pdf.html @@ -0,0 +1,105 @@ + + + + + مراجعة الردود - {{ complaint.reference_number }} + + + + +
+ {% include "complaints/partials/pdf_letterhead_header.html" %} +
+ +
+
مراجعة ردود الموظفين
+ + + + + + + + +
رقم الشكوى{{ complaint.reference_number }}العنوان{{ complaint.title }}
+ + + + + +
{{ complaint.description }}
+ + {% for sd in staff_data %} +
+
+ {{ sd.staff.get_full_name }} + {% if sd.is_completed %} + تم الرد + {% else %} + بانتظار الرد + {% endif %} +
+ {% if sd.qa_pairs %} + + {% for qa in sd.qa_pairs %} + + + + + {% endfor %} +
{{ qa.question }} + {% if qa.question_type == 'yes_no' %} + {% if qa.answer == 'yes' %}نعم + {% elif qa.answer == 'no' %}لا + {% else %}—{% endif %} + {% else %} + {{ qa.answer|default:"—" }} + {% endif %} +
+ {% endif %} +
+ {% endfor %} +
+ + {% include "complaints/partials/pdf_letterhead_footer.html" %} +
+ + + diff --git a/templates/complaints/complaint_summary_pdf.html b/templates/complaints/complaint_summary_pdf.html index 8c5a950..8a12175 100644 --- a/templates/complaints/complaint_summary_pdf.html +++ b/templates/complaints/complaint_summary_pdf.html @@ -36,28 +36,37 @@ /* === Header === */ .page-header { - padding: 12mm 15mm 0 15mm; + position: relative; + height: 22mm; + margin: 8mm 20mm 0 20mm; } - .header-content { - display: flex; - align-items: center; - justify-content: space-between; - padding: 0 15mm; + .header-ar { + position: absolute; + left: 0; + top: 4mm; + text-align: left; } - .header-side { - width: 50%; + .header-logo-wrap { + position: absolute; + left: 50%; + top: 0; + transform: translateX(-50%); + text-align: center; } - .header-side--ar { + .header-en { + position: absolute; + right: 0; + top: 4mm; text-align: right; - direction: rtl; } .header-logo { - width: 90px; + width: 55px; height: auto; object-fit: contain; } .header-hospital-name { font-size: 14px; + font-weight: 700; color: var(--blue); } .header-branch { @@ -66,7 +75,9 @@ } .header-cr { font-size: 9px; - color: var(--muted); + font-weight: 700; + color: var(--blue); + text-align: center; } .header-line { height: 2px; @@ -85,7 +96,7 @@ z-index: 0; } .watermark img { - width: 180px; + width: 300px; height: auto; } @@ -129,41 +140,38 @@ padding: 10px 0 16px 0; } - .form-section-header { - font-size: 12px; - color: var(--blue); + .data-table { + width: 100%; + border-collapse: collapse; + margin-top: 12px; + } + .data-table th { background: var(--surface); + color: var(--blue); + font-size: 12px; padding: 6px 12px; border-right: 3px solid var(--blue); - margin-top: 12px; - margin-bottom: 2px; + border-left: 1px solid var(--border); + border-top: 1px solid var(--border); + text-align: right; } - - .form-row { - display: flex; - border-bottom: 1px solid var(--border); - } - .form-row:last-child { - border-bottom: none; - } - .form-label { - width: 35%; - padding: 8px 12px; + .data-table td { + border: 1px solid var(--border); font-size: 11px; - color: var(--body); + padding: 8px 12px; + } + .data-table .lbl { background: var(--surface); + color: var(--body); + font-weight: 700; + width: 15%; } - .form-value { - width: 65%; - padding: 8px 12px; - font-size: 11px; + .data-table .val { color: var(--ink); + width: 35%; } - - .form-text-block { + .data-table .text-cell { padding: 12px; - font-size: 11px; - color: var(--ink); line-height: 2; text-align: justify; } @@ -201,60 +209,45 @@
نموذج الشكوى
-
بيانات المشفى
-
-
رقم الملف
-
{{ complaint.reference_number|default:"—" }}
-
-
-
الاسم
-
{{ complainant_name|default:"—" }}
-
-
-
جهة الادعاء
-
{{ source_name|default:"—" }}
-
-
-
تاريخ تقديم الشكوى
-
{{ submission_date }}
-
-
-
تاريخ الحادثة
-
{{ incident_date }}
-
-
-
رقم الحالة
-
{{ complaint.reference_number|default:"—" }}
-
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
رقم الملف{{ complaint.reference_number|default:"—" }}الاسم{{ complainant_name|default:"—" }}
جهة الادعاء{{ source_name|default:"—" }}تاريخ التقديم{{ submission_date }}
تاريخ الحادثة{{ incident_date }}رقم الحالة{{ complaint.reference_number|default:"—" }}
القسم{{ department_name|default:"—" }}الموظف المشكو عليه{{ accused_staff_name|default:"—" }}
الوظيفة{{ accused_staff_title|default:"—" }}تاريخ الإرسال{{ sent_to_dept_date }}
-
بيانات المشفى
-
-
القسم
-
{{ department_name|default:"—" }}
-
-
-
اسم الموظف
-
{{ accused_staff_name|default:"—" }}
-
-
-
الوظيفة
-
{{ accused_staff_title|default:"—" }}
-
-
-
تاريخ إرسال الشكوى
-
{{ sent_to_dept_date }}
-
- -
مختصر الشكوى
-
- {{ content_summary }} -
- -
-
قسم علاقات المرضى
-
-
التوقيع والختم
-
+ + + + + +
مختصر الشكوى
{{ content_summary }}
{% include "complaints/partials/pdf_letterhead_footer.html" %} @@ -268,42 +261,33 @@
نموذج رد الشكوى
-
بيانات رد الشكوى
-
-
اسم الموظف
-
{{ accused_staff_name|default:"—" }}
-
-
-
الوظيفة
-
{{ accused_staff_title|default:"—" }}
-
-
-
القسم
-
{{ department_name|default:"—" }}
-
-
-
تاريخ رد الشكوى
-
{{ response_date }}
-
-
-
تاريخ إرسال الشكوى
-
{{ sent_to_dept_date }}
-
+ + + + + + + + + + + + + + + + + + + +
الموظف المشكو عليه{{ accused_staff_name|default:"—" }}الوظيفة{{ accused_staff_title|default:"—" }}
القسم{{ department_name|default:"—" }}تاريخ الرد{{ response_date }}
تاريخ الإرسال{{ sent_to_dept_date }}
-
مختصر الرد
-
- {% if dept_response_summary %} - {{ dept_response_summary }} - {% else %} - لم يتم تسجيل رد من القسم بعد. - {% endif %} -
- -
-
قسم علاقات المرضى
-
-
التوقيع والختم
-
+ + + + + +
مختصر الرد
{% if dept_response_summary %}{{ dept_response_summary }}{% else %}لم يتم تسجيل رد من القسم بعد.{% endif %}
{% include "complaints/partials/pdf_letterhead_footer.html" %} diff --git a/templates/complaints/complaint_threshold_form.html b/templates/complaints/complaint_threshold_form.html index 8ed5c90..7ef5406 100644 --- a/templates/complaints/complaint_threshold_form.html +++ b/templates/complaints/complaint_threshold_form.html @@ -174,7 +174,7 @@ {% for hospital in form.hospital.field.queryset %} {% endfor %} diff --git a/templates/complaints/escalation_rule_form.html b/templates/complaints/escalation_rule_form.html index b230ec9..4171bc3 100644 --- a/templates/complaints/escalation_rule_form.html +++ b/templates/complaints/escalation_rule_form.html @@ -189,7 +189,7 @@ {% for hospital in form.hospital.field.queryset %} {% endfor %} diff --git a/templates/complaints/explanation_already_submitted.html b/templates/complaints/explanation_already_submitted.html index d52d774..58b1a8c 100644 --- a/templates/complaints/explanation_already_submitted.html +++ b/templates/complaints/explanation_already_submitted.html @@ -8,6 +8,7 @@ {% trans "Already Submitted" %} - PX360 + - +
- -
-
- -
-

{% trans "Submit Your Explanation" %}

-

{% trans "PX360 Complaint Management System" %}

+ + + {% if complaint.department %} + ← {% trans "Back to Department" %} + {% endif %} + + +
+ Al Hammadi Hospital
- -
+ +
+ +
+
+ + {{ complaint.get_status_display }} + + {{ complaint.reference_number }} +
+ + + {% trans "PDF" %} + +
+

{{ complaint.title }}

+ + +
+

{% trans "Description" %}

+

{{ complaint.description }}

+ {% if complaint.short_description_en and complaint.short_description_en != complaint.description %} +

{{ complaint.short_description_en }}

+ {% endif %} +
+ {% if error %} -
-
- -

{{ error }}

-
+
+

{{ error }}

{% endif %} +
- - {% if explanation.staff %} -
-

- - {% trans "Requested From" %} -

-
-
- {{ explanation.staff.first_name|first }}{{ explanation.staff.last_name|first }} -
-
-

{{ explanation.staff.first_name }} {{ explanation.staff.last_name }}

-
- - - {% trans "ID:" %} {{ explanation.staff.employee_id }} - - {% if explanation.staff.department %} - - - {{ explanation.staff.department.name }} - - {% endif %} - {% if explanation.staff.job_title %} - - - {{ explanation.staff.job_title }} - - {% endif %} -
-
-
+ {% if explanation.request_message %} +
+ +
+

{% trans "Note from PX Team" %}

+

{{ explanation.request_message }}

- {% endif %} +
+ {% endif %} - - {% if original_explanation %} -
-
-
- -
-

{% trans "Original Staff Explanation" %}

+ {% if explanation.attachments.exists %} +
+

{% trans "Attached Documents" %}

+ +
+ {% endif %} + + +
+

{% trans "How would you like to respond?" %}

+
+ + {% if investigate_url %} + + {% endif %} +
+
+ + +