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

425 lines
12 KiB
Markdown

# 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:
```html
<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>
```
2. **Evidence Section** - Add evidence upload and display:
```html
<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>
```
3. **Approval Workflow** - Add approval section:
```html
{% 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 %}
```
4. **Action Plan & Outcome** - Add text areas:
```html
<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`:
```python
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`:
```python
# 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`:
```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:**
```python
@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
```css
.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
```python
queryset = Model.objects.select_related(
'foreign_key1', 'foreign_key2'
).prefetch_related(
'many_to_many', 'reverse_foreign_key'
)
```
### RBAC Pattern
```python
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
```python
AuditService.log(
event_type='action_type',
description='Description of action',
user=request.user,
content_object=object,
metadata={'key': 'value'}
)
```
### Flash Messages
```python
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.