The note growers most wish they had two seasons later — did it do well, was it worth keeping — never had a home. New append-only GardenOutcomes table (lotId, season year, three-face rating, free note); the question appears ONCE, inline, right after recording a harvest in the batch story, and is skippable without a trace. The answer shows as one more story line. Rides backups/sync like every mutable table (JSON codec, LWW import, HLC clock absorb). Migration v12→v13 guarded + verified from every historical version.
134 lines
6 KiB
Dart
134 lines
6 KiB
Dart
// Domain enums stored by **name** (never by index) via Drift `textEnum`, so
|
|
// the stored keys are stable across migrations. Per data-model §5.2, values
|
|
// may only be appended, never renumbered or reused; when sync arrives, readers
|
|
// must tolerate unknown values (map to a safe default). No sync yet in Block 1.
|
|
|
|
/// The form in which a lot is held. `seed` is dry seed (the only form
|
|
/// germination tests apply to); the rest are living/vegetative material. Values
|
|
/// are stored by name and append-only (data-model §5): never renamed/reordered.
|
|
///
|
|
/// - `seedling` — a young plant grown from seed, to transplant (plantón).
|
|
/// - `plant` — an established plant (potted or bare-root).
|
|
/// - `tree` — a woody plant: tree or shrub.
|
|
/// - `bulb` — a storage organ: bulb, corm, tuber or rhizome.
|
|
/// - `cutting` — vegetative propagation material (cutting, scion).
|
|
enum LotType { seed, plant, seedling, tree, bulb, cutting }
|
|
|
|
/// How living plant material is packaged/supplied — an optional attribute of a
|
|
/// non-seed [Lot], kept separate from the amount. Append-only by name.
|
|
///
|
|
/// - `pot` — in a pot/container (maceta/contenedor).
|
|
/// - `tray` — in a plug/cell tray (bandeja de alvéolos).
|
|
/// - `plug` — a single plug/cell.
|
|
/// - `bareRoot` — dormant, roots exposed, no soil (raíz desnuda).
|
|
/// - `rootBall` — dug with an intact soil ball (cepellón).
|
|
enum Presentation { pot, tray, plug, bareRoot, rootBall }
|
|
|
|
/// Per-lot visibility (data-model §2.3). Used by the future sharing layer.
|
|
enum OfferStatus { private, shared, exchange, sell }
|
|
|
|
/// A coarse, offline-friendly "how much do I have" that fuses amount with
|
|
/// shareability — the way a seed saver actually thinks, without weighing or
|
|
/// counting. Modelled on the qualitative scale a real seed bank used
|
|
/// (mucha/bastante/suficiente/poca), where each level is defined by what you
|
|
/// can do with it. Optional alternative to a precise Quantity. Append-only by
|
|
/// name.
|
|
///
|
|
/// - `plentyToShare` — surplus, free to give away (mucha).
|
|
/// - `enoughToShare` — can share a little, sparingly (bastante).
|
|
/// - `enoughForMe` — enough for my own use, not to share (suficiente).
|
|
/// - `runningLow` — only enough to keep the variety alive (poca).
|
|
enum Abundance { plentyToShare, enoughToShare, enoughForMe, runningLow }
|
|
|
|
/// How dry seed is physically conserved — affects longevity, kept separate from
|
|
/// *where* it is stored. Optional attribute of a seed [Lot]. Append-only by name.
|
|
///
|
|
/// - `jarWithDesiccant` — sealed jar with a drying agent (bote con sílice).
|
|
/// - `glassJar` — plain glass jar (bote de cristal).
|
|
/// - `paperEnvelope` — paper envelope (sobre de papel).
|
|
/// - `paperBag` — paper bag (bolsa de papel).
|
|
/// - `plasticBag` — plastic bag (bolsa de plástico).
|
|
enum PreservationFormat {
|
|
jarWithDesiccant,
|
|
glassJar,
|
|
paperEnvelope,
|
|
paperBag,
|
|
plasticBag,
|
|
}
|
|
|
|
/// State of the drying agent (silica gel) in a stored seed container, recorded
|
|
/// at a periodic condition check. The colour is a proxy for moisture: a
|
|
/// saturated agent means the seed is at risk. Append-only by name.
|
|
///
|
|
/// - `none` — no drying agent present (no tiene).
|
|
/// - `add` — should add some (se pone).
|
|
/// - `replace` — saturated, replace it (se cambia).
|
|
/// - `dry` — indicating dry (azul/blue).
|
|
/// - `fresh` — just renewed (lila/violet).
|
|
enum DesiccantState { none, add, replace, dry, fresh }
|
|
|
|
/// How a sowing from this batch turned out in the grower's own garden — the
|
|
/// note people most wish they had two seasons later. Deliberately coarse
|
|
/// (three faces, not a breeder's scorecard): the free-text note carries any
|
|
/// nuance.
|
|
enum GardenOutcomeRating { good, mixed, poor }
|
|
|
|
/// Append-only event kinds on a Lot (data-model §2.4).
|
|
enum MovementType {
|
|
received,
|
|
given,
|
|
sown,
|
|
harvested,
|
|
germinationTest,
|
|
split,
|
|
discarded,
|
|
}
|
|
|
|
/// A counterparty is a person or a collective (data-model §2.5).
|
|
enum PartyKind { person, collective }
|
|
|
|
/// Attachment media kind (data-model §2.1).
|
|
enum AttachmentKind { photo, doc }
|
|
|
|
/// Polymorphic parent of an Attachment / ExternalLink.
|
|
enum ParentType { variety, lot, movement }
|
|
|
|
/// Whose reproduction promise a Plantare is, seen from this app's owner
|
|
/// (data-model §2.7). A Plantare is a commitment to REPRODUCE and return seed —
|
|
/// not a sale.
|
|
enum PlantareDirection {
|
|
/// I received seed and promised to grow it out and return some.
|
|
iReturn,
|
|
|
|
/// I gave seed and the other person promised to return some.
|
|
owedToMe,
|
|
}
|
|
|
|
/// Lifecycle of a Plantare. Framed as a promise, not a debt (data-model §2.7):
|
|
/// `forgiven` (not "defaulted") when it's let go.
|
|
enum PlantareStatus { open, returned, forgiven }
|
|
|
|
/// State of the bilateral SIGNED handshake, distinct from [PlantareStatus]
|
|
/// (which tracks the *promise*, not the *agreement*). A v1 local-only row leaves
|
|
/// this null. `proposed` = I sent/received a proposal awaiting the other stub;
|
|
/// `accepted` = both signed (a provably closed deal); `declined` = the other
|
|
/// party turned my proposal down. Mirrors commons_core `PlantareMessageKind`.
|
|
enum PlantareRemoteState { proposed, accepted, declined }
|
|
|
|
/// How a Plantare is promised back, mirroring the paper form's checkboxes and
|
|
/// commons_core `ReturnKind`. `similar` (the default) means open-pollinated ·
|
|
/// non-GMO · organically grown; `workHours` is time-as-currency; `other` is
|
|
/// free text in `owedDescription`.
|
|
enum PlantareReturnKind { similar, workHours, other }
|
|
|
|
/// Direction of a recorded seed Sale, seen from this app's owner. A sale is a
|
|
/// SEPARATE model from a gift or a Plantare — seed for money (any currency:
|
|
/// €, Ğ1, a local/time currency…). No commission is ever taken on seeds.
|
|
enum SaleDirection { iSold, iBought }
|
|
|
|
/// Direction of a hand-over — the one moment seeds actually change hands
|
|
/// (data-model §2.8: a closed deal produces a Movement and, optionally, a
|
|
/// Plantare and/or a Sale record). Not stored in a column of its own: it maps
|
|
/// to [MovementType.given]/[MovementType.received] plus the derived directions
|
|
/// of the optional Sale and Plantare rows.
|
|
enum HandoverDirection { iGave, iReceived }
|