feat(admin): GET /admin/completed-deliveries — abgeschlossene Lieferungen eines Tages
Neuer Admin-Endpunkt, der ALLE an einem Tag (Berliner Kalendertag von completed_at) abgeschlossenen Lieferungen liefert — unabhängig vom Mail-Versand-Status. Pro Lieferung: Belegnummer und ein Flag `positions_modified`, das true ist, wenn eine Belegzeile in der Menge reduziert/entfernt wurde (delivery_items.credited_quantity > 0) oder eine aktive Geld-Gutschrift vorliegt (jüngstes delivery_credit_audit-Event 'set'). Pflichtparameter `day` (DD-MM-YYYY). Geschützt per admin_api_key. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@ -14,7 +14,8 @@ use uuid::Uuid;
|
||||
|
||||
use holzleitner_application::error::ApplicationError;
|
||||
use holzleitner_application::ports::{
|
||||
CompleteDeliveryInput, DeliveryCompletionRepository, ErpWritebackData, ErpWritebackLine,
|
||||
CompleteDeliveryInput, CompletedDeliverySummary, DeliveryCompletionRepository, ErpWritebackData,
|
||||
ErpWritebackLine,
|
||||
};
|
||||
use holzleitner_domain::{Address, Delivery, DeliveryState};
|
||||
|
||||
@ -472,6 +473,57 @@ impl DeliveryCompletionRepository for PgDeliveryCompletionRepository {
|
||||
Ok(belegnummern)
|
||||
}
|
||||
|
||||
async fn list_completed_deliveries_for_day(
|
||||
&self,
|
||||
day: NaiveDate,
|
||||
) -> Result<Vec<CompletedDeliverySummary>, ApplicationError> {
|
||||
// Alle an `day` (Berliner Kalendertag von completed_at) abgeschlossenen
|
||||
// Lieferungen — ohne Mail-Filter. `positions_modified` ist true, wenn
|
||||
// (a) irgendeine Belegzeile eine Stück-Gutschrift trägt
|
||||
// (credited_quantity > 0 ⇒ Zeile ganz entfernt oder Menge reduziert),
|
||||
// ODER
|
||||
// (b) eine aktive Geld-Gutschrift vorliegt: das jüngste Audit-Event
|
||||
// (recorded_at, id als Tie-Break — identisch zur Credit-Repo-Logik)
|
||||
// ist 'set'.
|
||||
let rows: Vec<(String, bool)> = sqlx::query_as(
|
||||
r#"
|
||||
SELECT
|
||||
d.erp_belegnummer,
|
||||
COALESCE(
|
||||
EXISTS (
|
||||
SELECT 1 FROM delivery_items di
|
||||
WHERE di.delivery_id = d.id
|
||||
AND di.credited_quantity > 0
|
||||
)
|
||||
OR (
|
||||
SELECT dca.action
|
||||
FROM delivery_credit_audit dca
|
||||
WHERE dca.delivery_id = d.id
|
||||
ORDER BY dca.recorded_at DESC, dca.id DESC
|
||||
LIMIT 1
|
||||
) = 'set',
|
||||
false
|
||||
) AS positions_modified
|
||||
FROM deliveries d
|
||||
JOIN delivery_completions c ON c.delivery_id = d.id
|
||||
WHERE (c.completed_at AT TIME ZONE 'Europe/Berlin')::date = $1
|
||||
ORDER BY c.completed_at
|
||||
"#,
|
||||
)
|
||||
.bind(day)
|
||||
.fetch_all(&self.pool)
|
||||
.await
|
||||
.map_err(db)?;
|
||||
|
||||
Ok(rows
|
||||
.into_iter()
|
||||
.map(|(belegnummer, positions_modified)| CompletedDeliverySummary {
|
||||
belegnummer,
|
||||
positions_modified,
|
||||
})
|
||||
.collect())
|
||||
}
|
||||
|
||||
async fn mark_mail_sent(
|
||||
&self,
|
||||
belegnummern: &[String],
|
||||
|
||||
Reference in New Issue
Block a user