Add EDDM size, income, businesses and USPS map link (#13)

## Summary
Closes #13.
- Mirror Monica: join USPS EDDM GIS stats onto the carrier-route picker and link to the official EDDM map.
- GIS miss stays a dash and does not block Find routes; PCM households/cost unchanged.
This commit is contained in:
westfarn committed 2026-09-22 14:37:49 -05:00
1 parent f2eb4b7152
commit 5d6b3a9d7d
6 files changed
+254 -3

No files matched your search

+8 -1
View File
@@ -159,6 +159,10 @@ def postcard_quote(*, action: str, payload: dict) -> dict:
mail_class_for_size,
pick_unit_price,
)
from directmail.providers.postcard.usps_eddm import (
USPS_EDDM_MAP_URL,
enrich_crrt_rows,
)
design_id = payload.get("design_id")
size = str(payload.get("size") or "").strip()
@@ -210,7 +214,7 @@ def postcard_quote(*, action: str, payload: dict) -> dict:
data = list_count_zipcode(zip_codes=[zip_code])
else:
raise ValueError("Enter a ZIP code (or address + ZIP + radius).")
rows = extract_crrt_rows(data)
rows = enrich_crrt_rows(extract_crrt_rows(data), zip_hint=zip_code)
priced = []
for row in rows:
per_piece, source = _price(row["total"])
@@ -227,6 +231,7 @@ def postcard_quote(*, action: str, payload: dict) -> dict:
"mail_class": mail_class,
"zip": zip_code,
"routes": priced,
"eddm_map_url": USPS_EDDM_MAP_URL,
"discovery_list_count_id": data.get("listCountID") or data.get("list_count_id"),
}
@@ -251,6 +256,7 @@ def postcard_quote(*, action: str, payload: dict) -> dict:
rows = [{"code": code, "text": code, "total": 0} for code in codes]
if record_count and len(rows) == 1:
rows[0]["total"] = record_count
rows = enrich_crrt_rows(rows, zip_hint=codes[0] if codes else "")
record_count = int(data.get("recordCount") or data.get("record_count") or 0)
if not record_count:
record_count = sum(int(r.get("total") or 0) for r in rows)
@@ -278,6 +284,7 @@ def postcard_quote(*, action: str, payload: dict) -> dict:
"per_piece": per_piece,
"total": money_total(per_piece, record_count),
"price_source": source,
"eddm_map_url": USPS_EDDM_MAP_URL,
"estimated": {
"per_piece": per_piece,
"pieces": record_count,