Skip to main content
GrN.dk

Main navigation

  • Articles
  • Cases
  • Contact
  • Your Digital Project Manager
  • About Greg Nowak
  • Services
  • Container
    • Excel Freelancer
    • Kubuntu - tips and tricks
    • Linux Apache MySQL and PHP
    • News
    • Image Gallery
User account menu
  • Log in

Join my community / free newsletter — sign up here

Breadcrumb

  1. Home
  2. Cases

One till, many sellers: a market POS that splits every sale by stall

Client
A community market in Thailand (client kept anonymous)
Sector
Retail — point of sale
Period
June–July 2026
The POS sale screen, recreated with sample products: a grid of Thai market goods with per-seller badges, a basket split across three sellers, and a Charge ฿290 button offering cash or PromptPay QR.

At a glance

A point-of-sale system for a physical market where dozens of independent sellers share the same tills. A cashier rings up one basket; the system knows which stall every item belongs to, splits the sale per seller at the moment it happens, and keeps the books each stall settles against. Thai-first interface with a synchronized English translation set, built on Laravel 12 with a Filament v4 admin panel and PostgreSQL underneath.

Every amount is integer satang — a float never touches money
Append-only audit log: till actions are written once, never edited or deleted
Thai-first UI with a synchronized English translation set
Laravel 12 · Filament v4 · PostgreSQL · 19 migrations · PHPUnit suite

The challenge

A shared-till market breaks the assumption almost every off-the-shelf POS makes: that the shop is one business. Here a single basket routinely holds goods from three or four different sellers, and at the end of the month each of them needs to be paid exactly what their stall sold — no more accounting spreadsheet, no arguing with the till roll.

Money software also has two classic self-inflicted wounds waiting: floating-point prices that drift by a satang, and editable transaction tables where a typo "fix" quietly rewrites history. Both had to be impossible by construction, not by discipline.

The solution

A Laravel 12 application with the day-to-day sale screen kept deliberately simple — product grid, basket, charge — and a Filament v4 back office for products, sellers, shifts and reports. Every sale line carries its seller, so per-stall settlement is not a report bolted on top but a property of the data model itself.

Money is stored exclusively as integer satang (฿290 is the integer 29000); no float ever touches an amount. And every till action lands in an append-only audit log — rows are written once and can be neither updated nor deleted, so the history the settlement is based on is the history that actually happened. The interface is Thai-first, with the English translation set kept in lockstep by a sync command rather than by memory.

The results

The system is live and in daily use at the client's market (a private deployment, so it is not linked here). Cashiers work one shared basket per customer regardless of how many stalls it spans, and per-seller settlement falls straight out of the ledger instead of out of an end-of-month spreadsheet session.

The build runs on the same delivery model as the rest of this page: phased Trello cards worked by an AI agent under review, 19 database migrations and a PHPUnit suite grown alongside the features, and the production database covered by the server's nightly dump-and-backup routine from day one.

  • Laravel
  • Filament
  • PostgreSQL
  • Point of sale
  • Custom Development
  • AI agents

Got a project that needs the same kind of hands-on delivery?

Your digital project manager

Review Greg on Google

Greg Nowak Google Reviews

 

Illustrated infographic summarizing: Your AI Agent Has Shell Access. What Can It Reach?
Your AI Agent Has Shell Access. What Can It Reach?
2026-08-13

A practical guide to mapping what a shell-enabled AI agent can reach, then containing its access to files, credentials, networks, tools, and high-impact actions.

Illustrated infographic summarizing: Cloudflare Changed DoH JSON. What Else Is Parsing DNS as Text?
Cloudflare Changed DoH JSON. What Else Is Parsing DNS as Text?
2026-08-12

Cloudflare’s DoH JSON change exposes brittle DNS parsing. Find affected scripts, test both formats, and choose a safer integration contract.

Illustrated infographic summarizing: Your Website Can Answer Questions Now. Should It?
Your Website Can Answer Questions Now. Should It?
2026-08-11

NLWeb makes conversational website search practical to deploy. The real question is whether your content, users and team are ready to support it.

Illustrated infographic summarizing: AI Search Finally Has Reports. Now Connect Visibility to Revenue
AI Search Finally Has Reports. Now Connect Visibility to Revenue
2026-08-11

Google and Bing now expose first-party AI search data. The real task is connecting citations and impressions to analytics, CRM outcomes, and revenue.

Illustrated infographic summarizing: The Bot Passed Your CAPTCHA. What Did It Do Next?
The Bot Passed Your CAPTCHA. What Did It Do Next?
2026-08-11

Passing a challenge is only one signal. Session analysis, server-side validation and endpoint-specific controls help reduce bot abuse without blocking customers.

Illustrated infographic summarizing: WordPress 7.1 Moves Image Work Into the Browser—Test Every Media Hook
WordPress 7.1 Moves Image Work Into the Browser—Test Every Media Hook
2026-08-11

WordPress 7.1 shifts image processing into supported browsers. Here is what to test across hooks, CDNs, formats, security headers, and fallbacks.

Illustrated infographic summarizing: Prompt Caches Have Write Costs Now—Audit What Your Workflow Reuses
Prompt Caches Have Write Costs Now—Audit What Your Workflow Reuses
2026-08-10

GPT-5.6 makes cache writes billable. See how to spot wasted writes, stabilise prompt prefixes, place breakpoints and measure whether caching pays.

Illustrated infographic summarizing: The AI Crawler in Your Logs May Be Wearing a Borrowed Name
The AI Crawler in Your Logs May Be Wearing a Borrowed Name
2026-08-09

A User-Agent is a claim, not proof. See how to verify AI crawler traffic before it shapes reporting, robots.txt decisions, or WAF exceptions.

Illustrated infographic summarizing: AI Agents Need a Spending Brake, Not Just a Billing Dashboard
AI Agents Need a Spending Brake, Not Just a Billing Dashboard
2026-08-08

AI agent costs can climb inside a single workflow. Runtime budgets, loop detection, outcome metrics, and safe handoffs keep that spending under control.

Illustrated infographic summarizing: Drupal 12 Slipped to December. Drupal 10 Still Runs Out of Road
Drupal 12 Slipped to December. Drupal 10 Still Runs Out of Road
2026-08-07

Drupal 12 arrives as Drupal 10 support ends in December 2026. Moving to Drupal 11.3+ first keeps two mandatory upgrades manageable.

More articles
RSS feed

Footer

  • All articles
  • Contact

GrN.dk web platforms, web optimization, data analysis, data handling and logistics.