# osbonilla/integracionodooarcgis architecture

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

- Interactive diagram: https://gitdiagram.com/osbonilla/integracionodooarcgis
- Repository: https://github.com/osbonilla/integracionodooarcgis

## Overview

This repository is a demo integration connecting municipal service requests in Odoo with ArcGIS field workflows. Citizens submit reports through Survey123; crews and supervisors edit request points and workfront lines in Field Maps. Webhooks and a periodic safety-net schedule trigger the FastAPI runner, which batches events and executes an idempotent bidirectional sync: new field features become Odoo tasks, linked records merge changes, attachments/notes are handled, and nearby requests are assigned to workfronts. The README also documents Dashboards and map monitoring. Source excerpts show API orchestration and client responsibilities, but not every pipeline call; unverified subsystem links are omitted.

Main entry points: [`integration-api/app/sync.py`](https://github.com/osbonilla/integracionodooarcgis/blob/main/integration-api/app/sync.py) (Sync pipeline), [`integration-api/app/main.py`](https://github.com/osbonilla/integracionodooarcgis/blob/main/integration-api/app/main.py) (Webhook endpoints), [`integration-api/app/arcgis_client.py`](https://github.com/osbonilla/integracionodooarcgis/blob/main/integration-api/app/arcgis_client.py) (ArcGIS client), [`integration-api/app/odoo_client.py`](https://github.com/osbonilla/integracionodooarcgis/blob/main/integration-api/app/odoo_client.py) (Odoo client)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_field["Field and GIS"]
  node_survey["Survey123"]
  node_fieldmaps["Field Maps"]
  node_requests[("Request layer")]
  node_fronts[("Workfront layer")]
  node_dashboards["Dashboards"]
end

subgraph group_service["Integration API"]
  node_webhooks["Webhook endpoints<br/>[main.py]"]
  node_runner["Debounce runner<br/>[sync.py]"]
  node_scheduler["Safety scheduler<br/>[main.py]"]
  node_pipeline["Sync pipeline<br/>[sync.py]"]
  node_geometry["Geo and fingerprints<br/>[geo.py]"]
  node_schemas["API schemas<br/>[schemas.py]"]
  node_settings["Integration settings<br/>[config.py]"]
  node_arcgis_client["ArcGIS client<br/>[arcgis_client.py]"]
  node_odoo_client["Odoo client<br/>[odoo_client.py]"]
end

subgraph group_erp["Municipal ERP"]
  node_odoo[("Odoo tasks and contacts")]
end

node_citizen(("Citizen"))
node_crew(("Crew / supervisor"))
node_operator(("Municipal operator"))

node_citizen -->|"submits reports"| node_survey
node_survey -->|"writes reports"| node_requests
node_crew -->|"edits field data"| node_fieldmaps
node_fieldmaps -->|"edits requests"| node_requests
node_fieldmaps -->|"draws workfronts"| node_fronts
node_requests -->|"feeds indicators"| node_dashboards
node_fronts -->|"feeds indicators"| node_dashboards
node_operator -->|"manages tasks"| node_odoo
node_requests -->|"sends change events"| node_webhooks
node_fronts -->|"sends change events"| node_webhooks
node_survey -->|"sends submission event"| node_webhooks
node_odoo -->|"notifies task changes"| node_webhooks
node_webhooks -->|"queues sync reason"| node_runner
node_scheduler -->|"runs periodic sync"| node_pipeline
node_runner -->|"runs batched sync"| node_pipeline
node_pipeline -->|"uses spatial utilities"| node_geometry
node_pipeline -->|"uses layer access"| node_arcgis_client
node_pipeline -->|"uses ERP access"| node_odoo_client
node_pipeline -.->|"syncs request features"| node_requests
node_pipeline -.->|"syncs workfront features"| node_fronts
node_pipeline -.->|"syncs tasks and contacts"| node_odoo
node_arcgis_client -->|"queries and edits"| node_requests
node_arcgis_client -->|"queries and edits"| node_fronts
node_odoo_client -->|"uses XML-RPC"| node_odoo
node_pipeline -.->|"returns summaries"| node_schemas
node_webhooks -.->|"uses configuration"| node_settings

click node_webhooks "https://github.com/osbonilla/integracionodooarcgis/blob/main/integration-api/app/main.py"
click node_runner "https://github.com/osbonilla/integracionodooarcgis/blob/main/integration-api/app/sync.py"
click node_scheduler "https://github.com/osbonilla/integracionodooarcgis/blob/main/integration-api/app/main.py"
click node_pipeline "https://github.com/osbonilla/integracionodooarcgis/blob/main/integration-api/app/sync.py"
click node_geometry "https://github.com/osbonilla/integracionodooarcgis/blob/main/integration-api/app/geo.py"
click node_schemas "https://github.com/osbonilla/integracionodooarcgis/blob/main/integration-api/app/schemas.py"
click node_settings "https://github.com/osbonilla/integracionodooarcgis/blob/main/integration-api/app/config.py"
click node_arcgis_client "https://github.com/osbonilla/integracionodooarcgis/blob/main/integration-api/app/arcgis_client.py"
click node_odoo_client "https://github.com/osbonilla/integracionodooarcgis/blob/main/integration-api/app/odoo_client.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_survey,node_fieldmaps,node_requests,node_fronts,node_dashboards toneBlue
class node_webhooks,node_runner,node_scheduler,node_pipeline,node_geometry,node_schemas,node_settings,node_arcgis_client,node_odoo_client toneAmber
class node_odoo toneMint
class node_citizen,node_crew,node_operator toneIndigo
```

## Components

### Field and GIS

- **Survey123**
- **Field Maps**
- **Request layer**
- **Workfront layer**
- **Dashboards**

### Integration API

- [Webhook endpoints](https://github.com/osbonilla/integracionodooarcgis/blob/main/integration-api/app/main.py): `integration-api/app/main.py`
- [Debounce runner](https://github.com/osbonilla/integracionodooarcgis/blob/main/integration-api/app/sync.py): `integration-api/app/sync.py`
- [Safety scheduler](https://github.com/osbonilla/integracionodooarcgis/blob/main/integration-api/app/main.py): `integration-api/app/main.py`
- [Sync pipeline](https://github.com/osbonilla/integracionodooarcgis/blob/main/integration-api/app/sync.py): `integration-api/app/sync.py`
- [Geo and fingerprints](https://github.com/osbonilla/integracionodooarcgis/blob/main/integration-api/app/geo.py): `integration-api/app/geo.py`
- [API schemas](https://github.com/osbonilla/integracionodooarcgis/blob/main/integration-api/app/schemas.py): `integration-api/app/schemas.py`
- [Integration settings](https://github.com/osbonilla/integracionodooarcgis/blob/main/integration-api/app/config.py): `integration-api/app/config.py`
- [ArcGIS client](https://github.com/osbonilla/integracionodooarcgis/blob/main/integration-api/app/arcgis_client.py): `integration-api/app/arcgis_client.py`
- [Odoo client](https://github.com/osbonilla/integracionodooarcgis/blob/main/integration-api/app/odoo_client.py): `integration-api/app/odoo_client.py`

### Municipal ERP

- **Odoo tasks and contacts**

### Other components

- **Citizen**
- **Crew / supervisor**
- **Municipal operator**

## Connections

- Citizen → Survey123: submits reports (evidence: `README.md`)
- Survey123 → Request layer: writes reports (evidence: `README.md`)
- Crew / supervisor → Field Maps: edits field data (evidence: `README.md`)
- Field Maps → Request layer: edits requests (evidence: `README.md`)
- Field Maps → Workfront layer: draws workfronts (evidence: `README.md`)
- Request layer → Dashboards: feeds indicators (evidence: `README.md`)
- Workfront layer → Dashboards: feeds indicators (evidence: `README.md`)
- Municipal operator → Odoo tasks and contacts: manages tasks (evidence: `README.md`)
- Request layer → Webhook endpoints: sends change events (evidence: `README.md`)
- Workfront layer → Webhook endpoints: sends change events (evidence: `README.md`)
- Survey123 → Webhook endpoints: sends submission event (evidence: `integration-api/app/main.py`)
- Odoo tasks and contacts → Webhook endpoints: notifies task changes (evidence: `integration-api/app/main.py`)
- Webhook endpoints → Debounce runner: queues sync reason (evidence: `integration-api/app/main.py`)
- Safety scheduler → Sync pipeline: runs periodic sync (evidence: `integration-api/app/main.py`)
- Debounce runner → Sync pipeline: runs batched sync (evidence: `integration-api/app/sync.py`)
- Sync pipeline → Geo and fingerprints: uses spatial utilities (evidence: `integration-api/app/sync.py`)
- Sync pipeline → ArcGIS client: uses layer access (evidence: `integration-api/app/sync.py`)
- Sync pipeline → Odoo client: uses ERP access (evidence: `integration-api/app/sync.py`)
- Sync pipeline → Request layer: syncs request features
- Sync pipeline → Workfront layer: syncs workfront features
- Sync pipeline → Odoo tasks and contacts: syncs tasks and contacts
- ArcGIS client → Request layer: queries and edits (evidence: `README.md`)
- ArcGIS client → Workfront layer: queries and edits (evidence: `README.md`)
- Odoo client → Odoo tasks and contacts: uses XML-RPC (evidence: `README.md`)
- Sync pipeline → API schemas: returns summaries (evidence: `integration-api/app/sync.py`)
- Webhook endpoints → Integration settings: uses configuration (evidence: `integration-api/app/main.py`)
