Vendors / Open source & self-hostable

Kriolos POS

Kriolos POS (kriolos-obiz)

The most genuinely active project in this open-source batch by commit cadence — merged PRs as recently as 2026-07-29 and a rolling alpha release tagged v1.0.0-alpha-2026-07-12-Cabo-Verde — but its own README still carries a 'IN DEVELOPMENT (NOT RELEASE YET)' warning and it has never cut a stable 1.0, so it is a maintained uniCenta successor rather than a deployable restaurant POS.

scored live legacy rubric

Claims in scope
278
Scored
45
Assessed
42
Unknown
236
Not applicable
36
Cells challenged
0
85% of in-scope claims are unknown. This record measures what Kriolos POS publishes at least as much as what it does. A vendor that documents little scores low here whether or not the capability exists. Absence of evidence is recorded as unknown, never as no.

Identity

Owner
KriolOS Team (community project, GPL-3.0; a continuation of the uniCenta/Openbravo Java POS lineage, related to poolborges/unicenta-pos)
Who it is for
Small retail and hospitality operators on the Openbravo/uniCenta Java lineage who want a maintained, GPL-licensed successor to uniCenta rather than a subscription POS
Site
https://github.com/kriolos-obiz/kriolos-pos

Pricing

transparency: unknown · unit: free (GPL-3.0, self-hosted) · processor lock-in: no

Software
Free and open source under GPL-3.0, self-hosted. No published commercial tiers, subscription, or per-terminal pricing. Distributed as GitHub pre-releases only.

Capabilities

Every claim is binary and checkable. Grades: A primary documentation · B product documentation · C pricing or feature page · D marketing claim · E third-party reporting · F inference with no source. A yes on a differentiator claim requires A or B.

Order capture & FOH workflow

Unknown

order-capture-floor-plan-editor

Not scored by this record.

Unknown

order-capture-seat-level

Not scored by this record.

Unknown

order-capture-coursing-hold-fire

Not scored by this record.

Partial

order-capture-split-merge

Split and merge both exist, but only in item-move form. btnSplit on the sale panel (enabled when the user holds sales.Total and the ticket has more than one article) opens ReceiptSplit, a two-pane dialog whose only controls are move-one and move-all buttons (jBtnToRightOne/All, jBtnToLeftOne/All) shifting whole lines between the current ticket and one new ticket; on OK the split-off ticket goes straight to payment via closeTicket(). Tables merge in JTicketsBagRestaurantMap: after the 'This will Merge tables' confirmation, every line of the clipboard table's ticket is appended to the target ticket and the source shared ticket is deleted. Shortfall: splitting is by whole line item into exactly two checks per pass - there is no seat concept on a ticket (places.SEATS is table capacity in the floor-plan editor; ticketlines has no seat column), no even N-way split, and no split by arbitrary dollar or percentage amount anywhere in the payment flow. The after-partial-payment case cannot arise at all, because payment closes a receipt: an open ticket carries no payments to split around. https://raw.githubusercontent.com/kriolos-obiz/kriolos-pos/main/kriolos-opos-app/src/main/java/com/openbravo/pos/sales/ReceiptSplit.java · retrieved 2026-08-04

A
Unknown

order-capture-bar-tab-preauth differentiator

Not scored by this record.

Unknown

order-capture-transfer-audit

Not scored by this record.

Unknown

order-capture-native-handheld

Not scored by this record.

Yes

order-capture-offline-order-entry

Self-hosted Java desktop POS against a local database; internet is not in the order-entry path. No published offline matrix. https://github.com/kriolos-obiz/kriolos-pos · retrieved 2026-08-01

E
Unknown

order-capture-qr-same-check differentiator

Not scored by this record.

Unknown

order-capture-kiosk-first-party differentiator

Not scored by this record.

Unknown

order-capture-drive-thru

Not scored by this record.

Unknown

order-capture-drive-thru-timers

Not scored by this record.

Unknown

order-capture-voice-ai differentiator

Not scored by this record.

Unknown

order-capture-throttling differentiator

Not scored by this record.

No

order-capture-scheduled-orders

The full Liquibase schema is public. receipts carries only (ID, MONEY, DATENEW, ATTRIBUTES, PERSON), tickets only (ID, TICKETTYPE, TICKETID, PERSON, CUSTOMER, STATUS) and sharedtickets only (ID, NAME, CONTENT, APPUSER, PICKUPID, LOCKED) - there is no future fire-time, promise-time or lead-time column anywhere, so a held ticket cannot be dated forward or auto-fired. The reservations table (CREATED, DATENEW, TITLE, CHAIRS, ISDONE, DESCRIPTION) is a table-booking calendar, not an order. https://raw.githubusercontent.com/kriolos-obiz/kriolos-pos/main/kriolos-opos-app/src/main/resources/pos_liquidbase/db-changelog-v4_5.xml · retrieved 2026-08-03

A
Unknown

order-capture-catering

Not scored by this record.

Unknown

order-capture-order-ready-signal differentiator

Not scored by this record.

Unknown

order-capture-void-comp-controls

Not scored by this record.

Menu, modifiers & pricing engine

No

menu-pricing-nested-modifiers

The shipped Liquibase DDL enumerates every product-composition mechanism the application has, and none of them is a nestable modifier group. A product row carries exactly one ATTRIBUTESET_ID; attributeset is (ID, NAME); attributeuse is (ID, ATTRIBUTESET_ID, ATTRIBUTE_ID, LINENO); attribute is (ID, NAME); attributevalue is (ID, ATTRIBUTE_ID, VALUE). That is a fixed two-level flat picker - set, then one ordered row of attributes each with a flat value list - with no parent-group self-reference, no MIN/MAX selection columns and no required/forced flag anywhere. The only other structures are products_com (ID, PRODUCT, PRODUCT2), an unqualified auxiliary-product pair, and products_bundle (ID, PRODUCT, PRODUCT_BUNDLE, QUANTITY), a back-office component list that is never presented to the cashier as a choice; neither carries min/max or a required flag either. The nearest thing to forced selection is a single product-level boolean, ISVERPATRIB, surfaced in ProductsEditor as the 'mandatory' checkbox, which prompts for the whole attribute set once - not per group, and not at a third level. https://raw.githubusercontent.com/kriolos-obiz/kriolos-pos/main/kriolos-opos-app/src/main/resources/pos_liquidbase/db-changelog-v4_5.xml · retrieved 2026-08-04

A
No

menu-pricing-modifier-price-by-parent-size

Modifiers are modelled as product attributes: attribute(ID, NAME), attributevalue(ID, ATTRIBUTE_ID, VALUE), attributeuse and attributesetinstance carry no price column at all, so an attribute value cannot hold a price, let alone a per-parent/per-size matrix. The only priced alternative is a complement product (products_com joins PRODUCT to PRODUCT2), and products holds a single PRICESELL per row, so a differently priced topping requires a duplicated product record. https://raw.githubusercontent.com/kriolos-obiz/kriolos-pos/main/kriolos-opos-app/src/main/resources/pos_liquidbase/db-changelog-v4_5.xml · retrieved 2026-08-03

A
Unknown

menu-pricing-fractional-placement differentiator

Not scored by this record.

Unknown

menu-pricing-half-and-half-rule differentiator

Not scored by this record.

No

menu-pricing-topping-quantity-tiers

No quantity-tier or price-multiplier field exists: attributevalue is (ID, ATTRIBUTE_ID, VALUE) with no numeric price or factor, and ticketlines carries only UNITS and PRICE. Light/regular/extra can only be expressed by adding the complement product again or by creating separate products. https://raw.githubusercontent.com/kriolos-obiz/kriolos-pos/main/kriolos-opos-app/src/main/resources/pos_liquidbase/db-changelog-v4_5.xml · retrieved 2026-08-03

A
Unknown

menu-pricing-size-style-matrix differentiator

Not scored by this record.

Unknown

menu-pricing-included-allowance differentiator

Not scored by this record.

Unknown

menu-pricing-combos

Not scored by this record.

Unknown

menu-pricing-upsell-prompts differentiator

Not scored by this record.

Unknown

menu-pricing-86-propagation

Not scored by this record.

Unknown

menu-pricing-countdown-auto-86 differentiator

Not scored by this record.

Unknown

menu-pricing-dayparting

Not scored by this record.

Unknown

menu-pricing-channel-price-books

Not scored by this record.

Unknown

menu-pricing-dual-pricing differentiator

Not scored by this record.

Unknown

menu-pricing-allergen-nutrition

Not scored by this record.

Unknown

menu-pricing-recipe-linkage differentiator

Not scored by this record.

Unknown

menu-pricing-3p-menu-push

Not scored by this record.

Unknown

menu-pricing-dynamic-pricing

Not scored by this record.

Payments & money movement

Unknown

payments-processor-choice differentiator

Not scored by this record.

Unknown

payments-published-rates differentiator

Not scored by this record.

Unknown

payments-dual-pricing differentiator

Not scored by this record.

Unknown

payments-surcharge-guardrails differentiator

Not scored by this record.

No

payments-emv-nfc

Community software project with no first-party payment terminal line; nothing to certify for EMV or NFC. https://github.com/kriolos-obiz/kriolos-pos · retrieved 2026-08-01

E
Unknown

payments-softpos-tap-to-pay differentiator

Not scored by this record.

Unknown

payments-pay-at-table

Not scored by this record.

Unknown

payments-qr-guest-pay differentiator

Not scored by this record.

Unknown

payments-tip-adjust

Not scored by this record.

Unknown

payments-tip-pooling differentiator

Not scored by this record.

Unknown

payments-offline-store-and-forward differentiator

Not scored by this record.

Unknown

payments-offline-decline-liability differentiator

Not scored by this record.

Partial

payments-gift-cards

First-party gift vouchers are native, not an integration: a vouchers table (ID, VOUCHER_NUMBER, CUSTOMER, AMOUNT, STATUS CHAR(1)) is created by the shipped changelog, a Vouchers back-office panel issues them, JPaymentVoucher is a first-class tender, and vouchers carries no location column so a voucher is redeemable at any terminal on the shared database. Shortfall: there is no balance. VoucherInfo defines STATUS as a binary flag - 'A' available, 'D' redeemed - with no remaining-balance field, and JPaymentVoucher.setStates() loads the whole AMOUNT and calls moneyEditor.setEnabled(false), so redemption is all-or-nothing: a 50 voucher spent on a 12 ticket is consumed entirely and the 38 is lost. Partial redemption, reload and running-balance tracking therefore do not exist. There is also no online-ordering channel in the product at all (it is a desktop Java POS with no web ordering module), so the redeem-through-online-ordering half of the claim has nothing to run on. https://raw.githubusercontent.com/kriolos-obiz/kriolos-pos/main/kriolos-opos-app/src/main/java/com/openbravo/pos/payment/JPaymentVoucher.java · retrieved 2026-08-04

A
Unknown

payments-house-accounts

Not scored by this record.

Unknown

payments-split-tender

Not scored by this record.

Partial

payments-refund-void-controls

Authorization is genuinely role-based: the shipped role files grant discrete permissions sales.RefundTicket, sales.DeleteLines, sales.DeleteTicket, refund.cash/cheque/voucher/magcard, button.opendrawer, button.linediscount and button.totaldiscount, and Role.Employee.xml deliberately omits every refund, delete-ticket and open-drawer entry. Voids and no-sales are logged - JPanelTicket calls dlSystem.execLineRemoved(user name, ticket id, product, units) into the lineremoved table, draweropened records (OPENDATE, NAME, TICKETID), and both blocks print on the close-cash report. Shortfall: the log records the logged-in operator, never an approving manager; there is no per-user approval prompt (the optional override is a single shared static PIN read from the override.pin application property in JPanelTicket.changeCount()); discounts and refunds are written to no audit table at all; and lineremoved/draweropened are ordinary mutable tables with no immutability guarantee. https://raw.githubusercontent.com/kriolos-obiz/kriolos-pos/main/kriolos-opos-app/src/main/resources/com/openbravo/pos/templates/Role.Manager.xml · retrieved 2026-08-03

A
Unknown

payments-chargeback-tooling differentiator

Not scored by this record.

Unknown

payments-card-on-file differentiator

Not scored by this record.

Unknown

payments-payout-timing differentiator

Not scored by this record.

Unknown

payments-p2pe-pci4

Not scored by this record.

Kitchen & production

Partial

kitchen-station-routing

Per-item routing exists and an admin can configure it without vendor involvement: products.PRINTTO is a per-product field rendered in ProductsEditor as a combo box with the fixed values 0-6, script.SendOrder.bs loops the ticket lines and branches on line property product.printer to print templates Printer.Ticket.P1 through P6, and DeviceTicket binds machine.printer.1..6 to actual devices. Shortfalls: (1) the destinations are kitchen printers, not KDS stations - the only KDS code in the tree, KitchenDisplay.java, inserts into a KITCHENDISPLAY table that no changelog ever creates and the class is never instantiated anywhere in the repository, so there is no shipped KDS to route to; (2) routing keys off the product row only - there is no rule by category, order type or revenue centre, so a category-wide change means editing every product; (3) the six destinations are a hard-coded 0-6 enumeration, not an extensible station list; and (4) the printer-to-device binding lives in per-terminal machine.printer.N application properties, so routing is configured per workstation rather than centrally per location. https://raw.githubusercontent.com/kriolos-obiz/kriolos-pos/main/kriolos-opos-app/src/main/resources/com/openbravo/pos/templates/script.SendOrder.bs · retrieved 2026-08-04

A
No

kitchen-expo-consolidation

No expo or consolidation view ships. Kitchen routing is per-line only: script.SendOrder.bs branches on line.getProperty('product.printer') values 1-6 and prints Printer.Ticket.P1..P6, while RemoteOrderDisplay.remoteOrderDisplay() deletes and re-inserts one orders row per ticket line carrying a per-line display id, for an external display client that is not part of this repository. Nothing aggregates several stations into one order view and nothing gates order completion on every contributing station having bumped. https://raw.githubusercontent.com/kriolos-obiz/kriolos-pos/main/kriolos-opos-app/src/main/java/com/openbravo/pos/sales/RemoteOrderDisplay.java · retrieved 2026-08-03

A
Unknown

kitchen-course-firing differentiator

Not scored by this record.

Unknown

kitchen-prep-time-pacing differentiator

Not scored by this record.

Unknown

kitchen-order-throttling differentiator

Not scored by this record.

Unknown

kitchen-channel-pause-propagation differentiator

Not scored by this record.

Unknown

kitchen-order-ready-callback differentiator

Not scored by this record.

No

kitchen-bump-bar-hardware

The kriolos-opos-hardware module enumerates every supported peripheral class - DevicePrinterESCPOS/JavaPOS/Plain/Printer/Null, DeviceFiscalPrinter, DeviceDisplay (ESCPOS, JavaPOS, LED8, PDLED8, SurePOS, serial, window and dual-screen), DeviceScale and DeviceScanner. There is no bump bar, programmable keypad or KDS input device among them, and the strings 'bump' and 'bumpbar' do not occur anywhere in the repository. https://raw.githubusercontent.com/kriolos-obiz/kriolos-pos/main/kriolos-opos-hardware/src/main/java/com/openbravo/pos/printer/DeviceTicket.java · retrieved 2026-08-03

A
Unknown

kitchen-all-day-counts

Not scored by this record.

Unknown

kitchen-sla-alerts

Not scored by this record.

Unknown

kitchen-printer-fallback differentiator

Not scored by this record.

Unknown

kitchen-offline-operation differentiator

Not scored by this record.

Unknown

kitchen-item-build-screens differentiator

Not scored by this record.

Unknown

kitchen-pizza-fractional-display differentiator

Not scored by this record.

Unknown

kitchen-recall-refire

Not scored by this record.

Unknown

kitchen-order-modification-alerts differentiator

Not scored by this record.

Unknown

kitchen-guest-ready-notification differentiator

Not scored by this record.

Unknown

kitchen-waste-logging

Not scored by this record.

Unknown

kitchen-speed-of-service-reporting

Not scored by this record.

Unknown

kitchen-prep-forecasting

Not scored by this record.

Delivery, dispatch & third-party channels

No

delivery-driver-roster

The complete GPL source is the product, and it contains no driver concept at all. The shipped Liquibase changelog creates 53 tables and none is a driver, run, dispatch or delivery table; the only staff entities are people (POS operators with role, password and card) and the shifts/shift_breaks timekeeping tables, which carry no assignment-state or run column. A repository-wide search for driver, dispatch, courier and delivery matches only JDBC driver classes, Swing event-dispatch comments, the Courier New font and a supplier delivery-note tooltip. With no driver entity, clock-in state, run history or driver report anywhere in the tree, an in-house driver module does not exist. https://raw.githubusercontent.com/kriolos-obiz/kriolos-pos/main/kriolos-opos-app/src/main/resources/pos_liquidbase/db-changelog-v4_5.xml · retrieved 2026-08-04

A
No

delivery-dispatch-board

No dispatch or expo board ships anywhere in the source. The only order-display code is RemoteOrderDisplay, which deletes and re-inserts one orders row per ticket line for an external display client that is not part of the repository - it shows nothing itself and knows nothing about drivers. The schema has no dispatch, run or driver table to drive such a board, no undispatched-order state, no elapsed-time tracking beyond the ticket timestamp, and no structure for batching multiple orders into one run. The sales screens in kriolos-opos-app are the register, the floor-plan map (JTicketsBagRestaurantMap) and the shared-ticket list; there is no dispatch view among them. https://raw.githubusercontent.com/kriolos-obiz/kriolos-pos/main/kriolos-opos-app/src/main/java/com/openbravo/pos/sales/RemoteOrderDisplay.java · retrieved 2026-08-04

A
Unknown

delivery-route-map differentiator

Not scored by this record.

Unknown

delivery-driver-tracking differentiator

Not scored by this record.

Unknown

delivery-zones-polygon differentiator

Not scored by this record.

No

delivery-zone-pricing

There is no delivery entity in the schema at all - no zone, fee, promise-time or dispatch table. Guest addresses live as free text on customers (ADDRESS, ADDRESS2, POSTAL, CITY, REGION, COUNTRY) with no geocoding, zone assignment or per-zone fee/minimum, so a delivery charge can only be rung in as an ordinary product line. https://raw.githubusercontent.com/kriolos-obiz/kriolos-pos/main/kriolos-opos-app/src/main/resources/pos_liquidbase/db-changelog-v4_5.xml · retrieved 2026-08-03

A
Unknown

delivery-address-validation

Not scored by this record.

Unknown

delivery-driver-comp differentiator

Not scored by this record.

Unknown

delivery-cash-reconcile

Not scored by this record.

Unknown

delivery-daas-dispatch

Not scored by this record.

Unknown

delivery-daas-fallback differentiator

Not scored by this record.

Unknown

delivery-3p-direct-integration differentiator

Not scored by this record.

Unknown

delivery-3p-injection

Not scored by this record.

Unknown

delivery-menu-push

Not scored by this record.

Unknown

delivery-86-sync

Not scored by this record.

Unknown

delivery-store-pause

Not scored by this record.

Unknown

delivery-3p-reconciliation differentiator

Not scored by this record.

Unknown

delivery-injection-error-visibility differentiator

Not scored by this record.

Unknown

delivery-tracking-page

Not scored by this record.

Unknown

delivery-promise-time differentiator

Not scored by this record.

Unknown

delivery-offline-behavior

Not scored by this record.

Digital ordering & guest-facing channels

No

digital-first-party-web

The Maven reactor enumerates the entire product - kriolos-opos-spi, assets-reports, assets-image, thirdparty, base, hardware, domain, i18n, i18n_pt, lib-report, app, jpackage and docs - and none of these modules is or contains a web server, ordering site or HTTP endpoint; the application is a Swing desktop POS. The only e-commerce traces in the tree are three author comments inherited from uniCenta ('outline/prep for eCommerce connector' in OrderCustomerList, OrderSupplierList and TicketSelector) marking scaffolding that was never built. There is no first-party web ordering channel of any kind, commissioned or not. https://raw.githubusercontent.com/kriolos-obiz/kriolos-pos/main/pom.xml · retrieved 2026-08-04

A
No

digital-menu-single-source

There is no digital menu to keep in sync. The POS menu record (products/categories in the application database) is the only menu the product has: the Maven reactor contains no web, app or kiosk module, no ordering API and no menu-export or menu-publish code anywhere in the tree, so no first-party digital channel exists for an item edit to propagate to. The single-source-of-truth capability is absent because the digital side of it does not exist in the product. https://raw.githubusercontent.com/kriolos-obiz/kriolos-pos/main/pom.xml · retrieved 2026-08-04

A
Unknown

digital-native-app differentiator

Not scored by this record.

No

digital-account-saved-payment

The product is a Java desktop application with no guest-facing channel: the Maven reactor is app, base, domain, hardware, i18n, jpackage, lib-report, spi, thirdparty and asset modules, with no web or ordering server. There is no card-on-file vault - payments stores per-transaction TRANSID, CARDNAME and RETURNMSG with no customer token relation - and no guest login, saved address or reorder concept exists in the schema. https://raw.githubusercontent.com/kriolos-obiz/kriolos-pos/main/kriolos-opos-app/src/main/resources/pos_liquidbase/db-changelog-v4_5.xml · retrieved 2026-08-03

A
Unknown

digital-upsell-engine differentiator

Not scored by this record.

Unknown

digital-scheduled-pacing

Not scored by this record.

Unknown

digital-fulfillment-modes

Not scored by this record.

Unknown

digital-qr-table

Not scored by this record.

Unknown

digital-kiosk differentiator

Not scored by this record.

Unknown

digital-group-ordering

Not scored by this record.

Unknown

digital-catering-portal differentiator

Not scored by this record.

Unknown

digital-voice-ai-phone differentiator

Not scored by this record.

Unknown

digital-drivethru-ai

Not scored by this record.

Unknown

digital-sms-ordering

Not scored by this record.

Unknown

digital-google-order differentiator

Not scored by this record.

Unknown

digital-apple-business-connect

Not scored by this record.

Unknown

digital-loyalty-attach

Not scored by this record.

Unknown

digital-subscriptions

Not scored by this record.

Unknown

digital-promo-parity

Not scored by this record.

Unknown

digital-guest-data-ownership differentiator

Not scored by this record.

Unknown

digital-checkout-pci-sca

Not scored by this record.

Unknown

digital-surcharge-transparency differentiator

Not scored by this record.

Guest data, loyalty & marketing

No

guest-loyalty-unified-profile

customers is the only guest record and it can only be populated from the POS; there is no first-party web, app or kiosk channel in the product to merge from, and no dedup or merge machinery in the schema - no alias, match or merge table, and CARD, EMAIL and PHONE are plain nullable columns with no uniqueness or match rule. https://raw.githubusercontent.com/kriolos-obiz/kriolos-pos/main/kriolos-opos-app/src/main/resources/pos_liquidbase/db-changelog-v4_5.xml · retrieved 2026-08-03

A
Unknown

guest-loyalty-thirdparty-identity-attach differentiator

Not scored by this record.

No

guest-loyalty-accrual-models

The schema contains no points, visit, punch, tier or accrual table. The only guest-value constructs are customers.DISCOUNT (a flat per-customer percentage), customers.ISVIP, the MAXDEBT/CURDEBT house-account fields, and vouchers(ID, VOUCHER_NUMBER, CUSTOMER, AMOUNT, STATUS), which is stored value rather than an accrual program. https://raw.githubusercontent.com/kriolos-obiz/kriolos-pos/main/kriolos-opos-app/src/main/resources/pos_liquidbase/db-changelog-v4_5.xml · retrieved 2026-08-03

A
Unknown

guest-loyalty-tiers differentiator

Not scored by this record.

Unknown

guest-loyalty-offline-behavior differentiator

Not scored by this record.

Unknown

guest-loyalty-offer-stacking-rules differentiator

Not scored by this record.

Unknown

guest-loyalty-targeted-offers differentiator

Not scored by this record.

Unknown

guest-loyalty-rfm-segmentation differentiator

Not scored by this record.

No

guest-loyalty-lifecycle-automation

No campaign, message, segment or scheduler table exists in the schema and no mail or SMS transport ships in any module, so birthday, first-visit and lapsed win-back automations cannot be configured. customers does not even carry a birth date column. https://raw.githubusercontent.com/kriolos-obiz/kriolos-pos/main/kriolos-opos-app/src/main/resources/pos_liquidbase/db-changelog-v4_5.xml · retrieved 2026-08-03

A
Unknown

guest-loyalty-native-email-sms differentiator

Not scored by this record.

Unknown

guest-loyalty-consent-management

Not scored by this record.

Unknown

guest-loyalty-10dlc-registration

Not scored by this record.

Unknown

guest-loyalty-campaign-attribution differentiator

Not scored by this record.

Unknown

guest-loyalty-data-export-portability differentiator

Not scored by this record.

Unknown

guest-loyalty-review-capture-routing differentiator

Not scored by this record.

Unknown

guest-loyalty-referral-program

Not scored by this record.

Unknown

guest-loyalty-wallet-pass differentiator

Not scored by this record.

Unknown

guest-loyalty-privacy-rights-tooling

Not scored by this record.

Unknown

guest-loyalty-redemption-fraud-controls

Not scored by this record.

Unknown

guest-loyalty-ai-offer-recommendation differentiator

Not scored by this record.

Unknown

guest-loyalty-stored-value-gift

Not scored by this record.

Labor & workforce

Yes

labor-clock-in-at-pos

JPanelEmployeePresence is a POS-resident panel with Check In and Check Out buttons plus a row of configurable break buttons; DataLogicPresenceManagement writes INSERT INTO shifts(ID, STARTSHIFT, PPLID) and UPDATE shifts SET ENDSHIFT = ? WHERE ENDSHIFT IS NULL AND PPLID = ?, with breaks recorded in shift_breaks(SHIFTID, BREAKID, STARTTIME, ENDTIME). Identification is the POS login itself - people carries APPPASSWORD and CARD, so PIN or magnetic card - and no separate time-clock hardware is required. The epm_dailypresence, epm_dailyschedule and epm_performance reports read the same tables. https://raw.githubusercontent.com/kriolos-obiz/kriolos-pos/main/kriolos-opos-app/src/main/java/com/openbravo/pos/epm/JPanelEmployeePresence.java · retrieved 2026-08-03

A
Unknown

labor-photo-punch-verification differentiator

Not scored by this record.

Unknown

labor-offline-time-punch differentiator

Not scored by this record.

Partial

labor-granular-rbac

Permissions are per discrete action rather than fixed tiers: role XML grants individual entries including sales.Override, sales.DeleteLines, sales.EditLines, sales.EditTicket, sales.RefundTicket, sales.DeleteTicket, sales.ChangeTaxOptions, sales.Total, button.opendrawer, button.linediscount, button.totaldiscount, per-tender payment.* and refund.* entries, and one entry per report script (e.g. /com/openbravo/reports/sales_cashflow.bs), all checked at runtime through m_App.hasPermission(...). Roles are editable in the Roles admin panel. Shortfall: grants are global to the role - roles(ID, NAME, PERMISSIONS) has no location column and people(ROLE) assigns exactly one role per user with no location scoping, so per-location permission grants cannot be expressed. https://raw.githubusercontent.com/kriolos-obiz/kriolos-pos/main/kriolos-opos-app/src/main/resources/com/openbravo/pos/templates/Role.Employee.xml · retrieved 2026-08-03

A
No

labor-manager-override-audit

The only override mechanism is JPanelTicket.changeCount(), which reads a single shared static PIN from the override.pin application property and compares it against a JPasswordDialog entry ('Enter PIN Number' / 'PIN Number Incorrect'). It is one secret shared by all managers, it is tied to no user record, and nothing is persisted on success - no row, no timestamp, no approver identity. The sales.Override permission itself only widens shared-ticket visibility in JTicketsBagShared. lineremoved and draweropened record the operator who acted, never an approver. https://raw.githubusercontent.com/kriolos-obiz/kriolos-pos/main/kriolos-opos-app/src/main/java/com/openbravo/pos/sales/JPanelTicket.java · retrieved 2026-08-03

A
Unknown

labor-native-scheduling differentiator

Not scored by this record.

Unknown

labor-demand-labor-forecast differentiator

Not scored by this record.

Unknown

labor-realtime-labor-percent differentiator

Not scored by this record.

Unknown

labor-overtime-prevention differentiator

Not scored by this record.

Unknown

labor-break-compliance-by-state differentiator

Not scored by this record.

Unknown

labor-minor-labor-rules

Not scored by this record.

Unknown

labor-tip-pooling-rules

Not scored by this record.

Unknown

labor-tip-distribution-audit-trail

Not scored by this record.

Unknown

labor-qualified-tips-w2-reporting differentiator

Not scored by this record.

Unknown

labor-native-payroll differentiator

Not scored by this record.

Unknown

labor-payroll-export-formats

Not scored by this record.

Unknown

labor-shift-swap-workflow differentiator

Not scored by this record.

Unknown

labor-server-performance-metrics differentiator

Not scored by this record.

Inventory, purchasing & cost control

Partial

inventory-recipe-bom-costing

The multi-level structure is real: products_bundle (ID, PRODUCT, PRODUCT_BUNDLE, QUANTITY) defines a component list per product, and DataLogicSales.adjustStock() calls getProductsBundle() and recurses into each component, multiplying quantity at each level, so a bundle whose component is itself a bundle explodes all the way down to raw stock on sale. Shortfall: none of it is costing. Nothing in the tree rolls component cost up to a parent - products.PRICEBUY is a hand-entered per-row field, and every reference to it (StockDiaryEditor, StockManagement, the inventory and label reports) reads it as stored; no code computes a parent's PRICEBUY or a plate cost from its components, so changing an ingredient cost updates nothing upstream. The bundle explosion in deleteTicket() even values components at getPriceSell(), not cost. There is no yield or conversion factor to cost against either: UomEditor is a single name field. Plate cost must be maintained by hand exactly as the claim warns against. https://raw.githubusercontent.com/kriolos-obiz/kriolos-pos/main/kriolos-opos-domain/src/main/java/com/openbravo/pos/forms/DataLogicSales.java · retrieved 2026-08-04

A
No

inventory-unit-conversion-yields

The unit-of-measure editor exposes a single field, name (UomEditor declares only m_jName), and the uom table is (ID, NAME). products references one uom column plus scalar STOCKCOST, STOCKVOLUME and STOCKUNITS. There is no purchase/recipe/count unit distinction, no conversion factor between units, and no yield or waste percentage field anywhere in the schema. https://raw.githubusercontent.com/kriolos-obiz/kriolos-pos/main/kriolos-opos-app/src/main/java/com/openbravo/pos/inventory/UomEditor.java · retrieved 2026-08-03

A
Unknown

inventory-theoretical-vs-actual differentiator

Not scored by this record.

Unknown

inventory-realtime-depletion differentiator

Not scored by this record.

Unknown

inventory-86-auto-sync differentiator

Not scored by this record.

No

inventory-count-modes

The movement-reason enumeration is closed and complete - IN_PURCHASE, IN_REFUND, IN_MOVEMENT, OUT_SALE, OUT_REFUND, OUT_BREAK, OUT_MOVEMENT, OUT_SAMPLE, OUT_FREE, OUT_USED, OUT_SUBTRACT, OUT_CROSSING - and contains no stocktake or count reason. The schema has no count-session table either: stockdiary is a flat movement log and stockcurrent holds only (LOCATION, PRODUCT, ATTRIBUTESETINSTANCE_ID, UNITS). A physical count can therefore only be keyed in as Adjust Add / Adjust Subtract movements, with no full-count, spot-count or scheduled cycle-count workflow and no per-count variance history. https://raw.githubusercontent.com/kriolos-obiz/kriolos-pos/main/kriolos-opos-domain/src/main/java/com/openbravo/pos/inventory/MovementReason.java · retrieved 2026-08-03

A
Unknown

inventory-mobile-count-offline

Not scored by this record.

Unknown

inventory-vendor-catalogs-edi differentiator

Not scored by this record.

Unknown

inventory-invoice-ocr differentiator

Not scored by this record.

Unknown

inventory-price-change-alerts differentiator

Not scored by this record.

Unknown

inventory-par-auto-suggest differentiator

Not scored by this record.

Unknown

inventory-waste-logging

Not scored by this record.

Unknown

inventory-shelf-life-expiry

Not scored by this record.

Unknown

inventory-bar-partial-bottle

Not scored by this record.

Unknown

inventory-cogs-gl-export

Not scored by this record.

Unknown

inventory-native-not-partner differentiator

Not scored by this record.

Unknown

inventory-menu-margin-linkage differentiator

Not scored by this record.

Reporting, BI & data access

Unknown

reporting-realtime-dashboard

Repo has active work on JasperReports-style report files, but no browser or mobile off-premise dashboard is documented.

F
Partial

reporting-eod-closeout

Printer.CloseCash.xml produces one close-cash document per cash session covering payments broken out by tender type with amounts, Total Sales, number of payments, a tax-analysis line per tax rate, a Line Voids block (ticket, user, product, units) from lineremoved, a No Sales block (user, ticket) from draweropened, receipt count, SubTotal / Taxes / Totals, and closed-by user, terminal, sequence and start/end date. Shortfall: no tip total is printed even though payments.TIP is stored, no discount total appears, and there is no counted-cash versus expected-cash reconciliation line, so the deposit still has to be derived off the report. https://raw.githubusercontent.com/kriolos-obiz/kriolos-pos/main/kriolos-opos-app/src/main/resources/com/openbravo/pos/templates/Printer.CloseCash.xml · retrieved 2026-08-03

A
Partial

reporting-pmix-modifier-level

sales_extproducts.bs is a real product-mix report: it groups ticketlines by product reference and name (and category and customer) returning SUM(UNITS) as TOTALunits with TOTALnet, TOTALtax and TOTALgross, filterable by date interval, customer and product/category. Shortfall: it is item-level only. Modifiers are stored as an opaque ATTRIBUTES blob on ticketlines and are never joined or aggregated by any shipped report, and the only time filter is a start/end datetime interval - there is no daypart grouping, and the schema has no revenue-centre concept to filter on. https://raw.githubusercontent.com/kriolos-obiz/kriolos-pos/main/kriolos-opos-assets-reports/src/main/resources/com/openbravo/reports/sales_extproducts.bs · retrieved 2026-08-03

A
Unknown

reporting-comps-voids-audit

Not scored by this record.

Unknown

reporting-cash-over-short

Not scored by this record.

Unknown

reporting-labor-productivity

Not scored by this record.

Unknown

reporting-server-scorecards differentiator

Not scored by this record.

Unknown

reporting-channel-profitability differentiator

Not scored by this record.

Unknown

reporting-scheduled-delivery

Not scored by this record.

Unknown

reporting-public-api differentiator

Not scored by this record.

Unknown

reporting-webhooks differentiator

Not scored by this record.

Unknown

reporting-api-not-upcharged differentiator

Not scored by this record.

Unknown

reporting-tier-paywall differentiator

Not scored by this record.

Unknown

reporting-history-retention differentiator

Not scored by this record.

Unknown

reporting-anomaly-alerts differentiator

Not scored by this record.

Unknown

reporting-nl-query

Not scored by this record.

Unknown

reporting-guest-cohorts differentiator

Not scored by this record.

Unknown

reporting-sales-forecast differentiator

Not scored by this record.

Unknown

reporting-tip-tax-compliance

Not scored by this record.

Multi-location, franchise & enterprise governance

No

multi-location-org-hierarchy

locations is (ID, NAME, ADDRESS) with no parent, group or level column, and nothing else in the schema references a location grouping. It is a flat warehouse list used for stock movements; there is no enterprise/region/location hierarchy for reporting or permissions to be scoped to. https://raw.githubusercontent.com/kriolos-obiz/kriolos-pos/main/kriolos-opos-app/src/main/resources/pos_liquidbase/db-changelog-v4_5.xml · retrieved 2026-08-03

A
No

multi-location-central-menu-publish

An install is a single application database shared by its terminals - products, categories and prices exist once, with no location column and no store-level copy to publish to. The schema contains no publish, version, changeset or deployment-history table, and no module in the reactor performs cross-database menu distribution. https://raw.githubusercontent.com/kriolos-obiz/kriolos-pos/main/kriolos-opos-app/src/main/resources/pos_liquidbase/db-changelog-v4_5.xml · retrieved 2026-08-03

A
No

multi-location-price-zones

products carries exactly one PRICEBUY and one PRICESELL and there is no price-list, price-tier or channel-price table in the schema; ticketlines stores the resolved PRICE per line. The only price-variation mechanisms are customers.DISCOUNT (a flat percentage on one guest) and the isvprice variable-price flag, so per-location-group, per-channel or per-daypart pricing requires duplicating the product. https://raw.githubusercontent.com/kriolos-obiz/kriolos-pos/main/kriolos-opos-app/src/main/resources/pos_liquidbase/db-changelog-v4_5.xml · retrieved 2026-08-03

A
Unknown

multi-location-consolidated-reporting

Not scored by this record.

Unknown

multi-location-cross-location-giftcard

Not scored by this record.

Unknown

multi-location-cross-location-loyalty

Not scored by this record.

Unknown

multi-location-multi-brand differentiator

Not scored by this record.

Unknown

multi-location-multi-tax-jurisdiction

Not scored by this record.

Unknown

multi-location-central-labor-policy

Not scored by this record.

Hardware & physical footprint

Unknown

hardware-commodity-devices differentiator

Not scored by this record.

Unknown

hardware-os-platforms

Java/Maven desktop build implies Windows, macOS and Linux, but no minimum OS versions or device specs are published.

F
Unknown

hardware-handheld-purpose-built

Not scored by this record.

Unknown

hardware-handheld-battery-swap differentiator

Not scored by this record.

Unknown

hardware-handheld-lte

Not scored by this record.

Partial

hardware-offline-mode

On-premise architecture runs without internet; no vendor statement enumerates which functions degrade. https://github.com/kriolos-obiz/kriolos-pos · retrieved 2026-08-01

E
No

hardware-kds

No first-party KDS exists. The only KDS code in the tree is KitchenDisplay.java, whose addRecord() inserts (ID, ORDERTIME, PLACE, PICKUPID, PRODUCT, MULTIPLY, ATTRIBUTES) into a KITCHENDISPLAY table that no Liquibase changelog creates, and the class is never instantiated anywhere in the repository - dead code with no display UI behind it. Kitchen output actually ships as printing: script.SendOrder.bs routes lines by product.printer 1-6 to Printer.Ticket.P1..P6 templates on locally bound printers ('Print to Kitchen Printer' in the shipped strings). The hardware module's peripheral enumeration (printers, fiscal printer, customer displays, scale, scanner) includes no KDS screen or bump-bar input device, and nothing anywhere implements station routing to a display or course/fire timing. RemoteOrderDisplay presupposes an external display client that is not part of the product. https://raw.githubusercontent.com/kriolos-obiz/kriolos-pos/main/kriolos-opos-domain/src/main/java/com/openbravo/pos/sales/KitchenDisplay.java · retrieved 2026-08-04

A
Unknown

hardware-kiosk differentiator

Not scored by this record.

Unknown

hardware-drive-thru

Not scored by this record.

Unknown

hardware-printer-compatibility

Not scored by this record.

Unknown

hardware-peripherals

Not scored by this record.

Unknown

hardware-p2pe-terminal

Not scored by this record.

Unknown

hardware-tap-to-phone differentiator

Not scored by this record.

Unknown

hardware-pricing-transparency differentiator

Not scored by this record.

Unknown

hardware-ownership-vs-lease differentiator

Not scored by this record.

Unknown

hardware-usable-after-churn differentiator

Not scored by this record.

Unknown

hardware-rma-sla differentiator

Not scored by this record.

Unknown

hardware-byod

Not scored by this record.

Unknown

hardware-remote-device-management differentiator

Not scored by this record.

Unknown

hardware-selfpour-scales

Not scored by this record.

Unknown

hardware-callerid-integration

Not scored by this record.

Integrations, API & extensibility

No

extensibility-public-api-docs

AsciiDoc project docs and full GPL-3.0 source are public, but there is no self-serve REST API reference. https://github.com/kriolos-obiz/kriolos-pos · retrieved 2026-08-01

E
Unknown

extensibility-api-access-cost differentiator

Not scored by this record.

Unknown

extensibility-free-sandbox differentiator

Not scored by this record.

No

extensibility-oauth-partner-apps

Desktop application with direct database access; no OAuth 2.0 authorization server or scoped third-party app grants. https://github.com/kriolos-obiz/kriolos-pos · retrieved 2026-08-01

E
No

extensibility-webhooks-push

The extension points that ship are in-process BeanShell scripts stored as application resources - customer.created.bs, customer.updated.bs, customer.deleted.bs, event.addline.bs, event.removeline.bs, event.setline.bs, script.Event.Total.bs - executed inside the terminal JVM. There is no outbound HTTP event delivery, no subscription registry, no signing and no retry. The one networked hook, script.poshubclient.bs, has both its import and its only call commented out and merely prints a debug line. https://raw.githubusercontent.com/kriolos-obiz/kriolos-pos/main/kriolos-opos-app/src/main/resources/com/openbravo/pos/templates/script.poshubclient.bs · retrieved 2026-08-03

A
Unknown

extensibility-webhook-reliability differentiator

Not scored by this record.

Unknown

extensibility-order-injection-api

Not scored by this record.

Unknown

extensibility-menu-write-api differentiator

Not scored by this record.

Unknown

extensibility-doordash-preferred differentiator

Not scored by this record.

Unknown

extensibility-first-party-delivery-integrations differentiator

Not scored by this record.

Unknown

extensibility-middleware-compatibility

Not scored by this record.

Unknown

extensibility-accounting-connectors

Not scored by this record.

Unknown

extensibility-payroll-export

Not scored by this record.

Unknown

extensibility-app-marketplace

Not scored by this record.

Unknown

extensibility-headless-embedded

Not scored by this record.

Unknown

extensibility-data-portability-exit differentiator

Not scored by this record.

Reliability, offline & operations

Yes

reliability-offline-order-entry

Local install and local database make order entry and printing independent of internet connectivity. https://github.com/kriolos-obiz/kriolos-pos · retrieved 2026-08-01

E
Unknown

reliability-offline-card-auth differentiator

Not scored by this record.

Unknown

reliability-offline-decline-liability differentiator

Not scored by this record.

Unknown

reliability-lan-degraded-multi-terminal differentiator

Not scored by this record.

Unknown

reliability-local-transaction-engine differentiator

Not scored by this record.

Yes

reliability-offline-kds-printing

Kitchen routing runs entirely on the terminal with no network service in the path: script.SendOrder.bs reads line.getProperty('product.printer') and calls sales.printTicket('Printer.Ticket.P1') through P6, and DeviceTicket binds each machine.printer.N property to a locally attached serial, USB, file, JavaPOS or system printer via DevicePrinterESCPOS/JavaPOS/Plain/Printer. An internet outage cannot affect kitchen printing. The terminal does still need its database connection, and no display client ships for the KDS half of the claim. https://raw.githubusercontent.com/kriolos-obiz/kriolos-pos/main/kriolos-opos-app/src/main/resources/com/openbravo/pos/templates/script.SendOrder.bs · retrieved 2026-08-03

A
No

reliability-printer-fallback

DeviceTicket.getDevicePrinter(key) ends 'return printer == null ? m_nullprinter : printer' - a DevicePrinterNull that silently discards output when the configured printer is missing. Printer initialisation failures are swallowed into logger.log(Level.WARNING, e.getMessage(), e) with no user-visible alert, and machine.printer.1 through machine.printer.6 are independent named destinations with no backup, failover or alternate-station property. There is no fallback path. https://raw.githubusercontent.com/kriolos-obiz/kriolos-pos/main/kriolos-opos-hardware/src/main/java/com/openbravo/pos/printer/DeviceTicket.java · retrieved 2026-08-03

A
Unknown

reliability-sync-conflict-handling

Not scored by this record.

Unknown

reliability-offline-feature-matrix

Not scored by this record.

Unknown

reliability-public-status-page

Not scored by this record.

Unknown

reliability-247-live-support

Not scored by this record.

Unknown

reliability-onsite-install differentiator

Not scored by this record.

Unknown

reliability-menu-build-service differentiator

Not scored by this record.

Unknown

reliability-hardware-replacement-sla

Not scored by this record.

Unknown

reliability-pci-dss-4-attestation

Not scored by this record.

Unknown

reliability-mfa-role-based-access

Not scored by this record.

Unknown

reliability-self-serve-training

Not scored by this record.

Unknown

reliability-failover-terminal-role differentiator

Not scored by this record.

Unknown

reliability-cellular-backup

Not scored by this record.

Commercial, compliance & data ownership

Unknown

commercial-month-to-month-contract differentiator

Not scored by this record.

Unknown

commercial-no-early-termination-fee differentiator

Not scored by this record.

Unknown

commercial-autorenew-terms-published

GPL-3.0 software with no subscription, so no auto-renewal term or cancellation notice window exists.

F
Unknown

commercial-processing-not-bundled differentiator

Not scored by this record.

Unknown

commercial-interchange-plus-published differentiator

Not scored by this record.

Unknown

commercial-rate-increase-clause differentiator

Not scored by this record.

Yes

commercial-pricing-published

Unambiguously free: GPL-3.0 licensed with releases distributed on GitHub and no commercial tier offered. https://github.com/kriolos-obiz/kriolos-pos · retrieved 2026-08-01

B
Unknown

commercial-module-unbundling differentiator

Not scored by this record.

Partial

commercial-hardware-purchase-outright

No first-party hardware sold, so no mandatory lease; operators buy commodity hardware themselves. https://github.com/kriolos-obiz/kriolos-pos · retrieved 2026-08-01

E
Unknown

commercial-hardware-not-locked differentiator

Not scored by this record.

Unknown

commercial-data-export-self-serve

Not scored by this record.

Unknown

commercial-export-customer-and-loyalty differentiator

Not scored by this record.

Unknown

commercial-post-termination-export-window differentiator

Not scored by this record.

Unknown

commercial-data-ownership-clause differentiator

Not scored by this record.

Unknown

commercial-pci-p2pe-tokenization

Not scored by this record.

Unknown

commercial-pci-dss-4-controls

Not scored by this record.

Unknown

commercial-privacy-dsar-tooling

Not scored by this record.

Unknown

commercial-wcag-kiosk-accessibility differentiator

Not scored by this record.

Unknown

commercial-dual-pricing-compliant differentiator

Not scored by this record.

Adversarial verification

An independent pass was instructed to refute this record, defaulting to downgrade when uncertain. It challenged 34 values — 0 upheld, 0 downgraded, 0 upgraded. This is published in full because a reader who can see which values were contested, on what evidence, and which way they moved has something no affiliate-funded comparison offers.

Capability claims

ClaimAs first scoredVerdictWhat the verifier found
order-capture-scheduled-ordersunknown (grade F) - "No public documentation located during the 2026-08-01 research pass.", a placeholder marking a cell nobody had examined.resolve-to-noThe full Liquibase schema is public. receipts carries only (ID, MONEY, DATENEW, ATTRIBUTES, PERSON), tickets only (ID, TICKETTYPE, TICKETID, PERSON, CUSTOMER, STATUS) and sharedtickets only (ID, NAME, CONTENT, APPUSER, PICKUPID, LOCKED) - there is no future fire-time, promise-time or lead-time column anywhere, so a held ticket cannot be dated forward or auto-fired. The reservations table (CREATED, DATENEW, TITLE, CHAIRS, ISDONE, DESCRIPTION) is a table-booking calendar, not an order. source
menu-pricing-modifier-price-by-parent-sizeunknown (grade F) - "No public documentation located during the 2026-08-01 research pass.", a placeholder marking a cell nobody had examined.resolve-to-noModifiers are modelled as product attributes: attribute(ID, NAME), attributevalue(ID, ATTRIBUTE_ID, VALUE), attributeuse and attributesetinstance carry no price column at all, so an attribute value cannot hold a price, let alone a per-parent/per-size matrix. The only priced alternative is a complement product (products_com joins PRODUCT to PRODUCT2), and products holds a single PRICESELL per row, so a differently priced topping requires a duplicated product record. source
menu-pricing-topping-quantity-tiersunknown (grade F) - "No public documentation located during the 2026-08-01 research pass.", a placeholder marking a cell nobody had examined.resolve-to-noNo quantity-tier or price-multiplier field exists: attributevalue is (ID, ATTRIBUTE_ID, VALUE) with no numeric price or factor, and ticketlines carries only UNITS and PRICE. Light/regular/extra can only be expressed by adding the complement product again or by creating separate products. source
payments-refund-void-controlsunknown (grade F) - "No public documentation located during the 2026-08-01 research pass.", a placeholder marking a cell nobody had examined.resolve-to-partialAuthorization is genuinely role-based: the shipped role files grant discrete permissions sales.RefundTicket, sales.DeleteLines, sales.DeleteTicket, refund.cash/cheque/voucher/magcard, button.opendrawer, button.linediscount and button.totaldiscount, and Role.Employee.xml deliberately omits every refund, delete-ticket and open-drawer entry. Voids and no-sales are logged - JPanelTicket calls dlSystem.execLineRemoved(user name, ticket id, product, units) into the lineremoved table, draweropened records (OPENDATE, NAME, TICKETID), and both blocks print on the close-cash report. Shortfall: the log records the logged-in operator, never an approving manager; there is no per-user approval prompt (the optional override is a single shared static PIN read from the override.pin application property in JPanelTicket.changeCount()); discounts and refunds are written to no audit table at all; and lineremoved/draweropened are ordinary mutable tables with no immutability guarantee. source
kitchen-expo-consolidationunknown (grade F) - "No public documentation located during the 2026-08-01 research pass.", a placeholder marking a cell nobody had examined.resolve-to-noNo expo or consolidation view ships. Kitchen routing is per-line only: script.SendOrder.bs branches on line.getProperty('product.printer') values 1-6 and prints Printer.Ticket.P1..P6, while RemoteOrderDisplay.remoteOrderDisplay() deletes and re-inserts one orders row per ticket line carrying a per-line display id, for an external display client that is not part of this repository. Nothing aggregates several stations into one order view and nothing gates order completion on every contributing station having bumped. source
kitchen-bump-bar-hardwareunknown (grade F) - "No public documentation located during the 2026-08-01 research pass.", a placeholder marking a cell nobody had examined.resolve-to-noThe kriolos-opos-hardware module enumerates every supported peripheral class - DevicePrinterESCPOS/JavaPOS/Plain/Printer/Null, DeviceFiscalPrinter, DeviceDisplay (ESCPOS, JavaPOS, LED8, PDLED8, SurePOS, serial, window and dual-screen), DeviceScale and DeviceScanner. There is no bump bar, programmable keypad or KDS input device among them, and the strings 'bump' and 'bumpbar' do not occur anywhere in the repository. source
delivery-zone-pricingunknown (grade F) - "No public documentation located during the 2026-08-01 research pass.", a placeholder marking a cell nobody had examined.resolve-to-noThere is no delivery entity in the schema at all - no zone, fee, promise-time or dispatch table. Guest addresses live as free text on customers (ADDRESS, ADDRESS2, POSTAL, CITY, REGION, COUNTRY) with no geocoding, zone assignment or per-zone fee/minimum, so a delivery charge can only be rung in as an ordinary product line. source
digital-account-saved-paymentunknown (grade F) - "No public documentation located during the 2026-08-01 research pass.", a placeholder marking a cell nobody had examined.resolve-to-noThe product is a Java desktop application with no guest-facing channel: the Maven reactor is app, base, domain, hardware, i18n, jpackage, lib-report, spi, thirdparty and asset modules, with no web or ordering server. There is no card-on-file vault - payments stores per-transaction TRANSID, CARDNAME and RETURNMSG with no customer token relation - and no guest login, saved address or reorder concept exists in the schema. source
guest-loyalty-unified-profileunknown (grade F) - "No public documentation located during the 2026-08-01 research pass.", a placeholder marking a cell nobody had examined.resolve-to-nocustomers is the only guest record and it can only be populated from the POS; there is no first-party web, app or kiosk channel in the product to merge from, and no dedup or merge machinery in the schema - no alias, match or merge table, and CARD, EMAIL and PHONE are plain nullable columns with no uniqueness or match rule. source
guest-loyalty-accrual-modelsunknown (grade F) - "No public documentation located during the 2026-08-01 research pass.", a placeholder marking a cell nobody had examined.resolve-to-noThe schema contains no points, visit, punch, tier or accrual table. The only guest-value constructs are customers.DISCOUNT (a flat per-customer percentage), customers.ISVIP, the MAXDEBT/CURDEBT house-account fields, and vouchers(ID, VOUCHER_NUMBER, CUSTOMER, AMOUNT, STATUS), which is stored value rather than an accrual program. source
guest-loyalty-lifecycle-automationunknown (grade F) - "No public documentation located during the 2026-08-01 research pass.", a placeholder marking a cell nobody had examined.resolve-to-noNo campaign, message, segment or scheduler table exists in the schema and no mail or SMS transport ships in any module, so birthday, first-visit and lapsed win-back automations cannot be configured. customers does not even carry a birth date column. source
labor-clock-in-at-posunknown (grade F) - "No public documentation located during the 2026-08-01 research pass.", a placeholder marking a cell nobody had examined.resolve-to-yesJPanelEmployeePresence is a POS-resident panel with Check In and Check Out buttons plus a row of configurable break buttons; DataLogicPresenceManagement writes INSERT INTO shifts(ID, STARTSHIFT, PPLID) and UPDATE shifts SET ENDSHIFT = ? WHERE ENDSHIFT IS NULL AND PPLID = ?, with breaks recorded in shift_breaks(SHIFTID, BREAKID, STARTTIME, ENDTIME). Identification is the POS login itself - people carries APPPASSWORD and CARD, so PIN or magnetic card - and no separate time-clock hardware is required. The epm_dailypresence, epm_dailyschedule and epm_performance reports read the same tables. source
labor-granular-rbacunknown (grade F) - "No public documentation located during the 2026-08-01 research pass.", a placeholder marking a cell nobody had examined.resolve-to-partialPermissions are per discrete action rather than fixed tiers: role XML grants individual entries including sales.Override, sales.DeleteLines, sales.EditLines, sales.EditTicket, sales.RefundTicket, sales.DeleteTicket, sales.ChangeTaxOptions, sales.Total, button.opendrawer, button.linediscount, button.totaldiscount, per-tender payment.* and refund.* entries, and one entry per report script (e.g. /com/openbravo/reports/sales_cashflow.bs), all checked at runtime through m_App.hasPermission(...). Roles are editable in the Roles admin panel. Shortfall: grants are global to the role - roles(ID, NAME, PERMISSIONS) has no location column and people(ROLE) assigns exactly one role per user with no location scoping, so per-location permission grants cannot be expressed. source
labor-manager-override-auditunknown (grade F) - "No public documentation located during the 2026-08-01 research pass.", a placeholder marking a cell nobody had examined.resolve-to-noThe only override mechanism is JPanelTicket.changeCount(), which reads a single shared static PIN from the override.pin application property and compares it against a JPasswordDialog entry ('Enter PIN Number' / 'PIN Number Incorrect'). It is one secret shared by all managers, it is tied to no user record, and nothing is persisted on success - no row, no timestamp, no approver identity. The sales.Override permission itself only widens shared-ticket visibility in JTicketsBagShared. lineremoved and draweropened record the operator who acted, never an approver. source
inventory-unit-conversion-yieldsunknown (grade F) - "No public documentation located during the 2026-08-01 research pass.", a placeholder marking a cell nobody had examined.resolve-to-noThe unit-of-measure editor exposes a single field, name (UomEditor declares only m_jName), and the uom table is (ID, NAME). products references one uom column plus scalar STOCKCOST, STOCKVOLUME and STOCKUNITS. There is no purchase/recipe/count unit distinction, no conversion factor between units, and no yield or waste percentage field anywhere in the schema. source
inventory-count-modesunknown (grade F) - "No public documentation located during the 2026-08-01 research pass.", a placeholder marking a cell nobody had examined.resolve-to-noThe movement-reason enumeration is closed and complete - IN_PURCHASE, IN_REFUND, IN_MOVEMENT, OUT_SALE, OUT_REFUND, OUT_BREAK, OUT_MOVEMENT, OUT_SAMPLE, OUT_FREE, OUT_USED, OUT_SUBTRACT, OUT_CROSSING - and contains no stocktake or count reason. The schema has no count-session table either: stockdiary is a flat movement log and stockcurrent holds only (LOCATION, PRODUCT, ATTRIBUTESETINSTANCE_ID, UNITS). A physical count can therefore only be keyed in as Adjust Add / Adjust Subtract movements, with no full-count, spot-count or scheduled cycle-count workflow and no per-count variance history. source
reporting-eod-closeoutunknown (grade F) - "No public documentation located during the 2026-08-01 research pass.", a placeholder marking a cell nobody had examined.resolve-to-partialPrinter.CloseCash.xml produces one close-cash document per cash session covering payments broken out by tender type with amounts, Total Sales, number of payments, a tax-analysis line per tax rate, a Line Voids block (ticket, user, product, units) from lineremoved, a No Sales block (user, ticket) from draweropened, receipt count, SubTotal / Taxes / Totals, and closed-by user, terminal, sequence and start/end date. Shortfall: no tip total is printed even though payments.TIP is stored, no discount total appears, and there is no counted-cash versus expected-cash reconciliation line, so the deposit still has to be derived off the report. source
reporting-pmix-modifier-levelunknown (grade F) - "No public documentation located during the 2026-08-01 research pass.", a placeholder marking a cell nobody had examined.resolve-to-partialsales_extproducts.bs is a real product-mix report: it groups ticketlines by product reference and name (and category and customer) returning SUM(UNITS) as TOTALunits with TOTALnet, TOTALtax and TOTALgross, filterable by date interval, customer and product/category. Shortfall: it is item-level only. Modifiers are stored as an opaque ATTRIBUTES blob on ticketlines and are never joined or aggregated by any shipped report, and the only time filter is a start/end datetime interval - there is no daypart grouping, and the schema has no revenue-centre concept to filter on. source
multi-location-org-hierarchyunknown (grade F) - "No public documentation located during the 2026-08-01 research pass.", a placeholder marking a cell nobody had examined.resolve-to-nolocations is (ID, NAME, ADDRESS) with no parent, group or level column, and nothing else in the schema references a location grouping. It is a flat warehouse list used for stock movements; there is no enterprise/region/location hierarchy for reporting or permissions to be scoped to. source
multi-location-central-menu-publishunknown (grade F) - "No public documentation located during the 2026-08-01 research pass.", a placeholder marking a cell nobody had examined.resolve-to-noAn install is a single application database shared by its terminals - products, categories and prices exist once, with no location column and no store-level copy to publish to. The schema contains no publish, version, changeset or deployment-history table, and no module in the reactor performs cross-database menu distribution. source
multi-location-price-zonesunknown (grade F) - "No public documentation located during the 2026-08-01 research pass.", a placeholder marking a cell nobody had examined.resolve-to-noproducts carries exactly one PRICEBUY and one PRICESELL and there is no price-list, price-tier or channel-price table in the schema; ticketlines stores the resolved PRICE per line. The only price-variation mechanisms are customers.DISCOUNT (a flat percentage on one guest) and the isvprice variable-price flag, so per-location-group, per-channel or per-daypart pricing requires duplicating the product. source
extensibility-webhooks-pushunknown (grade F) - "No public documentation located during the 2026-08-01 research pass.", a placeholder marking a cell nobody had examined.resolve-to-noThe extension points that ship are in-process BeanShell scripts stored as application resources - customer.created.bs, customer.updated.bs, customer.deleted.bs, event.addline.bs, event.removeline.bs, event.setline.bs, script.Event.Total.bs - executed inside the terminal JVM. There is no outbound HTTP event delivery, no subscription registry, no signing and no retry. The one networked hook, script.poshubclient.bs, has both its import and its only call commented out and merely prints a debug line. source
reliability-offline-kds-printingunknown (grade F) - "No public documentation located during the 2026-08-01 research pass.", a placeholder marking a cell nobody had examined.resolve-to-yesKitchen routing runs entirely on the terminal with no network service in the path: script.SendOrder.bs reads line.getProperty('product.printer') and calls sales.printTicket('Printer.Ticket.P1') through P6, and DeviceTicket binds each machine.printer.N property to a locally attached serial, USB, file, JavaPOS or system printer via DevicePrinterESCPOS/JavaPOS/Plain/Printer. An internet outage cannot affect kitchen printing. The terminal does still need its database connection, and no display client ships for the KDS half of the claim. source
reliability-printer-fallbackunknown (grade F) - "No public documentation located during the 2026-08-01 research pass.", a placeholder marking a cell nobody had examined.resolve-to-noDeviceTicket.getDevicePrinter(key) ends 'return printer == null ? m_nullprinter : printer' - a DevicePrinterNull that silently discards output when the configured printer is missing. Printer initialisation failures are swallowed into logger.log(Level.WARNING, e.getMessage(), e) with no user-visible alert, and machine.printer.1 through machine.printer.6 are independent named destinations with no backup, failover or alternate-station property. There is no fallback path. source
menu-pricing-nested-modifiersunknown (grade F) - "No public documentation located during the 2026-08-01 research pass.", a placeholder marking a cell nobody had examined.resolve-to-noThe shipped DDL enumerates the whole model: products has one ATTRIBUTESET_ID, attributeset(ID, NAME), attributeuse(ID, ATTRIBUTESET_ID, ATTRIBUTE_ID, LINENO), attribute(ID, NAME), attributevalue(ID, ATTRIBUTE_ID, VALUE). Flat two levels, no self-referencing parent group, no MIN/MAX columns, no required flag. products_com and products_bundle are the only other composition tables and carry none of those either. The one forced-selection control is a single product-level boolean, ISVERPATRIB ('mandatory' in ProductsEditor), which prompts for the entire attribute set once. source
payments-gift-cardsunknown (grade F) - "No public documentation located during the 2026-08-01 research pass.", a placeholder marking a cell nobody had examined.resolve-to-partialNative first-party vouchers do exist - a vouchers table, a back-office issuing panel and JPaymentVoucher as a tender - and with no location column they work across the group on one shared database. But VoucherInfo's STATUS is binary 'A'/'D' with no balance field, and JPaymentVoucher disables moneyEditor and loads the full amount, so redemption is all-or-nothing and no real-time balance is tracked. No online-ordering channel exists in the product to redeem through. source
kitchen-station-routingunknown (grade F) - "No public documentation located during the 2026-08-01 research pass.", a placeholder marking a cell nobody had examined.resolve-to-partialproducts.PRINTTO (a 0-6 combo in ProductsEditor) plus script.SendOrder.bs branching to Printer.Ticket.P1..P6 give genuine admin-configurable per-item routing. But the destinations are printers, not KDS stations - KitchenDisplay.java writes to a KITCHENDISPLAY table no changelog creates and is never instantiated - routing keys off the product row only with no category/order-type/revenue-centre rule, the six destinations are hard-coded, and printer bindings are per-terminal machine.printer.N properties rather than per-location config. source
inventory-recipe-bom-costingunknown (grade F) - "No public documentation located during the 2026-08-01 research pass.", a placeholder marking a cell nobody had examined.resolve-to-partialproducts_bundle(PRODUCT, PRODUCT_BUNDLE, QUANTITY) plus the recursive DataLogicSales.adjustStock() give real multi-level component explosion down to raw stock, so sub-recipes exist structurally. The costing half does not: products.PRICEBUY is hand-entered and every consumer reads it as stored; no code rolls component cost up to a parent, deleteTicket() even values exploded components at PRICESELL, and UomEditor has no conversion or yield factor. An ingredient cost change propagates nowhere. source
order-capture-split-mergeunknown (grade F) - "No public documentation located during the 2026-08-01 research pass.", a placeholder marking a cell nobody had examined.resolve-to-partialBoth halves exist in item-move form only. btnSplit (gated on sales.Total and more than one article) opens ReceiptSplit, a two-pane dialog with move-one/move-all buttons shifting whole lines to one new ticket, which is then paid immediately via closeTicket(); JTicketsBagRestaurantMap merges tables by appending the clipboard table's lines into the target ticket and deleting the source shared ticket after a confirmation. Missing: any seat concept (places.SEATS is floor-plan table capacity; ticketlines has no seat column), even N-way splits, and dollar/percentage splits. Payment closes a receipt, so the after-partial-payment case is structurally impossible rather than supported. source
delivery-driver-rosterunknown (grade F) - "No public documentation located during the 2026-08-01 research pass.", a placeholder marking a cell nobody had examined.resolve-to-noThe complete source contains no driver concept: none of the 53 Liquibase tables is a driver, run or dispatch table, the only staff entities are people plus the shifts/shift_breaks timekeeping pair with no assignment-state column, and a tree-wide search for driver/dispatch/courier/delivery matches only JDBC drivers, Swing EDT comments, the Courier New font and a supplier delivery-note tooltip. source
delivery-dispatch-boardunknown (grade F) - "No public documentation located during the 2026-08-01 research pass.", a placeholder marking a cell nobody had examined.resolve-to-noNo dispatch or expo screen ships: the sales views are the register, the floor-plan map and the shared-ticket list. The only order-display code, RemoteOrderDisplay, writes one orders row per ticket line for an external display client outside the repository, and the schema has no dispatch state, driver availability or run-batching structure for a board to show. source
digital-first-party-webunknown (grade F) - "No public documentation located during the 2026-08-01 research pass.", a placeholder marking a cell nobody had examined.resolve-to-noThe Maven reactor enumerates the whole product (spi, assets-reports, assets-image, thirdparty, base, hardware, domain, i18n, i18n_pt, lib-report, app, jpackage, docs) and contains no web server, ordering site or HTTP endpoint - it is a Swing desktop POS. The only e-commerce traces are three 'outline/prep for eCommerce connector' author comments inherited from uniCenta, marking scaffolding never built. source
digital-menu-single-sourceunknown (grade F) - "No public documentation located during the 2026-08-01 research pass.", a placeholder marking a cell nobody had examined.resolve-to-noThere is no digital menu for the POS menu record to feed: no web, app or kiosk module exists in the reactor, and no menu-export or publish code exists anywhere in the tree. The capability is absent because the product has no first-party digital channel at all. source
hardware-kdsunknown (grade F) - "No public documentation located during the 2026-08-01 research pass.", a placeholder marking a cell nobody had examined.resolve-to-noThe only KDS code, KitchenDisplay.java, inserts into a KITCHENDISPLAY table no changelog creates and is never instantiated - dead code with no display UI. Kitchen output ships as printing (script.SendOrder.bs to Printer.Ticket.P1..P6 on local printers), the hardware module's peripheral enumeration includes no KDS screen or bump-bar device, and nothing implements station routing to a display or course/fire timing. RemoteOrderDisplay presupposes an external display client not in the product. source

Sources

Every URL this record cites. 24 in total.