Το σύστημα αποτελείται από microservices και διακριτά κομμάτια με σκοπό την ευκολότερη αποσφαλμάτωση και συντηρησιμότητα. Μεταξύ τους οι υπηρεσίες επικοινωνούν κυρίως μέσω REST API. Παρακάτω φαίνεται συνοπτικό διάγραμμα της δομής και του τρόπου συνδεσιμότητας.

Διάγραμμα Ροής

flowchart TD
    subgraph Project Stack
        subgraph Client
            A[Vue.js Frontend]
        end

        subgraph Backend
            B[Node.js Backend]
            E[Rust Middleware]
        end

            F[Python Logger]
    end

    subgraph Notifications System
      G[Ntfy]
    end

    subgraph Data server
        D[(OracleDB)]
        L[LDAP]
    end

    subgraph SSO
        C[Keycloak Authenticator]
    end

    A -->|HTTP Requests| B
    A -->|Auth Request| C
    B <-->|SQL Queries| D
    B -->|JSON Response| A
    E -->|Token Validation| C
    E -->|Roles and Access| B
    B -->|Response logging| F
    D -->|User info| E
    L -->|User info| E
    B -->|Notification trigger| G
    G -->|Web Push| A
    G -->|Email| Users

Backend

Το σύστημα λειτουργίας του backend οργανώνεται στους παρακάτω φακέλους:


├── __pycache__
│   └── htmltopdf.cpython-311.pyc
├── htmltopdf.py (script δημιουργίας pdf από html κώδικα)
├── LICENSE
├── package-lock.json
├── package.json
├── README.md
└── src
    ├── assets (συμπληρωματικά αρχεία εικόνων και γραμματοσειράς. Χρησιμεύουν κυρίως για τη δημιουργία pdf)
    │   ├── fonts
    │   │   └── DejaVuSans.ttf
    │   └── images
    │       └── hcmrlogo.png
    ├── controllers (χειριστές, εκτελούν ενέργειες για κάποιο συγκεκριμένο endpoint)
    │   ├── attendance.js
    │   ├── auth.js
    │   ├── generic.js
    │   ├── movements.js
    │   ├── orderForms.js
    │   ├── paymentrequests.js
    │   ├── projects.js
    │   └── services.js
    ├── data
    │   ├── dailyAllowance.js
    │   └── nightRate.js
    ├── htmlDocTemplates
    │   ├── conflict-template.html
    │   ├── conflict.js
    │   ├── new-user-template.html
    │   ├── prdoc.js
    │   └── trippdf.js
    ├── middleware (διαμεσολαβητές αυθεντικοποίησης και logging)
    │   ├── auth-service.js
    │   └── logger.js
    ├── queries (περιέχονται οι κλήσεις στη βάση)
    │   ├── auth_authorize.sql
    │   ├── check_hr_db.sql
    │   ├── generic_get_personnel_full.sql
    │   ├── list_user_roles.sql
    │   ├── of_details.sql
    │   ├── of_get_invoice.sql
    │   ├── of_get_moves.sql
    │   ├── of_get_payreq.sql
    │   ├── of_get_projects.sql
    │   ├── ofdetails.sql
    │   ├── pr_create_request.sql
    │    .
    │    .
    │    .
    ├── routes
    │   ├── debug.js
    │   ├── private.js
    │   └── public.js
    ├── server.js
    ├── services (κλάσεις επικοινωνίας με εξωτερικές μικροϋπηρεσίες)
    │   ├── oracledb.js
    │   ├── logger.js
    │   ├── mariadb.js
    │   ├── mounts.js
    │   └── notify.js
    └── utils (βοηθητικές συναρτήσεις)
        ├── compareObjects.js
        ├── conflict-pdf.js
        ├── filename.js
        ├── format.js
        ├── helpers.js
        ├── pdf.js
        └── versioning.js

Frontend

Το σύστημα διεπαφής οργανώνεται στους παρακάτω φακέλους. Το frontend χρησιμοποιεί το θέμα OneUI Vue και για την αναβάθμιση του θέματος πρέπει να ακολουθηθούν οι σχετικές οδηγίες που αναγράφονται από το δημιουργό του.

├── CHANGELOG.md
├── components.d.ts
├── favicon.ico
├── index.html
├── node_modules (βιβλιοθήκες)
├── package.json
├── patches
│   └── vue-dataset+3.5.4.patch
├── public (λογότυπα, γραμματοσειρές, εικόνες)
│   ├── assets
│   │   ├── fonts
│   │   ├── logos
│   │   └── media
│   ├── favicon.ico
│   └── ntfy-sw.js
├── README.md
├── src (βασικός πηγαίος κώδικας)
│   ├── App.vue
│   ├── assets
│   │   └── scss
│   │       ├── custom
│   │       │   ├── _main.scss
│   │       │   └── _variables.scss
│   │       ├── main.scss
│   │       ├── oneui
│   │   .
│   │   .
│   │   .
│   ├── components (μεμονωμένα στοιχεία επαναχρησιμοποιήσιμα)
│   │   ├── Announcements.vue
│   │   ├── BaseBackground.vue
│   │   ├── BaseBlock.vue
│   │   ├── BaseNavigation.vue
│   │   ├── BasePageHeading.vue
│   │   ├── BlockAlert.vue
│   │   ├── Breadcrumbs.vue
│   │   ├── Changelog.vue
│   │   ├── ComingSoon.vue
│   │   ├── ComplexTable.vue
│   │   ├── ContextMenu.vue
│   │   .
│   │   .
│   │   .
│   ├── data (λεξικά, αντιστοιχίσεις κλπ)
│   │   ├── activity.js
│   │   ├── dicts
│   │   │   ├── contacts.json
│   │   │   ├── of-prequest.json
│   │   │   ├── orderform.json
│   │   │   ├── orderforms
│   │   │   │   ├── all.json
│   │   │   │   ├── new.json
│   │   │   │   └── one.json
│   │   │   ├── paymentrequest.json
│   │   │   ├── programs.json
│   │   │   ├── punchcard.json
│   │   │   .
│   │   │   .
│   │   │   .
│   │   ├── icons.js
│   │   ├── mappings
│   │   │   ├── orderform.js
│   │   │   └── trips.js
│   │   ├── menu.js
│   │   ├── notifications.js
│   │   ├── sales.js
│   │   ├── tabs
│   │   │   ├── documents
│   │   │   │   └── all.json
│   │   │   ├── orderforms
│   │   │   │   ├── new.json
│   │   │   │   └── one.json
│   │   │   ├── prequests
│   │   │   │   └── new.json
│   │   │   ├── programs
│   │   │   │   └── one.json
│   │   │   └── trips
│   │   │       └── new.json
│   │   ├── trips
│   │   │   └── helper-blocks.json
│   │   ├── users.js
│   │   └── usersDataset.json
│   ├── directives
│   │   ├── clickOutside.js
│   │   ├── clickRipple.js
│   │   ├── formatDistance.js
│   │   └── priceInput.js
│   ├── layouts (διατάξεις σελίδων)
│   │   ├── BaseLayout.vue
│   │   ├── partials
│   │   │   ├── Footer.vue
│   │   │   ├── Header.vue
│   │   │   ├── Sidebar.vue
│   │   │   └── SideOverlay.vue
│   │   └── variations
│   │       ├── AccessMain.vue
│   │       ├── Backend.vue
│   │       ├── BackendBoxed.vue
│   │       ├── BackendMegaMenu.vue
│   │       ├── BackendSidebarMiniNav.vue
│   │       ├── BackendStarter.vue
│   │       ├── Landing.vue
│   │       └── Simple.vue
│   ├── main.ts (βασική εκκίνηση)
│   ├── router (διαδρομές)
│   │   ├── index.ts
│   │   └── routes.js
│   ├── services (υπηρεσίες)
│   │   ├── admin-api.ts
│   │   ├── api.ts
│   │   └── ntfy.ts
│   ├── stores
│   │   ├── auth.ts
│   │   ├── notifications.ts
│   │   └── template.js
│   ├── types
│   │   ├── auth.ts
│   │   ├── notification.ts
│   │   ├── nums.ts
│   │   └── vue-shim.d.ts
│   ├── utils (βοηθητικές συναρτήσεις)
│   │   ├── fetcher.ts (μηχανισμός κλήσης backend)
│   │   ├── helpers.ts
│   │   ├── notifications.js
│   │   └── versioning.ts
│   ├── views (σελίδες/προβολές)
│   │   ├── admin
│   │   │   └── CreateUser.vue
│   │   ├── contacts
│   │   │   └── All.vue
│   │   ├── Dashboard.vue
│   │   ├── documents
│   │   │   └── All.vue
│   │   ├── errors
│   │   │   ├── 400View.vue
│   │   │   ├── 401View.vue
│   │   │   ├── 403View.vue
│   │   │   ├── 404View.vue
│   │   │   ├── 500View.vue
│   │   │   └── 503View.vue
│   │   ├── Landing.vue
│   │   ├── orderforms
│   │   │   ├── All.vue
│   │   │   ├── New.vue
│   │   │   ├── One.vue
│   │   │   └── tables
│   │   │       ├── Moves.vue
│   │   │       └── PaymentRequests.vue
│   │   ├── prequests
│   │   │   ├── All.vue
│   │   │   ├── New.bak
│   │   │   ├── New.vue
│   │   │   └── One.vue
│   │   ├── profile
│   │   │   └── ProfileDetails.vue
│   │   ├── programs
│   │   │   ├── All.vue
│   │   │   └── One.vue
│   │   ├── punchcard
│   │   │   └── PunchcardView.vue
│   │   ├── services
│   │   │   ├── All.vue
│   │   │   ├── Test.vue
│   │   │   └── users
│   │   │       └── New.vue
│   │   ├── specials
│   │   │   ├── MaintenanceView.vue
│   │   │   └── ServicesAll.vue
│   │   └── trips
│   │       ├── All.vue
│   │       ├── data.js
│   │       ├── forms
│   │       │   ├── TripClearance.vue
│   │       │   ├── TripRequest.vue
│   │       │   └── TripReview.vue
│   │       ├── Moves.vue
│   │       ├── New.vue
│   │       └── One.vue
│   └── vue.d.ts
├── tsconfig.json
├── tsconfig.node.json
├── vite.config.js
└── yarn.lock