feat(dev): /dev/reset-delivery — einzelne Lieferung per Belegnummer zurücksetzen

Setzt EINE Lieferung zurück, ohne die Tour zu löschen (Alternative zum
destruktiven /dev/resync): Abschluss (delivery_completions), Scan-/
Gutschrift-Audit + offener Report-Job weg, Positionen zurück (scanned/
credited = 0, Status in_progress), Lieferung wieder active (state_reason/
assigned_car/review_* geleert). Notizen/Dienstleistungen/Anhänge bleiben.

Vervollständigt den bisher nur als Port-Stub vorhandenen
reset_delivery_by_belegnummer (Build war dadurch kaputt) + Use Case +
DEV-Route (nur bei dev.sync_enabled gemountet, unauthentifiziert).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Dennis Nemec
2026-06-24 13:35:45 +02:00
parent fb5f43ed7a
commit 819005eaa5
7 changed files with 173 additions and 2 deletions

View File

@ -24,6 +24,7 @@ use crate::state::AppState;
pub fn router() -> Router<AppState> {
Router::new()
.route("/dev/resync", post(dev_resync))
.route("/dev/reset-delivery", post(dev_reset_delivery))
.route("/dev/generate-report", post(dev_generate_report))
.route("/dev/process-report", post(dev_process_report))
.route("/dev/unmark-mail-sent", post(dev_unmark_mail_sent))
@ -64,6 +65,43 @@ pub async fn dev_resync(
Ok(Json(summary))
}
#[derive(Debug, Deserialize)]
pub struct DevResetDeliveryQuery {
/// ERP-Belegnummer der zurückzusetzenden Lieferung.
pub belegnummer: String,
}
#[derive(Debug, Serialize)]
pub struct DevResetDeliveryResponse {
pub belegnummer: String,
/// Anzahl zurückgesetzter Lieferungen (1 bei Erfolg).
pub reset: u64,
}
/// DEV-ONLY, UNAUTHENTIFIZIERT: setzt EINE Lieferung (per Belegnummer) zurück —
/// Abschluss, Scan-/Gutschrift-Audit + Report-Job weg, Positionen + Lieferung
/// zurück auf `active`. Notizen/Dienstleistungen/Anhänge bleiben. 404, wenn die
/// Belegnummer unbekannt ist.
pub async fn dev_reset_delivery(
State(state): State<AppState>,
Query(query): Query<DevResetDeliveryQuery>,
) -> Result<Json<DevResetDeliveryResponse>, ApiError> {
tracing::warn!(belegnummer = %query.belegnummer, "dev.reset_delivery");
let reset = state.dev_reset_delivery.execute(&query.belegnummer).await?;
if reset == 0 {
return Err(ApiError(ApplicationError::NotFound));
}
tracing::info!(
belegnummer = %query.belegnummer,
reset,
"dev.reset_delivery.done"
);
Ok(Json(DevResetDeliveryResponse {
belegnummer: query.belegnummer,
reset,
}))
}
#[derive(Debug, Deserialize)]
pub struct DevReportQuery {
/// UUID der Lieferung, für die der Report erzeugt werden soll.