> For the complete documentation index, see [llms.txt](https://docs.solutioo.de/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.solutioo.de/entwicklerdokumentationen-business-central-dhl-connector/dhl-connector-entwicklerdokumentation/codeunit-referenz/72242980-soudhl-packing-mgt.md).

# 72242980 SOUDHL Packing Mgt

## Verantwortung

Erzeugt aus Verkaufszeilen konsistente Package Header und Lines. Die Codeunit zentralisiert Gewicht, Maße, Boxauswahl und mehrere Verteilalgorithmen.

## Öffentliche Procedures

### Paketbildung

* `CreatePackages(var SalesHeader: Record "Sales Header"; FixedPackageCount: Integer; BoxCode: Code[20])` – nutzt den Packing Mode der Konfiguration.
* `CreatePackagesWithPackingMode(var SalesHeader: Record "Sales Header"; FixedPackageCount: Integer; BoxCode: Code[20]; PackingMode: Enum "SOUDHL Packing Mode")` – expliziter Mode für Host-Apps.

Ist `FixedPackageCount > 0`, hat die feste Anzahl Vorrang vor dem Mode.

### Gewicht

* `ResolveUnitWeightKg(Item: Record Item): Decimal`
* `ResolveUnitWeightKg(Item: Record Item; UOMCode: Code[10]): Decimal`

Reihenfolge: Item-UoM-Gewicht bei entsprechender Gewichtsquelle, sonst Gross oder Net Weight × Qty. per Unit of Measure. Gramm werden in Kilogramm konvertiert.

### Maße

* `ResolveItemUnitDimensions(ItemNo: Code[20]; UOMCode: Code[10]; var LengthCm: Decimal; var WidthCm: Decimal; var HeightCm: Decimal)`
* `ResolvePackageDimensionsCm(PackageHeader: Record "SOUDHL Package Header"; var LengthCm: Decimal; var WidthCm: Decimal; var HeightCm: Decimal)`

Item-UoM-Maße und Paket-/Boxmaße werden in Zentimeter normalisiert.

### Limits und Hilfen

* `ResolveMaxPackageWeightKg(BoxCode: Code[20]): Decimal` – Boxlimit, Setupdefault, danach 31,5 kg.
* `MaxPackageWeightKg(): Decimal` – Setupdefault ohne Box.
* `UnitFitsInBox(UnitLengthCm: Decimal; UnitWidthCm: Decimal; UnitHeightCm: Decimal; BoxLengthCm: Decimal; BoxWidthCm: Decimal; BoxHeightCm: Decimal): Boolean` – sortierter Achsenvergleich; fehlende Maße blockieren nicht.
* `SuggestPackageCount(TotalWeightKg: Decimal; TotalVolumeCm3: Decimal; BoxCode: Code[20]): Integer` – Maximum aus Gewichts- und Volumenbedarf.
* `ComputeOrderTotals(SalesHeader: Record "Sales Header"; var TotalWeightKg: Decimal; var TotalVolumeCm3: Decimal)` – Summen packbarer Verkaufszeilen.
* `ClearExistingPackages(OrderNo: Code[20])` – löscht nur nicht hochgeladene Sales-Order-Pakete und Lines.

## Integration Events

Vollständige Subscriber-Signaturen stehen unter **Integration Events**.

```al
[IntegrationEvent(false, false)]
local procedure OnBeforeCreatePackages(
    var SalesHeader: Record "Sales Header";
    var FixedPackageCount: Integer;
    var BoxCode: Code[20];
    var PackingMode: Enum "SOUDHL Packing Mode")

[IntegrationEvent(false, false)]
local procedure OnBeforePackageHeaderInsert(
    var PackageHeader: Record "SOUDHL Package Header";
    SalesHeader: Record "Sales Header";
    PackageIndex: Integer;
    PackageCount: Integer)

[IntegrationEvent(false, false)]
local procedure OnAfterPackageCreated(
    PackageHeader: Record "SOUDHL Package Header";
    SalesHeader: Record "Sales Header")

[IntegrationEvent(false, false)]
local procedure OnAfterCreatePackages(
    SalesHeader: Record "Sales Header";
    BoxCode: Code[20];
    PackingMode: Enum "SOUDHL Packing Mode";
    CreatedPackageCount: Integer)
```

`OnBeforeCreatePackages` läuft nach der Standardauflösung und vor Validierung oder Löschen. `OnBeforePackageHeaderInsert` erlaubt sichere Anreicherung vor dem Insert. `OnAfterPackageCreated` folgt nach vollständigen Lines. `OnAfterCreatePackages` schließt den Lauf ab.

## Interner Ablauf

`CreatePackagesInternal` → `OnBeforeCreatePackages` → `BuildPackingPlan` → `CreateDhlPackages` → `OnAfterCreatePackages`.

Vor dem Löschen bestehender Pakete werden alle Einheiten auf Maximalgewicht und Box-Fit validiert. Dadurch zerstört ein ungültiger Vorschlag keine vorhandenen Pending-Pakete.

## Algorithmen

* `BuildPlanBinPacking`: schwerste Zeilen zuerst, First-Fit.
* `BuildPlanAllOnFirst`: Auftragsreihenfolge; separate Artikel schließen das Paket.
* `BuildPlanSmartDistribute`: separat zu packende Einheiten zuerst; Rest auf leichtestes passendes Paket.
* `BuildPlanFixedCount`: exakt N Pakete, Fehler bei Restmenge oder leeren Paketen.

Relevante Helper: `CollectOrderLines`, `ValidateOrderUnits`, `ResolveBoxCode`, `FindFirstFitPackage`, `FindLightestFittingPackage`, `FindEmptyPackage`, `ChunkCapFor`, `PackingQuantity`, `CeilDiv` und Listen-Mutatoren.

## Boxauswahl

1. expliziter `BoxCode`,
2. Preferred Box der Item Category,
3. kleinste passende Kategoriebox,
4. kleinste passende aktive Box.

## Datenwirkung

Die Codeunit löscht und erzeugt Package Header/Lines, aber committet nicht explizit. Headergewicht wird in Gramm gespeichert, Linegewicht in Kilogramm pro Einheit.

## Fehlerfälle

Keine Box, keine packbare Position, Einzelstück zu schwer oder zu groß, feste Paketanzahl unzureichend. `Qty. to Ship` wird bevorzugt; andernfalls gilt Quantity. Ein Fehler in `OnBeforeCreatePackages` bricht ab, bevor Pending-Pakete gelöscht werden.

## Externe Verwendung

Die öffentlichen Methoden sind die unterstützte Packing-Fassade. Consumer-Apps sollen nicht eigene Varianten der Algorithmen gegen dieselben Tabellen parallel pflegen.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://docs.solutioo.de/entwicklerdokumentationen-business-central-dhl-connector/dhl-connector-entwicklerdokumentation/codeunit-referenz/72242980-soudhl-packing-mgt.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
