Skip to content

Commit 85df4ae

Browse files
committed
Add ability to generate Index (product catalog)
1 parent a261c40 commit 85df4ae

26 files changed

Lines changed: 722 additions & 32 deletions
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace CXml\Model;
6+
7+
use JMS\Serializer\Annotation as Serializer;
8+
9+
class AttachmentReference
10+
{
11+
12+
public function __construct(
13+
#[Serializer\SerializedName('Name')]
14+
#[Serializer\XmlElement(cdata: false)]
15+
public MultilanguageString $name,
16+
#[Serializer\SerializedName('Description')]
17+
#[Serializer\XmlElement(cdata: false)]
18+
public MultilanguageString $description,
19+
#[Serializer\SerializedName('InternalID')]
20+
#[Serializer\XmlElement(cdata: false)]
21+
public string $internalId,
22+
#[Serializer\SerializedName('URL')]
23+
#[Serializer\XmlElement(cdata: false)]
24+
public ?string $url = null,
25+
) {
26+
}
27+
28+
}

src/CXml/Model/Characteristic.php

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace CXml\Model;
6+
7+
use JMS\Serializer\Annotation as Serializer;
8+
9+
readonly class Characteristic
10+
{
11+
12+
public function __construct(
13+
#[Serializer\XmlAttribute]
14+
public string $domain,
15+
#[Serializer\XmlAttribute]
16+
public string $value,
17+
#[Serializer\XmlAttribute]
18+
public ?string $code = null,
19+
) {
20+
}
21+
22+
}

src/CXml/Model/Classification.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ public function __construct(
1414
public string $domain,
1515
#[Serializer\XmlValue(cdata: false)]
1616
public string $value,
17+
#[Serializer\XmlAttribute]
18+
public ?string $code = null,
1719
) {
1820
}
1921
}

src/CXml/Model/Index.php

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace CXml\Model;
6+
7+
use Assert\Assertion;
8+
use CXml\Model\Trait\CommentsTrait;
9+
use JMS\Serializer\Annotation as Serializer;
10+
11+
#[Serializer\XmlRoot('Index')]
12+
#[Serializer\AccessorOrder(order: 'custom', custom: ['supplierId', 'comments', 'indexItems'])]
13+
class Index
14+
{
15+
use CommentsTrait;
16+
17+
public function __construct(
18+
#[Serializer\XmlAttribute]
19+
#[Serializer\SerializedName('loadmode')]
20+
public readonly string $loadmode,
21+
#[Serializer\SerializedName('SupplierID')]
22+
public readonly SupplierId $supplierId,
23+
#[Serializer\XmlList(entry: 'IndexItem', inline: true)]
24+
#[Serializer\Type('array<CXml\Model\IndexItemWrapper>')]
25+
private array $indexItems = [],
26+
#[Serializer\Exclude]
27+
public string $dtdUri = 'http://xml.cxml.org/schemas/cXML/1.2.063/cXML.dtd',
28+
) {
29+
Assertion::inArray($this->loadmode, ['Full', 'Incremental']);
30+
}
31+
32+
public static function create(string $loadmode, SupplierId $supplierId): self
33+
{
34+
return new self($loadmode, $supplierId);
35+
}
36+
37+
public function addIndexItem(IndexItemInterface $indexItem): self
38+
{
39+
$shortClsName = (new \ReflectionClass($indexItem))->getShortName();
40+
41+
if (!isset($this->indexItem[$shortClsName])) {
42+
$this->indexItems[$shortClsName] = new IndexItemWrapper();
43+
}
44+
45+
$this->indexItems[$shortClsName]->addIndexItem($indexItem);
46+
47+
return $this;
48+
}
49+
}

src/CXml/Model/IndexItemAdd.php

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace CXml\Model;
6+
7+
use JMS\Serializer\Annotation as Serializer;
8+
9+
class IndexItemAdd implements IndexItemInterface
10+
{
11+
public function __construct(
12+
#[Serializer\SerializedName('ItemID')]
13+
public ItemId $itemId,
14+
#[Serializer\SerializedName('ItemDetail')]
15+
public ItemDetail $itemDetail,
16+
#[Serializer\SerializedName('IndexItemDetail')]
17+
public IndexItemDetail $indexItemDetail,
18+
) {}
19+
20+
public static function create(ItemId $itemId, ItemDetail $itemDetail, IndexItemDetail $indexItemDetail): self
21+
{
22+
return new self($itemId, $itemDetail, $indexItemDetail);
23+
}
24+
25+
}

src/CXml/Model/IndexItemDelete.php

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace CXml\Model;
6+
7+
use JMS\Serializer\Annotation as Serializer;
8+
9+
class IndexItemDelete implements IndexItemInterface
10+
{
11+
public function __construct(
12+
#[Serializer\SerializedName('ItemID')]
13+
public ItemId $itemId,
14+
#[Serializer\SerializedName('ItemDetail')]
15+
public ItemDetail $itemDetail,
16+
#[Serializer\SerializedName('IndexItemDetail')]
17+
public IndexItemDetail $indexItemDetail,
18+
) {}
19+
20+
public static function create(ItemId $itemId, ItemDetail $itemDetail, IndexItemDetail $indexItemDetail,): self
21+
{
22+
return new self($itemId, $itemDetail, $indexItemDetail);
23+
}
24+
25+
}

src/CXml/Model/IndexItemDetail.php

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace CXml\Model;
6+
7+
use JMS\Serializer\Annotation as Serializer;
8+
9+
#[Serializer\AccessorOrder(order: 'custom', custom: ['leadtime', 'expirationDate', 'territoryAvailables'])]
10+
class IndexItemDetail
11+
{
12+
13+
#[Serializer\XmlList(entry: 'TerritoryAvailable', inline: true)]
14+
#[Serializer\Type('array<CXml\Model\TerritoryAvailable>')]
15+
private array $territoryAvailables = [];
16+
17+
public function __construct(
18+
#[Serializer\SerializedName('LeadTime')]
19+
#[Serializer\XmlElement(cdata: false)]
20+
public int $leadtime,
21+
#[Serializer\SerializedName('ExpirationDate')]
22+
#[Serializer\XmlElement(cdata: false)]
23+
public ?\DateTimeInterface $expirationDate = null,
24+
array $territoryAvailables
25+
) {
26+
$this->territoryAvailables = array_map(fn(string $territory) => new TerritoryAvailable($territory), $territoryAvailables);
27+
}
28+
29+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
<?php
2+
3+
namespace CXml\Model;
4+
5+
interface IndexItemInterface
6+
{
7+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace CXml\Model;
6+
7+
use JMS\Serializer\Annotation as Serializer;
8+
9+
class IndexItemPunchout implements IndexItemInterface
10+
{
11+
public function __construct(
12+
#[Serializer\SerializedName('ItemID')]
13+
public ItemId $itemId,
14+
#[Serializer\SerializedName('ItemDetail')]
15+
public ItemDetail $itemDetail,
16+
#[Serializer\SerializedName('IndexItemDetail')]
17+
public IndexItemDetail $indexItemDetail,
18+
) {}
19+
20+
public static function create(ItemId $itemId, ItemDetail $itemDetail, IndexItemDetail $indexItemDetail,): self
21+
{
22+
return new self($itemId, $itemDetail, $indexItemDetail);
23+
}
24+
25+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace CXml\Model;
6+
7+
use JMS\Serializer\Annotation as Serializer;
8+
9+
class IndexItemWrapper
10+
{
11+
12+
public function __construct(
13+
#[Serializer\XmlList(entry: 'IndexItemAdd', inline: true)]
14+
#[Serializer\Type('array<CXml\Model\IndexItemAdd>')]
15+
private array $indexItemAdds = [],
16+
#[Serializer\XmlList(entry: 'IndexItemDelete', inline: true)]
17+
#[Serializer\Type('array<CXml\Model\IndexItemDelete>')]
18+
private array $indexItemDeletes = [],
19+
#[Serializer\XmlList(entry: 'IndexItemPunchout', inline: true)]
20+
#[Serializer\Type('array<CXml\Model\IndexItemPunchout>')]
21+
private array $indexItemPunchouts = [],
22+
) {}
23+
24+
public function addIndexItem(IndexItemInterface $indexItem): self
25+
{
26+
if ($indexItem instanceof IndexItemAdd) {
27+
$this->indexItemAdds[] = $indexItem;
28+
} elseif ($indexItem instanceof IndexItemDelete) {
29+
$this->indexItemDeletes[] = $indexItem;
30+
} elseif ($indexItem instanceof IndexItemPunchout) {
31+
$this->indexItemPunchouts[] = $indexItem;
32+
} else {
33+
throw new \InvalidArgumentException('Invalid index item type');
34+
}
35+
36+
return $this;
37+
}
38+
39+
}

0 commit comments

Comments
 (0)