Changelog — DrycleanPro
All notable changes to this app are recorded here. Newest entries on top.
[2026-04-29]
- Fixed "Invalid status." error when changing an order's status — the status filter and the Change Status form now accept all configured laundry stages (Received, In Progress, Ready, Out for Delivery, Completed), not just Cancelled.
[2026-04-20]
- Pictures & documents on every customer profile. Staff can now attach photos and PDFs directly to a customer — useful for snapping a picture of someone holding a high-ticket item (tailored suit, wedding dress) so whoever's at the counter at pickup can match them, or for keeping an ID on file. Each attachment is typed (Item photo / Customer photo / ID / Receipt / Damage / Other), optionally captioned, and optionally visible to the customer on their tracking portal.
- Set a customer's pricing tier when you add or edit them. Pricing tier was already on the price list side but the form didn't let you pick it — now every Add / Edit sheet has a Tier selector, and the customer profile shows a Tier pill next to the name.
- Recent Activity timeline on every customer profile. Shows the last 10 things that happened for this customer (order created, status changed, payment recorded, note added, attachment uploaded) with who did it and when. "View full log" links to the app-wide Activity Log filtered to that customer.
- Activity Log page now exists. The "Activity Log" quick action from the home dashboard used to 404; it's a real page now with search, pagination, and action-type filter.
- Fixed broken share links. Every "Share invoice / Copy link / Print receipt" URL was silently losing the tenant id (it tried to cast a Pancho UUID to an integer) and returning
/p/0/… — those links now resolve correctly. The "Copy tracking portal link" in Settings is also fixed (used to build /p//drycleanpro/track because of an undefined variable).
Internal
- New
customer_attachments table + apps/drycleanpro/api/customer-attachments.php (upload / list / update / delete) mirrored on order_attachments. Files land in uploads/drycleanpro/customers/{customer_id}/.
- New
apps/drycleanpro/api/audit.php and apps/drycleanpro/views/audit.php. The audit list joins audit_log.user_id to tenant_members.pancho_user_id for display_name. Accepts ?customer_id=X to narrow to a single customer's history.
customers/activity endpoint added for the per-customer timeline (substring-matches audit_log.details against customer name + ticket_numbers, same technique PropertyPro uses).
seed_with_currency() {{OWNER_UUID}} placeholder still covers demo seeds.
[2026-04-19]
- Pancho sign-in for staff and repeat customers. Staff now authenticate through Pancho (no separate in-app PIN). A new Members page lets the shop owner invite staff by phone, mint broadcast invite links for bulk onboarding, and review pending join requests — all three methods feed into the same arrival flow. Customers can sign in to Pancho to see their order history across every dry cleaner they use, get push updates, and pay online, without losing the option to just walk in with a ticket.
- Phone-lookup track page still works for walk-in customers who prefer not to sign up — nothing's removed, the Pancho route is an added richer option.
- Added
/my-orders view for authenticated customers and /members admin view (admin-only) for managing staff + customers.
Internal
- Replaced the dormant in-tenant
users table with tenant_members(pancho_user_id, role, ...) anchored to the platform Pancho UUID.
- All audit FK columns (
created_by_user_id, changed_by_user_id, recorded_by_user_id, uploaded_by_user_id, cancelled_by_user_id, customer_notes.created_by_user_id) switched from INTEGER to TEXT UUID.
- Added
customers.pancho_user_id TEXT UNIQUE (nullable) — walk-in customers keep working; when they sign into Pancho with the matching phone the record auto-links.
- Added per-tenant
tenant_invites table for pre-registering staff/customers by phone.
- New admin member API: invite, broadcast-link, decide, revoke.
- New customer API: my-orders, get, mark-notes-read (replaces the old session-based portal endpoints for authenticated customers).
[2026-04-18]
- Switching pricing mode to "Manual" now auto-populates Level 2-4 with your Standard items (adjusted by the current percentages) the first time you switch. No more retyping the whole price list per level — just edit what you want to change. Existing manual prices are preserved on later switches.
[2026-04-17]
- Fixed home page crash ("no such table: orders") on fresh installs — app now loads correctly for new users
- Updated subscription price to $47/month (USD) and ₦25,000/month (NGN); setup fee is now $497 (USD) and ₦450,000 (NGN)
- Added 4-tier pricing system: Standard, Level 2, Level 3, and Level 4. Each customer can be assigned a pricing level.
- Pricing mode toggle: "Percentage" auto-calculates higher tiers from Standard prices (e.g. +20%, +40%, +60%), "Manual" lets you set each level independently.
- Pricing settings panel with configurable markup percentages per level.
- "Recalculate All Levels" button syncs all non-Standard prices from the Standard tier.
- New orders automatically load prices matching the selected customer's pricing level.
- Customer profiles now show and store their assigned pricing level.
[Baseline] — 2026-04-16
- Existing feature set captured as the baseline. Subsequent changes will be prepended above this entry.