Every settled decision, newest first · linked to the thread it came from
The RO work runs across several Slack threads. This page is the single record of what has actually been decided, so a decision made in one thread is visible from the other. If something here is wrong or out of date, say so in any RO thread and it gets corrected here.
Open — not yet decided
Nothing open. (2026-09-26)
2026-10-03 · One RO import per FP material list
Dave: a job can have several FP material lists, and lists can be archived. Each live list (not archived, not Canceled) now becomes its own import.
The header label shows the FP list # the way FP does: FP ML #1260 · Material List for Aaron Anderson.
Dave: Status → RO Import Status; Imported from moves up beside Source order #; BOM created takes its slot: FP ML created date (labelled FP ML · list name) or the BOM file's last-changed date (labelled with the file name).
FP job status and Address (FP Location) were blank because the watcher never filled them. Every FP poll now refreshes them on open inbox rows.
Open: a job can have several material lists, and lists can be archived (Dave). Intake currently takes one list per job.
2026-10-03 · RO Import review: Find SKU, Surplus mark
Find SKU button left of the SKU box in Fix now: likely IM2 items, operator picks; Save still required. (Dave)
Surplus is a mark like Drop/Non-inventory — "Surplus on Accept" with Undo; takes effect at Accept. (Dave)
Marked column renamed On Accept. (Dave)
On hold: Mfr Part # column / stop putting non-QB part #s in SKU; bulk Find SKU; saving a picked part # to the IM2 item (No). (Dave)
2026-10-02 · RO intake: PDF BOMs
The FP and BT polls accept PDF BOMs and convert them to xlsx. Plan-set BOM sheets (Qty Estimated / Part Number / Item Description / Notes) are rebuilt row by row into a spreadsheet, then go through the normal parser. A PDF with no BOM table is still an explicit import error. Part numbers on these sheets are manufacturer numbers, not QB SKUs, so lines arrive without a QB item until matched. (Dave) PDF BOMs
2026-10-02 · Create PO (voice)
New Create PO screen (Purchasing, second row): vendor, issue date, job, class, memo, lines; dictation in the browser; anything uncertain is pink and must be confirmed. Writes straight to QB (not via Workbench), level 2 and up. Create PO
Non-SKU lines use a QB non-inventory/service item (Material, Subcontractor Services, …), never a direct GL charge; PO notes go in the QB Memo. Create PO
2026-09-26 · Main Menu cleanup & open-items close-out
The open-items list is closed. Dave: "I believe we've finished everything." Every TD line from Ver 14 verified done or converted to a System Controls switch; TD-12/13(rest)/14 stay parked as a record only. (Dave) Menu cleanup
Main Menu layout is fixed at four columns (same tile size, narrower page): Shortcuts half-width on one row · Item Master · Inventory Transactions in three rows (picks / Cycle Count, Cycle Count Review, ABC / Handheld Menu, Truck Tech Menu) · Requirements · Purchasing (PO Workbench first) · Support (Admin, Poll/Sync Log, Contacts & Definitions, Manuals / Change Log, Decision Log, Not Finished Yet). Reports and Accounting groups are gone; Vendor Default GL lives inside Admin. The tag legend and the Rush link under "Links to copy" were dropped. Section headings bold and larger. (Dave) Menu layout
The decision log is system-wide, not RO-only — tile and page are titled "Decision Log". Contacts & Definitions: no Title column; Tyler Lightell is the warehouse contact; Dave is reached on Slack only. (Dave) Menu layout
Support tiles are: Admin, Poll/Sync Log, Contacts & Definitions, Operator & Technical Manuals, RO Decision Log, Not Finished Yet. Change Log moved from Reports to Support. Rollout Manual, Training Manual and Testing Issue Log tiles removed; Rush Material Request removed from the Main Menu because it lives on the Truck Tech Menu. (Dave) Menu cleanup
Every new screen key is added to screen_names in base.html or the banner falls back to "Item Attributes" (Poll Log missed this). (Viktor, found via Dave) Poll Log title
2026-09-20 · Truck Pick
Truck stock is "phantom stock" on a QuickBooks sub-job under customer SA Vehicles. Eleven trucks seeded (HT1, HT5, HT6, HV2, HV6, HV7, HV8, LT2, LV1, LV4, LV5), Notes = "YYYY Make Model". Truck Pick is always no-RO; posting writes a mirrored $0 pair per line (truck credit memo + job invoice, reversed for returns). Truck techs get their own menu at /truck with Truck Pick and Rush only. (Dave) Truck Pick
2026-09-18 · Class on FieldPulse imports
Class on a new FP inbox row comes from the verified QuickBooks Customer type, resolved before the Inbox shows it. Blank, unmatched or ambiguous = Service. An operator's Class choice in the Inbox or on the RO is locked against re-poll and backfill; clearing it to blank does not lock. Class is not Type (Job / Stock / Truck). (Dave)
2026-09-17 · Polling, notes & switches
Rejecting an Inbox row does not stop the FieldPulse watcher re-staging the job while it sits in Pending Material — fix the source (remove the material list or change the FP status). BuilderTrend rows of any status do block. Rule D-11. (Dave)
Hold/Reject reason notes are optional; screens ask only when Ask for a reason note on RO Import actions is Yes. Rule D-12. (Dave)
Posting and Auto-PO are three-way switches — No / Yes / Yes (no Slack reminders). (Dave)
Poll Alert Contacts (mirror of rush contacts) get one DM per sweep per source, failures included; seeded Dave, Jeff, Shawn, David Shirley. Every sweep is recorded on the Poll/Sync Log. (Dave)
2026-09-14 · PO line coding
Inventory lines: job reference only, no class. Non-inventory to COGS: job and class. Other P&L lines: class, no job. Always NotBillable. Approve the purchase in the PO Workbench, record approval in the QB PO notes. Awaiting Jeff before build. (Dave)
2026-09-13 · Late-material attribution
A rush RO is attributed to the person who entered it (created_by, entry_source='Rush'); a late existing requirement is attributed to the job's FieldPulse crew. Timestamp inference is only the "went around the system" bucket. (Dave)
Required date on a FieldPulse-imported RO = import date + class lead time in work days (Service 3, Residential 10, Commercial 15), company holidays skipped; the three lead times are System Controls. (Dave) — closes the former open item.
Every screen in IM2 and HH has an operator Help page and a separate technical spec. All 16 undocumented processes plus 6 background jobs were written, and all 24 pre-existing pages were re-checked against the code and corrected. The manuals index is a tile on the main menu; each screen carries its own Help button. (Dave: "Next step is documentation like we did for the item master.") Documentation
IM2 owns the RO class list, not QuickBooks. Four classes only — Residential, Commercial, Service, Administration — held in IM2 with their QB class ids, so QB housekeeping classes never appear in front of a picker. A job whose QB class falls outside the four leaves the field blank for the operator rather than guessing. (Dave) Classes
A pick cannot be saved without a class. Class is required on both the handheld and PC pick screens, which is what stops an unclassed pick reaching the posting step at all. (Dave: "those screens should not save without a class") Group 1 review
The credit memo posts before the invoice. If the CM fails, the invoice is not attempted; if the invoice fails, the CM is rolled back and the operator is told. QuickBooks documents cannot be cancelled, so ordering is the only safe control. (Dave) Group 1 review
Picker and poster are recorded separately. The operator who picked and the admin who posted are both stored on the transaction. (Dave: "change to record the picker and poster") Group 1 review
Anything writing only to our own database is all-or-nothing; anything writing to QuickBooks records success per row. Applied to Pick List Save, the PC Pick Item grid, and both Discard-selected buttons — one request, one transaction, and a failure names the row that blocked it. QuickBooks posting stays per-SKU because a QB write cannot be rolled back. (Dave: "I’m ok with your rule") Save-all audit
Pick Review can change a saved quantity, and 0 removes the line. Audited as a line edit; no other editing on that screen. (Dave) Group 1 review
Every handheld screen has a Menu button, and leaving clears the remembered job. Stops the next person on a shared scanner inheriting the last job. (Dave) Group 1 review
Screen rules are checked as the operator leaves the box, not at save. Min/Max, cost and bin rules now validate on the New Item screen; save-time failures are limited to things only the server can know (duplicate name, QuickBooks rejection). (Dave: "Minimize the checks at save that could fail") Group 1 review
Fields shown in capitals are stored in capitals. Bins and Gen-Loc were styled uppercase but stored as typed, which would have split one bin into two spellings. Now converted on the screen and on the server. (Dave: "do the boxes requiring upper case auto convert?") Group 1 review
Sign-in is rate-limited per person, never per location. Five wrong PINs on an email inside 15 minutes locks that email for 15 minutes; attempts are recorded. Locking by IP was rejected — everyone shares one proxy and one warehouse WAN IP, so it would lock out the whole crew. Sessions expire after 14 days and posts from outside the site are refused. (Dave: "add them") Security
The public handheld menu is accepted for now, and gating it is on the to-do list. Tile names and the manuals are readable without signing in; nothing behind a tile opens. (Dave: "If there’s no risk that’s ok") Security
Open items live on a page, not in a thread. Anything built-but-unfinished is listed on Not Finished Yet — IM2 Open Items (operator page plus technical version), reachable from the main menu and the manuals index. (Dave: "add it to the to do list") To-do list
2026-09-03 · Picking, class codes & no-RO issues
Every pick line carries a QuickBooks class. The class comes from the RO if it has one, otherwise from the RO type (Residential, Commercial, Service), and is written to every line of both the invoice and the credit memo. A pick whose class cannot be resolved is refused rather than posted without one. (Dave: "are you entering the class code on the invoice and CM? We need to.") HH pick screens
Issuing material with no RO is allowed. The find box works the same way; when the typed name matches no RO, the last row of the dropdown offers "Search QB jobs", which switches the same dropdown to QuickBooks jobs. Choosing one opens the pick screen in no-RO mode against that job, where every line is an addition. No-RO picks are flagged as "Direct issue — no RO" on the review screen. (Dave) HH pick screens
A no-RO issue must have a class. There is no RO type to derive one from, so the screen prompts for the class and refuses to save or post until it is set. (Dave: "prompt and force it or disallow the transaction") HH pick screens
Items added at the bottom of a pick are real issues. An added or substituted SKU is picked, invoiced and relieved from inventory like any other line, and is also recorded against the job. HH pick screens
Full-screen versions of both pick screens run alongside the handheld ones — desktop tiles open the full-screen versions, the scanner menu keeps the handheld ones, and both share the same pick session, so a pick started on a scanner can be finished at a desk. The desktop issue-to-job screen takes many SKU lines against one job before saving. (Dave) HH pick screens
2026-09-02 · Build
RO Inquiry now shows the source order number, priority and job status as columns, with the source order number linked straight to the FieldPulse job record; the RO detail header links too. Search matches the source order number as well as the RO number. Source order # = the FP job number users see (e.g. #4162); a separate Source column is not needed because BuilderTrend orders will show as "BT #…" in the same column. (Dave) RO inquiry columns
Priority and job status refresh on a daily sync (5:30 AM CT) from FieldPulse, with the last-synced time shown on hover and on the RO detail header. FP priority is the job custom field "Priority" (1–5) and is blank on many jobs today. (Dave) RO inquiry columns
The three pick screens are live on the IM2 app — Pick List, Pick Item and Pick Review — wired to the live RO database with real QuickBooks posting behind the Post button. Proven through the screens themselves: quantities entered and saved, then posted, producing a $0 invoice and a $0 credit memo; the test documents were deleted afterwards. HH pick screens
Service picks book to QuickBooks customer SA:Admin with class Service, because FP service jobs generally have no QB job of their own. Verified live: a service pick posted a $0 invoice to SA:Admin with the Service class on the line. Production picks still match the RO job name to the QB job and abort rather than guess if there is no single match. HH pick screens
Pick session tables live in the RO database (ro_pick, ro_pick_line, one open session per RO, save-for-later shared by both handheld screens). Posting verified end to end in production: a mixed pick created a $0 sales invoice plus a $0 credit memo on the correct QB sub-customer with ro_txn rows written in the same transaction; both test documents were deleted afterwards. HH pick screens
2026-09-02 · Picking setup
Gen-Loc is display-only on the scanner. Clarified: it is the existing IM2 items.gen_loc field (ELECT-SR, ROOF-SR, SOLAR-SR, SVC-SR, FLOOR, YARD, WH2), not a literal "GEN-LOC" placeholder — blank-bin lines display and sort by gen_loc at the end of the walk. Nothing written to primary_bin. (Dave) HH pick screens
Picking is Alex Tipton and Tyler Lightell. Both already have IM2 logins — Alex admin (can post), Tyler level 2 (can pick). No new accounts needed. (Dave) HH pick screens
Pick invoices post at $0, same as the existing BOM inventory-issue invoices. (Dave) HH pick screens
Items with no bin sort to the end of the pick walk and display as GEN-LOC on the scanner. 605 of 1,522 active items have no primary bin today — 491 of those are C items, as Dave expected. (Dave) HH pick screens
Surplus is a line type, not an order type — line_type = INV | NONINV | SURPLUS, with a surplus register rather than defaulting qty on hand to qty required. (Dave) RO budget / SURPLUS
2026-09-02 · Scope & accounting
SURPLUS carries no COGS by design — when surplus is used the sale is discounted, so there is no expected cost on the job. No $0 line, no nominal JE; margin reads correctly because the revenue was reduced too. (Dave) RO budget / SURPLUS
Non-inventory refresh matching threshold: auto-match only at 95%+ confidence, otherwise ask the operator. (Dave) Non-inventory
Scope for now is the demand side end to end — ROs created, consumed and closed. The supply side (QB PO writes, the Intuit app, PO release and distribution) is deferred to the Purchasing Workbench project. (Dave) Order creation & change mgmt
Production BOM hand-off mechanism: Dave is working it; Dropbox intake folder stays the interim path. (Dave) Logistics roadmap
2026-09-02 · Picking
Negatives allowed on the pick screens (Option A). A mixed pick posts two QB documents: sales invoice for positives, credit memo for negatives, same job. Simpler for the operator than sending him to another screen. HH pick screens
Qty 0 on a pick means the requirement is dropped: write qty_adj = −qty_source with a note. Never zero qty_source, never write qty_required (it is a generated column). BOM Required stays visible as the design number. HH pick screens
A blank qty box is not the same as 0. Blank = not picked yet, explicit 0 = deliberate line kill and needs a confirm tap. HH pick screens
Save-for-later runs on a pick session (ro_pick / ro_pick_line), one open session per RO, shared by both handheld screens. Nothing hits ro_txn or QuickBooks until it is posted. HH pick screens
Pick List defaults to primary-bin order (the walk path); SKU sort and a SKU/description search box are both there. Over-picking against on-hand warns, never blocks. HH pick screens
Substitution needs no new machinery: manual line for the replacement + negative adjustment on the line it replaces. HH pick screens
Claude builds the three screens; QuickBooks posting stays with Viktor as post_pick_to_qb(). Budget approved by Dave. HH pick screens
2026-09-01 · Surplus / used equipment
Proposed and pending Dave's call: SURPLUS is a line attribute (line_type = INV | NONINV | SURPLUS), not an order type. Order type says where demand came from; surplus says where supply comes from, and one job mixes both. RO budget / SURPLUS
Proposed: do not default qty on hand to qty required for surplus — one used inverter on two BOMs would read as available twice. Small surplus register instead (tag #, desc, part, qty, bin, Available/Committed/Issued), commit a specific record. RO budget / SURPLUS
Proposed: SURPLUS writes a warehouse movement but suppresses the QB invoice line; excluded from the buy-side workbench and from PO links. RO budget / SURPLUS
2026-08-29 · Non-inventory refresh matching
Refresh earns the match or asks: exact description → part no → close-but-not-exact → operator picks from the order's non-inv lines. Nothing auto-matches on a fuzzy score; skipped lines go to Issues to Resolve, never dropped. Non-inventory
Display numbers RO-SKU (inventory) / RO-XXX (non-inv) are labels only — the database key stays line_key, so inserting a BOM line can never repoint a PO link. Non-inventory
On confirming a match the line description is overwritten with the new wording; the match screen shows qty + UOM and flags candidates already on a PO. Non-inventory
Issue resolution is typed: 'SKU not in QB' prompts for a SKU and flips the line to inventory; 'no qty' prompts for a quantity and cannot be ignored. Level 2 and above resolve; level 3 is view-only. Order creation & change mgmt
Screens 1 and 2 (Issues to Resolve, RO Inquiry / Material Status) built and deployed, in review. Order creation & change mgmt
2026-08-26 · Model, truck stock, sources
BOM = as designed, RO = as needed. Refresh overwrites the design qty and re-applies the adjustment, so required is recomputed and can never drift. Order creation & change mgmt
No stored status anywhere — line and order state derive. The only stored intent is Cancelled / Closed Short per line. Cancelling never zeroes the required qty. Order creation & change mgmt
Quantity mismatches are an exception report, not a blocker. Over-issue is normal in flight (500 ft reel for a 450 ft need) until the partial returns. Order creation & change mgmt
A SKU appears on an RO once (duplicate BOM lines are summed). Several ROs per job are fine, distinguished by BOM name; refresh-vs-new is decided on job + BOM name. Order creation & change mgmt
Non-inventory lives in the same tables via line_type, not a separate system. Non-inv is never issued; its status derives from the PO link chain. Non-inventory
Truck stock is a third order type: one RO per truck per day (job = truck #, BOM name = the date). Truck ROs do drive purchasing. Only the truck-to-job credit memo is excluded from RO matching. Order creation & change mgmt
Service demand comes from FieldPulse material lists, resolved on item_id first with SKU as fallback. Production BOMs are engineering's Excel files via the Dropbox intake folder — they are not in FieldPulse. Order creation & change mgmt
Min/max and lead time live in the Item Master, not in RO. RO reads them, never copies them. Logistics roadmap
A PO line supplies the RO line it was released against — demand cannot be moved between ROs. Logistics roadmap
Source links open the Slack thread the decision was made in.