---
title: Π.Γ.Ν. Ιωαννίνων StorageManagement
description: >-
  Desktop app σε Tauri + Rust + React που αντικατέστησε ένα legacy C# WinForms σύστημα παρακολούθησης αντιδραστηρίων και
  εξοπλισμού στο Πανεπιστημιακό Γενικό Νοσοκομείο Ιωαννίνων. Εθελοντική civic-tech εργασία για ελληνικό δημόσιο
  νοσοκομείο.
lang: el
source: https://jimrarras.com/projects/pgni-storage/
fetched: '2026-09-19T05:53:18.605Z'
---

Volunteer Lead Developer

Desktop app σε Tauri + Rust + React που αντικατέστησε ένα legacy C# WinForms σύστημα παρακολούθησης αντιδραστηρίων και εξοπλισμού στο Πανεπιστημιακό Γενικό Νοσοκομείο Ιωαννίνων. Εθελοντική civic-tech εργασία για ελληνικό δημόσιο νοσοκομείο.

- **3,9 MB** όλο κι όλο το αρχείο εγκατάστασης

- **5** οθόνες, και τίποτα άλλο να μάθει κανείς

- **4** έτοιμες αναφορές με φίλτρο ημερομηνίας

## Stack
1. [Αρχική](https://jimrarras.com/)
2. [Έργα](https://jimrarras.com/projects/)
3. Π.Γ.Ν. Ιωαννίνων StorageManagement

όλο κι όλο το αρχείο εγκατάστασης

3,9 MB

οθόνες, και τίποτα άλλο να μάθει κανείς

5

έτοιμες αναφορές με φίλτρο ημερομηνίας

4

![Π.Γ.Ν. Ιωαννίνων StorageManagement](https://jimrarras.com/images/projects-cards/pgni-storage.webp)

## Η κατάσταση

Σε ένα εργαστήριο του Πανεπιστημιακού Γενικού Νοσοκομείου Ιωαννίνων, η μονάδα μοριακής βιολογίας της αιματολογίας κρατούσε τα αντιδραστήρια και τον εξοπλισμό της σε ένα πρόγραμμα γραμμένο χρόνια πριν, που από τότε δεν το είχε αγγίξει κανείς. Το εργαστήριο ήθελε κάτι που να τρέχει στους δικούς του υπολογιστές, χωρίς να περιμένει τη μηχανογράφηση και χωρίς να στέλνει τίποτα έξω. Το ανέλαβα εθελοντικά και το έχτισα μόνος μου. Είναι σε παραγωγή, στη θέση του παλιού.

## Το σκανάρισμα κάνει τη δουλειά

Το προσωπικό του εργαστηρίου δεν κάθεται μπροστά στην οθόνη. Κρατάει ένα κουτί στο ένα χέρι και τον σαρωτή στο άλλο, οπότε η καταχώρηση πρέπει να χωράει σε μία κίνηση. Ένα πλήκτρο ανοίγει τη σάρωση από όποια οθόνη κι αν βρίσκεσαι, ο σαρωτής συμπληρώνει μόνος του τον κωδικό, και η ποσότητα ανεβαίνει ή κατεβαίνει με ένα κλικ.

Πώς λειτουργεί

- **Σάρωση από παντού:** το F2 ανοίγει τον διάλογο σάρωσης από κάθε οθόνη και εστιάζει αμέσως στο πεδίο, ώστε ο σαρωτής χειρός να γράφει κατευθείαν μέσα του χωρίς κανένα κλικ.
- **Τρεις καταλήξεις:** ένα αποτέλεσμα ανοίγει το είδος, πολλά αποτελέσματα ζητούν επιλογή θέσης, κανένα αποτέλεσμα ανοίγει φόρμα νέας καταχώρησης.
- **Μοναδικότητα ανά θέση:** ο πίνακας αποθέματος έχει περιορισμό `UNIQUE(barcode, location_id)`, οπότε το ίδιο αντιδραστήριο μετριέται χωριστά σε κάθε σημείο αποθήκευσης αντί να αθροίζεται σε έναν αριθμό που δεν λέει πού βρίσκεται.
- **Μεταφορές:** η κίνηση από θέση σε θέση γράφεται ως μία εγγραφή με θέση προέλευσης και θέση προορισμού, όχι ως μια αφαίρεση και μια άσχετη προσθήκη.

## Τρέχει χωρίς δίκτυο, εγκαθίσταται χωρίς άδειες

Το πρόγραμμα δεν μιλάει σε κανέναν server. Τα δεδομένα μένουν σε ένα αρχείο πάνω στον υπολογιστή του εργαστηρίου, οπότε όταν πέφτει το δίκτυο του νοσοκομείου η αποθήκη συνεχίζει σαν να μη συνέβη τίποτα. Η μηχανογράφηση κατεβάζει ένα αρχείο εγκατάστασης και τελείωσε: δεν στήνεται βάση, δεν ανοίγει θύρα, δεν δημιουργείται λογαριασμός πουθενά.

Πώς λειτουργεί

- **Τι κατεβαίνει:** ένα αρχείο εγκατάστασης NSIS 3,9 MB, ο μοναδικός στόχος πακεταρίσματος που δηλώνει το `tauri.conf.json`.
- **Πού επιτρέπεται να γράψει:** το capability manifest δίνει δικαίωμα εγγραφής μόνο μέσα στον φάκελο δεδομένων της εφαρμογής, και αποθήκευση αρχείου μόνο σε Επιφάνεια εργασίας, Έγγραφα, Λήψεις και προσωπικό φάκελο. Ένα λάθος path δεν γίνεται λάθος αρχείο.
- **Τι δεν υπάρχει:** καμία κλήση δικτύου σε ολόκληρο τον κώδικα της διεπαφής, κανένα HTTP dependency στο `Cargo.toml`, κανένας πάροχος ταυτοποίησης.
- **Ο πυρήνας:** Tauri 2 με Rust για το κέλυφος, React 19 και Vite για τη διεπαφή, SQLite μέσω του `tauri-plugin-sql` με Drizzle για το σχήμα. Πέντε πίνακες συνολικά, που δημιουργούνται στην πρώτη εκκίνηση.

## Τι λείπει, χωρίς να το ψάξει κανείς

Η παλιά λίστα έλεγε πόσα υπάρχουν. Δεν έλεγε τι τελειώνει, τι κινήθηκε τον περασμένο μήνα, ούτε ποιο αντιδραστήριο ξοδεύει πραγματικά το εργαστήριο. Η αρχική οθόνη τα βγάζει μόνη της, και ό,τι φαίνεται στην οθόνη φεύγει σε αρχείο Excel με ένα κουμπί, για τη στιγμή που κάποιος θα ζητήσει απολογισμό.

Πώς λειτουργεί

- **Πέντε οθόνες:** αρχική, απόθεμα, ιστορικό, αναφορές, ρυθμίσεις. Τίποτα άλλο να μάθει κανείς.
- **Τέσσερις αναφορές:** στιγμιότυπο αποθέματος, ιστορικό κινήσεων, ιστορικό χαμηλού αποθέματος και κατανάλωση, όλες με φίλτρο ημερομηνίας.
- **Καταγράφονται τα πάντα:** κάθε προσθήκη, αφαίρεση και μεταφορά γράφεται σε πίνακα ιστορικού με την ποσότητα και τη θέση, οπότε η ιχνηλασιμότητα δεν εξαρτάται από το τι θυμάται κάποιος.
- **Μέσα και έξω:** εισαγωγή από CSV για την αρχική φόρτωση του καταλόγου, εξαγωγή σε XLSX με ExcelJS για τις αναφορές και το ιστορικό.

## Αντίγραφα που δεν τα ζητάει κανείς

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

Πώς λειτουργεί

- **Πότε:** ένα αντίγραφο στην εκκίνηση, εκτός αν το προηγούμενο είναι νεότερο από μισή ώρα, και μετά κάθε τέσσερις ώρες ως προεπιλογή, ρυθμιζόμενο από τις ρυθμίσεις.
- **Πού:** φάκελος μέσα στα δεδομένα της εφαρμογής από προεπιλογή, ή όποιος φάκελος επιλεγεί.
- **Πριν την επαναφορά:** η επαναφορά κλείνει πρώτα τη βάση, γράφει ένα ξεχωριστό αντίγραφο με δικό του πρόθεμα, και μόνο μετά αντιγράφει από πάνω.

## Σύνδεσμοι

Ολόκληρο το πρόγραμμα κατεβαίνει σε 3,9 MB και δεν κάνει ούτε μία κλήση στο δίκτυο σε όλη του τη ζωή.

- Repo: [github.com/jimrarras/StorageManagement](https://github.com/jimrarras/StorageManagement)

## Παρόμοια έργα

- Γηροκομείο Ζωσιμάδων Healthcare Ops Stack: άλλη εθελοντική civic-tech εργασία για ελληνικό ίδρυμα, αλλά πλήρης ops platform αντί για εργαστηριακό desktop app
