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:
@ -38,7 +38,7 @@ use holzleitner_application::usecases::{
|
||||
DeleteDeliveryNoteUseCase, DeleteDeliveryServiceUseCase, DeletePaymentMethodUseCase,
|
||||
DeleteServiceUseCase, DevResetDeliveryUseCase, DevResyncToursUseCase,
|
||||
GenerateDeliveryReportUseCase, GetAccountUseCase,
|
||||
GetAttachmentPreviewUseCase, GetTourUseCase,
|
||||
GetAttachmentPreviewUseCase, GetPositionsModifiedUseCase, GetTourUseCase,
|
||||
ImportErpToursUseCase, ListCompletedDeliveriesUseCase, ListDeliveredBelegnummernUseCase,
|
||||
ListMyCarsUseCase,
|
||||
ListMyToursTodayUseCase, ListPaymentMethodsUseCase,
|
||||
@ -371,6 +371,11 @@ pub(crate) async fn run_app(
|
||||
let list_completed_deliveries = Arc::new(ListCompletedDeliveriesUseCase::new(
|
||||
delivery_completion_repository.clone(),
|
||||
));
|
||||
// Admin-Lese-Use-Case: Positions-Änderungs-Flag zu einer Belegnummer.
|
||||
// `.clone()` VOR dem Move in `complete_delivery`.
|
||||
let get_positions_modified = Arc::new(GetPositionsModifiedUseCase::new(
|
||||
delivery_completion_repository.clone(),
|
||||
));
|
||||
let mark_mail_sent = Arc::new(MarkMailSentUseCase::new(
|
||||
delivery_completion_repository.clone(),
|
||||
));
|
||||
@ -467,6 +472,7 @@ pub(crate) async fn run_app(
|
||||
push_completion_to_erp,
|
||||
list_delivered_belegnummern,
|
||||
list_completed_deliveries,
|
||||
get_positions_modified,
|
||||
mark_mail_sent,
|
||||
list_pending_reviews,
|
||||
resolve_review,
|
||||
|
||||
@ -55,6 +55,7 @@ use utoipa::openapi::security::{
|
||||
crate::routes::admin::push_completion,
|
||||
crate::routes::admin::delivered_belegnummern,
|
||||
crate::routes::admin::completed_deliveries,
|
||||
crate::routes::admin::positions_modified,
|
||||
crate::routes::admin::mark_mail_sent,
|
||||
crate::routes::admin::list_reviews,
|
||||
crate::routes::admin::resolve_review,
|
||||
@ -130,6 +131,7 @@ use utoipa::openapi::security::{
|
||||
crate::routes::admin::DeliveredBelegnummernResponse,
|
||||
crate::routes::admin::CompletedDeliveriesResponse,
|
||||
crate::routes::admin::CompletedDeliveryItem,
|
||||
crate::routes::admin::PositionsModifiedResponse,
|
||||
crate::routes::admin::PendingReviewResponse,
|
||||
crate::routes::admin::ReviewedItemResponse,
|
||||
crate::routes::admin::ResolveReviewRequest,
|
||||
|
||||
@ -33,6 +33,10 @@ pub fn router() -> Router<AppState> {
|
||||
"/admin/completed-deliveries",
|
||||
get(completed_deliveries),
|
||||
)
|
||||
.route(
|
||||
"/admin/belege/{belegnummer}/positions-modified",
|
||||
get(positions_modified),
|
||||
)
|
||||
.route("/admin/mark-mail-sent", post(mark_mail_sent))
|
||||
.route("/admin/reviews", get(list_reviews))
|
||||
.route("/admin/reviews/{delivery_id}/resolve", post(resolve_review))
|
||||
@ -303,6 +307,52 @@ pub async fn completed_deliveries(
|
||||
}))
|
||||
}
|
||||
|
||||
#[derive(Debug, Serialize, ToSchema)]
|
||||
pub struct PositionsModifiedResponse {
|
||||
/// ERP-Belegnummer, nach der gefragt wurde.
|
||||
pub belegnummer: String,
|
||||
/// `true`, wenn an der Lieferung Positionen verändert wurden — eine Zeile
|
||||
/// wurde entfernt oder in der Menge reduziert (Stück-Gutschrift) **oder** es
|
||||
/// liegt eine aktive Geld-Gutschrift vor.
|
||||
pub positions_modified: bool,
|
||||
}
|
||||
|
||||
/// Liefert zu **einer** ERP-Belegnummer, ob an der Lieferung Positionen
|
||||
/// verändert wurden (Menge reduziert/Zeile entfernt oder Geld-Gutschrift) —
|
||||
/// unabhängig vom Zustand der Lieferung. `404`, wenn die Belegnummer unbekannt
|
||||
/// ist. Gibt es mehrere Lieferungen mit derselben Belegnummer, ist das Flag
|
||||
/// `true`, sobald **eine** davon verändert ist.
|
||||
#[utoipa::path(
|
||||
get,
|
||||
path = "/admin/belege/{belegnummer}/positions-modified",
|
||||
tag = "admin",
|
||||
params(
|
||||
("belegnummer" = String, Path, description = "ERP-Belegnummer, z. B. V-30690291")
|
||||
),
|
||||
responses(
|
||||
(status = 200, description = "Änderungs-Flag der Belegpositionen", body = PositionsModifiedResponse),
|
||||
(status = 401, description = "Admin-API-Key fehlt/ungültig"),
|
||||
(status = 404, description = "Belegnummer unbekannt")
|
||||
),
|
||||
security(("admin_api_key" = []))
|
||||
)]
|
||||
pub async fn positions_modified(
|
||||
State(state): State<AppState>,
|
||||
Path(belegnummer): Path<String>,
|
||||
) -> Result<Json<PositionsModifiedResponse>, ApiError> {
|
||||
tracing::info!(%belegnummer, "admin.positions_modified");
|
||||
let flag = state
|
||||
.get_positions_modified
|
||||
.execute(&belegnummer)
|
||||
.await?
|
||||
.ok_or(ApiError(ApplicationError::NotFound))?;
|
||||
tracing::info!(%belegnummer, positions_modified = flag, "admin.positions_modified.done");
|
||||
Ok(Json(PositionsModifiedResponse {
|
||||
belegnummer,
|
||||
positions_modified: flag,
|
||||
}))
|
||||
}
|
||||
|
||||
#[derive(Debug, Deserialize, ToSchema)]
|
||||
pub struct MarkMailSentRequest {
|
||||
/// Belegnummern, deren Liefermail erfolgreich versendet wurde und die als
|
||||
|
||||
@ -8,7 +8,7 @@ use holzleitner_application::usecases::{
|
||||
DeleteDeliveryNoteUseCase, DeleteDeliveryServiceUseCase, DeletePaymentMethodUseCase,
|
||||
DeleteServiceUseCase, DevResetDeliveryUseCase, DevResyncToursUseCase,
|
||||
GenerateDeliveryReportUseCase, GetAccountUseCase,
|
||||
GetAttachmentPreviewUseCase, GetTourUseCase,
|
||||
GetAttachmentPreviewUseCase, GetPositionsModifiedUseCase, GetTourUseCase,
|
||||
ImportErpToursUseCase, ListCompletedDeliveriesUseCase, ListDeliveredBelegnummernUseCase,
|
||||
ListMyCarsUseCase,
|
||||
ListMyToursTodayUseCase, ListPaymentMethodsUseCase,
|
||||
@ -54,6 +54,8 @@ pub struct AppState {
|
||||
pub list_delivered_belegnummern: Arc<ListDeliveredBelegnummernUseCase>,
|
||||
/// Admin: alle an einem Tag abgeschlossenen Lieferungen (mit Änderungs-Flag).
|
||||
pub list_completed_deliveries: Arc<ListCompletedDeliveriesUseCase>,
|
||||
/// Admin: Positions-Änderungs-Flag zu einer einzelnen Belegnummer.
|
||||
pub get_positions_modified: Arc<GetPositionsModifiedUseCase>,
|
||||
/// Admin: Liefermails von Belegnummern als versendet markieren (Dedup).
|
||||
pub mark_mail_sent: Arc<MarkMailSentUseCase>,
|
||||
pub list_pending_reviews: Arc<ListPendingReviewsUseCase>,
|
||||
|
||||
Reference in New Issue
Block a user