Skip to main content

Eine Position je Bestellnummer

Gerade bei SAP Projekten kann es erforderlich sein, je Bestellnummer eine Position erzeugen zu müssen. In diesem Fall kann der folgende UserExit genutzt werden, um nach der Extraktion des Beleges eine Position je gefundener Bestellnummer zu erzeugen.

Voraussetzungen dieses UserExits:

  • Das Kopffeld für Bestellnummern heißt "OrderNumber".
  • Es existiert ein Feld in der Positionstabelle mit dem Namen "PosOrderNumber".
  • Das Feld für die Positionen heiß "LineItems".
<?php

use Squeeze\xDoc;
use Squeeze\xDocumentField;

function AfterExtraction(xDoc $xDoc)
{

    $logger = Logger::getLogger("main");
    createLineItemsByHeadField($xDoc, $logger, "OrderNumber", "PosOrderNumber", "LineItems");

    return true;
}

/**
* @param xDoc $xDoc
* @param Logger $logger
* @param string $originHeadField
* @param string $targetLineField
* @param string $lineItemName
*/
function createLineItemsByHeadField(
    xDoc $xDoc, 
    Logger $logger, 
    string $originHeadField, 
    string $targetLineField, 
    string $lineItemName
): void {
    $head = $xDoc->getDocumentFieldByName($originHeadField);
    $lines = $xDoc->getDocumentFieldByName($lineItemName);

    $head->alternatives = getUniqueAlternatives($head, $logger);
    if (count($head->alternatives) > 1) {
        $head->getValue()->value = '';
        $head->getValue()->text = '';
        foreach ($head->alternatives as $alternative) {
            $line = new Squeeze\xDocValue(0, "", "", "string", 100, 0, 99999, 99999, 0, 0);
            $line->subfields[$targetLineField] = $alternative;
            $line->subfields[$targetLineField]->subFieldName = $targetLineField;
            $lines->alternatives[] = $line;
        }
    }
}

/**
* @param xDocumentField $field
* @param Logger $logger
* @return xDocumentField[]
*/
function getUniqueAlternatives(xDocumentField $field, Logger $logger): array
{
    // ==========================================================
    // Only keep unique alternatives
    // ==========================================================
    $tmpStore = [];
    $uniqueAlternatives = [];
    $logger->debug('The field ' . $field->name . ' has ' . count($field->alternatives) . ' alternatives');
    foreach ($field->alternatives as $alternative) {
        $logger->debug('Alternative = ' . $alternative->value);
        if (!in_array($alternative->value, $tmpStore)) {
            $logger->debug('Alternative will be kept ' . $alternative->value);
            $tmpStore[] = $alternative->value;
            $uniqueAlternatives[] = $alternative;
        }
    }

    if (count($uniqueAlternatives) > 0) {
        $field->alternatives = $uniqueAlternatives;
    }

    return $field->alternatives;
}