motore di calcolo portato in JS ES5 con 30 test node; mappatura schermate dal codice Flutter e dagli screenshot
This commit is contained in:
@@ -1,34 +1,87 @@
|
||||
# harbour-henflow
|
||||
|
||||
Porting **nativo Sailfish OS** dell'app Android *Henflow* (`it.carlobaratto.henflow`,
|
||||
Gestione ordini uova, galline e consegne). UI in QML/Silica, logica e dati in C++,
|
||||
pubblicazione prevista sullo **store Jolla Harbour**.
|
||||
Porting **nativo Sailfish OS** dell'app Android *Henflow* (`it.carlobaratto.henflow`).
|
||||
UI in QML/Silica, calcolo e dati locali, pubblicazione prevista sullo
|
||||
**store Jolla Harbour**.
|
||||
|
||||
Il porting **non** usa il runtime Flutter community (`flutter-sailfishos`): quello
|
||||
resta una via OpenRepos, non Harbour-safe, e non supporta i plugin nativi Android
|
||||
(AdMob/Firebase/Billing). Dati locali sul telefono: nessun account, nessun cloud.
|
||||
Il porting **non** usa il runtime Flutter community (`flutter-sailfishos`):
|
||||
quello resta una via OpenRepos, non Harbour-safe, e non supporta i plugin nativi
|
||||
Android (AdMob/File picker/Share). Nessun account, nessun cloud, come l'originale.
|
||||
|
||||
## Sorgenti di riferimento
|
||||
|
||||
- Flutter (originale): `workspace/henflow-flutter` — export da Nextcloud, repo Gitea `HenFlow`.
|
||||
- Screenshot dello store usati come riferimento UI.
|
||||
|
||||
## Stato
|
||||
|
||||
Guscio completo e pronto alla prima build (finestra, pagina principale, cover,
|
||||
impostazioni con lingua, icone, catalogo traduzioni, spec RPM). Le schermate sono
|
||||
segnaposto: vanno mappate 1:1 dai sorgenti Flutter.
|
||||
| parte | stato |
|
||||
|---|---|
|
||||
| Packaging (spec RPM, desktop SailJail, icone, i18n) | pronto |
|
||||
| Guscio app (finestra, cover, Settings con lingua) | pronto |
|
||||
| Motore di calcolo (`qml/js/henflow.js`) | portato e verificato con node |
|
||||
| Schermate QML | da implementare |
|
||||
|
||||
## Struttura
|
||||
|
||||
```
|
||||
harbour-henflow.pro # QT += quick qml, INSTALLS icone
|
||||
rpm/harbour-henflow.spec # lrelease + desktop cercati con find (layout sorgente variabile)
|
||||
harbour-henflow.pro # QT += quick qml, INSTALLS icone
|
||||
rpm/harbour-henflow.spec # lrelease + desktop cercati con find (layout sorgente variabile)
|
||||
rpm/harbour-henflow.desktop # profilo [X-Sailjail] esplicito (dati persistenti)
|
||||
src/main.cpp # SailfishApp, context property appSettings, lingua
|
||||
src/settings.h/.cpp # QSettings su path esplicito AppConfigLocation + sync()
|
||||
qml/harbour-henflow.qml # ApplicationWindow: initialPage + cover
|
||||
qml/pages/MainPage.qml # segnaposto con i moduli previsti
|
||||
qml/cover/CoverPage.qml
|
||||
icons/make_icons.py # icone 86/108/128/172 (PIL)
|
||||
translations/*.ts # stringhe sorgente INGLESI + catalogo italiano
|
||||
src/main.cpp # SailfishApp, context property appSettings, lingua
|
||||
src/settings.h/.cpp # QSettings su path esplicito AppConfigLocation + sync()
|
||||
qml/harbour-henflow.qml # ApplicationWindow: initialPage + cover
|
||||
qml/pages/MainPage.qml # indice dei moduli (segnaposto)
|
||||
qml/js/henflow.js # motore di calcolo (ES5, testabile con node)
|
||||
tests/engine.test.js # 30 controlli: node tests/engine.test.js
|
||||
icons/make_icons.py # icone 86/108/128/172 (PIL)
|
||||
translations/*.ts # stringhe sorgente INGLESI + catalogo italiano
|
||||
```
|
||||
|
||||
## Motore di calcolo (portato fedelmente da `lib/main.dart`)
|
||||
|
||||
- **Produzione stimata** per razza = galline in deposizione x uova/gallina/giorno
|
||||
(catalogo: tutte 1.0). Una gallina conta da **6 mesi** in su (`_ageInMonths`).
|
||||
- **Magazzino**: all'apertura, i giorni passati dall'ultimo aggiornamento
|
||||
aggiungono la produzione giornaliera alle scorte di ogni razza attiva.
|
||||
- **Coda FIFO**: ordini in ordine di creazione; ognuno consuma le scorte virtuali
|
||||
della sua razza, chi le trova consegna oggi, gli altri aspettano
|
||||
`ceil(uova_mancanti / produzione)` giorni. Gli ordini gia' consegnati non
|
||||
consumano scorte.
|
||||
- **Stima per un nuovo ordine**: `ceil((pendenti + richieste - scorte) / produzione)`.
|
||||
|
||||
Le date sono sempre normalizzate a `YYYY-MM-DD` e le funzioni non mutano l'input.
|
||||
|
||||
## Modello dati (fedele a `StorageService`, SharedPreferences + JSON)
|
||||
|
||||
| chiave | contenuto |
|
||||
|---|---|
|
||||
| `breed_settings_v2` | `[{breedId, hens:[{id, name, birthDate, isLaying}]}]` |
|
||||
| `reservations_v2` | `[{id, customerName, breedId, eggsRequested, createdAt, deliveryDate, isDelivered}]` |
|
||||
| `customers_v1` | `[{id, firstName, lastName, phoneNumber}]` |
|
||||
| `warehouse_stock_v1` | `{breedId: uova}` |
|
||||
| `last_production_update_v1` | data ISO dell'ultimo accrual |
|
||||
|
||||
Nel porting: un unico file JSON in `~/.config/harbour/henflow/` (nessuna
|
||||
dipendenza extra, nessun driver SQL da verificare sul device) con la stessa
|
||||
struttura, cosi' il backup/ripristino resta compatibile con l'app Android.
|
||||
|
||||
## Schermate mappate (da sorgenti + screenshot)
|
||||
|
||||
| schermata Flutter | contenuto | porting |
|
||||
|---|---|---|
|
||||
| `OnboardingPage` | 4 passi introduttivi | da fare |
|
||||
| `ModeSelectionPage` | modalita' allevatore / cliente | da decidere |
|
||||
| `HomePage` | tab *Orders list* / *Calendar* (+ magazzino), card produzione stimata, card ordini con stato e azioni (condividi/modifica/elimina), FAB *New order* | da fare |
|
||||
| `SettingsPage` | tab *Available breeds* (catalogo con foto e spunta) / *My coop* (galline registrate, in deposizione, produzione) + backup/ripristino JSON + lingua | da fare |
|
||||
| `BreedDetailPage` | galline della razza, eta' in mesi, stato deposizione | da fare |
|
||||
| `CustomersPage` + dialoghi | anagrafica clienti, nuovo ordine | da fare |
|
||||
| `AboutPage` | info app | da fare |
|
||||
| `CoopIcon` (CustomPainter) | icona pollaio disegnata a mano | da ridisegnare (Canvas QML o PNG) |
|
||||
|
||||
Differenze da tenere presenti: **niente annunci** (AdMob non esiste su Sailfish),
|
||||
**share/export** via file JSON in Download invece di `share_plus`/`file_picker`.
|
||||
|
||||
## Build e deploy
|
||||
|
||||
Sul PC con l'SDK Sailfish (qui non c'e' sfdk):
|
||||
@@ -45,32 +98,10 @@ Tarball per lo store (con `--prefix`, esclude .git e i file non tracciati):
|
||||
git archive --format=tar.gz --prefix=harbour-henflow-0.1.0/ -o harbour-henflow-0.1.0.tar.gz HEAD
|
||||
```
|
||||
|
||||
## Modello dati proposto (da confermare sui sorgenti Flutter)
|
||||
## Aperti
|
||||
|
||||
Un file JSON in `AppConfigLocation` (`~/.config/harbour/henflow/henflow.json`)
|
||||
e' sufficiente: nessuna dipendenza extra e nessun driver SQL da verificare sul
|
||||
device. SQLite resta l'alternativa se servono query piu' ricche.
|
||||
|
||||
| entita' | campi |
|
||||
|---|---|
|
||||
| `hens` | id, nome, razza, data_nascita, uova_settimana (stima), attiva, note |
|
||||
| `egg_log` | data, uova_raccolte (+ eventuale id gallina) |
|
||||
| `customers` | id, nome, telefono, quantita_abituale, giorno_consegna, note |
|
||||
| `orders` | id, id_cliente, quantita, data_ordine, data_consegna, stato, note |
|
||||
|
||||
Derivati: **uova disponibili oggi** = produzione stimata/registrata meno gli ordini
|
||||
con data di consegna odierna; **data consegna automatica** = primo giorno di
|
||||
consegna del cliente successivo all'ordine.
|
||||
|
||||
## Prossimi passi
|
||||
|
||||
1. Copiare i sorgenti Flutter sul server (vedi sotto).
|
||||
2. Mappare schermate e campi reali (non la descrizione dello store).
|
||||
3. Implementare storage + schermate, verifica su device (192.168.2.15).
|
||||
4. Asset store (icona, cover 1080x540), descrizioni EN, upload Harbour.
|
||||
|
||||
```sh
|
||||
# dal PC con i sorgenti Flutter (LAN o VPN)
|
||||
rsync -av --exclude build --exclude .dart_tool --exclude .git \
|
||||
~/percorso/henflow/ kaneda@192.168.3.21:/home/kaneda/workspace/henflow-flutter/
|
||||
```
|
||||
1. **Asset**: nel materiale di Nextcloud mancano `assets/breeds/*.jpg` (7 foto)
|
||||
e `pubspec.yaml`.
|
||||
2. **Repo Gitea `HenFlow`**: cancellata (era un upload parziale); per ricrearla
|
||||
serve un permesso che il token attuale non ha (`write:user`).
|
||||
3. **Ambito**: modalita' cliente e 4 lingue (EN/IT/FR/DE) da confermare.
|
||||
|
||||
Reference in New Issue
Block a user