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

@ -92,9 +92,15 @@ pub struct CommitData {
// ─── Makro-Aufruf (`/v1/execute/<name>`) ────────────────────────────────────
/// Request-Body für das Makro `_SV_assignDeliveryReport`.
///
/// Beispiel: `{ "objectId": "1EBGJM", "belegnummer": "V-30690285",
/// "kundennummer": "123456" }`.
#[derive(Debug, Serialize)]
pub struct AssignReportRequest<'a> {
#[serde(rename = "objectId")]
pub object_id: &'a str,
pub belegnummer: &'a str,
/// Im ERP hinterlegte Kundennummer des Kunden (String, wie vom Makro
/// erwartet) — damit DOCUframe den Report dem Vorgang des Kunden zuordnet.
pub kundennummer: &'a str,
}

View File

@ -497,10 +497,12 @@ impl DocuframeReportGateway for GsdService {
&self,
object_id: &str,
belegnummer: &str,
kundennummer: &str,
) -> Result<(), ApplicationError> {
let body = serde_json::to_value(super::dto::AssignReportRequest {
object_id,
belegnummer,
kundennummer,
})
.map_err(Self::ext)?;
let val = self

View File

@ -78,6 +78,23 @@ impl AttachmentRepository for PgAttachmentRepository {
Ok(belegnummer)
}
async fn delivery_customer_number(
&self,
delivery_id: Uuid,
) -> Result<Option<i64>, ApplicationError> {
let customer_number: Option<i64> = sqlx::query_scalar(
"SELECT c.erp_customer_id \
FROM deliveries d \
JOIN customers c ON c.id = d.customer_id \
WHERE d.id = $1",
)
.bind(delivery_id)
.fetch_optional(&self.pool)
.await
.map_err(db)?;
Ok(customer_number)
}
async fn list_active_for_delivery(
&self,
delivery_id: Uuid,