HS Hirah Shop

Changelog

What shipped, version by version.

Live app is v2.1.0. Planned work sits at the top; released versions follow. Deploy internals are omitted here.

Coming next

Added

  • Product custom code: shops can assign a product identification code (uppercase letters, 0–9, `/`, `-`) when adding/editing products. Searchable from the product index.
  • Product shipping cost: optional per-product shipping cost field (for shop records; not shown to customers).
  • Product margin calculator: entering cost price and margin % auto-calculates selling price (and vice versa) live via Alpine.js — no new database column needed.
  • Category attribute cards: product form now shows attribute fields grouped by category in a card, so owners see exactly what fields each category enables.
  • Public product catalog: shops with a public slug can enable a shareable `/s/{slug}/catalog` page listing all active products with name, price, and description. Toggle in Shop Settings → Public page.
  • Catalog "Browse" button: shop public page shows a "Browse catalog →" CTA when catalog is enabled.
  • Malayalam language: added `ml` (Malayalam) to the language selector in Shop Settings → Details and during shop registration (step 3). Locale is stored on the shop and passed through `ShopRegistration`.
  • Financials nav group: venue/chain "Books" and "Expenses" nav entries merged into a collapsible Financials group with sub-links "Cash book / Ledger" and "Expenses".
  • Accounting mode in Park Settings: Books mode selector moved from the Cash book page into Park Settings with clear radio cards ("Single-entry cash book" vs "Double-entry ledger") and a warning that changing mode does not migrate historical entries.
  • Journal entries tab: double-entry mode shows a "Journal entries" tab stub on the Cash book page (coming soon).
  • Account & Subscription at nav bottom: for single-owner retail shops, the account/subscription link now appears at the very bottom of the sidebar nav (after the shop section) instead of at the top, making the shop navigation primary.

Changed

  • Directory copy: Groups is now Businesses (Retail, Venue, or Chain). Product catalog groups, tax groups, and database `parks` are unchanged.
  • Shorter nav: drop New business / Add shop from the sidebar; park Settings nests payment methods; Staff (not Team); Rent, Upgrades, Join requests.
  • Login / Create account: tabbed form, password show/hide, strength meter, and business-type chips.
  • Invoice title: "New service invoice" is now "New Invoice" with a service/product type selector; type is shown on the invoice detail page.
  • Invoices: Edit button now available for sent and paid invoices (editing resets the invoice to draft for re-sending). Void section is a prominent card instead of a small text link.
  • Invoice creation: payment method checkboxes removed from create/edit form — payment methods are now selected only when marking the invoice as sent (on the invoice detail page).
  • Retail single-owner nav: removed the duplicate park navigation section — retail shop owners now land directly on their shop dashboard and see a single clean menu. Upgrade to chain remains accessible via Account & Subscription at the bottom of the nav.
  • Sidebar branding: sidebar header now shows shop logo + shop name (or park name) instead of the hardcoded "Hirah Shop" title. "Powered by Hirah Shop" link appears at the very bottom of the sidebar. Locale switcher removed from sidebar footer (language is in Shop Settings → Details).
  • Catalog settings UI: category selector in Shop Settings → Catalog rebuilt as category cards showing the category name, "Primary" badge for the shop's primary category, and the attribute fields it unlocks. "Load starter catalog" button removed (access via Products → Pick catalog items).
  • Clothing/Boutique merge: "Clothing / Boutique" category merged into "Retail & Clothing" (renamed "Retail / Clothing") via migration — both had identical attributes (size, color, material). The old slug `clothing-boutique` is deactivated; shops, registrations, attribute defs, and product templates are reassigned to the canonical `retail` category.
  • Cash book retitled: "Books" page heading is now "Cash Book / Ledger"; page title updated to "Financials".

Fixed

  • Create account email field shows a border again. Sign in / Create account / other `brand` submit buttons stay Hirah purple when the marketing layout (or a missing shop theme variable) would have left them transparent.
  • Missed sales is now Adjust sales; shop owners/managers can add a date or remove an adjustment (POS bills are not deleted).
  • Park owners see today and week totals per shop only — not POS, bills, or till. Venue park logins cannot open tenant shop POS. Park daily emails list shop totals only.
  • Park Live page (`/p/{slug}`) with gallery and social links; shops add Facebook / Instagram / YouTube / website on their public page.
  • Tax rates removed from park Settings (country slabs at signup still apply on products).
  • Retail single-owner park no longer shows park customer list (park customers only apply to multi-tenant venues/chains). `/park/customers` returns 403 for single-owner parks.
  • Upgrade prompt moved from main dashboard banner to park Settings → Subscription section.

Planned

  • Hide PHP / Plesk version banners at the host layer (`expose_php Off`)
  • WhatsApp device share / invoice messaging (beyond current receipt templates)
  • SaaS billing auto-debit cutover after a successful test invoice
  • Multi-currency checkout (plans remain INR at launch)
  • Arabic / RTL
  • Native mobile apps (REST API is the foundation)

2.1.0

Platform mail, shop calendar, Leads vs Clients, sales staff, unread notices, and venue/chain books.

Added

  • Denser marketing hero: two-column first view with Create account card and till photo
  • Shop dashboard month calendar and Week / Month / Year cash-flow chips (same totals as reports)
  • Encrypted platform SMTP in superadmin Mail; test send; Laravel mail uses it after a successful test, otherwise `.env`
  • Client show lists business → shops → staff → subscription
  • Platform sales role (Leads, Clients, read-only directory); superadmin creates staff on Platform → Staff
  • Unread notices badge and once-per-session popup (Acknowledge / Mark all read); Festival and Meeting types
  • Venue and chain expense categories, expense/ledger delete, optional double-entry lines, monthly rent dues
  • Bulk user remove (one letter confirm; skips owners of live businesses)
  • Payment-method usage drawer and reassign-then-remove (force hide remains)

Changed

  • Reports and dashboard include missed-sales entries with till sales
  • Superadmin nav grouped: Overview, Sales, Directory, Billing, Support, Platform (“Businesses” not Parks)
  • POS product tiles: `touch-manipulation`, no tap scale, cached Alpine list; shift report uses counter name instead of raw id

Fixed

  • Payment methods that were in use looked like “remove did nothing” (they only hid)
  • Changelog no longer names tenant businesses

Security

  • Removed leftover `public/setup-once.php` and `public/test.php`
  • CSRF exceptions remain Razorpay webhook only; bulk-remove uses its own rate limit

2.0.0

Catalog-aware shop, Razorpay invoices, shop REST API, and English/Hindi.

Added

  • Shop menu groups (`product_groups`) and product kind (product vs service)
  • Add products from starter catalog or a blank form with kind, group, and category attributes
  • Invoice lines can pick a catalog item or stay manual (`invoice_items.product_id`)
  • POS tabs by group, product/service filter, custom line, and full-catalog search
  • Owner cash counter CRUD on Settings → POS; shift-open only selects an existing counter
  • Settings split into short pages with a floating save bar; shop nav leads with Dashboard → POS → Products
  • Razorpay Checkout on public invoices (and optional POS Pay online); bank / UPI / paste-link stay offline
  • Shop API keys and `/api/v1` products, groups, sales, invoices, customers (Bearer `hshop_…`, rate-limited)
  • English / Hindi locale files, user + shop locale, switcher on shop / POS / invoice / settings

Changed

  • Import stock is a Products action, not a top-level nav item
  • Park documents and notices show only for venue groups

1.9.0

Retail / Venue / Chain groups, venue accountant books, and POS-focused marketing.

Added

  • Group kinds on parks (`retail`, `venue`, `chain`) with signup, admin create, and billing labels (plan codes unchanged)
  • Venue accountant role: read-only sales, rent received, expenses, and a month cash book (`park_ledger_entries`)
  • Park team invite for manager or accountant
  • Standard shop categories grouped at signup — existing shops keep their category
  • Country tax catalog at signup: GST, VAT, and sales-tax slabs including Nil rated and Exempt; parks can add their own rates
  • Superadmin Users and Shops screens: search, deactivate logins, reset passwords, remove unwanted users, suspend outlets, and toggle POS
  • Park edit includes owner password reset and payment-method add / hide / remove
  • Faster live POS: tap products then Pay (cart only if qty needs changing); receipt paper size (58mm / 80mm / A4) is chosen on the next screen on phones
  • Express / Normal POS switch on the till (shop default in Settings): Express for live ticketing; Normal for customer name/phone, shop offer, line and bill discounts
  • Multiple cash counters when opening a shift (default Main Counter; add Counter 2+)
  • Warning if the same staff login is already open on another device or POS
  • Park Customers list (park visitors / loyalty), kept separate from each shop's POS customers
  • Park Team, digital onboarding documents, and Notices & offers
  • Public marketing pages for Retail, Venues, and Chain (old `/for/parks`, `/for/franchises`, `/for/shops` redirect)
  • Live paid/in-use groups cannot be deleted or have sales wiped until a superadmin allows deletion for 15 minutes

Changed

  • Chain outlets inherit the group activity category; retail stays one shop until upgraded to chain
  • Admin New Group / Manage Groups copy; park nav uses Shop / Shops / Outlets by kind

Fixed

  • POS checkout retries invoice allocation once if a late unique-constraint race occurs
  • Plans copy aimed at global launch (Retail shop / Chain stores / Venue) without changing prices or existing subscriptions
  • Park / mall owners can hide or remove payment methods (WAF-safe POST; used methods hide instead of failing)
  • Subscription billing sync failures no longer 500 POS; expired or past-due shops get a redirect (or 402 JSON) instead of a crash

1.8.0

Release G — SaaS clients/billing, onboarding, design alignment, public shop pages, HR, expenses, stock import.

Added

  • Billing plans + subscriptions + trial (`billing_plans`, `subscriptions`, `subscription_payments`); seed Single / Franchise / Park plans
  • Superadmin Clients panel (auto-created for parks on signup/admin create) and Pricing Plans CRUD
  • Trial banners and past-due/suspended soft lock on POS checkout and product/staff writes
  • Public `/pricing` driven from live plans
  • Multi-step onboarding wizard: Entity → Shop type → Details
  • Public shop business profile at `/s/{slug}` (banner, offer, gallery, products, contact) + Settings editor
  • Shop Expenses CRUD with shop-scoped categories (`shop_expense_categories`)
  • Staff HR: attendance, leave requests/approve, contract fields, salary payments
  • Stock import: CSV/Excel template upload + editable preview; photo → OCR draft (OpenAI vision when `OPENAI_API_KEY` set) → same review grid; commit upserts by SKU with stock movements
  • `subscriptions:sync` (daily schedule + `--backfill`) artisan command
  • `phpoffice/phpspreadsheet` for `.xlsx` stock import

Changed

  • App + POS chrome aligned to Hirah marketing fonts (Nunito/Rubik) and purple/rose tokens
  • Default shop theme colors use Hirah purple/rose
  • Admin park soft-delete uses random-letter confirm; park `status=suspended` blocks shop writes
  • Admin park/shop data reset also clears invoices; random-letter confirm on reset actions
  • Approve registration ensures park subscription exists
  • Post-deploy script prefers Plesk PHP 8.2 and clears OPcache

Fixed

  • POS sales invoice numbers unique per shop (composite index) with locked allocation

1.7.1

Maintain ops + settings UX.

Added

  • Park-owner Remove shop/outlet with irreversible warning and random-letter confirm
  • Draft invoice Delete for owners/managers; void only for sent/paid

Fixed

  • Product index overwrote manage/delete flags (managers saw no Actions; Delete missing on inactive)
  • Product deactivate/reactivate/delete buttons use consistent Tailwind actions for owner and manager
  • Desktop sidebar sticky height so Profile/Logout stay visible when the page is long
  • Mobile nav: profile/logout pinned below scrollable links

Changed

  • Shop Settings left-nav submenu with anchors (General/POS, Branding, Catalog, Receipts, Billing, Reports & WhatsApp)

1.7.0

Release F — Single-shop → multi-outlet upgrade.

Added

  • Outlet upgrade requests: Business (`single_owner`) owners can request multi-outlet; platform approves or rejects
  • Admin Outlet Upgrades queue (`/admin/upgrades`) with pending count on platform dashboard
  • Owner upgrade page (`/park/upgrade`), dashboard CTA, and settings link
  • Gate: Business groups cannot Add Outlet until approved (type becomes Franchise)

Changed

  • Existing Business parks that already had more than one shop are grandfathered to Franchise on migrate

1.6.3

Notes

  • Production deploy release; same fixes as 1.6.2.

1.6.2

QA Round-4 critical/high fixes.

Fixed

  • POS server-side validation: reject discount > line total, oversell when inventory tracked, and zero/negative sale totals (F1–F3)
  • Registration approval: link `shop_id` on platform approve; park UI shows platform-pending + park-pending queues; park approve gated to own park / `pending_park`
  • Approved-but-locked-out applicants: dashboard no longer redirects owners to unapproved shops (waits for park approval + membership grant)
  • Park approve grants full owner `ShopUser` permissions (discount/void)
  • Z-report cash-up uses frozen shift-close `system_amount`/`variance` for closed shifts; voiding sales on a closed shift is blocked
  • `receipt_auto_print` can be turned off (hidden `0` sentinel); receipt paper whitelist on display
  • Receipt shows change due on overpayment
  • Stronger early `X-Powered-By` removal in SecurityHeaders

1.6.1

Fixed

  • Product create/edit 500: `Shop::categories()` now uses pivot column `category_id` (was incorrectly querying `shop_category_id`)
  • Products list actions now use `canManageProducts` (owners and managers), not owner-only gating

Added

  • Product deactivate / reactivate for shop owners and managers
  • Permanent product delete for shop owners (unused products; sold products are deactivated instead)
  • Delete / deactivate controls on the product edit page

1.6.0

Release E — Category catalogs + multi-category shops.

Added

  • Tables: `category_attribute_defs`, `category_product_templates`, `shop_shop_category` pivot (keeps `shops.category_id` as primary)
  • Product `attributes` JSON for category-driven fields
  • Shop Settings: enable extra categories + Load starter catalog action
  • Product form shows attribute fields from all enabled categories
  • Seed packs for `food`, `entertainment`, and `retail` (templates + attribute defs)

1.5.0

Release D — Shop branding (logo + theme colors).

Added

  • Per-shop `logo_path`, `theme_primary`, and `theme_accent` on shops
  • Logo upload in Shop Settings (stored under `storage/app/public/shops/{id}/`)
  • CSS variables (`--shop-primary`, `--shop-accent`) on shop portal, POS, and public invoice layouts
  • Shop logo on POS header, receipts, public invoice page, and sidebar badge when set

Changed

  • POS action colors follow the shop theme instead of fixed green

1.4.0

Release C — Service invoices with selectable payment methods.

Added

  • Service invoices (separate from POS sales): draft → sent → paid → void
  • Line-item invoice CRUD for shop owners/managers
  • Public customer invoice page at `/i/{token}` with bank details, payment link, UPI QR, and UPI deeplink
  • Shop billing profile in Settings (bank, custom link, UPI VPA/QR, enabled methods)
  • WhatsApp share for service invoices with editable template
  • Invoices nav item in shop portal

1.3.0

Release B — WhatsApp device share + hirahsoft-branded marketing polish.

Added

  • WhatsApp bill share from receipt and sale detail (opens device WhatsApp / WhatsApp Web with editable templates)
  • Share today's daily report via WhatsApp or email after shift close (Z-report) and from Reports
  • Per-shop WhatsApp message templates in Shop Settings (`sale_bill`, `daily_report`)
  • AI marketing images for hero, parks, franchises, and shops

Changed

  • Marketing site fonts/colors aligned with hirahsoft.com (Nunito + Rubik, purple→rose→orange hero, cream pill CTAs)

1.2.0

Public marketing site (Release A of the platform features roadmap).

Added

  • Public landing page at `/` (no longer redirects straight to login)
  • Feature overview at `/features`
  • Audience pages: `/for/parks`, `/for/franchises`, `/for/shops`
  • Pricing / contact page at `/pricing`
  • Dedicated marketing layout with Hirah Shop branding

1.1.0

Security hardening release.

Security

  • Rate-limit login attempts (5/minute per email+IP) with clear lockout messaging
  • Block cashiers from staff, products, and settings pages (owner/manager or owner-only as appropriate)
  • Close staff invite/update/remove privilege-escalation hole for cashiers
  • Add security headers: `X-Frame-Options`, `Content-Security-Policy: frame-ancestors 'none'`, `X-Content-Type-Options`, `Referrer-Policy`, `Permissions-Policy`, `Strict-Transport-Security`
  • Strip `X-Powered-By` from Laravel responses when possible

Notes

  • Cashiers keep customers + sales history (needed for POS credit and day ops)
  • Host-level Plesk/PHP banner (`expose_php`) still needs a Plesk setting change for full header cleanup

1.0.0

First official production release of Hirah Shop (parkpos) on shop.hirah.asia.

Added

  • Multi-tenant parks, shops, POS, shifts, products, and staff management
  • Franchise / single-shop / join-existing-park signup flows
  • Optional daily sales entry for non-POS shops
  • Receipts (thermal / A4), auto-print, and reprint from sales history
  • Reports & analytics with CSV export and shift Z-reports
  • Customer credit ledger (dues, collections, POS credit sales)
  • Multi-outlet overview and outlet switcher for multi-shop owners
  • Self-service password reset, profile password change, owner staff password reset
  • Shop receipt settings (paper size, GST on receipt, footer note)

Fixed

  • Join existing venue HTTP 500 caused by missing database `cache` table used by rate limiting
  • Reports "Credit given" dropping to zero after dues were collected (now measured at billing time)

Need a walkthrough instead of a version note? See the blog or support.