Accounts App ============ **Purpose**: User management, role assignment, team organization, and geographic zone management. **This app is the foundation** — every other app depends on ``accounts`` for user identity and role-based access control. Responsibilities ---------------- - User registration and profile management - Role assignment (seven system roles) - Team creation and membership management - Geographic zone definition and assignment - JWT-based authentication (access + refresh tokens) - Custom permission classes used by all other apps Dependencies ------------ None. This is a leaf dependency — other apps import from ``accounts``, but ``accounts`` imports from no other ChargeSol app. Key Models ---------- - **User** — Extends Django's ``AbstractUser`` with phone, role, zone, and availability flag. - **Role** — System roles: ``oem``, ``customer``, ``central_ops``, ``field_team``, ``procurement``, ``finance``, ``oem_reporting``. - **Team** — Groups of field team users, scoped to a zone. Specialization: survey, installation, or both. - **TeamMembership** — Links users to teams with a role (lead or member). - **Zone** — Geographic regions (city/district level) that determine team assignment and material stock location. Business Rules -------------- - A user belongs to exactly one role. - A field team user can be a member of multiple teams (e.g., survey team and installation team). - Teams are scoped to a single zone; users can only be assigned work within their team's zone. - The ``is_available`` flag on User is checked by the emergency app when searching for backup teams. - Central Ops users can manage users and teams across all zones.