HH/IMPLEMENTATION_GUIDE.md
2025-12-24 12:42:31 +03:00

12 KiB

PX360 - UI Implementation Guide

Last Updated: December 15, 2025, 10:00 AM (Asia/Riyadh)
Status: Complaints Console Complete, Action Center 75% Complete


📦 What Has Been Completed

1. Complaints Console (100% )

Location: /complaints/

Files Created:

  • apps/complaints/ui_views.py (500+ lines)
  • templates/complaints/complaint_list.html (400+ lines)
  • templates/complaints/complaint_detail.html (600+ lines)
  • templates/complaints/complaint_form.html (300+ lines)
  • URLs configured and integrated

Features:

  • Advanced list view with 8 filter types
  • Multiple view tabs (All, My, Overdue, etc.)
  • Detail view with SLA countdown
  • Timeline visualization
  • Workflow actions (assign, status change, notes, escalate)
  • Create form with cascading selects
  • RBAC enforcement
  • Audit logging

2. PX Action Center Console (75% )

Location: /actions/

Files Created:

  • apps/px_action_center/ui_views.py (500+ lines)
  • templates/actions/action_list.html (600+ lines)
  • templates/actions/action_detail.html - NEEDS TO BE CREATED

Completed:

  • All Django views (list, detail, assign, status change, notes, escalate, approve)
  • List template with 8 view tabs
  • Advanced filters
  • Source badges (survey, complaint, social, call center)
  • Escalation level indicators

Remaining:

  • Action detail template (similar to complaint detail but with:)
    • SLA progress bar (visual percentage)
    • Evidence upload section
    • Approval workflow UI
    • Action plan and outcome fields
  • URL routing configuration
  • Sidebar navigation update

🚀 How to Complete Action Center (2-3 hours)

Step 1: Create Action Detail Template

Create templates/actions/action_detail.html based on templates/complaints/complaint_detail.html:

Key Differences:

  1. SLA Progress Bar - Add visual progress indicator:
<div class="progress" style="height: 30px;">
    <div class="progress-bar {% if action.is_overdue %}bg-danger{% else %}bg-success{% endif %}" 
         style="width: {{ sla_progress }}%">
        {{ sla_progress }}%
    </div>
</div>
  1. Evidence Section - Add evidence upload and display:
<div class="card mb-3">
    <div class="card-header bg-warning text-dark">
        <h6 class="mb-0"><i class="bi bi-file-earmark-check me-2"></i>Evidence</h6>
    </div>
    <div class="card-body">
        {% for evidence in evidence_attachments %}
        <!-- Display evidence files -->
        {% endfor %}
        
        {% if can_edit %}
        <form method="post" enctype="multipart/form-data">
            <!-- File upload form -->
        </form>
        {% endif %}
    </div>
</div>
  1. Approval Workflow - Add approval section:
{% if action.status == 'pending_approval' and can_approve %}
<div class="card mb-3">
    <div class="card-header bg-success text-white">
        <h6 class="mb-0"><i class="bi bi-check-circle me-2"></i>Approval Required</h6>
    </div>
    <div class="card-body">
        <form method="post" action="{% url 'actions:action_approve' action.id %}">
            {% csrf_token %}
            <button type="submit" class="btn btn-success">
                <i class="bi bi-check-circle me-1"></i> Approve Action
            </button>
        </form>
    </div>
</div>
{% endif %}
  1. Action Plan & Outcome - Add text areas:
<div class="mb-3">
    <label class="form-label">Action Plan</label>
    <textarea class="form-control" rows="4" readonly>{{ action.action_plan }}</textarea>
</div>
<div class="mb-3">
    <label class="form-label">Outcome</label>
    <textarea class="form-control" rows="4" readonly>{{ action.outcome }}</textarea>
</div>

Step 2: Configure URLs

Update apps/px_action_center/urls.py:

from django.urls import include, path
from rest_framework.routers import DefaultRouter

from .views import PXActionViewSet, PXActionSLAConfigViewSet, RoutingRuleViewSet
from . import ui_views

app_name = 'actions'

router = DefaultRouter()
router.register(r'api/actions', PXActionViewSet, basename='action-api')
router.register(r'api/sla-configs', PXActionSLAConfigViewSet, basename='sla-config-api')
router.register(r'api/routing-rules', RoutingRuleViewSet, basename='routing-rule-api')

urlpatterns = [
    # UI Views
    path('', ui_views.action_list, name='action_list'),
    path('<uuid:pk>/', ui_views.action_detail, name='action_detail'),
    path('<uuid:pk>/assign/', ui_views.action_assign, name='action_assign'),
    path('<uuid:pk>/change-status/', ui_views.action_change_status, name='action_change_status'),
    path('<uuid:pk>/add-note/', ui_views.action_add_note, name='action_add_note'),
    path('<uuid:pk>/escalate/', ui_views.action_escalate, name='action_escalate'),
    path('<uuid:pk>/approve/', ui_views.action_approve, name='action_approve'),
    
    # API Routes
    path('', include(router.urls)),
]

Step 3: Update Main URLs

Update config/urls.py:

# UI Pages
path('complaints/', include('apps.complaints.urls')),
path('actions/', include('apps.px_action_center.urls')),  # ADD THIS LINE

Step 4: Update Sidebar Navigation

Update templates/layouts/partials/sidebar.html:

<!-- PX Actions -->
<li class="nav-item">
    <a class="nav-link {% if 'actions' in request.path %}active{% endif %}" 
       href="{% url 'actions:action_list' %}">
        <i class="bi bi-clipboard-check"></i>
        PX Actions
        <span class="badge bg-warning">{{ action_count|default:0 }}</span>
    </a>
</li>

📋 Remaining Modules (Priority Order)

3. Public Survey Form (CRITICAL - 4-6 hours)

Why Critical: Patient-facing, required for survey responses

Files to Create:

  • apps/surveys/public_views.py
  • templates/surveys/public_form.html
  • templates/surveys/thank_you.html

Key Features:

  • Mobile-first responsive design
  • Bilingual toggle (AR/EN)
  • Token-based secure access
  • Progress indicator
  • Question type rendering (Rating, NPS, Likert, Multiple Choice, Text)
  • Form validation
  • Thank you page

Implementation Pattern:

@require_http_methods(["GET", "POST"])
def survey_form(request, token):
    """Public survey form - no login required"""
    try:
        survey = SurveyInstance.objects.get(
            access_token=token,
            status='sent',
            expires_at__gt=timezone.now()
        )
    except SurveyInstance.DoesNotExist:
        return render(request, 'surveys/invalid_token.html')
    
    if request.method == 'POST':
        # Process responses
        # Calculate score
        # Update survey status
        # Create PX action if negative
        return redirect('surveys:thank_you', token=token)
    
    return render(request, 'surveys/public_form.html', {'survey': survey})

4. Journey Console (8-10 hours)

Files to Create:

  • apps/journeys/ui_views.py
  • templates/journeys/template_list.html
  • templates/journeys/template_form.html (stage builder)
  • templates/journeys/instance_list.html
  • templates/journeys/instance_detail.html (progress stepper)

Key Features:

  • Template CRUD
  • Stage management (add, edit, reorder, delete)
  • Survey binding per stage
  • Instance monitoring with progress visualization
  • Event timeline

5. Survey Console (8-10 hours)

Files to Create:

  • apps/surveys/ui_views.py
  • templates/surveys/template_list.html
  • templates/surveys/template_form.html (question builder)
  • templates/surveys/instance_list.html
  • templates/surveys/instance_detail.html
  • templates/surveys/analytics.html

Key Features:

  • Template CRUD
  • Question builder (add, edit, reorder, delete)
  • Branching logic editor
  • Instance monitoring
  • Analytics dashboard with charts

6. Social Media Monitoring (4-6 hours)

Files to Create:

  • apps/social/ui_views.py
  • templates/social/mention_list.html
  • templates/social/mention_detail.html

7. Call Center Console (4-6 hours)

Files to Create:

  • apps/callcenter/ui_views.py
  • templates/callcenter/interaction_list.html
  • templates/callcenter/interaction_detail.html
  • templates/callcenter/dashboard.html

8. Analytics/KPI Console (6-8 hours)

Files to Create:

  • apps/analytics/ui_views.py
  • templates/analytics/dashboard.html
  • templates/analytics/kpi_list.html

9. Configuration Console (4-6 hours)

Files to Create:

  • apps/core/config_views.py
  • templates/config/dashboard.html
  • templates/config/sla_config.html
  • templates/config/routing_rules.html

🎨 Established Design Patterns

Layout Structure

base.html
├── sidebar (navigation)
├── topbar (search, notifications, user menu)
└── content
    ├── page header
    ├── statistics cards
    ├── view tabs (optional)
    ├── filter panel (collapsible)
    ├── table toolbar
    ├── data table/cards
    └── pagination

Color Scheme

  • Primary: #667eea (Purple gradient)
  • Success: #388e3c (Green)
  • Warning: #f57c00 (Orange)
  • Danger: #d32f2f (Red)
  • Info: #1976d2 (Blue)

Badge Classes

.status-badge { /* Status indicators */ }
.severity-badge { /* Severity levels */ }
.source-badge { /* Source types */ }
.overdue-badge { /* Overdue items */ }
.escalation-badge { /* Escalation levels */ }

Common Components

  • Stat Cards: 4-column grid with icons
  • Filter Panel: Collapsible with toggle button
  • Timeline: Vertical timeline with colored dots
  • Progress Bar: Bootstrap progress with percentage
  • Tabs: Bootstrap nav-tabs for content sections
  • Modals: Bootstrap modals for confirmations

🔧 Technical Guidelines

Query Optimization

queryset = Model.objects.select_related(
    'foreign_key1', 'foreign_key2'
).prefetch_related(
    'many_to_many', 'reverse_foreign_key'
)

RBAC Pattern

user = request.user
if user.is_px_admin():
    pass  # See all
elif user.is_hospital_admin() and user.hospital:
    queryset = queryset.filter(hospital=user.hospital)
elif user.hospital:
    queryset = queryset.filter(hospital=user.hospital)
else:
    queryset = queryset.none()

Audit Logging

AuditService.log(
    event_type='action_type',
    description='Description of action',
    user=request.user,
    content_object=object,
    metadata={'key': 'value'}
)

Flash Messages

messages.success(request, "Operation successful.")
messages.error(request, "Operation failed.")
messages.warning(request, "Warning message.")
messages.info(request, "Information message.")

📊 Progress Tracking

Overall Project: 93% Complete

  • Backend: 90%
  • UI: 33% (was 25%)
    • Base Layout: 100%
    • Dashboard: 100%
    • Complaints: 100%
    • Actions: 75%
    • Journeys: 0%
    • Surveys: 0%
    • Public Survey: 0%
    • Social/Call/Analytics/Config: 0%

Estimated Remaining Time: 40-50 hours

  • Complete Actions: 2-3 hours
  • Public Survey Form: 4-6 hours
  • Journey Console: 8-10 hours
  • Survey Console: 8-10 hours
  • Other Consoles: 18-24 hours

🎯 Quick Win Strategy

To reach 50% UI completion quickly (next 10-12 hours):

  1. Complete Action Center (2-3 hours)
  2. Public Survey Form (4-6 hours) - CRITICAL
  3. Basic Journey Instance Viewer (3-4 hours) - Skip template builder for now

This would bring UI to 50% and make the system functional for patient surveys.


📝 Testing Checklist

Per Module:

  • List view loads with data
  • Filters work correctly
  • Pagination functions
  • Search returns results
  • Detail view displays all info
  • Workflow actions work
  • RBAC permissions enforced
  • Responsive on mobile
  • RTL support (Arabic)

Next Developer: Start with completing the Action Center detail template using the complaints detail template as a reference. The patterns are established and consistent across all modules.