Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
89 changes: 89 additions & 0 deletions src/AdditionalItemProperty.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
<?php

namespace NumNum\UBL;

use Sabre\Xml\Reader;
use Sabre\Xml\Writer;
use Sabre\Xml\XmlDeserializable;
use Sabre\Xml\XmlSerializable;

use function Sabre\Xml\Deserializer\keyValue;

/**
* Additional Item Property
* A group of business terms providing information about properties of the goods and services invoiced.
*
* @see https://docs.peppol.eu/poacc/billing/3.0/syntax/ubl-invoice/cac-InvoiceLine/cac-Item/cac-AdditionalItemProperty/
*/
class AdditionalItemProperty implements XmlSerializable, XmlDeserializable
{
private $name;
private $value;

/**
* @return string
*/
public function getName(): ?string
{
return $this->name;
}

/**
* @param string $name
* @return static
*/
public function setName(?string $name)
{
$this->name = $name;
return $this;
}

/**
* @return string
*/
public function getValue(): ?string
{
return $this->value;
}

/**
* @param string $value
* @return static
*/
public function setValue(?string $value)
{
$this->value = $value;
return $this;
}

/**
* The xmlSerialize method is called during xml writing.
*
* @param Writer $writer
* @return void
*/
public function xmlSerialize(Writer $writer): void
{
if ($this->name !== null) {
$writer->write([Schema::CBC . 'Name' => $this->name]);
}
if ($this->value !== null) {
$writer->write([Schema::CBC . 'Value' => $this->value]);
}
}

/**
* The xmlDeserialize method is called during xml reading.
*
* @param Reader $reader
* @return static
*/
public static function xmlDeserialize(Reader $reader)
{
$mixedContent = keyValue($reader);

return (new static())
->setName($mixedContent[Schema::CBC . 'Name'] ?? null)
->setValue($mixedContent[Schema::CBC . 'Value'] ?? null);
}
}
29 changes: 29 additions & 0 deletions src/Item.php
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ class Item implements XmlSerializable, XmlDeserializable
private $commodityClassification;
private $classifiedTaxCategory;
private $originCountry;
private $additionalItemProperties;

/**
* @return string
Expand Down Expand Up @@ -169,6 +170,24 @@ public function setOriginCountry(?Country $originCountry): Item
return $this;
}

/**
* @return AdditionalItemProperty[]
*/
public function getAdditionalItemProperties(): ?array
{
return $this->additionalItemProperties;
}

/**
* @param AdditionalItemProperty[] $additionalItemProperties
* @return static
*/
public function setAdditionalItemProperties(?array $additionalItemProperties)
{
$this->additionalItemProperties = $additionalItemProperties;
return $this;
}

/**
* The xmlSerialize method is called during xml writing.
*
Expand Down Expand Up @@ -231,6 +250,14 @@ public function xmlSerialize(Writer $writer): void
Schema::CAC . 'ClassifiedTaxCategory' => $this->classifiedTaxCategory
]);
}

if (!empty($this->getAdditionalItemProperties())) {
foreach ($this->getAdditionalItemProperties() as $additionalItemProperty) {
$writer->write([
Schema::CAC . 'AdditionalItemProperty' => $additionalItemProperty,
]);
}
}
}

/**
Expand All @@ -248,6 +275,7 @@ public static function xmlDeserialize(Reader $reader)
$classifiedTaxCategoryTag = ReaderHelper::getTag(Schema::CAC . 'ClassifiedTaxCategory', $collection);
$commodityClassification = ReaderHelper::getTag(Schema::CAC . 'CommodityClassification', $collection);
$originCountryTag = ReaderHelper::getTag(Schema::CAC . 'OriginCountry', $collection);
$additionalItemPropertiesTags = ReaderHelper::getArrayValue(Schema::CAC . 'AdditionalItemProperty', $collection);

$buyersItemIdentificationTag = ReaderHelper::getTag(Schema::CAC . 'BuyersItemIdentification', $collection);
$buyersItemIdentificationIdTag = ReaderHelper::getTag(
Expand Down Expand Up @@ -276,6 +304,7 @@ public static function xmlDeserialize(Reader $reader)
->setClassifiedTaxCategory($classifiedTaxCategoryTag['value'] ?? null)
->setCommodityClassification($commodityClassification['value'] ?? null)
->setOriginCountry($originCountryTag['value'] ?? null)
->setAdditionalItemProperties($additionalItemPropertiesTags)
;
}
}