gendesign/backend/app/api/v1
lekss361 7ea4f262cd feat(trade-in): TI-2 PDF export + frontend enable button
- Add backend/app/services/exporters/trade_in_pdf.py: 4-page WeasyPrint PDF
  (Cover / Listings / Deals / Trade-in cost stub) following layout_tz_pdf.py pattern
- Extend trade_in.py: GET /api/v1/trade-in/estimate/{id}/pdf endpoint
  (404 not found, 410 expired TTL, application/pdf attachment)
- Enable EstimateResult.tsx PDF button: replace disabled button with active
  anchor tag using NEXT_PUBLIC_API_URL + estimate_id

Closes #314 (TI-2 + TI-4 sub-tasks)
2026-05-17 20:07:08 +03:00
..
__init__.py init 2026-04-25 13:45:19 +03:00
admin_cadastre.py feat(cadastre): bulk_harvest worker + grid-walker + admin API (#168 PR3/5) (#171) 2026-05-15 13:31:32 +03:00
admin_etl.py feat(etl): fuzzy matcher v2 — pruned threshold 0.85→0.80 for objective mapping coverage 2026-05-17 16:28:20 +03:00
admin_jobs.py refactor(admin): extract _check_token into shared AdminTokenAuth dep (#133) 2026-05-14 23:45:44 +03:00
admin_leads.py refactor(admin): extract _check_token into shared AdminTokenAuth dep (#133) 2026-05-14 23:45:44 +03:00
admin_scrape.py feat(#104): add POST /admin/scrape/ekburg-permits for manual trigger 2026-05-17 08:13:32 +03:00
admin_weight_profiles.py feat(#114): seed 3 default weight presets + include_system API param 2026-05-16 22:49:56 +03:00
analytics.py feat(22k): object page — full exposure 9 blocks (sales/quartirography/metro/photos/docs/specs/checks) (#310) 2026-05-17 15:56:39 +00:00
concepts.py init 2026-04-25 13:45:19 +03:00
custom_pois.py feat(#254): user_custom_pois — backend schema + CRUD + scoring integration 2026-05-17 09:34:33 +03:00
parcels.py fix(sf-17): rosreestr velocity fallback via cad_quarter (~100% EKB coverage) 2026-05-17 16:50:19 +03:00
photos.py fix ui 2026-04-27 20:42:18 +03:00
trade_in.py feat(trade-in): TI-2 PDF export + frontend enable button 2026-05-17 20:07:08 +03:00