feat(app): show each batch's story as a composite timeline

The Movement log (history + provenance DAG) was recorded but invisible.
A new history sheet on every lot tile narrates the batch: movements,
germination tests, storage checks and how it entered the collection
(origin attached), most-recent first. Two one-tap chips record 'sown
today' / 'harvested today' — the first UI door to the sown/harvested
movement types. No schema change; one-shot reads only (no live
subscriptions in a transient sheet).
This commit is contained in:
vjrj 2026-07-18 06:25:55 +02:00
parent 11cbdf3022
commit 92fd84590b
10 changed files with 835 additions and 2 deletions

View file

@ -85,6 +85,7 @@ class TranslationsEs extends Translations with BaseTranslations<AppLocale, Trans
@override late final _Translations$notifications$es notifications = _Translations$notifications$es._(_root);
@override late final _Translations$plantare$es plantare = _Translations$plantare$es._(_root);
@override late final _Translations$handover$es handover = _Translations$handover$es._(_root);
@override late final _Translations$history$es history = _Translations$history$es._(_root);
@override late final _Translations$sale$es sale = _Translations$sale$es._(_root);
@override late final _Translations$legal$es legal = _Translations$legal$es._(_root);
@override late final _Translations$marketGate$es marketGate = _Translations$marketGate$es._(_root);
@ -1021,6 +1022,32 @@ class _Translations$handover$es extends Translations$handover$en {
@override String get promiseReceived => 'Devolveré semilla';
}
// Path: history
class _Translations$history$es extends Translations$history$en {
_Translations$history$es._(TranslationsEs root) : this._root = root, super.internal(root);
final TranslationsEs _root; // ignore: unused_field
// Translations
@override String get title => 'Historia de este lote';
@override String get tooltip => 'Historia';
@override String get sowToday => 'Sembrado hoy';
@override String get harvestToday => 'Cosechado hoy';
@override String get sownRecorded => 'Siembra anotada';
@override String get harvestRecorded => 'Cosecha anotada';
@override String get movementReceived => 'Recibido';
@override String get movementGiven => 'Regalado';
@override String get movementSown => 'Sembrado';
@override String get movementHarvested => 'Cosechado';
@override String get movementGerminationTest => 'Prueba de germinación';
@override String get movementSplit => 'Repartido en lotes';
@override String get movementDiscarded => 'Descartado';
@override String get created => 'Entró en tu colección';
@override String from({required Object origin}) => 'De ${origin}';
@override String germinationResult({required Object percent}) => 'Prueba de germinación — ${percent}%';
@override String get linkedEarlier => 'Viene de un lote anterior';
}
// Path: sale
class _Translations$sale$es extends Translations$sale$en {
_Translations$sale$es._(TranslationsEs root) : this._root = root, super.internal(root);
@ -2011,6 +2038,23 @@ extension on TranslationsEs {
'handover.paymentChip' => 'Hubo dinero por medio',
'handover.promiseGave' => 'Me devolverán semilla',
'handover.promiseReceived' => 'Devolveré semilla',
'history.title' => 'Historia de este lote',
'history.tooltip' => 'Historia',
'history.sowToday' => 'Sembrado hoy',
'history.harvestToday' => 'Cosechado hoy',
'history.sownRecorded' => 'Siembra anotada',
'history.harvestRecorded' => 'Cosecha anotada',
'history.movementReceived' => 'Recibido',
'history.movementGiven' => 'Regalado',
'history.movementSown' => 'Sembrado',
'history.movementHarvested' => 'Cosechado',
'history.movementGerminationTest' => 'Prueba de germinación',
'history.movementSplit' => 'Repartido en lotes',
'history.movementDiscarded' => 'Descartado',
'history.created' => 'Entró en tu colección',
'history.from' => ({required Object origin}) => 'De ${origin}',
'history.germinationResult' => ({required Object percent}) => 'Prueba de germinación — ${percent}%',
'history.linkedEarlier' => 'Viene de un lote anterior',
'sale.title' => 'Ventas',
'sale.help' => 'Registra semilla vendida o comprada — dinero, Ğ1 o cualquier moneda. Un modelo aparte del regalo y del Plantare. Nunca se cobra comisión por las semillas.',
'sale.add' => 'Registrar venta',