feat(handover): one hand-over sheet replaces the separate sale/plantare doors

'Seeds changed hands' is now the single entry point on the variety
detail (and per lot row): direction (gave/received), one-tap 'all of it'
(default — the whole-plant/shrub case), optional partial quantity,
counterparty, and reveal-on-tap money and return-promise sections that
spawn the Sale/Plantare rows through recordHandover in one save.

Zero-lot varieties still work (ledger rows only); several lots get a
chip picker. The Sales/Plantares screens keep their own add buttons for
off-app records — the sheets stay, demoted to secondary.

i18n handover block in en/es/pt/ast; widget tests for the flow.
This commit is contained in:
vjrj 2026-07-11 07:59:23 +02:00
parent 665e3e9452
commit 269fb59070
12 changed files with 849 additions and 152 deletions

View file

@ -80,6 +80,7 @@ class TranslationsAst extends Translations with BaseTranslations<AppLocale, Tran
@override late final _Translations$wot$ast wot = _Translations$wot$ast._(_root);
@override late final _Translations$notifications$ast notifications = _Translations$notifications$ast._(_root);
@override late final _Translations$plantare$ast plantare = _Translations$plantare$ast._(_root);
@override late final _Translations$handover$ast handover = _Translations$handover$ast._(_root);
@override late final _Translations$sale$ast sale = _Translations$sale$ast._(_root);
}
@ -897,6 +898,26 @@ class _Translations$plantare$ast extends Translations$plantare$en {
@override String get removeConfirm => '¿Quitar esti compromisu?';
}
// Path: handover
class _Translations$handover$ast extends Translations$handover$en {
_Translations$handover$ast._(TranslationsAst root) : this._root = root, super.internal(root);
final TranslationsAst _root; // ignore: unused_field
// Translations
@override String get title => 'Di o recibí semientes';
@override String get help => 'Un regalu, un truecu o una venta: apúntalo, con promesa de devolver semiente o ensin ella.';
@override String get iGave => 'Di semientes';
@override String get iReceived => 'Recibí semientes';
@override String get whichLot => '¿De qué llote?';
@override String get howMuch => '¿Cuánto?';
@override String get allOfIt => 'Too';
@override String get partOfIt => 'Una parte';
@override String get paymentChip => 'Hubo perres pel mediu';
@override String get promiseGave => 'Van devolveme semiente';
@override String get promiseReceived => 'Voi devolver semiente';
}
// Path: sale
class _Translations$sale$ast extends Translations$sale$en {
_Translations$sale$ast._(TranslationsAst root) : this._root = root, super.internal(root);
@ -1740,6 +1761,17 @@ extension on TranslationsAst {
'plantare.openSection' => 'Pendientes',
'plantare.settledSection' => 'Fechos',
'plantare.removeConfirm' => '¿Quitar esti compromisu?',
'handover.title' => 'Di o recibí semientes',
'handover.help' => 'Un regalu, un truecu o una venta: apúntalo, con promesa de devolver semiente o ensin ella.',
'handover.iGave' => 'Di semientes',
'handover.iReceived' => 'Recibí semientes',
'handover.whichLot' => '¿De qué llote?',
'handover.howMuch' => '¿Cuánto?',
'handover.allOfIt' => 'Too',
'handover.partOfIt' => 'Una parte',
'handover.paymentChip' => 'Hubo perres pel mediu',
'handover.promiseGave' => 'Van devolveme semiente',
'handover.promiseReceived' => 'Voi devolver semiente',
'sale.title' => 'Ventes',
'sale.help' => 'Rexistra semilla vendida o mercada — dineru, Ğ1 o cualquier moneda. Un modelu aparte del regalu y del Plantare. Enxamás se cobra comisión poles semilles.',
'sale.add' => 'Rexistrar venta',