feat/49-provenance Implementa trazabilidad de proveedores #49 #50

Merged
mono merged 6 commits from feat/49-provenance into main 2026-08-16 22:17:35 -05:00
Owner

Implementa trazabilidad de proveedores, organizaciones y geolocalización de municipios, con datos embebidos en los resúmenes de venta para que el frontend construya gráficos de:

  • Productos → Proveedores → Organizaciones
  • Productos → Departamento → Municipio (con lat/lng para Leaflet)

Cambios

Modelos

  • Country, Department, Municipality (unicidad compuesta name+department)
  • Municipality incluye latitude/longitude (coordenadas de cabeceras DIVIPOLA + Nominatim)
  • Organization, Supplier (FKs nullable con SET_NULL)
  • Product.suppliers M2M

API

  • CRUD autenticado de organizations/, suppliers/, countries/, departments/, municipalities/ (lectura no-pública, escritura admin)
  • POST /don_confiao/api/seed_geography/ — siembra 33 deptos + 1120 municipios con coordenadas (idempotente)

Resumen de venta

  • Campo product_provenance embebido en las respuestas existentes (resumen_publico, resumen_compra_json, resumen_compra_catalogo_json) sin cambiar campos existentes
  • Municipios incluyen latitude/longitude para posicionamiento Leaflet
  • Sin datos → suppliers: [] / municipality: null → el frontend muestra "Próximamente estará disponible"

Serializers

  • DepartmentSerializer agrega country_detail (nested)
  • MunicipalitySerializer agrega department_detail, country_detail, latitude, longitude
  • Brief serializers de geografía reubicados en serializers/geography.py

Tests — 180 tests OK (rojo→verde, TDD)

  • Modelos: geografía (12), provenance (10)
  • API: permisos, CRUD, seed (14)
  • Graficas: resúmenes con provenance (11)

Deploy — base de datos existente

  1. Migraciones: una vez mergeado el código, ejecutar las migraciones en producción:

    docker compose -f docker-compose.prod.yml exec django python manage.py migrate
    

    Genera las tablas Country, Department, Municipality, Organization, Supplier y el campo M2M Product.suppliers.

  2. Poblar geografía (país + departamentos + 1120 municipios con coordenadas):

    pip install pycountry requests
    python scripts/seed_geography.py https://tudominio.com
    

    Pide usuario administrador. Es idempotente: re-ejecutar no duplica.

    • Opcionalmente, si se prefiere vía API directa:
      curl -X POST https://tudominio.com/don_confiao/api/seed_geography \
        -H "Authorization: Bearer <token>" \
        -H "Content-Type: application/json" \
        -d '{ ... }'  # payload en doc/guia_provenance_frontend.md
      
Implementa trazabilidad de proveedores, organizaciones y geolocalización de municipios, con datos embebidos en los resúmenes de venta para que el frontend construya gráficos de: - **Productos → Proveedores → Organizaciones** - **Productos → Departamento → Municipio** (con lat/lng para Leaflet) ### Cambios **Modelos** - `Country`, `Department`, `Municipality` (unicidad compuesta `name+department`) - `Municipality` incluye `latitude`/`longitude` (coordenadas de cabeceras DIVIPOLA + Nominatim) - `Organization`, `Supplier` (FKs nullable con `SET_NULL`) - `Product.suppliers` M2M **API** - CRUD autenticado de `organizations/`, `suppliers/`, `countries/`, `departments/`, `municipalities/` (lectura no-pública, escritura admin) - `POST /don_confiao/api/seed_geography/` — siembra 33 deptos + 1120 municipios con coordenadas (idempotente) **Resumen de venta** - Campo `product_provenance` embebido en las respuestas existentes (`resumen_publico`, `resumen_compra_json`, `resumen_compra_catalogo_json`) sin cambiar campos existentes - Municipios incluyen `latitude`/`longitude` para posicionamiento Leaflet - Sin datos → `suppliers: []` / `municipality: null` → el frontend muestra "Próximamente estará disponible" **Serializers** - `DepartmentSerializer` agrega `country_detail` (nested) - `MunicipalitySerializer` agrega `department_detail`, `country_detail`, `latitude`, `longitude` - Brief serializers de geografía reubicados en `serializers/geography.py` **Tests** — 180 tests OK (rojo→verde, TDD) - Modelos: geografía (12), provenance (10) - API: permisos, CRUD, seed (14) - Graficas: resúmenes con provenance (11) ### Deploy — base de datos existente 1. **Migraciones**: una vez mergeado el código, ejecutar las migraciones en producción: ```bash docker compose -f docker-compose.prod.yml exec django python manage.py migrate ``` Genera las tablas `Country`, `Department`, `Municipality`, `Organization`, `Supplier` y el campo M2M `Product.suppliers`. 2. **Poblar geografía** (país + departamentos + 1120 municipios con coordenadas): ```bash pip install pycountry requests python scripts/seed_geography.py https://tudominio.com ``` Pide usuario administrador. Es idempotente: re-ejecutar no duplica. - Opcionalmente, si se prefiere vía API directa: ```bash curl -X POST https://tudominio.com/don_confiao/api/seed_geography \ -H "Authorization: Bearer <token>" \ -H "Content-Type: application/json" \ -d '{ ... }' # payload en doc/guia_provenance_frontend.md ```
mono self-assigned this 2026-08-16 04:23:37 -05:00
mono added 4 commits 2026-08-16 04:23:37 -05:00
- Country, Department, Municipality models (municipality unique per department)
- Organization and Supplier models, Supplier links to organization and municipality
- Product.suppliers M2M to link products to one or more suppliers
- Authenticated CRUD APIs for organizations, suppliers, countries, departments and municipalities (write only for administrators)
- product_provenance domain data embedded in sale/catalog summaries (public and authenticated)
- seed_geography endpoint (admin, idempotent) and scripts/seed_geography.py using pycountry + DANE municipalities CSV
- TDD tests for models, API permissions/CRUD and summary provenance data
- DepartmentSerializer adds country_detail (nested country object)
- MunicipalitySerializer adds department_detail and country_detail
- Writable FK id fields kept for create/update
- Move geography brief serializers to serializers/geography.py
- Municipality model with optional latitude/longitude decimal fields
- Municipality and brief serializers expose lat/lng (also in product_provenance of public/authenticated summaries for the Leaflet map)
- seed_geography endpoint reads lat/lng and updates existing municipalities on reseed (idempotent)
- TDD tests for model, serializers, summaries and seed
mono changed title from feat/49-provenance #49 to feat/49-provenance Implementa trazabilidad de proveedores, organizaciones y geolocalización de municipios #49 2026-08-16 21:37:06 -05:00
mono changed title from feat/49-provenance Implementa trazabilidad de proveedores, organizaciones y geolocalización de municipios #49 to feat/49-provenance Implementa trazabilidad de proveedores #49 2026-08-16 21:37:50 -05:00
mono added 1 commit 2026-08-16 22:02:34 -05:00
Allowlist scripts/ in .gitignore (was caught by [Ss]cripts venv rule)
so seed_geography.py and colombia_municipios.csv can be committed.
This simplifies deployment since the files no longer need to be
copied separately to the server.
mono added 1 commit 2026-08-16 22:15:13 -05:00
mono merged commit 0fd79a2ba7 into main 2026-08-16 22:17:35 -05:00
mono deleted branch feat/49-provenance 2026-08-16 22:17:35 -05:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: OneTeam/don_confiao_backend#50
No description provided.