[object Object]

← back to Nationalrealestate

Refine: add situs addresses to Sonoma/Maricopa/Thurston deed feeds + global future-date guard (dropped 39 bad-entry future sales)

9ca69074ec4dcc5b350dac7dcd689aaa7e056ff5 · 2026-07-26 16:39:02 -0700 · Steve Abrams

Files touched

Diff

commit 9ca69074ec4dcc5b350dac7dcd689aaa7e056ff5
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Sun Jul 26 16:39:02 2026 -0700

    Refine: add situs addresses to Sonoma/Maricopa/Thurston deed feeds + global future-date guard (dropped 39 bad-entry future sales)
---
 src/ingest/parcels/arcgis_sales.ts | 20 +++++++++++++-------
 1 file changed, 13 insertions(+), 7 deletions(-)

diff --git a/src/ingest/parcels/arcgis_sales.ts b/src/ingest/parcels/arcgis_sales.ts
index b3d1368..e0da018 100644
--- a/src/ingest/parcels/arcgis_sales.ts
+++ b/src/ingest/parcels/arcgis_sales.ts
@@ -20,6 +20,7 @@ import { upsertParcels, normAddress, registerParcelSource, type ParcelUpsertRow
 
 const PAGE = 2000;
 const MAX_PER_RUN = Number(process.env.SALES_MAX_PER_RUN || 6000);
+const TODAY = new Date().toISOString().slice(0, 10); // future-date guard: county feeds carry occasional bad-entry future sales
 
 interface Rec {
   fips: string; apn: string;
@@ -142,13 +143,14 @@ const SOURCES: Record<string, Source> = {
     key: 'sonoma', label: 'Sonoma County CA', cursorKey: 'sonoma', geometry: false, orderBy: 'OBJECTID', pageSize: 2000,
     layer: 'https://socogis.sonomacounty.ca.gov/map/rest/services/CRAPublic/ParcelsPublic/FeatureServer/0',
     where: 'SaleSalesPrice>0',
-    outFields: 'APN,SaleSalesPrice,SaleRecordingDate,SaleDocNum,SalePriorSalesPrice,SalePriorRecordingDate,SalePriorDocNum',
+    outFields: 'APN,SaleSalesPrice,SaleRecordingDate,SaleDocNum,SalePriorSalesPrice,SalePriorRecordingDate,SalePriorDocNum,SitusFormatted1,SitusCity',
     toRecords: (fs) => { const out: Rec[] = [];
       for (const f of fs) { const a = f.attributes; const apn = s(a.APN); if (!apn) continue;
+        const addr = clean(a.SitusFormatted1), city = clean(a.SitusCity);
         const cur = anyPrice(a.SaleSalesPrice), cd = anyDate(a.SaleRecordingDate);
-        if (cur && cd) out.push({ fips: '06097', apn, price: cur, saleDate: cd, docNum: s(a.SaleDocNum) } as Rec);
+        if (cur && cd) out.push({ fips: '06097', apn, address: addr, city, price: cur, saleDate: cd, docNum: s(a.SaleDocNum) } as Rec);
         const pp = anyPrice(a.SalePriorSalesPrice), pd = anyDate(a.SalePriorRecordingDate);
-        if (pp && pd) out.push({ fips: '06097', apn, price: pp, saleDate: pd, docNum: s(a.SalePriorDocNum) } as Rec);
+        if (pp && pd) out.push({ fips: '06097', apn, address: addr, city, price: pp, saleDate: pd, docNum: s(a.SalePriorDocNum) } as Rec);
       } return out; },
   },
   colorado: {
@@ -165,17 +167,20 @@ const SOURCES: Record<string, Source> = {
     key: 'maricopa', label: 'Maricopa County AZ (Phoenix)', cursorKey: 'maricopa', geometry: false, orderBy: 'OBJECTID', pageSize: 1000,
     layer: 'https://gis.mcassessor.maricopa.gov/arcgis/rest/services/MaricopaDynamicQueryService/MapServer/3',
     where: "SALE_PRICE>'0'",
-    outFields: 'APN,SALE_PRICE,SALE_DATE,DEED_DATE,DEED_NUMBER',
+    outFields: 'APN,SALE_PRICE,SALE_DATE,DEED_DATE,DEED_NUMBER,PHYSICAL_STREET_NUM,PHYSICAL_STREET_DIR,PHYSICAL_STREET_NAME,PHYSICAL_STREET_TYPE,PHYSICAL_CITY,PHYSICAL_ZIP',
     toRecords: (fs) => fs.map(f => { const a = f.attributes; const apn = s(a.APN); if (!apn) return null;
-      return { fips: '04013', apn, price: anyPrice(a.SALE_PRICE), saleDate: anyDate(a.SALE_DATE) || anyDate(a.DEED_DATE), docNum: s(a.DEED_NUMBER) } as Rec; }).filter(Boolean) as Rec[],
+      const addr = [s(a.PHYSICAL_STREET_NUM), s(a.PHYSICAL_STREET_DIR), clean(a.PHYSICAL_STREET_NAME), s(a.PHYSICAL_STREET_TYPE)].filter(Boolean).join(' ').trim() || null;
+      return { fips: '04013', apn, address: addr, city: clean(a.PHYSICAL_CITY), zip: s(a.PHYSICAL_ZIP),
+        price: anyPrice(a.SALE_PRICE), saleDate: anyDate(a.SALE_DATE) || anyDate(a.DEED_DATE), docNum: s(a.DEED_NUMBER) } as Rec; }).filter(Boolean) as Rec[],
   },
   thurston: {
     key: 'thurston', label: 'Thurston County WA (Olympia)', cursorKey: 'thurston', geometry: false, orderBy: 'OBJECTID', pageSize: 1000,
     layer: 'https://map.co.thurston.wa.us/arcgis/rest/services/Thurston/Thurston_Parcels/FeatureServer/0',
     where: 'SALE_PRICE>0',
-    outFields: 'PARCEL_NO,SALE_PRICE,SALE_DATE',
+    outFields: 'PARCEL_NO,SALE_PRICE,SALE_DATE,SITUS_STRE,SITUS_CITY,SITUS_ZIP',
     toRecords: (fs) => fs.map(f => { const a = f.attributes; const apn = s(a.PARCEL_NO); if (!apn) return null;
-      return { fips: '53067', apn, price: anyPrice(a.SALE_PRICE), saleDate: anyDate(a.SALE_DATE) } as Rec; }).filter(Boolean) as Rec[],
+      return { fips: '53067', apn, address: clean(a.SITUS_STRE), city: clean(a.SITUS_CITY), zip: s(a.SITUS_ZIP),
+        price: anyPrice(a.SALE_PRICE), saleDate: anyDate(a.SALE_DATE) } as Rec; }).filter(Boolean) as Rec[],
   },
   'palm-beach': {
     key: 'palm-beach', label: 'Palm Beach County FL', cursorKey: 'palm_beach', geometry: false, orderBy: 'OBJECTID', pageSize: 2000,
@@ -237,6 +242,7 @@ export function ingestArcgisSales(key: string) {
         if (!feats.length) break;
         for (const r of src.toRecords(feats)) {
           if (!r.apn) continue;
+          if (r.saleDate && r.saleDate > TODAY) r.saleDate = null; // drop impossible future dates (bad source entries)
           seenFips.add(r.fips);
           const gisUrl = `${src.layer}/query?where=${encodeURIComponent(src.outFields.split(',')[0] + "='" + r.apn + "'")}&outFields=*&f=html`;
           rows.push({

← 55b0bc6 USRE grid: active-filter summary bar + one-click clear-all;  ·  back to Nationalrealestate  ·  USRE nav: render one canonical nav across all pages via nav- 6924dcd →