← back to Sample Followup Sweep
Console: re-request detection + initial-request date, expandable item detail, pinned port
55d687941a6cc512a2b1355f5a144c25840c7815 · 2026-08-14 13:43:36 -0700 · Steve Abrams
Files touched
M data/fleet.jsonM scripts/build-fleet.jsM server.js
Diff
commit 55d687941a6cc512a2b1355f5a144c25840c7815
Author: Steve Abrams <steve@designerwallcoverings.com>
Date: Fri Aug 14 13:43:36 2026 -0700
Console: re-request detection + initial-request date, expandable item detail, pinned port
---
data/fleet.json | 641 ++++++++++++++++++++++++++++++++++++++-----------
scripts/build-fleet.js | 17 +-
server.js | 31 ++-
3 files changed, 538 insertions(+), 151 deletions(-)
diff --git a/data/fleet.json b/data/fleet.json
index 3fd5bb1..7c83554 100644
--- a/data/fleet.json
+++ b/data/fleet.json
@@ -15,87 +15,124 @@
"dw": "DWKK123171",
"client": "Emily Guth",
"age": 53,
- "req": "06/22/2026"
+ "req": "06/22/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "06/22/2026"
},
{
"mfr": "PCL7033 Prête-Moi Ta Plume! Feather Panel 02",
"dw": "EUR80616",
"client": "Peyton Pawlicki",
"age": 43,
- "req": "07/02/2026"
+ "req": "07/02/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "07/02/2026"
},
{
"mfr": "FRL5229/01",
"dw": "RALPH1077",
"client": "Jay RInehart",
"age": 36,
- "req": "07/09/2026"
+ "req": "07/09/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "07/09/2026"
},
{
"mfr": "PJD6009/01",
"dw": "DWDG987895",
"client": "Alia Garcia",
"age": 32,
- "req": "07/13/2026"
+ "req": "07/13/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "07/13/2026"
},
{
"mfr": "P555-17-Ajanta Plaster",
"dw": "EUR90140",
"client": "Christine Levy",
"age": 30,
- "req": "07/15/2026"
+ "req": "07/15/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "07/15/2026"
},
{
"mfr": "P555-16-Ajanta Plaster",
"dw": "EUR90139",
"client": "Christine Levy",
"age": 30,
- "req": "07/15/2026"
+ "req": "07/15/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "07/15/2026"
},
{
"mfr": "PCL7033-02",
"dw": "EUR80616",
"client": "The Hunter House",
"age": 28,
- "req": "07/17/2026"
+ "req": "07/17/2026",
+ "reRequested": true,
+ "timesRequested": 2,
+ "initialReq": "07/17/2026"
},
{
"mfr": "PDG646/07",
"dw": "EUR70041",
"client": "Margie Pesicka",
"age": 28,
- "req": "07/17/2026"
+ "req": "07/17/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "07/17/2026"
},
{
"mfr": "PCL7033-02",
"dw": "EUR80616",
"client": "The Hunter House",
"age": 25,
- "req": "07/20/2026"
+ "req": "07/20/2026",
+ "reRequested": true,
+ "timesRequested": 2,
+ "initialReq": "07/17/2026"
},
{
"mfr": "FRL5217/01",
"dw": "RALPH1007",
"client": "Kathiann Crews",
"age": 24,
- "req": "07/21/2026"
+ "req": "07/21/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "07/21/2026"
},
{
"mfr": "W7780-13-Regency Flock Velvet Stripe-Red",
"dw": "EUR71111",
"client": "Charlotte Harrison",
"age": 23,
- "req": "07/22/2026"
+ "req": "07/22/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "07/22/2026"
},
{
"mfr": "Belles Rives WALLPAPER",
"dw": "DWBW600417",
"client": "Charlotte Harrison",
"age": 23,
- "req": "07/22/2026"
+ "req": "07/22/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "07/22/2026"
}
],
- "count": 12
+ "count": 12,
+ "reReqCount": 2
},
{
"slug": "spn",
@@ -107,80 +144,114 @@
"dw": "DIG441001V",
"client": "Jacqueline Edwards",
"age": 60,
- "req": "06/15/2026"
+ "req": "06/15/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "06/15/2026"
},
{
"mfr": "Dig-700005-25-type-2-vinyl",
"dw": "Dig700005",
"client": "SEND 2ND DAY SAMPLES*** Marnie Ann Stebner",
"age": 60,
- "req": "06/15/2026"
+ "req": "06/15/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "06/15/2026"
},
{
"mfr": "DIG624430Spn:20481474",
"dw": "DIG624430",
"client": "Andrew B Steinau",
"age": 24,
- "req": "07/21/2026"
+ "req": "07/21/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "07/21/2026"
},
{
"mfr": "DIG-624415 SPN: 20275385",
"dw": "DIG624415-25 vinyl",
"client": "Andrew B Steinau",
"age": 24,
- "req": "07/21/2026"
+ "req": "07/21/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "07/21/2026"
},
{
"mfr": "DIG_977030 spn: 22827698",
"dw": "DIG977030",
"client": "Charlotte Harrison",
"age": 23,
- "req": "07/22/2026"
+ "req": "07/22/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "07/22/2026"
},
{
"mfr": "DIG623071 (SPN#DIG623071 SPN#(13656114)",
"dw": "DIG623071-25-vin",
"client": "Charlotte Harrison",
"age": 23,
- "req": "07/22/2026"
+ "req": "07/22/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "07/22/2026"
},
{
"mfr": "SUNSHINE-MODE-PLAID-WALLPAPER spn:22827966",
"dw": "DIG240013",
"client": "Charlotte Harrison",
"age": 23,
- "req": "07/22/2026"
+ "req": "07/22/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "07/22/2026"
},
{
"mfr": "DIG-74795SM",
"dw": "DIG74795SM",
"client": "Charlotte Harrison",
"age": 23,
- "req": "07/22/2026"
+ "req": "07/22/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "07/22/2026"
},
{
"mfr": "DIG_74793sm",
"dw": "DIG74793",
"client": "Charlotte Harrison",
"age": 23,
- "req": "07/22/2026"
+ "req": "07/22/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "07/22/2026"
},
{
"mfr": "90026",
"dw": "WPEX90026",
"client": "Charlotte Harrison",
"age": 23,
- "req": "07/22/2026"
+ "req": "07/22/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "07/22/2026"
},
{
"mfr": "60400",
"dw": "WPEX60400",
"client": "Charlotte Harrison",
"age": 23,
- "req": "07/22/2026"
+ "req": "07/22/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "07/22/2026"
}
],
- "count": 11
+ "count": 11,
+ "reReqCount": 0
},
{
"slug": "green",
@@ -192,52 +263,74 @@
"dw": "GRS800010",
"client": "Janet Gaza Kolb",
"age": 23,
- "req": "07/22/2026"
+ "req": "07/22/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "07/22/2026"
},
{
"mfr": "BX10180",
"dw": "PWV10180",
"client": "Donna Horner",
"age": 21,
- "req": "07/24/2026"
+ "req": "07/24/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "07/24/2026"
},
{
"mfr": "H172NG5083",
"dw": "PWV500960",
"client": "JRP Design & Remodel, Inc.",
"age": 15,
- "req": "07/30/2026"
+ "req": "07/30/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "07/30/2026"
},
{
"mfr": "S300NQ8242",
"dw": "Cork501520",
"client": "JRP Design & Remodel, Inc.",
"age": 15,
- "req": "07/30/2026"
+ "req": "07/30/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "07/30/2026"
},
{
"mfr": "S300NQ8243",
"dw": "Cork501530",
"client": "JRP Design & Remodel, Inc.",
"age": 15,
- "req": "07/30/2026"
+ "req": "07/30/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "07/30/2026"
},
{
"mfr": "S176NQ8341",
"dw": "Cork501390",
"client": "JRP Design & Remodel, Inc.",
"age": 15,
- "req": "07/30/2026"
+ "req": "07/30/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "07/30/2026"
},
{
"mfr": "G0174NQ8330",
"dw": "Cork500620",
"client": "JRP Design & Remodel, Inc.",
"age": 15,
- "req": "07/30/2026"
+ "req": "07/30/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "07/30/2026"
}
],
- "count": 7
+ "count": 7,
+ "reReqCount": 0
},
{
"slug": "kra",
@@ -249,52 +342,74 @@
"dw": "DWKK134939",
"client": "Lisa McIlhenny FEDEX",
"age": 18,
- "req": "07/27/2026"
+ "req": "07/27/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "07/27/2026"
},
{
"mfr": "2019101.313.0",
"dw": "DWKK134938",
"client": "Lisa McIlhenny FEDEX",
"age": 18,
- "req": "07/27/2026"
+ "req": "07/27/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "07/27/2026"
},
{
"mfr": "F1562/04.CAC.0",
"dw": "DWKK119396",
"client": "Lisa McIlhenny FEDEX",
"age": 18,
- "req": "07/27/2026"
+ "req": "07/27/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "07/27/2026"
},
{
"mfr": "F1562/02.CAC.0",
"dw": "DWKK119394",
"client": "Lisa McIlhenny FEDEX",
"age": 18,
- "req": "07/27/2026"
+ "req": "07/27/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "07/27/2026"
},
{
"mfr": "GWP-3415.16.0",
"dw": "DWKK139575",
"client": "Denise Duggan",
"age": 17,
- "req": "07/28/2026"
+ "req": "07/28/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "07/28/2026"
},
{
"mfr": "ALTHEA COTTON P.CITRON.0",
"dw": "DWKK142456",
"client": "Kristiina Sutherland",
"age": 11,
- "req": "08/03/2026"
+ "req": "08/03/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "08/03/2026"
},
{
"mfr": "ALTHEA LINEN PR.CITRON.0",
"dw": "DWKK142457",
"client": "Kristiina Sutherland",
"age": 11,
- "req": "08/03/2026"
+ "req": "08/03/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "08/03/2026"
}
],
- "count": 7
+ "count": 7,
+ "reReqCount": 0
},
{
"slug": "sca",
@@ -306,38 +421,54 @@
"dw": "DWA89306",
"client": "Michelle kungis",
"age": 45,
- "req": "06/30/2026"
+ "req": "06/30/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "06/30/2026"
},
{
"mfr": "SC WP88355D 0006",
"dw": "DWA82596",
"client": "Leah E Ramsay",
"age": 34,
- "req": "07/11/2026"
+ "req": "07/11/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "07/11/2026"
},
{
"mfr": "wh000013326",
"dw": "DWA88957",
"client": "GoldLeaf Interior",
"age": 23,
- "req": "07/22/2026"
+ "req": "07/22/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "07/22/2026"
},
{
"mfr": "wtt661518",
"dw": "DWA88660",
"client": "GoldLeaf Interior",
"age": 23,
- "req": "07/22/2026"
+ "req": "07/22/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "07/22/2026"
},
{
"mfr": "CL WP26420 0003",
"dw": "DWA89455",
"client": "Lisa McIlhenny FEDEX",
"age": 18,
- "req": "07/27/2026"
+ "req": "07/27/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "07/27/2026"
}
],
- "count": 5
+ "count": 5,
+ "reReqCount": 0
},
{
"slug": "wq",
@@ -349,38 +480,54 @@
"dw": "GLM4134",
"client": "Margie Pesicka",
"age": 28,
- "req": "07/17/2026"
+ "req": "07/17/2026",
+ "reRequested": true,
+ "timesRequested": 2,
+ "initialReq": "07/17/2026"
},
{
"mfr": "FISHNET-SEQUIN-GLITTER-WALLCOVERING-BLACK-COPPER",
"dw": "GLM4134",
"client": "Margie Pesicka",
"age": 28,
- "req": "07/17/2026"
+ "req": "07/17/2026",
+ "reRequested": true,
+ "timesRequested": 2,
+ "initialReq": "07/17/2026"
},
{
"mfr": "LN50035",
"dw": "GRS800776",
"client": "JRP Design & Remodel, Inc.",
"age": 15,
- "req": "07/30/2026"
+ "req": "07/30/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "07/30/2026"
},
{
"mfr": "LN50083-1",
"dw": "GRS800956",
"client": "JRP Design & Remodel, Inc.",
"age": 15,
- "req": "07/30/2026"
+ "req": "07/30/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "07/30/2026"
},
{
"mfr": "LN50084",
"dw": "DWC50084",
"client": "JRP Design & Remodel, Inc.",
"age": 15,
- "req": "07/30/2026"
+ "req": "07/30/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "07/30/2026"
}
],
- "count": 5
+ "count": 5,
+ "reReqCount": 2
},
{
"slug": "thi",
@@ -392,31 +539,44 @@
"dw": "ROP73313",
"client": "Haley McKinley",
"age": 39,
- "req": "07/06/2026"
+ "req": "07/06/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "07/06/2026"
},
{
"mfr": "",
"dw": "ROP73020",
"client": "Haley McKinley",
"age": 39,
- "req": "07/06/2026"
+ "req": "07/06/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "07/06/2026"
},
{
"mfr": "",
"dw": "ROP73216",
"client": "Haley McKinley",
"age": 39,
- "req": "07/06/2026"
+ "req": "07/06/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "07/06/2026"
},
{
"mfr": "",
"dw": "ROP73150",
"client": "Shi Shi Gallery",
"age": 39,
- "req": "07/06/2026"
+ "req": "07/06/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "07/06/2026"
}
],
- "count": 4
+ "count": 4,
+ "reReqCount": 0
},
{
"slug": "pf",
@@ -428,31 +588,44 @@
"dw": "DWPF150036",
"client": "Kristiina Sutherland",
"age": 36,
- "req": "07/09/2026"
+ "req": "07/09/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "07/09/2026"
},
{
"mfr": "BP203004",
"dw": "DWPF150039",
"client": "Kristiina Sutherland",
"age": 36,
- "req": "07/09/2026"
+ "req": "07/09/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "07/09/2026"
},
{
"mfr": "BP203005",
"dw": "DWPF150040",
"client": "Kristiina Sutherland",
"age": 36,
- "req": "07/09/2026"
+ "req": "07/09/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "07/09/2026"
},
{
"mfr": "BP203002",
"dw": "DWC321345",
"client": "Sincere Things, LLC",
"age": 25,
- "req": "07/20/2026"
+ "req": "07/20/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "07/20/2026"
}
],
- "count": 4
+ "count": 4,
+ "reReqCount": 0
},
{
"slug": "yor",
@@ -464,31 +637,44 @@
"dw": "DWJS17726",
"client": "lauren shapiro",
"age": 35,
- "req": "07/10/2026"
+ "req": "07/10/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "07/10/2026"
},
{
"mfr": "56877",
"dw": "DWJS90066",
"client": "Caitlin Rae Designs",
"age": 16,
- "req": "07/29/2026"
+ "req": "07/29/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "07/29/2026"
},
{
"mfr": "56876",
"dw": "DWJS90065",
"client": "Caitlin Rae Designs",
"age": 16,
- "req": "07/29/2026"
+ "req": "07/29/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "07/29/2026"
},
{
"mfr": "56878",
"dw": "DWJS90067",
"client": "Caitlin Rae Designs",
"age": 16,
- "req": "07/29/2026"
+ "req": "07/29/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "07/29/2026"
}
],
- "count": 4
+ "count": 4,
+ "reReqCount": 0
},
{
"slug": "sch",
@@ -500,24 +686,34 @@
"dw": "DWPIL7744",
"client": "Holly Bauer",
"age": 58,
- "req": "06/17/2026"
+ "req": "06/17/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "06/17/2026"
},
{
"mfr": "5000412",
"dw": "DWLK829860",
"client": "judy heiny",
"age": 53,
- "req": "06/22/2026"
+ "req": "06/22/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "06/22/2026"
},
{
"mfr": "WOODPERRY, MIMOSA WALLCOVERINGS |",
"dw": "DWLK803930",
"client": "Elizabeth H Hollingsworth",
"age": 36,
- "req": "07/09/2026"
+ "req": "07/09/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "07/09/2026"
}
],
- "count": 3
+ "count": 3,
+ "reReqCount": 0
},
{
"slug": "chin",
@@ -529,24 +725,34 @@
"dw": "DWCS893848",
"client": "Jessica Noble",
"age": 37,
- "req": "07/08/2026"
+ "req": "07/08/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "07/08/2026"
},
{
"mfr": "6460-41",
"dw": "DWCS930248",
"client": "Alison Iglehart",
"age": 36,
- "req": "07/09/2026"
+ "req": "07/09/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "07/09/2026"
},
{
"mfr": "6620 13WWP",
"dw": "DWCW734546",
"client": "Alison Iglehart",
"age": 36,
- "req": "07/09/2026"
+ "req": "07/09/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "07/09/2026"
}
],
- "count": 3
+ "count": 3,
+ "reReqCount": 0
},
{
"slug": "mor",
@@ -558,24 +764,34 @@
"dw": "DWWM14464",
"client": "Nicole Stauffer",
"age": 33,
- "req": "07/12/2026"
+ "req": "07/12/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "07/12/2026"
},
{
"mfr": "216035",
"dw": "DWWM14707",
"client": "Martha Ratay",
"age": 11,
- "req": "08/03/2026"
+ "req": "08/03/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "08/03/2026"
},
{
"mfr": "216538",
"dw": "DWWM14752",
"client": "Pamela Thomaston",
"age": 11,
- "req": "08/03/2026"
+ "req": "08/03/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "08/03/2026"
}
],
- "count": 3
+ "count": 3,
+ "reReqCount": 0
},
{
"slug": "qua",
@@ -587,24 +803,34 @@
"dw": "DWCW777346",
"client": "",
"age": 31,
- "req": "07/14/2026"
+ "req": "07/14/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "07/14/2026"
},
{
"mfr": "AP303 10PV",
"dw": "DWCW762146",
"client": "Kate Harrell",
"age": 25,
- "req": "07/20/2026"
+ "req": "07/20/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "07/20/2026"
},
{
"mfr": "306520F-102",
"dw": "DWQC600140",
"client": "Sally P Brady",
"age": 11,
- "req": "08/03/2026"
+ "req": "08/03/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "08/03/2026"
}
],
- "count": 3
+ "count": 3,
+ "reReqCount": 0
},
{
"slug": "ver",
@@ -616,17 +842,24 @@
"dw": "VER47203",
"client": "Chanele Williams",
"age": 53,
- "req": "06/22/2026"
+ "req": "06/22/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "06/22/2026"
},
{
"mfr": "AS343264",
"dw": "VER46222",
"client": "FEDEX",
"age": 35,
- "req": "07/10/2026"
+ "req": "07/10/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "07/10/2026"
}
],
- "count": 2
+ "count": 2,
+ "reReqCount": 0
},
{
"slug": "tbd",
@@ -638,17 +871,24 @@
"dw": "DWPN100750",
"client": "Jody Malan",
"age": 53,
- "req": "06/22/2026"
+ "req": "06/22/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "06/22/2026"
},
{
"mfr": "*** ENTER MFR # ***",
"dw": "DWAF74886",
"client": "Sarah Robinson",
"age": 44,
- "req": "07/01/2026"
+ "req": "07/01/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "07/01/2026"
}
],
- "count": 2
+ "count": 2,
+ "reReqCount": 0
},
{
"slug": "arte-international",
@@ -660,17 +900,24 @@
"dw": "DWAR320016",
"client": "Suzi Graef",
"age": 53,
- "req": "06/22/2026"
+ "req": "06/22/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "06/22/2026"
},
{
"mfr": "29243",
"dw": "DWAR320016",
"client": "rachael roberts",
"age": 45,
- "req": "06/30/2026"
+ "req": "06/30/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "06/30/2026"
}
],
- "count": 2
+ "count": 2,
+ "reReqCount": 0
},
{
"slug": "schumacher",
@@ -682,17 +929,24 @@
"dw": "DWLK833920",
"client": "Terri Matthews",
"age": 39,
- "req": "07/06/2026"
+ "req": "07/06/2026",
+ "reRequested": true,
+ "timesRequested": 2,
+ "initialReq": "07/06/2026"
},
{
"mfr": "5005652",
"dw": "DWLK833920",
"client": "Terri Matthews",
"age": 39,
- "req": "07/06/2026"
+ "req": "07/06/2026",
+ "reRequested": true,
+ "timesRequested": 2,
+ "initialReq": "07/06/2026"
}
],
- "count": 2
+ "count": 2,
+ "reReqCount": 2
},
{
"slug": "sand",
@@ -704,17 +958,24 @@
"dw": "DWZF187058",
"client": "FEDEX",
"age": 35,
- "req": "07/10/2026"
+ "req": "07/10/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "07/10/2026"
},
{
"mfr": "217209",
"dw": "DWWM14281",
"client": "Chris Landis",
"age": 25,
- "req": "07/20/2026"
+ "req": "07/20/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "07/20/2026"
}
],
- "count": 2
+ "count": 2,
+ "reReqCount": 0
},
{
"slug": "con",
@@ -726,17 +987,24 @@
"dw": "LIN980008",
"client": "Margie Pesicka",
"age": 28,
- "req": "07/17/2026"
+ "req": "07/17/2026",
+ "reRequested": true,
+ "timesRequested": 2,
+ "initialReq": "07/17/2026"
},
{
"mfr": "RD1893FR",
"dw": "LIN980008",
"client": "Margie Pesicka",
"age": 28,
- "req": "07/17/2026"
+ "req": "07/17/2026",
+ "reRequested": true,
+ "timesRequested": 2,
+ "initialReq": "07/17/2026"
}
],
- "count": 2
+ "count": 2,
+ "reReqCount": 2
},
{
"slug": "thib",
@@ -748,17 +1016,24 @@
"dw": "DWAF65004",
"client": "Paola Salomon",
"age": 25,
- "req": "07/20/2026"
+ "req": "07/20/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "07/20/2026"
},
{
"mfr": "AT24575",
"dw": "DWAF65000",
"client": "Paola Salomon",
"age": 25,
- "req": "07/20/2026"
+ "req": "07/20/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "07/20/2026"
}
],
- "count": 2
+ "count": 2,
+ "reReqCount": 0
},
{
"slug": "sandb",
@@ -770,17 +1045,24 @@
"dw": "DWSS71172",
"client": "Lisa McIlhenny FEDEX",
"age": 18,
- "req": "07/27/2026"
+ "req": "07/27/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "07/27/2026"
},
{
"mfr": "S10176",
"dw": "DWSS74114",
"client": "Lisa McIlhenny FEDEX",
"age": 18,
- "req": "07/27/2026"
+ "req": "07/27/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "07/27/2026"
}
],
- "count": 2
+ "count": 2,
+ "reReqCount": 0
},
{
"slug": "astsand",
@@ -792,17 +1074,24 @@
"dw": "PRN62373",
"client": "Andrea Reiser",
"age": 14,
- "req": "07/31/2026"
+ "req": "07/31/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "07/31/2026"
},
{
"mfr": "wk111 - $20.90 net - 1/12/12)",
"dw": "REW6211",
"client": "JODI MILLER",
"age": 11,
- "req": "08/03/2026"
+ "req": "08/03/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "08/03/2026"
}
],
- "count": 2
+ "count": 2,
+ "reReqCount": 0
},
{
"slug": "pin",
@@ -814,17 +1103,24 @@
"dw": "DWPF600399",
"client": "Marci Stewart",
"age": 14,
- "req": "07/31/2026"
+ "req": "07/31/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "07/31/2026"
},
{
"mfr": "B7570001",
"dw": "DWPF600091",
"client": "Marci Stewart",
"age": 14,
- "req": "07/31/2026"
+ "req": "07/31/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "07/31/2026"
}
],
- "count": 2
+ "count": 2,
+ "reReqCount": 0
},
{
"slug": "coor",
@@ -836,17 +1132,24 @@
"dw": "DWDC330786",
"client": "Kristine Bennett",
"age": 11,
- "req": "08/03/2026"
+ "req": "08/03/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "08/03/2026"
},
{
"mfr": "B00317 Clover Cacao",
"dw": "DWDC330787",
"client": "Kristine Bennett",
"age": 11,
- "req": "08/03/2026"
+ "req": "08/03/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "08/03/2026"
}
],
- "count": 2
+ "count": 2,
+ "reReqCount": 0
},
{
"slug": "san",
@@ -858,10 +1161,14 @@
"dw": "DWAC1010582",
"client": "Susan Berghouse",
"age": 53,
- "req": "06/22/2026"
+ "req": "06/22/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "06/22/2026"
}
],
- "count": 1
+ "count": 1,
+ "reReqCount": 0
},
{
"slug": "bre",
@@ -873,10 +1180,14 @@
"dw": "DWJS90185",
"client": "Reed Reynolds",
"age": 46,
- "req": "06/29/2026"
+ "req": "06/29/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "06/29/2026"
}
],
- "count": 1
+ "count": 1,
+ "reReqCount": 0
},
{
"slug": "jofa",
@@ -888,10 +1199,14 @@
"dw": "DWKK134236",
"client": "Rachel Kiedrowski",
"age": 46,
- "req": "06/29/2026"
+ "req": "06/29/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "06/29/2026"
}
],
- "count": 1
+ "count": 1,
+ "reReqCount": 0
},
{
"slug": "rad",
@@ -903,10 +1218,14 @@
"dw": "DIg4350114V",
"client": "Jenna Quam",
"age": 45,
- "req": "06/30/2026"
+ "req": "06/30/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "06/30/2026"
}
],
- "count": 1
+ "count": 1,
+ "reReqCount": 0
},
{
"slug": "twi",
@@ -918,10 +1237,14 @@
"dw": "DWAR320018",
"client": "Edidiong Odiong",
"age": 39,
- "req": "07/06/2026"
+ "req": "07/06/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "07/06/2026"
}
],
- "count": 1
+ "count": 1,
+ "reReqCount": 0
},
{
"slug": "lbi",
@@ -933,10 +1256,14 @@
"dw": "HWC61147",
"client": "Evelyn Dame",
"age": 38,
- "req": "07/07/2026"
+ "req": "07/07/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "07/07/2026"
}
],
- "count": 1
+ "count": 1,
+ "reReqCount": 0
},
{
"slug": "pj",
@@ -948,10 +1275,14 @@
"dw": "DWCPJ4185LA",
"client": "Lake Flato Architects",
"age": 36,
- "req": "07/09/2026"
+ "req": "07/09/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "07/09/2026"
}
],
- "count": 1
+ "count": 1,
+ "reReqCount": 0
},
{
"slug": "brewster",
@@ -963,10 +1294,14 @@
"dw": "DWBR170698",
"client": "lauren shapiro",
"age": 35,
- "req": "07/10/2026"
+ "req": "07/10/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "07/10/2026"
}
],
- "count": 1
+ "count": 1,
+ "reReqCount": 0
},
{
"slug": "osb",
@@ -978,10 +1313,14 @@
"dw": "EUR70871",
"client": "Lisa McIlhenny FEDEX",
"age": 18,
- "req": "07/27/2026"
+ "req": "07/27/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "07/27/2026"
}
],
- "count": 1
+ "count": 1,
+ "reReqCount": 0
},
{
"slug": "maya",
@@ -993,10 +1332,14 @@
"dw": "Maya50408",
"client": "Pierce Condominium c/o FirstService Residential",
"age": 18,
- "req": "07/27/2026"
+ "req": "07/27/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "07/27/2026"
}
],
- "count": 1
+ "count": 1,
+ "reReqCount": 0
},
{
"slug": "kor",
@@ -1008,10 +1351,14 @@
"dw": "DWK29028",
"client": "Sheryl Repasky",
"age": 16,
- "req": "07/29/2026"
+ "req": "07/29/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "07/29/2026"
}
],
- "count": 1
+ "count": 1,
+ "reReqCount": 0
},
{
"slug": "rbl",
@@ -1023,10 +1370,14 @@
"dw": "DWRW76354",
"client": "Elizabeth Kent",
"age": 15,
- "req": "07/30/2026"
+ "req": "07/30/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "07/30/2026"
}
],
- "count": 1
+ "count": 1,
+ "reReqCount": 0
},
{
"slug": "olp",
@@ -1038,10 +1389,14 @@
"dw": "DWCOP-ART-DECO-WAVES",
"client": "Andrea Reiser",
"age": 14,
- "req": "07/31/2026"
+ "req": "07/31/2026",
+ "reRequested": false,
+ "timesRequested": 1,
+ "initialReq": "07/31/2026"
}
],
- "count": 1
+ "count": 1,
+ "reReqCount": 0
}
]
}
\ No newline at end of file
diff --git a/scripts/build-fleet.js b/scripts/build-fleet.js
index 02231d6..5f0c351 100644
--- a/scripts/build-fleet.js
+++ b/scripts/build-fleet.js
@@ -39,9 +39,20 @@ for (const r of j.records) {
});
}
-const vendors = Object.values(g)
- .map(v => ({ ...v, items: v.items.sort((a, b) => b.age - a.age), count: v.items.length }))
- .sort((a, b) => b.count - a.count);
+// Re-request detection: same DW# (or pattern) + same client appearing more than once
+// = that sample was requested again. Earliest date = initial request.
+const vendors = Object.values(g).map(v => {
+ const byKey = {};
+ for (const it of v.items) { const k = (it.dw || it.mfr) + '|' + it.client; (byKey[k] = byKey[k] || []).push(it); }
+ for (const k in byKey) {
+ const arr = byKey[k];
+ const initial = arr.map(x => x.req).filter(Boolean).sort((a, b) => new Date(a) - new Date(b))[0] || null;
+ const reReq = arr.length > 1;
+ arr.forEach(x => { x.reRequested = reReq; x.timesRequested = arr.length; x.initialReq = initial || x.req; });
+ }
+ const items = v.items.sort((a, b) => b.age - a.age);
+ return { ...v, items, count: items.length, reReqCount: items.filter(x => x.reRequested).length };
+}).sort((a, b) => b.count - a.count);
const out = {
generated: '2026-08-14',
diff --git a/server.js b/server.js
index 8ef57ac..650c5d2 100644
--- a/server.js
+++ b/server.js
@@ -73,7 +73,7 @@ const server = http.createServer(async (req, res) => {
send(res, 404, { error: 'not found' });
});
-const srv = server.listen(0, '127.0.0.1', () => {
+const srv = server.listen(process.env.PORT || 64845, '127.0.0.1', () => {
const port = srv.address().port;
fs.writeFileSync(p('out', 'viewer-port.txt'), String(port));
console.log(`Sample Follow-Up console → http://127.0.0.1:${port}/ (admin / DW2024!)`);
@@ -101,6 +101,13 @@ const PAGE = `<!doctype html><html><head><meta charset="utf-8"><title>Sample Fol
#modal .card{background:#fff;max-width:680px;width:92%;max-height:86vh;overflow:auto;border-radius:10px;padding:22px 26px}
#status{font-size:13px;color:#137a34}
.muted{color:#999;font-size:12px}
+ button.exp{border:none;background:none;cursor:pointer;font:inherit;color:#0645ad;padding:0}
+ table.detail{width:100%;margin:4px 0;background:#fafafd;border:1px solid var(--b)}
+ table.detail th{position:static;top:auto;background:#f0f0f3;font-size:11px}
+ table.detail td{font-size:12px;padding:5px 8px}
+ tr.rr td{background:#f6f0ff}
+ .badge.rrb{background:#ece2fb;color:#5b2ea6}
+ .detailrow>td{padding:0 10px 8px}
</style></head><body>
<header>
<h1>Sample Follow-Up — Vendor Console</h1>
@@ -118,7 +125,7 @@ const PAGE = `<!doctype html><html><head><meta charset="utf-8"><title>Sample Fol
</div>
</header>
<div class="wrap"><table><thead><tr>
- <th></th><th>Vendor</th><th>Items</th><th>Oldest</th><th>Status</th><th>Sample email</th><th>DW acct #</th><th></th>
+ <th></th><th>Vendor</th><th>Items</th><th>Re-req</th><th>Oldest</th><th>Status</th><th>Sample email</th><th>DW acct #</th><th></th>
</tr></thead><tbody id="rows"></tbody></table>
<p class="muted">Queue writes <code>out/send-queue.json</code>. Ready = sample email + acct present. Then in chat: “create the queued drafts” → they land in info@ Drafts for you to send. 15 rows had no vendor id and aren’t shown.</p>
</div>
@@ -132,18 +139,32 @@ function ready(v){const c=S.contacts[v.slug]||{};return c.sample_email&&c.accoun
function sorted(){const k=document.getElementById('sort').value;localStorage.setItem('sfsort',k);const a=[...S.fleet.vendors];
if(k==='items')a.sort((x,y)=>y.count-x.count);if(k==='age')a.sort((x,y)=>y.items[0].age-x.items[0].age);
if(k==='name')a.sort((x,y)=>x.name.localeCompare(y.name));if(k==='ready')a.sort((x,y)=>(ready(y)?1:0)-(ready(x)?1:0));return a;}
+function itemsTable(v){
+ let h='<table class=detail><thead><tr><th>Pattern (Mfr#)</th><th>DW#</th><th>Client</th><th>Initial request</th><th>Re-req</th></tr></thead><tbody>';
+ for(const i of v.items){
+ h+='<tr'+(i.reRequested?' class=rr':'')+'><td>'+esc(i.mfr)+'</td><td class=vid>'+esc(i.dw||'-')+'</td><td>'+esc(i.client||'')+'</td>'+
+ '<td>'+esc(i.initialReq||i.req||'-')+'</td>'+
+ '<td>'+(i.reRequested?'<span class="badge rrb">RE-REQ ×'+i.timesRequested+'</span>':'')+'</td></tr>';
+ }
+ return h+'</tbody></table>';
+}
function render(){const t=document.getElementById('rows');t.innerHTML='';for(const v of sorted()){const c=S.contacts[v.slug]||{};const r=ready(v);
const tr=document.createElement('tr');tr.innerHTML=
'<td><input type=checkbox class=pick data-slug="'+v.slug+'"></td>'+
'<td><b>'+esc(v.name)+'</b><div class=vid>'+esc(v.vid)+'</div></td>'+
- '<td>'+v.count+'</td><td>'+v.items[0].age+'d</td>'+
+ '<td><button class=exp data-exp="'+v.slug+'">▶ '+v.count+'</button></td>'+
+ '<td>'+(v.reReqCount?'<span class="badge rrb">'+v.reReqCount+'</span>':'<span class=muted>–</span>')+'</td>'+
+ '<td>'+v.items[0].age+'d</td>'+
'<td><span class="badge '+(r?'ok':'need')+'">'+(r?'READY':'NEEDS')+'</span></td>'+
'<td><input class="em" data-slug="'+v.slug+'" data-f="sample_email" value="'+esc(c.sample_email||'')+'" placeholder="sample email"></td>'+
'<td><input class="ac" data-slug="'+v.slug+'" data-f="account_number" value="'+esc(c.account_number||'')+'" placeholder="acct #"></td>'+
'<td><button data-prev="'+v.slug+'">preview</button></td>';
- t.appendChild(tr);}
+ t.appendChild(tr);
+ const dr=document.createElement('tr');dr.className='detailrow';dr.style.display='none';
+ dr.innerHTML='<td></td><td colspan=8>'+itemsTable(v)+'</td>';t.appendChild(dr);}
t.querySelectorAll('input.em,input.ac').forEach(i=>i.addEventListener('change',saveContact));
- t.querySelectorAll('button[data-prev]').forEach(b=>b.addEventListener('click',()=>preview(b.dataset.prev)));}
+ t.querySelectorAll('button[data-prev]').forEach(b=>b.addEventListener('click',()=>preview(b.dataset.prev)));
+ t.querySelectorAll('button.exp').forEach(b=>b.addEventListener('click',e=>{const dr=e.target.closest('tr').nextElementSibling;const open=dr.style.display==='none';dr.style.display=open?'table-row':'none';e.target.textContent=(open?'▼ ':'▶ ')+e.target.textContent.slice(2);}));}
async function saveContact(e){const el=e.target;const slug=el.dataset.slug;const row=[...document.querySelectorAll('input[data-slug="'+slug+'"]')];
const em=row.find(x=>x.dataset.f==='sample_email').value.trim();const ac=row.find(x=>x.dataset.f==='account_number').value.trim();
await fetch('/api/contact',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({slug,sample_email:em,account_number:ac})});
← d5b7022 Fleet sweep (37 vendors/106 items) + selection console (serv
·
back to Sample Followup Sweep
·
Harvest vendor sample emails + accounts from Sent folder int cbdaa5d →