feat(report): Kundennummer an DOCUframe-Makro _SV_assignDeliveryReport uebergeben

Das Makro ordnet den Lieferbericht dem Vorgang des Kunden zu und braucht
dafuer jetzt zusaetzlich die im ERP hinterlegte Kundennummer:
  { objectId, belegnummer, kundennummer }

- AssignReportRequest + Gateway-Port um kundennummer (String) erweitert
- AttachmentRepository.delivery_customer_number(): liest
  customers.erp_customer_id (= ERP Kunden.Kundennummer) ueber
  deliveries.customer_id
- ProcessDeliveryReportUseCase liest die Nummer aus der DB (nicht aus dem
  Render-Ergebnis), damit sie auch im Retry-Pfad ohne erneutes Rendern vorliegt

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Dennis Nemec
2026-09-09 00:44:26 +02:00
parent 17dcc42291
commit 54ed619396
6 changed files with 54 additions and 5 deletions

View File

@ -58,6 +58,15 @@ pub trait AttachmentRepository: Send + Sync {
delivery_id: Uuid,
) -> Result<Option<String>, ApplicationError>;
/// Liefert die ERP-Kundennummer (`customers.erp_customer_id`) des Kunden
/// der Lieferung. Wird u. a. dem DOCUframe-Makro
/// `_SV_assignDeliveryReport` als `kundennummer` mitgegeben. `None`, wenn
/// die Lieferung nicht (mehr) existiert.
async fn delivery_customer_number(
&self,
delivery_id: Uuid,
) -> Result<Option<i64>, ApplicationError>;
/// Listet alle noch nicht gelöschten Attachments einer Lieferung
/// (`deleted_at IS NULL`) mit ihrer lokalen Referenz — fürs Aufräumen.
async fn list_active_for_delivery(

View File

@ -22,12 +22,15 @@ pub trait DocuframeReportGateway: Send + Sync {
pdf: Vec<u8>,
) -> Result<String, ApplicationError>;
/// Ruft das Makro `_SV_assignDeliveryReport` mit `{objectId, belegnummer}`
/// auf und ordnet den hochgeladenen Report dem Beleg zu. Fehler, wenn das
/// Makro `succeeded != true` liefert oder DOCUframe nicht erreichbar ist.
/// Ruft das Makro `_SV_assignDeliveryReport` mit
/// `{objectId, belegnummer, kundennummer}` auf und ordnet den hochgeladenen
/// Report dem Beleg bzw. dem Vorgang des Kunden zu. `kundennummer` ist die
/// im ERP hinterlegte Kundennummer (als String). Fehler, wenn das Makro
/// `succeeded != true` liefert oder DOCUframe nicht erreichbar ist.
async fn assign_report(
&self,
object_id: &str,
belegnummer: &str,
kundennummer: &str,
) -> Result<(), ApplicationError>;
}

View File

@ -92,8 +92,20 @@ impl ProcessDeliveryReportUseCase {
}
};
// Schritt 3: Makro-Zuordnung (muss succeeded == true liefern).
self.gateway.assign_report(&object_id, &belegnummer).await?;
// Schritt 3: Makro-Zuordnung (muss succeeded == true liefern). Das
// Makro braucht zusätzlich die ERP-Kundennummer, um den Report dem
// Vorgang des Kunden zuzuordnen. Bewusst aus der DB gelesen (nicht aus
// dem Render-Ergebnis), damit sie auch im Retry-Pfad vorliegt, in dem
// das Rendern übersprungen wird.
let kundennummer = self
.attachment_repo
.delivery_customer_number(delivery_id)
.await?
.ok_or(ApplicationError::NotFound)?
.to_string();
self.gateway
.assign_report(&object_id, &belegnummer, &kundennummer)
.await?;
// Schritt 4: erst aufräumen, dann als erledigt markieren.
self.cleanup_local(delivery_id, &belegnummer).await;