# elmartinipolice/gruponorus architecture

> Architecture diagram of the GitHub repository elmartinipolice/gruponorus, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-15). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/elmartinipolice/gruponorus
- Repository: https://github.com/elmartinipolice/gruponorus

## Overview

Grupo Norus is a hotel operations app for staff: sign in, view operational status, assign and track tasks, manage room stays, report SLA-bound incidents, attach photographic evidence, and receive alerts. The mobile app uses JWT-authenticated REST services for the Django backend; Django owns the domain records and exposes real-time notifications through Channels/WebSockets. The README documents the major backend domains and deployment stores. Some backend views and incident/evidence implementations were not sampled, so their internal call relationships are omitted rather than inferred.

Main entry points: [`frontend/src/services/api.js`](https://github.com/elmartinipolice/gruponorus/blob/Norus-Produccion/frontend/src/services/api.js) (JWT API Client), [`frontend/src/navigation/index.js`](https://github.com/elmartinipolice/gruponorus/blob/Norus-Produccion/frontend/src/navigation/index.js) (Role Navigation), [`frontend/App.js`](https://github.com/elmartinipolice/gruponorus/blob/Norus-Produccion/frontend/App.js) (App Entry), [`frontend/src/context/AuthContext.js`](https://github.com/elmartinipolice/gruponorus/blob/Norus-Produccion/frontend/src/context/AuthContext.js) (Auth Session)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_mobile["Mobile App"]
  node_app["App Entry<br/>[App.js]"]
  node_login["Login<br/>[LoginScreen.js]"]
  node_session["Auth Session<br/>[AuthContext.js]"]
  node_nav["Role Navigation<br/>[index.js]"]
  node_task_ui["Task Screens<br/>[TasksScreen.js]"]
  node_task_create["Task Assignment"]
  node_room_ui["Room Screens<br/>[RoomsScreen.js]"]
  node_incident_ui["Incident Screens"]
  node_dashboard["Dashboard<br/>[DashboardScreen.js]"]
  node_room_service["Room Service<br/>[roomService.js]"]
  node_task_service["Task Service<br/>[taskService.js]"]
  node_notification_context["Alert Context"]
  node_socket["WebSocket Client<br/>[socket.js]"]
end

subgraph group_api["API and Identity"]
  node_api_client["JWT API Client<br/>[api.js]"]
  node_auth_service["Auth Service<br/>[authService.js]"]
  node_users[("Users<br/>[models.py]")]
end

subgraph group_operations["Hotel Operations"]
  node_rooms[("Rooms and Stays<br/>[models.py]")]
  node_tasks[("Task Records<br/>[models.py]")]
  node_incidents[("Incident Records<br/>[models.py]")]
  node_kpis["Operations KPIs<br/>[kpis.py]"]
end

subgraph group_signals["Evidence and Alerts"]
  node_evidence[("Photo Evidence<br/>[models.py]")]
  node_notifications["Notification Service<br/>[services.py]"]
  node_consumer["Notification Consumer<br/>[consumers.py]"]
end

node_staff(("Hotel Staff"))
node_database[("MySQL / SQLite")]
node_s3[("AWS S3")]

node_staff -->|"uses"| node_app
node_app -->|"mounts"| node_session
node_app -->|"shows signed-in"| node_nav
node_app -->|"shows signed-out"| node_login
node_login -->|"submits credentials"| node_session
node_session -->|"calls"| node_auth_service
node_auth_service -->|"sends requests"| node_api_client
node_api_client -.->|"authenticates JWT"| node_users
node_nav -->|"routes to"| node_task_ui
node_nav -->|"routes to"| node_room_ui
node_nav -->|"routes to"| node_incident_ui
node_nav -->|"routes to"| node_dashboard
node_task_ui -->|"loads tasks"| node_task_service
node_task_create -->|"creates task"| node_task_service
node_task_create -->|"loads rooms"| node_room_service
node_task_service -->|"sends requests"| node_api_client
node_room_ui -.->|"uses"| node_room_service
node_room_service -->|"sends requests"| node_api_client
node_incident_ui -.->|"uses incident API"| node_api_client
node_api_client -.->|"requests task data"| node_tasks
node_api_client -.->|"requests room data"| node_rooms
node_api_client -.->|"requests incidents"| node_incidents
node_kpis -->|"reads"| node_tasks
node_kpis -->|"reads"| node_rooms
node_kpis -->|"reads"| node_incidents
node_evidence -.->|"stores photos"| node_s3
node_session -->|"provides user"| node_notification_context
node_notification_context -->|"opens connection"| node_socket
node_notification_context -->|"loads and marks alerts"| node_api_client
node_socket -.->|"receives live events"| node_consumer
node_consumer -.->|"uses notification records"| node_notifications
node_database -.->|"persists"| node_users
node_database -.->|"persists"| node_rooms
node_database -.->|"persists"| node_tasks
node_database -.->|"persists"| node_incidents

click node_app "https://github.com/elmartinipolice/gruponorus/blob/Norus-Produccion/frontend/App.js"
click node_login "https://github.com/elmartinipolice/gruponorus/blob/Norus-Produccion/frontend/src/screens/auth/LoginScreen.js"
click node_session "https://github.com/elmartinipolice/gruponorus/blob/Norus-Produccion/frontend/src/context/AuthContext.js"
click node_nav "https://github.com/elmartinipolice/gruponorus/blob/Norus-Produccion/frontend/src/navigation/index.js"
click node_task_ui "https://github.com/elmartinipolice/gruponorus/blob/Norus-Produccion/frontend/src/screens/tasks/TasksScreen.js"
click node_task_create "https://github.com/elmartinipolice/gruponorus/blob/Norus-Produccion/frontend/src/screens/tasks/CreateTaskScreen.js"
click node_room_ui "https://github.com/elmartinipolice/gruponorus/blob/Norus-Produccion/frontend/src/screens/rooms/RoomsScreen.js"
click node_incident_ui "https://github.com/elmartinipolice/gruponorus/blob/Norus-Produccion/frontend/src/screens/incidents/IncidenciasScreen.js"
click node_dashboard "https://github.com/elmartinipolice/gruponorus/blob/Norus-Produccion/frontend/src/screens/dashboard/DashboardScreen.js"
click node_api_client "https://github.com/elmartinipolice/gruponorus/blob/Norus-Produccion/frontend/src/services/api.js"
click node_auth_service "https://github.com/elmartinipolice/gruponorus/blob/Norus-Produccion/frontend/src/services/authService.js"
click node_users "https://github.com/elmartinipolice/gruponorus/blob/Norus-Produccion/backend/apps/users/models.py"
click node_rooms "https://github.com/elmartinipolice/gruponorus/blob/Norus-Produccion/backend/apps/rooms/models.py"
click node_room_service "https://github.com/elmartinipolice/gruponorus/blob/Norus-Produccion/frontend/src/services/roomService.js"
click node_tasks "https://github.com/elmartinipolice/gruponorus/blob/Norus-Produccion/backend/apps/tasks/models.py"
click node_task_service "https://github.com/elmartinipolice/gruponorus/blob/Norus-Produccion/frontend/src/services/taskService.js"
click node_incidents "https://github.com/elmartinipolice/gruponorus/blob/Norus-Produccion/backend/apps/incidents/models.py"
click node_kpis "https://github.com/elmartinipolice/gruponorus/blob/Norus-Produccion/backend/apps/core/kpis.py"
click node_evidence "https://github.com/elmartinipolice/gruponorus/blob/Norus-Produccion/backend/apps/evidence/models.py"
click node_notifications "https://github.com/elmartinipolice/gruponorus/blob/Norus-Produccion/backend/apps/notifications/services.py"
click node_notification_context "https://github.com/elmartinipolice/gruponorus/blob/Norus-Produccion/frontend/src/context/NotificationContext.js"
click node_socket "https://github.com/elmartinipolice/gruponorus/blob/Norus-Produccion/frontend/src/services/socket.js"
click node_consumer "https://github.com/elmartinipolice/gruponorus/blob/Norus-Produccion/backend/apps/notifications/consumers.py"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_app,node_login,node_session,node_nav,node_task_ui,node_task_create,node_room_ui,node_incident_ui,node_dashboard,node_room_service,node_task_service,node_notification_context,node_socket toneBlue
class node_api_client,node_auth_service,node_users,node_database,node_s3 toneAmber
class node_rooms,node_tasks,node_incidents,node_kpis toneMint
class node_evidence,node_notifications,node_consumer toneRose
class node_staff toneIndigo
```

## Components

### Mobile App

- [App Entry](https://github.com/elmartinipolice/gruponorus/blob/Norus-Produccion/frontend/App.js): `frontend/App.js`
- [Login](https://github.com/elmartinipolice/gruponorus/blob/Norus-Produccion/frontend/src/screens/auth/LoginScreen.js): `frontend/src/screens/auth/LoginScreen.js`
- [Auth Session](https://github.com/elmartinipolice/gruponorus/blob/Norus-Produccion/frontend/src/context/AuthContext.js): `frontend/src/context/AuthContext.js`
- [Role Navigation](https://github.com/elmartinipolice/gruponorus/blob/Norus-Produccion/frontend/src/navigation/index.js): `frontend/src/navigation/index.js`
- [Task Screens](https://github.com/elmartinipolice/gruponorus/blob/Norus-Produccion/frontend/src/screens/tasks/TasksScreen.js): `frontend/src/screens/tasks/TasksScreen.js`
- [Task Assignment](https://github.com/elmartinipolice/gruponorus/blob/Norus-Produccion/frontend/src/screens/tasks/CreateTaskScreen.js): `frontend/src/screens/tasks/CreateTaskScreen.js`
- [Room Screens](https://github.com/elmartinipolice/gruponorus/blob/Norus-Produccion/frontend/src/screens/rooms/RoomsScreen.js): `frontend/src/screens/rooms/RoomsScreen.js`
- [Incident Screens](https://github.com/elmartinipolice/gruponorus/blob/Norus-Produccion/frontend/src/screens/incidents/IncidenciasScreen.js): `frontend/src/screens/incidents/IncidenciasScreen.js`
- [Dashboard](https://github.com/elmartinipolice/gruponorus/blob/Norus-Produccion/frontend/src/screens/dashboard/DashboardScreen.js): `frontend/src/screens/dashboard/DashboardScreen.js`
- [Room Service](https://github.com/elmartinipolice/gruponorus/blob/Norus-Produccion/frontend/src/services/roomService.js): `frontend/src/services/roomService.js`
- [Task Service](https://github.com/elmartinipolice/gruponorus/blob/Norus-Produccion/frontend/src/services/taskService.js): `frontend/src/services/taskService.js`
- [Alert Context](https://github.com/elmartinipolice/gruponorus/blob/Norus-Produccion/frontend/src/context/NotificationContext.js): `frontend/src/context/NotificationContext.js`
- [WebSocket Client](https://github.com/elmartinipolice/gruponorus/blob/Norus-Produccion/frontend/src/services/socket.js): `frontend/src/services/socket.js`

### API and Identity

- [JWT API Client](https://github.com/elmartinipolice/gruponorus/blob/Norus-Produccion/frontend/src/services/api.js): `frontend/src/services/api.js`
- [Auth Service](https://github.com/elmartinipolice/gruponorus/blob/Norus-Produccion/frontend/src/services/authService.js): `frontend/src/services/authService.js`
- [Users](https://github.com/elmartinipolice/gruponorus/blob/Norus-Produccion/backend/apps/users/models.py): `backend/apps/users/models.py`

### Hotel Operations

- [Rooms and Stays](https://github.com/elmartinipolice/gruponorus/blob/Norus-Produccion/backend/apps/rooms/models.py): `backend/apps/rooms/models.py`
- [Task Records](https://github.com/elmartinipolice/gruponorus/blob/Norus-Produccion/backend/apps/tasks/models.py): `backend/apps/tasks/models.py`
- [Incident Records](https://github.com/elmartinipolice/gruponorus/blob/Norus-Produccion/backend/apps/incidents/models.py): `backend/apps/incidents/models.py`
- [Operations KPIs](https://github.com/elmartinipolice/gruponorus/blob/Norus-Produccion/backend/apps/core/kpis.py): `backend/apps/core/kpis.py`

### Evidence and Alerts

- [Photo Evidence](https://github.com/elmartinipolice/gruponorus/blob/Norus-Produccion/backend/apps/evidence/models.py): `backend/apps/evidence/models.py`
- [Notification Service](https://github.com/elmartinipolice/gruponorus/blob/Norus-Produccion/backend/apps/notifications/services.py): `backend/apps/notifications/services.py`
- [Notification Consumer](https://github.com/elmartinipolice/gruponorus/blob/Norus-Produccion/backend/apps/notifications/consumers.py): `backend/apps/notifications/consumers.py`

### Other components

- **Hotel Staff**
- **MySQL / SQLite**
- **AWS S3**

## Connections

- Hotel Staff → App Entry: uses
- App Entry → Auth Session: mounts (evidence: `frontend/App.js`)
- App Entry → Role Navigation: shows signed-in (evidence: `frontend/App.js`)
- App Entry → Login: shows signed-out (evidence: `frontend/App.js`)
- Login → Auth Session: submits credentials (evidence: `frontend/src/screens/auth/LoginScreen.js`)
- Auth Session → Auth Service: calls (evidence: `frontend/src/context/AuthContext.js`)
- Auth Service → JWT API Client: sends requests (evidence: `frontend/src/services/authService.js`)
- JWT API Client → Users: authenticates JWT
- Role Navigation → Task Screens: routes to (evidence: `frontend/src/navigation/index.js`)
- Role Navigation → Room Screens: routes to (evidence: `frontend/src/navigation/index.js`)
- Role Navigation → Incident Screens: routes to (evidence: `frontend/src/navigation/index.js`)
- Role Navigation → Dashboard: routes to (evidence: `frontend/src/navigation/index.js`)
- Task Screens → Task Service: loads tasks (evidence: `frontend/src/screens/tasks/TasksScreen.js`)
- Task Assignment → Task Service: creates task (evidence: `frontend/src/screens/tasks/CreateTaskScreen.js`)
- Task Assignment → Room Service: loads rooms (evidence: `frontend/src/screens/tasks/CreateTaskScreen.js`)
- Task Service → JWT API Client: sends requests (evidence: `frontend/src/services/taskService.js`)
- Room Screens → Room Service: uses
- Room Service → JWT API Client: sends requests (evidence: `frontend/src/services/roomService.js`)
- Incident Screens → JWT API Client: uses incident API
- JWT API Client → Task Records: requests task data
- JWT API Client → Rooms and Stays: requests room data
- JWT API Client → Incident Records: requests incidents
- Operations KPIs → Task Records: reads (evidence: `backend/apps/core/kpis.py`)
- Operations KPIs → Rooms and Stays: reads (evidence: `backend/apps/core/kpis.py`)
- Operations KPIs → Incident Records: reads (evidence: `backend/apps/core/kpis.py`)
- Photo Evidence → AWS S3: stores photos
- Auth Session → Alert Context: provides user (evidence: `frontend/src/context/NotificationContext.js`)
- Alert Context → WebSocket Client: opens connection (evidence: `frontend/src/context/NotificationContext.js`)
- Alert Context → JWT API Client: loads and marks alerts (evidence: `frontend/src/context/NotificationContext.js`)
- WebSocket Client → Notification Consumer: receives live events
- Notification Consumer → Notification Service: uses notification records
- MySQL / SQLite → Users: persists
- MySQL / SQLite → Rooms and Stays: persists
- MySQL / SQLite → Task Records: persists
- MySQL / SQLite → Incident Records: persists
