|
4 | 4 |
|
5 | 5 | # Lagerverwaltung |
6 | 6 |
|
7 | | -Terminalbasierte Lagerverwaltung fuer kleine bis mittlere Teilelager mit Shopify-Anbindung, Lagerplatzlogik, Picklisten, Lieferscheinen, Inventur und Labeldruck. |
| 7 | +Terminalbasierte Lagerverwaltung mit Lagerplatzpflege, Bestellansicht, Inventur, Shopify-Anbindung und Versandabwicklung. |
8 | 8 |
|
9 | 9 | Lizenz: [MIT](/home/chrisi/Lagerverwaltung/LICENSE) |
10 | 10 |
|
11 | | -## Funktionen |
| 11 | +## Kernfunktionen |
12 | 12 |
|
13 | | -- Artikel suchen, bearbeiten und lokal anlegen |
14 | | -- Lagerplaetze nach `Regal / Fach / Platz` pflegen |
15 | | -- Bestellungen aus Shopify synchronisieren |
16 | | -- Zahlungs- und Fulfillment-Status im Auftragsfenster anzeigen |
17 | | -- Picklisten per Drucker drucken |
18 | | -- Lieferscheine als PDF erzeugen oder per Drucker drucken |
19 | | -- Brother-QL-Etiketten drucken |
20 | | -- Inventur starten, zaehlen, exportieren und uebernehmen |
21 | | -- extern gelagerte Fulfillment-Artikel ausblenden |
| 13 | +- Artikel, Lagerplaetze und Bestandsmengen pflegen |
| 14 | +- Bestellungen aus Shopify einlesen und im Auftragsfenster bearbeiten |
| 15 | +- Picklisten, Lieferscheine und Versandlabels erzeugen |
| 16 | +- Versand mit GLS, Deutsche Post INTERNETMARKE und Adresslabels |
| 17 | +- Teilausfuehrung, Bulk-Ausfuehrung und Versandhistory |
| 18 | +- Inventur mit Snapshot, CSV-Export und Uebernahme |
| 19 | +- lokale Bundle-Dateien fuer neue Arbeitsplaetze |
22 | 20 |
|
23 | | -## Projektstruktur |
| 21 | +## Aktueller Versandstand |
24 | 22 |
|
25 | | -- [lager_mc.py](/home/chrisi/Lagerverwaltung/lager_mc.py) |
26 | | - Hauptanwendung fuer Lager, Bestellungen und Inventur. |
27 | | -- [label_print.py](/home/chrisi/Lagerverwaltung/label_print.py) |
28 | | - Etikettendruck fuer Brother-QL-Drucker. |
29 | | -- [delivery_note.py](/home/chrisi/Lagerverwaltung/delivery_note.py) |
30 | | - PDF-Erzeugung fuer Lieferscheine auf Basis der Vorlage. |
31 | | -- [app_settings.py](/home/chrisi/Lagerverwaltung/app_settings.py) |
32 | | - Laedt Projekt-Defaults und lokale Overrides. |
33 | | -- [app_version.py](/home/chrisi/Lagerverwaltung/app_version.py) |
34 | | - Zentrale Versionsdefinition fuer Release- und Entwicklungsstaende. |
35 | | -- [settings.json](/home/chrisi/Lagerverwaltung/settings.json) |
36 | | - Versionierte Standardkonfiguration des Projekts. |
37 | | -- [CHANGELOG.md](/home/chrisi/Lagerverwaltung/CHANGELOG.md) |
38 | | - Release-Historie fuer Stande auf `main`. |
39 | | -- [RELEASE.md](/home/chrisi/Lagerverwaltung/RELEASE.md) |
40 | | - Branching-, Release- und Changelog-Regeln. |
41 | | -- [shopify-sync/shopify_sync.py](/home/chrisi/Lagerverwaltung/shopify-sync/shopify_sync.py) |
42 | | - Separater Shopify-Sync fuer Produkte, Bestand und Bestellungen. |
43 | | -- [shopify-sync/sync_version.py](/home/chrisi/Lagerverwaltung/shopify-sync/sync_version.py) |
44 | | - Eigene Versionsquelle fuer den separaten Shopify-Sync. |
45 | | -- [shopify-sync/CHANGELOG.md](/home/chrisi/Lagerverwaltung/shopify-sync/CHANGELOG.md) |
46 | | - Release-Historie nur fuer den Shopify-Sync. |
47 | | -- [post/internetmarke_client.py](/home/chrisi/Lagerverwaltung/post/internetmarke_client.py) |
48 | | - Vorbereitung fuer Deutsche Post INTERNETMARKE. |
| 23 | +Produktive Carrier-Integrationen: |
49 | 24 |
|
50 | | -## Voraussetzungen |
| 25 | +- `GLS` |
| 26 | +- `Deutsche Post INTERNETMARKE` |
51 | 27 |
|
52 | | -- Python 3.11+ |
53 | | -- PostgreSQL |
54 | | -- `curses` |
55 | | -- fuer Labeldruck: `Pillow`, `python-barcode`, `brother_ql` |
56 | | -- fuer Listen-/Lieferschein-Druck: Drucksystem mit `lp` |
57 | | -- fuer HTML/CSS-Lieferscheine: `WeasyPrint` (inkl. Systembibliotheken wie cairo/pango) |
| 28 | +Zusaetzlich vorhanden: |
58 | 29 |
|
59 | | -Die Anwendung erweitert benoetigte Datenbankspalten und legt die Tabellen fuer Bestellungen und Inventur bei Bedarf selbst an. |
| 30 | +- `Adresslabel` fuer interne Labels ohne Carrier-API |
60 | 31 |
|
61 | | -## Konfiguration |
| 32 | +Die Carrier-Struktur verwendet zentrale Carrier-Definitionen mit gemeinsamer Versandhistory und Shopify-Anbindung. |
62 | 33 |
|
63 | | -Es gibt zwei Ebenen: |
| 34 | +## Dokumentation |
64 | 35 |
|
65 | | -- [settings.json](/home/chrisi/Lagerverwaltung/settings.json) |
66 | | - versionierte Projekt-Defaults |
67 | | -- `settings.local.json` |
68 | | - lokale, nicht versionierte Laufzeitwerte |
| 36 | +- Bedienungsanleitung: [docs/bedienungsanleitung.md](/home/chrisi/Lagerverwaltung/docs/bedienungsanleitung.md) |
| 37 | +- Versand-Integrationsdoku: [docs/versanddienstleister.md](/home/chrisi/Lagerverwaltung/docs/versanddienstleister.md) |
| 38 | +- English README: [README.en.md](/home/chrisi/Lagerverwaltung/README.en.md) |
| 39 | +- English user manual: [docs/bedienungsanleitung.en.md](/home/chrisi/Lagerverwaltung/docs/bedienungsanleitung.en.md) |
| 40 | +- English shipping integration notes: [docs/shipping-providers.en.md](/home/chrisi/Lagerverwaltung/docs/shipping-providers.en.md) |
| 41 | +- Release-Historie: [CHANGELOG.md](/home/chrisi/Lagerverwaltung/CHANGELOG.md) |
| 42 | +- GitHub Releases: <https://github.com/xoquox/Lagerverwaltung/releases> |
69 | 43 |
|
| 44 | +## Varianten |
70 | 45 |
|
71 | | -Wichtige Einstellungen: |
72 | | - |
73 | | -- `db_host`, `db_name`, `db_user`, `db_pass` |
74 | | -- `language` (`de` oder `en`) |
75 | | -- `color_theme` (`blue`, `green`, `mono`, `megatrends`, `smoth`, `norton`, `gold-standard`, `subtile`, `monokai`) |
76 | | -- `color_theme_file` (optional, Pfad zu eigener JSON-Datei mit Themes) |
77 | | -- `printer_uri`, `printer_model`, `label_size` |
78 | | -- `label_font_regular`, `label_font_condensed` (optional, lokale TrueType/OpenType Fonts fuer Labeldruck) |
79 | | -- `location_regex_regal`, `location_regex_fach`, `location_regex_platz` |
80 | | -- `picklist_printer` |
81 | | -- `delivery_note_printer` |
82 | | -- `pdf_output_dir` |
83 | | -- `delivery_note_template_path` (optional, lokaler Pfad zur PDF-Vorlage ausserhalb von Git) |
84 | | -- `delivery_note_logo_source` (optional, lokaler Pfad oder `https://`-URL fuer das Logo) |
85 | | -- `delivery_note_sender_name` |
86 | | -- `delivery_note_sender_street` |
87 | | -- `delivery_note_sender_city` |
88 | | -- `delivery_note_sender_email` |
89 | | -- `shipping_carrier` |
90 | | -- `shipping_label_printer_gls`, `shipping_label_printer_dhl`, `shipping_label_printer_post` |
91 | | -- `shipping_label_format_gls`, `shipping_label_format_dhl`, `shipping_label_format_post` |
92 | | -- `shipping_label_printer`, `shipping_label_format` (Fallback/Legacy) |
93 | | -- `shipping_services`, `shipping_packaging_weight_grams` |
94 | | -- `gls_api_url`, `gls_user`, `gls_password`, `gls_contact_id` |
95 | | -- `post_api_url`, `post_user`, `post_password`, `post_partner_id` |
96 | | - |
97 | | -## Entwicklung und Releases |
98 | | - |
99 | | -- `main` bleibt produktiv und enthaelt nur getestete Releases. |
100 | | -- `develop` ist der Integrationsbranch fuer neue Arbeit. |
101 | | -- Neue Aufgaben starten in `feature/*` und werden erst nach `develop`, dann nach `main` uebernommen. |
102 | | -- `CHANGELOG.md` wird nur beim Merge eines fertigen Stands nach `main` ergaenzt. |
103 | | -- `app_version.py` fuehrt die sichtbare Versionsnummer: |
104 | | - - Release auf `main`: z. B. `1.21.0` |
105 | | - - Entwicklungsstand auf `develop`: z. B. `1.21.0-dev` |
106 | | -- Der Shopify-Sync hat zusaetzlich eine eigene Versionsquelle in [sync_version.py](/home/chrisi/Lagerverwaltung/shopify-sync/sync_version.py) |
107 | | - und ein eigenes Sync-Changelog in [shopify-sync/CHANGELOG.md](/home/chrisi/Lagerverwaltung/shopify-sync/CHANGELOG.md). |
108 | | -- Release-Eintraege in [CHANGELOG.md](/home/chrisi/Lagerverwaltung/CHANGELOG.md) enthalten die zugehoerige Sync-Version |
109 | | - und verweisen auf das separate Sync-Changelog. |
110 | | - |
111 | | -## Shopify-Sync |
112 | | - |
113 | | -Der Sync laeuft getrennt von der TUI und kann direkt oder im Container gestartet werden. |
114 | | -Er hat eine eigene Versionierung und ein eigenes Changelog: |
115 | | - |
116 | | -- [shopify-sync/sync_version.py](/home/chrisi/Lagerverwaltung/shopify-sync/sync_version.py) |
117 | | -- [shopify-sync/CHANGELOG.md](/home/chrisi/Lagerverwaltung/shopify-sync/CHANGELOG.md) |
118 | | - |
119 | | -Mindestens benoetigte Shopify-Scopes: |
120 | | - |
121 | | -- `read_products` |
122 | | -- `read_inventory` |
123 | | -- `write_inventory` |
124 | | -- `read_locations` |
125 | | -- `read_orders` |
126 | | - |
127 | | -Zusaetzlich: |
128 | | - |
129 | | -- `read_all_orders` |
130 | | - falls Bestellungen aelter als 60 Tage geladen werden sollen |
131 | | - |
132 | | -Der Sync schreibt unter anderem: |
133 | | - |
134 | | -- Bestellungen und Positionen |
135 | | -- Fulfillment-Status |
136 | | -- Zahlungsstatus |
137 | | - |
138 | | -Version der laufenden Sync-Instanz abfragen: |
139 | | - |
140 | | -```bash |
141 | | -python3 shopify-sync/shopify_sync.py --version |
142 | | -python3 shopify-sync/shopify_sync.py version --json |
143 | | -``` |
144 | | - |
145 | | -Im Docker-Container typischerweise: |
146 | | - |
147 | | -```bash |
148 | | -docker exec -it shopify-sync python /app/shopify_sync.py --version |
149 | | -docker exec -it shopify-sync python /app/shopify_sync.py version --json |
150 | | -``` |
151 | | - |
152 | | -Die JSON-Ausgabe liefert Service, Version und Zeitstempel der laufenden Sync-Instanz. |
153 | | - |
154 | | -## Installation |
155 | | - |
156 | | -Automatische Installation fuer die meisten Linux-Distributionen: |
157 | | - |
158 | | -```bash |
159 | | -git clone <repo-url> |
160 | | -cd Lagerverwaltung |
161 | | -./scripts/install-linux.sh |
162 | | -``` |
163 | | - |
164 | | -Das Script erkennt `dnf`, `apt`, `pacman` oder `zypper` automatisch, installiert Systempakete, erstellt `.venv` und legt einen Starter unter `~/.local/bin/lager-mc` an. |
165 | | - |
166 | | -Manueller Start ohne Install-Script: |
167 | | - |
168 | | -```bash |
169 | | -git clone <repo-url> |
170 | | -cd Lagerverwaltung |
171 | | -python3 -m py_compile lager_mc.py |
172 | | -python3 lager_mc.py |
173 | | -``` |
174 | | - |
175 | | -Falls Pakete fehlen: |
176 | | - |
177 | | -```bash |
178 | | -pip install psycopg2-binary pillow python-barcode brother_ql requests python-dotenv |
179 | | -``` |
180 | | - |
181 | | -## Druck |
182 | | - |
183 | | -### Labeldruck |
184 | | - |
185 | | -Etiketten werden ueber [label_print.py](/home/chrisi/Lagerverwaltung/label_print.py) erzeugt. Unterstuetzt werden Brother-QL-Netzwerkdrucker. |
186 | | - |
187 | | -Wenn gewuenscht, koennen benutzerdefinierte lokale Fontdateien in den Einstellungen gesetzt werden: |
188 | | - |
189 | | -```json |
190 | | -{ |
191 | | - "label_font_regular": "/pfad/zu/deinem/font-regular.ttf", |
192 | | - "label_font_condensed": "/pfad/zu/deinem/font-condensed.ttf" |
193 | | -} |
194 | | -``` |
195 | | - |
196 | | -### Picklisten |
197 | | - |
198 | | -Picklisten werden textbasiert ueber den in den Einstellungen hinterlegten Drucker gesendet. |
199 | | - |
200 | | -### Lieferscheine |
201 | | - |
202 | | -Lieferscheine werden standardmaessig ueber HTML/CSS mit WeasyPrint erzeugt. |
203 | | -`delivery_note_template_path` kann optional auf eine `.html`/`.htm`-Datei zeigen, um das Layout frei anzupassen. |
204 | | -Wenn stattdessen eine `.pdf`-Vorlage hinterlegt wird, nutzt die Anwendung den Legacy-PDF-Renderer. |
205 | | - |
206 | | -Beispiel (`settings.local.json`): |
207 | | - |
208 | | -```json |
209 | | -{ |
210 | | - "delivery_note_template_path": "/home/<user>/Dokumente/lager/lieferschein_template.html", |
211 | | - "delivery_note_logo_source": "https://example.com/logo.png" |
212 | | -} |
213 | | -``` |
214 | | - |
215 | | -Unterstuetzt werden: |
216 | | - |
217 | | -- PDF-Export |
218 | | -- getrennten Drucker |
219 | | -- mehrseitige Ausgabe |
220 | | -- Seitennummerierung |
221 | | - |
222 | | -## Logging |
223 | | - |
224 | | -Rotierende Logdateien liegen unter [logs](/home/chrisi/Lagerverwaltung/logs): |
225 | | - |
226 | | -- [logs/lagerverwaltung.log](/home/chrisi/Lagerverwaltung/logs/lagerverwaltung.log) |
227 | | -- [logs/druck.log](/home/chrisi/Lagerverwaltung/logs/druck.log) |
228 | | - |
229 | | -Beispiel: |
230 | | - |
231 | | -```bash |
232 | | -export LAGERVERWALTUNG_LOG_LEVEL=DEBUG |
233 | | -``` |
234 | | - |
235 | | -## Tests |
236 | | - |
237 | | -```bash |
238 | | -python3 -m unittest discover -s tests -v |
239 | | -``` |
240 | | -- In den Einstellungen koennen `language` und `color_theme` ueber eine Auswahl (F4) gewaehlt werden, ohne Werte manuell zu tippen. |
241 | | - |
242 | | -Beispiel fuer eigene Themes (`color_theme_file`): |
243 | | - |
244 | | -```json |
245 | | -{ |
246 | | - "themes": { |
247 | | - "my-blue": { |
248 | | - "pair_1_fg": "white", |
249 | | - "pair_1_bg": "blue", |
250 | | - "pair_2_fg": "black", |
251 | | - "pair_2_bg": "cyan", |
252 | | - "pair_3_fg": "white", |
253 | | - "pair_3_bg": "black" |
254 | | - } |
255 | | - } |
256 | | -} |
257 | | -``` |
258 | | - |
259 | | -Erlaubte Farbnamen: `black`, `red`, `green`, `brown`, `yellow`, `blue`, `magenta`, `cyan`, `white`, |
260 | | -`brightblack`, `brightred`, `brightgreen`, `brightyellow`, `brightblue`, `brightmagenta`, `brightcyan`, `brightwhite`. |
| 46 | +- Fork mit den Kernfunktionen fuer Lagerverwaltung ohne Shopify-Integration und Versand: [simple-storage-core](https://github.com/b4ckspace/simple-storage-core) |
0 commit comments