Model/backend/app/documents
Khalim Conn-Kowlessar 90fe2914e0 Select documents by HubSpot project_code(s), unioned with hand-picked property_ids
The 'all properties' selection resolved against property.portfolio_id, but a
portfolio spans multiple HubSpot projects — so 'all' pulled the whole portfolio,
not the project the user was looking at. The project↔property grain lives on
hubspot_deal_data, not property.

task.inputs is now {project_codes?: str[], property_ids?: int[], portfolio_id?}:
the route resolves the distinct landlord_property_id set as the union of every
property in the named project_codes (from hubspot_deal_data) and the hand-picked
property_ids; portfolio_id is optional and only names the package. Drops the
portfolio-scoped select_all. Cap now applies to the resolved set size.

ADR-0060, CONTEXT.md and the request schema updated to match. New router tests
cover project-code resolution, the union+dedup, null landlord_property_id drop,
and the empty-project rejection.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-08 11:42:17 +00:00
..
__init__.py FastAPI trigger route: POST /v1/documents/bulk-download 🟩 2026-07-08 09:59:02 +00:00
download_tasks.py Select documents by HubSpot project_code(s), unioned with hand-picked property_ids 2026-07-08 11:42:17 +00:00
router.py Select documents by HubSpot project_code(s), unioned with hand-picked property_ids 2026-07-08 11:42:17 +00:00
schemas.py Select documents by HubSpot project_code(s), unioned with hand-picked property_ids 2026-07-08 11:42:17 +00:00