278 lines
7.7 KiB
Markdown
278 lines
7.7 KiB
Markdown
# AMO CRM Data Collection Service
|
|
|
|
A FastAPI service that collects data from AMO CRM API and stores it in SQLite database for further export to Google Sheets.
|
|
|
|
## Features
|
|
|
|
- **Data Collection**: Collects Deals, Contacts, Companies, Pipelines, Users, and Events from AMO CRM
|
|
- **HAL+JSON Support**: Handles AMO CRM's HAL+JSON response format
|
|
- **Custom Fields**: Extracts and stores custom fields with proper typing
|
|
- **Relationships**: Maintains proper relationships between entities
|
|
- **Google Sheets Export**: Unified configuration for exporting all entities to Google Sheets
|
|
- **Background Processing**: Async job processing for exports
|
|
- **SQLite Database**: Optimized storage with proper indexing
|
|
|
|
## Project Structure
|
|
|
|
```
|
|
amo-server/
|
|
├── adapters/ # Database and external service adapters
|
|
│ └── sqlite/ # SQLite database models and connection
|
|
├── routers/ # FastAPI route handlers
|
|
├── servers/ # Business logic (to be implemented)
|
|
├── utils/ # Utilities and configuration
|
|
├── workers/ # Background workers (to be implemented)
|
|
├── tests/ # Test files and fixtures
|
|
│ └── fixtures/ # AMO CRM response examples
|
|
└── docs/ # Documentation
|
|
```
|
|
|
|
## Setup
|
|
|
|
### Prerequisites
|
|
|
|
- Python 3.12+
|
|
- [uv](https://docs.astral.sh/uv/) package manager
|
|
|
|
### Installation
|
|
|
|
1. Clone the repository:
|
|
```bash
|
|
git clone <repository-url>
|
|
cd amo-server
|
|
```
|
|
|
|
2. Install dependencies using uv:
|
|
```bash
|
|
uv sync
|
|
```
|
|
|
|
3. Create environment file:
|
|
```bash
|
|
cp env.example .env
|
|
```
|
|
|
|
4. Configure your environment variables in `.env`:
|
|
```env
|
|
# Database
|
|
DATABASE_URL=sqlite:///./amo_data.db
|
|
|
|
# AMO CRM API
|
|
AMO_CRM_DOMAIN=wecheap.amocrm.ru
|
|
AMO_CRM_ACCESS_TOKEN=your-longterm-access-token
|
|
|
|
# Google Sheets API
|
|
GOOGLE_SERVICE_ACCOUNT_FILE=path/to/service-account.json
|
|
|
|
# Redis (for Celery)
|
|
REDIS_URL=redis://localhost:6379/0
|
|
|
|
# API Settings
|
|
API_V1_STR=/api/v1
|
|
|
|
# Logging
|
|
LOG_LEVEL=INFO
|
|
```
|
|
|
|
### Running the Service
|
|
|
|
1. Start the development server:
|
|
```bash
|
|
uv run uvicorn app:app --reload
|
|
```
|
|
|
|
2. Open your browser to http://localhost:8000 to see the API
|
|
|
|
3. Visit http://localhost:8000/docs for the interactive API documentation
|
|
|
|
### Fetching Real AMO CRM Data
|
|
|
|
To fetch real responses from your AMO CRM for testing:
|
|
|
|
1. Set your access token in `.env`:
|
|
```env
|
|
AMO_CRM_ACCESS_TOKEN=your-longterm-token
|
|
```
|
|
|
|
2. Run the fetch script:
|
|
```bash
|
|
uv run python scripts/fetch_amocrm_data.py
|
|
```
|
|
|
|
This will:
|
|
- Fetch real data from wecheap.amocrm.ru
|
|
- Save individual JSON files to `tests/fixtures/real_responses/`
|
|
- Generate Python fixtures at `tests/fixtures/real_amocrm_responses.py`
|
|
- Show a summary of fetched data
|
|
|
|
3. Test the API connection:
|
|
```bash
|
|
curl http://localhost:8000/api/v1/amocrm/info
|
|
curl http://localhost:8000/api/v1/amocrm/fetch/users?limit=5
|
|
```
|
|
|
|
## API Endpoints
|
|
|
|
### Entity Management
|
|
|
|
- `GET /api/v1/entities` - List all entities with statistics
|
|
- `GET /api/v1/entities/{entity_type}/fields` - List fields for specific entity
|
|
|
|
### AMO CRM Integration
|
|
|
|
- `GET /api/v1/amocrm/info` - Get AMO CRM connection info
|
|
- `GET /api/v1/amocrm/fetch/{entity_type}` - Fetch data directly from AMO CRM
|
|
- `GET /api/v1/amocrm/fetch/custom_fields/{entity_type}` - Fetch custom fields metadata
|
|
- `GET /api/v1/amocrm/fetch/all` - Fetch all data from AMO CRM (for testing)
|
|
- `POST /api/v1/amocrm/sync/{entity_type}` - Fetch and sync data from AMO CRM
|
|
|
|
### Export Management
|
|
|
|
- `POST /api/v1/export/configure` - Create unified export configuration
|
|
- `GET /api/v1/export/configurations` - List export configurations
|
|
- `POST /api/v1/export/start` - Start export job
|
|
- `GET /api/v1/export/status/{job_id}` - Get export job status
|
|
- `GET /api/v1/export/jobs` - List all export jobs
|
|
|
|
### Data Ingestion (Worker API)
|
|
|
|
- `POST /api/v1/data/users` - Import users data
|
|
- `POST /api/v1/data/pipelines` - Import pipelines data
|
|
- `POST /api/v1/data/companies` - Import companies data
|
|
- `POST /api/v1/data/contacts` - Import contacts data
|
|
- `POST /api/v1/data/deals` - Import deals data
|
|
- `POST /api/v1/data/events` - Import events data
|
|
|
|
## Database Schema
|
|
|
|
The service uses SQLite with the following main tables:
|
|
|
|
- `amo_users` - CRM users
|
|
- `amo_pipelines` - Sales pipelines
|
|
- `amo_pipeline_stages` - Pipeline stages
|
|
- `amo_companies` - Companies
|
|
- `amo_contacts` - Contacts
|
|
- `amo_deals` - Deals/Leads
|
|
- `amo_events` - Activity events
|
|
- `amo_custom_fields` - Universal custom fields storage
|
|
- `export_configuration` - Export configurations
|
|
- `export_entity_mappings` - Entity-specific export mappings
|
|
- `export_jobs` - Export job tracking
|
|
|
|
## AMO CRM Response Examples
|
|
|
|
The project includes real AMO CRM API response examples in `tests/fixtures/amocrm_responses.py` for:
|
|
|
|
- **Users** (`USERS_RESPONSE`)
|
|
- **Pipelines** (`PIPELINES_RESPONSE`)
|
|
- **Companies** (`COMPANIES_RESPONSE`)
|
|
- **Contacts** (`CONTACTS_RESPONSE`)
|
|
- **Deals** (`DEALS_RESPONSE`)
|
|
- **Events** (`EVENTS_RESPONSE`)
|
|
- **Custom Fields Metadata** (`CUSTOM_FIELDS_RESPONSE`)
|
|
|
|
These examples demonstrate:
|
|
- HAL+JSON format structure
|
|
- Custom fields with different types (text, select, numeric, date)
|
|
- Embedded relationships between entities
|
|
- Proper date formats (Unix timestamps)
|
|
- Event types filtering (incoming_call, outgoing_call, lead_status_changed)
|
|
|
|
## Testing
|
|
|
|
Run tests using pytest:
|
|
|
|
```bash
|
|
uv run pytest
|
|
```
|
|
|
|
Run tests with coverage:
|
|
|
|
```bash
|
|
uv run pytest --cov=. --cov-report=html
|
|
```
|
|
|
|
## Export Configuration Example
|
|
|
|
Create a unified export configuration for all entities:
|
|
|
|
```json
|
|
{
|
|
"name": "Q1 2024 AMO CRM Export",
|
|
"sheet_id": "1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms",
|
|
"date_range_start": "2024-01-01T00:00:00Z",
|
|
"date_range_end": "2024-03-31T23:59:59Z",
|
|
"entity_mappings": {
|
|
"deals": {
|
|
"sheet_name": "Deals",
|
|
"is_enabled": true,
|
|
"field_mapping": [
|
|
{"field_name": "name", "column": "A", "order": 1},
|
|
{"field_name": "price", "column": "B", "order": 2},
|
|
{"field_name": "created_at", "column": "C", "order": 3}
|
|
]
|
|
},
|
|
"contacts": {
|
|
"sheet_name": "Contacts",
|
|
"is_enabled": true,
|
|
"field_mapping": [
|
|
{"field_name": "name", "column": "A", "order": 1},
|
|
{"field_name": "email", "column": "B", "order": 2}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
## Custom Fields Handling
|
|
|
|
The service automatically extracts custom fields from AMO CRM responses:
|
|
|
|
- **Field Types**: text, numeric, select, multiselect, date, checkbox, textarea, url
|
|
- **Type Detection**: Automatically detects and converts field values
|
|
- **Storage**: Stores in universal `amo_custom_fields` table with proper typing
|
|
- **Relationships**: Links custom fields to their parent entities
|
|
|
|
## Date Validation
|
|
|
|
All dates are validated to be between 2017-2026 (Unix timestamps: 1483228800 - 1767225600).
|
|
|
|
## Development
|
|
|
|
### Code Style
|
|
|
|
The project uses:
|
|
- **Black** for code formatting
|
|
- **isort** for import sorting
|
|
- **flake8** for linting
|
|
- **mypy** for type checking
|
|
|
|
Run code formatting:
|
|
```bash
|
|
uv run black .
|
|
uv run isort .
|
|
```
|
|
|
|
### Project Conventions
|
|
|
|
Following the established patterns:
|
|
- **Adapters**: Handle external integrations (database, APIs)
|
|
- **Servers**: Contain business logic
|
|
- **Routers**: Define API routes only
|
|
- **Workers**: Background processing
|
|
- **Utils**: Shared utilities and configuration
|
|
|
|
## Next Steps
|
|
|
|
1. **Implement Background Workers**: Set up Celery workers for data collection
|
|
2. **Add Google Sheets Integration**: Implement actual Google Sheets export
|
|
3. **Add AMO CRM Client**: Create HTTP client for AMO CRM API
|
|
4. **Add Authentication**: Implement API authentication
|
|
5. **Add Monitoring**: Set up logging and metrics
|
|
6. **Add Rate Limiting**: Implement API rate limiting
|
|
7. **Add Caching**: Use Redis for caching frequently accessed data
|
|
|
|
## License
|
|
|
|
MIT License
|