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 e6e70e4b97
commit 491e079b50
12 changed files with 849 additions and 152 deletions

View file

@ -81,6 +81,7 @@ class Translations with BaseTranslations<AppLocale, Translations> {
late final Translations$wot$en wot = Translations$wot$en.internal(_root);
late final Translations$notifications$en notifications = Translations$notifications$en.internal(_root);
late final Translations$plantare$en plantare = Translations$plantare$en.internal(_root);
late final Translations$handover$en handover = Translations$handover$en.internal(_root);
late final Translations$sale$en sale = Translations$sale$en.internal(_root);
}
@ -1722,6 +1723,48 @@ class Translations$plantare$en {
String get removeConfirm => 'Remove this commitment?';
}
// Path: handover
class Translations$handover$en {
Translations$handover$en.internal(this._root);
final Translations _root; // ignore: unused_field
// Translations
/// en: 'Seeds changed hands'
String get title => 'Seeds changed hands';
/// en: 'A gift, a swap or a sale — note it down, with a return promise or without.'
String get help => 'A gift, a swap or a sale — note it down, with a return promise or without.';
/// en: 'I gave seeds'
String get iGave => 'I gave seeds';
/// en: 'I received seeds'
String get iReceived => 'I received seeds';
/// en: 'Which batch?'
String get whichLot => 'Which batch?';
/// en: 'How much?'
String get howMuch => 'How much?';
/// en: 'All of it'
String get allOfIt => 'All of it';
/// en: 'A part'
String get partOfIt => 'A part';
/// en: 'Money changed hands'
String get paymentChip => 'Money changed hands';
/// en: 'They'll return me seed'
String get promiseGave => 'They\'ll return me seed';
/// en: 'I'll return seed'
String get promiseReceived => 'I\'ll return seed';
}
// Path: sale
class Translations$sale$en {
Translations$sale$en.internal(this._root);
@ -2718,6 +2761,17 @@ extension on Translations {
'plantare.openSection' => 'Open',
'plantare.settledSection' => 'Done',
'plantare.removeConfirm' => 'Remove this commitment?',
'handover.title' => 'Seeds changed hands',
'handover.help' => 'A gift, a swap or a sale — note it down, with a return promise or without.',
'handover.iGave' => 'I gave seeds',
'handover.iReceived' => 'I received seeds',
'handover.whichLot' => 'Which batch?',
'handover.howMuch' => 'How much?',
'handover.allOfIt' => 'All of it',
'handover.partOfIt' => 'A part',
'handover.paymentChip' => 'Money changed hands',
'handover.promiseGave' => 'They\'ll return me seed',
'handover.promiseReceived' => 'I\'ll return seed',
'sale.title' => 'Sales',
'sale.help' => 'Record seed you sold or bought — money, Ğ1, or any currency. A separate model from a gift or a Plantare. No commission is ever taken on seeds.',
'sale.add' => 'Record a sale',