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:
parent
665e3e9452
commit
269fb59070
12 changed files with 849 additions and 152 deletions
|
|
@ -619,6 +619,19 @@
|
|||
"settledSection": "Fechos",
|
||||
"removeConfirm": "¿Quitar esti compromisu?"
|
||||
},
|
||||
"handover": {
|
||||
"title": "Di o recibí semientes",
|
||||
"help": "Un regalu, un truecu o una venta: apúntalo, con promesa de devolver semiente o ensin ella.",
|
||||
"iGave": "Di semientes",
|
||||
"iReceived": "Recibí semientes",
|
||||
"whichLot": "¿De qué llote?",
|
||||
"howMuch": "¿Cuánto?",
|
||||
"allOfIt": "Too",
|
||||
"partOfIt": "Una parte",
|
||||
"paymentChip": "Hubo perres pel mediu",
|
||||
"promiseGave": "Van devolveme semiente",
|
||||
"promiseReceived": "Voi devolver semiente"
|
||||
},
|
||||
"sale": {
|
||||
"title": "Ventes",
|
||||
"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.",
|
||||
|
|
|
|||
|
|
@ -622,6 +622,19 @@
|
|||
"settledSection": "Done",
|
||||
"removeConfirm": "Remove this commitment?"
|
||||
},
|
||||
"handover": {
|
||||
"title": "Seeds changed hands",
|
||||
"help": "A gift, a swap or a sale — note it down, with a return promise or without.",
|
||||
"iGave": "I gave seeds",
|
||||
"iReceived": "I received seeds",
|
||||
"whichLot": "Which batch?",
|
||||
"howMuch": "How much?",
|
||||
"allOfIt": "All of it",
|
||||
"partOfIt": "A part",
|
||||
"paymentChip": "Money changed hands",
|
||||
"promiseGave": "They'll return me seed",
|
||||
"promiseReceived": "I'll return seed"
|
||||
},
|
||||
"sale": {
|
||||
"title": "Sales",
|
||||
"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.",
|
||||
|
|
|
|||
|
|
@ -621,6 +621,19 @@
|
|||
"settledSection": "Hechos",
|
||||
"removeConfirm": "¿Quitar este compromiso?"
|
||||
},
|
||||
"handover": {
|
||||
"title": "Di o recibí semillas",
|
||||
"help": "Un regalo, un trueque o una venta: apúntalo, con promesa de devolver semilla o sin ella.",
|
||||
"iGave": "Di semillas",
|
||||
"iReceived": "Recibí semillas",
|
||||
"whichLot": "¿De qué lote?",
|
||||
"howMuch": "¿Cuánto?",
|
||||
"allOfIt": "Todo",
|
||||
"partOfIt": "Una parte",
|
||||
"paymentChip": "Hubo dinero por medio",
|
||||
"promiseGave": "Me devolverán semilla",
|
||||
"promiseReceived": "Devolveré semilla"
|
||||
},
|
||||
"sale": {
|
||||
"title": "Ventas",
|
||||
"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.",
|
||||
|
|
|
|||
|
|
@ -618,6 +618,19 @@
|
|||
"settledSection": "Feitos",
|
||||
"removeConfirm": "Remover este compromisso?"
|
||||
},
|
||||
"handover": {
|
||||
"title": "Dei ou recebi sementes",
|
||||
"help": "Uma oferta, uma troca ou uma venda: anota-o, com promessa de devolver semente ou sem ela.",
|
||||
"iGave": "Dei sementes",
|
||||
"iReceived": "Recebi sementes",
|
||||
"whichLot": "De que lote?",
|
||||
"howMuch": "Quanto?",
|
||||
"allOfIt": "Tudo",
|
||||
"partOfIt": "Uma parte",
|
||||
"paymentChip": "Houve dinheiro pelo meio",
|
||||
"promiseGave": "Vão devolver-me semente",
|
||||
"promiseReceived": "Vou devolver semente"
|
||||
},
|
||||
"sale": {
|
||||
"title": "Vendas",
|
||||
"help": "Regista semente vendida ou comprada — dinheiro, Ğ1 ou qualquer moeda. Um modelo separado do presente e do Plantare. Nunca se cobra comissão pelas sementes.",
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@
|
|||
/// To regenerate, run: `dart run slang`
|
||||
///
|
||||
/// Locales: 4
|
||||
/// Strings: 1976 (494 per locale)
|
||||
/// Strings: 2020 (505 per locale)
|
||||
///
|
||||
/// Built on 2026-07-11 at 06:00 UTC
|
||||
|
||||
|
|
|
|||
|
|
@ -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',
|
||||
|
|
|
|||
|
|
@ -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',
|
||||
|
|
|
|||
|
|
@ -80,6 +80,7 @@ class TranslationsEs extends Translations with BaseTranslations<AppLocale, Trans
|
|||
@override late final _Translations$wot$es wot = _Translations$wot$es._(_root);
|
||||
@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$sale$es sale = _Translations$sale$es._(_root);
|
||||
}
|
||||
|
||||
|
|
@ -899,6 +900,26 @@ class _Translations$plantare$es extends Translations$plantare$en {
|
|||
@override String get removeConfirm => '¿Quitar este compromiso?';
|
||||
}
|
||||
|
||||
// Path: handover
|
||||
class _Translations$handover$es extends Translations$handover$en {
|
||||
_Translations$handover$es._(TranslationsEs root) : this._root = root, super.internal(root);
|
||||
|
||||
final TranslationsEs _root; // ignore: unused_field
|
||||
|
||||
// Translations
|
||||
@override String get title => 'Di o recibí semillas';
|
||||
@override String get help => 'Un regalo, un trueque o una venta: apúntalo, con promesa de devolver semilla o sin ella.';
|
||||
@override String get iGave => 'Di semillas';
|
||||
@override String get iReceived => 'Recibí semillas';
|
||||
@override String get whichLot => '¿De qué lote?';
|
||||
@override String get howMuch => '¿Cuánto?';
|
||||
@override String get allOfIt => 'Todo';
|
||||
@override String get partOfIt => 'Una parte';
|
||||
@override String get paymentChip => 'Hubo dinero por medio';
|
||||
@override String get promiseGave => 'Me devolverán semilla';
|
||||
@override String get promiseReceived => 'Devolveré semilla';
|
||||
}
|
||||
|
||||
// Path: sale
|
||||
class _Translations$sale$es extends Translations$sale$en {
|
||||
_Translations$sale$es._(TranslationsEs root) : this._root = root, super.internal(root);
|
||||
|
|
@ -1744,6 +1765,17 @@ extension on TranslationsEs {
|
|||
'plantare.openSection' => 'Pendientes',
|
||||
'plantare.settledSection' => 'Hechos',
|
||||
'plantare.removeConfirm' => '¿Quitar este compromiso?',
|
||||
'handover.title' => 'Di o recibí semillas',
|
||||
'handover.help' => 'Un regalo, un trueque o una venta: apúntalo, con promesa de devolver semilla o sin ella.',
|
||||
'handover.iGave' => 'Di semillas',
|
||||
'handover.iReceived' => 'Recibí semillas',
|
||||
'handover.whichLot' => '¿De qué lote?',
|
||||
'handover.howMuch' => '¿Cuánto?',
|
||||
'handover.allOfIt' => 'Todo',
|
||||
'handover.partOfIt' => 'Una parte',
|
||||
'handover.paymentChip' => 'Hubo dinero por medio',
|
||||
'handover.promiseGave' => 'Me devolverán semilla',
|
||||
'handover.promiseReceived' => 'Devolveré semilla',
|
||||
'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',
|
||||
|
|
|
|||
|
|
@ -80,6 +80,7 @@ class TranslationsPt extends Translations with BaseTranslations<AppLocale, Trans
|
|||
@override late final _Translations$wot$pt wot = _Translations$wot$pt._(_root);
|
||||
@override late final _Translations$notifications$pt notifications = _Translations$notifications$pt._(_root);
|
||||
@override late final _Translations$plantare$pt plantare = _Translations$plantare$pt._(_root);
|
||||
@override late final _Translations$handover$pt handover = _Translations$handover$pt._(_root);
|
||||
@override late final _Translations$sale$pt sale = _Translations$sale$pt._(_root);
|
||||
}
|
||||
|
||||
|
|
@ -896,6 +897,26 @@ class _Translations$plantare$pt extends Translations$plantare$en {
|
|||
@override String get removeConfirm => 'Remover este compromisso?';
|
||||
}
|
||||
|
||||
// Path: handover
|
||||
class _Translations$handover$pt extends Translations$handover$en {
|
||||
_Translations$handover$pt._(TranslationsPt root) : this._root = root, super.internal(root);
|
||||
|
||||
final TranslationsPt _root; // ignore: unused_field
|
||||
|
||||
// Translations
|
||||
@override String get title => 'Dei ou recebi sementes';
|
||||
@override String get help => 'Uma oferta, uma troca ou uma venda: anota-o, com promessa de devolver semente ou sem ela.';
|
||||
@override String get iGave => 'Dei sementes';
|
||||
@override String get iReceived => 'Recebi sementes';
|
||||
@override String get whichLot => 'De que lote?';
|
||||
@override String get howMuch => 'Quanto?';
|
||||
@override String get allOfIt => 'Tudo';
|
||||
@override String get partOfIt => 'Uma parte';
|
||||
@override String get paymentChip => 'Houve dinheiro pelo meio';
|
||||
@override String get promiseGave => 'Vão devolver-me semente';
|
||||
@override String get promiseReceived => 'Vou devolver semente';
|
||||
}
|
||||
|
||||
// Path: sale
|
||||
class _Translations$sale$pt extends Translations$sale$en {
|
||||
_Translations$sale$pt._(TranslationsPt root) : this._root = root, super.internal(root);
|
||||
|
|
@ -1738,6 +1759,17 @@ extension on TranslationsPt {
|
|||
'plantare.openSection' => 'Pendentes',
|
||||
'plantare.settledSection' => 'Feitos',
|
||||
'plantare.removeConfirm' => 'Remover este compromisso?',
|
||||
'handover.title' => 'Dei ou recebi sementes',
|
||||
'handover.help' => 'Uma oferta, uma troca ou uma venda: anota-o, com promessa de devolver semente ou sem ela.',
|
||||
'handover.iGave' => 'Dei sementes',
|
||||
'handover.iReceived' => 'Recebi sementes',
|
||||
'handover.whichLot' => 'De que lote?',
|
||||
'handover.howMuch' => 'Quanto?',
|
||||
'handover.allOfIt' => 'Tudo',
|
||||
'handover.partOfIt' => 'Uma parte',
|
||||
'handover.paymentChip' => 'Houve dinheiro pelo meio',
|
||||
'handover.promiseGave' => 'Vão devolver-me semente',
|
||||
'handover.promiseReceived' => 'Vou devolver semente',
|
||||
'sale.title' => 'Vendas',
|
||||
'sale.help' => 'Regista semente vendida ou comprada — dinheiro, Ğ1 ou qualquer moeda. Um modelo separado do presente e do Plantare. Nunca se cobra comissão pelas sementes.',
|
||||
'sale.add' => 'Registar venda',
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue