Files
unicenta-opos/C4_ARCHITECTURE.md
T
2026-02-02 13:32:09 +00:00

26 KiB

Unicenta oPOS - C4 Architecture Diagram

Overview

Unicenta oPOS (v5.4.0) is an enterprise-level Point of Sale system built with Java. It provides comprehensive sales, inventory, customer, and reporting management capabilities with support for multiple operating systems (Windows, Linux, macOS).


Level 1: System Context Diagram

graph TB
    user["👤 POS Operators/Staff"]

    system["📱 Unicenta oPOS System<br/>Java Desktop Application<br/>v5.4.0"]

    devices["🖨️ Peripheral Devices<br/>Printer • Scale<br/>Barcode Scanner<br/>Card Reader"]

    db["💾 Database<br/>MySQL • Derby<br/>SQLite • PostgreSQL"]

    fs["📂 File System<br/>Reports • Templates<br/>Locales • Config"]

    user -->|interacts| system
    system -->|controls| devices
    system -->|reads/writes| db
    system -->|reads/writes| fs
    devices -.->|feedback| system

    style system fill:#4A90E2,stroke:#2E5C8A,color:#fff,stroke-width:3px
    style user fill:#50C878,stroke:#2D7A4A,color:#fff
    style devices fill:#FF6B6B,stroke:#A53D3D,color:#fff
    style db fill:#FFB84D,stroke:#8B6914,color:#fff
    style fs fill:#9B59B6,stroke:#5B2C6F,color:#fff

Level 2: Container Architecture

graph TB
    subgraph app["🏗️ UNICENTA oPOS APPLICATION"]
        subgraph ui["PRESENTATION LAYER<br/>(Swing/JavaFX)"]
            ui1["StartPOS Entry Point"]
            ui2["Sales Screens<br/>Simple • Restaurant<br/>Shared Modes"]
            ui3["Admin Panels<br/>User Mgmt • Settings"]
            ui4["Forms & Dialogs<br/>Customers • Suppliers<br/>Inventory"]
            ui5["Reporting Dashboards<br/>JFreeChart"]
        end

        subgraph service["SERVICE LAYER<br/>(Business Logic)"]
            svc1["Sales Service"]
            svc2["Inventory Service"]
            svc3["Customer Service"]
            svc4["Payment Service"]
            svc5["Reporting Service"]
            svc6["Config/Admin Service"]
        end

        subgraph dao["DATA ACCESS LAYER<br/>(DAOs)"]
            dao1["ProductDAO"]
            dao2["TicketDAO"]
            dao3["CustomerDAO"]
            dao4["EmployeeDAO"]
            dao5["CompanyDAO"]
            dao6["SupplierDAO"]
        end

        subgraph peripheral["PERIPHERAL INTEGRATION<br/>(Drivers & APIs)"]
            per1["Printer Drivers<br/>ESC-POS • JavaPOS"]
            per2["Scale Reader<br/>Serial Comm"]
            per3["Barcode Scanner<br/>ZXing"]
            per4["Card Reader<br/>USB/Serial"]
        end

        subgraph utils["UTILITIES & SUPPORT"]
            util1["Logging<br/>Logback"]
            util2["Formatting<br/>Date • Currency"]
            util3["Localization<br/>i18n"]
            util4["Reporting<br/>JasperReports"]
            util5["Scripting<br/>BeanShell"]
            util6["Plugins"]
        end
    end

    subgraph external["📦 EXTERNAL SYSTEMS"]
        extdb["💾 Database<br/>MySQL/Derby/SQLite<br/>PostgreSQL"]
        extfs["📂 File System<br/>Configs • Templates<br/>Locales • Reports"]
        devices["🖨️ Physical Devices<br/>Printers • Scales<br/>Scanners • Card Readers"]
    end

    ui -->|calls| service
    service -->|uses| dao
    service -->|uses| peripheral
    service -->|uses| utils
    ui -->|uses| utils

    dao -->|reads/writes| extdb
    peripheral -->|controls| devices
    service -->|reads/writes| extfs
    ui -->|reads/writes| extfs

    style app fill:#E8F4F8,stroke:#2E5C8A,stroke-width:2px
    style ui fill:#4A90E2,stroke:#2E5C8A,color:#fff
    style service fill:#50C878,stroke:#2D7A4A,color:#fff
    style dao fill:#FF9F43,stroke:#B8690F,color:#fff
    style peripheral fill:#FF6B6B,stroke:#A53D3D,color:#fff
    style utils fill:#9B59B6,stroke:#5B2C6F,color:#fff
    style external fill:#F0F0F0,stroke:#666
    style extdb fill:#FFB84D,stroke:#8B6914,color:#fff
    style extfs fill:#9B59B6,stroke:#5B2C6F,color:#fff
    style devices fill:#FF6B6B,stroke:#A53D3D,color:#fff

Level 3: Component Architecture

Sales Module

graph LR
    subgraph sales["com.unicenta.pos.sales"]
        simple["simple/<br/>Simple POS Mode"]
        restaurant["restaurant/<br/>Table/Order Mode"]
        shared["shared/<br/>Shared Ticket Logic"]
    end

    simple -.-> shared
    restaurant -.-> shared

    style sales fill:#4A90E2,stroke:#2E5C8A,color:#fff
    style simple fill:#5BA3D0,stroke:#2E5C8A,color:#fff
    style restaurant fill:#5BA3D0,stroke:#2E5C8A,color:#fff
    style shared fill:#6BB3E0,stroke:#2E5C8A,color:#fff

Inventory & Catalog Modules

graph TB
    subgraph inventory["com.unicenta.pos.inventory"]
        inv_prod["Product Management"]
        inv_stock["Stock Tracking"]
        inv_cat["Category Management"]
    end

    subgraph catalog["com.unicenta.pos.catalog"]
        cat_prod["Product Categorization"]
        cat_search["Product Search/Filter"]
        cat_display["Display Management"]
    end

    inv_prod ---|shared data| cat_prod
    inv_cat ---|manages| cat_display

    style inventory fill:#50C878,stroke:#2D7A4A,color:#fff
    style catalog fill:#50C878,stroke:#2D7A4A,color:#fff
    style inv_prod fill:#68D989,stroke:#2D7A4A,color:#fff
    style inv_stock fill:#68D989,stroke:#2D7A4A,color:#fff
    style inv_cat fill:#68D989,stroke:#2D7A4A,color:#fff
    style cat_prod fill:#68D989,stroke:#2D7A4A,color:#fff
    style cat_search fill:#68D989,stroke:#2D7A4A,color:#fff
    style cat_display fill:#68D989,stroke:#2D7A4A,color:#fff

Ticket & Payment Processing

graph TB
    subgraph ticket["com.unicenta.pos.ticket"]
        ticket_create["Ticket Creation"]
        ticket_items["Line Items Mgmt"]
        ticket_lifecycle["Lifecycle Management"]
    end

    subgraph payment["com.unicenta.pos.payment"]
        pay_method["Payment Methods"]
        pay_process["Payment Processing"]
        pay_card["Card Integration"]
    end

    ticket_create -->|on completion| pay_method
    ticket_items -->|on finalize| pay_process
    pay_process -->|if card| pay_card

    style ticket fill:#FF9F43,stroke:#B8690F,color:#fff
    style payment fill:#FF9F43,stroke:#B8690F,color:#fff
    style ticket_create fill:#FDB44B,stroke:#B8690F,color:#fff
    style ticket_items fill:#FDB44B,stroke:#B8690F,color:#fff
    style ticket_lifecycle fill:#FDB44B,stroke:#B8690F,color:#fff
    style pay_method fill:#FDB44B,stroke:#B8690F,color:#fff
    style pay_process fill:#FDB44B,stroke:#B8690F,color:#fff
    style pay_card fill:#FDB44B,stroke:#B8690F,color:#fff

Reporting & Administration

graph TB
    subgraph reports["com.unicenta.pos.reports"]
        report_gen["Report Generation"]
        report_chart["Chart Generation<br/>JFreeChart"]
        report_export["PDF/Excel Export"]
    end

    subgraph admin["com.unicenta.pos.admin"]
        admin_user["User Management"]
        admin_config["System Configuration"]
        admin_security["Access Control"]
    end

    report_gen -->|uses| report_chart
    report_chart -->|renders to| report_export
    admin_user -->|applies| admin_security

    style reports fill:#9B59B6,stroke:#5B2C6F,color:#fff
    style admin fill:#9B59B6,stroke:#5B2C6F,color:#fff
    style report_gen fill:#B76AC2,stroke:#5B2C6F,color:#fff
    style report_chart fill:#B76AC2,stroke:#5B2C6F,color:#fff
    style report_export fill:#B76AC2,stroke:#5B2C6F,color:#fff
    style admin_user fill:#B76AC2,stroke:#5B2C6F,color:#fff
    style admin_config fill:#B76AC2,stroke:#5B2C6F,color:#fff
    style admin_security fill:#B76AC2,stroke:#5B2C6F,color:#fff

Printer System

graph LR
    subgraph printer["com.unicenta.pos.printer"]
        escpos["escpos/<br/>ESC-POS Driver"]
        javapos["javapos/<br/>JavaPOS Driver"]
        screen["screen/<br/>Screen Preview"]
    end

    reports["JasperReports<br/>JFreeChart"]

    reports -->|routes to| escpos
    reports -->|routes to| javapos
    reports -->|routes to| screen

    style printer fill:#FF6B6B,stroke:#A53D3D,color:#fff
    style escpos fill:#FF8E8E,stroke:#A53D3D,color:#fff
    style javapos fill:#FF8E8E,stroke:#A53D3D,color:#fff
    style screen fill:#FF8E8E,stroke:#A53D3D,color:#fff
    style reports fill:#9B59B6,stroke:#5B2C6F,color:#fff

Communication & Integration

graph TB
    subgraph comm["com.unicenta.pos.comm"]
        serial["Serial Communication<br/>RXTX • jSerialComm"]
        usb["USB Communication<br/>USB4Java"]
    end

    scale["Scale Reader"]
    scanner["Barcode Scanner<br/>ZXing"]
    reader["Card Reader"]

    serial -->|reads| scale
    serial -->|reads| scanner
    usb -->|reads| reader

    style comm fill:#FF6B6B,stroke:#A53D3D,color:#fff
    style serial fill:#FF8E8E,stroke:#A53D3D,color:#fff
    style usb fill:#FF8E8E,stroke:#A53D3D,color:#fff
    style scale fill:#D9534F,stroke:#A53D3D,color:#fff
    style scanner fill:#D9534F,stroke:#A53D3D,color:#fff
    style reader fill:#D9534F,stroke:#A53D3D,color:#fff

Level 4: Data Flow Diagrams

Sales Transaction Flow

sequenceDiagram
    actor User as POS Operator
    participant UI as Sales Screen
    participant Service as Sales Service
    participant DAO as TicketDAO
    participant DB as Database
    participant Payment as Payment Service
    participant Printer as Printer Service

    User->>UI: Create/Edit Ticket
    UI->>Service: Process Ticket
    Service->>DAO: Save Ticket
    DAO->>DB: INSERT/UPDATE
    DB-->>DAO: Confirm
    DAO-->>Service: Ticket ID
    User->>UI: Process Payment
    UI->>Service: Payment Request
    Service->>Payment: Process Payment
    Payment-->>Service: Payment Confirmed
    Service->>Printer: Print Receipt
    Printer-->>Service: Print Complete
    Service-->>UI: Transaction Complete
    UI-->>User: Display Confirmation

Product Lookup Flow

sequenceDiagram
    actor Device as Barcode Scanner
    participant UI as Sales Screen
    participant DAO as ProductDAO
    participant DB as Database

    Device->>UI: Scan Barcode
    UI->>DAO: Query Product
    DAO->>DB: SELECT Product
    DB-->>DAO: Product Data
    DAO-->>UI: Product Details
    UI-->>Device: Display Product Info

Report Generation Flow

sequenceDiagram
    actor User as Admin/Manager
    participant UI as Admin Panel
    participant Service as Reporting Service
    participant JasperReports as JasperReports Engine
    participant DB as Database
    participant FileSystem as File System

    User->>UI: Request Report
    UI->>Service: Generate Report
    Service->>DB: Query Data
    DB-->>Service: Report Data
    Service->>JasperReports: Render Report
    JasperReports->>FileSystem: Generate PDF/Excel
    FileSystem-->>JasperReports: File Path
    JasperReports-->>Service: Report Ready
    Service-->>UI: Display/Download
    UI-->>User: Provide Report

Level 5: Package Structure

graph TB
    com["com.unicenta"]

    com -->|core| basic["basic<br/>Exception Handling<br/>Logging"]
    com -->|ui| beans["beans<br/>Custom UI Components<br/>Dialogs • Date Pickers<br/>Number Pads"]
    com -->|ui| orderpop["orderpop<br/>Order Popup Module"]
    com -->|plugins| plugins["plugins<br/>Plugin Architecture<br/>Metrics System"]

    pos["com.unicenta.pos"]
    com -->|main| pos

    pos -->|sales| sales["sales<br/>Simple • Restaurant<br/>Shared Modes"]
    pos -->|inventory| inventory["inventory<br/>Products • Stock<br/>Categories"]
    pos -->|customers| customers["customers<br/>Customer Management<br/>Loyalty Programs"]
    pos -->|catalog| catalog["catalog<br/>Product Catalog<br/>Display Management"]
    pos -->|ticket| ticket["ticket<br/>Ticket Lifecycle<br/>Line Items"]
    pos -->|payment| payment["payment<br/>Payment Methods<br/>Card Integration<br/>Cash Handling"]
    pos -->|reports| reports["reports<br/>JasperReports<br/>JFreeChart<br/>PDF/Excel Export"]
    pos -->|admin| admin["admin<br/>User Management<br/>System Configuration<br/>Access Control"]
    pos -->|printer| printer["printer<br/>ESC-POS • JavaPOS<br/>Screen Preview"]
    pos -->|comm| comm["comm<br/>Serial • USB<br/>Scale • Scanner<br/>Card Reader"]
    pos -->|scripting| scripting["scripting<br/>BeanShell<br/>Custom Logic"]
    pos -->|forms| forms["forms<br/>Main UI<br/>Data Entry Forms"]
    pos -->|config| config["config<br/>Configuration Mgmt<br/>Settings"]
    pos -->|instance| instance["instance<br/>Instance Management<br/>Singleton Patterns"]
    pos -->|mant| mant["mant<br/>Maintenance<br/>Utilities"]

    style com fill:#E8F4F8,stroke:#2E5C8A
    style pos fill:#4A90E2,stroke:#2E5C8A,color:#fff
    style basic fill:#5BA3D0,stroke:#2E5C8A,color:#fff
    style beans fill:#5BA3D0,stroke:#2E5C8A,color:#fff
    style orderpop fill:#5BA3D0,stroke:#2E5C8A,color:#fff
    style plugins fill:#5BA3D0,stroke:#2E5C8A,color:#fff
    style sales fill:#50C878,stroke:#2D7A4A,color:#fff
    style inventory fill:#50C878,stroke:#2D7A4A,color:#fff
    style customers fill:#50C878,stroke:#2D7A4A,color:#fff
    style catalog fill:#50C878,stroke:#2D7A4A,color:#fff
    style ticket fill:#FF9F43,stroke:#B8690F,color:#fff
    style payment fill:#FF9F43,stroke:#B8690F,color:#fff
    style reports fill:#9B59B6,stroke:#5B2C6F,color:#fff
    style admin fill:#9B59B6,stroke:#5B2C6F,color:#fff
    style printer fill:#FF6B6B,stroke:#A53D3D,color:#fff
    style comm fill:#FF6B6B,stroke:#A53D3D,color:#fff
    style scripting fill:#FFB84D,stroke:#8B6914,color:#fff
    style forms fill:#4A90E2,stroke:#2E5C8A,color:#fff
    style config fill:#4A90E2,stroke:#2E5C8A,color:#fff
    style instance fill:#4A90E2,stroke:#2E5C8A,color:#fff
    style mant fill:#4A90E2,stroke:#2E5C8A,color:#fff

Level 6: Database Schema Overview

graph TB
    subgraph core["CORE ENTITIES"]
        company["COMPANY<br/>company_id<br/>name<br/>code"]
        location["LOCATION<br/>location_id<br/>name<br/>address"]
        products["PRODUCTS<br/>product_id<br/>name<br/>code<br/>price"]
        categories["CATEGORIES<br/>category_id<br/>name<br/>description"]
    end

    subgraph transactions["TRANSACTION ENTITIES"]
        tickets["TICKETS<br/>ticket_id<br/>number<br/>date<br/>customer_id"]
        lines["TICKETLINES<br/>line_id<br/>ticket_id<br/>product_id<br/>qty"]
        payments["PAYMENTS<br/>payment_id<br/>ticket_id<br/>method<br/>amount"]
    end

    subgraph master["MASTER DATA"]
        customers["CUSTOMERS<br/>customer_id<br/>name<br/>email<br/>phone"]
        suppliers["SUPPLIERS<br/>supplier_id<br/>name<br/>contact<br/>products"]
        employees["EMPLOYEES<br/>employee_id<br/>name<br/>role<br/>access_level"]
        taxes["TAXCATEGORIES<br/>tax_id<br/>name<br/>rate"]
    end

    subgraph inventory["INVENTORY ENTITIES"]
        stock["STOCK<br/>stock_id<br/>product_id<br/>location_id<br/>quantity"]
        movements["STOCKMOVEMENTS<br/>movement_id<br/>product_id<br/>qty<br/>type"]
    end

    company -->|operates| location
    location -->|manages| products
    products -->|in| categories
    location -->|in| stock
    products -->|in| stock

    customers -->|creates| tickets
    employees -->|processes| tickets
    products -->|in| lines
    tickets -->|contains| lines
    tickets -->|has| payments
    tickets -->|has| taxes

    products -->|from| suppliers
    stock -->|tracks| movements

    style core fill:#4A90E2,stroke:#2E5C8A,color:#fff
    style transactions fill:#FF9F43,stroke:#B8690F,color:#fff
    style master fill:#50C878,stroke:#2D7A4A,color:#fff
    style inventory fill:#9B59B6,stroke:#5B2C6F,color:#fff
    style company fill:#5BA3D0,stroke:#2E5C8A,color:#fff
    style location fill:#5BA3D0,stroke:#2E5C8A,color:#fff
    style products fill:#5BA3D0,stroke:#2E5C8A,color:#fff
    style categories fill:#5BA3D0,stroke:#2E5C8A,color:#fff
    style tickets fill:#FDB44B,stroke:#B8690F,color:#fff
    style lines fill:#FDB44B,stroke:#B8690F,color:#fff
    style payments fill:#FDB44B,stroke:#B8690F,color:#fff
    style customers fill:#68D989,stroke:#2D7A4A,color:#fff
    style suppliers fill:#68D989,stroke:#2D7A4A,color:#fff
    style employees fill:#68D989,stroke:#2D7A4A,color:#fff
    style taxes fill:#68D989,stroke:#2D7A4A,color:#fff
    style stock fill:#B76AC2,stroke:#5B2C6F,color:#fff
    style movements fill:#B76AC2,stroke:#5B2C6F,color:#fff

Technology Stack

graph TB
    subgraph frontend["FRONTEND"]
        swing["Swing<br/>Traditional UI"]
        javafx["JavaFX<br/>Modern UI"]
        flatlaf["FlatLAF<br/>Modern Look & Feel"]
    end

    subgraph backend["BACKEND"]
        java["Java 8+<br/>Core Logic"]
        lombok["Lombok<br/>Boilerplate Reduction"]
        beanshell["BeanShell<br/>Dynamic Scripting"]
    end

    subgraph data["DATA & PERSISTENCE"]
        jdbc["JDBC<br/>Database Abstraction"]
        mysql["MySQL<br/>Primary Database"]
        derby["Derby<br/>Embedded DB"]
        sqlite["SQLite<br/>Lightweight DB"]
        postgres["PostgreSQL<br/>Enterprise DB"]
    end

    subgraph reporting["REPORTING & ANALYTICS"]
        jasper["JasperReports<br/>Report Generation"]
        jfreechart["JFreeChart<br/>Charts & Graphs"]
        poi["Apache POI<br/>Excel Export"]
        itext["iText<br/>PDF Generation"]
    end

    subgraph devices["DEVICE INTEGRATION"]
        rxtx["RXTX/jSerialComm<br/>Serial Communication"]
        usb4j["USB4Java<br/>USB Communication"]
        zxing["ZXing<br/>Barcode Processing"]
        jpos["JavaPOS<br/>POS Device Standard"]
    end

    subgraph support["SUPPORT LIBRARIES"]
        logback["Logback<br/>Logging"]
        gson["GSON<br/>JSON Processing"]
        xstream["XStream<br/>XML Serialization"]
        velocity["Apache Velocity<br/>Template Engine"]
    end

    style frontend fill:#4A90E2,stroke:#2E5C8A,color:#fff
    style backend fill:#50C878,stroke:#2D7A4A,color:#fff
    style data fill:#FF9F43,stroke:#B8690F,color:#fff
    style reporting fill:#9B59B6,stroke:#5B2C6F,color:#fff
    style devices fill:#FF6B6B,stroke:#A53D3D,color:#fff
    style support fill:#FFB84D,stroke:#8B6914,color:#fff

    style swing fill:#5BA3D0,stroke:#2E5C8A,color:#fff
    style javafx fill:#5BA3D0,stroke:#2E5C8A,color:#fff
    style flatlaf fill:#5BA3D0,stroke:#2E5C8A,color:#fff
    style java fill:#68D989,stroke:#2D7A4A,color:#fff
    style lombok fill:#68D989,stroke:#2D7A4A,color:#fff
    style beanshell fill:#68D989,stroke:#2D7A4A,color:#fff
    style jdbc fill:#FDB44B,stroke:#B8690F,color:#fff
    style mysql fill:#FDB44B,stroke:#B8690F,color:#fff
    style derby fill:#FDB44B,stroke:#B8690F,color:#fff
    style sqlite fill:#FDB44B,stroke:#B8690F,color:#fff
    style postgres fill:#FDB44B,stroke:#B8690F,color:#fff
    style jasper fill:#B76AC2,stroke:#5B2C6F,color:#fff
    style jfreechart fill:#B76AC2,stroke:#5B2C6F,color:#fff
    style poi fill:#B76AC2,stroke:#5B2C6F,color:#fff
    style itext fill:#B76AC2,stroke:#5B2C6F,color:#fff
    style rxtx fill:#FF8E8E,stroke:#A53D3D,color:#fff
    style usb4j fill:#FF8E8E,stroke:#A53D3D,color:#fff
    style zxing fill:#FF8E8E,stroke:#A53D3D,color:#fff
    style jpos fill:#FF8E8E,stroke:#A53D3D,color:#fff
    style logback fill:#F5B041,stroke:#8B6914,color:#fff
    style gson fill:#F5B041,stroke:#8B6914,color:#fff
    style xstream fill:#F5B041,stroke:#8B6914,color:#fff
    style velocity fill:#F5B041,stroke:#8B6914,color:#fff

Key Architectural Patterns

graph TB
    subgraph patterns["DESIGN PATTERNS"]
        dao_pat["📋 DAO Pattern<br/>Data Abstraction"]
        service_pat["🔧 Service Pattern<br/>Business Logic"]
        singleton_pat["🎯 Singleton Pattern<br/>Resource Management"]
        factory_pat["🏭 Factory Pattern<br/>Object Creation"]
        plugin_pat["🔌 Plugin Pattern<br/>Extensibility"]
    end

    subgraph layers["ARCHITECTURAL LAYERS"]
        presentation["📱 Presentation<br/>UI Components"]
        business["💼 Business Logic<br/>Services"]
        data["💾 Data Access<br/>DAOs & Queries"]
        external["🔌 External Integration<br/>Devices & Files"]
    end

    subgraph principles["DESIGN PRINCIPLES"]
        sep_concern["Separation of Concerns<br/>Distinct responsibilities"]
        loose_coupling["Loose Coupling<br/>Independent modules"]
        high_cohesion["High Cohesion<br/>Related functionality"]
        abstraction["Abstraction<br/>Hide complexity"]
    end

    presentation -->|calls| business
    business -->|uses| data
    business -->|uses| external

    dao_pat -->|implements| data
    service_pat -->|implements| business
    singleton_pat -->|ensures| resource_management["Resource<br/>Management"]
    factory_pat -->|creates| objects["Objects"]
    plugin_pat -->|enables| extensions["Extensions"]

    style patterns fill:#4A90E2,stroke:#2E5C8A,color:#fff
    style layers fill:#50C878,stroke:#2D7A4A,color:#fff
    style principles fill:#9B59B6,stroke:#5B2C6F,color:#fff
    style dao_pat fill:#5BA3D0,stroke:#2E5C8A,color:#fff
    style service_pat fill:#5BA3D0,stroke:#2E5C8A,color:#fff
    style singleton_pat fill:#5BA3D0,stroke:#2E5C8A,color:#fff
    style factory_pat fill:#5BA3D0,stroke:#2E5C8A,color:#fff
    style plugin_pat fill:#5BA3D0,stroke:#2E5C8A,color:#fff
    style presentation fill:#68D989,stroke:#2D7A4A,color:#fff
    style business fill:#68D989,stroke:#2D7A4A,color:#fff
    style data fill:#68D989,stroke:#2D7A4A,color:#fff
    style external fill:#68D989,stroke:#2D7A4A,color:#fff
    style sep_concern fill:#B76AC2,stroke:#5B2C6F,color:#fff
    style loose_coupling fill:#B76AC2,stroke:#5B2C6F,color:#fff
    style high_cohesion fill:#B76AC2,stroke:#5B2C6F,color:#fff
    style abstraction fill:#B76AC2,stroke:#5B2C6F,color:#fff
    style resource_management fill:#FFB84D,stroke:#8B6914,color:#fff
    style objects fill:#FFB84D,stroke:#8B6914,color:#fff
    style extensions fill:#FFB84D,stroke:#8B6914,color:#fff

Core Features Architecture

graph TB
    system["🏪 Unicenta oPOS<br/>Enterprise POS System"]

    system -->|Sales Management| sales_feat["Sales Processing<br/>Multiple modes<br/>Ticket management<br/>Payment handling"]

    system -->|Inventory Management| inventory_feat["Product Management<br/>Stock tracking<br/>Category organization<br/>Quantity monitoring"]

    system -->|Customer Management| customer_feat["Customer Database<br/>Transaction history<br/>Loyalty programs<br/>Communication"]

    system -->|Supplier Management| supplier_feat["Supplier Directory<br/>Purchase orders<br/>Product sourcing<br/>Vendor info"]

    system -->|Employee Management| employee_feat["User Accounts<br/>Access Control<br/>Role Assignment<br/>Activity Logging"]

    system -->|Reporting & Analytics| reporting_feat["Sales Reports<br/>Inventory Reports<br/>Financial Reports<br/>Charts & Graphs"]

    system -->|Device Integration| device_feat["Thermal Printers<br/>Barcode Scanners<br/>Weight Scales<br/>Card Readers"]

    system -->|Multi-platform| platform_feat["Windows Support<br/>Linux Support<br/>macOS Support<br/>Cross-platform UI"]

    style system fill:#4A90E2,stroke:#2E5C8A,color:#fff,stroke-width:3px
    style sales_feat fill:#50C878,stroke:#2D7A4A,color:#fff
    style inventory_feat fill:#50C878,stroke:#2D7A4A,color:#fff
    style customer_feat fill:#50C878,stroke:#2D7A4A,color:#fff
    style supplier_feat fill:#50C878,stroke:#2D7A4A,color:#fff
    style employee_feat fill:#9B59B6,stroke:#5B2C6F,color:#fff
    style reporting_feat fill:#9B59B6,stroke:#5B2C6F,color:#fff
    style device_feat fill:#FF6B6B,stroke:#A53D3D,color:#fff
    style platform_feat fill:#FFB84D,stroke:#8B6914,color:#fff

Deployment Architecture

graph TB
    subgraph client["CLIENT TIER"]
        desktop["💻 Desktop Machine<br/>Windows • Linux • macOS<br/>Java Runtime (JRE 8+)"]
    end

    subgraph app_tier["APPLICATION TIER"]
        jar["📦 unicentaopos.jar<br/>Version 5.4.0<br/>Java Swing/JavaFX"]
    end

    subgraph data_tier["DATA TIER"]
        db_choice["Database Engine<br/>MySQL 5.x<br/>Derby<br/>SQLite<br/>PostgreSQL"]
        db_instance["Database Instance<br/>Schema: unicentaopos<br/>Tables & Indexes"]
    end

    subgraph files["FILE STORAGE"]
        reports_dir["📁 Reports Directory<br/>Generated PDFs<br/>Excel Files"]
        config_dir["📁 Config Directory<br/>Application Settings<br/>User Preferences"]
        templates["📁 Templates<br/>Report Templates<br/>Print Layouts"]
        locales["📁 Localization<br/>Language Files<br/>i18n Resources"]
    end

    desktop -->|runs| jar
    jar -->|connects to| db_choice
    db_choice -->|manages| db_instance
    jar -->|reads/writes| reports_dir
    jar -->|reads/writes| config_dir
    jar -->|reads| templates
    jar -->|reads| locales

    style client fill:#E8F4F8,stroke:#2E5C8A,stroke-width:2px
    style app_tier fill:#4A90E2,stroke:#2E5C8A,color:#fff,stroke-width:2px
    style data_tier fill:#FF9F43,stroke:#B8690F,color:#fff,stroke-width:2px
    style files fill:#9B59B6,stroke:#5B2C6F,color:#fff,stroke-width:2px
    style desktop fill:#5BA3D0,stroke:#2E5C8A,color:#fff
    style jar fill:#5BA3D0,stroke:#2E5C8A,color:#fff
    style db_choice fill:#FDB44B,stroke:#B8690F,color:#fff
    style db_instance fill:#FDB44B,stroke:#B8690F,color:#fff
    style reports_dir fill:#B76AC2,stroke:#5B2C6F,color:#fff
    style config_dir fill:#B76AC2,stroke:#5B2C6F,color:#fff
    style templates fill:#B76AC2,stroke:#5B2C6F,color:#fff
    style locales fill:#B76AC2,stroke:#5B2C6F,color:#fff

Quick Start

Prerequisites

  • Java 8+ (JRE)
  • MySQL 5.x (or Derby/SQLite/PostgreSQL)
  • Create database schema: unicentaopos

Build

mvn clean package

Run

java -jar ./target/unicentaopos.jar

Platform Support

  • Windows
  • Linux
  • macOS

Summary

Unicenta oPOS is a layered, modular Java desktop application with clear separation between:

  1. Presentation Layer - Swing/JavaFX UI
  2. Service Layer - Business logic & orchestration
  3. Data Access Layer - DAO pattern for database abstraction
  4. Peripheral Integration - Hardware device drivers
  5. Support Layer - Utilities, logging, plugins

The architecture supports multi-database backends, multiple POS sales modes (simple, restaurant), comprehensive reporting, and extensive peripheral device integration, making it a flexible, enterprise-grade point-of-sale system.