Vendors / Open source & self-hostable
Floreant POS
The best-known free restaurant POS is genuinely alive again — the official floreantpos/floreantpos repo is on a floreantpos-2.0 branch with a real feature-bearing 2.0 Beta (build 2001) dated 2026-05-23 (Cash & Card Management module, dashboard charts, drawer workflow), while floreant.org's public download page still only offers 1.4 build 1707; a separate community fork (fat-tire/floreantpos) shows 2026 activity that is Dependabot dependency bumps, not features.
scored dead legacy rubric
- Claims in scope
- 278
- Scored
- 45
- Assessed
- 44
- Unknown
- 234
- Not applicable
- 36
- Cells challenged
- 0
unknown, never as no.Identity
- Owner
- OROCUBE LLC (single commercial steward; sells paid ORO POS upgrade and commercial support)
- Parent
- OROCUBE (commercial successor)
- Who it is for
- Small independent restaurants and small chains willing to self-host a Java/Swing desktop POS on their own LAN and PC hardware
- Site
- https://github.com/fat-tire/floreantpos
Pricing
transparency: quote-only · unit: free perpetual download (self-hosted); paid upsell priced by quote · processor lock-in: no
- Software
- Free download of the 1.4 (build 1707) community edition under OROCUBE's MRPL 1.2. OROCUBE monetizes via the paid ORO POS upgrade and commercial support; those figures are not published on floreant.org. No subscription, no per-terminal fee for the free edition.
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
order-capture-floor-plan-editor
Not scored by this record.
order-capture-seat-level
Not scored by this record.
order-capture-coursing-hold-fire
Not scored by this record.
order-capture-split-merge
Splitting exists two ways: SplitTicketDialog moves items one at a time between up to four TicketForSplitView panes (Number of Splits is a fixed 2/3/4 toggle), and a 'Split by seat number' button groups items by TicketItem.getSeatNumber() into the panes; the action is gated by the SPLIT_TICKET permission and logged to ACTION_HISTORY as SPLIT_CHECK. Shortfalls: (1) no even N-way and no arbitrary dollar/percentage split — item transfer is the only mechanism and no amount or percent field exists in the dialog; (2) merging does not exist in any form — the branch has no merge action, dialog, permission or ActionHistory constant (SPLIT_CHECK is the only check-restructuring constant), and SalesSummaryReportView fills the report template's MergeChecks/MergeAmount fields with a hard-coded blank string; (3) partial-payment handling is broken by inspection — saveTicket() reallocates prior transactions to a split ticket only under `originalTicket.getPaidAmount() > originalTicket.getTotalAmount()`, so a conventionally part-paid check (paid < total) splits without moving any payment. Read from a shallow clone of floreantpos-2.0 at commit 6cf73ad. https://github.com/floreantpos/floreantpos/blob/floreantpos-2.0/src/com/floreantpos/ui/views/SplitTicketDialog.java · retrieved 2026-08-04
order-capture-bar-tab-preauth differentiator
Not scored by this record.
order-capture-transfer-audit
Not scored by this record.
order-capture-native-handheld
Not scored by this record.
order-capture-offline-order-entry
Self-hosted Java desktop app against a local DB; offline operation is the architecture, but no vendor-published offline matrix exists. https://github.com/floreantpos/floreantpos · retrieved 2026-08-01
order-capture-qr-same-check differentiator
Not scored by this record.
order-capture-kiosk-first-party differentiator
Not scored by this record.
order-capture-drive-thru
Not scored by this record.
order-capture-drive-thru-timers
Not scored by this record.
order-capture-voice-ai differentiator
Not scored by this record.
order-capture-throttling differentiator
Not scored by this record.
order-capture-scheduled-orders
TICKET.DELIVEERY_DATE stores a future delivery date and ReceiptPrintService prints it as a 'Delivery:' header line, so a ticket can be future-dated. Shortfall: the core setDeliveryDate(int ticketId) here is an empty method body — only the paid Cust plugin fills it — and grep of the 2.0 source finds no fire time, lead time or prep-time scheduler at all. ReceiptPrintService.printToKitchen() runs synchronously when the order is saved, so a future-dated ticket still fires to the kitchen on receipt. https://github.com/floreantpos/floreantpos/blob/floreantpos-2.0/src/com/floreantpos/ui/views/order/DefaultOrderServiceExtension.java · retrieved 2026-08-03
order-capture-catering
Not scored by this record.
order-capture-order-ready-signal differentiator
Not scored by this record.
order-capture-void-comp-controls
Not scored by this record.
Menu, modifiers & pricing engine
menu-pricing-nested-modifiers
The Hibernate mapping is exhaustive and the modifier tree is exactly two levels: MenuItem holds a one-to-many of MenuItemModifierGroup (columns MIN_QUANTITY, MAX_QUANTITY, SORT_ORDER, many-to-one MODIFIER_GROUP), ModifierGroup carries NAME/ENABLED/EXCLUSIVED/REQUIRED and a set of MenuModifier, and MenuModifier.hbm.xml gives a MenuModifier a single many-to-one GROUP_ID back to its parent group and no collection of child groups at all. A modifier therefore cannot own a modifier group, so a third level is unreachable. The min/max and forced-selection halves of the claim do exist at the one level available — floreant.org/features markets it as "You can set force modifiers and maximum number of modifiers per item" — but the nesting the claim is about does not. Read from a shallow clone of floreantpos-2.0 at commit 6cf73ad. https://github.com/floreantpos/floreantpos/blob/floreantpos-2.0/src/com/floreantpos/model/MenuItemModifierGroup.hbm.xml · retrieved 2026-08-04
menu-pricing-modifier-price-by-parent-size
PIZZA_MODIFIER_PRICE keys a price row to a MenuItemSize and hangs a per-tier ModifierMultiplierPrice list off it, so a genuine size x quantity-tier price matrix exists without duplicating the modifier. Shortfall: getPriceForSizeAndMultiplier() applies that matrix only inside `if (isPizzaModifier() && priceList != null)` — an ordinary modifier falls back to the single MENU_MODIFIER.PRICE/EXTRA_PRICE columns — and the matrix is keyed by size alone, never by parent item, so one modifier cannot be priced differently on two different entrees. https://github.com/floreantpos/floreantpos/blob/floreantpos-2.0/src/com/floreantpos/model/MenuModifier.java · retrieved 2026-08-03
menu-pricing-fractional-placement differentiator
Not scored by this record.
menu-pricing-half-and-half-rule differentiator
Not scored by this record.
menu-pricing-topping-quantity-tiers
The MULTIPLIER table defines named tiers with NAME, TICKET_PREFIX, RATE, SORT_ORDER and DEFAULT_MULTIPLIER, maintained from the back office (MultiplierExplorerAction), with 'Regular' as the seeded default. MenuModifier.getPriceForMultiplier() returns the explicit MODIFIER_MULTIPLIER_PRICE.PRICE row for that tier when one is configured and otherwise `defaultPrice * multiplier.getRate() / 100`; TicketItem line 173 applies it to the single modifier line rather than repeating the modifier. floreant.org/features markets the same thing as 'Complex pricing of modifiers easy with Multiplier'. https://github.com/floreantpos/floreantpos/blob/floreantpos-2.0/src/com/floreantpos/model/MenuModifier.java · retrieved 2026-08-03
menu-pricing-size-style-matrix differentiator
Not scored by this record.
menu-pricing-included-allowance differentiator
Not scored by this record.
menu-pricing-combos
Not scored by this record.
menu-pricing-upsell-prompts differentiator
Not scored by this record.
menu-pricing-86-propagation
Not scored by this record.
menu-pricing-countdown-auto-86 differentiator
Not scored by this record.
menu-pricing-dayparting
Not scored by this record.
menu-pricing-channel-price-books
Not scored by this record.
menu-pricing-dual-pricing differentiator
Not scored by this record.
menu-pricing-allergen-nutrition
Not scored by this record.
menu-pricing-recipe-linkage differentiator
Not scored by this record.
menu-pricing-3p-menu-push
Not scored by this record.
menu-pricing-dynamic-pricing
Not scored by this record.
Payments & money movement
payments-processor-choice differentiator
Not scored by this record.
payments-published-rates differentiator
Not scored by this record.
payments-dual-pricing differentiator
Not scored by this record.
payments-surcharge-guardrails differentiator
Not scored by this record.
payments-emv-nfc
Software-only project with no first-party terminal line; runs on commodity PCs, so the capability has no subject. https://floreant.org/ · retrieved 2026-08-01
payments-softpos-tap-to-pay differentiator
Not scored by this record.
payments-pay-at-table
Not scored by this record.
payments-qr-guest-pay differentiator
Not scored by this record.
payments-tip-adjust
Not scored by this record.
payments-tip-pooling differentiator
Not scored by this record.
payments-offline-store-and-forward differentiator
Not scored by this record.
payments-offline-decline-liability differentiator
Not scored by this record.
payments-gift-cards
There is no gift-card entity anywhere in the 2.0 branch. The only gift construct is a tender type: PaymentType.GIFT_CERTIFICATE instantiates a GiftCertificateTransaction, a discriminator subclass of POS_TRANSACTION, and SettleTicketProcessor opens GiftCertDialog, which has exactly two inputs — a free-text certificate number and a hand-keyed face value. The processor then writes GIFT_CERT_NUMBER, GIFT_CERT_FACE_VALUE, GIFT_CERT_PAID_AMOUNT and GIFT_CERT_CASH_BACK_AMOUNT onto that one transaction. No card master table, no DAO lookup by card number, no issuance, activation or remaining-balance read, so real-time balance tracking is structurally impossible; and RestaurantDAO.getRestaurant() hard-codes get(1), so there is no group of locations to redeem across. floreant.org/features corroborates by listing "Gift card" only under the PRO column, linking to guide.orocube.com/generating-activating-gift-card/, which states in its own words that it covers ORO POS — the separate paid product, not Floreant. https://github.com/floreantpos/floreantpos/blob/floreantpos-2.0/src/com/floreantpos/ui/views/payment/GiftCertDialog.java · retrieved 2026-08-04
payments-house-accounts
Not scored by this record.
payments-split-tender
Not scored by this record.
payments-refund-void-controls
2.0 changelog gates the Shifts & Cash Registers tab behind manager permission; immutable approver-attributed audit log not documented. https://github.com/floreantpos/floreantpos/blob/floreantpos-2.0/CHANGELOG.md · retrieved 2026-08-01
payments-chargeback-tooling differentiator
Not scored by this record.
payments-card-on-file differentiator
Not scored by this record.
payments-payout-timing differentiator
Not scored by this record.
payments-p2pe-pci4
Not scored by this record.
Kitchen & production
kitchen-station-routing
floreant.org documents kitchen printer integration and the order screen has a Send Kitchen action; per-station KDS routing rules unverified. https://floreant.org/ · retrieved 2026-08-01
kitchen-expo-consolidation
The KDS is one ticket grid whose entire filter surface is the two combos in KitchenFilterDialog, titled 'Select Printer and Order Type'. KitchenTicketDAO.loadKitchenTickets() returns KITCHEN_TICKET rows in WAITING status and then drops any whose PRINTER_GROUP does not contain the selected printer; a KITCHEN_TICKET is created per printer group, and the BUMP button closes that one row to DONE. The string 'expo' does not occur anywhere in the floreantpos-2.0 source, and nothing anywhere gates order completion on every contributing station having bumped. https://github.com/floreantpos/floreantpos/blob/floreantpos-2.0/src/com/floreantpos/demo/KitchenDisplayView.java · retrieved 2026-08-03
kitchen-course-firing differentiator
Not scored by this record.
kitchen-prep-time-pacing differentiator
Not scored by this record.
kitchen-order-throttling differentiator
Not scored by this record.
kitchen-channel-pause-propagation differentiator
Not scored by this record.
kitchen-order-ready-callback differentiator
Not scored by this record.
kitchen-bump-bar-hardware
The vendor's own feature page lists 'KDS with bump bar' in the block of features that require the paid ORO POS upgrade — i.e. the vendor states it is not in Floreant POS. The source agrees: BUMP in KitchenTicketView is a Swing PosButton with no KeyListener, KeyStroke or InputMap binding in the whole com.floreantpos.demo package, and etc/jpos.xml declares only POSPrinter, KitchenPrinter and CashDrawer JavaPOS device categories. No supported bump-bar models are published. http://floreant.org/features/ · retrieved 2026-08-03
kitchen-all-day-counts
Not scored by this record.
kitchen-sla-alerts
Not scored by this record.
kitchen-printer-fallback differentiator
Not scored by this record.
kitchen-offline-operation differentiator
Not scored by this record.
kitchen-item-build-screens differentiator
Not scored by this record.
kitchen-pizza-fractional-display differentiator
Not scored by this record.
kitchen-recall-refire
Not scored by this record.
kitchen-order-modification-alerts differentiator
Not scored by this record.
kitchen-guest-ready-notification differentiator
Not scored by this record.
kitchen-waste-logging
Not scored by this record.
kitchen-speed-of-service-reporting
Not scored by this record.
kitchen-prep-forecasting
Not scored by this record.
Delivery, dispatch & third-party channels
delivery-driver-roster
floreant.org markets a delivery plugin as a first-party add-on; driver clock-in, assignment state and run history not documented. https://floreant.org/ · retrieved 2026-08-01
delivery-dispatch-board
The product defines the extension surface for exactly this capability and ships it empty: OrderServiceExtension declares getDeliveryDispatchView(orderType), openDeliveryDispatchDialog(orderType), getDriverView() and assignDriver(ticketId), and the bundled DefaultOrderServiceExtension implements getDeliveryDispatchView and getDriverView as `return null`, with openDeliveryDispatchDialog and assignDriver as empty method bodies. SwitchboardView's assign-driver flow calls that empty stub after confirming the order type is delivery, and LoginView's DRIVER VIEW button returns without acting when getDriverView() is null. TICKET.DRIVER_ID and the DriverAssigned/OnTheWay TicketStatus values exist as schema, but no dispatch screen, driver-availability view, per-order elapsed-time board or multi-order run assignment exists anywhere in the branch — the hooks await a paid plugin, and OROCUBE's Cust plugin page enumerates delivery zones, caller ID, customer registration and reorder with no dispatch board among them. Read from a shallow clone of floreantpos-2.0 at commit 6cf73ad. https://github.com/floreantpos/floreantpos/blob/floreantpos-2.0/src/com/floreantpos/ui/views/order/DefaultOrderServiceExtension.java · retrieved 2026-08-04
delivery-route-map differentiator
Not scored by this record.
delivery-driver-tracking differentiator
Not scored by this record.
delivery-zones-polygon differentiator
Not scored by this record.
delivery-zone-pricing
DELIVERY_CHARGE carries NAME, ZIP_CODE, START_RANGE, END_RANGE and CHARGE_AMOUNT, and DELIVERY_CONFIGURATION.CHARGE_BY_ZIP_CODE switches zip-based against distance-based zones; OROCUBE's Cust plugin page states 'Different zones can be created depending on the distance in between the store and the delivery address and thereby different zones can be charged differently for delivery. The zip code associated with the delivery address can also be used to categorize different zones.' Shortfall: the zone row holds a fee and nothing else — no per-zone order minimum and no per-zone quoted promise time exist in the schema or the plugin page — and DELIVERY_ADDRESS.DISTANCE is a stored number with no address-validation step in the open-source core, which never reads DeliveryChargeDAO at all. https://github.com/floreantpos/floreantpos/blob/floreantpos-2.0/src/com/floreantpos/model/DeliveryCharge.hbm.xml · retrieved 2026-08-03
delivery-address-validation
Not scored by this record.
delivery-driver-comp differentiator
Not scored by this record.
delivery-cash-reconcile
Not scored by this record.
delivery-daas-dispatch
Not scored by this record.
delivery-daas-fallback differentiator
Not scored by this record.
delivery-3p-direct-integration differentiator
Not scored by this record.
delivery-3p-injection
Not scored by this record.
delivery-menu-push
Not scored by this record.
delivery-86-sync
Not scored by this record.
delivery-store-pause
Not scored by this record.
delivery-3p-reconciliation differentiator
Not scored by this record.
delivery-injection-error-visibility differentiator
Not scored by this record.
delivery-tracking-page
Not scored by this record.
delivery-promise-time differentiator
Not scored by this record.
delivery-offline-behavior
Not scored by this record.
Digital ordering & guest-facing channels
digital-first-party-web
No ordering site exists to ship: the only inbound-order surface in the 2.0 branch is the abstract OnlineOrderPlugin contract (isSourceMatched, initFilterButton, loadTickets(PaginatedTableModel), initOrderInfoActionButtons, initSwitchboardActionButtons) plus ShowOnlineTicketManagementAction, which hides itself when no TicketImportPlugin is installed — machinery for displaying orders imported from an external system, not for taking them. The only HTTP server anywhere in the source is com.floreantpos.dejavoo.proxy.DejavooProxyServer, a localhost payment-terminal proxy. OROCUBE's own Floreant add-on catalogue at pos.orocube.com enumerates exactly three plugins (Cust, Floorplan, Inventory) with no web-ordering product, so there is no first-party ordering channel on any terms, commission-free or otherwise. Read from a shallow clone of floreantpos-2.0 at commit 6cf73ad. https://github.com/floreantpos/floreantpos/blob/floreantpos-2.0/src/com/floreantpos/extension/OnlineOrderPlugin.java · retrieved 2026-08-04
digital-menu-single-source
There is no first-party digital channel for the POS menu record to feed (see digital-first-party-web), so single-source propagation has nothing to propagate to. The product's only menu-movement mechanisms confirm it: MenuJsonExportAction/MenuJsonImportAction is a manual whole-menu JSON file export moved between installations by hand, and inbound online orders land on the ONLINE_ORDER sync table as pre-built TICKET_JSON blobs constructed by the external ordering system against its own copy of the menu — nothing in the branch publishes the POS menu outward to any digital channel, so an item edit at the register propagates nowhere. Read from a shallow clone of floreantpos-2.0 at commit 6cf73ad. https://github.com/floreantpos/floreantpos/blob/floreantpos-2.0/src/com/floreantpos/bo/actions/MenuJsonExportAction.java · retrieved 2026-08-04
digital-native-app differentiator
Not scored by this record.
digital-account-saved-payment
There is no first-party guest-facing channel for an account to live in: OROCUBE's Floreant add-on catalogue at pos.orocube.com enumerates exactly three plugins (Cust, Floorplan, Inventory) with no online-ordering product, and floreant.org lists the order types as Dine-in and Takeout. CUSTOMER rows are created by staff in the back office; saved addresses do exist (the DELIVERY_ADDRESS bag) and the Cust plugin offers 'Order history & Reorder' at the POS, but the only card-on-file column is CUSTOMER.CREDIT_CARD_NO, a plaintext varchar(30) sitting beside CREDIT_LIMIT and CREDIT_SPENT — a house-account number. No tokenization, vault or guest login appears anywhere in the 2.0 source. https://github.com/floreantpos/floreantpos/blob/floreantpos-2.0/src/com/floreantpos/model/Customer.hbm.xml · retrieved 2026-08-03
digital-upsell-engine differentiator
Not scored by this record.
digital-scheduled-pacing
Not scored by this record.
digital-fulfillment-modes
Not scored by this record.
digital-qr-table
Not scored by this record.
digital-kiosk differentiator
Not scored by this record.
digital-group-ordering
Not scored by this record.
digital-catering-portal differentiator
Not scored by this record.
digital-voice-ai-phone differentiator
Not scored by this record.
digital-drivethru-ai
Not scored by this record.
digital-sms-ordering
Not scored by this record.
digital-google-order differentiator
Not scored by this record.
digital-apple-business-connect
Not scored by this record.
digital-loyalty-attach
Not scored by this record.
digital-subscriptions
Not scored by this record.
digital-promo-parity
Not scored by this record.
digital-guest-data-ownership differentiator
Not scored by this record.
digital-checkout-pci-sca
Not scored by this record.
digital-surcharge-transparency differentiator
Not scored by this record.
Guest data, loyalty & marketing
guest-loyalty-unified-profile
A single CUSTOMER table is the sole guest identity and TICKET.CUSTOMER_ID points at CUSTOMER.AUTO_ID, so in-store transactions do roll up per guest, searchable by mobile, loyalty number or name. Shortfall: CustomerDAO's entire public surface is getNumberOfCustomers, findBy(mobile, loyalty, name), findByMobileNumber, findByName, findById and loadCustomers — there is no merge or dedup routine of any kind, so two records for the same phone number stay two records; and ONLINE_ORDER stores CUST_ID as an unmapped varchar(128) rather than a foreign key, so anything arriving through the online-order sync table is not joined to the profile. No kiosk channel exists. https://github.com/floreantpos/floreantpos/blob/floreantpos-2.0/src/com/floreantpos/model/dao/CustomerDAO.java · retrieved 2026-08-03
guest-loyalty-thirdparty-identity-attach differentiator
Not scored by this record.
guest-loyalty-accrual-models
CUSTOMER carries LOYALTY_NO and LOYALTY_POINT columns, but the only code in the entire floreantpos-2.0 tree that touches loyaltyPoint is tfLoyaltyPoint on this form — an IntegerTextField a manager types a number into. No accrual rule exists in any form: not points-per-dollar, not visit/punch count, not spend tier. Nothing on the settlement path (PosTransactionService) increments the field, so points are hand-keyed rather than earned. https://github.com/floreantpos/floreantpos/blob/floreantpos-2.0/src/com/floreantpos/ui/forms/CustomerForm.java · retrieved 2026-08-03
guest-loyalty-tiers differentiator
Not scored by this record.
guest-loyalty-offline-behavior differentiator
Not scored by this record.
guest-loyalty-offer-stacking-rules differentiator
Not scored by this record.
guest-loyalty-targeted-offers differentiator
Not scored by this record.
guest-loyalty-rfm-segmentation differentiator
Not scored by this record.
guest-loyalty-lifecycle-automation
A case-insensitive grep of the whole floreantpos-2.0 source finds no occurrence of birthday, campaign, win-back, SMTP, mail-send or SMS: there is no messaging transport, no scheduler and no campaign entity to hang a trigger on. CUSTOMER has a DOB column with no consumer anywhere. OROCUBE's Floreant add-on catalogue offers only Cust, Floorplan and Inventory — there is no marketing or loyalty module to buy either. https://github.com/floreantpos/floreantpos/tree/floreantpos-2.0/src/com/floreantpos · retrieved 2026-08-03 · not refetchable · site policy · graded A when read
guest-loyalty-native-email-sms differentiator
Not scored by this record.
guest-loyalty-consent-management
Not scored by this record.
guest-loyalty-10dlc-registration
Not scored by this record.
guest-loyalty-campaign-attribution differentiator
Not scored by this record.
guest-loyalty-data-export-portability differentiator
Not scored by this record.
guest-loyalty-review-capture-routing differentiator
Not scored by this record.
guest-loyalty-referral-program
Not scored by this record.
guest-loyalty-wallet-pass differentiator
Not scored by this record.
guest-loyalty-privacy-rights-tooling
Not scored by this record.
guest-loyalty-redemption-fraud-controls
Not scored by this record.
guest-loyalty-ai-offer-recommendation differentiator
Not scored by this record.
guest-loyalty-stored-value-gift
Not scored by this record.
Labor & workforce
labor-clock-in-at-pos
2.0 changelog documents drawer sessions with a named opener and a Shift table; PIN/badge clock-in flow itself not described. https://github.com/floreantpos/floreantpos/blob/floreantpos-2.0/CHANGELOG.md · retrieved 2026-08-01
labor-photo-punch-verification differentiator
Not scored by this record.
labor-offline-time-punch differentiator
Not scored by this record.
labor-granular-rbac
Permissions are genuinely per-action, not fixed tiers: UserPermission declares 27 discrete permissions — Void Ticket, Add Discount, Refund, Drawer Assignment, Drawer Pull, View Reports, View Back Office, Modify Printed Ticket, Transfer Ticket, Reopen Ticket, Perform Manager Task among them — and UserType holds an arbitrary Set<UserPermission> checked by hasPermission(), created at Back Office > Admin > User Type per the OROCUBE user-permissions guide. Shortfall: the set is a fixed compile-time array with no comp and no price-change permission, and there is no location dimension to scope any of it to — RestaurantDAO.getRestaurant() hard-codes get(1), one store per database. https://github.com/floreantpos/floreantpos/blob/floreantpos-2.0/src/com/floreantpos/model/UserPermission.java · retrieved 2026-08-03
labor-manager-override-audit
ACTION_HISTORY (ACTION_TIME, ACTION_NAME, DESCRIPTION, USER_ID) is written on void, split, settle, payout, tips payout and check create/edit, and is queryable after the fact by date range through the Journal Report (ReportService line 255). Shortfall: the attribution is wrong for exactly the case the claim is about — PosAction.actionPerformed() prompts for a manager secret key when the operator lacks the permission and stores that approver in `authorizedUser`, but this dialog and every other call site pass Application.getCurrentUser() to saveHistory(), so the row names the logged-in cashier, not the approving manager. ACTION_HISTORY is an ordinary Hibernate-mapped table with no append-only or tamper-evidence guarantee. https://github.com/floreantpos/floreantpos/blob/floreantpos-2.0/src/com/floreantpos/ui/dialog/VoidTicketDialog.java · retrieved 2026-08-03
labor-native-scheduling differentiator
Not scored by this record.
labor-demand-labor-forecast differentiator
Not scored by this record.
labor-realtime-labor-percent differentiator
Not scored by this record.
labor-overtime-prevention differentiator
Not scored by this record.
labor-break-compliance-by-state differentiator
Not scored by this record.
labor-minor-labor-rules
Not scored by this record.
labor-tip-pooling-rules
Not scored by this record.
labor-tip-distribution-audit-trail
Not scored by this record.
labor-qualified-tips-w2-reporting differentiator
Not scored by this record.
labor-native-payroll differentiator
Not scored by this record.
labor-payroll-export-formats
Not scored by this record.
labor-shift-swap-workflow differentiator
Not scored by this record.
labor-server-performance-metrics differentiator
Not scored by this record.
Inventory, purchasing & cost control
inventory-recipe-bom-costing
A recipe exists, but only as a depletion link and only in the add-on: the Inventory plugin "will add a new tab in Menu Item. It will let you connect Raw material with Menu items" and gives "Recipe to deduct ingredient items when they are sold. It does not deduct fractional units." Named shortfalls: (1) the recipe is one level deep — the page enumerates the module's features and no sub-recipe, prep item or nested-recipe construct appears; (2) nothing on that enumeration is costing — no plate cost, no cost roll-up, no recalculation on an ingredient price change; (3) fractional units are explicitly not deducted, so even the depletion is coarse; (4) it is not in the product at all without the plugin — INVENTORY_ITEM in the core 2.0 branch has no menu-item association and carries only UNIT_PURCHASE_PRICE and AVERAGE_PACKAGE_PRICE with no recipe entity in the mapping set, and floreant.org/features lists "The recipe" under PRO; (5) the plugin page itself warns it "is going to be phased out soon and considered 'AS IS' without any support or replacement". https://pos.orocube.com/product/inventoryfloreant-pos/ · retrieved 2026-08-04
inventory-unit-conversion-yields
INVENTORY_ITEM carries a purchase unit (PUNIT_ID) and a separate recipe unit (RECIPE_UNIT_ID) with UNIT_PER_PACKAGE as the explicit conversion factor and TOTAL_UNIT_PACKAGES / TOTAL_RECEPIE_UNITS held in parallel; PACKAGING_UNIT adds FACTOR, BASEUNIT and DIMENSION, and OROCUBE's Inventory plugin page confirms 'Packing Units — maintains packing and recipe units'. Shortfall: there is no distinct count unit — counting is in packages — and no yield or waste percentage field exists anywhere in the inventory schema or on the plugin's feature list, so raw-to-usable conversion cannot be expressed at all. https://github.com/floreantpos/floreantpos/blob/floreantpos-2.0/src/com/floreantpos/model/InventoryItem.hbm.xml · retrieved 2026-08-03
inventory-theoretical-vs-actual differentiator
Not scored by this record.
inventory-realtime-depletion differentiator
Not scored by this record.
inventory-86-auto-sync differentiator
Not scored by this record.
inventory-count-modes
InventoryTransactionType is exactly IN(1), OUT(-1) and UNCHANGED(0), and INVENTORY_TRANSACTION records one dated adjustment per row — there is no count, stocktake, count-session or variance entity anywhere in the schema. OROCUBE's Inventory plugin page enumerates the module's whole feature set — inventory items with cost/unit/location, item-group/unit/vendor lookups, warehouses and locations, recipe in menu item, shopping list generated from re-order level, On Hand Report and Transaction Report — and no physical, spot or cycle count is among them. Caveat: that plugin's own source is not in the floreantpos repository, so this rests on the shared schema plus the vendor's feature enumeration. https://github.com/floreantpos/floreantpos/blob/floreantpos-2.0/src/com/floreantpos/model/InventoryTransactionType.java · retrieved 2026-08-03
inventory-mobile-count-offline
Not scored by this record.
inventory-vendor-catalogs-edi differentiator
Not scored by this record.
inventory-invoice-ocr differentiator
Not scored by this record.
inventory-price-change-alerts differentiator
Not scored by this record.
inventory-par-auto-suggest differentiator
Not scored by this record.
inventory-waste-logging
Not scored by this record.
inventory-shelf-life-expiry
Not scored by this record.
inventory-bar-partial-bottle
Not scored by this record.
inventory-cogs-gl-export
Not scored by this record.
inventory-native-not-partner differentiator
Not scored by this record.
inventory-menu-margin-linkage differentiator
Not scored by this record.
Reporting, BI & data access
reporting-realtime-dashboard
2.0 adds KPI cards, daily-trend, hourly-sales and cash/card charts, but as a desktop dialog — no browser or off-premise mobile access. https://github.com/floreantpos/floreantpos/blob/floreantpos-2.0/CHANGELOG.md · retrieved 2026-08-01
reporting-eod-closeout
Drawer-pull workflow with accountable vs actual cash, net sales, tax and tips; full tender-type and refund reconciliation unverified. https://github.com/floreantpos/floreantpos/blob/floreantpos-2.0/CHANGELOG.md · retrieved 2026-08-01
reporting-pmix-modifier-level
createModels() builds two aggregations — itemMap keyed by menu item id and modifierMap keyed by modifier id — each accumulating quantity, gross total, discount, tax total and net total, and passes them into the sales_report Jasper template as itemDataSource and modifierDataSource. So PMIX genuinely reaches modifier level with quantity and gross/net. Shortfall: the ticket query is DateUtils.startOfDay(from) to DateUtils.endOfDay(to), so the window is always whole days and no daypart filter is possible, and the only other filter is terminal (findTickets(date1, date2, type, terminal)) — there is no revenue-center object in the schema to filter on. https://github.com/floreantpos/floreantpos/blob/floreantpos-2.0/src/com/floreantpos/report/SalesReport.java · retrieved 2026-08-03
reporting-comps-voids-audit
Not scored by this record.
reporting-cash-over-short
Not scored by this record.
reporting-labor-productivity
Not scored by this record.
reporting-server-scorecards differentiator
Not scored by this record.
reporting-channel-profitability differentiator
Not scored by this record.
reporting-scheduled-delivery
Not scored by this record.
reporting-public-api differentiator
Not scored by this record.
reporting-webhooks differentiator
Not scored by this record.
reporting-api-not-upcharged differentiator
Not scored by this record.
reporting-tier-paywall differentiator
Not scored by this record.
reporting-history-retention differentiator
Not scored by this record.
reporting-anomaly-alerts differentiator
Not scored by this record.
reporting-nl-query
Not scored by this record.
reporting-guest-cohorts differentiator
Not scored by this record.
reporting-sales-forecast differentiator
Not scored by this record.
reporting-tip-tax-compliance
Not scored by this record.
Multi-location, franchise & enterprise governance
multi-location-org-hierarchy
RestaurantDAO.getRestaurant() is literally `getInstance().get(Integer.valueOf(1))` — one RESTAURANT row per database — and the same hard-coded get(1) is repeated in PosPrintService and TaxConfigurationView. There is no location, store, outlet, region or group entity in the domain model; the only OUTLET_ID and STORE_ID in the schema are opaque varchar columns on the ONLINE_ORDER sync table, not mapped objects. With no location object there is nothing for a second or third tier to contain, and neither reporting nor permissions carry a scope dimension. https://github.com/floreantpos/floreantpos/blob/floreantpos-2.0/src/com/floreantpos/model/dao/RestaurantDAO.java · retrieved 2026-08-03
multi-location-central-menu-publish
The vendor's own propagation mechanism is enumerated by this back-office action and its partner MenuJsonImportAction: a whole-menu JSON file exported from one installation and imported by hand into another, one database at a time. There is no corporate tier to author at (one RESTAURANT row per database), no way to select a set of locations, and no publish, version or push-history table anywhere in the schema to record what was pushed, when or by whom. https://github.com/floreantpos/floreantpos/blob/floreantpos-2.0/src/com/floreantpos/bo/actions/MenuJsonExportAction.java · retrieved 2026-08-03
multi-location-price-zones
Two of the three dimensions exist without duplicating the item record: MENUITEM_SHIFT holds a SHIFT_PRICE per Shift, which is daypart pricing (floreant.org markets it as 'Shift-wise pricing'), and MenuItem.getPriceByOrderType() reads a '<ORDERTYPE>_PRICE' entry out of the MENU_ITEM_PROPERTIES map, which is per-channel pricing. Shortfall: the location-group dimension does not exist — there is no price tier or zone object and no location entity to attach one to, since RestaurantDAO hard-codes get(1) for a single store per database — so one item cannot carry different prices per location group. https://github.com/floreantpos/floreantpos/blob/floreantpos-2.0/src/com/floreantpos/model/MenuItem.hbm.xml · retrieved 2026-08-03
multi-location-consolidated-reporting
Not scored by this record.
multi-location-cross-location-giftcard
Not scored by this record.
multi-location-cross-location-loyalty
Not scored by this record.
multi-location-multi-brand differentiator
Not scored by this record.
multi-location-multi-tax-jurisdiction
Not scored by this record.
multi-location-central-labor-policy
Not scored by this record.
Hardware & physical footprint
hardware-commodity-devices differentiator
Not scored by this record.
hardware-os-platforms
Java desktop application, so Windows/macOS/Linux in practice, but no published minimum OS versions or device specs. https://floreant.org/download/ · retrieved 2026-08-01
hardware-handheld-purpose-built
Not scored by this record.
hardware-handheld-battery-swap differentiator
Not scored by this record.
hardware-handheld-lte
Not scored by this record.
hardware-offline-mode
On-premise architecture means it runs without internet; the vendor publishes no explicit degradation matrix for card auth or loyalty. https://floreant.org/ · retrieved 2026-08-01
hardware-kds
A first-party KDS is genuinely in the product: the login screen's Kitchen Display button opens KitchenDisplayView, KITCHEN_TICKET rows are created per printer group and filtered by KitchenFilterDialog's printer and order-type combos (station routing), each KitchenTicketView card carries on-screen touch BUMP and VOID buttons, and a per-ticket TimerWatch header counts elapsed time since create, turning yellow then red at configurable YellowTimeOut (300s) / RedTimeOut (600s) thresholds. Named shortfalls: (1) no bump-bar input — BUMP is a Swing PosButton with no KeyListener, KeyStroke or InputMap binding in the com.floreantpos.demo package, and floreant.org/features places 'KDS with bump bar' in the paid ORO POS upgrade column; (2) no course/fire timing — a case-insensitive grep of the whole branch finds no course, coursing or firing construct, and ReceiptPrintService.printToKitchen() fires every kitchen ticket synchronously on save, so nothing can be held or fired by course. Read from a shallow clone of floreantpos-2.0 at commit 6cf73ad. https://github.com/floreantpos/floreantpos/blob/floreantpos-2.0/src/com/floreantpos/demo/KitchenTicketView.java · retrieved 2026-08-04
hardware-kiosk differentiator
Not scored by this record.
hardware-drive-thru
Not scored by this record.
hardware-printer-compatibility
Not scored by this record.
hardware-peripherals
Not scored by this record.
hardware-p2pe-terminal
Not scored by this record.
hardware-tap-to-phone differentiator
Not scored by this record.
hardware-pricing-transparency differentiator
Not scored by this record.
hardware-ownership-vs-lease differentiator
Not scored by this record.
hardware-usable-after-churn differentiator
Not scored by this record.
hardware-rma-sla differentiator
Not scored by this record.
hardware-byod
Not scored by this record.
hardware-remote-device-management differentiator
Not scored by this record.
hardware-selfpour-scales
Not scored by this record.
hardware-callerid-integration
Not scored by this record.
Integrations, API & extensibility
extensibility-public-api-docs
Full source is public on GitHub, but no self-serve REST API reference is published — source availability is not API documentation. https://github.com/floreantpos/floreantpos · retrieved 2026-08-01
extensibility-api-access-cost differentiator
Not scored by this record.
extensibility-free-sandbox differentiator
Not scored by this record.
extensibility-oauth-partner-apps
Desktop app with direct database access; no OAuth 2.0 authorization server or scoped operator-granted app permissions. https://github.com/floreantpos/floreantpos · retrieved 2026-08-01
extensibility-webhooks-push
Integration is pull-based by construction: ONLINE_ORDER carries LAST_UPDATE_TIME and LAST_SYNC_TIME alongside a TICKET_JSON blob, and the OnlineOrderPlugin contract is loadTickets(PaginatedTableModel ticketListTableModel) — a polled table read on a timer. The only HTTP server in the whole 2.0 source is com.floreantpos.dejavoo.proxy.DejavooProxyServer, a localhost proxy for a Dejavoo payment terminal; there is no outbound event publisher, no subscription registry, no endpoint configuration and no signing secret for any order lifecycle event. https://github.com/floreantpos/floreantpos/blob/floreantpos-2.0/src/com/floreantpos/model/OnlineOrder.hbm.xml · retrieved 2026-08-03
extensibility-webhook-reliability differentiator
Not scored by this record.
extensibility-order-injection-api
Not scored by this record.
extensibility-menu-write-api differentiator
Not scored by this record.
extensibility-doordash-preferred differentiator
Not scored by this record.
extensibility-first-party-delivery-integrations differentiator
Not scored by this record.
extensibility-middleware-compatibility
Not scored by this record.
extensibility-accounting-connectors
Not scored by this record.
extensibility-payroll-export
Not scored by this record.
extensibility-app-marketplace
Not scored by this record.
extensibility-headless-embedded
Not scored by this record.
extensibility-data-portability-exit differentiator
Not scored by this record.
Reliability, offline & operations
reliability-offline-order-entry
Local database and local terminal; order entry and printing are LAN operations independent of internet connectivity. https://github.com/floreantpos/floreantpos · retrieved 2026-08-01
reliability-offline-card-auth differentiator
Not scored by this record.
reliability-offline-decline-liability differentiator
Not scored by this record.
reliability-lan-degraded-multi-terminal differentiator
Not scored by this record.
reliability-local-transaction-engine differentiator
Not scored by this record.
reliability-offline-kds-printing
Kitchen printing is LAN-attached from the local application, so it is unaffected by internet loss. https://floreant.org/ · retrieved 2026-08-01
reliability-printer-fallback
printToKitchen() resolves the single Printer bound to each KITCHEN_TICKET's printer group, skips the ticket outright if that printer is null, and otherwise calls printQuitely() — whose catch block logs 'No print selected' via logger.error and returns, with the PrinterAbortException branch commented `//do nothing`. There is no second printer to fail over to, no retry, and no operator alert; an unreachable kitchen printer silently drops the ticket. PRINTER_GROUP is a routing list of printer names, not a failover chain, and the OROCUBE back-office guide describes it only as routing. https://github.com/floreantpos/floreantpos/blob/floreantpos-2.0/src/com/floreantpos/report/ReceiptPrintService.java · retrieved 2026-08-03
reliability-sync-conflict-handling
Not scored by this record.
reliability-offline-feature-matrix
Not scored by this record.
reliability-public-status-page
Not scored by this record.
reliability-247-live-support
Not scored by this record.
reliability-onsite-install differentiator
Not scored by this record.
reliability-menu-build-service differentiator
Not scored by this record.
reliability-hardware-replacement-sla
Not scored by this record.
reliability-pci-dss-4-attestation
Not scored by this record.
reliability-mfa-role-based-access
Not scored by this record.
reliability-self-serve-training
Not scored by this record.
reliability-failover-terminal-role differentiator
Not scored by this record.
reliability-cellular-backup
Not scored by this record.
Commercial, compliance & data ownership
commercial-month-to-month-contract differentiator
Not scored by this record.
commercial-no-early-termination-fee differentiator
Not scored by this record.
commercial-autorenew-terms-published
Free edition is a perpetual download with no subscription term; ORO POS and support contract terms are not published.
commercial-processing-not-bundled differentiator
Not scored by this record.
commercial-interchange-plus-published differentiator
Not scored by this record.
commercial-rate-increase-clause differentiator
Not scored by this record.
commercial-pricing-published
Community edition price is unambiguously free and published; paid ORO POS and support pricing are not on the public site. https://floreant.org/download/ · retrieved 2026-08-01
commercial-module-unbundling differentiator
Not scored by this record.
commercial-hardware-purchase-outright
No first-party hardware is sold, so there is no mandatory lease; operators buy commodity PCs and printers themselves. https://floreant.org/ · retrieved 2026-08-01
commercial-hardware-not-locked differentiator
Not scored by this record.
commercial-data-export-self-serve
Not scored by this record.
commercial-export-customer-and-loyalty differentiator
Not scored by this record.
commercial-post-termination-export-window differentiator
Not scored by this record.
commercial-data-ownership-clause differentiator
Not scored by this record.
commercial-pci-p2pe-tokenization
Not scored by this record.
commercial-pci-dss-4-controls
Not scored by this record.
commercial-privacy-dsar-tooling
Not scored by this record.
commercial-wcag-kiosk-accessibility differentiator
Not scored by this record.
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 28 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
| Claim | As first scored | Verdict | What the verifier found |
|---|---|---|---|
| order-capture-scheduled-orders | unknown, grade F — "No public documentation located during the 2026-08-01 research pass." | resolve-to-partial | The placeholder marked a cell nobody had examined. Floreant is open source, so the implementation is primary evidence. TICKET.DELIVEERY_DATE exists and ReceiptPrintService prints it as a 'Delivery:' header, but the core setDeliveryDate(int) is an empty method body and no fire-time or lead-time scheduler exists anywhere in the branch; printToKitchen() is called synchronously on save. source |
| menu-pricing-modifier-price-by-parent-size | unknown, grade F — placeholder rationale | resolve-to-partial | PIZZA_MODIFIER_PRICE is keyed to a MenuItemSize with a per-tier price list hanging off it, so a size price matrix is real. But MenuModifier.getPriceForSizeAndMultiplier() gates it on isPizzaModifier(), and the matrix has no parent-item axis, so the claim's 'depending on the parent item and the selected size' is only half met. source |
| menu-pricing-topping-quantity-tiers | unknown, grade F — placeholder rationale | resolve-to-yes | The MULTIPLIER entity is exactly this capability: named tiers with a RATE, a back-office explorer to maintain them, an optional explicit per-tier price override in MODIFIER_MULTIPLIER_PRICE, and application on a single modifier line via getPriceForMultiplier(). Grade A source, so the differentiator floor is not an issue; floreant.org/features corroborates at grade C. source |
| kitchen-expo-consolidation | unknown, grade F — placeholder rationale | resolve-to-no | Positive absence, not merely unfound: the KDS filter dialog is titled 'Select Printer and Order Type' and those two combos are its whole surface; loadKitchenTickets() returns per-printer-group KITCHEN_TICKET rows and BUMP closes one row. The token 'expo' does not appear anywhere in the branch and no completion gate spans stations. source |
| kitchen-bump-bar-hardware | unknown, grade F — placeholder rationale | resolve-to-no | The vendor states the limitation itself: floreant.org/features lists 'KDS with bump bar' among the features requiring the paid ORO POS upgrade. Corroborated in source — BUMP is a Swing button with no key bindings in com.floreantpos.demo, and etc/jpos.xml declares only POSPrinter, KitchenPrinter and CashDrawer. source |
| delivery-zone-pricing | unknown, grade F — placeholder rationale | resolve-to-partial | Zones with independent fees are real (DELIVERY_CHARGE by zip or distance band; the Cust plugin page describes both), but the row carries a charge amount only — no order minimum and no promise time — and the open-source core never reads DeliveryChargeDAO, so automatic application from a validated address is not demonstrable. source |
| digital-account-saved-payment | unknown, grade F — placeholder rationale | resolve-to-no | OROCUBE's own add-on catalogue enumerates exactly three Floreant plugins and no online-ordering product, and floreant.org's order types are Dine-in and Takeout — there is no first-party guest channel for an account to exist in. The only card-on-file column is CUSTOMER.CREDIT_CARD_NO, a plaintext varchar(30) house-account field; no tokenization appears in the branch. source |
| guest-loyalty-unified-profile | unknown, grade F — placeholder rationale | resolve-to-partial | One CUSTOMER table with TICKET.CUSTOMER_ID does unify in-store history per guest, so this is not a no. But CustomerDAO's full public surface is lookup by mobile/loyalty/name/id with no merge or dedup routine, and ONLINE_ORDER.CUST_ID is an unmapped varchar rather than a foreign key. source |
| guest-loyalty-accrual-models | unknown, grade F — placeholder rationale | resolve-to-no | LOYALTY_POINT exists as a column, which is what makes this cell look scoreable, but the only consumer in the entire branch is an IntegerTextField on the back-office customer form. No accrual rule of any kind — per-dollar, per-visit or per-tier — and nothing on the settlement path touches the field. source |
| guest-loyalty-lifecycle-automation | unknown, grade F — placeholder rationale | resolve-to-no | No messaging transport, scheduler or campaign entity exists: grep of the branch finds no birthday, campaign, win-back, SMTP, mail-send or SMS token, and CUSTOMER.DOB has no consumer. The vendor's add-on catalogue offers no marketing module either, so there is no purchasable path to it. source |
| labor-granular-rbac | unknown, grade F — placeholder rationale | resolve-to-partial | Stronger than the blank implied: 27 discrete permissions assignable in any combination to arbitrary user types, including void, discount, refund, drawer assignment and drawer pull, confirmed in both source and the OROCUBE user-permissions guide. Held at partial because the set is compile-time fixed with no comp or price-change permission and there is no location to scope to. source |
| labor-manager-override-audit | unknown, grade F — placeholder rationale | resolve-to-partial | ACTION_HISTORY records performer, time, action and description and is queryable via the Journal Report, so an audit trail exists. The shortfall is specific and checkable: PosAction captures the overriding manager in authorizedUser, but every saveHistory() call site passes Application.getCurrentUser(), so overrides are attributed to the cashier. source |
| inventory-unit-conversion-yields | unknown, grade F — placeholder rationale | resolve-to-partial | Purchase unit and recipe unit are separate mapped columns with UNIT_PER_PACKAGE as the conversion factor and PACKAGING_UNIT.FACTOR/BASEUNIT behind them — the conversion half of the claim is met. No yield or waste percentage field exists anywhere in the inventory schema or on the plugin's published feature list. source |
| inventory-count-modes | unknown, grade F — placeholder rationale | resolve-to-no | InventoryTransactionType is IN/OUT/UNCHANGED with no count-session or variance entity in the shared schema, and OROCUBE's Inventory plugin page enumerates the module's whole feature set — items, lookups, warehouses, recipes, shopping list, On Hand and Transaction reports — with no physical, spot or cycle count among them. Noted in the cell that the plugin's own source is not public. source |
| reporting-pmix-modifier-level | unknown, grade F — placeholder rationale | resolve-to-partial | Better than the blank suggested: SalesReport builds a separate modifierMap alongside itemMap with quantity, gross, discount, tax and net, rendered as its own band of sales_report — modifier-level PMIX is genuinely present. Held at partial because the window is forced to whole days (startOfDay/endOfDay), killing daypart filtering, and terminal is the only other filter. source |
| multi-location-org-hierarchy | unknown, grade F — placeholder rationale | resolve-to-no | RestaurantDAO.getRestaurant() is a hard-coded get(1) repeated across the codebase — one RESTAURANT row per database. No location, store, outlet or region entity exists in the domain model, so there is no object for a hierarchy to be built from, and neither reporting nor permissions carry a scope dimension. source |
| multi-location-central-menu-publish | unknown, grade F — placeholder rationale | resolve-to-no | The alternative the product actually ships is enumerated in the back office: MenuJsonExportAction and MenuJsonImportAction, a manual whole-menu JSON file moved between installs one database at a time. No location-set selection and no publish/version history table exist. source |
| multi-location-price-zones | unknown, grade F — placeholder rationale | resolve-to-partial | Two of the three axes are present without duplicating the item: MENUITEM_SHIFT gives a per-shift (daypart) price and getPriceByOrderType() gives a per-channel price out of MENU_ITEM_PROPERTIES. The location-group axis cannot exist in a schema with one RESTAURANT row per database. source |
| extensibility-webhooks-push | unknown, grade F — placeholder rationale | resolve-to-no | The integration path is explicitly poll-based: ONLINE_ORDER carries LAST_SYNC_TIME and the OnlineOrderPlugin contract is loadTickets(PaginatedTableModel). The only HTTP server in the branch is a localhost Dejavoo payment-terminal proxy; no event publisher, subscription registry or signing secret exists. source |
| reliability-printer-fallback | unknown, grade F — placeholder rationale | resolve-to-no | printToKitchen() skips a ticket outright when its printer is null and otherwise calls printQuitely(), which swallows every exception into logger.error and returns — the PrinterAbortException branch is commented '//do nothing'. There is no backup printer, retry or alert; PRINTER_GROUP is routing, not failover, and the OROCUBE back-office guide describes it only as routing. source |
| menu-pricing-nested-modifiers | unknown, grade F - "No public documentation located during the 2026-08-01 research pass." | resolve-to-no | The placeholder marked a cell nobody had examined. The ORM mapping is exhaustive primary evidence: MenuItem -> MenuItemModifierGroup (MIN_QUANTITY/MAX_QUANTITY) -> ModifierGroup (REQUIRED) -> MenuModifier, and MenuModifier has a single many-to-one parent GROUP_ID with no collection of child groups, so a modifier cannot be modified and a third level is unreachable. Min/max and forced selection exist, but only at the one available level, and guide.orocube.com/floreant-pos-menu-programming/ documents nothing beyond 'Modifiers ... stay the same way under Modifier groups'. source |
| payments-gift-cards | unknown, grade F - "No public documentation located during the 2026-08-01 research pass." | resolve-to-no | The placeholder marked a cell nobody had examined. Floreant's only gift construct is a tender: GiftCertDialog collects a free-text certificate number and a typed face value, which SettleTicketProcessor writes onto a GiftCertificateTransaction row. There is no card master table, no lookup by card number and no balance field, so real-time balance tracking cannot exist, and RestaurantDAO hard-codes a single location. floreant.org/features lists 'Gift card' as PRO only and its linked guide covers ORO POS, a different paid product. source |
| inventory-recipe-bom-costing | unknown, grade F - "No public documentation located during the 2026-08-01 research pass." | resolve-to-partial | The placeholder marked a cell nobody had examined. The core 2.0 branch has no recipe entity at all - INVENTORY_ITEM carries purchase/average package price and no menu-item link. Recipes come only from the closed-source Inventory add-on, whose own feature enumeration describes a single-level ingredient-depletion link ('Recipe to deduct ingredient items when they are sold. It does not deduct fractional units') with no sub-recipes, no plate cost and no recalculation on ingredient cost change. Scored partial rather than no because the recipe construct itself is real and vendor-documented; the costing the claim is about is not. source |
| order-capture-split-merge | unknown, grade F - "No public documentation located during the 2026-08-01 research pass." | resolve-to-partial | The placeholder marked a cell nobody had examined. SplitTicketDialog is real: item-transfer splitting across up to four panes plus a split-by-seat button, permission-gated and logged as SPLIT_CHECK. But no even N-way or dollar/percent split mechanism exists, and merge is absent in every form — no action, dialog, permission or ActionHistory constant, and the sales-summary report's MergeChecks/MergeAmount fields are filled with a hard-coded blank. source |
| delivery-dispatch-board | unknown, grade F - "No public documentation located during the 2026-08-01 research pass." | resolve-to-no | The placeholder marked a cell nobody had examined. Positive absence: the product itself declares the dispatch extension points — getDeliveryDispatchView, openDeliveryDispatchDialog, getDriverView, assignDriver — and the bundled DefaultOrderServiceExtension implements them as `return null` and empty method bodies, so the Switchboard's assign-driver button and the login screen's DRIVER VIEW button do nothing in the open-source product. No dispatch screen, availability view, elapsed-time board or run batching exists in the branch, and OROCUBE's Cust plugin page enumerates its delivery features without a dispatch board. source |
| digital-first-party-web | unknown, grade F - "No public documentation located during the 2026-08-01 research pass." | resolve-to-no | The placeholder marked a cell nobody had examined. Floreant ships no ordering site: the only inbound-order surface is the abstract OnlineOrderPlugin/TicketImportPlugin contract that displays orders imported from an external system, the only HTTP server in the branch is a localhost Dejavoo payment-terminal proxy, and OROCUBE's add-on catalogue enumerates exactly three Floreant plugins with no web-ordering product among them. source |
| digital-menu-single-source | unknown, grade F - "No public documentation located during the 2026-08-01 research pass." | resolve-to-no | The placeholder marked a cell nobody had examined. With no first-party digital channel (digital-first-party-web is no), nothing consumes the POS menu record: the only menu-movement mechanism is the manual MenuJsonExport/Import file pair, and online orders arrive as TICKET_JSON blobs pre-built by the external system against its own menu copy. An item edit at the register propagates to no digital channel. source |
| hardware-kds | unknown, grade F - "No public documentation located during the 2026-08-01 research pass." | resolve-to-partial | The placeholder marked a cell nobody had examined. A first-party KDS exists and is stronger than the blank implied: launchable from the login screen, per-printer-group station routing, touch BUMP/VOID buttons, and a per-ticket elapsed timer with configurable yellow/red aging thresholds. Held at partial because bump-bar input does not exist (no key bindings; floreant.org/features puts 'KDS with bump bar' in the paid ORO POS column) and no course/fire construct appears anywhere in the branch. source |
Sources
Every URL this record cites. 37 in total.
- https://github.com/floreantpos/floreantpos
- https://floreant.org/
- https://github.com/floreantpos/floreantpos/blob/floreantpos-2.0/CHANGELOG.md
- https://floreant.org/download/
- not refetchable
- https://github.com/floreantpos/floreantpos/blob/floreantpos-2.0/src/com/floreantpos/model/MenuModifier.java
- https://github.com/floreantpos/floreantpos/blob/floreantpos-2.0/src/com/floreantpos/model/UserPermission.java
- https://github.com/floreantpos/floreantpos/blob/floreantpos-2.0/src/com/floreantpos/ui/dialog/VoidTicketDialog.java
- https://github.com/floreantpos/floreantpos/blob/floreantpos-2.0/src/com/floreantpos/report/ReceiptPrintService.java
- https://github.com/floreantpos/floreantpos/blob/floreantpos-2.0/src/com/floreantpos/report/SalesReport.java
- https://github.com/floreantpos/floreantpos/blob/floreantpos-2.0/src/com/floreantpos/demo/KitchenDisplayView.java
- https://github.com/floreantpos/floreantpos/blob/floreantpos-2.0/src/com/floreantpos/model/dao/RestaurantDAO.java
- https://github.com/floreantpos/floreantpos/blob/floreantpos-2.0/src/com/floreantpos/bo/actions/MenuJsonExportAction.java
- https://github.com/floreantpos/floreantpos/blob/floreantpos-2.0/src/com/floreantpos/model/MenuItem.hbm.xml
- https://github.com/floreantpos/floreantpos/blob/floreantpos-2.0/src/com/floreantpos/model/InventoryItem.hbm.xml
- https://github.com/floreantpos/floreantpos/blob/floreantpos-2.0/src/com/floreantpos/model/InventoryTransactionType.java
- https://github.com/floreantpos/floreantpos/blob/floreantpos-2.0/src/com/floreantpos/model/DeliveryCharge.hbm.xml
- https://github.com/floreantpos/floreantpos/blob/floreantpos-2.0/src/com/floreantpos/model/Customer.hbm.xml
- https://github.com/floreantpos/floreantpos/blob/floreantpos-2.0/src/com/floreantpos/model/dao/CustomerDAO.java
- https://github.com/floreantpos/floreantpos/blob/floreantpos-2.0/src/com/floreantpos/ui/forms/CustomerForm.java
- https://github.com/floreantpos/floreantpos/blob/floreantpos-2.0/src/com/floreantpos/model/OnlineOrder.hbm.xml
- https://github.com/floreantpos/floreantpos/blob/floreantpos-2.0/src/com/floreantpos/ui/views/order/DefaultOrderServiceExtension.java
- http://floreant.org/features/
- http://floreant.org/support/features/
- https://guide.orocube.com/floreant-pos-user-permissions/
- https://guide.orocube.com/floreant-pos-back-office/
- https://guide.orocube.com/floreant-pos-menu-programming/
- https://pos.orocube.com/
- https://pos.orocube.com/product/custfloreant-pos/
- https://pos.orocube.com/product/inventoryfloreant-pos/
- https://github.com/floreantpos/floreantpos/wiki
- https://github.com/floreantpos/floreantpos/blob/floreantpos-2.0/src/com/floreantpos/model/MenuItemModifierGroup.hbm.xml
- https://github.com/floreantpos/floreantpos/blob/floreantpos-2.0/src/com/floreantpos/ui/views/payment/GiftCertDialog.java
- https://guide.orocube.com/generating-activating-gift-card/
- https://github.com/floreantpos/floreantpos/blob/floreantpos-2.0/src/com/floreantpos/ui/views/SplitTicketDialog.java
- https://github.com/floreantpos/floreantpos/blob/floreantpos-2.0/src/com/floreantpos/extension/OnlineOrderPlugin.java
- https://github.com/floreantpos/floreantpos/blob/floreantpos-2.0/src/com/floreantpos/demo/KitchenTicketView.java