Database schema
PocketBase collections for plantitas.
Collections
admin_groups
| Field | Type | Required | Notes |
|---|---|---|---|
| name | text | yes | unique |
| description | text | no |
Rules: Users see only their own group; admins see all. Only admins can create/update/delete.
users (auth collection — extended)
| Field | Type | Required | Notes |
|---|---|---|---|
| username | text | yes | built-in |
| no | built-in | ||
| password | password | yes | built-in |
| first_name | text | no | |
| last_name | text | no | |
| phone | text | no | guardado en E.164 (+5492236193597) |
| is_admin | bool | no | true grants backoffice access |
| group_id | relation → admin_groups | no | se vincula después de crear la cuenta; cascade delete |
Rules: Users see only themselves; admins see all. Users can update own record.
places
| Field | Type | Required | Notes |
|---|---|---|---|
| name | text | yes | |
| description | text | no | |
| address | text | yes | display_name de Nominatim |
| latitude / longitude | number | no | geocodificado con Nominatim |
| type | select | no | house, hotel, shop, warehouse, event_venue |
| referent_name | text | no | persona de contacto del lugar |
| opening_days | select (multi) | no | mon..sun |
| opening_from / opening_to | text | no | hora HH:MM |
| climate | json | no | perfil climático de Open-Meteo (promedios 5 años) |
| group_id | relation → admin_groups | yes | cascade delete |
Rules: Users see only places in their group; admins see all. Only admins can create/update/delete.
sub_places
| Field | Type | Required | Notes |
|---|---|---|---|
| name | text | yes | |
| description | text | no | |
| place_id | relation → places | yes | cascade delete |
Rules: Users see only sub-places belonging to their group (traversed via place_id.group_id); admins see all. Only admins can create/update/delete.
plant_types
| Field | Type | Required | Notes |
|---|---|---|---|
| name | text | yes | |
| description | text | no | |
| image | file | no | single image, max 5MB, jpg/png/webp |
Rules: Public read (no auth required). Only admins can create/update/delete.
plants
| Field | Type | Required | Notes |
|---|---|---|---|
| code | number | no | sequential code, displayed as PLT-XXXXX in UI (auto-generation pending, generate client-side) |
| plant_type_id | relation → plant_types | yes | |
| place_id | relation → places | yes | current location |
| created_at_place_id | relation → places | no | original creation location, set once |
Rules: Users see only plants in their group (via place_id.group_id); admins see all. Only admins can create/update/delete.
transfers
Historial de vida de cada planta: movimientos registrados solo por administradores. La ubicación física actual de la planta es plants.place_id, que se actualiza al registrar cada movimiento (client-side, hooks de PB deshabilitados).
| Field | Type | Required | Notes |
|---|---|---|---|
| plant_id | relation → plants | yes | cascade delete |
| transfer_type | select | yes | acquire, transfer, loan, exchange |
| origin_place_id | relation → places | no | null en acquire (ingreso al inventario) |
| destination_place_id | relation → places | yes | |
| origin_group_id | relation → admin_groups | no | denormalizado para historial; null en acquire |
| destination_group_id | relation → admin_groups | yes | denormalizado para historial |
| transferred_by | relation → users | yes | quién ejecutó el movimiento |
| description | text | no | |
| expected_return_date | date | no | solo loan |
| returned_at | date | no | fecha de devolución del loan |
| status | select | no | active, returned (solo loan; overdue derivable en UI) |
| exchange_pair_id | text | no | uuid compartido por las 2 piernas de un exchange |
Reglas de consistencia:
acquire→ origen null; el alta seteaplants.created_at_place_iduna sola vez.loan→expected_return_daterequerido,status: active; la devolución es un nuevotransferde vuelta +returned_aten el préstamo.exchange→ siempre en pares con el mismoexchange_pair_id(planta A: X→Y, planta B: Y→X).
Rules: solo admin.
plant_identifiers
| Field | Type | Required | Notes |
|---|---|---|---|
| code | text | yes | unique, QR code value |
| plant_id | relation → plants | yes | specific plant, cascade delete |
| plant_type_id | relation → plant_types | yes | denormalized for public access |
| is_active | bool | no |
Rules: Public read. Only admins can create/update/delete.
Cascade delete chain
admin_groups ──cascade──→ places ──cascade──→ sub_places
└──cascade──→ users
plants ──cascade──→ transfers
Deleting a plant removes its transfers. A place does NOT cascade to its plants — plants can be relocated before the place is deleted.
Access rules (PocketBase filters)
| Collection | Rule |
|---|---|
| admin_groups | @request.auth.group_id = id || @request.auth.is_admin = true |
| users | @request.auth.is_admin = true || @request.auth.id = id |
| places | @request.auth.group_id = group_id || @request.auth.is_admin = true |
| sub_places | @request.auth.group_id = place_id.group_id || @request.auth.is_admin = true |
| plant_types | "" (public) |
| plants | @request.auth.group_id = place_id.group_id || @request.auth.is_admin = true |
| transfers | @request.auth.is_admin = true |
| plant_identifiers | "" (public) |