177 lines
5.3 KiB
Markdown
177 lines
5.3 KiB
Markdown
# Nexus
|
|
|
|
A field service management platform built with Django REST Framework and React. Designed for managing accounts, service visits, projects, and team coordination with integrated Google Workspace services.
|
|
|
|
## Features
|
|
|
|
- **Account Management**: Track client accounts with service schedules and contact information
|
|
- **Service Visits**: Create, track, and close daily service visits with notes
|
|
- **Project Management**: Schedule and manage multi-store projects with punchlists
|
|
- **Reports**: Generate monthly reports with visit tracking and rate calculations
|
|
- **Supply Requests**: Submit supply requests from the field
|
|
- **Google Integration**: Calendar invites, email notifications, and Drive-based punchlist PDFs
|
|
- **JWT Authentication**: Secure team member login with token refresh
|
|
|
|
## Tech Stack
|
|
|
|
### Backend
|
|
- Python 3.12
|
|
- Django 5.1.3 with Django REST Framework
|
|
- PostgreSQL with psycopg2-binary
|
|
- Redis for caching
|
|
- Google APIs (Calendar, Gmail, Drive, Sheets)
|
|
- JWT authentication via djangorestframework-simplejwt
|
|
|
|
### Frontend
|
|
- React 18
|
|
- React Router 7
|
|
- Bootstrap 5
|
|
- Webpack 5
|
|
- Axios for API calls
|
|
|
|
## Prerequisites
|
|
|
|
- Python 3.12+
|
|
- Node.js 22+
|
|
- PostgreSQL
|
|
- Redis (optional, for caching)
|
|
- Google Workspace account with domain-wide delegation configured
|
|
|
|
## Google Workspace Setup
|
|
|
|
This application requires a Google Service Account with domain-wide delegation:
|
|
|
|
1. Create a service account in Google Cloud Console
|
|
2. Enable domain-wide delegation for the service account
|
|
3. Grant the following scopes in Google Workspace Admin:
|
|
- `https://www.googleapis.com/auth/calendar`
|
|
- `https://www.googleapis.com/auth/gmail.send`
|
|
- `https://www.googleapis.com/auth/drive`
|
|
- `https://www.googleapis.com/auth/spreadsheets`
|
|
4. Download the service account JSON key
|
|
|
|
## Configuration
|
|
|
|
1. Copy `.env.example` to `.env` and configure:
|
|
|
|
```bash
|
|
cp .env.example .env
|
|
```
|
|
|
|
2. Required environment variables:
|
|
- `SECRET_KEY`: Django secret key
|
|
- `PSQL`: PostgreSQL connection string
|
|
- `SERVICE_ACCOUNT_KEY`: Google service account JSON (as string)
|
|
- `DISPATCH_EMAIL`: Email address for the service account to impersonate
|
|
- `TEAM_EMAILS`: Comma-separated list of team member emails
|
|
- `PUNCHLIST_FOLDER_ID`: Google Drive folder ID for punchlists
|
|
- `PUNCHLIST_TEMPLATE_ID`: Google Sheets template ID for punchlists
|
|
|
|
## Development Setup
|
|
|
|
### Backend
|
|
|
|
```bash
|
|
# Create virtual environment
|
|
python -m venv venv
|
|
source venv/bin/activate # or `venv\Scripts\activate` on Windows
|
|
|
|
# Install dependencies
|
|
pip install -r requirements.txt
|
|
|
|
# Run migrations
|
|
python manage.py migrate
|
|
|
|
# Create superuser
|
|
python manage.py createsuperuser
|
|
|
|
# Start development server
|
|
python manage.py runserver
|
|
```
|
|
|
|
### Frontend
|
|
|
|
```bash
|
|
# Install dependencies
|
|
npm install
|
|
|
|
# Start development server
|
|
npm start
|
|
|
|
# Build for production
|
|
npm run build
|
|
```
|
|
|
|
## Docker Deployment
|
|
|
|
### SSL Certificates
|
|
|
|
Place your SSL certificates in the `certs/` directory:
|
|
- `frontend-cert.pem` and `frontend-key.pem` for nginx
|
|
- `backend-cert.pem` and `backend-key.pem` for gunicorn
|
|
|
|
### Build and Run
|
|
|
|
```bash
|
|
# Build and start containers
|
|
docker-compose up -d --build
|
|
|
|
# View logs
|
|
docker-compose logs -f
|
|
```
|
|
|
|
The frontend will be available on port 443, and the backend API on port 8443.
|
|
|
|
## Project Structure
|
|
|
|
```
|
|
nexus/
|
|
├── api/ # Django app with models, views, serializers
|
|
│ ├── models.py # Database models
|
|
│ ├── views.py # API endpoints
|
|
│ ├── serializers.py # DRF serializers
|
|
│ ├── gcalendar.py # Google Calendar integration
|
|
│ ├── gmail.py # Gmail integration
|
|
│ ├── gdrive.py # Google Drive integration
|
|
│ ├── gsheets.py # Google Sheets integration
|
|
│ └── redis_client.py # Redis caching
|
|
├── nexus/ # Django project settings
|
|
│ ├── settings.py # Django configuration
|
|
│ └── urls.py # URL routing
|
|
├── frontend/ # React application
|
|
│ ├── components/ # Reusable React components
|
|
│ ├── modules/ # Page-level React components
|
|
│ ├── api.js # Axios API client
|
|
│ ├── constants.js # Frontend constants
|
|
│ ├── App.jsx # Main React app
|
|
│ └── main.jsx # React entry point
|
|
├── templates/ # HTML templates
|
|
├── static/ # Static files
|
|
├── docker-compose.yml # Docker composition
|
|
├── Dockerfile.backend # Backend container
|
|
├── Dockerfile.frontend # Frontend container
|
|
└── nginx.conf # Nginx configuration
|
|
```
|
|
|
|
## API Endpoints
|
|
|
|
- `POST /token/` - Obtain JWT tokens
|
|
- `POST /token/refresh/` - Refresh JWT token
|
|
- `GET /accounts/` - List all accounts
|
|
- `GET /accounts/status/` - Get account status
|
|
- `POST /accounts/supplies/` - Submit supply request
|
|
- `GET /stores/` - List all stores
|
|
- `GET /projects/` - List all projects
|
|
- `POST /projects/close/` - Close a project
|
|
- `POST /projects/punch/` - Submit punchlist
|
|
- `POST /visits/` - Get visits for date
|
|
- `POST /visits/close/` - Close a visit
|
|
- `GET /days/:account/` - Get service days for account
|
|
- `POST /calendar/` - Create calendar event
|
|
- `GET /team/` - List team members
|
|
- `POST /user/password/change/` - Change user password
|
|
|
|
## License
|
|
|
|
MIT
|