M2: implement vehicle return vertical slice

Transactional return command with idempotency, row-lock concurrency control, odometer-regression handling, vehicle status derivation, outbox event, audit trail. Result-summary UI on booking detail. 26 backend tests passing, ruff clean. Verified end-to-end via browser against S1 demo scenario; fixed two real defects found only through browser testing (UI state loss on status transition, unflushed UUID default).
This commit is contained in:
NuklearRabbit
2026-08-01 21:49:46 +02:00
parent 03c5b60235
commit 0091c57c7f
14 changed files with 763 additions and 10 deletions
+16
View File
@@ -172,6 +172,22 @@ a { color: #1f5c8f; }
.login-options button:hover, .login-options button:focus-visible { background: #1f5c8f; }
.login-options p { margin: 0 0 8px; color: #607084; font-size: 0.9rem; }
.return-form, .return-result { margin-top: 24px; max-width: 520px; }
.return-form label {
display: flex; flex-direction: column; gap: 4px;
font-weight: 600; color: #375065; font-size: 0.9rem; margin-bottom: 14px;
}
.return-form input[type="number"], .return-form textarea {
padding: 8px 10px; border: 1px solid #cfd8e2; border-radius: 8px; font-size: 0.95rem; font-family: inherit;
}
.return-form .checkbox-label { flex-direction: row; align-items: center; gap: 8px; }
.return-form button {
padding: 12px 20px; border-radius: 10px; border: none;
background: #14324f; color: white; font-weight: 700; cursor: pointer;
}
.return-form button:disabled { opacity: 0.6; cursor: not-allowed; }
.return-result .error { margin-top: 12px; }
@media (max-width: 700px) {
.app-header { flex-direction: column; align-items: flex-start; }
.user-badge { margin-left: 0; }