Wiki ๐Ÿ” Search

QIIUB โ€” Glossary of Terms

Purpose: Quick reference for technical terms used across QIIUB documentation. Aimed at business stakeholders, new team members, and AI assistants.

Organization: Alphabetical. Terms are grouped into categories for browsing, but the master list is flat A-Z.

Last Updated: 2026-04-29


A

a11y โ€” Numeronym for "accessibility" (a + 11 letters + y). Refers to making software usable by people with disabilities โ€” screen readers, keyboard navigation, color contrast, etc. QIIUB targets WCAG 2.1 AA compliance.

ADR (Architecture Decision Record) โ€” A short document that captures a significant technical decision, the alternatives considered, and why the chosen approach won. QIIUB has 65 ADRs in docs/adr/. Once written, ADRs are not edited โ€” new decisions supersede old ones.

Activation gate (product) โ€” Server-side validator that runs on every Draft โ†’ Active and Inactive โ†’ Active transition for a Product. Checks seven requirements (Name, at least one variant, variant SKU-or-barcode, priced LocationProduct, SellingUoM, TaxGroup, primary CategoryId). Returns 400 with a MissingFields[] array of failing requirement codes when any check fails. The same array is exposed on GET /products/{id} for Drafts and Inactive so the UI can render "X fields needed to activate" without a round-trip. See schema-product-status-lifecycle ยง4 and ADR-0065.

AMQP (Advanced Message Queuing Protocol) โ€” A messaging protocol used by Azure IoT Hub for persistent device connections. The POS terminal maintains an always-on AMQP connection to receive commands from the cloud.

Append-only ledger โ€” A data pattern where records are only added, never modified or deleted. Used for financial data (gift card activity, loyalty transactions, AR ledger) to ensure a complete audit trail. If a correction is needed, a new offsetting entry is added.

AR (Accounts Receivable) โ€” Money owed to a merchant by customers who purchased on credit ("charge accounts"). The system tracks charges, payments, statements, and finance charges.

Aspire โ€” Microsoft's .NET orchestration tool for local development. Starts all services (API, database, Redis) with one command. Used only during development โ€” not deployed to production.

Assembly (Assembly Item) โ€” A bundle of existing inventory items sold under a separate lookup code. When the assembly is sold, the component quantities decrement, not the assembly itself (assembly has no inventory of its own). Components can be modified at POS (qty, price, removed). The UseComponentPrice flag enables overriding component prices within the assembly (typically discounts when bought as a bundle). RMS/RMH: ItemClass(ClassType=1) + ItemClassComponent. QIIUB (planned): Product.BundleType=Assembly + KitComponent rows. Distinct from Kit (which has own inventory).

B

Barcode (Product Barcode) โ€” A machine-readable representation of a product identifier. QIIUB stores barcodes in two places: ProductVariant.Barcode (primary, inline for performance) and ProductBarcode table (additional aliases, N per variant). The barcode type (UPC-A, EAN-13, etc.) is never stored โ€” it is always calculated from the value by BarcodeHelper.DetectType().

BarcodeHelper โ€” Static class in QIIUB.Domain.Common exposing pure functions for barcode operations. DetectType(string) โ†’ BarcodeType identifies the format from the value alone (UPC-A, EAN-13, EAN-8, ISBN, PLU, Internal via GS1 prefix 2/20-29, or Custom). IsValidCheckDigit(string) validates the Modulo 10 check digit for UPC/EAN/ISBN. No DB access, no state. Single source of truth used by validators, UI badges, and label printing. Enables QIIUB's decision to compute barcode type rather than store it.

Breakout (kit operation) โ€” The action of disassembling N kits back into their component items. Increments each component's on-hand quantity by quantity ร— N and decrements the kit's on-hand by N. Opposite of Build. Only applies to Kit items.

Build (kit operation) โ€” The action of assembling N kits from their components. Decrements each component's on-hand quantity by quantity ร— N and increments the kit's on-hand by N. Opposite of Breakout. Only applies to Kit items โ€” Assembly, Matrix, and Lot Matrix do not support Build/Break.

BundleType โ€” Planned QIIUB enum on Product to distinguish item structure: None (standard single-variant item), Kit, Assembly, Matrix, LotMatrix. Replaces the current IsKit bool. Each value has distinct inventory, pricing, and POS behavior โ€” see the glossary entry for each type.

busy_timeout โ€” A SQLite PRAGMA that tells the database to wait (up to N milliseconds) when another process holds the write lock, instead of failing immediately. Set to 5000ms (5 seconds) on all QIIUB terminals.

C

C2D (Cloud-to-Device) โ€” A message sent from the cloud to a specific POS terminal via Azure IoT Hub. Used to notify terminals of urgent events (e.g., "a return was processed at another terminal โ€” pull the update now").

Cert (Tax Exemption / Resale Certificate) โ€” Government-issued credential that authorizes a customer to be exempt from tax (full exempt) or to receive a reduced B2B rate (e.g., PR Hacienda Certificado de Comerciante Revendedor SC 2914 or Revendedor Elegible SC 2916). Stored on Customer.CertNumber / CertIssuedDate / CertExpiryDate. The tax engine validates expiry against NowUtc.Date and snapshot-stamps the cert onto Sale.CustomerCertNumber / CustomerCertExpiryDate at sale time so the audit row remains stable if the cert is later revoked. See ADR-0063.

Check Digit โ€” The last digit of a UPC/EAN barcode, calculated using the GS1 Modulo 10 algorithm. Detects transcription errors: if any digit is mistyped, the check digit won't match. QIIUB validates check digits as a warning (not blocking) when the barcode is manually entered.

Clean Architecture โ€” A software design pattern that separates code into layers (Domain, Application, Infrastructure, API) with dependencies pointing inward. Business logic never depends on database or framework details.

CommissionMode โ€” QIIUB enum on Product replacing the legacy CommissionType (string). Values: None(0), PercentOfSale(1), PercentOfProfit(2), FixedAmount(3). Paired with Product.CommissionValue (decimal?) which is interpreted according to the Mode. Snapshot is captured at sale time on SaleLineItem.CommissionPercent + CommissionAmount. Product-level config overrides Employee.DefaultCommissionPercent when set.

Compounding (Tax Compounding) โ€” When a tax rate is applied on top of another tax, not just the line price. QIIUB models this as TaxRate.IsCompounding (bool): when true, the rate's taxable base is the line extended price plus the sum of every prior non-compounding rate's amount within the same group, ordered by junction Priority. RMS/RMH equivalent: Tax.IncludePreviousTax. See ADR-0063 and tax-engine.md.

Computed column (SQL Server) โ€” A column whose value is derived from an expression over other columns, optionally PERSISTED (physically stored and updated on insert/update). QIIUB uses persisted computed columns over JSON_VALUE expressions to make JSON fields indexable at wide-table-equivalent speeds. Example: CustomField_ExpirationDate AS CAST(JSON_VALUE(CustomFields, '$.expiration_date') AS date) PERSISTED. SQLite equivalent: generated column.

CustomFieldDefinition โ€” Merchant-DB table describing the custom fields a specific merchant has defined for a given entity type (Product, Customer, Sale, Employee). Holds FieldKey, FieldName, DataType, IsRequired, IsSearchable, Options (for select type), DefaultValue, Module (module gate), and SortOrder. When IsSearchable=true, the system generates a persisted computed column + index on the entity's CustomFields JSON column so searches perform at indexed-column speed. See docs/design/config-extensibility.md ยง4.

CustomerTaxProfile โ€” Named B2B tax classification on a customer (e.g., "Reseller PR SC 2914", "Mendez Wholesale"). Holds Name, Description, RequiresCert, IsActive. The profile owns a set of CustomerTaxProfileMap rules that conditionally remap a sale line's TaxGroup at calculation time. See ADR-0063.

CustomerTaxProfileMap โ€” One mapping rule on a CustomerTaxProfile. Format: "when an item resolves to FromTaxGroupId, charge the customer at ToTaxGroupId's rates instead." FromTaxGroupId IS NULL makes the rule a catch-all (only one allowed per profile). Specific matches win over catch-all. Update is full-set replacement โ€” no partial PATCH.

CustomFields (JSON column) โ€” nvarchar(max) column on Product, Customer, etc. storing merchant-defined extensions as a JSON object keyed by the FieldKey from CustomFieldDefinition. Default '{}'. CHECK (ISJSON(CustomFields) = 1) on SQL Server / CHECK (json_valid(CustomFields)) on SQLite. Inline with the entity row so reads and sync payloads stay single-hop. Replaces the legacy wide-table CustomField1/2/3 approach. Migration path: nvarchar(max) today (compatible SQL 2022 + Azure SQL + SQLite) โ†’ native json type when SQL Server 2025 / Azure SQL DB are the standard everywhere.

Composite FK (Composite Foreign Key) โ€” A foreign key that includes MerchantId alongside the referenced entity's ID (e.g., MerchantId + ProductId). Prevents data from one merchant accidentally referencing data from another merchant.

CORS (Cross-Origin Resource Sharing) โ€” A browser security mechanism that controls which websites can call the QIIUB API. Prevents unauthorized websites from making API requests on behalf of a logged-in user.

CQRS (Command Query Responsibility Segregation) โ€” A pattern that separates read operations (queries) from write operations (commands). QIIUB uses a lightweight version: different code paths for reading vs. writing, but the same database.

CSP (Content Security Policy) โ€” A browser security header that restricts what resources (scripts, styles, images) a web page can load. Prevents attackers from injecting malicious scripts.

D

Draft (product) โ€” Initial lifecycle state for a Product (ProductStatus = 0). The row exists, has been entered into the catalog, but is not yet sellable โ€” pricing, tax group, primary category, or other fields may still be missing. Drafts are not synced to POS terminals and are not referenceable by sales. They are referenceable by purchase orders, receipts, mobile receiving, and barcode duplicate checks (so a Draft's barcode collides with a new product's barcode at create time). Promotion to Active goes through POST /products/{id}/activate and runs the activation gate. See schema-product-status-lifecycle and ADR-0065.

D2C (Device-to-Cloud) โ€” A message sent from a POS terminal to the cloud via Azure IoT Hub. Used for telemetry (device health, sync status) and event notifications.

Dapper โ€” A lightweight .NET library for running raw SQL queries. Used for performance-critical operations (sync engine, bulk reads, dashboards) where EF Core's overhead is unnecessary. ~8% of QIIUB's data access.

Device Twin โ€” An Azure IoT Hub feature: a JSON document that stores device configuration and status. The cloud writes "desired" properties (e.g., sync interval), the device reports "actual" properties (e.g., database size, last sync time). Changes sync automatically.

DPAPI (Data Protection API) โ€” A Windows encryption system used to securely store credentials on POS terminals. The IoT Hub connection string is encrypted with DPAPI so only the local machine can decrypt it.

DTO (Data Transfer Object) โ€” A simple data class used to pass information between layers (e.g., API response shapes). Contains no business logic โ€” just data fields.

E

EBT (Electronic Benefit Transfer) โ€” US federal electronic payment mechanism that replaced paper food stamps in the early 2000s. EBT cards carry SNAP benefits (federal), and in Puerto Rico the equivalent program is PAN (Programa de Asistencia Nutricional) โ€” also delivered via EBT-compatible cards. Modern POS systems (Square, Clover, Lightspeed, NetSuite) converge on the term "EBT" for the eligibility flag, replacing legacy "Food Stamps" terminology. In QIIUB, Product.IsEbtEligible (bool) marks items that can be paid with EBT; the POS uses this to split tender between the EBT card (eligible items only) and other payment methods. Future siblings if expansion requires: IsWicEligible, IsHsaEligible, IsFsaEligible.

Exempt (TaxClassification) โ€” One of the four states stamped on SaleLineItem.TaxClassification. The line resolves to a TaxGroup with no rates โ€” the product is intrinsically not taxable (medicines Rx, gift cards, services). No SaleTax rows emitted. Distinguished from Waived, where the group did have rates that were forced to zero. Every new merchant is auto-seeded with one such group named "Non-Taxable" (see ADR-0063 ยง9). The merchant can rename, delete (when not in use), or create additional empty-rates groups (e.g., "Exempt โ€” Rx"). See TaxClassification and tax-engine.md.

EAN-13 (European Article Number) โ€” A 13-digit numeric barcode standard used internationally. The last digit is a Modulo 10 check digit. Compatible with UPC-A (a UPC-A is an EAN-13 with a leading zero). Prefixes 20-29 are reserved by GS1 for in-store use.

EAN-8 โ€” A compact 8-digit version of EAN-13 for small products. Uses the same Modulo 10 check digit algorithm.

EF Core (Entity Framework Core) โ€” Microsoft's ORM (Object-Relational Mapper) for .NET. Translates C# code into SQL queries. QIIUB uses it for ~90% of data access โ€” CRUD operations, filtered queries, migrations.

Entra ID (Microsoft Entra ID) โ€” Microsoft's identity platform (formerly Azure Active Directory). SystemAdmin users authenticate via Office 365 / Entra ID. Partner and merchant auth providers are TBD.

F

FastEndpoints โ€” A .NET library that replaces traditional MVC controllers with the REPR pattern: one class per endpoint, each with its own request/response types and validation. QIIUB has 270 endpoints built this way.

Feature flag โ€” A configuration toggle that enables or disables a feature without deploying new code. Used to roll out features gradually or disable broken features in production.

FluentValidation โ€” A .NET library for input validation. Every QIIUB endpoint validates incoming data (required fields, max lengths, format) before processing it.

FTS5 (Full-Text Search 5) โ€” A SQLite extension that creates fast searchable indexes on text columns. Enables sub-millisecond product name searches across 200K+ products at the POS register.

G

Generated column (SQLite) โ€” SQLite's equivalent of SQL Server's computed column. Supported since SQLite 3.31 (2020) in STORED (materialized) and VIRTUAL (computed on read) flavors. Can be indexed. QIIUB uses STORED generated columns over json_extract expressions to index JSON fields on POS terminals: ALTER TABLE Product ADD CustomField_ExpirationDate AS (json_extract(CustomFields, '$.expiration_date')) STORED. When a merchant marks a CustomFieldDefinition as IsSearchable=true, posupdate.exe applies the matching ALTER TABLE + CREATE INDEX on each terminal. See also: Computed column (SQL Server).

GS1 (Global Standards One) โ€” The international non-profit organization that administers barcode standards (UPC, EAN, GTIN) worldwide. Founded in 2005 from the merger of EAN International and UCC. Operates in ~115 countries. GS1 assigns number prefixes to countries and reserves prefix "2" (UPC-A) / "20-29" (EAN-13) for in-store use by retailers.

GTIN (Global Trade Item Number) โ€” GS1's umbrella term for product identification numbers. Encompasses UPC-A (12 digits), EAN-13 (13 digits), and EAN-8 (8 digits). Every UPC is a GTIN, but not every GTIN is a UPC.

GlobalId โ€” A UUID (universally unique identifier) assigned to every entity. Unlike the auto-increment Id (which is database-specific), GlobalId is unique across all databases and devices. Used for sync identity โ€” when two terminals create records offline, their GlobalIds will never collide.

Global Query Filter โ€” An EF Core feature that automatically adds a WHERE clause to every query (e.g., WHERE MerchantId = @current AND IsDeleted = 0). Defense-in-depth โ€” even if code forgets the filter, EF Core applies it.

H

HSM (Hardware Security Module) โ€” A dedicated physical device that stores encryption keys and performs cryptographic operations. Payment processors use HSMs to decrypt card data received from P2PE terminals. QIIUB never interacts with an HSM directly โ€” the processor's HSM is the only place where card data is decrypted.

HybridCache โ€” A .NET caching library that combines in-memory cache (fast, local) with Redis (shared across servers). Used for data that rarely changes but is read constantly โ€” tax rates, payment methods, merchant settings.

I

i18n (Internationalization) โ€” Numeronym for "internationalization" (i + 18 letters + n). The practice of designing software to support multiple languages. The admin portal supports English and Spanish via react-i18next.

IFPS (International Federation for Produce Standards) โ€” The organization that administers PLU codes for fruits and vegetables worldwide. Maintains the global registry of 4-5 digit codes (e.g., 4011 = banana).

ISBN (International Standard Book Number) โ€” A 13-digit identifier for books. Uses EAN-13 format with prefix 978 or 979. Check digit is Modulo 10. QIIUB auto-detects ISBN when a 13-digit barcode starts with 978 or 979.

IndustryTemplate โ€” A QIIUB enum that identifies what type of business a merchant operates: Shop (retail), Pharmacy (Rx), or Hardware (Build). Determines which modules are pre-activated when a merchant is created.

ItemClass โ€” RMS/RMH table that groups Matrix, Assembly, and Lot Matrix items under one parent structure, distinguished by ClassType (0=Matrix, 1=Assembly, 2=Lot Matrix). Stores master properties (Description, Price, Cost, Department, Title1/2/3 for dimensions) shared across components. Components live in ItemClassComponent. Kits are not part of ItemClass โ€” they use a separate Kit table. In QIIUB, the three ItemClass types are modeled using existing entities (Product, ProductVariant, ProductOption, KitComponent) differentiated by BundleType.

IoT Hub (Azure IoT Hub) โ€” Microsoft's cloud service for managing connected devices. QIIUB uses it for POS terminal management: device registration, configuration (via device twins), command delivery (C2D), telemetry collection (D2C), and connection monitoring. Costs ~$25-46/month for thousands of devices.

Invitation โ€” A single-use, 7-day token sent by email to onboard a new user into QIIUB. Created by a SystemAdmin or PartnerAdmin. When the recipient accepts, they link their Microsoft, Google, or magic link account โ€” no password is created. The invitation specifies the target role and partner/merchant.

J

JSON_VALUE (SQL Server) โ€” Built-in SQL Server function that extracts a scalar value from a JSON string via a JSONPath expression. Example: JSON_VALUE(CustomFields, '$.expiration_date'). Fast (~1-2 ยตs per call) and indexable when wrapped in a persisted computed column. SQLite equivalent: json_extract. QIIUB's query-building layer handles the provider-specific function name so domain code stays consistent.

json_extract (SQLite) โ€” SQLite's equivalent of SQL Server's JSON_VALUE. Built-in since SQLite 3.38 (2022) โ€” no extension required. Same JSONPath expression syntax ($.expiration_date). Used inside STORED generated columns on POS terminals to index custom field lookups. See also: JSON_VALUE (SQL Server), Generated column (SQLite).

JWT (JSON Web Token) โ€” A digitally signed token that proves a user's identity. After login, the API issues a JWT containing the user's role and MerchantId. The admin portal stores it in memory only (never localStorage) for security. Expires after 30 minutes; a refresh token extends the session.

K

Kit (Kit Item) โ€” An item that contains other items bundled into one package, sold under a separate lookup code. Unlike Assembly, a Kit has its own inventory โ€” when sold or returned, only the kit quantity changes, not the components. Components are only decremented when the kit is built (Build operation) and incremented when broken out (Breakout). Cannot be modified at POS. Price is fixed on the item itself (no UseComponentPrice). RMS/RMH: Item.ItemType=3 + Kit table. QIIUB (planned): Product.BundleType=Kit + ProductVariant (with its own inventory) + KitComponent rows.

KitComponent โ€” QIIUB entity storing component lines inside a Kit or (planned) Assembly. Each row links a parent Product to a component ProductVariant with a quantity and sort order. Planned addition: optional ComponentPrice (decimal?) to support Assembly's UseComponentPrice override. The same table serves both bundle types โ€” Product.BundleType distinguishes behavior.

L

Lot Matrix (Lot Matrix Item) โ€” An item packaged in different pre-determined lots or quantities, sold under the same master lookup code. Example: soda available as 1-pack, 6-pack, 12-pack, or 24-pack โ€” all share the same UPC. When the cashier scans the master barcode, POS displays a selector to pick the specific lot; each lot has its own price and inventory. RMS/RMH: ItemClass(ClassType=2) + ItemClassComponent. QIIUB (planned): Product.BundleType=LotMatrix + N ProductVariant rows (one per package size) + PromptVariantAtPos flag that triggers the picker.

Lucide โ€” An open-source icon library used in the admin portal. All icons use stroke style (outlines), never fill (solid).

M

Magic Link โ€” A passwordless login method. The user enters their email, receives a link with a cryptographic token (valid for 15 minutes, single-use), and clicks it to log in. Used for users who don't have a Microsoft or Google account linked. Rate limited to 5 per email per hour.

Matrix (Matrix Item) โ€” An item sold in multiple variations across 1โ€“3 dimensions (e.g., T-shirt in Size ร— Color ร— Style). Each dimension combination is a distinct component item with its own lookup code, barcode, price, cost, and inventory. RMS/RMH: ItemClass(ClassType=0) + ItemClassComponent + MatrixAttributeDisplayOrder (per-matrix attribute codes and display order) + optional Dimension/DimensionAttribute template libraries. QIIUB: Product.BundleType=Matrix + ProductOption (dimension axis) + ProductOptionValue (attribute value) + N ProductVariant rows (one per combination) + ProductVariantOptionValue (linkage).

Modulo 10 (Mod 10) โ€” The GS1 check digit algorithm for UPC/EAN barcodes. Alternates weights of 1 and 3 across digits (from right), sums them, and computes (10 - sum % 10) % 10. Detects single-digit transcription errors and most transposition errors.

Mapped (TaxClassification) โ€” One of the four states stamped on SaleLineItem.TaxClassification. A CustomerTaxProfile mapping substituted the line's TaxGroup with a different one (B2B conditional pricing โ€” e.g., a reseller cert SC 2914 redirecting from "Standard 11.5%" to "Resale 1%"). SaleTax rows reflect the mapped group's rates. See TaxClassification and tax-engine.md.

MerchantGroup โ€” A Central DB entity that links merchants owned by the same business owner. Enables shared loyalty programs and gift cards across stores. Example: "Farmacias Aliadas" groups 5 pharmacy locations so a customer can earn points at any of them.

MerchantId โ€” The primary filter on every query in every QIIUB database table. Ensures data from one merchant is never accidentally shown to or mixed with another merchant's data. Always the FIRST condition in every WHERE clause.

MessagePack โ€” A binary serialization format (~2-5x smaller than JSON). Used for sync payloads between POS terminals and the cloud API to reduce bandwidth and speed up sync.

mmap (Memory-Mapped I/O) โ€” A technique where the operating system maps the database file directly into memory, allowing SQLite to read data without explicit file system calls. Configured to 256 MB on QIIUB terminals for faster product catalog reads.

ModuleDefinition โ€” A Central DB entity representing a feature that can be activated per merchant. QIIUB has 26 modules (20 Core + 6 Vertical). All are included โ€” no per-module licensing.

MQTT (Message Queuing Telemetry Transport) โ€” A lightweight messaging protocol, alternative to AMQP. Supported by IoT Hub for devices with limited resources.

Multi-tenancy โ€” An architecture where one system serves multiple independent businesses (tenants/merchants), each seeing only their own data. QIIUB uses a dual-database strategy: one Central DB for platform management, separate Merchant DBs for operational data.

N

NFC (Near Field Communication) โ€” Short-range wireless technology used for contactless payments. When a customer taps their phone, watch, or contactless card on the payment terminal, NFC transmits the payment data. Apple Pay, Google Pay, and Samsung Pay all use NFC โ€” to the terminal they are identical. The terminal reports the entry method as "contactless/tap" regardless of the device.

O

OAuth 2.0 โ€” An industry-standard protocol for authorization. When a user clicks "Sign in with Microsoft" or "Sign in with Google", OAuth 2.0 is the protocol that securely redirects the user to Microsoft/Google, verifies their identity, and sends proof back to QIIUB โ€” all without QIIUB ever seeing the user's Microsoft/Google password.

Offline-first โ€” A design philosophy where the POS terminal works fully without internet. All sales, lookups, and operations use the local SQLite database. The sync engine reconciles with the cloud when connectivity is available, but the terminal never blocks on a network call during a sale.

OnlineDescription โ€” Field on ProductWebListing holding the product description used on web channels (Qiiub storefront, Shopify, BigCommerce). Separate from Product.Description (the POS/admin description) because web copy often needs richer formatting, SEO language, or different emphasis. nvarchar(max), nullable โ€” if null, the consumer falls back to Product.Description.

OpenTelemetry โ€” An open standard for collecting performance data (traces, metrics, logs) from applications. QIIUB uses it alongside Serilog for observability.

P

P2PE (Point-to-Point Encryption) โ€” A payment security standard where card data is encrypted the instant a card touches the payment terminal and stays encrypted until it reaches the processor's secure hardware (HSM). The POS software and QIIUB cloud never see the actual card number โ€” only a transaction reference, last 4 digits, and approval code. This dramatically simplifies PCI compliance.

PCI DSS (Payment Card Industry Data Security Standard) โ€” The security standard that every business accepting credit/debit cards must comply with. Defines how card data must be protected. QIIUB avoids most PCI requirements by using P2PE terminals โ€” card data never enters QIIUB systems.

PIN Encryption โ€” AES-256-GCM deterministic encryption of employee PINs on the cloud side. Nonce is derived from plaintext via HMAC-SHA256 so the same PIN always produces the same ciphertext, enabling unique-index collision detection. Key lives in Azure Key Vault. Separate from PinHash (PBKDF2) which is used for offline login at POS terminals. See ADR-0045.

PKCE (Proof Key for Code Exchange) โ€” A security extension to OAuth 2.0 (pronounced "pixy"). Prevents attackers from intercepting the authorization code during the redirect flow. QIIUB uses PKCE for all Microsoft and Google sign-ins. Without PKCE, a malicious app on the same device could steal the authorization code and impersonate the user.

Photo Punch (Selfie Punch) โ€” A selfie taken by the POS front camera at clock-in and clock-out, stored in Azure Blob Storage to prevent buddy-punching (one employee clocking in for another). Industry standard across Square, Toast, Homebase, Deputy; cheaper and less invasive than biometric hardware. Per-merchant enforcement via MerchantSetting key timeclock.photo_mode (Off / Required / RequiredWithOverride). See ADR-0041.

PLU (Price Look-Up Code) โ€” A 4-5 digit numeric code for identifying fresh produce (fruits, vegetables). Standardized by IFPS. Examples: 4011 = banana, 4065 = green pepper. PLU codes do not use check digits. In QIIUB, auto-detected when a barcode is 4-5 numeric digits.

Polly โ€” A .NET resilience library that handles retries, circuit breakers, and timeouts. All POS direct API calls use Polly with 2-3 second timeouts so a slow network never blocks the cashier.

PO (Purchase Order) โ€” A document sent to a supplier to order inventory. The system tracks the full lifecycle: PO creation โ†’ receiving โ†’ distribution to locations.

possync.exe โ€” The background Windows service on each POS terminal that handles all data sync with the cloud. Reads pending transactions from SQLite and uploads them; downloads catalog updates from the cloud. The ONLY process that communicates with the cloud for bulk data.

posupdate.exe โ€” The update utility on each POS terminal that handles software updates and SQLite schema migrations (adding columns, creating indexes). Must run when the POS app and possync.exe are idle.

PRAGMA โ€” A SQLite-specific configuration command (not standard SQL). Controls database behavior like journaling mode, cache size, and timeouts. Some PRAGMAs are persistent (set once), others must be set on every connection.

Prefix 2 (GS1 In-Store) โ€” GS1 reserves the first digit "2" in UPC-A (and prefixes 20-29 in EAN-13) for barcodes created by the retailer, not by a manufacturer. These codes are not globally unique โ€” two stores can use the same prefix-2 barcode for different products. Commonly used for variable-weight items (deli, produce, meat) where the barcode encodes the price or weight. QIIUB auto-detects prefix-2 barcodes and skips check digit validation.

ProductBarcode โ€” The QIIUB equivalent of RMH's Alias table. Stores additional barcodes (aliases) for a product variant beyond the primary barcode stored inline in ProductVariant.Barcode. Supports N barcodes per variant with a unique index per merchant. Related: see ADR-0019.

ProductCategory โ€” Junction table enabling N:M assignment between Product and Category. A product's primary category lives on Product.CategoryId (used by reports and DailySales); the full category list lives in ProductCategory, including the primary. Matches BigCommerce / Shopify "categories array" semantics. Server-side only โ€” not synced to offline POS (the POS displays the primary). Related: see ADR-0044.

ProductOption โ€” QIIUB entity representing a dimension axis of a Matrix product (e.g., "Size", "Color", "Style"). Each Product can have up to 3 options (mirroring RMS/RMH's ItemClass.Title1/2/3). Each option has N ProductOptionValue entries. Only applies when Product.BundleType=Matrix.

ProductOptionValue โ€” QIIUB entity representing a value within a ProductOption (e.g., "Small", "Red", "V-Neck"). Has Value (display text) and SortOrder (display order). Equivalent to the per-matrix row in RMS/RMH MatrixAttributeDisplayOrder. Linked to the specific ProductVariant it belongs to via ProductVariantOptionValue.

ProductSaleWindow โ€” QIIUB entity (1:N from Product) defining when a product can or cannot be sold. Each row has WindowType (Available = sellable only within this window, Blocked = unsellable during this window), absolute StartUtc/EndUtc bounds, and recurring DaysOfWeek (bitmask) + TimeStart/TimeEnd for schedule-based blocks. Use cases: pre-order release dates, seasonal items, discontinuation, alcohol sales hours (required in PR supermarkets), Rx controlled substance hours, product recalls. Replaces RMH's Item.BlockSalesType/BlockSalesBeforeDate/BlockSalesAfterDate/BlockSalesScheduleID + Schedule/ScheduleSegment with a flatter, more flexible model (a product can have multiple windows simultaneously; RMH was limited to one schedule).

ProductStatus โ€” Enum on Product with three values (Draft, Active, Inactive) replacing the legacy IsActive boolean. Stored as tinyint NOT NULL, no ref lookup table. Drafts are pre-sale fixtures (referenceable by PO/Receipt only); Active is the healthy selling state; Inactive is a discontinued tombstone (still referenceable for returns of past sales). State transitions go through POST /products/{id}/activate (gate-validated) and POST /products/{id}/deactivate โ€” PUT /products/{id} never mutates Status. See schema-product-status-lifecycle and ADR-0065.

ProductVariant โ€” The sellable unit of a Product. Carries SKU, barcode, price, cost, weight, and per-location inventory (via LocationProduct). Every product has at least one variant (the default). Matrix and Lot Matrix products have N variants โ€” one per dimension combination or package size. Kit and Assembly products have a single default variant (inventory lives on the variant for Kit; is computed from components for Assembly). See ADR-0019.

ProductWebListing โ€” QIIUB entity (1:0..1 from Product) representing a product's presence on a web channel. Existence of a row implies the product is published online. Holds Slug, OnlineDescription, Platform enum (Qiiub for QIIUB's built-in storefront, Shopify, BigCommerce, WooCommerce), optional ExternalProductId + SyncStatus + LastSyncedUtc + LastSyncError + Metafields (JSON, platform-specific) for external integrations. Toggling offline = deleting the row (no row-churn on Product master from sync activity). Unique index on (MerchantId, ProductId) โ€” one listing per product at a time, matching the single-channel reality of QIIUB merchants (not multi-channel Shopify-scale).

Primary category โ€” In QIIUB's multi-category model, a product has one "home" category stored on Product.CategoryId. Used for reporting aggregates (DailySales by category) to avoid double-counting. All other assignments are additional, stored in the ProductCategory junction. Admin UI shows primary with a badge; the remove-category endpoint blocks deletion of the primary. See ADR-0044.

PublicId โ€” An 8-character hexadecimal identifier used in API URLs instead of the internal database ID. Prevents exposing sequential IDs that could be guessed. Example: /merchants/A3F2B1C0 instead of /merchants/42.

R

Redis โ€” An in-memory data store used as a shared cache. QIIUB uses it via HybridCache for data that multiple API servers need to share (merchant settings, tax rates).

REPR (Request-Endpoint-Response) โ€” The pattern used by FastEndpoints: each API endpoint is a single class with its own Request type, processing logic, and Response type. Replaces the traditional "one controller with many methods" approach.

RLS (Row-Level Security) โ€” A SQL Server feature that automatically filters query results by MerchantId at the database level. Even if application code has a bug that forgets the merchant filter, RLS prevents cross-merchant data leaks. Used as defense-in-depth alongside application-level filters.

RMH (Retail Management Hero) โ€” The existing POS system built by BCPOS. QIIUB is its successor. RMH databases are used as domain reference only โ€” QIIUB does not import from or depend on RMH at runtime.

S

SAF (Store-and-Forward) โ€” A legacy POS practice where card payments are accepted offline and submitted to the processor when connectivity returns. QIIUB does not support SAF. If a terminal has no internet, card payments are blocked โ€” only cash, check, and charge accounts (AR) are accepted. Reason: if an offline card transaction is later declined (stolen card, no funds), the merchant bears 100% of the loss with no recourse. Most modern platforms (Square, Shopify POS, Clover) have eliminated SAF for this reason.

SAQ (Self-Assessment Questionnaire) โ€” The annual PCI compliance form. The version required depends on how you handle card data. With P2PE terminals (card data never enters QIIUB), the simple SAQ P2PE (30 questions) applies. Without P2PE, SAQ D (300+ questions) would be required โ€” a massive compliance burden.

SAS (Shared Access Signature) โ€” A token-based authentication mechanism used by Azure IoT Hub. POS terminals generate short-lived SAS tokens from their device key to authenticate connections.

Scalar โ€” A modern API documentation tool (replaces Swagger UI). Generates interactive documentation from QIIUB's endpoint definitions so developers can explore and test the API.

Sentry โ€” A cloud service for error tracking and performance monitoring. When the API or admin portal encounters an error, Sentry captures the full context (stack trace, user, request) for debugging.

Serilog โ€” A .NET structured logging library. All QIIUB logs use structured format (Processing {OrderId} for {MerchantId}) instead of string concatenation, enabling fast search and filtering.

SKU (Stock Keeping Unit) โ€” A merchant's internal code for identifying a product. Not a global standard โ€” each merchant defines their own. In QIIUB: ProductVariant.Sku (varchar 50, unique per merchant). Separate from Barcode, which is the scannable UPC/EAN code. Merchants who don't maintain their own SKUs can use catalog.barcode.policy = barcode_as_sku to auto-fill SKU from the barcode value.

Slug โ€” URL-friendly handle used on web channels (Qiiub storefront, Shopify, BigCommerce). Lowercase letters, digits, and hyphens only โ€” no spaces, accents, or special characters. Example: tylenol-500mg-100ct โ†’ https://tienda.farmacia.com/products/tylenol-500mg-100ct. Shopify calls this handle, BigCommerce calls it URL path, but the concept is identical. Stored on ProductWebListing.Slug, unique per merchant. Critical for SEO and shareability.

Soft delete โ€” Instead of permanently deleting a record, the IsDeleted flag is set to true. The record is hidden from queries but still exists in the database. Required for offline sync โ€” a terminal that hasn't synced yet might still reference the "deleted" record.

SQLite โ€” A lightweight, embedded database engine. Each QIIUB POS terminal runs a local SQLite database for offline operation. Single file, zero installation, zero administration. See ADR-0039.

T

TagAlong (Tag-along Item) โ€” A product automatically added to a sale when a specific parent product is sold. Configured per-product via Product.TagAlongProductId + Product.TagAlongQuantity (both nullable). Used for per-item fees and linked items: bottle deposits ($0.10 per soda can), recycling/disposal fees (tires, paint), and forced accessories. QIIUB improves on RMS/RMH's original design by adding an audit trail (SaleLineItem.TagAlongFromLineId links the auto-added line to its parent) and reversibility (if the parent line is removed or returned, POS prompts to remove the tag-along line too). Does NOT handle bag fees โ€” those are per-sale, not per-item, and use a separate checkout feature. Silent auto-add (no cashier prompt) is intentional for RMS parity. Name retained from RMS/RMH for familiarity with migrating merchants.

TaxClassification โ€” Persisted enum on SaleLineItem stamped by ITaxCalculator at sale time. Four states: Taxed (rates produced TaxAmount > 0), Exempt (resolved group has no rates โ€” intrinsically not taxable), Waived (rates were forced to 0 by cashier override or full-exemption cert), Mapped (a CustomerTaxProfile mapping substituted the group โ€” B2B). Lets reports filter by line outcome without rebuilding the rules. ADR-0063.

TaxGroup โ€” A named bundle of TaxRate rows that a product can be assigned to (e.g., "PR IVU Standard", "Restaurant Prepared Food", "Resale 1%"). The authoritative assignment lives on LocationProduct.TaxGroupId (NOT NULL). Location.DefaultTaxGroupId seeds new LocationProduct rows. Product.TaxGroupId is a nullable catalog template only โ€” the calculator never reads from it. A group with zero rates models items that don't collect tax (Exempt). New merchants are auto-seeded with one such group named "Non-Taxable" โ€” the only jurisdiction-agnostic seed; jurisdiction-specific groups come from onboarding templates (follow-up work).

TaxGroupRate โ€” Junction table that joins TaxGroup to TaxRate (M:N). Lets the same TaxRate (e.g., "Municipal 1%") appear in multiple groups without duplication. Priority lives on the junction because a rate can sit at position 0 in one group and position 2 in another (drives both compounding base and receipt order). RMS/RMH equivalent: implicit TaxID01..TaxID10 columns on ItemTax โ€” QIIUB elevates that ordering to an explicit field. ADR-0063.

TaxOverride (Cashier Tax Override) โ€” A per-line override applied at sale time, attached via SaleLineItem.TaxOverrideReasonCodeId plus snapshot fields TaxOverrideReasonCodeCode and TaxOverrideNotes. The tax engine emits the resolved TaxGroup's rates with TaxAmount = 0 and classifies the line as Waived. Distinct from total exemption (driven by Customer.TaxExempt) and B2B mapping (driven by CustomerTaxProfile).

TaxRate โ€” A single tax row (state IVU, municipal, federal excise) reusable across any number of TaxGroups via TaxGroupRate. First-class entity managed via standalone CRUD endpoints (POST /api/tax-rates, list/get/update/delete) โ€” see ADR-0063 and docs/design/tax-engine.md ยง7.1. Unique Code per merchant. Carries IsCompounding (RMS Tax.IncludePreviousTax), IsIncludedInPrice (VAT-style โ€” true means the rate is already baked into the displayed price), ShowOnReceipt, and Rate (decimal fraction). At sale time the engine snapshots TaxRateCode / TaxRateName / TaxRateValue onto SaleTax so historical reports stay stable when master rates are updated.

Taxed (TaxClassification) โ€” One of the four states stamped on SaleLineItem.TaxClassification. Standard taxable line โ€” the resolved TaxGroup's rates produced SaleTax rows with TaxAmount > 0. The most common case in any retail sale. See TaxClassification and tax-engine.md.

Tailwind CSS โ€” A CSS framework that uses utility classes (e.g., text-sm, bg-purple-500) instead of writing custom CSS. The admin portal uses Tailwind 4 with design system tokens.

TanStack Router โ€” A type-safe routing library for React. Used in the admin portal for navigation, auth guards, and URL-based state (pagination, filters).

Testcontainers โ€” A library that spins up real SQL Server instances in Docker containers for integration tests. QIIUB never uses fake in-memory databases for testing โ€” all tests run against real SQL Server.

TimeBreak โ€” Discrete break punch stored as a child of TimeEntry. Each break has BreakStartUtc, BreakEndUtc, and a BreakType (Paid or Unpaid). Paid breaks count toward worked hours; unpaid breaks reduce them. See ADR-0046.

TimeEntry โ€” Shift header capturing a single clock-in/clock-out cycle for an employee at a location. BreakMinutes is a denormalized sum of the entry's Unpaid TimeBreak durations.

Turnstile โ€” Cloudflare's bot protection widget (alternative to reCAPTCHA). Used on the admin portal login page to prevent automated login attacks.

U

UoM (Unit of Measure) โ€” How a product is counted and sold: each, pound, kilogram, liter, etc. The system supports conversions between units (e.g., 1 case = 12 units).

UPC-A (Universal Product Code) โ€” A 12-digit numeric barcode standard used in retail in the USA and Canada. The last digit is a Modulo 10 check digit. Assigned by GS1 US. A UPC-A is technically an EAN-13 with a leading zero. First digit indicates purpose: 0/1/6/7 = regular products, 2 = in-store use, 3 = pharmaceuticals (NDC), 5 = coupons.

UseComponentPrice โ€” Planned QIIUB flag on Product used when BundleType=Assembly. When true, the assembly uses override prices per component (stored in KitComponent.ComponentPrice) โ€” typically to discount components when bought as a bundle. When false, each component is priced at its normal ProductVariant.Price. Inherited from RMS/RMH's ItemClass.UseComponentPrice. Not applicable to Kit, Matrix, or Lot Matrix (those have pricing inherent to their structure).

V

VACUUM โ€” A SQLite maintenance operation that rebuilds the database file to reclaim unused space and defragment data. QIIUB uses PRAGMA incremental_vacuum instead, which reclaims space gradually without the full-database pause.

Vertical (Industry Vertical) โ€” A specific industry that QIIUB serves. Currently three: Shop (general retail), Rx/Pharmacy, and Build (hardware/ferreteria). Each vertical has specialized modules but shares the same database schema.

Vertical Slice Architecture โ€” An approach where code is organized by feature (e.g., Features/Products/CreateProduct/) rather than by layer (e.g., Controllers/, Services/, Repositories/). Each feature contains everything it needs: endpoint, request/response types, validation, and handler.

W

WAL (Write-Ahead Logging) โ€” A SQLite journaling mode where changes are written to a separate log file before being applied to the main database. This allows multiple processes to read the database simultaneously while one process writes โ€” critical for POS where barcode lookups must not stall during sale processing.

Waived (TaxClassification) โ€” One of the four states stamped on SaleLineItem.TaxClassification. The line's resolved TaxGroup has rates, but every TaxAmount was forced to 0 โ€” either by a cashier override (SaleLineItem.TaxOverrideReasonCodeId) or by the customer's full-exemption cert (Customer.TaxExempt = true with valid cert). Distinguished from Exempt, where the group itself has no rates. See TaxClassification and tax-engine.md.

WCAG (Web Content Accessibility Guidelines) โ€” International standards for web accessibility. QIIUB targets level AA: minimum 4.5:1 color contrast, 44px touch targets, keyboard navigation, screen reader support.

Z

ZPL / TSPL โ€” Printer command languages for label printers. ZPL (Zebra Programming Language) is used by Zebra printers; TSPL by TSC printers. The QIIUB label engine generates code in both formats.

Zustand โ€” A lightweight state management library for React (~1KB). The admin portal uses it for auth state, sidebar state, and UI preferences. Chosen for minimal boilerplate and the team's prior experience.