Field Guide
Field Guide CEERP — Colorado Envelope ERP
On this page
This is the estimator prototype for Colorado Envelope, built by PressForge Technologies. It replaces hunting through die spreadsheets, number-out sheets and PDFs with one place. Everything shown comes from the client's own files or from a labelled SAMPLE; nothing is guessed. When a value is unknown it says Not provided — it is never shown as 0.
Finding things and finishing jobs
- Search (top bar, every page): type an order number, PO number, estimate number, die number or scan tag and you land on it; type anything else — a customer, a job title, a vendor, a size — and you get matches grouped by kind.
- ✓ Mark complete on an order (or ✓ Done on its schedule row) finishes the job: Location becomes Complete, it leaves every schedule list, and CEERP records who finished it and when. Reopen puts it back on Converting Unscheduled. The Reports page counts finished jobs in the week they were completed here.
- On a tablet or phone the menu is behind the ☰ button at the top left. Sidebar groups fold; click a group name to open or close it — the group holding the page you are on always opens.
Logging in
- Type your name. It is stamped on every estimate, manual price, cost line and quote so changes can be traced in the audit log.
- Log in with your name and your own password. An admin gives you a temporary password first; you choose your own at the first login.
Reaching the app
- CEERP runs in the cloud at https://ceerp.pressforgetechnologies.com/ (a Google Cloud server in PressForge's account, central US). Until that name is switched on, the same server answers at https://ceerp.136.113.11.105.sslip.io/. Open the address in any browser, on any network; there is nothing to install. The connection is always HTTPS; the plain-HTTP address redirects.
- Log in with your name and your password. The same names and passwords that worked on the workstation copy carry over, because they live in the database and the database moved with the app.
- The app restarts by itself if the server reboots. If the page will not load, PressForge checks the service on the server (the log is
/var/log/ceerp/app.logthere). - The database and the private files (dieline PDFs, documents, chat screenshots) are zipped every night at 02:00 Mountain time into a backup folder on the server and copied to a private storage bucket; the last 30 nights are kept.
- The copy on the PressForge workstation (the tailnet address) is retired; it no longer starts and its data is frozen at the day of the move.
Home
- Four tiles: Find a Die, New Estimate, Saved Quotes, Paper Prices.
- Status strip: dies imported (and how many are flagged needs review), number-outs on file, dies with a verified dieline (and how many only have an unverified filename match), price-feed state and last check, estimates needing review, quotes generated, last import.
Find a Die
- Search box accepts a die number (219, #131-N, 10-V), a size (6 x 9, 4 1/8 x 9 1/2 — either orientation matches), a cabinet slot (G52) or a word from the notes (Leanin Tree).
- Filters: cabinet letter, envelope type (the source workbook's category: Side Seam, Diagonal, MO Booklets, MO Catalogs) and family (open side / open end / diagonal).
- Columns: Die #, Finished Size, Type (category + style code such as OSBK, DIA, OE CAT), Cabinet slot, Flat Size (the number-out sheet's FLAT or BLANK size), Seal / Side / Back flap, Throat, how many number-outs are on file, and dieline state (verified / unverified / missing).
- The same die number can appear more than once. That is real: #26 is both a 4 1/8 x 9 1/2 side-seam die and other sizes in the client's lists. The app identifies a die by number + finished size + family, never by number alone.
- Estimate opens a new estimate with that die already chosen.
Die page
- Specifications: every known measurement, with the original text from the spreadsheet. "Side Flaps" is a single value because the source sheets give one number. Where the source said "Throw" it is shown as throat with a note.
- Cabinet: from Updated DIES BY CABINET.xlsx. If the number-out sheet listed a different location, the cabinet sheet wins and the other location is kept in the notes. A die stored in several slots shows all of them (A15, A16, A17).
- Number Out by Parent Sheet: one row per parent sheet, with the source file and row. "0 out" rows in the source (die does not fit) are recorded as a note, not a yield. "Verified" is blank until production confirms a yield.
- Dieline PDFs: every PDF whose filename names this die, one row per imposition (1-up on 24 x 17 7/8, 2-up on 25 x 38, …) with the artwork variants (plain, face bleed, full bleed, inside tint) beside it. They are all drawings of the same die, which is why a die shows 9–17 files. unverified means the link came from the filename and an admin has not yet confirmed the drawing is really this die; ✓ current marks the file that quotes append. Admins see Verify all N as die #… (one click for the whole die, the plain 1-up becomes current) and a Verify button per file. Reference sheets underneath are printed number-out workbooks: not drawings, nothing to verify.
- Reference sheets: the printed number-out PDF the die came from.
- Other dies with the same finished size: compare flaps and throat before choosing.
- Import findings: conflicts between the client's own files for this die (e.g. two different number-outs for the same sheet). The earlier value was kept and the die is flagged.
New Estimate
- A. Customer and Job: pick a customer (or add one at the bottom of the page), job name, quantity in envelopes, optional due date.
- B. Envelope / Die: the chosen die and its specs. Parent sheet / Number Out lists only yields on file for that die — you cannot type a guess.
- C. Paper: choose a stock. The list starts with stocks on the chosen parent sheet; type a word (e.g. wove 24) and press Enter to search the whole Kelly Spicers guide. The list shows SKU, parent sheet, unit basis and the latest price with its state (valid / stale / SAMPLE). If the stock's sheet does not match the number-out sheet you get a warning. Enter a paper price by hand overrides the feed and requires a reason; it is recorded with your name. Setup sheets and waste allowance are explicit inputs: fraction of gross (0.05 = 5%) or extra blanks. Blank means none.
- D. Sheets and cost: the calculation written out, e.g. Run sheets = ceil(10,000 ÷ 6 out) = 1,667, then setup sheets added once. Paper cost shows the conversion used (per sheet, per M sheets, per CWT with M-weight, per ream). If a conversion cannot be done you see Unit conversion needs review instead of a number. The cost table lists Paper, any manual lines, and Not configured rows for converting, printing, labor and consumables — the client has not supplied those costs, so the subtotal is partial and says so.
- Selling price: optional, needs a reason, shows markup and margin against the partial subtotal (they are different numbers and both are labelled).
- Legacy workbook check: picks the same items the old Colorado Envelope Quotes.xlsm offers (convert item/option, print item/colors, stock price per M sheets, negs, latex, peel & seal, flat charges) and shows what that workbook would look up for this quantity, with the sheet and cell each number came from. It is a cross-check only — unverified — and never flows into cost lines.
- Save Draft recalculates everything on the server and stores the inputs, steps and warnings with the estimate, so reopening it later shows exactly what was assumed.
- Add a manual cost line: category, description, quantity, unit cost and a required reason. Manual lines are marked manual.
- Status: Draft; Price needs review (set automatically when something blocks or a price is SAMPLE/stale); Ready for client review (you set it, only when nothing blocks); Approved (disabled in this prototype until IT/accounting sign off).
- Duplicate / revise copies the estimate (and manual lines) into a new one.
Quotes
- Generate Internal Review Quote PDF: full worksheet — customer, job, quantity, die number, type, cabinet, finished/flat size, flaps, throat, parent sheet and number-out, paper source and last-checked time, cost lines with verified/unverified status, legacy check, warnings — watermarked PROTOTYPE — INTERNAL REVIEW ONLY.
- Generate Customer Quote PDF: only after the estimate is Ready for client review. No cabinet, costs or price sources. Shows the selling price only if approved, otherwise Pricing pending review.
- Dieline: the die's verified current one-up PDF is appended after the quote pages. If only an unverified filename match exists, the internal PDF attaches it and stamps that fact; the customer PDF attaches nothing. If no PDF is linked, the quote says so in red — nothing unrelated is ever attached.
- Each generation is a new revision with its own frozen snapshot (die fields, yield, material, price observation and timestamp, cost lines, formula version). Older revisions never change, even after a price refresh.
- Download gives the PDF; ZIP packages the quote PDF and the dieline as separate files.
- Saved Quotes searches by customer, die and date.
Paper Prices
- Shows each material with supplier, SKU, parent sheet, unit basis (per sheet, per 1000 sheets, per CWT, per ream), current price, last observed time and state: valid, stale (older than the configured window: 45 days for a price read from the published price guide, which is dated by its cover date; 7 days for a live store crawl), SAMPLE, missing.
- The feed banner says whether the Kelly Spicers collector is connected. In this build it is not; the sample fixture stands in and every sample price is labelled.
- Sync Kelly Spicers pricebook now (admin) downloads the published Denver price guide and loads every SKU with size, weight, M-weight and list price; the guide's date becomes the price date. Prices are list prices, not the account's contract price.
- Store crawl (experimental) (admin) signs in with the browser session cookie saved in .env, reads the whole online catalog, creates a material per SKU and records every price with its unit basis; progress shows on the page. If the store asks to log in again, sign in in Chrome and paste a fresh cookie.
- Re-read feed file / fixture (admin) runs the adapter: new observations are appended, duplicates skipped, prices that cannot be matched to a material unambiguously go to the Unmatched list and are never used.
- Refreshing never changes a saved quote's snapshot.
Production Orders (edit here)
- Every order copied from the production site opens read-only (View) and editable (Edit). The edit page is built from the order's own field names, grouped the way the site groups them: Customer and job, Quantity and price, Envelope, Stock and printing, Die (from the Out tables), Routing and schedule, Shipping and packing, Instructions and notes, Contact. Dropdowns come from the Site Tables (Location, Routing, Description, Printing, Type of Gum, Seal Flap, Inside Tint Style, Colo Env Stock, Box Size, Ctn Size) and the machine list; a value the site has that is not in its own table still shows, marked "(not in the site's list)".
- Update saves here only and recomputes pieces and extended value the same way the sync does. The order is then badged edited here · differs from production site and a later sync leaves it alone. The audit log records every changed field with old and new value.
- Add New Production Order numbers the order after the highest one on file, badges it created in this app and puts it on Converting Unscheduled.
- Documents on the edit page: upload, open, delete files for the order (stored privately on this machine).
- Schedules (each machine in the sidebar, the Unscheduled lists): rows are in sequence order with the site's columns (Job # / Customer / Qty / Sz1 / Sz2 / Description / Prtg / Location / Stk Due / Order / Date Due / Status). Long text is clipped; Expand / Collapse at the top right shows it in full (the choice is remembered on this browser). The pencil on a row turns it into inputs — order number, location, stock due, date due, machine — then Save (the site saves cell by cell the same way) or Cancel. Move to… sends the job to another machine's schedule or back to an unscheduled list. Add order to this list takes an order number; Renumber 1…n rewrites the sequence in the current order; Print opens the print view. View Schedules shows every machine's queue in three columns — Jet, Folding, Straight Knife — grouped by the machine table's category, as the site does.
Out tables, Customers, Vendors, Machines (edit here)
- Out Diagonals / MO Booklet / MO Catalog / Side Seam / Adjustable / WEB-RA: + Add above the table opens the add form, the pencil edits and the trash deletes on every row. Rows are in the site's own order; the Flat Size column appears only when a row has one (the site has no such column). The die number is matched to the die library the same way the site's rows are. Rows added here are badged "added here", changed rows "edited"; a sync keeps both and does not bring back a deleted site row.
- Customers: laid out like the site — # / Name / Actions. The pencil opens the customer page; Contacts (n) opens a pop-up with the contact table (pencil edits on the customer page, trash deletes, an add form at the bottom), green when there is at least one contact and amber at none; the trash deletes the customer. The search box matches the customer name, any contact name / email / phone, or any of that customer's production orders by customer PO#, job#, order# or job title (so a PO number from a packing slip finds the customer). Add Customer, name and Active / Inactive on the customer page (Save, All production orders, New estimate and the red Delete sit on one row), the trash can deletes the customer (orders and estimates are kept), contacts add / edit / delete. A renamed customer renames its estimator record and its orders.
- Vendors: the Contacts button is amber when a vendor has no contact and green when it has one or more; Edit Vendor, Contacts, POs and Delete are the same width. A vendor with no address or no contact shows a suggestion in red italics with ✓ (accept: written into the vendor) and ✗ (reject: never offered again). Suggestions come from the vendor's own purchase orders (the address cell, the contact fields on the print views) and from lookups recorded with their source; the source is shown beside each one. Where nothing is on file anywhere, "look it up ↗" opens a web search for the vendor in a new tab. Nothing is written to a vendor until someone presses ✓.
- Vendors: laid out like the site: # / Name / Address / Actions with Edit Vendor (pop-up), Contacts (pop-up table: name, email, telephone, ext, fax, cellphone, each row editable, add form) and Delete; Add Vendor at the top. Click the vendor name for its purchase orders. Delete hides the vendor from the list and the PO vendor picker while its purchase orders keep the name.
- Site Tables: the fifteen dropdown lists (Location, Routing, Type Of Gum …) in tabs, as on the site. Each value shows Used on: how many copied production orders carry it in the order fields that table feeds (Location → Location, Routing → Machine 1-6, Ctn Size → Folding Box Size, Box Size → Bulk Box Size, Ship To → Window 1-3 Film, Folding / Jet Status → the schedule status, Window Sizes → Window 1-3 Size); click the count to list those orders. Window Film's values appear in no order field, so it shows a dash. Deleting a value does not touch the orders that carry it — the count is there so you know what you are orphaning. Pencil edits in the row, the trash can deletes, the "Add …" row at the bottom adds.
- Machines: laid out like the site: one table with + Add (pop-up form) and Categories (pop-up with the category table, its pencil / trash buttons and an add row) at the top right. Add, edit, delete machines and machine categories. The sidebar and the schedule pages follow this table: a renamed machine renames its schedule and its jobs' machine status, a disabled machine leaves the sidebar, a machine with jobs on its schedule cannot be deleted until they are moved.
- Email a purchase order: when SMTP is configured in .env the Email box sends from this server (PO as the message, its documents attached, your note on top) and logs it; otherwise it opens your mail program as before.
- Tables everywhere now use the production site's look: bordered cells, alternating row shading, hover highlight.
Purchase Orders (edit here)
- The list shows every PO (site copy plus ones made here). NE = on the Not Entered list; new = created in this app; edited = saved here, so it differs from the production site. Click a column heading to sort. Add New Purchase Order starts a blank one numbered after the highest existing PO.
- The list has the site's columns and per-row buttons: pencil (open / edit), printer (print view), trash (delete — asks first; the PO leaves every list and count but keeps its items, documents and audit rows, and a later sync does not bring the site's copy back). "+ Add" starts a new PO. Dates show as MM-DD-YYYY like the site.
- Open a PO to edit it. Fields are the production site's: Today's Date, Date Required, To (pick a vendor — its address and main email/phone fill in; + Vendor adds one), Contact (pick from the vendor's contacts — email, phone, extension, fax, cellphone fill in; + Contact adds one), Shipping Company, Ship (Pickup / Ship Via), For, the item rows (Production Order#, Quantity, Description, Price, Received = Select / Complete / Partial, Date; Add Item, ✕ removes a row), Ship To (defaults to the Colorado Envelope receiving block), Comments, and the Entered checkbox (unticked = on the Not Entered list). Save writes the audit log with before/after values.
- Top bar: Previous / Next and the number list jump between POs; Print opens the print layout (same as the site's) in a new tab — use the browser's Print / Save as PDF; Copy makes a new PO with the same header and items, today's date, Received cleared; Email opens your mail program addressed to the PO's email with the PO number as subject (attach the printed PDF; no mail server is wired in this prototype).
- Documents: attach confirmations, quotes, packing slips (pdf, images, office files, zip up to 50 MB); Open downloads, Delete removes. Stored privately next to the database.
- Line items, Ship To and Comments for the site's own POs come from its print views (read-only fetch). A PO that shows "copy of production site" is untouched; once you save it here it stops following the site. If the shop keeps creating POs on the old site, a number clash is logged in the audit (Admin › Audit, action sync-collision) and the site PO is skipped.
Vendors
- List: # / Name / Address / Actions like the site; the contacts pop-up holds email and phone. Search matches vendor, address and contact details. Add Vendor creates one here.
- Vendor page: edit the name, address and main email/phone (name changes flow to its POs), Add New Contact (name, email, phone, extension, fax, cellphone), Delete a contact, recent POs, and New PO to this vendor.
Customers
- The list shows the site's customers with their contact names; click one for the full record: contacts, the bill-to and ship-to block as typed on their most recent production order, order count, pieces and quoted value, and every production order with die links. New estimate starts an estimate for that customer.
Site Tables
- One tab per lookup list (Location, Routing, Type Of Gum, Description, Seal Flap, Inside Tint Style, Ctn Size, Box Size, Colo Env Stock, Printing, Folding Status, Jet Status, Window Film, Ship To, Window Sizes), laid out like the production site: ID, value, Edit (inline, Save / Cancel) and Delete on each row, and an Add form under the table.
- Rows you add are badged "added here", edited rows "edited here" (hover shows the site's value). Deleting a site row hides it and remembers that choice, so a data sync does not bring it back; additions and edits survive syncs too. Everything is audited.
Deleting things
- Every delete is the same trash-can button. It always asks "Are you sure?" first; after that it is done. Site rows deleted here stay hidden through later syncs; rows created here are removed outright. Every delete is written to the audit log.
Floor devices (readers, cameras, sensors)
- Admin › Devices: register each Raspberry Pi reader, camera or sensor — name, kind, role (die room / at a machine / dock / other), the machine it sits at, where it is. It gets a token, shown once: put it on the Pi (docs/HARDWARE.md). Rotate token if one leaks; Disable stops it cold. A device silent for 15 minutes shows offline here and on the Dashboard.
- What a tag read does: at a die-room reader a die that was in is checked out and a die that was out is returned home; at a machine reader the die is checked out to that machine (or moved there if it was already out somewhere else). Unknown tags are logged — assign them on Die Locations. Counts and running / idle states are kept per device for the reports.
- Event stream shows every event with what CEERP did about it. Nothing identifies a person: tags are on dies and skids, cameras send numbers, there is no audio.
Floor plan and the production-site sync
- Floor Plan: once the facility has been LiDAR-scanned and an admin uploads the to-scale plan (SVG or PNG), every machine, die cabinet and inventory item appears as a pin to place — purple machines, green die cabinets, blue inventory, grey doors — coloured orange when it needs a look and red when it needs action (service overdue, a die misfiled, stock low). Place pins: pick a pin on the right, click where it stands; drag a placed pin to move it; × takes it off the plan. Add door / dock pins for the places a scanner will later sit. Pins are fractions of the image, so replacing the plan with a better scan at the same proportions keeps them in place. Before a plan is uploaded the page lists what the scan must produce.
- Admin › Sync from production site: pulls everything entered on production.coloradoenvelope.com into CEERP — orders, schedules, purchase orders (with print views for new ones), vendors, customers and contacts, out tables, site tables, machines. Rows you edited, created or deleted here are kept; the site's version of those rows shows as a badge. It runs in the background with a live log and records the last sync time; it only reads, never writes, so Don can keep using the site he knows while learning this one.
Job cost, inventory, estimate → order
- Job cost on a production order: quoted value (quoted price × quantity, or the lot price) against what was bought for it — purchase-order lines whose Production Order# names this order. A line total is computed only when the price can be read with its unit ("$213.81/M" × quantity, "$.8475/ea" × quantity, or a bare amount as the line total); anything else shows a "?" and the total is marked approximate. Margin = quoted − bought; bought cost per M; hours the die was checked out for this order (from Die Movements); the schedule lists the order sits on.
- Inventory (under Purchase Orders): what is on the floor — sheets, rolls, cartons, window film, supplies — each with unit, reorder point and where it is. + Add creates an item with an opening count. Receive / use records a move: Received adds (put the PO number in Ref), Used on order subtracts (put the order number in Ref), Physical count sets on-hand to what you counted, Adjustment for anything else. The item page shows every move, newest first. Items at or below their reorder point are marked low and counted on the Dashboard.
- Create production order (estimate page): makes an order on Converting Unscheduled with the estimate's customer, job, quantity in M, size, stock, due date and die (into the site's out-table fields), then opens it for editing. Once created, the button becomes a link to that order.
Backups, digest, hosting
- The database and private files are zipped nightly at 02:00 to C:\Claude\ceerp-backups (30 copies kept) by the Scheduled Task "CEERP Nightly Backup"; backup.log in that folder says what happened. A second copy goes to a NAS share when BACKUP_DIR_2 is set and reachable.
- "CEERP Dev Chat Digest" (07:00) e-mails new chat activity to DIGEST_TO once SMTP is configured in .env; until then it does nothing.
- docs/HOSTING.md is the plan for moving CEERP to a server when the client says so.
Dashboard tiles, floor view, reports
- The tiles at the top of the Dashboard are the things that need a hand today — jobs not complete, due in the next 7 days, past due, dies out and misfiled, machines overdue for service, POs not entered, open Dev Chat items, estimates needing review. Each is a link; orange means look, red means act.
- 📺 Floor view on any schedule page opens a full-screen, read-only copy for a TV on the floor: large type, refreshes itself every minute, due dates yellow today and red when past. Press F11 in the browser for full screen.
- Reports: what is on the floor by machine, pieces per machine per week (last 8 weeks, by date due), orders / pieces / value by month, and the top customers this year by value. Value = quoted price × quantity (Per M) or quoted price (Lot).
Die locations, movements and the cabinet map
- Home on a die page is cabinet · shelf · side · slot plus a note — the way someone in the die room says it. The cabinet letter and slot number came from the cabinet workbook; shelf and side are yours to fill in (the badge "shelf / side missing" shows until they are). Tick mark verified when you are standing in front of the die; the page then shows who verified it and when. A scan tag is whatever the label on the die says (RFID or barcode) — any reader that types it and presses Enter works everywhere a tag can be typed.
- Die Locations (sidebar, under Find a Die) lists every cabinet in slot order with one row per die so you can walk the room once and fill in shelf, side, note and tag; Tab moves across, Enter saves. The count per cabinet shows how many are complete. Cabinet map draws each cabinet by shelf and side with a chip per die — orange when it is checked out, red when it was returned to the wrong place.
- Check out (die page, or the scan box on Die Movements): who takes it is you, plus the order number and machine if you know them. Return prefills the home; if it went somewhere else, type where — the die is then misfiled and stays on the Misfiled list until someone presses Moved home or changes its home. Die Movements shows what is out, what is misfiled, and the latest activity. Every movement is in the audit log.
Machine maintenance
- Maintenance (Machines page button, or the sidebar) lists every machine with its last service, next due date and an overdue / due soon flag (within 14 days). Open a machine (or press Maint. on its row) to see its log and record an entry: date, type (scheduled / repair / inspection / calibration / other), what was done, who did it, downtime in hours, cost, and when the next service is due. The newest entry's next-due date is the one that counts. The trash can deletes an entry (asks first); every change is in the audit log.
Dev Chat
- 💬 Dev Chat (bottom of the menu) is the channel between the people using CEERP and the people building it. Post a Question, Change request, Bug or Note; attach a screenshot if it helps; the About page box carries the page you were on when you pressed the round 💬 button at the bottom right of any page, so "the dates on this page" is unambiguous.
- The pencil on your own message or reply edits it in place (admins can edit anyone's); the trash can deletes it — a message takes its replies and screenshot with it. Edited messages say "(edited)"; the old text stays in the audit log.
- Anyone logged in sees the whole thread, can Reply under a message, and can mark it Done (or Reopen). The tabs show Open / Done / All. A red count on the menu entry is how many messages and replies by other people have arrived since you last opened the chat; it clears when you open it. The page refreshes itself every 20 seconds when someone else posts (never while you are typing).
- Nothing leaves the app — no e-mail, no outside service. Every post and status change is in the audit log. Screenshots are stored in the private file area with the other uploads.
Sorting tables
- Click any column heading on any table — every table on every page, including the ones with edit forms in them — to sort by it; click again to reverse. Numbers, money, dates and text all sort correctly; blanks go last. Short values such as dates and ids never wrap onto two lines.
Spicers Inventory
- Every Kelly Spicers stock from the price guide: SKU, name, section, sheet, basis weight, M-weight, pack, unit and list price with the guide date.
- ON / off on each row decides whether that stock appears in the estimator's paper dropdown. Show all / Hide all matching applies to whatever the filter shows (e.g. hide the whole Corrugated section, or everything except "Paper sections only"). Hidden stocks stay hidden when a new catalog is loaded, and each change is written to the audit log.
- Upload a new catalog: drop the pricebook .zip or .pdf on the box (or click it) and press Load. The file is checked, stored privately, parsed, and every SKU is created or updated with the guide's printed date on its prices. Download latest Denver guide and reload fetches the current file from Kelly Spicers instead.
Logging in and passwords
- Login is your name plus your personal password. Names are not case-sensitive ("Don" and "don" are the same person); passwords are. A login lasts 12 hours, then you log in again.
- Wrong password five times in a row locks the name for 15 minutes. The message says how long. An admin can unlock sooner on Admin › Users. The same "Name or password incorrect" message shows whether the name exists or not, on purpose.
- Temporary password: when an admin creates you or resets you, you get a temporary password. At your next login the app takes you straight to Choose your password and lets you nowhere else until you have picked your own (at least 10 characters, no leading or trailing spaces, 72 characters at most).
- Change password any time: click your name at the top right (or open /account/password). Enter the current password, the new one twice, Save. Every other device where you were logged in is logged out; the browser you are using stays in.
- Forgot your password: an admin sets you a new temporary one. There is no e-mail reset; the person who sets it tells you in person or by phone.
- First-time setup (a brand-new installation only): while no admin exists, the login page shows a "First-time setup" link. Enter your name, the setup password from the server's .env (APP_ADMIN_PASSWORD) and choose your personal password; you become the first admin. From then on the setup password does nothing. If every admin is locked out, whoever runs the server resets a password with python scripts\set_password.py "Name".
Users (Admin › Users)
- Each row shows the name, an ADMIN / estimator switch, an Active ON / off switch, the password state (no password, temporary · must change, locked, date last changed), login count and last login.
- Admin unlocks imports, approvals, the audit log and this page. A switch takes effect on the person's next click, no re-login. Active off ends their session and refuses the name at login. The last active admin cannot be switched off or deactivated.
- Set temp password: type a temporary password in the row and press the button. The user is logged out everywhere and must choose their own password at the next login. Use it for new people and for anyone who forgot theirs.
- Unlock appears on a row that is locked after wrong passwords and clears the lock at once.
- Log out ends every session of that user (all devices) without touching the password, e.g. a laptop left open somewhere.
- Add user creates someone with a name, a temporary password and optionally admin. Nobody can log in without a password; a user shown as no password (from before version 0.5) needs one set here first.
- Every change is written to the audit log with who did it and when: create, admin-on/off, activate/deactivate, password-set, password-change, force-logout, lockout, unlock. Passwords themselves are never stored or logged, only a bcrypt hash.
Admin
- Import a spreadsheet: choose the type, the file, and Dry run to preview counts and findings without saving. Re-importing the same file updates existing dies instead of duplicating them. Findings: error (row could not be read), conflict (two sources disagree — earlier value kept, die flagged), ambiguous (cannot tell which die), warning (informational).
- Die ↔ PDF matches: open each suggested PDF, confirm it against the die, press Verify; Make current picks the one to attach to quotes; Re-assign moves it to another die id; Reject hides it.
- Audit log: every create/update/status/verify/ingest with who, when, before and after.
Production (copy of production.coloradoenvelope.com)
- The left menu follows the production site exactly. Everything under it is a read-only copy: Purchase Orders (search by PO#, vendor, for, items; Not Entered filter; each PO opens with its items and links to the live site's print/edit views), Vendors, Customers (also in the estimator drop-down; "New estimate" starts one for that customer), Machines, Site Tables (all dropdown lists the site uses), Window Double Die.
- Out Diagonals / MO Booklet / MO Catalog / Side Seam: same columns as the site (Die Size, Sheet / Roll Size, Number Out, Die Number with location, Flat Size, Seal Flap Size). Until the site's own rows are synced, the page is built from the imported number-out workbooks; die numbers link to our die pages.
- Production Orders: all 7,889 orders from the site (2022 on), searchable by customer, job title, PO, die # or description; filters for not complete, not invoiced, year. Qty is the site's figure in thousands (M) with the piece count beside it; Quoted is per M or a lot price as the site says. Each order opens with customer/job, pricing, envelope spec (die, sheet, number-out, flaps, windows), stock/printing/routing, schedule statuses and every raw field, plus a button to start an estimate from that die and customer.
- Schedules (Converting / Jet Unscheduled, RA-1 … Super Jet 2) show the jobs on each site list in the site's order.
- Die page and estimate page show production history: how often the die ran, for whom, at what quoted price per M, and the customer's recent orders.
- Dashboard: the site's three charts plus purchase orders by month. The status strip shows when the copy was taken.
- On an estimate, Recent paper purchase orders lists what was actually bought for the chosen parent sheet.
Where the data comes from
- Dies, specs and number-outs: the 18 FINAL_* #out workbooks, Updated DIES BY CABINET.xlsx, Updated Dies by number.xlsx, and the For Website program tab.
- Dielines: the 56 PDFs in MO-Catalogs 9-12 - PDF layout - reworked (dies 148, 162, 323, 340, 370). Number-out PDFs are attached as reference sheets.
- Legacy rates: every … Prices tab of Colorado Envelope Quotes.xlsm, cached values plus formulas, with broken cells (#REF!) reported.
- Production site: read-only snapshot 2026-10-22 (docs/production_site_mirror.md).
- Paper prices: Kelly Spicers Denver price guide (list prices), plus labelled SAMPLE stocks for the demo (docs/pricing_feed.md).