Add EDDM size, income, businesses and USPS map link (#18)
Deploy Beta / unit-tests (push) Successful in 26s
Deploy Beta / docker (push) Successful in 28s
Deploy Beta / deploy-beta (push) Successful in 6m27s

## Summary
Closes #17.

- Join USPS EDDM GIS stats onto the carrier-route picker: household size, median income, business count.
- Add Open USPS EDDM map link next to Find routes.
- GIS miss stays a dash and does not block Find routes. PCM households and cost unchanged.

Template: westfarn/web_django_template#13

## Test plan
- [ ] Find routes for a ZIP; table shows Size / Income / Businesses columns
- [ ] Missing GIS values render as —
- [ ] Open USPS EDDM map opens eddm.usps.com
- [ ] Quote and 1–2 route send still work
- [ ] `CarrierRoutePostcardTests` pass

Reviewed-on: #18
This commit was merged in pull request #18.
This commit is contained in:
westfarn committed 2026-09-22 12:40:08 -07:00
1 parent 045e956011
commit 8e3c0a5909
6 files changed
+254 -2

No files matched your search

+8 -1
View File
@@ -456,6 +456,10 @@ def postcard_quote(*, action: str, payload: dict) -> dict:
mail_class_for_size,
pick_unit_price,
)
from messaging.providers.postcard.usps_eddm import (
USPS_EDDM_MAP_URL,
enrich_crrt_rows,
)
template_id = str(payload.get("template_id") or "").strip()
design_id = payload.get("design_id")
@@ -511,7 +515,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"])
@@ -528,6 +532,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"),
}
@@ -553,6 +558,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)
@@ -580,6 +586,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,