- Python 90.1%
- JavaScript 4.7%
- HTML 1.8%
- Zimpl 1.2%
- CSS 1.2%
- Other 1%
|
|
||
|---|---|---|
| assets | ||
| docs | ||
| lms | ||
| lms-mobile | ||
| tests | ||
| tools | ||
| .claudeignore | ||
| .gitignore | ||
| build.bat | ||
| CHANGELOG.md | ||
| CLAUDE.md | ||
| file_version_info.txt | ||
| icon.ico | ||
| icon.png | ||
| INSTRUKCJA_OPERATORA.md | ||
| LICENSE | ||
| magazyn_app.py | ||
| magazyn_app.spec | ||
| NOTICE-Qt.txt | ||
| README.md | ||
| requirements-dev.txt | ||
| requirements.txt | ||
| run.bat | ||
| run.sh | ||
| szablon.zpl | ||
| szablon_v2_kreskowy.zpl | ||
| szablon_v2_qr.zpl | ||
Lokalny Magazyn Surowców (LMS)
Wersja 4.0.0 · aplikacja desktopowa Windows
Ewidencja surowców na magazynie: przyjęcie opakowania, ważenie przy każdym
pobraniu, druk etykiet na drukarce Zebra (ZPL) i raport zmiany dla biura.
Pracuje lokalnie, bez serwera — jeden plik .exe i jedna baza SQLite obok niego.
Instrukcja dla osoby pracującej przy wadze: INSTRUKCJA_OPERATORA.md
Co robi
| Przyjęcie opakowania | wybór surowca ze słownika SAP, waga, data, kod własny albo nadany automatycznie (EAN-13) |
| Pobranie | skan kodu z etykiety, wpisanie pozostałej wagi, nowa etykieta |
| Etykiety ZPL | druk po TCP na drukarkę Zebra, podgląd offline, edytor szablonu |
| Raport zmiany | zestawienie wg indeksu SAP + ślad audytowy, .xlsx gotowy do druku |
| Historia | filtry statusu i dat, wyszukiwanie, druk masowy, eksporty |
| Konta operatorów | podpis chroniony PIN-em (PBKDF2), dziennik zdarzeń |
| Synchronizacja | wymiana danych z terminalem mobilnym, z podglądem zmian przed importem |
Uruchomienie
Z gotowego pliku
Pobierz magazyn_app.exe, uruchom dwuklikiem. Dane (lokalny_magazyn.db,
katalog backups/, szablon.zpl, lms.log) powstają w %LOCALAPPDATA%\LMS;
z pustym plikiem portable.flag obok exe — obok exe (tryb przenośny).
Szczegóły i migracja ze starego układu: docs/DANE_PROGRAMU.md.
Ze źródeł
pip install -r requirements.txt
python magazyn_app.py
Wymagany Python 3.11 lub nowszy.
Kompilacja
Na Windows:
build.bat
Skrypt sprawdza zgodność numeru wersji w źródłach, uruchamia testy, kompiluje
i kładzie obok pliku .exe szablon etykiety oraz ikonę. Przełączniki:
/bez-testow, /zaleznosci (doinstaluje biblioteki i PyInstallera),
/bez-pauzy.
Ręcznie, na dowolnym systemie:
pip install pyinstaller
pyinstaller --noconfirm --clean magazyn_app.spec
Wynik: dist/magazyn_app.exe — jeden plik, bez zależności zewnętrznych.
Program czyta szablon.zpl i icon.ico z katalogu, w którym stoi, więc na
stanowisko kopiuje się cały katalog dist, nie sam plik .exe.
Kompilacja z Linuksa (wine)
Wydanie 3.0.1 powstało w ten sposób. Potrzebny jest wine i Python dla Windows w osobnym prefiksie — Python systemowy z Linuksa da plik dla Linuksa:
export WINEPREFIX=~/.wine-lms
wineboot -u
wine python-3.12.10-amd64.exe /quiet InstallAllUsers=0 Include_tcltk=1 TargetDir=C:\Python312
wine "$WINEPREFIX/drive_c/Python312/python.exe" -m pip install -r requirements.txt -r requirements-dev.txt pyinstaller
WINEPATH='C:\Python312;C:\Python312\Scripts' wine cmd /c build.bat /bez-pauzy
Testy interfejsu idą bez ekranu (platforma Qt offscreen), więc nie potrzebują ani pulpitu, ani wine.
Budowanie 4.0 pod wine nie było sprawdzane; wiążące jest budowanie na Windowsie (build.bat).
Układ projektu
lms/
├── config.py, dane.py stałe, ścieżki, logger, katalog danych i migracja
├── database.py połączenie, schemat, migracje, ustawienia, audyt, kopie
├── repozytorium/ odczyt i zapis danych dziedziny (jedyne miejsce z SQL)
├── uslugi/ reguły biznesowe bez okien — co system robi
├── ui/ interfejs Qt 6: okno główne, widoki, okna, motyw, ikony, czcionki
├── tokeny_projektu.py tokeny: kolory (jasny/ciemny), odstępy, rozmiary
├── export.py raporty .xlsx i .html
├── zpl_generator.py składanie etykiety (+ zpl_parser, zpl_qr, zpl_grafika)
├── print_service.py wysyłka do drukarki
├── aktualizacje.py, forgejo.py, poczta.py, zgloszenia.py aktualizacje i zgłaszanie błędów
└── mobile_sync.py import i eksport plików wymiany
assets/fonts/ Inter i LMS Ikony — dołączane do exe
tools/ budowanie: numer wersji, paczka wydania, font ikon
NOTICE-Qt.txt informacja o Qt (LGPLv3), dołączana do wydania
Pełny opis warstw, modelu danych i widoków: docs/ARCHITECTURE.md.
Zasada warstw: poza database.py i repozytorium/ w projekcie nie ma
zapytań SQL. Widok odczytuje formularz, woła usługę i pokazuje wynik —
walidacja, generowanie kodów i kolejność zapisów należą do warstwy usług.
Dzięki temu reguły biznesowe testuje się bez otwierania okna. Usługi i
repozytorium nie importują ani Qt, ani Tk (pilnuje tego tests/test_bez_tk.py).
Widoki komunikują się przez zdarzenia okna (OPAKOWANIA_ZMIENIONE,
SLOWNIK_ZMIENIONY), nie przez wołanie swoich metod, i powstają przy
pierwszym wejściu.
Wygląd: paleta w tokeny_projektu.py to pary (jasny, ciemny) oparte na
kolorach systemowych Apple; tryb idzie za ustawieniem Windows. Tekst w kroju
Inter, ikony z fontu LMS Ikony. Zasady pilnowane testami
(tests/test_paleta.py, tests/test_zasady_ui.py, tests/ui/test_qt_zgodnosc.py):
kontrast min. 4,5:1 w obu trybach, jedna akcja główna na ekran, żadnych emoji,
napisy bez wersalików, nazwy kontrolek dla czytnika ekranu.
Testy
pip install -r requirements-dev.txt
python -m pytest -q
Ponad 1300 przypadków. Interfejs Qt jest testowany bez ekranu (platforma offscreen, pytest-qt), więc zestaw
uruchamia się też na maszynie bez pulpitu.
Dokumentacja
| Dokument | O czym |
|---|---|
| INSTRUKCJA_OPERATORA.md | obsługa krok po kroku, dla magazynu |
| CHANGELOG.md | co się zmieniło w kolejnych wersjach |
| docs/ARCHITECTURE.md | architektura techniczna |
| docs/DECYZJA_ARCHITEKTONICZNA.md | dlaczego porządkowaliśmy istniejący kod zamiast pisać od zera |
| docs/PLAN_NAPRAWY.md | pięcioetapowy plan przebudowy i kryteria odbioru |
| docs/PLAN_UI.md | zasady interfejsu Z1–Z6 (dokument historyczny przebudowy 3.x) |
| docs/PLAN_QT6.md | przejście na Qt 6: plan, przebieg, wydania próbne |
| docs/KATALOG_UI_4.md | katalog poprawek interfejsu 4.0 i decyzje projektowe |
| docs/ZGODNOSC_4_0.md | zgodność 4.0 z 3.x: skróty, czynności, rzeczy do sprawdzenia |
| docs/SKROTY_KLAWISZOWE.md | pełna lista skrótów |
| docs/SPECYFIKACJA_TECHNICZNA.md | schemat bazy, formaty plików wymiany |
| docs/MANIFEST_WERSJI_MOBILNEJ.md | zakres i stan wersji mobilnej |
Wersja mobilna
Katalog lms-mobile/ zawiera aplikację PWA (Flask) na terminal.
Jest zamrożona — desktop jest wersją podstawową. Wymiana danych odbywa się
plikiem: ekran Synchronizacja [F8] zapisuje plik dla terminala i wczytuje
sesje z powrotem.
Przed powrotem do tego wątku trzeba rozwiązać: brak uwierzytelniania w wersji mobilnej, podatność XSS i weryfikację PWA na fizycznym telefonie. Szczegóły w docs/MANIFEST_WERSJI_MOBILNEJ.md.
Zależności
| Biblioteka | Po co |
|---|---|
PySide6-Essentials |
interfejs (Qt 6: QtCore, QtGui, QtWidgets); licencja LGPLv3 — patrz NOTICE-Qt.txt |
openpyxl |
raporty .xlsx |
segno |
kod QR w podglądzie etykiety |
fonttools |
tylko do budowy fontu ikon i testów (requirements-dev.txt) |
Fonty i ikony — licencje
| Zasób | Licencja | Plik licencji |
|---|---|---|
Inter (Inter-*.ttf) |
SIL Open Font License 1.1 | assets/fonts/Inter-OFL.txt |
Ikony: wycinek Flaticon UIcons (LMS-Ikony.ttf) |
Flaticon License — użycie bezpłatne z podaniem autorstwa | assets/fonts/UIcons-LICENSE.txt |
Uicons by Flaticon. Podpis wymagany przez licencję stoi też w pasku stanu programu — nie usuwaj go bez wykupienia subskrypcji Flaticon Premium.
Nowa ikona: dopisz ją w lms/ui/ikony.py i uruchom
python tools/zbuduj_ikony.py <uicons-regular-rounded.woff> <rounded.css>
(pliki z pakietu npm @flaticon/flaticon-uicons).
Licencja
Kod źródłowy programu objęty jest licencją GNU General Public License v3.0 (GPLv3).
Copyright (C) 2026 Kamil Adamus kamil@adamus.cloud.
Pełna treść licencji znajduje się w pliku LICENSE.
Dołączone zasoby podlegają własnym licencjom:
- Krój pisma Inter: SIL Open Font License 1.1 (autor: Rasmus Andersson).
- Ikony LMS-Ikony: Flaticon License — bezpłatne użycie z podaniem autorstwa (Uicons by Flaticon).