From fe9fb7186008e10d73c520bfad809542fa29e7e0 Mon Sep 17 00:00:00 2001 From: kikimor Date: Fri, 18 Sep 2026 18:58:38 +0300 Subject: [PATCH] Add implementation plans and remove stray Word temp file Plans record the decisions behind each feature and, for the protocol and licensing work, what remains unvalidated against real hardware. ~WRL0003.tmp was a Word autosave artifact committed by accident. Co-Authored-By: Claude Opus 5 --- .claude/backups/scales_20260914_191243.dump | Bin 0 -> 59161 bytes ...ge-dev-ports-backend-8002-frontend-5172.md | 107 ++++++ .../extra-data-quick-fill-combinations.md | 321 ++++++++++++++++++ .claude/plans/licensing.md | 185 ++++++++++ .claude/plans/multi-protocol-scales.md | 224 ++++++++++++ .../plans/reorder-nomenclatures-drag-drop.md | 115 +++++++ .claude/plans/single-measure-button.md | 176 ++++++++++ .claude/plans/venv-auto-activation.md | 164 +++++++++ ~WRL0003.tmp | Bin 158082 -> 0 bytes 9 files changed, 1292 insertions(+) create mode 100644 .claude/backups/scales_20260914_191243.dump create mode 100644 .claude/plans/change-dev-ports-backend-8002-frontend-5172.md create mode 100644 .claude/plans/extra-data-quick-fill-combinations.md create mode 100644 .claude/plans/licensing.md create mode 100644 .claude/plans/multi-protocol-scales.md create mode 100644 .claude/plans/reorder-nomenclatures-drag-drop.md create mode 100644 .claude/plans/single-measure-button.md create mode 100644 .claude/plans/venv-auto-activation.md delete mode 100644 ~WRL0003.tmp diff --git a/.claude/backups/scales_20260914_191243.dump b/.claude/backups/scales_20260914_191243.dump new file mode 100644 index 0000000000000000000000000000000000000000..0cac2b361bbf9f12ef663ddba9e146e754210ba8 GIT binary patch literal 59161 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 d ok, so, server is set to run on 8000, but I want it to be on 8002, also the frontend - +> what port is it? I want it to be on 5172 (for the local npm rundev) + +## Plan + +### Context + +The local development ports collide with other things running on this machine. The user +wants the Django backend on **8002** instead of 8000, and the React frontend on **5172** +instead of 3000. + +Two findings shaped this plan: + +1. **The frontend is Create React App (react-scripts 5.0.1), not Vite.** There is no + `dev` script and no `vite.config`. The user asked for "npm run dev" on 5172 — a + Vite-shaped request. Rather than migrate the build tool (out of scope), we set CRA's + `PORT` env var to 5172 and add a `dev` script alias so `npm run dev` works as expected. +2. **Changing the ports is not just two edits.** Three other places hardcode the old + ports and would silently break: the frontend's API base URL, CRA's dev proxy, and the + backend's CORS allow-list (which would reject the frontend's new origin). + +Scope is **local dev only**. Docker (`backend/Dockerfile`, `docker-compose.yml`) keeps +port 8000 — it is container-internal there and the host mapping `8101:8000` is what you +actually connect to. Docs (README/SETUP/CLAUDE.md) are left as-is per the user's choice. + +### Changes + +#### 1. Backend port → 8002 + +**[run_server.bat:4](../../run_server.bat#L4)** — the only place the local server port is set: + +``` +uvicorn scalesapp.asgi:application --host 127.0.0.1 --port 8002 --reload +``` + +#### 2. Frontend port → 5172 and API URL → 8002 + +**`frontend/.env`** (currently one line, `REACT_APP_API_URL=http://localhost:8000`): + +``` +PORT=5172 +REACT_APP_API_URL=http://localhost:8002 +``` + +`PORT` is the standard CRA dev-server port variable — no config file needed. Note CRA +only reads `.env` at dev-server start, so the server must be restarted, not just reloaded. + +**`frontend/.env.example:1`** — mirror the same two lines so the template stays accurate. + +#### 3. `npm run dev` alias + +**[frontend/package.json:13-18](../../frontend/package.json#L13-L18)** — add a `dev` +script next to the existing `start`: + +```json +"start": "react-scripts start", +"dev": "react-scripts start", +``` + +#### 4. CRA dev proxy → 8002 + +**[frontend/package.json:36](../../frontend/package.json#L36)**: + +```json +"proxy": "http://localhost:8002" +``` + +#### 5. CORS allow-list → add 5172 + +**[backend/scalesapp/settings.py:108](../../backend/scalesapp/settings.py#L108)** — +without this the browser blocks every API call from the new origin: + +```python +_cors_default = 'http://localhost:5172,http://127.0.0.1:5172,http://localhost:3000,http://127.0.0.1:3000,http://localhost:5174,http://127.0.0.1:5174' +``` + +Existing 3000/5174 entries are kept — they cost nothing and avoid breaking any other +local setup. This is only the *default*; an explicit `CORS_ALLOWED_ORIGINS` in +`backend/.env` would override it, and there is currently none, so the default applies. + +### Not changed (deliberately) + +- `backend/Dockerfile`, `docker-compose.yml` — container-internal 8000, host port 8101. +- `frontend/src/services/api.js:3`, `contexts/NomenclatureContext.jsx:3` — their + `http://localhost:8000` is a fallback only, superseded by `REACT_APP_API_URL`. +- `serial_bridge/` — runs on 5000, talks to Django only via `BACKEND_URL`; unaffected + unless the bridge needs to reach the backend (it currently pushes nothing on startup). +- README.md, SETUP.md, CLAUDE.md port references. + +### Verification + +1. `run_server.bat` → console shows `Uvicorn running on http://127.0.0.1:8002`. + Confirm `http://127.0.0.1:8002/api/` responds (401/403 is fine — it proves it's up). +2. `cd frontend && npm run dev` → console shows `On Your Network: http://localhost:5172` + and the browser opens there. +3. Log in through the UI. This is the real end-to-end check: it exercises + `POST /api/token/` cross-origin from `localhost:5172` to `localhost:8002`, so it + validates the API URL **and** the CORS entry together. +4. Open DevTools → Network: no CORS errors, and the `/sse-connect/` EventSource shows + status 200 and stays open (SSE is authenticated via query-param token and is the most + likely thing to break silently if a port was missed). +5. Confirm nothing still calls 8000: with the app running, check the Network tab for any + request to `localhost:8000`. diff --git a/.claude/plans/extra-data-quick-fill-combinations.md b/.claude/plans/extra-data-quick-fill-combinations.md new file mode 100644 index 0000000..fcf291a --- /dev/null +++ b/.claude/plans/extra-data-quick-fill-combinations.md @@ -0,0 +1,321 @@ +# Quick-Fill Combinations for Vehicle Additional Data + +## Context + +Trucks frequently arrive one after another carrying the same cargo, from the same speditor, via the same agent. Today the operator re-selects every dropdown in the "Additional Data" section of the vehicle edit form for each truck, even when nothing changed from the previous one. + +This adds a helper table above those fields listing previously-used *combinations* of the lookup values. One click fills all the dropdowns. Rows are created automatically when a vehicle's extra data is saved, and the user deletes rows they no longer need. + +**Decisions made with the user:** +- A "combination" = only `kind='lookup'` nomenclature values. Free-text/number/bool fields are excluded so one-off notes don't pollute the table. +- Re-using an existing combination bumps its `last_used` and increments `use_count`. No duplicate rows. +- Rows are shared by all users (global, not per-user). +- Rows persist indefinitely — no cap, no auto-trim. Manual delete only. +- Table renders inline, always visible, directly above the existing fields, in **both** the new-vehicle and edit forms. + +--- + +## Backend + +### 1. Model — `backend/vehicles/models.py` + +Lives in `vehicles/` because it's a usage history of `VehicleExtra.data`, a domain model. (`api/` holds the API layer; `vehicles/views.py|serializers.py|urls.py` are dead, broken, unrouted code — do not touch them.) + +Dedup uses a canonical hash, not JSONField equality: on SQLite a `JSONField` exact-match compares the serialized string, so `{"A":1,"B":2}` ≠ `{"B":2,"A":1}`. A `unique=True` SHA-256 column is backend-agnostic and O(1). + +Add `import hashlib` / `import json` at the top, then: + +```python +def combination_hash(data): + """Order-independent canonical hash of a {nomenclature_code: entry_id} dict.""" + canonical = json.dumps(data, sort_keys=True, separators=(',', ':')) + return hashlib.sha256(canonical.encode('utf-8')).hexdigest() + + +class ExtraCombination(models.Model): + """A previously-used combination of lookup nomenclature values for a vehicle's extra data.""" + data = models.JSONField(default=dict) + data_hash = models.CharField(max_length=64, unique=True, editable=False) + use_count = models.IntegerField(default=1) + last_used = models.DateTimeField(auto_now_add=True) + + class Meta: + ordering = ["-last_used"] + + def save(self, *args, **kwargs): + self.data_hash = combination_hash(self.data) + super().save(*args, **kwargs) + + def __str__(self): + return f"{self.data} (x{self.use_count})" +``` + +Computing the hash inside `save()` means it can never drift from `data`. `auto_now_add` (not `auto_now`) + an explicit bump in the recorder keeps the timestamp meaning "last used", not "last saved". + +Migration: `python manage.py makemigrations vehicles` → `0005_extracombination.py` (latest is currently `0004_`). + +### 2. Serializer — `backend/api/serializers.py` + +Extract the existing validation at [api/serializers.py:85-123](backend/api/serializers.py#L85-L123) into a module-level function with a `lookup_only` flag, so both serializers share it. Behaviour for the existing path is bit-identical. + +```python +def validate_vehicle_extra_data(value, lookup_only=False): + """Validate a {nomenclature_code: value} dict against vehicle nomenclatures. + + lookup_only=True rejects any key whose nomenclature is not kind='lookup'. + """ +``` + +Body is the current `validate_data` verbatim, with one insert in the `Nomenclature.FIELD` branch: + +```python + elif nom.kind == Nomenclature.FIELD: + if lookup_only: + errors[key] = "Only lookup nomenclatures are allowed here." + continue + field_def = nom.fields.first() + # ...rest unchanged +``` + +`VehicleExtraSerializer.validate_data` becomes `return validate_vehicle_extra_data(value)`. + +New serializer (after `VehicleSerializer`): + +```python +class ExtraCombinationSerializer(serializers.ModelSerializer): + class Meta: + model = ExtraCombination + fields = ['id', 'data', 'use_count', 'last_used'] + read_only_fields = ['id', 'use_count', 'last_used'] + + def validate_data(self, value): + if not value: + raise serializers.ValidationError("Combination cannot be empty.") + return validate_vehicle_extra_data(value, lookup_only=True) +``` + +**Returns raw `{code: entry_id}` — no denormalized labels.** The frontend already has `getDisplayValue(code, entryId)` backed by an SSE-live cache, so labels update in realtime when an entry is renamed. Server-side labels would be a stale snapshot requiring re-broadcast of every row on every entry edit. + +### 3. Recorder + ViewSet — `backend/api/views.py` + +Imports: add `mixins` to the DRF import, `ExtraCombination` and `combination_hash` to the `vehicles.models` import, `ExtraCombinationSerializer` to the serializer import. + +Helper above `VehicleViewSet` (next to `_maybe_finalize`, matching file convention): + +```python +def _record_extra_combination(extra_data): + """Record the lookup-only projection of a vehicle's extra data as a reusable combination.""" + if not extra_data: + return + + lookup_codes = set( + Nomenclature.objects.filter(applies_to='vehicle', kind=Nomenclature.LOOKUP) + .values_list('code', flat=True) + ) + combo = {k: v for k, v in extra_data.items() if k in lookup_codes and v is not None} + if not combo: + return + + existing, created = ExtraCombination.objects.get_or_create( + data_hash=combination_hash(combo), defaults={'data': combo} + ) + if not created: + existing.use_count += 1 + existing.last_used = timezone.now() + existing.save() + + action = 'created' if created else 'updated' + sse_broadcast_update('extra_combination', action, ExtraCombinationSerializer(existing).data) +``` + +`get_or_create` (rather than `filter().first()` + `create()`) closes the race where two users save the same brand-new combination simultaneously — otherwise one gets an `IntegrityError` 500 *after* the vehicle was already saved. + +Two guards matter: no extra at all, and extra containing only `kind='field'` values (the common "user typed a one-off note" case). Neither should create a row. + +ViewSet after `VehicleViewSet`: + +```python +class ExtraCombinationViewSet(mixins.ListModelMixin, + mixins.RetrieveModelMixin, + mixins.DestroyModelMixin, + viewsets.GenericViewSet): + """ + API endpoint for previously-used combinations of vehicle extra (lookup) data. + + Rows are created/bumped automatically when a vehicle's extra data is saved. + """ + queryset = ExtraCombination.objects.all() + serializer_class = ExtraCombinationSerializer + permission_classes = [IsAuthenticated] + ordering = ['-last_used'] + + def perform_destroy(self, instance): + data = ExtraCombinationSerializer(instance).data + instance.delete() + sse_broadcast_update('extra_combination', 'deleted', data) +``` + +No create/update endpoints — rows only ever appear as a side effect of saving a vehicle. + +Route in [api/urls.py](backend/api/urls.py): +```python +router.register(r'extra-combinations', views.ExtraCombinationViewSet, basename='extra-combination') +``` + +### 4. Where recording fires — `VehicleViewSet` + +**Backend, in `perform_create`/`perform_update`.** This is the layer that already owns side effects of a successful vehicle mutation (`sse_broadcast_update`), it covers both required paths (create-with-extra, and the `handleSaveExtra` PATCH which routes through `partial_update` → `perform_update`), and it can't be forgotten by frontend code. + +Rejected: a frontend POST (two round-trips, fails independently, must be duplicated, wrong trust boundary); a `post_save` signal (would fire on fixtures, migrations, shell saves and admin edits, broadcasting SSE with no request context — and the project has zero signals today). + +One line added to each, at [api/views.py:161-169](backend/api/views.py#L161-L169): + +```python + _record_extra_combination(instance.extra.data if hasattr(instance, 'extra') else None) +``` + +`hasattr` matches the existing style at [api/serializers.py:162](backend/api/serializers.py#L162); `extra` is a reverse OneToOne that raises `DoesNotExist` when absent. + +`set_tare`/`set_gross` bypass `perform_update` and don't touch extra data — leave them alone. + +--- + +## Frontend + +### 5. New component — `frontend/src/components/ExtraCombinationsTable.jsx` + `.css` + +Sits in `components/` next to `Main.jsx` (it's a Main-screen helper, not a nomenclature UI primitive). + +Props: `{ nomenclatures, onApply }` — `nomenclatures` is the already-sorted `vehicleNomenclatures` from [Main.jsx:28](frontend/src/components/Main.jsx#L28) so columns line up with the dropdowns below; `onApply(data)` gets the raw dict. + +**Data + realtime: local state + fetch on mount + `subscribeToUpdates`.** Extending `NOMENCLATURES_CONFIG` was rejected — that machinery sorts by `name`/`id` (not `-last_used`) and its handler has no `delete` branch, so it'd mean modifying shared load-bearing code for one consumer. + +This needs **one token** added to [NomenclatureContext.jsx:362](frontend/src/contexts/NomenclatureContext.jsx#L362), since unknown objects currently hit `console.warn` and get dropped: + +```jsx +if (object === 'nomenclature' || object === 'nomenclature_entry' || object === 'extra_combination') { +``` + +Strictly additive — existing subscribers already filter on `message.object` before acting. + +**Stale-closure hazard:** `subscribeToUpdates` is not `useCallback`'d ([NomenclatureContext.jsx:344](frontend/src/contexts/NomenclatureContext.jsx#L344)), so a `useEffect` depending on it re-subscribes every provider render. Hold it in a ref and run the effect with `[]` deps. Leave a one-line comment so nobody "fixes" it back. + +Key logic: + +```jsx +const lookupNomenclatures = nomenclatures.filter(n => n.kind === 'lookup'); + +const load = useCallback(async () => { + const res = await api.get('/api/extra-combinations/'); + setCombinations(res.data.results || res.data); // PAGE_SIZE=100 envelope +}, []); + +// SSE +if (message.object !== 'extra_combination') return; +setCombinations(prev => operation === 'delete' + ? prev.filter(c => c.id !== data.id) + : [data, ...prev.filter(c => c.id !== data.id)]); // most recent first +``` + +Table: one `` per lookup nomenclature (`nom.name`) plus a narrow actions column; rows call `onApply(combo.data)`; each row has a `×` delete button with `e.stopPropagation()` and a `window.confirm`. Cells resolve via `getDisplayValue(nom.code, entryId)`, rendering `#` in muted italic when an id no longer resolves. Returns `null` if there are no lookup nomenclatures. + +CSS follows the `nui-mgmt-*` table conventions from [NomenclatureManagementOverlay.css](frontend/src/components/NomenclatureUI/NomenclatureManagementOverlay.css), scaled down for inline use: sticky header on `#f8f9fa`, `1px solid #dee2e6` row borders, `#f0f0ff` hover, `max-height: 180px` + `overflow-y: auto`, `overflow-x: auto` with `white-space: nowrap`, uppercase 0.75rem headers, 6px radii, `#dc3545` delete hover. + +### 6. `Main.jsx` — apply handler + placement + +```jsx +// Apply a saved combination - merge so non-lookup field values are preserved +const handleApplyCombination = (data) => { + setExtraData(prev => ({ ...prev, ...data })); +}; +``` + +**Merge, not replace.** `data` only contains lookup codes (enforced server-side), so spreading over `prev` preserves every free-text/number/bool value the user already typed. Lookup fields absent from the combination keep their current value rather than being cleared — the safer default, never silently destroying input. + +Placement inside the existing edit-form `.extra-section` at [Main.jsx:417-442](frontend/src/components/Main.jsx#L417-L442), directly above `.extra-fields`: + +```jsx +

Additional Data

+ +
+``` + +**Both forms.** The same table renders in the new-vehicle form and the edit form, each paired with its own state via a sibling handler: + +```jsx +const handleApplyCombinationNew = (data) => { + setNewExtraData(prev => ({ ...prev, ...data })); +}; +``` + +--- + +## Edge cases + +| Case | Behaviour | Action | +|---|---|---| +| Entry **deactivated** after being saved in a combination | `getDisplayValue` searches all entries, so the label still renders. Save fails loudly with `Entry ID N not found`, caught by the existing `handleSaveExtra` error path. | None. Deactivation is soft and reversible; hiding rows would make them vanish and reappear. | +| Entry **hard-deleted** | Cell flips live to muted italic `#` (SSE removes it from the cache). | Render the marker so the broken row is visible and deletable — hiding it would remove the only way to clean it up. | +| **Nomenclature deleted** | Its column disappears from the table; the orphan key stays in `data`, unrendered. Clicking such a row would fail validation on save with `Unknown nomenclature code`. | None. Admin-rare, self-resolving on the next fresh save. A cleanup signal would be speculative machinery. | +| **Validation failure on click-apply** | Impossible — clicking is local `setState` only, no network. Errors surface at save via the existing `.vehicle-error` banner. | None. Don't special-case; this is how every other extra-data error already behaves. | +| **Concurrent identical saves** | Handled by `get_or_create` (§3). | Done. | +| **Empty projection** | Two guards in the recorder + serializer rejects `{}`. | Done. | + +--- + +## Verification + +Backend on 8002 via `run_server.bat`; frontend via `npm start` in `frontend/` (port 5172). + +Preflight: confirm `frontend/.env` sets `REACT_APP_API_URL=http://localhost:8002` — [NomenclatureContext.jsx:3](frontend/src/contexts/NomenclatureContext.jsx#L3) defaults to `:8000`, so a wrong value makes SSE silently dead while REST still works through the proxy. Confirm `http://localhost:5172` is in `CORS_ALLOWED_ORIGINS`. + +```bat +cd backend && ..\.venv\Scripts\activate +python manage.py makemigrations vehicles && python manage.py migrate +python manage.py showmigrations vehicles :: expect [X] 0005_extracombination +``` + +Needs ≥2 vehicle lookup nomenclatures with active entries (e.g. `CARGO`, `SPEDITOR`) and one `kind='field'` text nomenclature (e.g. `NOTE`) for step 5. + +1. **Empty state** — select a vehicle; "Previously Used" shows *No saved combinations yet* with correct columns. +2. **First save creates a row** — Cargo=Coal, Speditor=ACME → Save Extra Data. Row appears with no page reload. +3. **Dedup** — same combination on a *different* vehicle → still exactly one row. Verify: + ```bat + python manage.py shell -c "from vehicles.models import ExtraCombination; [print(c.id, c.data, c.use_count, c.last_used) for c in ExtraCombination.objects.all()]" + ``` + Expect `use_count=2`, fresh `last_used`. +4. **Click-apply** — clear both dropdowns, click the row → both populate. Save → one row, `use_count=3`. +5. **Merge preserves free-text** *(most important regression check)* — type text into `NOTE`, click a combination row. **The note must survive**, and `NOTE` must have no column in the table. +6. **Ordering** — save a second distinct combination; it appears above. Re-save the first → it returns to the top. +7. **Delete over SSE** — open a second browser tab first, then delete a row via `×`. It must disappear in **both** tabs (this is the path `NomenclatureContext` doesn't natively support, so most likely to break). +8. **New-vehicle path** — create a vehicle with extra data via "+ New Vehicle" → row created (verifies `perform_create`). +9. **Empty projection** — create a vehicle with only `NOTE` filled → **no new row**; confirm count unchanged in the shell. +10. **Stale id** — hard-delete a referenced entry via the `…` overlay. Cell flips to `#` live; clicking + saving shows the `Entry ID N not found` error; `×` removes the row. +11. **Key-order independence** — + ```bat + python manage.py shell -c "from vehicles.models import combination_hash; print(combination_hash({'A':1,'B':2}) == combination_hash({'B':2,'A':1}))" + ``` + Expect `True`. +12. **API surface** — `GET /api/extra-combinations/` returns the paginated envelope ordered by `-last_used`; `POST` returns **405**. + +--- + +## Files changed + +**Backend** +- `backend/vehicles/models.py` — imports, `combination_hash()`, `ExtraCombination` +- `backend/vehicles/migrations/0005_extracombination.py` — generated +- `backend/api/serializers.py` — extract `validate_vehicle_extra_data()`, slim `VehicleExtraSerializer.validate_data`, add `ExtraCombinationSerializer` +- `backend/api/views.py` — imports, `_record_extra_combination()`, 1 line each in `perform_create`/`perform_update`, `ExtraCombinationViewSet` +- `backend/api/urls.py` — 1 router line + +**Frontend** +- `frontend/src/components/ExtraCombinationsTable.jsx` — new +- `frontend/src/components/ExtraCombinationsTable.css` — new +- `frontend/src/components/Main.jsx` — import, `handleApplyCombination` + `handleApplyCombinationNew`, JSX insert in both forms +- `frontend/src/contexts/NomenclatureContext.jsx` — 1 token at line 362 + +Untouched: `vehicles/views.py`, `vehicles/serializers.py`, `vehicles/urls.py` (dead code), `nomenclatures/`, `Main.css`. diff --git a/.claude/plans/licensing.md b/.claude/plans/licensing.md new file mode 100644 index 0000000..0b9b4c5 --- /dev/null +++ b/.claude/plans/licensing.md @@ -0,0 +1,185 @@ +# Licensing: Server-Side Node-Locked with Station Limit + +**Status: BUILT and verified, 2026-09-17.** This document is the record of what exists, not a proposal. + +## Context + +Customers buy ScalesApp for a fixed number of weighbridge stations. Without enforcement, nothing stops a customer copying the installer onto more machines. Sites are **air-gapped** (no internet on the scales server), so any online activation or phone-home scheme is impossible. + +This licences the **server**, enforcing a maximum number of concurrently connected stations. Bridges themselves stay unlicensed. + +**Decisions made with the user:** +- **Licence the server, not each bridge** — one fingerprint, one key per customer, instead of N of each. +- **Count = concurrently connected bridges.** Licence says 5; a 6th is declined. If one of the 5 stops, its slot frees automatically. +- **Enforcement is per-station**: the 6th is refused, the working 5 are never interrupted. +- **Tolerant fingerprint + 14-day grace period** on hardware change. +- **Perpetual** — no expiry date (the signed payload carries an optional `expires` field so subscriptions can be added later without changing the format). +- Slot refresh every 30s, released after 2 minutes (4 missed refreshes). + +--- + +## Threat model — stated plainly + +Client-side licensing **can always be defeated** by someone determined; the server is a Python app and bytecode is inspectable. The goal is not "unbreakable": + +- Honest customers stay honest; the limit is a clear contractual line +- Casual copying (operator copies the folder to 3 more PCs) is stopped +- A determined pirate with a cracker is **not** stopped + +For B2B sold to a port with a support contract, that is the right level. Do not invest in obfuscation — it raises effort, never to infinity, and costs debuggability. + +--- + +## How it works + +### Signing, not a shared secret + +The critical design point: **the application only ever verifies; it can never generate.** + +1. Server computes a **machine fingerprint** from stable hardware IDs +2. Customer sends that string (email, phone, photo — it is short) +3. Vendor runs `tools/license_tool.py sign`, which signs `{customer, stations, components}` with the **Ed25519 private key** +4. Customer pastes the key back; the server verifies with the **public key** compiled into `api/licensing.py` + +A shared-secret or same-algorithm-both-ways scheme would be worthless — anyone who unpacks the app could mint keys. With signatures, forging requires the private key, which never leaves the vendor's machine. + +Blob format: `base64(".")`. + +### Tolerant fingerprint + +Four components are collected and hashed **separately** (not combined), so partial matching is possible: motherboard serial, disk serial, first physical MAC, machine GUID. + +Validation passes when **at least 3 of 4** match (`MIN_COMPONENT_MATCHES`). A replaced disk or NIC keeps working; a wholly different PC fails. + +**Windows uses PowerShell CIM, not `wmic`.** This matters: `wmic` is deprecated and **has been removed from recent Windows 11 builds**, where it fails silently and yields nothing. On this development machine the original `wmic` approach found only **1 of 4** components, which would have made every licence fail to validate. Each lookup falls back to `wmic` so older machines still work. Linux reads `/sys/class/dmi`, `lsblk`, `/sys/class/net` and `/etc/machine-id`. + +Missing components return `None` rather than raising — a VM or restricted environment may not expose all four, and the 3-of-4 rule tolerates that. + +### Grace period + +If validation fails (fewer than 3 components match, or no licence at all), the server enters a **14-day grace period**: everything keeps working, a persistent non-dismissible banner appears for all users, and the admin licence screen explains it. After 14 days the limit drops to **1 station** (`UNLICENSED_STATIONS`). + +Rationale: a licence check must never stop a weighbridge at 3am. Grace turns a hard outage into a support call. + +Grace start is stored in the **database**, not a file — a file is trivially reset, and the DB is included in backups. + +--- + +## Counting connected stations + +The bridge **deliberately never talks to Django** — that independence is a design decision (see `bridge-is-transport-only` in project memory). Licensing does not change it. + +**The browser reports instead.** It already talks to both. On load and every 30s it reads the bridge's `/status` and POSTs a heartbeat: + +``` +POST /api/license/heartbeat/ {"station_key": "st-abc123", "com_port": "COM3", "bridge_version": "1.1.0"} + -> 200 {"allowed": true, "stations_used": 3, "stations_licensed": 5} + -> 403 {"allowed": false, "detail": "Licence limit reached (5 stations)"} +``` + +`station_key` is a short stable hash of the bridge address plus its COM port, so **two browser tabs on the same station share one slot** rather than consuming two. + +`StationSlot` rows are live if `last_seen` is within `SLOT_TIMEOUT_SECONDS` (120). + +**A reconnecting station reclaims its own slot even at the limit** — matched on `station_key` in `_station_allowed()`. This is the single most important rule in the counting logic: without it, a station that blipped would be locked out by its own expiring ghost, which would look exactly like a licensing bug at the worst possible moment. + +### What "declined" means + +The 6th station's Measure button is disabled with the reason shown beneath it, and `POST /api/vehicles/{id}/measure/` returns 403 for that station key. Viewing and editing continue normally. The other five are entirely unaffected. + +**The API check is the rule; the button state is only convenience.** Enforcement lives in `VehicleViewSet.measure`, not the UI. + +--- + +## What was built + +### Backend + +| File | Contents | +|---|---| +| `api/licensing.py` | `machine_components()`, `machine_fingerprint()`, `verify_license()`, `license_status()`, `effective_station_limit()`, `LICENSE_PUBLIC_KEY` | +| `api/models.py` | `License` (single row, enforced in `save()`), `StationSlot` | +| `api/views.py` | `LicenseView` (GET status / POST install), `LicenseHeartbeatView`, `_station_allowed()`, licence check in `measure` | +| `api/urls.py` | `license/`, `license/heartbeat/` | +| `api/migrations/0008_license_stationslot.py` | generated | +| `requirements.txt` | `cryptography==50.0.1` added (PyJWT alone only does HMAC — a shared secret, i.e. the worthless scheme) | + +### Vendor tooling — `tools/license_tool.py` + +```bash +python tools/license_tool.py keygen # once; refuses to overwrite without --force +python tools/license_tool.py sign --customer "Port of Varna" --stations 5 \ + --components '{"board":"...","disk":"...","mac":"...","guid":"..."}' +``` + +`sign` refuses fewer than 3 components, since such a licence could never validate on the customer machine. + +### Frontend + +| File | Contents | +|---|---| +| `contexts/LicenseContext.jsx` | 30s heartbeat, derives `station_key` from the bridge's `/status` | +| `components/License/LicenseManager.jsx` + `.css` | Admin screen: state, fingerprint with copy buttons, paste box, connected-station table. 🔑 in header | +| `components/Main.jsx` | Measure gated on `licenseAllowed`, `station_key` sent with both measure calls, grace banner | +| `App.jsx` | `LicenseProvider`, `/license` route (admin only) | + +Design note: `LicenseContext` **assumes allowed until told otherwise**, so a slow first heartbeat never blocks a working station. Non-403 failures (server down) leave the previous state alone — a licence check must not stop a working weighbridge. + +--- + +## Security: the private key + +**`tools/license_private.key`** — gitignored via `*license*.key`, generated 2026-09-17. Verified not tracked. + +- **If it leaks**, every licence ever issued becomes forgeable +- **It cannot be rotated** without reissuing to every customer, since the public key is compiled into shipped binaries +- **If it is lost**, no new licences can ever be signed for existing installs + +Back it up outside the repo. Never ship it. The public key in `api/licensing.py` is safe to commit and must be correct in the build before shipping. + +--- + +## Verification (all passing) + +### Crypto — 6 checks + +1. Genuine licence verifies; customer and station count read back correctly +2. **Tampering rejected** — editing `"stations":5` to `"stations":500` in a real signed blob breaks the signature. *This is the property the entire scheme rests on.* +3. Licence for a different machine rejected (1 of 4 match, 3 required) +4. **3-of-4 tolerance works** — one component changed (simulated disk replacement) still validates +5. Empty, garbage and malformed blobs rejected cleanly with distinct messages +6. Expired licence rejected + +### End to end — 10 checks + +1. No licence → grace period, 14 days, still usable +2. Install a 5-station licence → customer and count correct +3. Five stations connect → `used=5 licensed=5` +4. **Sixth declined** → 403, "Licence limit reached (5 stations)" +5. The five keep working (refresh succeeds) +6. **Reconnect at the limit reclaims its own slot** → 200, not locked out +7. Offline station frees its slot after timeout → sixth then admitted +8. `measure` with an unregistered station key → 403 +9. `measure` from a licensed station → 200 +10. Grace expiry (backdated 15 days) → limit drops to 1 + +Frontend builds clean; no warnings in any licensing file. + +--- + +## Operating notes + +**Currently in grace mode** — no licence installed, so everything works and the banner shows. Install one from the 🔑 screen to test the licensed path. + +**To issue a licence:** customer opens 🔑 → copies the component JSON from "Full details" → sends it → run `license_tool.py sign` → customer pastes the result into the install box. + +The fingerprint shown large (e.g. `C261-A181-3D8D-AC94`) is for reading over the phone to confirm identity. The component JSON underneath is what `sign` actually needs. Both are one-way hashes, so they carry no identifying hardware detail. + +--- + +## Out of scope + +- **Expiry / subscriptions** — perpetual only; the payload field exists so this can be added without reissuing the format +- **Licensing individual bridges** — rejected as N× the administration +- **Obfuscation / anti-tamper** — see the threat model +- **Named Station entities** — slots are identified by bridge hash; a Station model was deliberately skipped diff --git a/.claude/plans/multi-protocol-scales.md b/.claude/plans/multi-protocol-scales.md new file mode 100644 index 0000000..09fe612 --- /dev/null +++ b/.claude/plans/multi-protocol-scales.md @@ -0,0 +1,224 @@ +# Multi-Protocol Scale Support + +## Context + +The port runs 10 scales from 6 manufacturers (Mettler-Toledo, Esit, Elikom, Libra, 3 no-name), each speaking a different serial protocol. ScalesApp currently assumes one format and parses it with a regex in `Main.jsx`. + +The hard constraint is **operational, not technical**: installation and upgrades must need minimal involvement from the developer. So the design question is not "how do we parse 6 formats" but **"where does protocol knowledge live so that adding a scale never means visiting 10 PCs with a new binary."** + +**Answer: the bridge knows nothing about protocols.** It is pure transport — open the port, optionally send a poll string on an interval, stream raw lines. Protocol definitions live in Django, are cached by the frontend, and parsing happens in the browser where the weight is displayed. A new scale type is a web-UI change; the bridge binary never changes for it. + +**Decisions made with the user:** +- Bridge = transport only. It learns its poll string at runtime from the UI, so a scale with a different command (`%p`, `SI`, `#w`) needs no bridge update. +- Protocol definitions live in Django, cached in the frontend (same pattern as `NomenclatureDataContext`). +- Live weight keeps going **bridge → UI directly** on localhost. Django stays out of the hot path, preserving the independence the project CLAUDE.md calls out. +- Admin gets a COM monitor (raw text + hex) and a fixed-column protocol builder. Exotic protocols stay code. +- Four protocols seeded: Simulator (`ST`/`US`), fixed-column `%p`, Toledo Continuous, Mettler-Toledo SICS. + +--- + +## Why the browser, not the bridge, parses + +The bridge is a PyInstaller binary on 10 station PCs. Anything it knows is expensive to change. The frontend is served from one place and updates on reload. + +Polling is the exception that must stay in the bridge: a browser cannot be the heartbeat. Background tabs get timer-throttled by Chrome, a closed tab stops the scale, two open tabs double the rate. So the **bridge owns the poll loop, the UI owns the poll string.** + +--- + +## Bridge changes (`serial_bridge/app.py`) + +Note `serial_reader.py` and `backend_client.py` in that folder are dead code — nothing imports them. Leave them alone; all live code is in `app.py`. + +### 1. Runtime poll configuration + +``` +POST /poll {"command": "%p", "interval": 0.2} -> bridge stores and runs the loop +POST /poll {"command": ""} -> continuous mode, no polling +GET /poll -> current setting +``` + +The UI pushes this on connect, from the station's protocol definition. The bridge writes the bytes verbatim — `%p` bare, **no terminator** (confirmed against the original Delphi, where `TComPort.WriteStr('%p')` appends nothing). + +**Persist the last setting to a local file** (`poll_config.json` beside the executable) and restore it on startup. Otherwise a bridge restarted with no browser open sits idle in a confusing dead state. + +### 2. One-off command endpoint — for the admin monitor + +``` +POST /send {"command": "%p"} +``` + +Writes once, does not change the poll loop. This is the probe tool for identifying an unknown scale. + +### 3. Raw bytes alongside text + +`read_data()` currently does `.decode('utf-8', errors='ignore')`, which **silently corrupts binary frames** — Toledo Continuous starts with `STX` (0x02) and packs status into bit fields. Add a `hex` field to every SSE payload: + +```python +{'port': ..., 'data': '', 'hex': '02 20 30 ...', 'timestamp': ...} +``` + +The UI parses text protocols from `data` and binary ones from `hex`. Cheap now, painful to retrofit once something depends on `data`. + +### 4. Polling loop + +Extend `read_serial_data()`: when a poll command is set, write it, wait briefly, then read. Keep the existing buffer-drain behaviour for continuous mode (it discards stale lines and keeps the newest — added earlier today; essential for streaming scales, harmless for polled ones). + +### 5. `.env` shrinks to machine-local hardware facts + +``` +COM_PORT=COM3 +BAUD_RATE=9600 +TIMEOUT=1 +PORT=5000 +LOG_LEVEL=INFO +``` + +No protocol, no poll command, no `STATION_ID`. COM port and baud must stay local — Django cannot know this PC's wiring. + +### 6. Version reporting + +Bridge reports its version in `/status`. Surfaced in the UI so stale stations are visible at a glance rather than discovered when one misbehaves. + +--- + +## Backend: protocol definitions + +### Model — `api/models.py` + +```python +class ScaleProtocol(models.Model): + name = models.CharField(max_length=100, unique=True) + kind = models.CharField(max_length=20, choices=[...]) # fixed_column | regex | toledo_continuous | sics + poll_command = models.CharField(max_length=20, blank=True) # '' = continuous + poll_interval = models.FloatField(default=0.2) + config = models.JSONField(default=dict) # kind-specific parameters + is_builtin = models.BooleanField(default=False) # seeded; not user-deletable +``` + +`config` for `fixed_column` (the case the builder targets, and what covers the no-names): + +```json +{"weight_start": 4, "weight_length": 8, + "stable_pos": 21, "stable_char": " ", "stable_means_balanced": true, + "decimals": 0} +``` + +**Offsets stored 0-based**, converted for display in the builder. The `%p` scale's "weight from char 5, length 8; stability last char" is 1-based Delphi — so `weight_start: 4`, `stable_pos: 21`. + +Seed four via data migration: Simulator, `%p` fixed-column, Toledo Continuous, SICS. Marked `is_builtin`. + +ViewSet + route `scale-protocols` in `api/urls.py`, following the existing router convention. + +--- + +## Frontend + +### 1. Protocol cache — `contexts/ScaleProtocolContext.jsx` + +Fetch `/api/scale-protocols/` on mount, cache, subscribe to SSE updates. Mirrors `NomenclatureDataContext`, which already does exactly this; reuse its shape rather than inventing a new one. + +### 2. Parsers — `services/scaleProtocols.js` + +One function per kind, all returning the same shape: + +```js +parse(reading, protocol) -> { weight: number|null, balanced: boolean, error: string|null } +``` + +- **`fixed_column`** — slice by offsets. Must **not** trim before reading `stable_pos`: in the `%p` format a *space* means balanced, so trailing-whitespace stripping would invert the signal and make every reading look unstable. +- **`toledo_continuous`** — parse from `hex`. STX + SWA/SWB/SWC + 6 weight + 6 tare digits + CR. Stability is the **motion bit in SWB** (set = moving), decimal position from SWA. +- **`sics`** — `S S 16480 kg` → stable; `S D` → dynamic; `S I` / `S +` / `S -` → error states. +- **`simulator`** — trailing `ST`/`US`, the current behaviour. + +**Return an explicit error rather than a plausible weight** when a frame doesn't match. Toledo and SICS are written from documented structure without hardware to test against, so they must fail loudly — a silently wrong weight on a weighbridge is worse than no weight. + +### 3. `Main.jsx` — replace the inline regex + +The current `currentWeight` / `isBalanced` memos parse the reading directly. Replace with a call to the selected protocol's parser. Everything downstream (the red/green colouring, the Measure button) already consumes `{weight, balanced}` and is unaffected. + +The UI POSTs `/poll` to the bridge on connect with the station's protocol command and interval. + +### 4. Admin: COM monitor + protocol builder + +New page, gated on `is_admin`: +- **Live raw view** — each incoming line as text and hex, scrolling, pause/capture to file. Hex matters: it's the only way to see `STX` or trailing spaces. +- **Send command** — free-text box posting `/send`, for probing an unknown scale. +- **Fixed-column builder** — form for weight start/length, stability position and character; **applied live against the captured lines** so the admin sees the parsed result before saving. This is what makes it usable without the developer. + +--- + +## Which station uses which protocol + +Deployment is flexible (one central Django at the port; single-machine elsewhere), so the browser identifies its station implicitly: **it talks to whichever bridge is on localhost:5000.** No cookie, no per-browser state — cookies were rejected because they are per-browser, wiped by clearing site data, and unreadable by the bridge. + +The protocol selection for a station is held in Django and chosen in the UI. With one scale per PC this is a single selection; it does not require a full Station entity yet. + +--- + +## Edge cases + +| Case | Behaviour | +|---|---| +| Frame doesn't match the protocol | Parser returns `error`; UI shows unparseable rather than a wrong number | +| Binary frame through `data` | Use `hex`; `data` is lossy by design | +| `%p` reply shorter than 22 chars | Guard offsets; return error, never slice past the end | +| Bridge restarted, no browser open | Restores poll config from its local file and keeps polling | +| Two tabs open | Both POST `/poll` with the same values — idempotent, loop stays single | +| Django down | Live weight unaffected; UI uses cached protocol definitions | + +--- + +## Verification + +1. **Simulator unchanged** — existing test writer keeps working end to end; weight displays and colours as today. This is the regression guard for the whole refactor. +2. **Fixed-column against a synthetic `%p`** — extend the test writer to emit a 22-char frame; confirm weight and the space-means-balanced rule, including that a trailing space survives. +3. **Toledo/SICS** — unit-test the parsers against hand-built frames. Mark clearly as **unvalidated against real hardware** until a real scale confirms them. +4. **Poll loop** — POST `/poll`, confirm the bridge writes on interval; empty command stops it; setting survives a bridge restart. +5. **Hex field** — verify a frame containing 0x02 arrives intact in `hex` while `data` is lossy. +6. **Builder** — capture lines from the simulator, build a fixed-column protocol in the UI, confirm the live preview parses correctly before save. +7. **Offsets** — the `%p` 1-based → 0-based conversion, explicitly tested. One position off silently clips a digit. + +--- + +## Files + +**Bridge** — `serial_bridge/app.py` (poll endpoints, `/send`, hex field, poll loop, version), `serial_bridge/.env` + +**Backend** — `api/models.py`, `api/serializers.py`, `api/views.py`, `api/urls.py`, migration + seed data migration + +**Frontend** — `contexts/ScaleProtocolContext.jsx`, `services/scaleProtocols.js`, `components/Main.jsx`, new admin monitor/builder component + +**Not touched** — `serial_reader.py`, `backend_client.py` (dead code) + +--- + +## Deliberately out of scope + +- **Station entity** — one scale per PC makes it unnecessary now; add it if a PC ever drives two scales. +- **Bridge self-update** — version reporting only. Real update machinery is speculative until you see how often bridges actually change. +- **Regex/delimited builder kinds** — the model supports the `kind` field, but only fixed-column gets builder UI. Add others if a real scale needs one. + +--- + +## Implementation notes (built 2026-09-17) + +All three tiers built and verified. Deviations and details worth recording: + +**Protocol selection is per-browser (`localStorage`), not a Station model.** With one scale per PC the browser talks to its own bridge on localhost, so a full Station entity was not needed. If a PC ever drives two scales, that changes. + +**Bridge version 1.1.0** — reported in `/status` and shown in the monitor toolbar. + +**`poll_config.json` sits beside the bridge executable** and is gitignored along with `serial_bridge.log`. Both are per-machine runtime state. + +**Fallback protocol**: if none is chosen, the frontend uses the Simulator definition so a fresh install shows a weight rather than an error. + +### Verified + +- **27 parser unit tests pass** (scratchpad `test_protocols.mjs`), covering all four kinds plus error paths. Notably: space-means-balanced for `%p`, inverted stability, `decimals` scaling, Toledo motion bit and sign bit, SICS `I`/`+`/`-` error states, and `"16480 kg BEST"` correctly NOT read as stable. +- **Backend API**: seeded 4 protocols; custom create/delete; built-ins protected from deletion; invalid offsets and non-positive poll intervals rejected. +- **Bridge endpoints**: `/poll` get/set, persistence across restart, empty command = continuous, bad intervals rejected, `/send` 503 when disconnected, `/status` reports version and poll state. +- **Byte handling**: a binary Toledo frame survives byte-exact in `hex` (STX intact); a 22-char `%p` line keeps its significant trailing space while CRLF is stripped; the backlog drain still keeps only the newest line. + +### Still unvalidated + +**Toledo Continuous and SICS have never seen real hardware.** Both are written from documented structure. They return explicit errors rather than guesses on malformed frames, and the monitor shows the raw hex needed to correct them. Expect the first real Toledo to need a tweak — most likely the SWA decimal-point table or a SWB bit position. diff --git a/.claude/plans/reorder-nomenclatures-drag-drop.md b/.claude/plans/reorder-nomenclatures-drag-drop.md new file mode 100644 index 0000000..9bd314d --- /dev/null +++ b/.claude/plans/reorder-nomenclatures-drag-drop.md @@ -0,0 +1,115 @@ +# Plan: Drag-to-reorder nomenclatures, reflected in vehicle "Additional Data" + +## User Request + +> in nomenclatures overlay, make the rows in the list draggable, so they can be rearranged. then in vehicle, show the fields in this order + +Clarified with screenshots: the target is the **left-hand list in the Nomenclatures overlay** +(Агент, Товар, Товародател, № Контейнер, Корабособственик). The client wants to be able to move +e.g. "Агент" to the bottom of the list, and the vehicle screen's "Additional Data" dropdowns +should then appear in that same order. + +## Plan + +### Context + +The backend already supports this fully: `Nomenclature.sort_order` exists +(`backend/nomenclatures/models.py:29`), `Meta.ordering = ["sort_order", "code"]` +(`models.py:32`), the viewset orders by it (`backend/api/views.py:260`), the serializer +exposes it as writable (`backend/api/serializers.py:264`), and `Main.jsx:31` already sorts +`vehicleNomenclatures` by it. **No backend change and no migration are needed.** + +The reason the order looks fixed today is that every existing row has `sort_order = 0` — the +model default — so the sort is a no-op and rows fall back to `code` order. Assigning real +values on the first drag fixes that permanently. + +Decisions taken with the user: +- Persist by PATCHing each moved row (frontend-only; no new endpoint). +- Save immediately on drop — no Save-button staging. +- The whole row is draggable (no separate grip handle). + +### Scope + +Two files change. Both are frontend. + +#### 1. `frontend/src/components/NomenclatureManager/NomenclatureManager.jsx` + +Add native HTML5 drag-and-drop to the left list (lines 189–217). No library — `package.json` +has no DnD dependency and adding one for a five-row list is not warranted. + +**State:** two new pieces of local state — `dragIndex` (index of the row being dragged, +`null` when idle) and `dragOverIndex` (index the row would drop into, for the drop-line +indicator). Plus reuse of the existing `error` state for failure messages. + +**Row markup** (`.nm-list-item`, line 191): add +- `draggable={canEdit}` — reordering is an edit, so gate it on the same `canEdit` + (`currentUser?.can_manage_entities`) that already gates the edit/add/delete buttons. +- `onDragStart` → record `dragIndex`; call `e.dataTransfer.setData('text/plain', String(idx))` + (Firefox refuses to start a drag without data set) and `e.dataTransfer.effectAllowed = 'move'`. +- `onDragOver` → `e.preventDefault()` (required or no drop event fires) and set `dragOverIndex`. +- `onDragEnd` → clear both indices (fires even on a cancelled drag, so it is the reliable reset). +- `onDrop` → `e.preventDefault()`, then run the reorder below. +- `className` gains conditional `nm-list-item--dragging` / `nm-list-item--drag-over` modifiers. + +Change the `.map(nom => ...)` at line 190 to `.map((nom, idx) => ...)` so handlers have the +index. The React `key={nom.id}` at line 192 is already stable and correct — leave it. + +**Reorder handler** `handleDrop(targetIdx)`: +1. Bail if `dragIndex === null || dragIndex === targetIdx`. +2. Build the reordered array with a splice-out/splice-in on a copy of `nomenclatures`. +3. Write `sort_order: i` onto every element of the new array, and `setNomenclatures(...)` + immediately — optimistic update, so the list does not visibly snap back while the requests + are in flight. +4. Diff against the previous array and PATCH only rows whose `sort_order` actually changed: + `api.patch('/api/nomenclatures/${id}/', { sort_order: i })`, all in one `Promise.all`. + PATCH (not PUT) matters — `NomenclatureSerializer.update` deletes and recreates the whole + `fields` collection (`backend/api/serializers.py:284-287`), so a PUT without a `fields` key + would wipe the field definitions. A partial update leaves `fields` untouched. +5. On rejection: `setError('Failed to save order')` and `await loadNomenclatures()` to resync + from the server. + +Note the first drag will PATCH nearly every row, because they all currently sit at +`sort_order = 0` and the diff sees every position as changed. That is correct and self-healing — +subsequent drags only touch the rows between the source and target. + +**One caveat to handle:** each PATCH triggers `sse_broadcast_update('nomenclature', 'update', ...)` +(`backend/api/views.py:268`), and `NomenclatureDataContext.jsx:82-85` responds to any +`nomenclature` event with a full `loadAll()` refetch. For a 5-row reorder that is ~5 events +collapsing into a few refetches of a small payload — acceptable, and it is what makes the +vehicle screen update live without a page reload. No debounce needed at this scale; revisit +only if the list ever grows large. + +#### 2. `frontend/src/components/NomenclatureManager/NomenclatureManager.css` + +- `.nm-list-item` (line 117) — the existing rule already has `cursor: pointer`; leave it. Add + `user-select: none` so dragging does not paint a text selection across the row. +- `.nm-list-item--dragging` — `opacity: 0.4`, to show which row is in flight. +- `.nm-list-item--drag-over` — a drop indicator in the accent already used by + `.nm-list-item--active` (line 132). Because `.nm-list-item` has a `border-bottom` (line 122), + use an inset `box-shadow: inset 0 2px 0 #667eea` rather than a border so row height does not + shift by 2px during the drag. + +### Explicitly not in scope + +- `NomenclatureField` rows (the "Fields" table on the right panel) — they have their own + `sort_order` that the save payload currently drops, but the user asked about the left list + only. Flagged to the user as a separate known gap, not fixed here. +- `NomenclatureEntry` ordering — entries have no `sort_order` column at all; that would need a + migration. Not requested. +- `Main.jsx` — **no change required.** Line 31 already sorts by `sort_order`. Left as is. + +### Verification + +1. Start backend (`cd backend && uvicorn scalesapp.asgi:application --reload`) and frontend + (`cd frontend && npm start`); log in as a user with `can_manage_entities`. +2. Open the Nomenclatures overlay. Drag **Агент** from the top to the bottom of the left list. + Verify: the row follows the cursor with a drop indicator, and lands last on release. +3. Check the Network tab: several `PATCH /api/nomenclatures/{id}/` requests, each with a + `{sort_order: N}` body only, all returning 200. +4. Without reloading, look at the vehicle screen's "Additional Data" section — **АГЕНТ should + now be the last dropdown**, moved there live by the SSE-driven `loadAll()`. +5. Hard-reload the page (F5) and confirm both the overlay list and Additional Data still show + Агент last — this proves it persisted rather than only living in local state. +6. Re-open the overlay, click a nomenclature to edit it, and confirm its **Fields table still + lists its fields** — this is the PUT-vs-PATCH regression guard from step 4 of the handler. +7. Log in as a user without `can_manage_entities` and confirm rows are not draggable. diff --git a/.claude/plans/single-measure-button.md b/.claude/plans/single-measure-button.md new file mode 100644 index 0000000..3789b64 --- /dev/null +++ b/.claude/plans/single-measure-button.md @@ -0,0 +1,176 @@ +# Single "Measure" Button + Manual Measurement + +## Context + +The weighing screen has two buttons, **Set Tare** and **Set Gross**. Operators regularly press the wrong one. Since the vehicle is on the scale either empty or loaded, the app can decide which is which — the operator shouldn't have to. + +This replaces both with a single **Measure** button. The first press records a weighing; the second press records the other and finalizes the document. Assignment is **by weight**, not by order. + +A second, related need: sometimes a weight must be entered by hand (scale offline, disputed reading). That must be recorded as manual, with who, when and why. + +**Decisions made with the user:** +- Site handles **both directions** — trucks may arrive loaded and leave empty. So order can't decide; **lighter = tare, heavier = gross**, regardless of which was taken first. +- Pressing Measure on an already-finalized vehicle is **blocked** (button disabled), matching today's behaviour. No silent mutation of an issued document. +- **No clear/redo.** Scales expose a "balanced" flag and measuring will later be gated on it. Not in this change. +- Manual measurement is built **now**, extending the existing `tare_manual` / `gross_manual` booleans with user, date and note per measurement. + +--- + +## Why weight-based assignment + +`net = gross - tare`, so assigning the lighter reading to tare makes a negative net structurally impossible. Order-based assignment (first = tare) would produce a negative net for every outbound truck — which the user confirmed happens here. + +The tradeoff to be aware of: for two weighings the rule is unambiguous, but it means **the first reading's role is not final until the second arrives**. A truck weighed at 15000 shows as tare; if the next weighing is 8000, the 15000 becomes gross and the 8000 becomes tare. The UI must not present the first reading as settled. + +**Handling**: while only one weighing exists, display it in a single neutral card labelled **"First weighing"** rather than filling in the Tare card. Once the second arrives, both cards populate with their final roles. This avoids a value visibly jumping between cards, which would look like a bug. + +**Equal weights** (`gross == tare`) yield `net = 0`. Physically it means nothing was loaded or unloaded. Treat as valid and let it finalize — rejecting it would strand the vehicle with no way forward, and a zero-net document is a legitimate record of a truck that came and went unchanged. + +--- + +## Backend + +### 1. Model — `backend/vehicles/models.py` + +Extend the existing unused `tare_manual` / `gross_manual` booleans with companions. Keep them adjacent to the weight group they describe, matching the file's existing layout. + +```python + tare_manual = models.BooleanField(default=False) + tare_manual_user = models.ForeignKey(User, null=True, blank=True, related_name='user_vehicle_tare_manual', on_delete=models.SET_NULL) + tare_manual_date = models.DateTimeField(null=True, blank=True) + tare_manual_note = models.CharField(max_length=255, null=True, blank=True) +``` + +and the `gross_` equivalents (`related_name='user_vehicle_gross_manual'`). + +`related_name` must not collide with the existing `user_vehicle_tare` / `user_vehicle_gross`. + +Migration: `python manage.py makemigrations vehicles` → `0006_...` (latest is now `0005_extracombination`). All fields nullable with defaults, so no interactive prompt. + +### 2. Assignment helper — `backend/api/views.py` + +Add beside `_maybe_finalize`: + +```python +def _assign_weighing(vehicle, value, user, manual=False, note=None): + """Record a weighing. Assigns by weight: lighter becomes tare, heavier becomes gross. + + First weighing is parked in tare; the second may swap it if it turns out lighter, + since trucks may arrive either loaded (outbound) or empty (inbound). + """ +``` + +Logic: + +- **Neither set** — park in `tare` (`tare_date`, `tare_user`, and the manual fields when manual). Role is provisional until the second weighing. +- **One set (tare only)** — compare against the parked value. If the new reading is heavier or equal, it becomes `gross`. If lighter, it becomes `tare` and the **parked values move to gross** — carrying their own date, user and manual fields with them, so provenance follows the value rather than the slot. Then `_maybe_finalize`. +- **Both set** — raise; the viewset returns 400. Should be unreachable from the UI (button disabled) but the API must not be trusted to be called only by the UI. + +The swap must move **all** companion fields together (`*_date`, `*_user`, `*_manual`, `*_manual_user`, `*_manual_date`, `*_manual_note`). Missing one silently misattributes who took a reading — the most likely bug in this change, and invisible until someone audits a document. + +### 3. Endpoint — `backend/api/views.py` + +One new action on `VehicleViewSet`, replacing `set_tare` / `set_gross`: + +```python + @action(detail=True, methods=['post'], url_path='measure') + def measure(self, request, pk=None): + """Record a weighing. The app assigns tare vs gross by weight.""" +``` + +- `value` required, coerced to `int` — same validation as the current `set_tare`. +- `manual` (bool, default false) and `note` (string, optional) in the body. +- **Permissions**: reject unless `request.user.can_measure`; additionally require `can_manually_measure` when `manual` is true. These flags exist on `User` and are editable in UserManager but are **currently enforced nowhere** — this is the first enforcement. 403 with a clear detail message. +- **Manual requires a note** — reject blank. A manual override without a reason is not worth recording. +- Returns the serialized vehicle and broadcasts `sse_broadcast_update('vehicle', 'updated', ...)`, matching the existing pattern. + +**Delete `set_tare` and `set_gross`.** They bypass the assignment rule, so leaving them routed would leave the wrong-value path open — the exact problem being fixed. Nothing else calls them (verified: only `Main.jsx`). + +### 4. Serializer — `backend/api/serializers.py` + +Add the six new fields to `VehicleSerializer.fields` and to `read_only_fields` — they are set only through the `measure` action, never by direct PATCH. + +--- + +## Frontend + +### 5. `Main.jsx` — replace the two handlers + +`handleSetTare` and `handleSetGross` (lines 122-140) collapse into: + +```jsx + const handleMeasure = async () => { + if (!selectedVehicle || currentWeight === null || isNaN(currentWeight)) return; + setError(''); + try { + await api.post(`/api/vehicles/${selectedVehicle.id}/measure/`, { value: currentWeight }); + } catch (err) { + setError(err.response?.data?.detail || 'Failed to record measurement'); + } + }; +``` + +Note the current handlers swallow the server message (`catch { setError('Failed to set tare') }`). Surface `detail` instead, so permission and already-finalized errors are legible. + +Manual entry: a small modal (weight, required note) posting the same endpoint with `manual: true`. Trigger shown only when `currentUser?.can_manually_measure`, using the `useAuth()` pattern from NomenclatureManager. + +### 6. `Main.jsx` — weighing section JSX + +Replace the two `weight-card` blocks (lines 362-401). Three states: + +- **No weighings** — one neutral card, `---`, with the **Measure** button. +- **One weighing** — one card headed **"First weighing"** showing value, timestamp, user, and a `manual` marker if applicable. Measure button still enabled. Deliberately *not* labelled Tare. +- **Both** — Tare and Gross cards as today, each showing its own meta, plus the existing Net card. Measure button disabled. + +Button disabled when: no live weight, or both weights set. Gate visibility on `can_measure`. + +Reuse the existing `.weight-card`, `.weight-card-header`, `.weight-card-value`, `.weight-card-meta`, `.weight-set-btn` classes — no new CSS beyond a modifier for the manual marker. + +--- + +## Edge cases + +| Case | Behaviour | +|---|---| +| Second reading **lighter** than the first | New value becomes tare; parked values move to gross with all their metadata. Net positive. | +| Second reading **equal** | Becomes gross, `net = 0`, finalizes. Valid record. | +| Measure on a **finalized** vehicle | Button disabled; API returns 400 if called directly. | +| User lacks `can_measure` | 403. Button hidden. | +| Manual without `can_manually_measure` | 403. Trigger hidden. | +| Manual with blank note | 400. | +| Two operators measuring the same vehicle at once | Last write wins, as today. Out of scope — flagged, not fixed. | + +--- + +## Verification + +Backend on 8002 (`run_server.bat`), frontend on 5172 (`npm start`). + +1. **Migration** — `python manage.py showmigrations vehicles` shows `[X] 0006_...`. +2. **Inbound** — new vehicle, measure 8000 → "First weighing" card, not Tare. Measure 15000 → Tare 8000, Gross 15000, Net 7000. +3. **Outbound (the case order-based logic breaks)** — measure 15000 first, then 8000 → Tare 8000, Gross 15000, Net **7000, positive**. Confirm the 15000's original date/user followed it to gross. +4. **Equal** — 10000 twice → Net 0, finalized. +5. **Third press blocked** — button disabled; direct POST returns 400. +6. **Permissions** — user without `can_measure` gets 403 and no button; without `can_manually_measure`, no manual trigger. +7. **Manual** — record manually with a note; confirm `*_manual`, `*_manual_user`, `*_manual_date`, `*_manual_note` in the shell. Blank note → 400. +8. **Provenance after swap** — the shell check that matters: + ``` + python manage.py shell -c "from vehicles.models import Vehicle; v=Vehicle.objects.get(vehicle_number='X'); print(v.tare, v.tare_date, v.tare_user, v.tare_manual); print(v.gross, v.gross_date, v.gross_user, v.gross_manual)" + ``` + Each weight must carry the date/user of the press that produced it. +9. **Old endpoints gone** — POST to `set-tare` returns 404. +10. **Build** — `npm run build` compiles with no new warnings. + +--- + +## Files changed + +**Backend** +- `backend/vehicles/models.py` — 6 fields on `Vehicle` +- `backend/vehicles/migrations/0006_...py` — generated +- `backend/api/serializers.py` — fields on `VehicleSerializer`, read-only +- `backend/api/views.py` — `_assign_weighing()`, `measure` action, delete `set_tare`/`set_gross` + +**Frontend** +- `frontend/src/components/Main.jsx` — `handleMeasure`, manual modal, rewritten weighing section +- `frontend/src/components/Main.css` — manual marker style diff --git a/.claude/plans/venv-auto-activation.md b/.claude/plans/venv-auto-activation.md new file mode 100644 index 0000000..9746c11 --- /dev/null +++ b/.claude/plans/venv-auto-activation.md @@ -0,0 +1,164 @@ +# Auto-activate the Python venv in VS Code terminals + +## Context + +Opening a terminal in VS Code does not activate the project's Python venv. Two causes: + +1. **The venv is not where VS Code looks.** It lives at `backend/venv`, but the Python + extension's auto-discovery only scans for `.venv`/`venv` directly under the opened + workspace folder (`C:\dev_projects\ScalesApp`) — one level above it. +2. **No interpreter is configured.** There is no `.vscode/settings.json` in the project, + and the user-level settings contain no `python.defaultInterpreterPath`. Without a known + interpreter, the extension has nothing to activate. + +Separately, none of the `run_*.bat` scripts activate the venv — they call `python` / +`uvicorn` bare, so they only work when a venv happens to already be active. + +**Outcome:** a single `.venv` at the project root that VS Code discovers automatically, +plus batch scripts that activate it themselves and work from any shell state. + +### Findings that shape the plan + +- The existing `backend/venv` (Python 3.11.9, 138 MB) already has the dependencies from + **all three** requirements files installed (Django + uvicorn, Flask + pyserial + + pystray + PyInstaller). One shared root venv is therefore a faithful consolidation, + not a new decision. +- Base interpreter `C:\dev\Python\Python311\python.exe` (3.11.9) is present — verified. +- `.gitignore` **already** ignores `.vscode/` and `venv/`, and has a `.venv` entry. + The user chose to keep VS Code settings local, so **no `.gitignore` change is needed**. + +### Decisions made + +- Consolidate into one root `.venv` (standard layout, zero-config discovery). +- Version conflicts between requirements files: **highest version wins** — + install order chosen so the result is `python-dotenv==1.0.1` and `requests==2.32.5`. +- Delete `backend/venv` only **after** the new venv is verified working. + +--- + +## Steps + +### 1. Create the root venv + +```bat +C:\dev\Python\Python311\python.exe -m venv C:\dev_projects\ScalesApp\.venv +``` + +→ **verify:** `.venv\Scripts\python.exe --version` prints `Python 3.11.9`. + +### 2. Install dependencies (order matters) + +Install so that the higher pin of each conflicting package is applied last: + +```bat +.venv\Scripts\python.exe -m pip install --upgrade pip +.venv\Scripts\python.exe -m pip install -r backend\requirements.txt +.venv\Scripts\python.exe -m pip install -r test_comport_writer\requirements.txt +.venv\Scripts\python.exe -m pip install -r serial_bridge\requirements.txt +``` + +`serial_bridge` pins `requests==2.32.5` (higher) and `python-dotenv==1.0.0` (lower), so a +final explicit pin is required to land on the intended "highest wins" result: + +```bat +.venv\Scripts\python.exe -m pip install "python-dotenv==1.0.1" +``` + +→ **verify:** `pip freeze` shows `python-dotenv==1.0.1` and `requests==2.32.5`, and +`pip check` reports no broken dependencies. + +### 3. Create `.vscode/settings.json` (local only, already gitignored) + +New file — `.vscode/settings.json`: + +```json +{ + "python.defaultInterpreterPath": "${workspaceFolder}\\.venv\\Scripts\\python.exe", + "python.terminal.activateEnvironment": true +} +``` + +`python.terminal.activateEnvironment` defaults to `true`, but is stated explicitly here so +the intent is visible and survives a future user-settings change. + +→ **verify:** reload the VS Code window, open a fresh terminal, and confirm the prompt is +prefixed with `(.venv)`. + +### 4. Make the batch scripts self-contained + +Add a `call` to the venv activation script so each one works regardless of shell state. + +- **`run_server.bat`** — currently `cd .\backend\` then `uvicorn ...` (also note: the file + has no trailing newline). Activate from the root *before* the `cd`: + + ```bat + @echo off + call "%~dp0.venv\Scripts\activate.bat" + cd /d "%~dp0backend" + uvicorn scalesapp.asgi:application --host 127.0.0.1 --port 8000 --reload + ``` + +- **`run_comport_reader.bat`** — currently `python .\serial_bridge\app.py`: + + ```bat + @echo off + call "%~dp0.venv\Scripts\activate.bat" + python "%~dp0serial_bridge\app.py" + ``` + +- **`run_test.bat`** — currently `python .\test_comport_writer\test_writer.py`: + + ```bat + @echo off + call "%~dp0.venv\Scripts\activate.bat" + python "%~dp0test_comport_writer\test_writer.py" + ``` + +`%~dp0` (the directory of the batch file itself, with trailing backslash) makes each +script independent of the caller's working directory. `stop.bat` needs no change — it only +calls `taskkill`. + +### 5. Remove the old venv — only after step 6 passes + +```bat +rmdir /s /q C:\dev_projects\ScalesApp\backend\venv +``` + +Reclaims 138 MB and prevents two interpreters drifting apart. + +--- + +## Verification + +Run in order; do not proceed to the deletion in step 5 until all of these pass. + +1. **Interpreter** — `.venv\Scripts\python.exe --version` → `Python 3.11.9`. +2. **Dependencies** — `.venv\Scripts\python.exe -m pip check` → no issues; + `pip freeze` shows `python-dotenv==1.0.1`, `requests==2.32.5`. +3. **Auto-activation** — reload the VS Code window, open a **new** terminal: + prompt shows `(.venv)`; `where python` resolves to `...\ScalesApp\.venv\Scripts\python.exe`. +4. **Django backend** — `run_server.bat` from a plain `cmd.exe` (no venv pre-activated): + uvicorn starts and serves on `http://127.0.0.1:8000`. + Also confirm `python manage.py check` in `backend/` reports no issues. +5. **Serial bridge** — `run_comport_reader.bat` starts the Flask server on port 5000 + without an import error (`pyserial`, `flask`, `pystray` all resolve). +6. **Test writer** — `run_test.bat` launches without an import error. + +If step 4 or 5 fails on a missing package, the old `backend/venv` is still intact — install +the missing package into `.venv` rather than rolling back. + +--- + +## Files touched + +| File | Change | +|---|---| +| `.venv/` | **new** — root venv (gitignored) | +| `.vscode/settings.json` | **new** — interpreter path (gitignored, local only) | +| `run_server.bat` | activate venv; use `%~dp0` for path independence | +| `run_comport_reader.bat` | same | +| `run_test.bat` | same | +| `backend/venv/` | **deleted** after verification | + +No application code changes. `.gitignore` needs no edit — `.vscode/`, `venv/` and `.venv` +are all already covered. diff --git a/~WRL0003.tmp b/~WRL0003.tmp deleted file mode 100644 index 3512a337f88ccf398095e26e7b7831630cda3c47..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 158082 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

i0CW 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 Mk