feat(admin): GET /admin/belege/{belegnummer}/positions-modified
Neuer Admin-Endpunkt, der zu EINER ERP-Belegnummer das positions_modified-Flag liefert (Stück-Gutschrift auf einer Belegzeile ODER aktive Geld-Gutschrift) — gleiche Definition wie in completed-deliveries, aber pro Beleg und ohne Abschluss-Voraussetzung. 404 bei unbekannter Belegnummer; bei mehreren Lieferungen gleicher Belegnummer true, sobald eine verändert ist (bool_or). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@ -148,6 +148,20 @@ pub trait DeliveryCompletionRepository: Send + Sync {
|
||||
to: Option<NaiveDate>,
|
||||
) -> Result<Vec<CompletedDeliverySummary>, ApplicationError>;
|
||||
|
||||
/// Liefert zu einer ERP-Belegnummer, ob an der Lieferung **Positionen
|
||||
/// verändert** wurden — dieselbe Definition wie `positions_modified` in
|
||||
/// [`CompletedDeliverySummary`] (Stück-Gutschrift auf einer Belegzeile
|
||||
/// **oder** aktive Geld-Gutschrift). Zustand der Lieferung egal (kein
|
||||
/// Abschluss vorausgesetzt).
|
||||
///
|
||||
/// `Ok(None)` ⇒ Belegnummer unbekannt (keine Lieferung). Bei mehreren
|
||||
/// Lieferungen mit derselben Belegnummer gilt `true`, sobald **eine** davon
|
||||
/// verändert ist.
|
||||
async fn positions_modified_for_belegnummer(
|
||||
&self,
|
||||
belegnummer: &str,
|
||||
) -> Result<Option<bool>, ApplicationError>;
|
||||
|
||||
/// Markiert die Liefermail der angegebenen Belegnummern als **versendet**
|
||||
/// (`mail_sent_at = now()`), aber nur dort, wo sie noch offen ist
|
||||
/// (`mail_sent_at IS NULL`) — bereits markierte bleiben unverändert
|
||||
|
||||
30
crates/application/src/usecases/get_positions_modified.rs
Normal file
30
crates/application/src/usecases/get_positions_modified.rs
Normal file
@ -0,0 +1,30 @@
|
||||
//! Use Case: zu einer ERP-Belegnummer ermitteln, ob an der Lieferung
|
||||
//! Positionen verändert wurden (Stück-Gutschrift oder aktive Geld-Gutschrift).
|
||||
//!
|
||||
//! Reine Lese-Operation für den Admin-Endpunkt. `Ok(None)` ⇒ Belegnummer
|
||||
//! unbekannt (der Handler macht daraus ein `404`).
|
||||
|
||||
use std::sync::Arc;
|
||||
|
||||
use crate::error::ApplicationError;
|
||||
use crate::ports::DeliveryCompletionRepository;
|
||||
|
||||
pub struct GetPositionsModifiedUseCase {
|
||||
completions: Arc<dyn DeliveryCompletionRepository>,
|
||||
}
|
||||
|
||||
impl GetPositionsModifiedUseCase {
|
||||
pub fn new(completions: Arc<dyn DeliveryCompletionRepository>) -> Self {
|
||||
Self { completions }
|
||||
}
|
||||
|
||||
/// `Some(true/false)` = Beleg gefunden, Flag; `None` = Belegnummer unbekannt.
|
||||
pub async fn execute(
|
||||
&self,
|
||||
belegnummer: &str,
|
||||
) -> Result<Option<bool>, ApplicationError> {
|
||||
self.completions
|
||||
.positions_modified_for_belegnummer(belegnummer)
|
||||
.await
|
||||
}
|
||||
}
|
||||
@ -19,6 +19,7 @@ pub mod get_account;
|
||||
pub mod get_attachment_preview;
|
||||
pub mod get_tour;
|
||||
pub mod import_erp_tours;
|
||||
pub mod get_positions_modified;
|
||||
pub mod list_completed_deliveries;
|
||||
pub mod list_delivered_belegnummern;
|
||||
pub mod list_my_tours_today;
|
||||
@ -47,6 +48,7 @@ pub use generate_delivery_report::GenerateDeliveryReportUseCase;
|
||||
pub use delete_delivery_note::DeleteDeliveryNoteUseCase;
|
||||
pub use get_account::GetAccountUseCase;
|
||||
pub use get_attachment_preview::GetAttachmentPreviewUseCase;
|
||||
pub use get_positions_modified::GetPositionsModifiedUseCase;
|
||||
pub use get_tour::GetTourUseCase;
|
||||
pub use import_erp_tours::{ImportErpToursUseCase, ImportSummary};
|
||||
pub use list_completed_deliveries::ListCompletedDeliveriesUseCase;
|
||||
|
||||
Reference in New Issue
Block a user