Split bills (restaurant tickets):
- New pos_payments ledger; a tab is settled across one or more cash/Ladill Pay
payments. The ticket shows total / paid / balance, an amount field with Full /
½ / ⅓ / ¼ helpers, and the payments taken. Partial payments keep the tab open;
the sale finalises (and frees the table) only when the balance hits zero.
Pay splits get their own checkout + callback (pos.payments.callback).
Pipe online orders to the KDS:
- POST /api/kitchen/orders — a first-party, service-keyed ingest
(config pos.kitchen_api_keys, scoped by owner, idempotent by external_ref) that
creates a paid, already-fired ticket (order_type=online, lines source=online).
- The KDS feed is now payment-agnostic (any kitchen-active sale), so paid online
orders sit on the board next to dine-in tabs and bump the same way; they're
badged "online".
Schema additive: pos_payments, pos_sales.external_ref. Suite green (14).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Add the Afia AI assistant to the header (topbar AI button + slide-over),
matching every other Ladill app. Ports config/afia.php, AfiaService, a POS
AiController (pos.ai.chat) scoped to register/sales/products, and includes
the slide-over in the app layout. The afia() Alpine component already existed.
- Hide the header "Open register" button while on the register page.
- Move Settings to a pinned bottom section of the sidebar, like other apps.
- Commit the updated POS logo + launcher icon assets.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Finish removing the upstream platform fork: drop the Hosting/SSL/Domain
notification classes + their mail views, the email/mailbox/domains/hosting
view trees, the Mini/Afia/search/paystack partials and unused components, and
the now-orphan support helpers (DomainConfig, MailboxPricing,
ResellerClubLegacy), SmsService, and fork configs (afia, hosting, domain,
email, mailbox, qr, mail_brands, notifications, ...). Reparent the
notifications page off the hosting layout onto the POS app layout (it had
referenced undefined hosting./mini. routes). Computed the removable set from a
reachability scan of the POS view graph; kept views reference no removed
routes/services.
Branding: favicon now uses the updated favicon.ico (favicon.svg removed);
signed-out fallback logo points at the POS logo.
CRM import: constrain the catalogue pull to type=product so CRM services are
never imported as POS products (server-side filter + defensive client skip).
Test suite green (8 passed, 29 assertions); all routes resolve and every
remaining Blade compiles.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>