diff --git a/CHANGELOG.md b/CHANGELOG.md
index b1a88b7..482b753 100755
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,15 @@
# Changelog
+## v1.12.1 - 2020-08-04
+### Fixes
+ - Fix missing payment_voucher param and retro compatibility problem on TL01
+
+## v1.12.0 - 2020-07-28
+### Features
+ - Add requirement level for attributes (PM11)
+ - Add KYC information for A01, S06, S07 & S20 API clients
+ - Add M10, M11, M12, M13 AN OR43 in SDK
+
## v1.11.1 - 2020-01-16
### Fixes
- Fix XML responses that may not be parsed correctly
diff --git a/composer.json b/composer.json
index 77d8ede..4ac18f7 100755
--- a/composer.json
+++ b/composer.json
@@ -2,7 +2,7 @@
"name": "mirakl/sdk-php-shop",
"description": "Mirakl provides a PHP SDK that wraps the Mirakl REST APIs in a lightweight library. This enables you to develop a fast, flexible and custom integration for your existing e-commerce solution.",
"type": "library",
- "version": "1.11.1",
+ "version": "1.12.1",
"license": "proprietary",
"authors": [
{
diff --git a/src/Mirakl/Core/Domain/DateFieldsTrait.php b/src/Mirakl/Core/Domain/DateFieldsTrait.php
index eb4fe52..04df3f0 100755
--- a/src/Mirakl/Core/Domain/DateFieldsTrait.php
+++ b/src/Mirakl/Core/Domain/DateFieldsTrait.php
@@ -15,6 +15,6 @@ trait DateFieldsTrait
'created_date', 'debited_date', 'received_date', 'shipped_date', 'date_uploaded', 'date_deleted',
'start_update_date', 'end_update_date', 'accounting_document_creation_date', 'customer_debited_date',
'expiration_date', 'date_created_from', 'date_created_to', 'discount_start_date', 'discount_end_date',
- 'updated_since', 'last_updated', 'creation_date', 'update_date', 'shipping_deadline'
+ 'updated_since', 'last_updated', 'creation_date', 'update_date', 'shipping_deadline', 'date_updated'
];
}
\ No newline at end of file
diff --git a/src/Mirakl/Core/Request/AbstractRequest.php b/src/Mirakl/Core/Request/AbstractRequest.php
index 4d819a7..b0bf500 100755
--- a/src/Mirakl/Core/Request/AbstractRequest.php
+++ b/src/Mirakl/Core/Request/AbstractRequest.php
@@ -14,6 +14,7 @@
* @method int getMax()
* @method int getOffset()
* @method string getPageToken()
+ * @method int getLimit()
* @method bool getPaginate()
* @method array getProductReferences()
* @method \DateTime getStartDate()
@@ -188,6 +189,10 @@ public function getQueryParams()
$params['page_token'] = $this->getPageToken();
}
+ if ($this->getLimit()) {
+ $params['limit'] = $this->getLimit();
+ }
+
/** @see SortableTrait */
if ($this->getSortBy()) {
$params['sort'] = $this->getSortBy();
diff --git a/src/Mirakl/Core/Request/SeekableTrait.php b/src/Mirakl/Core/Request/SeekableTrait.php
index a7f0c54..38ff5d0 100644
--- a/src/Mirakl/Core/Request/SeekableTrait.php
+++ b/src/Mirakl/Core/Request/SeekableTrait.php
@@ -8,7 +8,7 @@ trait SeekableTrait
*
* @var int
*/
- protected $limit = 10;
+ protected $limit;
/**
* Indicate whether or not this API should return the page associated to this token.
diff --git a/src/Mirakl/MCI/Common/Domain/Attribute.php b/src/Mirakl/MCI/Common/Domain/Attribute.php
index 69ba213..7c150c3 100755
--- a/src/Mirakl/MCI/Common/Domain/Attribute.php
+++ b/src/Mirakl/MCI/Common/Domain/Attribute.php
@@ -22,6 +22,8 @@
* @method ValueTranslationCollection getLabelTranslations()
* @method bool getRequired()
* @method $this setRequired(bool $required)
+ * @method string getRequirementLevel()
+ * @method $this setRequirementLevel(bool $requirementLevel)
* @method bool isRequired()
* @method AttributeRoleCollection getRoles()
* @method $this setRoles(AttributeRoleCollection $roles)
diff --git a/src/Mirakl/MCI/Common/Domain/AttributeRequirementLevel.php b/src/Mirakl/MCI/Common/Domain/AttributeRequirementLevel.php
new file mode 100644
index 0000000..5760ace
--- /dev/null
+++ b/src/Mirakl/MCI/Common/Domain/AttributeRequirementLevel.php
@@ -0,0 +1,10 @@
+ 'import_id',
+ ];
+}
\ No newline at end of file
diff --git a/src/Mirakl/MCI/Front/Domain/Hierarchy/HierarchyImportResult.php b/src/Mirakl/MCI/Front/Domain/Hierarchy/HierarchyImportResult.php
new file mode 100644
index 0000000..ea204a6
--- /dev/null
+++ b/src/Mirakl/MCI/Front/Domain/Hierarchy/HierarchyImportResult.php
@@ -0,0 +1,7 @@
+ 'import_id',
+ ];
+}
\ No newline at end of file
diff --git a/src/Mirakl/MCI/Front/Domain/ValueList/ValueListImportResult.php b/src/Mirakl/MCI/Front/Domain/ValueList/ValueListImportResult.php
new file mode 100644
index 0000000..8480696
--- /dev/null
+++ b/src/Mirakl/MCI/Front/Domain/ValueList/ValueListImportResult.php
@@ -0,0 +1,7 @@
+ 'import_id',
+ ];
+}
\ No newline at end of file
diff --git a/src/Mirakl/MCI/Front/Request/Attribute/AttributeImportErrorReportRequest.php b/src/Mirakl/MCI/Front/Request/Attribute/AttributeImportErrorReportRequest.php
new file mode 100644
index 0000000..c89c55d
--- /dev/null
+++ b/src/Mirakl/MCI/Front/Request/Attribute/AttributeImportErrorReportRequest.php
@@ -0,0 +1,32 @@
+
+ * use Mirakl\MCI\Front\Client\FrontApiClient;
+ * use Mirakl\MCI\Front\Request\Attribute\AttributeImportErrorReportRequest;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ * $request = new AttributeImportErrorReportRequest('IMPORT_ID');
+ * $result = $api->getAttributeImportErrorReport($request);
+ * // $result => @see \Mirakl\Core\Domain\FileWrapper
+ * // Download file:
+ * $result->download();
+ *
+ */
+class AttributeImportErrorReportRequest extends AbstractImportRequest
+{
+ use CsvResponseDecorator;
+
+ /**
+ * @var string
+ */
+ protected $endpoint = '/products/attributes/imports/{import}/error_report';
+}
\ No newline at end of file
diff --git a/src/Mirakl/MCI/Front/Request/Attribute/AttributeImportRequest.php b/src/Mirakl/MCI/Front/Request/Attribute/AttributeImportRequest.php
new file mode 100644
index 0000000..3d71340
--- /dev/null
+++ b/src/Mirakl/MCI/Front/Request/Attribute/AttributeImportRequest.php
@@ -0,0 +1,37 @@
+
+ * use Mirakl\MCI\Front\Client\FrontApiClient;
+ * use Mirakl\MCI\Front\Request\Attribute\AttributeImportRequest;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ * $request = new AttributeImportRequest(new \SplFileObject('/path/to/file.csv'));
+ * $result = $api->importAttributes($request);
+ * // $result => @see \Mirakl\MCI\Front\Domain\Attribute\AttributeImportTracking
+ *
+ */
+class AttributeImportRequest extends AbstractFileRequest
+{
+ /**
+ * @var string
+ */
+ protected $endpoint = '/products/attributes/imports';
+
+ /**
+ * @inheritdoc
+ */
+ public function getResponseDecorator()
+ {
+ return AttributeImportTracking::decorator();
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MCI/Front/Request/Attribute/AttributeImportStatusRequest.php b/src/Mirakl/MCI/Front/Request/Attribute/AttributeImportStatusRequest.php
new file mode 100644
index 0000000..1a94d0e
--- /dev/null
+++ b/src/Mirakl/MCI/Front/Request/Attribute/AttributeImportStatusRequest.php
@@ -0,0 +1,36 @@
+
+ * use Mirakl\MCI\Front\Client\FrontApiClient;
+ * use Mirakl\MCI\Front\Request\Attribute\AttributeImportStatusRequest;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ * $request = new AttributeImportStatusRequest('IMPORT_ID');
+ * $result = $api->getAttributeImportResult($request);
+ * // $result => @see \Mirakl\MCI\Front\Domain\Attribute\AttributeImportResult
+ *
+ */
+class AttributeImportStatusRequest extends AbstractImportRequest
+{
+ /**
+ * @var string
+ */
+ protected $endpoint = '/products/attributes/imports/{import}';
+
+ /**
+ * @inheritdoc
+ */
+ public function getResponseDecorator()
+ {
+ return AttributeImportResult::decorator();
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MCI/Front/Request/Attribute/GetAttributesRequest.php b/src/Mirakl/MCI/Front/Request/Attribute/GetAttributesRequest.php
new file mode 100644
index 0000000..c47a933
--- /dev/null
+++ b/src/Mirakl/MCI/Front/Request/Attribute/GetAttributesRequest.php
@@ -0,0 +1,24 @@
+
+ * use Mirakl\MCI\Front\Client\FrontApiClient;
+ * use Mirakl\MCI\Front\Request\Attribute\GetAttributesRequest;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ * $request = new GetAttributesRequest();
+ * $request->setHierarchyCode('HIERARCHY_CODE'); // Optional
+ * $request->setMaxLevel(2); // Optional (all children by default)
+ * $result = $api->getAttributes($request);
+ * // $result => @see \Mirakl\MCI\Common\Domain\Collection\AttributeCollection
+ *
+ */
+class GetAttributesRequest extends AbstractGetAttributesRequest
+{}
\ No newline at end of file
diff --git a/src/Mirakl/MCI/Front/Request/Hierarchy/GetHierarchiesRequest.php b/src/Mirakl/MCI/Front/Request/Hierarchy/GetHierarchiesRequest.php
new file mode 100644
index 0000000..6bd03e5
--- /dev/null
+++ b/src/Mirakl/MCI/Front/Request/Hierarchy/GetHierarchiesRequest.php
@@ -0,0 +1,24 @@
+
+ * use Mirakl\MCI\Front\Client\FrontApiClient;
+ * use Mirakl\MCI\Front\Request\Hierarchy\GetHierarchiesRequest;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ * $request = new GetHierarchiesRequest();
+ * $request->setHierarchyCode('HIERARCHY_CODE'); // Optional
+ * $request->setMaxLevel(2); // Optional (all children by default)
+ * $result = $api->getHierarchies($request);
+ * // $result => @see \Mirakl\MCI\Common\Domain\Collection\HierarchyCollection
+ *
+ */
+class GetHierarchiesRequest extends AbstractGetHierarchiesRequest
+{}
\ No newline at end of file
diff --git a/src/Mirakl/MCI/Front/Request/Hierarchy/HierarchyImportErrorReportRequest.php b/src/Mirakl/MCI/Front/Request/Hierarchy/HierarchyImportErrorReportRequest.php
new file mode 100644
index 0000000..15a9d8f
--- /dev/null
+++ b/src/Mirakl/MCI/Front/Request/Hierarchy/HierarchyImportErrorReportRequest.php
@@ -0,0 +1,32 @@
+
+ * use Mirakl\MCI\Front\Client\FrontApiClient;
+ * use Mirakl\MCI\Front\Request\Hierarchy\HierarchyImportErrorReportRequest;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ * $request = new HierarchyImportErrorReportRequest('IMPORT_ID');
+ * $result = $api->getHierarchyImportErrorReport($request);
+ * // $result => @see \Mirakl\Core\Domain\FileWrapper
+ * // Download file:
+ * $result->download();
+ *
+ */
+class HierarchyImportErrorReportRequest extends AbstractImportRequest
+{
+ use CsvResponseDecorator;
+
+ /**
+ * @var string
+ */
+ protected $endpoint = '/hierarchies/imports/{import}/error_report';
+}
\ No newline at end of file
diff --git a/src/Mirakl/MCI/Front/Request/Hierarchy/HierarchyImportRequest.php b/src/Mirakl/MCI/Front/Request/Hierarchy/HierarchyImportRequest.php
new file mode 100644
index 0000000..b288f8b
--- /dev/null
+++ b/src/Mirakl/MCI/Front/Request/Hierarchy/HierarchyImportRequest.php
@@ -0,0 +1,41 @@
+
+ * "hierarchy-code";"hierarchy-label";"hierarchy-parent-code";"update-delete"
+ *
+ *
+ * Example:
+ *
+ *
+ * use Mirakl\MCI\Front\Client\FrontApiClient;
+ * use Mirakl\MCI\Front\Request\Hierarchy\HierarchyImportRequest;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ * $request = new HierarchyImportRequest(new \SplFileObject('/path/to/file.csv'));
+ * $result = $api->importHierarchies($request);
+ * // $result => @see \Mirakl\MCI\Front\Domain\Hierarchy\HierarchyImportTracking
+ *
+ */
+class HierarchyImportRequest extends AbstractFileRequest
+{
+ /**
+ * @var string
+ */
+ protected $endpoint = '/hierarchies/imports';
+
+ /**
+ * @inheritdoc
+ */
+ public function getResponseDecorator()
+ {
+ return HierarchyImportTracking::decorator();
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MCI/Front/Request/Hierarchy/HierarchyImportStatusRequest.php b/src/Mirakl/MCI/Front/Request/Hierarchy/HierarchyImportStatusRequest.php
new file mode 100644
index 0000000..9da0f96
--- /dev/null
+++ b/src/Mirakl/MCI/Front/Request/Hierarchy/HierarchyImportStatusRequest.php
@@ -0,0 +1,36 @@
+
+ * use Mirakl\MCI\Front\Client\FrontApiClient;
+ * use Mirakl\MCI\Front\Request\Hierarchy\HierarchyImportStatusRequest;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ * $request = new HierarchyImportStatusRequest('IMPORT_ID');
+ * $result = $api->getHierarchyImportResult($request);
+ * // $result => @see \Mirakl\MCI\Front\Domain\Hierarchy\HierarchyImportResult
+ *
+ */
+class HierarchyImportStatusRequest extends AbstractImportRequest
+{
+ /**
+ * @var string
+ */
+ protected $endpoint = '/hierarchies/imports/{import}';
+
+ /**
+ * @inheritdoc
+ */
+ public function getResponseDecorator()
+ {
+ return HierarchyImportResult::decorator();
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MCI/Front/Request/Product/DownloadProductImportErrorReportRequest.php b/src/Mirakl/MCI/Front/Request/Product/DownloadProductImportErrorReportRequest.php
new file mode 100644
index 0000000..784f17f
--- /dev/null
+++ b/src/Mirakl/MCI/Front/Request/Product/DownloadProductImportErrorReportRequest.php
@@ -0,0 +1,24 @@
+
+ * use Mirakl\MCI\Front\Client\FrontApiClient;
+ * use Mirakl\MCI\Front\Request\Product\DownloadProductImportErrorReportRequest;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ * $request = new DownloadProductImportErrorReportRequest('IMPORT_ID');
+ * $result = $api->downloadProductImportErrorReport($request);
+ * // $result => @see \Mirakl\Core\Domain\FileWrapper
+ * // Download file:
+ * $result->download();
+ *
+ */
+class DownloadProductImportErrorReportRequest extends AbstractDownloadProductImportErrorReportRequest
+{}
\ No newline at end of file
diff --git a/src/Mirakl/MCI/Front/Request/Product/DownloadProductImportNewProductsReportRequest.php b/src/Mirakl/MCI/Front/Request/Product/DownloadProductImportNewProductsReportRequest.php
new file mode 100644
index 0000000..7f3504b
--- /dev/null
+++ b/src/Mirakl/MCI/Front/Request/Product/DownloadProductImportNewProductsReportRequest.php
@@ -0,0 +1,24 @@
+
+ * use Mirakl\MCI\Front\Client\FrontApiClient;
+ * use Mirakl\MCI\Front\Request\Product\DownloadProductImportNewProductsReportRequest;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ * $request = new DownloadProductImportNewProductsReportRequest('IMPORT_ID');
+ * $result = $api->downloadProductImportNewProductsReport($request);
+ * // $result => @see \Mirakl\Core\Domain\FileWrapper
+ * // Download file:
+ * $result->download();
+ *
+ */
+class DownloadProductImportNewProductsReportRequest extends AbstractDownloadProductImportNewProductsReportRequest
+{}
\ No newline at end of file
diff --git a/src/Mirakl/MCI/Front/Request/Product/DownloadProductImportTransformationErrorReportRequest.php b/src/Mirakl/MCI/Front/Request/Product/DownloadProductImportTransformationErrorReportRequest.php
new file mode 100644
index 0000000..dcdaac9
--- /dev/null
+++ b/src/Mirakl/MCI/Front/Request/Product/DownloadProductImportTransformationErrorReportRequest.php
@@ -0,0 +1,25 @@
+
+ * use Mirakl\MCI\Front\Client\FrontApiClient;
+ * use Mirakl\MCI\Front\Request\Product\DownloadProductImportTransformationErrorReportRequest;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ * $request = new DownloadProductImportTransformationErrorReportRequest('IMPORT_ID');
+ * $result = $api->downloadProductImportTransformationErrorReport($request);
+ * // $result => @see \Mirakl\Core\Domain\FileWrapper
+ * // Download file:
+ * $result->download();
+ *
+ */
+class DownloadProductImportTransformationErrorReportRequest
+ extends AbstractDownloadProductImportTransformationErrorReportRequest
+{}
\ No newline at end of file
diff --git a/src/Mirakl/MCI/Front/Request/Product/DownloadProductImportTransformedFileRequest.php b/src/Mirakl/MCI/Front/Request/Product/DownloadProductImportTransformedFileRequest.php
new file mode 100644
index 0000000..ff70920
--- /dev/null
+++ b/src/Mirakl/MCI/Front/Request/Product/DownloadProductImportTransformedFileRequest.php
@@ -0,0 +1,24 @@
+
+ * use Mirakl\MCI\Front\Client\FrontApiClient;
+ * use Mirakl\MCI\Front\Request\Product\DownloadProductImportTransformedFileRequest;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ * $request = new DownloadProductImportTransformedFileRequest('IMPORT_ID');
+ * $result = $api->downloadProductImportTransformedFile($request);
+ * // $result => @see \Mirakl\Core\Domain\FileWrapper
+ * // Download file:
+ * $result->download();
+ *
+ */
+class DownloadProductImportTransformedFileRequest extends AbstractDownloadProductImportTransformedFileRequest
+{}
\ No newline at end of file
diff --git a/src/Mirakl/MCI/Front/Request/Product/ProductImportRequest.php b/src/Mirakl/MCI/Front/Request/Product/ProductImportRequest.php
new file mode 100644
index 0000000..f011975
--- /dev/null
+++ b/src/Mirakl/MCI/Front/Request/Product/ProductImportRequest.php
@@ -0,0 +1,41 @@
+
+ * use Mirakl\MCI\Front\Client\FrontApiClient;
+ * use Mirakl\MCI\Front\Request\Product\ProductImportRequest;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ * $request = new ProductImportRequest(new \SplFileObject('/path/to/file.csv'), 'SHOP_ID');
+ *
+ * $result = $api->importProducts($request);
+ * // $result => @see \Mirakl\MCI\Common\Domain\Product\ProductImportTracking
+ *
+ */
+class ProductImportRequest extends AbstractProductImportRequest
+{
+ /**
+ * @var array
+ */
+ public $bodyParams = ['shop'];
+
+ /**
+ * @param string|array|\SplFileObject $file
+ * @param int $shopId
+ */
+ public function __construct($file, $shopId)
+ {
+ parent::__construct($file);
+ $this->setShop($shopId);
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MCI/Front/Request/Product/ProductImportStatusRequest.php b/src/Mirakl/MCI/Front/Request/Product/ProductImportStatusRequest.php
new file mode 100644
index 0000000..916df22
--- /dev/null
+++ b/src/Mirakl/MCI/Front/Request/Product/ProductImportStatusRequest.php
@@ -0,0 +1,22 @@
+
+ * use Mirakl\MCI\Front\Client\FrontApiClient;
+ * use Mirakl\MCI\Front\Request\Product\ProductImportStatusRequest;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ * $request = new ProductImportStatusRequest('IMPORT_ID');
+ * $result = $api->getProductImportStatus($request);
+ * // $result => @see \Mirakl\MCI\Common\Domain\Product\ProductImportResult
+ *
+ */
+class ProductImportStatusRequest extends AbstractProductImportStatusRequest
+{}
\ No newline at end of file
diff --git a/src/Mirakl/MCI/Front/Request/Product/ProductImportStatusesRequest.php b/src/Mirakl/MCI/Front/Request/Product/ProductImportStatusesRequest.php
new file mode 100644
index 0000000..0fdf01f
--- /dev/null
+++ b/src/Mirakl/MCI/Front/Request/Product/ProductImportStatusesRequest.php
@@ -0,0 +1,23 @@
+
+ * use Mirakl\MCI\Front\Client\FrontApiClient;
+ * use Mirakl\MCI\Front\Request\Product\ProductImportStatusesRequest;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ * $request = new ProductImportStatusesRequest();
+ *
+ * $result = $api->getProductImportStatuses($request);
+ * // $result => @see \Mirakl\MCI\Common\Domain\Collection\Product\ProductImportResultCollection
+ *
+ */
+class ProductImportStatusesRequest extends AbstractProductImportStatusesRequest
+{}
\ No newline at end of file
diff --git a/src/Mirakl/MCI/Front/Request/Product/UpdateProductImportStatusRequest.php b/src/Mirakl/MCI/Front/Request/Product/UpdateProductImportStatusRequest.php
new file mode 100644
index 0000000..ec8b30a
--- /dev/null
+++ b/src/Mirakl/MCI/Front/Request/Product/UpdateProductImportStatusRequest.php
@@ -0,0 +1,27 @@
+
+ * use Mirakl\MCI\Front\Client\FrontApiClient;
+ * use Mirakl\MCI\Front\Request\Product\UpdateProductImportStatusRequest;
+ * use Mirakl\Core\Domain\FileWrapper;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ * $request = new UpdateProductImportStatusRequest('IMPORT_ID');
+ * $errorsFile = new \SplFileObject('/path/to/errors_file.csv');
+ * $request->setErrorsFile(new FileWrapper($errorsFile)); // Optional
+ * $productsFile = new \SplFileObject('/path/to/products_file.csv');
+ * $request->setProductsFile(new FileWrapper($productsFile)); // Optional
+ * $api->updateProductImportStatus($request);
+ *
+ */
+class UpdateProductImportStatusRequest extends AbstractUpdateProductImportStatusRequest
+{}
\ No newline at end of file
diff --git a/src/Mirakl/MCI/Front/Request/ValueList/GetValueListItemsRequest.php b/src/Mirakl/MCI/Front/Request/ValueList/GetValueListItemsRequest.php
new file mode 100644
index 0000000..404cc6d
--- /dev/null
+++ b/src/Mirakl/MCI/Front/Request/ValueList/GetValueListItemsRequest.php
@@ -0,0 +1,22 @@
+
+ * use Mirakl\MCI\Front\Client\FrontApiClient;
+ * use Mirakl\MCI\Front\Request\ValueList\GetValueListItemsRequest;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ * $request = new GetValueListItemsRequest('COLOR');
+ * $result = $api->getValueListItems($request);
+ * // $result => @see \Mirakl\MCI\Common\Domain\ValueList
+ *
+ */
+class GetValueListItemsRequest extends AbstractGetValueListItemsRequest
+{}
\ No newline at end of file
diff --git a/src/Mirakl/MCI/Front/Request/ValueList/GetValueListsItemsRequest.php b/src/Mirakl/MCI/Front/Request/ValueList/GetValueListsItemsRequest.php
new file mode 100644
index 0000000..cae6fb7
--- /dev/null
+++ b/src/Mirakl/MCI/Front/Request/ValueList/GetValueListsItemsRequest.php
@@ -0,0 +1,22 @@
+
+ * use Mirakl\MCI\Front\Client\FrontApiClient;
+ * use Mirakl\MCI\Front\Request\ValueList\GetValueListsItemsRequest;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ * $request = new GetValueListsItemsRequest();
+ * $result = $api->getValueListsItems($request);
+ * // $result => @see \Mirakl\MCI\Common\Domain\ValueLists
+ *
+ */
+class GetValueListsItemsRequest extends AbstractGetValueListsItemsRequest
+{}
\ No newline at end of file
diff --git a/src/Mirakl/MCI/Front/Request/ValueList/ValueListImportErrorReportRequest.php b/src/Mirakl/MCI/Front/Request/ValueList/ValueListImportErrorReportRequest.php
new file mode 100644
index 0000000..8e1e842
--- /dev/null
+++ b/src/Mirakl/MCI/Front/Request/ValueList/ValueListImportErrorReportRequest.php
@@ -0,0 +1,32 @@
+
+ * use Mirakl\MCI\Front\Client\FrontApiClient;
+ * use Mirakl\MCI\Front\Request\ValueList\ValueListImportErrorReportRequest;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ * $request = new ValueListImportErrorReportRequest('IMPORT_ID');
+ * $result = $api->getValueListImportErrorReport($request);
+ * // $result => @see \Mirakl\Core\Domain\FileWrapper
+ * // Download file:
+ * $result->download();
+ *
+ */
+class ValueListImportErrorReportRequest extends AbstractImportRequest
+{
+ use CsvResponseDecorator;
+
+ /**
+ * @var string
+ */
+ protected $endpoint = '/values_lists/imports/{import}/error_report';
+}
\ No newline at end of file
diff --git a/src/Mirakl/MCI/Front/Request/ValueList/ValueListImportRequest.php b/src/Mirakl/MCI/Front/Request/ValueList/ValueListImportRequest.php
new file mode 100644
index 0000000..a104aec
--- /dev/null
+++ b/src/Mirakl/MCI/Front/Request/ValueList/ValueListImportRequest.php
@@ -0,0 +1,41 @@
+
+ * "list-code";"list-label";"value-code";"value-label";"update-delete"
+ *
+ *
+ * Example:
+ *
+ *
+ * use Mirakl\MCI\Front\Client\FrontApiClient;
+ * use Mirakl\MCI\Front\Request\ValueList\ValueListImportRequest;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ * $request = new ValueListImportRequest(new \SplFileObject('/path/to/file.csv'));
+ * $result = $api->importValueLists($request);
+ * // $result => @see \Mirakl\MCI\Front\Domain\ValueList\ValueListImportTracking
+ *
+ */
+class ValueListImportRequest extends AbstractFileRequest
+{
+ /**
+ * @var string
+ */
+ protected $endpoint = '/values_lists/imports';
+
+ /**
+ * @inheritdoc
+ */
+ public function getResponseDecorator()
+ {
+ return ValueListImportTracking::decorator();
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MCI/Front/Request/ValueList/ValueListImportStatusRequest.php b/src/Mirakl/MCI/Front/Request/ValueList/ValueListImportStatusRequest.php
new file mode 100644
index 0000000..acc9835
--- /dev/null
+++ b/src/Mirakl/MCI/Front/Request/ValueList/ValueListImportStatusRequest.php
@@ -0,0 +1,36 @@
+
+ * use Mirakl\MCI\Front\Client\FrontApiClient;
+ * use Mirakl\MCI\Front\Request\ValueList\ValueListImportStatusRequest;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ * $request = new ValueListImportStatusRequest('IMPORT_ID');
+ * $result = $api->getValueListImportResult($request);
+ * // $result => @see \Mirakl\MCI\Front\Domain\ValueList\ValueListImportResult
+ *
+ */
+class ValueListImportStatusRequest extends AbstractImportRequest
+{
+ /**
+ * @var string
+ */
+ protected $endpoint = '/values_lists/imports/{import}';
+
+ /**
+ * @inheritdoc
+ */
+ public function getResponseDecorator()
+ {
+ return ValueListImportResult::decorator();
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MCI/Operator/Client/OperatorApiClient.php b/src/Mirakl/MCI/Operator/Client/OperatorApiClient.php
new file mode 100644
index 0000000..9504111
--- /dev/null
+++ b/src/Mirakl/MCI/Operator/Client/OperatorApiClient.php
@@ -0,0 +1,41 @@
+
+ * use Mirakl\MCI\Operator\Client\OperatorApiClient;
+ * use Mirakl\MCI\Operator\Request\Attribute\GetAttributesRequest;
+ *
+ * $api = new OperatorApiClient('API_URL', 'API_KEY');
+ * $request = new GetAttributesRequest();
+ * $request->setHierarchyCode('HIERARCHY_CODE'); // Optional
+ * $request->setMaxLevel(2); // Optional (all children by default)
+ * $result = $api->getAttributes($request);
+ * // $result => @see \Mirakl\MCI\Common\Domain\Collection\AttributeCollection
+ *
+ */
+class GetAttributesRequest extends AbstractGetAttributesRequest
+{}
\ No newline at end of file
diff --git a/src/Mirakl/MCI/Operator/Request/Hierarchy/GetHierarchiesRequest.php b/src/Mirakl/MCI/Operator/Request/Hierarchy/GetHierarchiesRequest.php
new file mode 100644
index 0000000..0495f8d
--- /dev/null
+++ b/src/Mirakl/MCI/Operator/Request/Hierarchy/GetHierarchiesRequest.php
@@ -0,0 +1,24 @@
+
+ * use Mirakl\MCI\Operator\Client\OperatorApiClient;
+ * use Mirakl\MCI\Operator\Request\Hierarchy\GetHierarchiesRequest;
+ *
+ * $api = new OperatorApiClient('API_URL', 'API_KEY');
+ * $request = new GetHierarchiesRequest();
+ * $request->setHierarchyCode('HIERARCHY_CODE'); // Optional
+ * $request->setMaxLevel(2); // Optional (all children by default)
+ * $result = $api->getHierarchies($request);
+ * // $result => @see \Mirakl\MCI\Common\Domain\Collection\HierarchyCollection
+ *
+ */
+class GetHierarchiesRequest extends AbstractGetHierarchiesRequest
+{}
\ No newline at end of file
diff --git a/src/Mirakl/MCI/Operator/Request/Product/DownloadProductImportErrorReportRequest.php b/src/Mirakl/MCI/Operator/Request/Product/DownloadProductImportErrorReportRequest.php
new file mode 100644
index 0000000..495b7f9
--- /dev/null
+++ b/src/Mirakl/MCI/Operator/Request/Product/DownloadProductImportErrorReportRequest.php
@@ -0,0 +1,24 @@
+
+ * use Mirakl\MCI\Operator\Client\OperatorApiClient;
+ * use Mirakl\MCI\Operator\Request\Product\DownloadProductImportErrorReportRequest;
+ *
+ * $api = new OperatorApiClient('API_URL', 'API_KEY');
+ * $request = new DownloadProductImportErrorReportRequest('IMPORT_ID');
+ * $result = $api->downloadProductImportErrorReport($request);
+ * // $result => @see \Mirakl\Core\Domain\FileWrapper
+ * // Download file:
+ * $result->download();
+ *
+ */
+class DownloadProductImportErrorReportRequest extends AbstractDownloadProductImportErrorReportRequest
+{}
\ No newline at end of file
diff --git a/src/Mirakl/MCI/Operator/Request/Product/DownloadProductImportNewProductsReportRequest.php b/src/Mirakl/MCI/Operator/Request/Product/DownloadProductImportNewProductsReportRequest.php
new file mode 100644
index 0000000..d0de7c5
--- /dev/null
+++ b/src/Mirakl/MCI/Operator/Request/Product/DownloadProductImportNewProductsReportRequest.php
@@ -0,0 +1,24 @@
+
+ * use Mirakl\MCI\Operator\Client\OperatorApiClient;
+ * use Mirakl\MCI\Operator\Request\Product\DownloadProductImportNewProductsReportRequest;
+ *
+ * $api = new OperatorApiClient('API_URL', 'API_KEY');
+ * $request = new DownloadProductImportNewProductsReportRequest('IMPORT_ID');
+ * $result = $api->downloadProductImportNewProductsReport($request);
+ * // $result => @see \Mirakl\Core\Domain\FileWrapper
+ * // Download file:
+ * $result->download();
+ *
+ */
+class DownloadProductImportNewProductsReportRequest extends AbstractDownloadProductImportNewProductsReportRequest
+{}
\ No newline at end of file
diff --git a/src/Mirakl/MCI/Operator/Request/Product/DownloadProductImportTransformationErrorReportRequest.php b/src/Mirakl/MCI/Operator/Request/Product/DownloadProductImportTransformationErrorReportRequest.php
new file mode 100644
index 0000000..c03cae8
--- /dev/null
+++ b/src/Mirakl/MCI/Operator/Request/Product/DownloadProductImportTransformationErrorReportRequest.php
@@ -0,0 +1,25 @@
+
+ * use Mirakl\MCI\Operator\Client\OperatorApiClient;
+ * use Mirakl\MCI\Operator\Request\Product\DownloadProductImportTransformationErrorReportRequest;
+ *
+ * $api = new OperatorApiClient('API_URL', 'API_KEY');
+ * $request = new DownloadProductImportTransformationErrorReportRequest('IMPORT_ID');
+ * $result = $api->downloadProductImportTransformationErrorReport($request);
+ * // $result => @see \Mirakl\Core\Domain\FileWrapper
+ * // Download file:
+ * $result->download();
+ *
+ */
+class DownloadProductImportTransformationErrorReportRequest
+ extends AbstractDownloadProductImportTransformationErrorReportRequest
+{}
\ No newline at end of file
diff --git a/src/Mirakl/MCI/Operator/Request/Product/DownloadProductImportTransformedFileRequest.php b/src/Mirakl/MCI/Operator/Request/Product/DownloadProductImportTransformedFileRequest.php
new file mode 100644
index 0000000..41bf894
--- /dev/null
+++ b/src/Mirakl/MCI/Operator/Request/Product/DownloadProductImportTransformedFileRequest.php
@@ -0,0 +1,24 @@
+
+ * use Mirakl\MCI\Operator\Client\OperatorApiClient;
+ * use Mirakl\MCI\Operator\Request\Product\DownloadProductImportTransformedFileRequest;
+ *
+ * $api = new OperatorApiClient('API_URL', 'API_KEY');
+ * $request = new DownloadProductImportTransformedFileRequest('IMPORT_ID');
+ * $result = $api->downloadProductImportTransformedFile($request);
+ * // $result => @see \Mirakl\Core\Domain\FileWrapper
+ * // Download file:
+ * $result->download();
+ *
+ */
+class DownloadProductImportTransformedFileRequest extends AbstractDownloadProductImportTransformedFileRequest
+{}
\ No newline at end of file
diff --git a/src/Mirakl/MCI/Operator/Request/Product/ProductImportRequest.php b/src/Mirakl/MCI/Operator/Request/Product/ProductImportRequest.php
new file mode 100644
index 0000000..55855f7
--- /dev/null
+++ b/src/Mirakl/MCI/Operator/Request/Product/ProductImportRequest.php
@@ -0,0 +1,41 @@
+
+ * use Mirakl\MCI\Operator\Client\OperatorApiClient;
+ * use Mirakl\MCI\Operator\Request\Product\ProductImportRequest;
+ *
+ * $api = new OperatorApiClient('API_URL', 'API_KEY');
+ * $request = new ProductImportRequest(new \SplFileObject('/path/to/file.csv'), 'SHOP_ID');
+ *
+ * $result = $api->importProducts($request);
+ * // $result => @see \Mirakl\MCI\Common\Domain\Product\ProductImportTracking
+ *
+ */
+class ProductImportRequest extends AbstractProductImportRequest
+{
+ /**
+ * @var array
+ */
+ public $bodyParams = ['shop'];
+
+ /**
+ * @param mixed $file
+ * @param int $shopId
+ */
+ public function __construct($file, $shopId)
+ {
+ parent::__construct($file);
+ $this->setShop($shopId);
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MCI/Operator/Request/Product/ProductImportStatusRequest.php b/src/Mirakl/MCI/Operator/Request/Product/ProductImportStatusRequest.php
new file mode 100644
index 0000000..e633bd2
--- /dev/null
+++ b/src/Mirakl/MCI/Operator/Request/Product/ProductImportStatusRequest.php
@@ -0,0 +1,22 @@
+
+ * use Mirakl\MCI\Operator\Client\OperatorApiClient;
+ * use Mirakl\MCI\Operator\Request\Product\ProductImportStatusRequest;
+ *
+ * $api = new OperatorApiClient('API_URL', 'API_KEY');
+ * $request = new ProductImportStatusRequest('IMPORT_ID');
+ * $result = $api->getProductImportStatus($request);
+ * // $result => @see \Mirakl\MCI\Common\Domain\Product\ProductImportResult
+ *
+ */
+class ProductImportStatusRequest extends AbstractProductImportStatusRequest
+{}
\ No newline at end of file
diff --git a/src/Mirakl/MCI/Operator/Request/Product/ProductImportStatusesRequest.php b/src/Mirakl/MCI/Operator/Request/Product/ProductImportStatusesRequest.php
new file mode 100644
index 0000000..cfe5e3e
--- /dev/null
+++ b/src/Mirakl/MCI/Operator/Request/Product/ProductImportStatusesRequest.php
@@ -0,0 +1,23 @@
+
+ * use Mirakl\MCI\Operator\Client\OperatorApiClient;
+ * use Mirakl\MCI\Operator\Request\Product\ProductImportStatusesRequest;
+ *
+ * $api = new OperatorApiClient('API_URL', 'API_KEY');
+ * $request = new ProductImportStatusesRequest();
+ *
+ * $result = $api->getProductImportStatuses($request);
+ * // $result => @see \Mirakl\MCI\Common\Domain\Collection\Product\ProductImportResultCollection
+ *
+ */
+class ProductImportStatusesRequest extends AbstractProductImportStatusesRequest
+{}
\ No newline at end of file
diff --git a/src/Mirakl/MCI/Operator/Request/Product/UpdateProductImportStatusRequest.php b/src/Mirakl/MCI/Operator/Request/Product/UpdateProductImportStatusRequest.php
new file mode 100644
index 0000000..4ddd998
--- /dev/null
+++ b/src/Mirakl/MCI/Operator/Request/Product/UpdateProductImportStatusRequest.php
@@ -0,0 +1,27 @@
+
+ * use Mirakl\MCI\Operator\Client\OperatorApiClient;
+ * use Mirakl\MCI\Operator\Request\Product\UpdateProductImportStatusRequest;
+ * use Mirakl\Core\Domain\FileWrapper;
+ *
+ * $api = new OperatorApiClient('API_URL', 'API_KEY');
+ * $request = new UpdateProductImportStatusRequest('IMPORT_ID');
+ * $errorsFile = new \SplFileObject('/path/to/errors_file.csv');
+ * $request->setErrorsFile(new FileWrapper($errorsFile)); // Optional
+ * $productsFile = new \SplFileObject('/path/to/products_file.csv');
+ * $request->setProductsFile(new FileWrapper($productsFile)); // Optional
+ * $api->updateProductImportStatus($request);
+ *
+ */
+class UpdateProductImportStatusRequest extends AbstractUpdateProductImportStatusRequest
+{}
\ No newline at end of file
diff --git a/src/Mirakl/MCI/Operator/Request/ValueList/GetValueListItemsRequest.php b/src/Mirakl/MCI/Operator/Request/ValueList/GetValueListItemsRequest.php
new file mode 100644
index 0000000..6cdd410
--- /dev/null
+++ b/src/Mirakl/MCI/Operator/Request/ValueList/GetValueListItemsRequest.php
@@ -0,0 +1,22 @@
+
+ * use Mirakl\MCI\Operator\Client\OperatorApiClient;
+ * use Mirakl\MCI\Operator\Request\ValueList\GetValueListItemsRequest;
+ *
+ * $api = new OperatorApiClient('API_URL', 'API_KEY');
+ * $request = new GetValueListItemsRequest('COLOR');
+ * $result = $api->getValueListItems($request);
+ * // $result => @see \Mirakl\MCI\Common\Domain\ValueList
+ *
+ */
+class GetValueListItemsRequest extends AbstractGetValueListItemsRequest
+{}
\ No newline at end of file
diff --git a/src/Mirakl/MCI/Operator/Request/ValueList/GetValueListsItemsRequest.php b/src/Mirakl/MCI/Operator/Request/ValueList/GetValueListsItemsRequest.php
new file mode 100644
index 0000000..d732859
--- /dev/null
+++ b/src/Mirakl/MCI/Operator/Request/ValueList/GetValueListsItemsRequest.php
@@ -0,0 +1,22 @@
+
+ * use Mirakl\MCI\Operator\Client\OperatorApiClient;
+ * use Mirakl\MCI\Operator\Request\ValueList\GetValueListsItemsRequest;
+ *
+ * $api = new OperatorApiClient('API_URL', 'API_KEY');
+ * $request = new GetValueListsItemsRequest();
+ * $result = $api->getValueListsItems($request);
+ * // $result => @see \Mirakl\MCI\Common\Domain\ValueLists
+ *
+ */
+class GetValueListsItemsRequest extends AbstractGetValueListsItemsRequest
+{}
\ No newline at end of file
diff --git a/src/Mirakl/MCM/Common/Domain/AbstractError.php b/src/Mirakl/MCM/Common/Domain/AbstractError.php
new file mode 100644
index 0000000..9dc384a
--- /dev/null
+++ b/src/Mirakl/MCM/Common/Domain/AbstractError.php
@@ -0,0 +1,13 @@
+ 'data_product',
+ 'mirakl_variant_group_id' => 'variant_group_id', /** @deprecated */
+ ];
+
+ /**
+ * @var array
+ */
+ protected static $dataTypes = [
+ 'sources' => [ProductSourceCollection::class, 'create'],
+ 'acceptance' => [ProductAcceptance::class, 'create'],
+ 'validation' => [ProductValidation::class, 'create'],
+ 'synchronization' => [ProductSynchronization::class, 'create'],
+ ];
+}
\ No newline at end of file
diff --git a/src/Mirakl/MCM/Front/Domain/Product/Export/ProductSource.php b/src/Mirakl/MCM/Front/Domain/Product/Export/ProductSource.php
new file mode 100644
index 0000000..03077b7
--- /dev/null
+++ b/src/Mirakl/MCM/Front/Domain/Product/Export/ProductSource.php
@@ -0,0 +1,13 @@
+ [ProductIntegrationErrorCollection::class, 'create'],
+ ];
+}
\ No newline at end of file
diff --git a/src/Mirakl/MCM/Front/Domain/Product/Export/ProductSynchronizationStatus.php b/src/Mirakl/MCM/Front/Domain/Product/Export/ProductSynchronizationStatus.php
new file mode 100644
index 0000000..ac73f7e
--- /dev/null
+++ b/src/Mirakl/MCM/Front/Domain/Product/Export/ProductSynchronizationStatus.php
@@ -0,0 +1,9 @@
+ 'data_product',
+ ];
+
+ /**
+ * @var array
+ */
+ protected static $dataTypes = [
+ 'acceptance' => [ProductAcceptance::class, 'create'],
+ 'integration_errors' => [ProductIntegrationErrorCollection::class, 'create'],
+ 'synchronization_errors' => [ProductSynchronizationErrorCollection::class, 'create']
+ ];
+
+ /**
+ * Confirm product
+ *
+ * @param string $miraklProductId
+ * @param string $sku
+ */
+ public function confirmProduct($miraklProductId, $sku)
+ {
+ $this->unsetData();
+ $this->setMiraklProductId($miraklProductId);
+ $this->setProductSku($sku);
+ }
+
+ /**
+ * Report integration errors for a $miraklProductId product
+ *
+ * @param string $miraklProductId
+ * @param ProductIntegrationErrorCollection $integrationErrorCollection
+ */
+ public function reportIntegrationErrorProduct($miraklProductId, ProductIntegrationErrorCollection $integrationErrorCollection)
+ {
+ $this->unsetData();
+ $this->setMiraklProductId($miraklProductId);
+ $this->setIntegrationErrors($integrationErrorCollection);
+ }
+
+ /**
+ * Create a new product
+ *
+ * @param string $sku
+ * @param array $dataProduct
+ */
+ public function createProduct($sku, array $dataProduct)
+ {
+ $this->unsetData();
+ $this->setProductSku($sku);
+ $this->setDataProduct($dataProduct);
+ }
+
+ /**
+ * Accept a product
+ */
+ public function acceptProduct()
+ {
+ $this->setAcceptance(new ProductAcceptance(['status' => ProductAcceptanceStatus::STATUS_ACCEPTED]));
+ }
+
+ /**
+ * Reject a product with an optional reason code and messsage
+ *
+ * @param string|null $reasonCode
+ * @param string|null $message
+ */
+ public function rejectProduct($reasonCode = null, $message = null)
+ {
+ $rejectedProduct = new ProductAcceptance(['status' => ProductAcceptanceStatus::STATUS_REJECTED]);
+ if (!empty($reasonCode)) {
+ $rejectedProduct->setReasonCode($reasonCode);
+ }
+ if (!empty($message)) {
+ $rejectedProduct->setMessage($message);
+ }
+ $this->setAcceptance($rejectedProduct);
+ }
+
+ /**
+ * Update a product
+ *
+ * @param string $miraklProductId
+ * @param string $sku
+ * @param array $dataProduct
+ */
+ public function updateProduct($miraklProductId, $sku, array $dataProduct)
+ {
+ $this->unsetData();
+ $this->setMiraklProductId($miraklProductId);
+ $this->setProductSku($sku);
+ $this->setDataProduct($dataProduct);
+ }
+
+ /**
+ * @param array $dataProduct
+ */
+ public function setDataProduct($dataProduct)
+ {
+ $this->setData('data', $dataProduct);
+ }
+
+ /**
+ * @return array
+ */
+ public function getDataProduct()
+ {
+ return $this->getData('data');
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MCM/Front/Domain/Product/Synchronization/ProductSynchronizationAcceptanceStatus.php b/src/Mirakl/MCM/Front/Domain/Product/Synchronization/ProductSynchronizationAcceptanceStatus.php
new file mode 100644
index 0000000..3dd97af
--- /dev/null
+++ b/src/Mirakl/MCM/Front/Domain/Product/Synchronization/ProductSynchronizationAcceptanceStatus.php
@@ -0,0 +1,8 @@
+ [ProcessedCollection::class, 'create'],
+ 'global_errors' => [GlobalErrorCollection::class, 'create'],
+ ];
+}
\ No newline at end of file
diff --git a/src/Mirakl/MCM/Front/Domain/Product/Synchronization/ProductSynchronizationStatus.php b/src/Mirakl/MCM/Front/Domain/Product/Synchronization/ProductSynchronizationStatus.php
new file mode 100644
index 0000000..818b10f
--- /dev/null
+++ b/src/Mirakl/MCM/Front/Domain/Product/Synchronization/ProductSynchronizationStatus.php
@@ -0,0 +1,21 @@
+ 'tracking_id'
+ ];
+
+ /**
+ * @param string $trackingId
+ */
+ public function __construct($trackingId)
+ {
+ parent::__construct();
+ $this->setTrackingId($trackingId);
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MCM/Front/Request/Catalog/Product/ProductExportCsvRequest.php b/src/Mirakl/MCM/Front/Request/Catalog/Product/ProductExportCsvRequest.php
new file mode 100644
index 0000000..596f5b1
--- /dev/null
+++ b/src/Mirakl/MCM/Front/Request/Catalog/Product/ProductExportCsvRequest.php
@@ -0,0 +1,63 @@
+
+ * require 'vendor/autoload.php';
+ *
+ * use Mirakl\MCM\Front\Client\FrontApiClient as MiraklApiClient;
+ * use Mirakl\MCM\Front\Request\Catalog\Product\ProductExportCsvRequest;
+ *
+ * // Environment parameters
+ * $url = 'https://your.env/api';
+ * $apiKey = '40956c2a-6b1ab-4e0a-97c8-97ebf78630c0';
+ *
+ * try {
+ * // Building request
+ * $request = new ProductExportCsvRequest();
+ *
+ * // Instantiating the Mirakl API Client
+ * $api = new MiraklApiClient($url, $apiKey);
+ *
+ * // Set updated since parameter date
+ * $request->setUpdatedSince(new \DateTime('2017-11-08T14:07:00+0000'));
+ *
+ * // Calling the API
+ * $result = $api->exportCsvProducts($request);
+ *
+ * // Mirakl\Core\Domain\FileWrapper
+ * var_dump($result); // decorated response
+ *
+ * // You can also retrieve raw response by using run() method of API client:
+ * $result = $api->run($request); // or $api->raw()->exportCsvProducts($request)
+ * var_dump($result); // returns \Psr\Http\Message\ResponseInterface
+
+ * // Get the stream file
+ * $streamFile = $result->getFile();
+ * var_dump($streamFile); // returns \SplTempFileObject
+ *
+ * } catch (\Exception $e) {
+ * // An exception is thrown if object requested is not found or if an error occurs
+ * var_dump($e);
+ * }
+ *
+ */
+class ProductExportCsvRequest extends AbstractProductExportRequest
+{
+ use CsvResponseDecorator;
+
+ /**
+ * @inheritdoc
+ */
+ public function __construct()
+ {
+ parent::__construct();
+ $this->setOptions(['headers' => ['Accept' => 'text/csv']]);
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MCM/Front/Request/Catalog/Product/ProductExportRequest.php b/src/Mirakl/MCM/Front/Request/Catalog/Product/ProductExportRequest.php
new file mode 100644
index 0000000..5b7ed1a
--- /dev/null
+++ b/src/Mirakl/MCM/Front/Request/Catalog/Product/ProductExportRequest.php
@@ -0,0 +1,58 @@
+
+ * setUpdatedSince(new \DateTime('2017-11-08T14:07:00+0000'));
+ *
+ * // Calling the API
+ * $result = $api->exportProducts($request);
+ *
+ * // \Mirakl\MCM\Front\Domain\Collection\Product\ProductExportCollection
+ * var_dump($result); // decorated response
+ *
+ * // You can also retrieve raw response by using run() method of API client:
+ * $result = $api->run($request); // or $api->raw()->exportProducts($request)
+ * //var_dump($result); // returns \Psr\Http\Message\ResponseInterface
+ *
+ * } catch (\Exception $e) {
+ * // An exception is thrown if object requested is not found or if an error occurs
+ * var_dump($e->getTraceAsString());
+ * }
+ *
+ */
+class ProductExportRequest extends AbstractProductExportRequest
+{
+ /**
+ * @inheritdoc
+ */
+ public function getResponseDecorator()
+ {
+ return ProductExportCollection::decorator();
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MCM/Front/Request/Catalog/Product/ProductSynchronizationReportRequest.php b/src/Mirakl/MCM/Front/Request/Catalog/Product/ProductSynchronizationReportRequest.php
new file mode 100644
index 0000000..43f22f3
--- /dev/null
+++ b/src/Mirakl/MCM/Front/Request/Catalog/Product/ProductSynchronizationReportRequest.php
@@ -0,0 +1,64 @@
+
+ * getProductSynchronizationReport($request);
+ *
+ * // \Mirakl\MCM\Front\Domain\Product\Synchronization\ProductSynchronizationReport
+ * var_dump($result); // decorated response
+ *
+ * // You can also retrieve raw response by using run() method of API client:
+ * $result = $api->run($request); // or $api->raw()->getProductSynchronizationStatus($request)
+ * //var_dump($result); // returns \Psr\Http\Message\ResponseInterface
+ *
+ * } catch (\Exception $e) {
+ * // An exception is thrown if object requested is not found or if an error occurs
+ * var_dump($e->getTraceAsString());
+ * }
+ *
+ */
+class ProductSynchronizationReportRequest extends AbstractProductSynchronizationRequest
+{
+ /**
+ * @var string
+ */
+ protected $endpoint = '/mcm/products/synchronization/{tracking_id}/report';
+
+ /**
+ * @inheritdoc
+ */
+ public function getResponseDecorator()
+ {
+ return ProductSynchronizationReport::decorator();
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MCM/Front/Request/Catalog/Product/ProductSynchronizationRequest.php b/src/Mirakl/MCM/Front/Request/Catalog/Product/ProductSynchronizationRequest.php
new file mode 100644
index 0000000..242674d
--- /dev/null
+++ b/src/Mirakl/MCM/Front/Request/Catalog/Product/ProductSynchronizationRequest.php
@@ -0,0 +1,122 @@
+ Confirm integration of products previously exported: in this case just send the mirakl_product_id and your own product_sku
+ * -> Report integration errors of products previously exported: in this case send the mirakl_product_id and the integration_errors values
+ * -> Create new products: in this case send your own sku and complete product data
+ * -> Accept or reject products: in this case add an acceptance entry with the status ACCEPTED or REJECTED. If the status is REJECTED, define the reason_code and an optional message
+ * -> Update products: in this case send your own sku, the mirakl_product_id, additional product data and acceptance status
+ *
+ * @see \Mirakl\MCM\Front\Domain\Product\Synchronization\ProductSynchronization
+ * @see \Mirakl\MCM\Front\Domain\Product\Synchronization\ProductSynchronizeTracking
+ *
+ * @method ProductSynchronizeCollection getProducts()
+ * @method $this setProducts(array|ProductSynchronizeCollection $synchronizeProduct)
+ *
+ * Example:
+ *
+ *
+ * confirmProduct('abc5-4cf1-acdb-56152a77bc56', 'SH0001');
+ * $productCollection->add($product);
+ *
+ * // Building request
+ * $request = new ProductSynchronizationRequest($productCollection);
+ *
+ * // Instantiating the Mirakl API Client
+ * $api = new MiraklApiClient($url, $apiKey);
+ *
+ * // Calling the API
+ * $result = $api->synchronizeProduct($request);
+ *
+ * // \Mirakl\MCM\Front\Domain\Product\Synchronization\ProductSynchronizeTracking
+ * var_dump($result); // decorated response
+ *
+ * // Get the tracking Id
+ * $trackingId = $result->getTrackingId();
+ * var_dump($trackingId);
+ *
+ * // You can also retrieve raw response by using run() method of API client:
+ * $result = $api->run($request); // or $api->raw()->synchronizeProduct($request)
+ * //var_dump($result); // returns \Psr\Http\Message\ResponseInterface
+ *
+ * } catch (\Exception $e) {
+ * // An exception is thrown if object requested is not found or if an error occurs
+ * var_dump($e->getTraceAsString());
+ * }
+ *
+ */
+class ProductSynchronizationRequest extends AbstractRequest
+{
+ /**
+ * @var string
+ */
+ protected $method = 'POST';
+
+ /**
+ * @var string
+ */
+ protected $endpoint = '/mcm/products/synchronization';
+
+ /**
+ * @var array
+ */
+ public $bodyParams = ['products'];
+
+ /**
+ * @var array
+ */
+ protected static $dataTypes = [
+ 'products' => [ProductSynchronizeCollection::class, 'create'],
+ ];
+
+ /**
+ * @param ProductSynchronizeCollection $productSynchronizeCollection
+ */
+ public function __construct(ProductSynchronizeCollection $productSynchronizeCollection)
+ {
+ parent::__construct();
+ $this->setProducts($productSynchronizeCollection);
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function getBodyParams()
+ {
+ return $this->getProducts()->toArray();
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function getResponseDecorator()
+ {
+ return ProductSynchronizeTracking::decorator();
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MCM/Front/Request/Catalog/Product/ProductSynchronizationStatusRequest.php b/src/Mirakl/MCM/Front/Request/Catalog/Product/ProductSynchronizationStatusRequest.php
new file mode 100644
index 0000000..5956dd0
--- /dev/null
+++ b/src/Mirakl/MCM/Front/Request/Catalog/Product/ProductSynchronizationStatusRequest.php
@@ -0,0 +1,62 @@
+
+ * getProductSynchronizationStatus($request);
+ *
+ * // \Mirakl\MMP\FrontOperator\Domain\Product\Synchro\ProductSynchroResult
+ * var_dump($result); // decorated response
+ *
+ * // You can also retrieve raw response by using run() method of API client:
+ * $result = $api->run($request); // or $api->raw()->getProductSynchronizationStatus($request)
+ * //var_dump($result); // returns \Psr\Http\Message\ResponseInterface
+ *
+ * } catch (\Exception $e) {
+ * // An exception is thrown if object requested is not found or if an error occurs
+ * var_dump($e->getTraceAsString());
+ * }
+ *
+ */
+class ProductSynchronizationStatusRequest extends AbstractProductSynchronizationRequest
+{
+ /**
+ * @var string
+ */
+ protected $endpoint = '/mcm/products/synchronization/{tracking_id}';
+
+ /**
+ * @inheritdoc
+ */
+ public function getResponseDecorator()
+ {
+ return ProductSynchroResult::decorator();
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Common/Domain/Collection/Message/Thread/ThreadAttachmentCollection.php b/src/Mirakl/MMP/Common/Domain/Collection/Message/Thread/ThreadAttachmentCollection.php
new file mode 100644
index 0000000..14bd19f
--- /dev/null
+++ b/src/Mirakl/MMP/Common/Domain/Collection/Message/Thread/ThreadAttachmentCollection.php
@@ -0,0 +1,20 @@
+ [ThreadTopic::class, 'create'],
+ 'authorized_participants' => [ThreadParticipantCollection::class, 'create'],
+ 'current_participants' => [ThreadParticipantCollection::class, 'create'],
+ 'entities' => [ThreadEntityCollection::class, 'create'],
+ 'metadata' => [ThreadMetadata::class, 'create'],
+ ];
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Common/Domain/Message/Thread/ThreadAttachment.php b/src/Mirakl/MMP/Common/Domain/Message/Thread/ThreadAttachment.php
new file mode 100644
index 0000000..9ad06d1
--- /dev/null
+++ b/src/Mirakl/MMP/Common/Domain/Message/Thread/ThreadAttachment.php
@@ -0,0 +1,15 @@
+ [ThreadTopic::class, 'create'],
+ 'authorized_participants' => [ThreadParticipantCollection::class, 'create'],
+ 'current_participants' => [ThreadParticipantCollection::class, 'create'],
+ 'entities' => [ThreadEntityCollection::class, 'create'],
+ 'metadata' => [ThreadMetadata::class, 'create'],
+ 'messages' => [ThreadMessageCollection::class, 'create'],
+ ];
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Common/Domain/Message/Thread/ThreadEntity.php b/src/Mirakl/MMP/Common/Domain/Message/Thread/ThreadEntity.php
new file mode 100644
index 0000000..40fe7d2
--- /dev/null
+++ b/src/Mirakl/MMP/Common/Domain/Message/Thread/ThreadEntity.php
@@ -0,0 +1,15 @@
+ [ThreadSender::class, 'create'],
+ 'to' => [ThreadParticipantCollection::class, 'create'],
+ 'attachments' => [ThreadAttachmentCollection::class, 'create'],
+ ];
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Common/Domain/Message/Thread/ThreadMetadata.php b/src/Mirakl/MMP/Common/Domain/Message/Thread/ThreadMetadata.php
new file mode 100644
index 0000000..2e2e333
--- /dev/null
+++ b/src/Mirakl/MMP/Common/Domain/Message/Thread/ThreadMetadata.php
@@ -0,0 +1,13 @@
+ [ThreadRecipientCollection::class, 'create'],
+ 'topic' => [ThreadTopic::class, 'create'],
+ ];
+}
diff --git a/src/Mirakl/MMP/Common/Domain/Message/Thread/ThreadSender.php b/src/Mirakl/MMP/Common/Domain/Message/Thread/ThreadSender.php
new file mode 100644
index 0000000..12ad61e
--- /dev/null
+++ b/src/Mirakl/MMP/Common/Domain/Message/Thread/ThreadSender.php
@@ -0,0 +1,22 @@
+ [ThreadOrganization::class, 'create'],
+ ];
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Common/Domain/Message/Thread/ThreadTopic.php b/src/Mirakl/MMP/Common/Domain/Message/Thread/ThreadTopic.php
new file mode 100644
index 0000000..ce6661a
--- /dev/null
+++ b/src/Mirakl/MMP/Common/Domain/Message/Thread/ThreadTopic.php
@@ -0,0 +1,13 @@
+ [PaymentInfo::class, 'factory'],
'professional_info' => [ProfessionalInfo::class, 'create'],
'shipping_info' => [ShippingInfo::class, 'create'],
+ 'kyc' => [ShopKyc::class, 'create'],
'shop_stats' => [ShopStats::class, 'create'],
];
}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Common/Domain/Shop/ShopKyc.php b/src/Mirakl/MMP/Common/Domain/Shop/ShopKyc.php
new file mode 100644
index 0000000..25f5f1e
--- /dev/null
+++ b/src/Mirakl/MMP/Common/Domain/Shop/ShopKyc.php
@@ -0,0 +1,13 @@
+ 'thread_id',
+ ];
+
+ /**
+ * @param string $threadId
+ */
+ public function __construct($threadId)
+ {
+ parent::__construct();
+ $this->setThreadId($threadId);
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function getResponseDecorator()
+ {
+ return ThreadDetails::decorator();
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Common/Request/Message/AbstractGetThreadsRequest.php b/src/Mirakl/MMP/Common/Request/Message/AbstractGetThreadsRequest.php
new file mode 100644
index 0000000..0cd844c
--- /dev/null
+++ b/src/Mirakl/MMP/Common/Request/Message/AbstractGetThreadsRequest.php
@@ -0,0 +1,43 @@
+
+ * use Mirakl\MMP\Front\Client\FrontApiClient;
+ * use Mirakl\MMP\Common\Request\Message\DownloadThreadMessageAttachmentRequest;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ * $request = new DownloadThreadMessageAttachmentRequest('ATTACHMENT_ID');
+ * $result = $api->downloadThreadMessageAttachment($request);
+ * // $result => @see \Mirakl\Core\Domain\FileWrapper
+ * // Download file:
+ * $result->download();
+ *
+ */
+class DownloadThreadMessageAttachmentRequest extends AbstractRequest
+{
+ use FileResponseDecorator;
+
+ /**
+ * @var string
+ */
+ protected $endpoint = '/inbox/threads/{attachment_id}/download';
+
+ /**
+ * @var array
+ */
+ protected $uriVars = [
+ '{attachment_id}' => 'attachment_id',
+ ];
+
+ /**
+ * @param string $attachmentId
+ */
+ public function __construct($attachmentId)
+ {
+ parent::__construct();
+ $this->setAttachmentId($attachmentId);
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Common/Request/Message/ThreadReplyRequest.php b/src/Mirakl/MMP/Common/Request/Message/ThreadReplyRequest.php
new file mode 100644
index 0000000..00007f0
--- /dev/null
+++ b/src/Mirakl/MMP/Common/Request/Message/ThreadReplyRequest.php
@@ -0,0 +1,92 @@
+
+ * use Mirakl\MMP\Front\Client\FrontApiClient;
+ * use Mirakl\Core\Domain\FileWrapper;
+ * use Mirakl\MMP\Common\Domain\Collection\Message\Thread\ThreadRecipientCollection;
+ * use Mirakl\MMP\Common\Domain\Message\Thread\ThreadRecipient;
+ * use Mirakl\MMP\Common\Domain\Message\Thread\ThreadReplyMessageInput;
+ * use Mirakl\MMP\Common\Request\Message\ThreadReplyRequest;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ *
+ * $recipient1 = new ThreadRecipient();
+ * $recipient1->setType('OPERATOR');
+ * $recipient2 = new ThreadRecipient();
+ * $recipient2->setId('116');
+ * $recipient2->setType('SHOP');
+ *
+ * $recipients = new ThreadRecipientCollection();
+ * $recipients->add($recipient1);
+ * $recipients->add($recipient2);
+ *
+ * $input = new ThreadReplyMessageInput();
+ * $input->setBody('this is the body of my reply');
+ * $input->setTo($recipients);
+ *
+ * $request = new ThreadReplyRequest('THREAD_ID', $input);
+ *
+ * // Add a file
+ * $file = new FileWrapper(new \SplFileObject('foobar.txt'));
+ * $file->setFileName('test1.txt'); // Optional, only needed if file name different than 'foobar.txt'
+ * $request->addFile($file);
+ *
+ * $result = $api->replyToThread($request);
+ * // $result => @see \Mirakl\MMP\Common\Domain\Message\Thread\ThreadReplyCreated
+ *
+ */
+class ThreadReplyRequest extends AbstractFilesUploadRequest
+{
+ /**
+ * @var string
+ */
+ protected $endpoint = '/inbox/threads/{thread}/message';
+
+ /**
+ * @var array
+ */
+ protected $uriVars = [
+ '{thread}' => 'thread_id',
+ ];
+
+ /**
+ * @var array
+ */
+ public $bodyParams = [
+ 'message_input',
+ ];
+
+ /**
+ * @param string $threadId
+ * @param ThreadReplyMessageInput|array $messageInput
+ */
+ public function __construct($threadId, $messageInput)
+ {
+ parent::__construct();
+ $this->setThreadId($threadId);
+ $this->setMessageInput($messageInput);
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function getResponseDecorator()
+ {
+ return ThreadReplyCreated::decorator();
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Common/Request/Order/Message/CreateOrderThreadRequest.php b/src/Mirakl/MMP/Common/Request/Order/Message/CreateOrderThreadRequest.php
new file mode 100644
index 0000000..48d70a4
--- /dev/null
+++ b/src/Mirakl/MMP/Common/Request/Order/Message/CreateOrderThreadRequest.php
@@ -0,0 +1,85 @@
+
+ * use Mirakl\MMP\Front\Client\FrontApiClient;
+ * use Mirakl\MMP\Common\Domain\Message\Thread\ThreadTopic;
+ * use Mirakl\MMP\Common\Domain\Order\Message\CreateOrderThread;
+ * use Mirakl\MMP\Common\Request\Order\Message\CreateOrderThreadRequest;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ *
+ * $thread = new CreateOrderThread();
+ * $thread->setBody('This is an example body');
+ * $thread->setTo(['SHOP', 'OPERATOR']);
+ *
+ * $topic = new ThreadTopic();
+ * $topic->setType('FREE_TEXT');
+ * $topic->setValue('This is an example');
+ * $thread->setTopic($topic);
+ *
+ * $request = new CreateOrderThreadRequest('ORDER_ID', $thread);
+ *
+ * // Add a file
+ * $file = new FileWrapper(new \SplFileObject('foobar.txt'));
+ * $file->setFileName('test1.txt'); // Optional, only needed if file name different than 'foobar.txt'
+ * $request->addFile($file);
+ *
+ * $result = $api->createOrderThread($request);
+ * // $result => @see \Mirakl\MMP\Common\Domain\Message\Thread\ThreadCreated
+ *
+ */
+class CreateOrderThreadRequest extends AbstractFilesUploadRequest
+{
+ /**
+ * @var string
+ */
+ protected $endpoint = '/orders/{orderId}/threads';
+
+ /**
+ * @var array
+ */
+ protected $uriVars = [
+ '{orderId}' => 'order_id',
+ ];
+
+ /**
+ * @var array
+ */
+ public $bodyParams = [
+ 'thread' => 'thread_input',
+ ];
+
+ /**
+ * @param string $orderId
+ * @param CreateOrderThread|array $thread
+ */
+ public function __construct($orderId, $thread)
+ {
+ parent::__construct();
+ $this->setOrderId($orderId);
+ $this->setThread($thread);
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function getResponseDecorator()
+ {
+ return ThreadCreated::decorator();
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Front/Client/FrontApiClient.php b/src/Mirakl/MMP/Front/Client/FrontApiClient.php
new file mode 100644
index 0000000..7ad97a1
--- /dev/null
+++ b/src/Mirakl/MMP/Front/Client/FrontApiClient.php
@@ -0,0 +1,164 @@
+run($this);
+ }
+
+ /**
+ * (SH31) List all logistic classes
+ *
+ * @param null|string $locale
+ * @return LogisticClassCollection
+ */
+ public function getLogisticClasses($locale = null)
+ {
+ $request = new GetLogisticClassRequest();
+
+ if (null !== $locale) {
+ $request->setLocale((string) $locale);
+ }
+
+ return $request->run($this);
+ }
+
+ /**
+ * (SH21) List all carriers (sorted by sortIndex, defined in the BO)
+ *
+ * @return CarrierCollection
+ */
+ public function getShippingCarriers()
+ {
+ return (new GetShippingCarriersRequest())->run($this);
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Front/Domain/BI/DataType.php b/src/Mirakl/MMP/Front/Domain/BI/DataType.php
new file mode 100644
index 0000000..291071f
--- /dev/null
+++ b/src/Mirakl/MMP/Front/Domain/BI/DataType.php
@@ -0,0 +1,7 @@
+errors;
+ }
+
+ /**
+ * @param array $errors
+ * @return $this
+ */
+ public function setErrors(array $errors)
+ {
+ $this->errors = new ShippingFeeErrorCollection($errors);
+
+ return $this;
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Front/Domain/Collection/Shipping/ShippingFeeErrorCollection.php b/src/Mirakl/MMP/Front/Domain/Collection/Shipping/ShippingFeeErrorCollection.php
new file mode 100644
index 0000000..f22bab3
--- /dev/null
+++ b/src/Mirakl/MMP/Front/Domain/Collection/Shipping/ShippingFeeErrorCollection.php
@@ -0,0 +1,20 @@
+offersNotFound;
+ }
+
+ /**
+ * @param array $offersNotFound
+ * @return $this
+ */
+ public function setOffersNotFound(array $offersNotFound)
+ {
+ $this->offersNotFound = $offersNotFound;
+
+ return $this;
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Front/Domain/Collection/Shop/Create/CreateShopCollection.php b/src/Mirakl/MMP/Front/Domain/Collection/Shop/Create/CreateShopCollection.php
new file mode 100644
index 0000000..a3376f2
--- /dev/null
+++ b/src/Mirakl/MMP/Front/Domain/Collection/Shop/Create/CreateShopCollection.php
@@ -0,0 +1,20 @@
+ 'customer/customer_id',
+ 'customer_civility' => 'customer/civility',
+ 'customer_firstname' => 'customer/firstname',
+ 'customer_lastname' => 'customer/lastname',
+ 'customer_email' => 'customer/email',
+ ];
+
+ /**
+ * @var array
+ */
+ protected static $dataTypes = [
+ 'customer' => [MessageCustomer::class, 'create'],
+ ];
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Front/Domain/Offer/State/OfferState.php b/src/Mirakl/MMP/Front/Domain/Offer/State/OfferState.php
new file mode 100644
index 0000000..69a47c1
--- /dev/null
+++ b/src/Mirakl/MMP/Front/Domain/Offer/State/OfferState.php
@@ -0,0 +1,15 @@
+ [OrderCustomer::class, 'create'],
+ 'offers' => [CreateOrderOfferCollection::class, 'create'],
+ 'order_additional_fields' => [AdditionalFieldValueCollection::class, 'create'],
+ 'payment_info' => [CreateOrderPaymentInfo::class, 'create'],
+ ];
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Front/Domain/Order/Create/CreateOrderOffer.php b/src/Mirakl/MMP/Front/Domain/Order/Create/CreateOrderOffer.php
new file mode 100644
index 0000000..2e81ad0
--- /dev/null
+++ b/src/Mirakl/MMP/Front/Domain/Order/Create/CreateOrderOffer.php
@@ -0,0 +1,95 @@
+ 'offer_id',
+ 'price_unit' => 'offer_price',
+ ];
+
+ /**
+ * @var array
+ */
+ protected static $dataTypes = [
+ 'order_line_additional_fields' => [AdditionalFieldValueCollection::class, 'create'],
+ 'shipping_taxes' => [OrderTaxAmountCollection::class, 'create'],
+ 'taxes' => [OrderTaxAmountCollection::class, 'create'],
+ 'price_amount_breakdown' => [AmountBreakdown::class, 'create'],
+ 'shipping_price_amount_breakdown' => [AmountBreakdown::class, 'create'],
+ ];
+
+ /**
+ * @return string
+ */
+ public function getId()
+ {
+ return $this->getOfferId();
+ }
+
+ /**
+ * @param string $id
+ * @return $this
+ */
+ public function setId($id)
+ {
+ return $this->setOfferId($id);
+ }
+
+ /**
+ * @return float
+ */
+ public function getPriceUnit()
+ {
+ return $this->getOfferPrice();
+ }
+
+ /**
+ * @param float $priceUnit
+ * @return $this
+ */
+ public function setPriceUnit($priceUnit)
+ {
+ return $this->setOfferPrice($priceUnit);
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Front/Domain/Order/Create/CreateOrderPaymentInfo.php b/src/Mirakl/MMP/Front/Domain/Order/Create/CreateOrderPaymentInfo.php
new file mode 100644
index 0000000..2d52a06
--- /dev/null
+++ b/src/Mirakl/MMP/Front/Domain/Order/Create/CreateOrderPaymentInfo.php
@@ -0,0 +1,15 @@
+ [OfferNotShippableCollection::class, 'create'],
+ 'orders' => [OrderCollection::class, 'create'],
+ ];
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Front/Domain/Order/Create/OfferNotShippable.php b/src/Mirakl/MMP/Front/Domain/Order/Create/OfferNotShippable.php
new file mode 100644
index 0000000..75f9a2f
--- /dev/null
+++ b/src/Mirakl/MMP/Front/Domain/Order/Create/OfferNotShippable.php
@@ -0,0 +1,22 @@
+ 'id',
+ 'error_code' => 'reason',
+ ];
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Front/Domain/Order/Create/OfferNotShippableReason.php b/src/Mirakl/MMP/Front/Domain/Order/Create/OfferNotShippableReason.php
new file mode 100644
index 0000000..832b718
--- /dev/null
+++ b/src/Mirakl/MMP/Front/Domain/Order/Create/OfferNotShippableReason.php
@@ -0,0 +1,8 @@
+ [AssessmentCollection::class, 'create'],
+ ];
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Front/Domain/Order/Evaluation/CreateOrderEvaluationAssessment.php b/src/Mirakl/MMP/Front/Domain/Order/Evaluation/CreateOrderEvaluationAssessment.php
new file mode 100644
index 0000000..f51b2e0
--- /dev/null
+++ b/src/Mirakl/MMP/Front/Domain/Order/Evaluation/CreateOrderEvaluationAssessment.php
@@ -0,0 +1,32 @@
+setCode($code);
+ $this->setResponse($response);
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public static function create(array $data = [])
+ {
+ return new static($data['code'], $data['response']);
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Front/Domain/Order/Tax/OrderTax.php b/src/Mirakl/MMP/Front/Domain/Order/Tax/OrderTax.php
new file mode 100644
index 0000000..54d1426
--- /dev/null
+++ b/src/Mirakl/MMP/Front/Domain/Order/Tax/OrderTax.php
@@ -0,0 +1,12 @@
+setAmount($amount);
+ $this->setType($type);
+ $this->setName($name);
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public static function create(array $data = [])
+ {
+ return new static($data['amount'], $data['type'], $data['name']);
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Front/Domain/Payment/AbstractCreatePaymentInfo.php b/src/Mirakl/MMP/Front/Domain/Payment/AbstractCreatePaymentInfo.php
new file mode 100644
index 0000000..9a2acd5
--- /dev/null
+++ b/src/Mirakl/MMP/Front/Domain/Payment/AbstractCreatePaymentInfo.php
@@ -0,0 +1,20 @@
+ 'payment_id',
+ ];
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Front/Domain/Payment/TransactionLog.php b/src/Mirakl/MMP/Front/Domain/Payment/TransactionLog.php
new file mode 100644
index 0000000..15692c6
--- /dev/null
+++ b/src/Mirakl/MMP/Front/Domain/Payment/TransactionLog.php
@@ -0,0 +1,9 @@
+ [QuoteRequestCustomer::class, 'create'],
+ 'documents' => [ShopQuoteRequestCreateDocumentCollection::class, 'create'],
+ 'offers' => [QuoteOfferCollection::class, 'create'],
+ 'payment_info' => [CreateQuotePaymentInfo::class, 'create'],
+ ];
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Front/Domain/Quote/Create/QuoteOffer.php b/src/Mirakl/MMP/Front/Domain/Quote/Create/QuoteOffer.php
new file mode 100644
index 0000000..01ecd32
--- /dev/null
+++ b/src/Mirakl/MMP/Front/Domain/Quote/Create/QuoteOffer.php
@@ -0,0 +1,17 @@
+ 'quote_request',
+ ];
+
+ /**
+ * @var array
+ */
+ protected static $dataTypes = [
+ 'quote_request' => [QuoteRequest::class, 'create'],
+ 'quote_request_error' => [QuoteRequestError::class, 'create'],
+ ];
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Front/Domain/Quote/Create/ShopQuoteRequestCreateDocument.php b/src/Mirakl/MMP/Front/Domain/Quote/Create/ShopQuoteRequestCreateDocument.php
new file mode 100644
index 0000000..13239e2
--- /dev/null
+++ b/src/Mirakl/MMP/Front/Domain/Quote/Create/ShopQuoteRequestCreateDocument.php
@@ -0,0 +1,11 @@
+ 'price_summary/price',
+ 'shipping_price' => 'price_summary/shipping_price',
+ 'total_commission' => 'price_summary/total_commission',
+ 'total_price' => 'price_summary/total_price',
+ ];
+
+ /**
+ * @var array
+ */
+ protected static $dataTypes = [
+ 'lines' => [QuoteLineCollection::class, 'create'],
+ 'orders' => [QuoteOrderInformationCollection::class, 'create'],
+ 'price_summary' => [QuotePriceSummary::class, 'create'],
+ ];
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Front/Domain/Quote/Get/QuoteInitialRequest.php b/src/Mirakl/MMP/Front/Domain/Quote/Get/QuoteInitialRequest.php
new file mode 100644
index 0000000..00b9277
--- /dev/null
+++ b/src/Mirakl/MMP/Front/Domain/Quote/Get/QuoteInitialRequest.php
@@ -0,0 +1,29 @@
+ [QuoteRequestDocumentCollection::class, 'create'],
+ 'lines' => [QuoteLineCollection::class, 'create'],
+ ];
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Front/Domain/Quote/Get/QuoteLine.php b/src/Mirakl/MMP/Front/Domain/Quote/Get/QuoteLine.php
new file mode 100644
index 0000000..a2cb083
--- /dev/null
+++ b/src/Mirakl/MMP/Front/Domain/Quote/Get/QuoteLine.php
@@ -0,0 +1,53 @@
+ 'price_summary/price',
+ 'total_commission' => 'price_summary/total_commission',
+ 'total_price' => 'price_summary/total_price',
+ ];
+
+ /**
+ * @var array
+ */
+ protected static $dataTypes = [
+ 'price_summary' => [QuoteLinePriceSummary::class, 'create'],
+ ];
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Front/Domain/Quote/Get/QuoteLinePriceSummary.php b/src/Mirakl/MMP/Front/Domain/Quote/Get/QuoteLinePriceSummary.php
new file mode 100644
index 0000000..565d086
--- /dev/null
+++ b/src/Mirakl/MMP/Front/Domain/Quote/Get/QuoteLinePriceSummary.php
@@ -0,0 +1,15 @@
+ [QuoteRequestCustomer::class, 'create'],
+ 'initial_request' => [QuoteInitialRequest::class, 'create'],
+ 'payment_info' => [CreateQuotePaymentInfo::class, 'create'],
+ 'shop_quote_requests' => [ShopQuoteRequestCollection::class, 'create'],
+ ];
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Front/Domain/Quote/Get/ShopQuoteRequest.php b/src/Mirakl/MMP/Front/Domain/Quote/Get/ShopQuoteRequest.php
new file mode 100644
index 0000000..6eef950
--- /dev/null
+++ b/src/Mirakl/MMP/Front/Domain/Quote/Get/ShopQuoteRequest.php
@@ -0,0 +1,68 @@
+ [QuoteRequestMessageCollection::class, 'create'],
+ 'quotes' => [QuoteCollection::class, 'create'],
+ ];
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Front/Domain/Quote/Message/CreatedQuoteRequestMessage.php b/src/Mirakl/MMP/Front/Domain/Quote/Message/CreatedQuoteRequestMessage.php
new file mode 100644
index 0000000..23e3254
--- /dev/null
+++ b/src/Mirakl/MMP/Front/Domain/Quote/Message/CreatedQuoteRequestMessage.php
@@ -0,0 +1,21 @@
+ [QuoteRequestDocumentCollection::class, 'create'],
+ ];
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Front/Domain/Quote/Message/QuoteRequestDocument.php b/src/Mirakl/MMP/Front/Domain/Quote/Message/QuoteRequestDocument.php
new file mode 100644
index 0000000..09f807b
--- /dev/null
+++ b/src/Mirakl/MMP/Front/Domain/Quote/Message/QuoteRequestDocument.php
@@ -0,0 +1,13 @@
+ [QuoteRequestDocumentCollection::class, 'create'],
+ ];
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Front/Domain/Quote/Order/OrderFromQuote.php b/src/Mirakl/MMP/Front/Domain/Quote/Order/OrderFromQuote.php
new file mode 100644
index 0000000..67a9883
--- /dev/null
+++ b/src/Mirakl/MMP/Front/Domain/Quote/Order/OrderFromQuote.php
@@ -0,0 +1,38 @@
+ [QuoteOrderLineCollection::class, 'create'],
+ 'order_additional_fields' => [AdditionalFieldValueCollection::class, 'create'],
+ 'payment_info' => [CreateOrderPaymentInfo::class, 'create'],
+ ];
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Front/Domain/Quote/Order/QuoteOrderLine.php b/src/Mirakl/MMP/Front/Domain/Quote/Order/QuoteOrderLine.php
new file mode 100644
index 0000000..d71dffc
--- /dev/null
+++ b/src/Mirakl/MMP/Front/Domain/Quote/Order/QuoteOrderLine.php
@@ -0,0 +1,27 @@
+ [AdditionalFieldValueCollection::class, 'create'],
+ ];
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Front/Domain/Shipping/AbstractShippingOffer.php b/src/Mirakl/MMP/Front/Domain/Shipping/AbstractShippingOffer.php
new file mode 100644
index 0000000..7a76297
--- /dev/null
+++ b/src/Mirakl/MMP/Front/Domain/Shipping/AbstractShippingOffer.php
@@ -0,0 +1,61 @@
+ [Discount::class, 'create'],
+ 'offer_additional_fields' => [AdditionalFieldValueCollection::class, 'create'],
+ 'promotions' => [AppliedPromotionCollection::class, 'create'],
+ 'shipping_type_details' => [ShippingTypeDetailCollection::class, 'create'],
+ ];
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Front/Domain/Shipping/AbstractShopShipping.php b/src/Mirakl/MMP/Front/Domain/Shipping/AbstractShopShipping.php
new file mode 100644
index 0000000..24a33bb
--- /dev/null
+++ b/src/Mirakl/MMP/Front/Domain/Shipping/AbstractShopShipping.php
@@ -0,0 +1,27 @@
+ [OrderPromotionsSummary::class, 'create'],
+ ];
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Front/Domain/Shipping/OfferQuantityShippingTypeTuple.php b/src/Mirakl/MMP/Front/Domain/Shipping/OfferQuantityShippingTypeTuple.php
new file mode 100644
index 0000000..dfe6165
--- /dev/null
+++ b/src/Mirakl/MMP/Front/Domain/Shipping/OfferQuantityShippingTypeTuple.php
@@ -0,0 +1,32 @@
+ $this->getOfferId(),
+ 'quantity' => $this->getQuantity(),
+ 'shipping_type_code' => $this->getShippingTypeCode(),
+ 'leadtime_to_ship' => $this->getLeadtimeToShip(),
+ ];
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Front/Domain/Shipping/OrderShippingFee.php b/src/Mirakl/MMP/Front/Domain/Shipping/OrderShippingFee.php
new file mode 100644
index 0000000..af236f9
--- /dev/null
+++ b/src/Mirakl/MMP/Front/Domain/Shipping/OrderShippingFee.php
@@ -0,0 +1,36 @@
+ 'shipping_type/code',
+ 'shipping_type_label' => 'shipping_type/label',
+ ];
+
+ /**
+ * @var array
+ */
+ protected static $dataTypes = [
+ 'shipping_types' => [ShippingFeeTypeCollection::class, 'create'],
+ 'offers' => [ShippingRateOfferCollection::class, 'create'],
+ 'selected_shipping_type' => [ShippingTypeWithConfiguration::class, 'create'],
+ ];
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Front/Domain/Shipping/ShippingFeeError.php b/src/Mirakl/MMP/Front/Domain/Shipping/ShippingFeeError.php
new file mode 100644
index 0000000..02cf0e9
--- /dev/null
+++ b/src/Mirakl/MMP/Front/Domain/Shipping/ShippingFeeError.php
@@ -0,0 +1,15 @@
+ 'discount',
+ 'offer_id' => 'id',
+ 'offer_price' => 'price',
+ 'offer_quantity' => 'quantity',
+ 'selected_shipping_type' => 'shipping_type',
+ 'shipping_types' => 'shipping_type_details'
+ ];
+
+ /**
+ * @var array
+ */
+ protected static $dataTypes = [
+ 'shipping_type' => [ShippingTypeWithConfiguration::class, 'create'],
+ ];
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Front/Domain/Shipping/ShippingFeeType.php b/src/Mirakl/MMP/Front/Domain/Shipping/ShippingFeeType.php
new file mode 100644
index 0000000..dde1e64
--- /dev/null
+++ b/src/Mirakl/MMP/Front/Domain/Shipping/ShippingFeeType.php
@@ -0,0 +1,11 @@
+ 'discount',
+ 'offer_id' => 'id',
+ 'offer_price' => 'price',
+ 'offer_quantity' => 'quantity',
+ ];
+
+ /**
+ * @var array
+ */
+ protected static $dataTypes = [
+ 'discount' => [Discount::class, 'create'],
+ 'order_additional_fields' => [AdditionalFieldValueCollection::class, 'create'],
+ 'promotions' => [AppliedPromotionCollection::class, 'create'],
+ 'shipping_type_details' => [ShippingTypeDetailCollection::class, 'create'],
+ 'allowed_shipping_types' => [ShippingTypeCollection::class, 'create'],
+ 'shipping_taxes' => [OrderTaxEstimationCollection::class, 'create'],
+ 'taxes' => [OrderTaxEstimationCollection::class, 'create'],
+ ];
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Front/Domain/Shipping/ShopShippingFee.php b/src/Mirakl/MMP/Front/Domain/Shipping/ShopShippingFee.php
new file mode 100644
index 0000000..8028e6d
--- /dev/null
+++ b/src/Mirakl/MMP/Front/Domain/Shipping/ShopShippingFee.php
@@ -0,0 +1,39 @@
+ 'available_shipping_types',
+ ];
+
+ /**
+ * @var array
+ */
+ protected static $dataTypes = [
+ 'available_shipping_types' => [ShippingFeeTypeCollection::class, 'create'],
+ 'offers' => [ShippingFeeOfferCollection::class, 'create'],
+ 'selected_shipping_type' => [ShippingTypeWithConfiguration::class, 'create'],
+ ];
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Front/Domain/Shipping/ShopShippingFeeErrorEnum.php b/src/Mirakl/MMP/Front/Domain/Shipping/ShopShippingFeeErrorEnum.php
new file mode 100644
index 0000000..cc5b44c
--- /dev/null
+++ b/src/Mirakl/MMP/Front/Domain/Shipping/ShopShippingFeeErrorEnum.php
@@ -0,0 +1,11 @@
+ [CreateShopExistingUser::class, 'create'],
+ 'new_user' => [CreateShopNewUser::class, 'create'],
+ ];
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Front/Domain/Shop/Create/CreateShopExistingUser.php b/src/Mirakl/MMP/Front/Domain/Shop/Create/CreateShopExistingUser.php
new file mode 100644
index 0000000..94fc50c
--- /dev/null
+++ b/src/Mirakl/MMP/Front/Domain/Shop/Create/CreateShopExistingUser.php
@@ -0,0 +1,32 @@
+setEmail($email);
+ $this->setPassword($password);
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public static function create(array $data = [])
+ {
+ return new static($data['email'], $data['password']);
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Front/Domain/Shop/Create/CreateShopNewUser.php b/src/Mirakl/MMP/Front/Domain/Shop/Create/CreateShopNewUser.php
new file mode 100644
index 0000000..34fa512
--- /dev/null
+++ b/src/Mirakl/MMP/Front/Domain/Shop/Create/CreateShopNewUser.php
@@ -0,0 +1,35 @@
+setEmail($email);
+ $this->setPassword($password);
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public static function create(array $data = [])
+ {
+ return new static($data['email'], $data['password']);
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Front/Request/AdditionalField/GetAdditionalFieldRequest.php b/src/Mirakl/MMP/Front/Request/AdditionalField/GetAdditionalFieldRequest.php
new file mode 100644
index 0000000..36420e9
--- /dev/null
+++ b/src/Mirakl/MMP/Front/Request/AdditionalField/GetAdditionalFieldRequest.php
@@ -0,0 +1,24 @@
+
+ * use Mirakl\MMP\Front\Client\FrontApiClient;
+ * use Mirakl\MMP\Front\Request\AdditionalField\GetAdditionalFieldRequest;
+ * use Mirakl\MMP\Common\Domain\AdditionalField\AdditionalFieldLinkedEntity;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ * $request = new GetAdditionalFieldRequest();
+ * $request->setEntities([AdditionalFieldLinkedEntity::OFFER, AdditionalFieldLinkedEntity::SHOP]); // Optional
+ * $result = $api->getAdditionalFields($request);
+ * // $result => @see \Mirakl\MMP\Common\Domain\Collection\AdditionalFieldCollection
+ *
+ */
+class GetAdditionalFieldRequest extends AbstractGetAdditionalFieldRequest
+{}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Front/Request/BI/ExportBusinessIntelligenceRequest.php b/src/Mirakl/MMP/Front/Request/BI/ExportBusinessIntelligenceRequest.php
new file mode 100644
index 0000000..bd9df5f
--- /dev/null
+++ b/src/Mirakl/MMP/Front/Request/BI/ExportBusinessIntelligenceRequest.php
@@ -0,0 +1,62 @@
+
+ * use Mirakl\MMP\Front\Client\FrontApiClient;
+ * use Mirakl\MMP\Front\Request\BI\ExportBusinessIntelligenceRequest;
+ * use Mirakl\MMP\Front\Domain\BI\ExportFileType;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ * $request = new ExportBusinessIntelligenceRequest();
+ * $request->setFileType(ExportFileType::XML); // Optional, default is CSV
+ * $result = $api->exportDataForBI($request);
+ * // $result => @see \Mirakl\Core\Domain\FileWrapper
+ * // Download file:
+ * $result->download();
+ *
+ */
+class ExportBusinessIntelligenceRequest extends AbstractRequest
+{
+ use ZipResponseDecorator;
+
+ /**
+ * @var string
+ */
+ protected $endpoint = '/bi';
+
+ /**
+ * @var array
+ */
+ public $queryParams = ['data_type', 'file_type'];
+
+ /**
+ * @var bool
+ */
+ protected $json = false;
+
+ /**
+ * @param string $dataType
+ * @param string $fileType
+ */
+ public function __construct($dataType = DataType::ORDER_LINE, $fileType = ExportFileType::CSV)
+ {
+ parent::__construct();
+ $this->setDataType($dataType);
+ $this->setFileType($fileType);
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Front/Request/Document/GetDocumentsConfigurationRequest.php b/src/Mirakl/MMP/Front/Request/Document/GetDocumentsConfigurationRequest.php
new file mode 100644
index 0000000..dee0f13
--- /dev/null
+++ b/src/Mirakl/MMP/Front/Request/Document/GetDocumentsConfigurationRequest.php
@@ -0,0 +1,24 @@
+
+ * use Mirakl\MMP\Front\Client\FrontApiClient;
+ * use Mirakl\MMP\Front\Request\Document\GetDocumentsConfigurationRequest;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ * $request = new GetDocumentsConfigurationRequest();
+ * $request->setEntities(['ORDER', 'SHOP']);
+ *
+ * $result = $api->getDocumentsConfiguration($request);
+ * // $result => @see \Mirakl\MMP\Common\Domain\Collection\Document\DocumentsConfigurationCollection
+ *
+ */
+class GetDocumentsConfigurationRequest extends AbstractGetDocumentsConfigurationRequest
+{}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Front/Request/Message/AbstractFrontGetMessagesRequest.php b/src/Mirakl/MMP/Front/Request/Message/AbstractFrontGetMessagesRequest.php
new file mode 100644
index 0000000..6e9ce8d
--- /dev/null
+++ b/src/Mirakl/MMP/Front/Request/Message/AbstractFrontGetMessagesRequest.php
@@ -0,0 +1,14 @@
+
+ * use Mirakl\MMP\Front\Client\FrontApiClient;
+ * use Mirakl\MMP\Front\Request\Message\GetThreadDetailsRequest;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ * $request = new GetThreadDetailsRequest('THREAD_ID');
+ * $request->setCustomerId('CUSTOMER_ID');
+ * $result = $api->getThreadDetails($request);
+ * // $result => @see \Mirakl\MMP\Common\Domain\Message\Thread\ThreadDetails
+ *
+ */
+class GetThreadDetailsRequest extends AbstractGetThreadDetailsRequest
+{
+ /**
+ * @var array
+ */
+ public $queryParams = [
+ 'customer_id' => 'customer_id',
+ ];
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Front/Request/Message/GetThreadsRequest.php b/src/Mirakl/MMP/Front/Request/Message/GetThreadsRequest.php
new file mode 100644
index 0000000..27e3a9e
--- /dev/null
+++ b/src/Mirakl/MMP/Front/Request/Message/GetThreadsRequest.php
@@ -0,0 +1,37 @@
+
+ * use Mirakl\MMP\Front\Client\FrontApiClient;
+ * use Mirakl\MMP\Front\Request\Message\GetThreadsRequest;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ * $request = new GetThreadsRequest();
+ * $request->setCustomerId('CUSTOMER_ID');
+ * $request->setEntityType('MMP_ORDER');
+ * $request->setEntityId('ORDER_ID');
+ * $result = $api->getThreads($request);
+ * // $result => @see \Mirakl\Core\Response\Decorator\SeekableCollection
+ *
+ */
+class GetThreadsRequest extends AbstractGetThreadsRequest
+{
+ /**
+ * @var array
+ */
+ public $queryParams = [
+ 'entity_type',
+ 'entity_id',
+ 'customer_id',
+ ];
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Front/Request/Offer/GetOfferRequest.php b/src/Mirakl/MMP/Front/Request/Offer/GetOfferRequest.php
new file mode 100644
index 0000000..ea3b883
--- /dev/null
+++ b/src/Mirakl/MMP/Front/Request/Offer/GetOfferRequest.php
@@ -0,0 +1,31 @@
+
+ * use Mirakl\MMP\Front\Client\FrontApiClient;
+ * use Mirakl\MMP\Front\Request\Offer\GetOfferRequest;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ * $request = new GetOfferRequest('OFFER_ID');
+ * $result = $api->getOffer($request);
+ * // $result => @see \Mirakl\MMP\FrontOperator\Domain\Offer
+ *
+ */
+class GetOfferRequest extends AbstractGetOfferRequest
+{
+ /**
+ * @inheritdoc
+ */
+ public function getResponseDecorator()
+ {
+ return Offer::decorator();
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Front/Request/Offer/Message/CreateOfferMessageRequest.php b/src/Mirakl/MMP/Front/Request/Offer/Message/CreateOfferMessageRequest.php
new file mode 100644
index 0000000..feabb78
--- /dev/null
+++ b/src/Mirakl/MMP/Front/Request/Offer/Message/CreateOfferMessageRequest.php
@@ -0,0 +1,88 @@
+
+ * use Mirakl\MMP\Front\Client\FrontApiClient;
+ * use Mirakl\MMP\Front\Request\Offer\Message\CreateOfferMessageRequest;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ * $request = new CreateOfferMessageRequest('OFFER_ID');
+ * $request->setMessage([
+ * 'subject' => 'Color question',
+ * 'body' => 'What is the color of the product?',
+ * 'visible' => true,
+ * 'customer' => [
+ * 'id' => '304024KD',
+ * 'civility' => 'Mr',
+ * 'firstname' => 'Nelson',
+ * 'lastname' => 'Deauberd',
+ * ],
+ * ]);
+ * $result = $api->createOfferMessage($request);
+ * // $result => @see \Mirakl\MMP\Common\Domain\Message\MessageCreated
+ *
+ */
+class CreateOfferMessageRequest extends AbstractOfferRequest
+{
+ /**
+ * @var string
+ */
+ protected $method = 'POST';
+
+ /**
+ * @var string
+ */
+ protected $endpoint = '/offers/{offer}/messages';
+
+ /**
+ * @var array
+ */
+ public $bodyParams = ['message'];
+
+ /**
+ * @var array
+ */
+ protected static $dataTypes = [
+ 'message' => [CreateOfferMessage::class, 'create'],
+ ];
+
+ /**
+ * @param string $offerId
+ * @param array|CreateOfferMessage $message
+ */
+ public function __construct($offerId, $message)
+ {
+ parent::__construct($offerId);
+ $this->setMessage($message);
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function getResponseDecorator()
+ {
+ return MessageCreated::decorator();
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function getBodyParams()
+ {
+ return $this->getMessage()->unwrap();
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Front/Request/Offer/Message/GetOfferMessagesRequest.php b/src/Mirakl/MMP/Front/Request/Offer/Message/GetOfferMessagesRequest.php
new file mode 100644
index 0000000..f83c8b5
--- /dev/null
+++ b/src/Mirakl/MMP/Front/Request/Offer/Message/GetOfferMessagesRequest.php
@@ -0,0 +1,44 @@
+
+ * use Mirakl\MMP\Front\Client\FrontApiClient;
+ * use Mirakl\MMP\Front\Request\Offer\Message\GetOfferMessagesRequest;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ * $request = new GetOfferMessagesRequest('OFFER_ID');
+ * $result = $api->getOfferMessages($request);
+ * // $result => @see \Mirakl\MMP\Common\Domain\Collection\Message\OfferMessageCollection
+ *
+ */
+class GetOfferMessagesRequest extends AbstractFrontGetMessagesRequest
+{
+ /**
+ * @param string $offerId
+ */
+ public function __construct($offerId)
+ {
+ parent::__construct();
+ $this->setOfferId($offerId);
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function getResponseDecorator()
+ {
+ return OfferMessageCollection::decorator('messages');
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Front/Request/Offer/State/GetOfferStateListRequest.php b/src/Mirakl/MMP/Front/Request/Offer/State/GetOfferStateListRequest.php
new file mode 100644
index 0000000..b8add38
--- /dev/null
+++ b/src/Mirakl/MMP/Front/Request/Offer/State/GetOfferStateListRequest.php
@@ -0,0 +1,51 @@
+
+ * use Mirakl\MMP\Front\Client\FrontApiClient;
+ * use Mirakl\MMP\Front\Request\Offer\State\GetOfferStateListRequest;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ * $request = new GetOfferStateListRequest();
+ * $request->setActive(true);
+ * $result = $api->getOfferStateList($request);
+ * // $result => @see \Mirakl\MMP\Front\Domain\Collection\Offer\State\OfferStateCollection
+ *
+ */
+class GetOfferStateListRequest extends AbstractRequest
+{
+ use LocalizableTrait;
+
+ /**
+ * @var string
+ */
+ protected $endpoint = '/offers/states';
+
+ /**
+ * @inheritdoc
+ */
+ public function getResponseDecorator()
+ {
+ return OfferStateCollection::decorator('offer_states');
+ }
+
+ /**
+ * @var array
+ */
+ public $queryParams = ['active'];
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Front/Request/Offer/State/GetOfferStatesRequest.php b/src/Mirakl/MMP/Front/Request/Offer/State/GetOfferStatesRequest.php
new file mode 100644
index 0000000..c879db3
--- /dev/null
+++ b/src/Mirakl/MMP/Front/Request/Offer/State/GetOfferStatesRequest.php
@@ -0,0 +1,25 @@
+
+ * use Mirakl\MMP\Front\Client\FrontApiClient;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ * $result = $api->getOfferStates();
+ * // $result => @see \Mirakl\MMP\Front\Domain\Collection\Offer\State\OfferStateCollection
+ *
+ *
+ * @deprecated Class deprecated since 1.6.0
+ * @see \Mirakl\MMP\Front\Request\Offer\State\GetOfferStateListRequest
+ */
+class GetOfferStatesRequest extends AbstractGetOfferStatesRequest
+{}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Front/Request/Order/Accept/AcceptOrderRequest.php b/src/Mirakl/MMP/Front/Request/Order/Accept/AcceptOrderRequest.php
new file mode 100644
index 0000000..fa93403
--- /dev/null
+++ b/src/Mirakl/MMP/Front/Request/Order/Accept/AcceptOrderRequest.php
@@ -0,0 +1,24 @@
+
+ * use Mirakl\MMP\Front\Client\FrontApiClient;
+ * use Mirakl\MMP\Front\Request\Order\Accept\AcceptOrderRequest;
+ * use Mirakl\MMP\Common\Domain\Order\Accept\AcceptOrderLine;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ * $request = new AcceptOrderRequest('ORDER_ID', [
+ * new AcceptOrderLine(['id' => 'ORDER_LINE_ID', 'accepted' => true])
+ * ]);
+ * $api->acceptOrder($request);
+ *
+ */
+class AcceptOrderRequest extends AbstractAcceptOrderRequest
+{}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Front/Request/Order/Document/DownloadOrdersDocumentsRequest.php b/src/Mirakl/MMP/Front/Request/Order/Document/DownloadOrdersDocumentsRequest.php
new file mode 100644
index 0000000..70411ae
--- /dev/null
+++ b/src/Mirakl/MMP/Front/Request/Order/Document/DownloadOrdersDocumentsRequest.php
@@ -0,0 +1,54 @@
+
+ *
When documents are retrieved, they're wrapped into a ZIP archive except + * when only one document id is specified. The tree structure of this archive is as follow: + *
+ * documents-timestamp.zip + * | + * |__ order_id_x/ + * | |__ foo.txt + * | |__ bar.txt + * | |__ baz.pdf + * | + * |__ order_id_y/ + * | |__ image.png + * | |__ image(1).png + *+ * + * + * Example: + * + *
+ * use Mirakl\MMP\Front\Client\FrontApiClient;
+ * use Mirakl\MMP\Front\Request\Order\Document\DownloadOrdersDocumentsRequest;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ * $request = new DownloadOrdersDocumentsRequest();
+ * $request->setOrderIds(['ORDER_ID_1', 'ORDER_ID_2']);
+ * $result = $api->downloadOrdersDocuments($request);
+ * // $result => @see \Mirakl\Core\Domain\FileWrapper
+ * // Download file:
+ * $result->download();
+ *
+ */
+class DownloadOrdersDocumentsRequest extends AbstractDownloadOrdersDocumentsRequest
+{}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Front/Request/Order/Document/GetOrderDocumentsRequest.php b/src/Mirakl/MMP/Front/Request/Order/Document/GetOrderDocumentsRequest.php
new file mode 100644
index 0000000..4546894
--- /dev/null
+++ b/src/Mirakl/MMP/Front/Request/Order/Document/GetOrderDocumentsRequest.php
@@ -0,0 +1,23 @@
+
+ * use Mirakl\MMP\Front\Client\FrontApiClient;
+ * use Mirakl\MMP\Front\Request\Order\Document\GetOrderDocumentsRequest;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ * $request = new GetOrderDocumentsRequest();
+ * $request->setOrderIds(['ORDER_ID_1', 'ORDER_ID_2']);
+ * $result = $api->getOrderDocuments($request);
+ * // $result => @see \Mirakl\MMP\Common\Domain\Collection\Order\Document\OrderDocumentCollection
+ *
+ */
+class GetOrderDocumentsRequest extends AbstractGetOrderDocumentsRequest
+{}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Front/Request/Order/Document/UploadOrdersDocumentsRequest.php b/src/Mirakl/MMP/Front/Request/Order/Document/UploadOrdersDocumentsRequest.php
new file mode 100644
index 0000000..6f67431
--- /dev/null
+++ b/src/Mirakl/MMP/Front/Request/Order/Document/UploadOrdersDocumentsRequest.php
@@ -0,0 +1,31 @@
+
+ * use Mirakl\Core\Domain\Collection\DocumentCollection;
+ * use Mirakl\Core\Domain\Document;
+ * use Mirakl\MMP\Front\Client\FrontApiClient;
+ * use Mirakl\MMP\Front\Request\Order\Document\UploadOrdersDocumentsRequest;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ * $file = new \SplFileObject('/path/to/invoice.pdf');
+ * $docs = new DocumentCollection();
+ * $docs->add(new Document($file, 'invoice.pdf', 'CUSTOMER_INVOICE'));
+ * $request = new UploadOrdersDocumentsRequest($docs, 'ORDER_ID');
+ * $result = $api->uploadOrderDocuments($request);
+ * // $result => @see \Mirakl\MMP\Common\Domain\Order\Document\OrderDocumentsUploadResult
+ *
+ */
+class UploadOrdersDocumentsRequest extends AbstractUploadOrdersDocumentsRequest
+{}
diff --git a/src/Mirakl/MMP/Front/Request/Order/Evaluation/CreateOrderEvaluationRequest.php b/src/Mirakl/MMP/Front/Request/Order/Evaluation/CreateOrderEvaluationRequest.php
new file mode 100644
index 0000000..603729f
--- /dev/null
+++ b/src/Mirakl/MMP/Front/Request/Order/Evaluation/CreateOrderEvaluationRequest.php
@@ -0,0 +1,73 @@
+
+ * use Mirakl\MMP\Front\Client\FrontApiClient;
+ * use Mirakl\MMP\Front\Request\Order\Evaluation\CreateOrderEvaluationRequest;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ * $request = new CreateOrderEvaluationRequest('ORDER_ID', [
+ * 'comment' => 'Great service',
+ * 'grade' => 4,
+ * 'visible' => true,
+ * 'assessments' => [
+ * 'code' => '999',
+ * 'response' => 4,
+ * ],
+ * ]);
+ * $api->createOrderEvaluation($request);
+ *
+ */
+class CreateOrderEvaluationRequest extends AbstractOrderRequest
+{
+ /**
+ * @var string
+ */
+ protected $method = 'POST';
+
+ /**
+ * @var string
+ */
+ protected $endpoint = '/orders/{order}/evaluation';
+
+ /**
+ * @var array
+ */
+ public $bodyParams = ['evaluation'];
+
+ /**
+ * @var array
+ */
+ protected static $dataTypes = [
+ 'evaluation' => [CreateOrderEvaluation::class, 'create'],
+ ];
+
+ /**
+ * @param string $orderId
+ * @param array|CreateOrderEvaluation $evaluation
+ */
+ public function __construct($orderId, $evaluation)
+ {
+ parent::__construct($orderId);
+ $this->setEvaluation($evaluation);
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function getBodyParams()
+ {
+ return $this->getEvaluation()->toArray();
+ }
+}
diff --git a/src/Mirakl/MMP/Front/Request/Order/Evaluation/GetOrderEvaluationRequest.php b/src/Mirakl/MMP/Front/Request/Order/Evaluation/GetOrderEvaluationRequest.php
new file mode 100644
index 0000000..2170dc1
--- /dev/null
+++ b/src/Mirakl/MMP/Front/Request/Order/Evaluation/GetOrderEvaluationRequest.php
@@ -0,0 +1,22 @@
+
+ * use Mirakl\MMP\Front\Client\FrontApiClient;
+ * use Mirakl\MMP\Front\Request\Order\Evaluation\GetOrderEvaluationRequest;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ * $request = new GetOrderEvaluationRequest('ORDER_ID');
+ * $result = $api->getOrderEvaluation($request);
+ * // $result => @see \Mirakl\MMP\Common\Domain\Evaluation
+ *
+ */
+class GetOrderEvaluationRequest extends AbstractGetOrderEvaluationRequest
+{}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Front/Request/Order/Message/CreateOrderMessageRequest.php b/src/Mirakl/MMP/Front/Request/Order/Message/CreateOrderMessageRequest.php
new file mode 100644
index 0000000..8997adc
--- /dev/null
+++ b/src/Mirakl/MMP/Front/Request/Order/Message/CreateOrderMessageRequest.php
@@ -0,0 +1,33 @@
+
+ * use Mirakl\MMP\Front\Client\FrontApiClient;
+ * use Mirakl\MMP\Front\Request\Order\Message\CreateOrderMessageRequest;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ * $request = new CreateOrderMessageRequest('ORDER_ID', [
+ * 'subject' => 'Hey!',
+ * 'body' => 'I'm happy with the delivery!',
+ * 'customer_id' => 'DSIFEZK',
+ * 'customer_email' => 'foo@bar.com',
+ * 'customer_firstname' => 'Hap',
+ * 'customer_lastname' => 'Py',
+ * 'customer_locale' => 'fr_FR',
+ * 'to_shop' => true,
+ * 'to_customer' => false,
+ * 'to_operator' => true,
+ * ]);
+ * $result = $api->createOrderMessage($request);
+ * // $result => @see \Mirakl\MMP\Common\Domain\Message\MessageCreated
+ *
+ */
+class CreateOrderMessageRequest extends AbstractCreateOrderMessageRequest
+{}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Front/Request/Order/Message/GetOrderMessagesRequest.php b/src/Mirakl/MMP/Front/Request/Order/Message/GetOrderMessagesRequest.php
new file mode 100644
index 0000000..8ff65ea
--- /dev/null
+++ b/src/Mirakl/MMP/Front/Request/Order/Message/GetOrderMessagesRequest.php
@@ -0,0 +1,25 @@
+
+ * use Mirakl\MMP\Front\Client\FrontApiClient;
+ * use Mirakl\MMP\Front\Request\Order\Message\GetOrderMessagesRequest;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ * $request = new CreateOrderMessageRequest('ORDER_ID');
+ * $request->setReceived(false); // Optional (true: received by customer, false: sent to customer, null (default): both)
+ * $result = $api->getOrderMessages($request);
+ * // $result => @see \Mirakl\MMP\Common\Domain\Collection\Message\OrderMessageCollection
+ *
+ */
+class GetOrderMessagesRequest extends AbstractGetOrderMessagesRequest
+{}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Front/Request/Order/Ship/ShipOrderRequest.php b/src/Mirakl/MMP/Front/Request/Order/Ship/ShipOrderRequest.php
new file mode 100644
index 0000000..871a4f7
--- /dev/null
+++ b/src/Mirakl/MMP/Front/Request/Order/Ship/ShipOrderRequest.php
@@ -0,0 +1,21 @@
+
+ * use Mirakl\MMP\Front\Client\FrontApiClient;
+ * use Mirakl\MMP\Front\Request\Order\Ship\ShipOrderRequest;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ * $request = new ShipOrderRequest('ORDER_ID');
+ * $api->shipOrder($request);
+ *
+ */
+class ShipOrderRequest extends AbstractShipOrderRequest
+{}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Front/Request/Order/Tax/GetOrderTaxesRequest.php b/src/Mirakl/MMP/Front/Request/Order/Tax/GetOrderTaxesRequest.php
new file mode 100644
index 0000000..ce65d44
--- /dev/null
+++ b/src/Mirakl/MMP/Front/Request/Order/Tax/GetOrderTaxesRequest.php
@@ -0,0 +1,31 @@
+
+ * use Mirakl\MMP\Front\Client\FrontApiClient;
+ * use Mirakl\MMP\Front\Request\Order\Tax\GetOrderTaxesRequest;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ * $request = new GetOrderTaxesRequest();
+ * $result = $api->getOrderTaxes($request);
+ * // $result => @see \Mirakl\MMP\Front\Domain\Collection\Order\Tax\OrderTaxCollection
+ *
+ */
+class GetOrderTaxesRequest extends AbstractGetOrderTaxesRequest
+{
+ /**
+ * @inheritdoc
+ */
+ public function getResponseDecorator()
+ {
+ return OrderTaxCollection::decorator('taxes');
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Front/Request/Order/Tracking/UpdateOrderTrackingInfoRequest.php b/src/Mirakl/MMP/Front/Request/Order/Tracking/UpdateOrderTrackingInfoRequest.php
new file mode 100644
index 0000000..0241a73
--- /dev/null
+++ b/src/Mirakl/MMP/Front/Request/Order/Tracking/UpdateOrderTrackingInfoRequest.php
@@ -0,0 +1,26 @@
+
+ * use Mirakl\MMP\Front\Client\FrontApiClient;
+ * use Mirakl\MMP\Front\Request\Order\Tax\UpdateOrderTrackingInfoRequest;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ * $request = new UpdateOrderTrackingInfoRequest('ORDER_ID', [
+ * 'carrier_code' => 'FEDEX',
+ * 'carrier_name' => 'FedEx',
+ * 'carrier_url' => 'https://fex.ex?n=JFSKFJSDKF0923949',
+ * 'tracking_number' => 'JFSKFJSDKF0923949',
+ * ]);
+ * $api->updateOrderTrackingInfo($request);
+ *
+ */
+class UpdateOrderTrackingInfoRequest extends AbstractUpdateOrderTrackingInfoRequest
+{}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Front/Request/Order/Workflow/CreateOrderRequest.php b/src/Mirakl/MMP/Front/Request/Order/Workflow/CreateOrderRequest.php
new file mode 100644
index 0000000..52efdf5
--- /dev/null
+++ b/src/Mirakl/MMP/Front/Request/Order/Workflow/CreateOrderRequest.php
@@ -0,0 +1,137 @@
+
+ * use Mirakl\MMP\Front\Client\FrontApiClient;
+ * use Mirakl\MMP\Front\Request\Order\Workflow\CreateOrderRequest;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ * $request = new CreateOrderRequest('ORDER_ID', [
+ * 'commercial_id' => 'MMP-O-3366329727',
+ * 'customer' => [
+ * 'civility' => 'Dr.',
+ * 'firstname' => 'Dionisi',
+ * 'lastname' => 'Nelson',
+ * 'billing_address' => [
+ * 'civility' => 'Dr.',
+ * 'firstname' => 'Nelson',
+ * 'lastname' => 'Dionisi',
+ * 'zip_code' => '75116',
+ * 'city' => 'Paris',
+ * 'country' => 'France',
+ * 'country_iso_code' => 'USA',
+ * 'company' => 'Mirakl',
+ * 'state' => 'IDF',
+ * 'phone' => '0619874662',
+ * 'phone_secondary' => '0123456789',
+ * 'street_1' => '10-12 rue de l\'Amiral Hamelin',
+ * 'street_2' => 'Escalier A',
+ * ],
+ * 'email' => 'change-me+ndionisi@mirakl.com',
+ * 'shipping_address' => [
+ * 'civility' => 'Dr.',
+ * 'firstname' => 'Nelson',
+ * 'lastname' => 'Dionisi',
+ * 'zip_code' => '75116',
+ * 'city' => 'Paris',
+ * 'country' => 'France',
+ * 'country_iso_code' => 'ITA',
+ * 'company' => 'Mirakl',
+ * 'state' => 'IDF',
+ * 'phone' => '0619874662',
+ * 'phone_secondary' => '0123456789',
+ * 'additional_info' => 'Code : 38JD31',
+ * 'internal_additional_info' => '1ier étage',
+ * 'street_1' => '10-12 rue de l\'Amiral Hamelin',
+ * 'street_2' => 'Escalier A',
+ * ],
+ * 'customer_id' => '34053485',
+ * ],
+ * 'offers' => [
+ * [
+ * 'quantity' => 2,
+ * 'price' => 240.00,
+ * 'shipping_price' => 15.00,
+ * 'shipping_type_code' => 'STD',
+ * 'order_line_id' => 'MMP-OL-3366329727',
+ * 'order_line_additional_fields' => ['code' => 'custom-message', 'value' => 'For Mommy']],
+ * 'offer_id' => '2000',
+ * 'offer_price' => 120.00,
+ * 'taxes' => [['amount' => 5.00, 'code' => 'TAX1']],
+ * 'shipping_taxes' => [['amount' => 1.00, 'code' => 'TAX2']],
+ * ]
+ * ],
+ * 'payment_info' => {
+ * 'payment_type' => 'Credit Card',
+ * 'imprint_number' => 'xxxxx-xxx-x-x-xxxxx'
+ * },
+ * 'scored' => true,
+ * 'shipping_zone_code' => 'FR',
+ * ]);
+ * $result = $api->createOrder($request);
+ * // $result => @see \Mirakl\MMP\Front\Domain\Order\Create\CreatedOrders
+ *
+ */
+class CreateOrderRequest extends AbstractRequest
+{
+ /**
+ * @var string
+ */
+ protected $method = 'POST';
+
+ /**
+ * @var string
+ */
+ protected $endpoint = '/orders';
+
+ /**
+ * @var array
+ */
+ public $bodyParams = ['create_order'];
+
+ /**
+ * @var array
+ */
+ protected static $dataTypes = [
+ 'create_order' => [CreateOrder::class, 'create'],
+ ];
+
+ /**
+ * @param mixed $order
+ */
+ public function __construct($order)
+ {
+ parent::__construct();
+ $this->setCreateOrder($order);
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function getResponseDecorator()
+ {
+ return CreatedOrders::decorator();
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function getBodyParams()
+ {
+ return $this->getCreateOrder()->toArray();
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Front/Request/Order/Workflow/InvalidateOrderRequest.php b/src/Mirakl/MMP/Front/Request/Order/Workflow/InvalidateOrderRequest.php
new file mode 100644
index 0000000..906923b
--- /dev/null
+++ b/src/Mirakl/MMP/Front/Request/Order/Workflow/InvalidateOrderRequest.php
@@ -0,0 +1,52 @@
+
+ * use Mirakl\MMP\Front\Client\FrontApiClient;
+ * use Mirakl\MMP\Front\Request\Order\Workflow\InvalidateOrderRequest;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ * $request = new InvalidateOrderRequest('COMMERCIAL_ID');
+ * $api->invalidateOrder($request);
+ *
+ */
+class InvalidateOrderRequest extends AbstractRequest
+{
+ /**
+ * @var string
+ */
+ protected $method = 'PUT';
+
+ /**
+ * @var string
+ */
+ protected $endpoint = '/orders/invalid/{commercial_id}';
+
+ /**
+ * @var array
+ */
+ protected $uriVars = [
+ '{commercial_id}' => 'commercial_id'
+ ];
+
+ /**
+ * @param string $commercialId
+ */
+ public function __construct($commercialId)
+ {
+ parent::__construct();
+ $this->setCommercialId($commercialId);
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Front/Request/Order/Workflow/ValidateOrderRequest.php b/src/Mirakl/MMP/Front/Request/Order/Workflow/ValidateOrderRequest.php
new file mode 100644
index 0000000..0001fd7
--- /dev/null
+++ b/src/Mirakl/MMP/Front/Request/Order/Workflow/ValidateOrderRequest.php
@@ -0,0 +1,52 @@
+
+ * use Mirakl\MMP\Front\Client\FrontApiClient;
+ * use Mirakl\MMP\Front\Request\Order\Workflow\ValidateOrderRequest;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ * $request = new ValidateOrderRequest('COMMERCIAL_ID');
+ * $api->validateOrder($request);
+ *
+ */
+class ValidateOrderRequest extends AbstractRequest
+{
+ /**
+ * @var string
+ */
+ protected $method = 'PUT';
+
+ /**
+ * @var string
+ */
+ protected $endpoint = '/orders/valid/{commercial_id}';
+
+ /**
+ * @var array
+ */
+ protected $uriVars = [
+ '{commercial_id}' => 'commercial_id'
+ ];
+
+ /**
+ * @param string $commercialId
+ */
+ public function __construct($commercialId)
+ {
+ parent::__construct();
+ $this->setCommercialId($commercialId);
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Front/Request/Payment/GetTransactionLogsRequest.php b/src/Mirakl/MMP/Front/Request/Payment/GetTransactionLogsRequest.php
new file mode 100644
index 0000000..5eb056d
--- /dev/null
+++ b/src/Mirakl/MMP/Front/Request/Payment/GetTransactionLogsRequest.php
@@ -0,0 +1,9 @@
+
+ * use Mirakl\MMP\Front\Client\FrontApiClient;
+ * use Mirakl\MMP\Front\Request\Product\GetProductsRequest;
+ * use Mirakl\MMP\Common\Domain\Product\Offer\ProductReference;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ * $request = new GetProductsRequest([new ProductReference('EAN', '0882780560413')]);
+ * $result = $api->getProducts($request);
+ * // $result => @see \Mirakl\MMP\FrontOperator\Domain\Collection\Product\ProductCollection
+ *
+ */
+class GetProductsRequest extends AbstractGetProductsRequest
+{
+ /**
+ * @inheritdoc
+ */
+ public function getResponseDecorator()
+ {
+ return ProductCollection::decorator('products');
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Front/Request/Quote/CreateQuoteRequestsRequest.php b/src/Mirakl/MMP/Front/Request/Quote/CreateQuoteRequestsRequest.php
new file mode 100644
index 0000000..046d538
--- /dev/null
+++ b/src/Mirakl/MMP/Front/Request/Quote/CreateQuoteRequestsRequest.php
@@ -0,0 +1,94 @@
+
+ * use Mirakl\Core\Domain\FileWrapper;
+ * use Mirakl\MMP\Front\Client\FrontApiClient;
+ * use Mirakl\MMP\Front\Domain\Quote\Create\CreateQuoteRequest;
+ * use Mirakl\MMP\Front\Request\Quote\CreateQuoteRequestsRequest;
+ *
+ * // Initialize API client
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ *
+ * // Create a quote request according to class:
+ * @see \Mirakl\MMP\Front\Domain\Quote\Create\CreateQuoteRequest
+ * $quoteRequest1 = new CreateQuoteRequest();
+ * $quoteRequest1->setData(...); // Custom quote request data
+ *
+ * $quoteRequests = [$quoteRequest1];
+ *
+ * // Create API request
+ * $request = new CreateQuoteRequestsRequest($quoteRequests);
+ *
+ * // Add file of quote request #1
+ * $file = new FileWrapper(new \SplFileObject('foobar.txt'));
+ * $file->setFileName('test1.txt'); // Optional, only needed if file name in $quoteRequest1 is different than 'foobar.txt'
+ * $request->addFile($file);
+ *
+ * $result = $api->createQuoteRequests($request);
+ * // $result => @see \Mirakl\MMP\Front\Domain\Collection\Quote\Create\QuoteRequestReturnCollection
+ *
+ *
+ * @method CreateQuoteRequestCollection getCreateQuoteRequests()
+ * @method $this setCreateQuoteRequests(array|CreateQuoteRequestCollection $quoteRequests)
+ */
+class CreateQuoteRequestsRequest extends AbstractFilesUploadRequest
+{
+ use LocalizableTrait;
+
+ /**
+ * @var string
+ */
+ protected $endpoint = '/quote_request';
+
+ /**
+ * @var array
+ */
+ public $bodyParams = ['create_quote_requests' => 'quote_requests'];
+
+ /**
+ * @var array
+ */
+ protected static $dataTypes = [
+ 'create_quote_requests' => [CreateQuoteRequestCollection::class, 'create'],
+ ];
+
+ /**
+ * @param CreateQuoteRequestCollection|array $createQuoteRequests
+ */
+ public function __construct($createQuoteRequests)
+ {
+ parent::__construct();
+ $this->setCreateQuoteRequests($createQuoteRequests);
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function getBodyParams()
+ {
+ $params = parent::getBodyParams();
+
+ $params['quote_requests'] = ['quote_requests' => $this->getCreateQuoteRequests()->toArray()];
+
+ return $params;
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function getResponseDecorator()
+ {
+ return QuoteRequestReturnCollection::decorator('quote_request_returns');
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Front/Request/Quote/GetQuoteRequestsRequest.php b/src/Mirakl/MMP/Front/Request/Quote/GetQuoteRequestsRequest.php
new file mode 100644
index 0000000..66dbc6e
--- /dev/null
+++ b/src/Mirakl/MMP/Front/Request/Quote/GetQuoteRequestsRequest.php
@@ -0,0 +1,61 @@
+
+ * use Mirakl\MMP\Front\Client\FrontApiClient;
+ * use Mirakl\MMP\Front\Request\Quote\GetQuoteRequestsRequest;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ *
+ * $request = new GetQuoteRequestsRequest();
+ *
+ * $result = $api->getQuoteRequests($request);
+ * // $result => @see \Mirakl\MMP\Front\Domain\Collection\Quote\Get\QuoteRequestCollection
+ *
+ *
+ */
+class GetQuoteRequestsRequest extends AbstractRequest
+{
+ use LocalizableTrait;
+
+ /**
+ * @var string
+ */
+ protected $endpoint = '/quote_request';
+
+ /**
+ * @var array
+ */
+ public $queryParams = [
+ 'customer_ids',
+ 'shop_ids',
+ 'shop_quote_request_id',
+ 'states'
+ ];
+
+ /**
+ * @inheritdoc
+ */
+ public function getResponseDecorator()
+ {
+ return QuoteRequestCollection::decorator('quote_requests');
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Front/Request/Quote/Message/QuoteRequestMessageDocumentsRequest.php b/src/Mirakl/MMP/Front/Request/Quote/Message/QuoteRequestMessageDocumentsRequest.php
new file mode 100644
index 0000000..dfe05f7
--- /dev/null
+++ b/src/Mirakl/MMP/Front/Request/Quote/Message/QuoteRequestMessageDocumentsRequest.php
@@ -0,0 +1,59 @@
+
+ * use Mirakl\MMP\Front\Client\FrontApiClient;
+ * use Mirakl\MMP\Front\Request\Quote\Message\QuoteRequestMessageDocumentsRequest;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ * $request = new QuoteRequestMessageDocumentsRequest('QuoteRequestMessageId', 'DocumentId');
+ *
+ * $result = $api->downloadQuoteRequestMessageDocuments($request);
+ * // $result => @see \Mirakl\Core\Domain\FileWrapper
+ *
+ */
+class QuoteRequestMessageDocumentsRequest extends AbstractDocumentsDownloadRequest
+{
+ /**
+ * @var string
+ */
+ protected $endpoint = 'quote_request/message/{quote_request_message_id}/documents';
+
+ /**
+ * @var array
+ */
+ protected $uriVars = [
+ '{quote_request_message_id}' => 'quote_request_message_id',
+ ];
+
+ /**
+ * @var array
+ */
+ public $queryParams = ['document_id'];
+
+ /**
+ * @param string $quoteRequestMessageId
+ * @param string|null $documentId
+ */
+ public function __construct($quoteRequestMessageId, $documentId = null)
+ {
+ parent::__construct();
+ $this->setQuoteRequestMessageId($quoteRequestMessageId);
+
+ if (null !== $documentId) {
+ $this->setDocumentId($documentId);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Front/Request/Quote/Message/ShopQuoteRequestMessageRequest.php b/src/Mirakl/MMP/Front/Request/Quote/Message/ShopQuoteRequestMessageRequest.php
new file mode 100644
index 0000000..c6d0c6a
--- /dev/null
+++ b/src/Mirakl/MMP/Front/Request/Quote/Message/ShopQuoteRequestMessageRequest.php
@@ -0,0 +1,68 @@
+
+ * use Mirakl\MMP\Front\Client\FrontApiClient;
+ * use Mirakl\MMP\Front\Request\Quote\Message\ShopQuoteRequestMessageRequest;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ * $request = new QuoteRequestMessageDocumentsRequest('ShopQuoteRequestId', 'MessageBody', 'toType');
+ *
+ * $docs = new DocumentCollection();
+ * $docs->add(new Document('fake body', 'test1.txt', 'FILE_TYPE_1'));
+ * $docs->add(new Document('fake body', 'test2.txt', 'FILE_TYPE_2'));
+ *
+ * $request->setDocuments($docs);
+ *
+ * $result = $api->addMessageToQuoteRequest($request);
+ * // $result => @see \Mirakl\MMP\Front\Domain\Quote\Message\CreatedQuoteRequestMessage
+ *
+ */
+class ShopQuoteRequestMessageRequest extends AbstractDocumentsUploadRequest
+{
+ /**
+ * @var string
+ */
+ protected $endpoint = '/quote_request/message';
+
+ /**
+ * @var array
+ */
+ public $bodyParams = ['shop_quote_request_id', 'message_body', 'to_type'];
+
+ /**
+ * @param string $shopQuoteRequestId
+ * @param string $messageBody
+ * @param string $toType
+ */
+ public function __construct($shopQuoteRequestId, $messageBody, $toType)
+ {
+ parent::__construct();
+ $this->setShopQuoteRequestId($shopQuoteRequestId);
+ $this->setMessageBody($messageBody);
+ $this->setToType($toType);
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function getResponseDecorator()
+ {
+ return CreatedQuoteRequestMessage::decorator();
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Front/Request/Quote/Order/PlaceOrderFromQuoteRequest.php b/src/Mirakl/MMP/Front/Request/Quote/Order/PlaceOrderFromQuoteRequest.php
new file mode 100644
index 0000000..d5ba3ef
--- /dev/null
+++ b/src/Mirakl/MMP/Front/Request/Quote/Order/PlaceOrderFromQuoteRequest.php
@@ -0,0 +1,114 @@
+
+ * use Mirakl\MMP\Front\Client\FrontApiClient;
+ * use Mirakl\MMP\Front\Request\Quote\Message\ShopQuoteRequestMessageRequest;
+ * use Mirakl\MMP\Front\Domain\Quote\Order\OrderFromQuote;
+ * use Mirakl\MMP\Front\Domain\Quote\Order\QuoteOrderLine;
+ * use Mirakl\MMP\Front\Request\Quote\Order\PlaceOrderFromQuoteRequest;
+ * use Mirakl\MMP\Common\Domain\AdditionalFieldValue;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ *
+ * $orderLine = new QuoteOrderLine();
+ * $orderLine->setLeadtimeToShip(2);
+ * $orderLine->setOrderLineId('order-54612-1');
+ * $orderLine->setQuoteLineId('quote-1313-1');
+ * $orderLine->setOrderLineAdditionalFields([new AdditionalFieldValue('message', 'my message','LIST')]);
+ *
+ * $paymentInfo = new CreateOrderPaymentInfo();
+ * $paymentInfo->setImprintNumber('1561354561');
+ * $paymentInfo->setPaymentType('CREDIT_CARD');
+ *
+ * $createOrderFromQuote = new OrderFromQuote();
+ * $createOrderFromQuote->setChannelCode('WEB');
+ * $createOrderFromQuote->setCommercialId('order-54612');
+ * $createOrderFromQuote->setLines([$orderLine]);
+ * $createOrderFromQuote->setOrderAdditionalFields([new AdditionalFieldValue('wrapAsGift', 'true','BOOLEAN')]);
+ * $createOrderFromQuote->setPaymentDuration(66);
+ * $createOrderFromQuote->setPaymentInfo($paymentInfo);
+ * $createOrderFromQuote->setPaymentWorkflow('PAY_ON_ACCEPTANCE');
+ * $createOrderFromQuote->setScored(true);
+ *
+ * $request = new PlaceOrderFromQuoteRequest('quoteID', $createOrderFromQuote);
+ *
+ * $result = $api->placeOrderFromQuote($request);
+ * // $result => @see \Mirakl\MMP\FrontOperator\Domain\Collection\Order\OrderCollection
+ *
+ */
+class PlaceOrderFromQuoteRequest extends AbstractRequest
+{
+ use LocalizableTrait;
+
+ /**
+ * @var string
+ */
+ protected $method = 'POST';
+
+ /**
+ * @var string
+ */
+ protected $endpoint = '/quote_request/{quote_id}/place';
+
+ /**
+ * @var array
+ */
+ protected $uriVars = [
+ '{quote_id}' => 'quote_id',
+ ];
+
+ /**
+ * @var array
+ */
+ public $bodyParams = ['order'];
+
+ /**
+ * @var array
+ */
+ protected static $dataTypes = [
+ 'order' => [OrderFromQuote::class, 'create'],
+ ];
+
+ /**
+ * @param string $quoteId
+ * @param OrderFromQuote|array $order
+ */
+ public function __construct($quoteId, $order)
+ {
+ parent::__construct();
+ $this->setQuoteId($quoteId);
+ $this->setOrder($order);
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function getResponseDecorator()
+ {
+ return OrderCollection::decorator('orders');
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function getBodyParams()
+ {
+ return $this->getOrder()->toArray();
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Front/Request/Quote/Scoring/InvalidateQuoteRequest.php b/src/Mirakl/MMP/Front/Request/Quote/Scoring/InvalidateQuoteRequest.php
new file mode 100644
index 0000000..3e5eb53
--- /dev/null
+++ b/src/Mirakl/MMP/Front/Request/Quote/Scoring/InvalidateQuoteRequest.php
@@ -0,0 +1,50 @@
+
+ * use Mirakl\MMP\Front\Client\FrontApiClient;
+ * use Mirakl\MMP\Front\Request\Quote\Scoring\InvalidateQuoteRequest;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ * $request = new InvalidateQuoteRequest('QuoteRequestID');
+ * $api->invalidateQuoteRequest($request);
+ *
+ */
+class InvalidateQuoteRequest extends AbstractRequest
+{
+ /**
+ * @var string
+ */
+ protected $method = 'PUT';
+
+ /**
+ * @var string
+ */
+ protected $endpoint = '/quote_request/{quote_request_id}/invalid';
+
+ /**
+ * @var array
+ */
+ protected $uriVars = [
+ '{quote_request_id}' => 'quote_request_id'
+ ];
+
+ /**
+ * @param string $quoteRequestId
+ */
+ public function __construct($quoteRequestId)
+ {
+ parent::__construct();
+ $this->setQuoteRequestId($quoteRequestId);
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Front/Request/Quote/Scoring/ValidateQuoteRequest.php b/src/Mirakl/MMP/Front/Request/Quote/Scoring/ValidateQuoteRequest.php
new file mode 100644
index 0000000..bb6bbab
--- /dev/null
+++ b/src/Mirakl/MMP/Front/Request/Quote/Scoring/ValidateQuoteRequest.php
@@ -0,0 +1,50 @@
+
+ * use Mirakl\MMP\Front\Client\FrontApiClient;
+ * use Mirakl\MMP\Front\Request\Quote\Scoring\ValidateQuoteRequest;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ * $request = new ValidateQuoteRequest('QuoteRequestID');
+ * $api->validateQuoteRequest($request);
+ *
+ */
+class ValidateQuoteRequest extends AbstractRequest
+{
+ /**
+ * @var string
+ */
+ protected $method = 'PUT';
+
+ /**
+ * @var string
+ */
+ protected $endpoint = '/quote_request/{quote_request_id}/valid';
+
+ /**
+ * @var array
+ */
+ protected $uriVars = [
+ '{quote_request_id}' => 'quote_request_id'
+ ];
+
+ /**
+ * @param string $quoteRequestId
+ */
+ public function __construct($quoteRequestId)
+ {
+ parent::__construct();
+ $this->setQuoteRequestId($quoteRequestId);
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Front/Request/Shipping/GetLogisticClassRequest.php b/src/Mirakl/MMP/Front/Request/Shipping/GetLogisticClassRequest.php
new file mode 100644
index 0000000..ddadfb2
--- /dev/null
+++ b/src/Mirakl/MMP/Front/Request/Shipping/GetLogisticClassRequest.php
@@ -0,0 +1,20 @@
+
+ * use Mirakl\MMP\Front\Client\FrontApiClient;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ * $result = $api->getLogisticClasses();
+ * // $result => @see \Mirakl\MMP\Common\Domain\Collection\Shipping\LogisticClassCollection
+ *
+ */
+class GetLogisticClassRequest extends AbstractGetLogisticClassRequest
+{}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Front/Request/Shipping/GetShippingCarriersRequest.php b/src/Mirakl/MMP/Front/Request/Shipping/GetShippingCarriersRequest.php
new file mode 100644
index 0000000..b004d9a
--- /dev/null
+++ b/src/Mirakl/MMP/Front/Request/Shipping/GetShippingCarriersRequest.php
@@ -0,0 +1,20 @@
+
+ * use Mirakl\MMP\Front\Client\FrontApiClient;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ * $result = $api->getShippingCarriers();
+ * // $result => @see \Mirakl\MMP\Common\Domain\Collection\Shipping\CarrierCollection
+ *
+ */
+class GetShippingCarriersRequest extends AbstractGetShippingCarriersRequest
+{}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Front/Request/Shipping/GetShippingFeesRequest.php b/src/Mirakl/MMP/Front/Request/Shipping/GetShippingFeesRequest.php
new file mode 100644
index 0000000..6445459
--- /dev/null
+++ b/src/Mirakl/MMP/Front/Request/Shipping/GetShippingFeesRequest.php
@@ -0,0 +1,88 @@
+
+ * This method returns the orderer quantity and available quantity of each offer.
+ * use Mirakl\MMP\Front\Client\FrontApiClient;
+ * use Mirakl\MMP\Front\Request\Shipping\GetShippingFeesRequest;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ * $request = new GetShippingFeesRequest('FR', ['2003' => 5, '2002' => 1]);
+ * $result = $api->getShippingFees($request);
+ * // $result => @see \Mirakl\MMP\Front\Domain\Collection\Shipping\ShopShippingFeeCollection
+ *
+ */
+class GetShippingFeesRequest extends AbstractRequest
+{
+ use LocalizableTrait;
+
+ /**
+ * @var string
+ */
+ protected $endpoint = '/shipping/fees';
+
+ /**
+ * @var array
+ */
+ public $queryParams = [
+ 'pricing_channel_code',
+ 'shipping_zone_code',
+ 'offers_with_quantity' => 'offers',
+ 'shops_with_shipping_type' => 'shops',
+ ];
+
+ /**
+ * @param string $shippingZoneCode
+ * @param array $offersWithQuantity
+ */
+ public function __construct($shippingZoneCode, array $offersWithQuantity)
+ {
+ parent::__construct();
+ $this->setShippingZoneCode($shippingZoneCode);
+ $this->setOffersWithQuantity($offersWithQuantity);
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function getResponseDecorator()
+ {
+ return new Decorator\Closure(function (ResponseInterface $response) {
+ $data = \Mirakl\parse_json_response($response);
+ $collection = new ShopShippingFeeCollection($data['shops'], $data['total_count']);
+ if (isset($data['offers_not_found'])) {
+ $collection->setOffersNotFound($data['offers_not_found']);
+ }
+
+ return $collection;
+ });
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Front/Request/Shipping/GetShippingRatesRequest.php b/src/Mirakl/MMP/Front/Request/Shipping/GetShippingRatesRequest.php
new file mode 100644
index 0000000..78228a0
--- /dev/null
+++ b/src/Mirakl/MMP/Front/Request/Shipping/GetShippingRatesRequest.php
@@ -0,0 +1,136 @@
+
+ * This method returns the orderer quantity and available quantity of each offer.
+ * use Mirakl\MMP\Front\Client\FrontApiClient;
+ * use Mirakl\MMP\Front\Request\Shipping\GetShippingRatesRequest;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ * $request = new GetShippingRatesRequest('FR', [
+ * ['offer_id' => 2003, 'quantity' => 5, 'shipping_type_code' => 'STD', 'leadtime_to_ship' => 2],
+ * ['offer_id' => 2004, 'quantity' => 2, 'leadtime_to_ship' => 5],
+ * ['offer_id' => 2005, 'quantity' => 10],
+ * ]);
+ * $result = $api->getShippingRates($request);
+ * // $result => @see \Mirakl\MMP\Front\Domain\Collection\Shipping\OrderShippingFeeCollection
+ *
+ *
+ */
+class GetShippingRatesRequest extends AbstractRequest
+{
+ use LocalizableTrait;
+
+ /**
+ * @var string
+ */
+ protected $endpoint = '/shipping/rates';
+
+ /**
+ * @var array
+ */
+ public $queryParams = [
+ 'pricing_channel_code',
+ 'shipping_zone_code',
+ 'compute_order_taxes',
+ ];
+
+ /**
+ * @var array
+ */
+ protected static $dataTypes = [
+ 'offers' => [OffersWithQtyCollection::class, 'create'],
+ ];
+
+ /**
+ * @param string $shippingZoneCode
+ * @param array|OffersWithQtyCollection $offers
+ */
+ public function __construct($shippingZoneCode, $offers)
+ {
+ parent::__construct();
+ $this->setShippingZoneCode($shippingZoneCode);
+ $this->setOffers($offers);
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function getQueryParams()
+ {
+ $params = parent::getQueryParams();
+ $params['offers'] = \Mirakl\tuples_to_query_param($this->getOffers()->toArray());
+
+ if ($customerShipppingAddress = $this->getCustomerShippingToAddress()) {
+ if (!empty($customerShipppingAddress->getStreet1())) {
+ $params['customer_shipping_address_street_1'] = $customerShipppingAddress->getStreet1();
+ }
+ if (!empty($customerShipppingAddress->getStreet2())) {
+ $params['customer_shipping_address_street_2'] = $customerShipppingAddress->getStreet2();
+ }
+ if (!empty($customerShipppingAddress->getCity())) {
+ $params['customer_shipping_address_city'] = $customerShipppingAddress->getCity();
+ }
+ if (!empty($customerShipppingAddress->getZipCode())) {
+ $params['customer_shipping_address_zipcode'] = $customerShipppingAddress->getZipCode();
+ }
+ if (!empty($customerShipppingAddress->getState())) {
+ $params['customer_shipping_address_state'] = $customerShipppingAddress->getState();
+ }
+ if (!empty($customerShipppingAddress->getCountryCode())) {
+ $params['customer_shipping_address_country_iso_code'] = $customerShipppingAddress->getCountryCode();
+ }
+ }
+
+ return $params;
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function getResponseDecorator()
+ {
+ return new Decorator\Closure(function (ResponseInterface $response) {
+ $data = \Mirakl\parse_json_response($response);
+ $collection = new OrderShippingFeeCollection($data['orders'], $data['total_count']);
+ if (isset($data['errors'])) {
+ $collection->setErrors($data['errors']);
+ }
+
+ return $collection;
+ });
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Front/Request/Shipping/GetShippingZonesRequest.php b/src/Mirakl/MMP/Front/Request/Shipping/GetShippingZonesRequest.php
new file mode 100644
index 0000000..5e188fb
--- /dev/null
+++ b/src/Mirakl/MMP/Front/Request/Shipping/GetShippingZonesRequest.php
@@ -0,0 +1,26 @@
+
+ * use Mirakl\MMP\Front\Client\FrontApiClient;
+ * use Mirakl\MMP\Front\Request\Shipping\GetShippingZonesRequest;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ *
+ * $request = new GetShippingZonesRequest();
+ * $request->setLocale('fr_FR');
+ *
+ * $result = $api->getShippingZones($request);
+ * // $result => @see \Mirakl\MMP\Common\Domain\Collection\Shipping\ShippingZoneDetailCollection
+ *
+ *
+ */
+class GetShippingZonesRequest extends AbstractGetShippingZonesRequest
+{}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Front/Request/Shop/CreateShopsRequest.php b/src/Mirakl/MMP/Front/Request/Shop/CreateShopsRequest.php
new file mode 100644
index 0000000..241a2ef
--- /dev/null
+++ b/src/Mirakl/MMP/Front/Request/Shop/CreateShopsRequest.php
@@ -0,0 +1,93 @@
+
+ * use Mirakl\MMP\Front\Client\FrontApiClient;
+ * use Mirakl\MMP\Front\Request\Shop\CreateShopsRequest;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ * $request = new CreateShopsRequest([
+ * [
+ * 'address' => [
+ * 'civility' => 'Mr',
+ * 'firstname' => 'Bob',
+ * 'lastname' => 'Smith',
+ * 'street1' => '10 E 40th St',
+ * 'street2' => '8th floor',
+ * 'zip_code' => '10016',
+ * 'state' => 'New York',
+ * 'city' => 'New York City',
+ * 'country' => 'USA',
+ * 'phone' => '(646) 320-3881',
+ * 'phone_secondary' => '(212) 204-1126'
+ * ],
+ * 'email' => 'sps@sps.com',
+ * 'fax' => 'none',
+ * 'web_site' => 'http://swisspostsolutions.com',
+ * 'operator_internal_id' => '94R9U3DI',
+ * 'shipping_country' => 'USA',
+ * 'description' => 'Sells letters, stamps...',
+ * 'return_policy' => 'All returns are free',
+ * 'pro_details' => [
+ * 'corporate_name' => 'Swiss Post Solutions',
+ * 'identification_number' => 'US-329JD93KKL',
+ * 'tax_identification_number' => 'USNY9403999'
+ * ],
+ * 'shop_name' => 'Swiss Post Store',
+ * 'is_professional' => true,
+ * 'closed_from_date' => '2014-12-12T12:12:00.000+0000',
+ * 'closed_to_date' => '2014-12-20T12:12:00.000+0000',
+ * 'immunity_date' => '2015-01-01T00:00:00.000+0000',
+ * 'shop_additional_fields' => [
+ * [
+ * 'code' => 'erp-reference-key',
+ * 'value' => '9ZE8DOIIII'
+ * ]
+ * ],
+ * 'payment_info' => [
+ * '@type' => 'ABA',
+ * 'owner' => 'Matt Marteens',
+ * 'bank_name' => 'Chase',
+ * 'bank_account_number' => '839383939',
+ * 'routing_number' => '121000248',
+ * 'bic' => 'BOAUSIIE999'
+ * ],
+ * 'new_user' => [
+ * 'email' => 'user@email.com',
+ * 'password' => 'password1234'
+ * ]
+ * ]
+ * ]);
+ * $result = $api->createShops($request);
+ * // $result => @see \Mirakl\MMP\FrontOperator\Domain\Shop\Create\CreatedShops
+ *
+ */
+class CreateShopsRequest extends AbstractCreateShopsRequest
+{
+ /**
+ * @var array
+ */
+ protected static $dataTypes = [
+ 'shops' => [CreateShopCollection::class, 'create'],
+ ];
+
+ /**
+ * @param mixed $shops
+ */
+ public function __construct($shops)
+ {
+ parent::__construct();
+ $this->setShops($shops);
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/FrontOperator/Client/FrontOperatorApiClient.php b/src/Mirakl/MMP/FrontOperator/Client/FrontOperatorApiClient.php
new file mode 100644
index 0000000..edc1265
--- /dev/null
+++ b/src/Mirakl/MMP/FrontOperator/Client/FrontOperatorApiClient.php
@@ -0,0 +1,145 @@
+run($this);
+ }
+
+ /**
+ * (P13) Export all products in csv file
+ *
+ * @return File
+ */
+ public function getExportProductsCsv()
+ {
+ return (new ExportProductsFileRequest())->run($this);
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/FrontOperator/Domain/Category.php b/src/Mirakl/MMP/FrontOperator/Domain/Category.php
new file mode 100644
index 0000000..f26ebe0
--- /dev/null
+++ b/src/Mirakl/MMP/FrontOperator/Domain/Category.php
@@ -0,0 +1,42 @@
+ [CategoryMediaCollection::class, 'create'],
+ ];
+
+ /**
+ * @var array
+ */
+ protected static $mapping = [
+ 'category_code' => 'code',
+ 'category_description' => 'description',
+ 'category_label' => 'label',
+ 'category_type' => 'type',
+ 'category_medias' => 'media',
+ ];
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/FrontOperator/Domain/Category/CategoryMedia.php b/src/Mirakl/MMP/FrontOperator/Domain/Category/CategoryMedia.php
new file mode 100644
index 0000000..7445f98
--- /dev/null
+++ b/src/Mirakl/MMP/FrontOperator/Domain/Category/CategoryMedia.php
@@ -0,0 +1,15 @@
+ 'offer_id',
+ 'product-sku' => 'product/sku',
+ 'min-shipping-price' => 'min_shipping/price',
+ 'min-shipping-price-additional' => 'min_shipping/price_additional',
+ 'min-shipping-zone' => 'min_shipping/zone_code',
+ 'min-shipping-type' => 'min_shipping/type_code',
+ 'total-price' => 'total_price',
+ 'price-additional-info' => 'price_additional_info',
+ 'state-code' => 'state_code',
+ 'shop-id' => 'shop_id',
+ 'shop-name' => 'shop_name',
+ 'logistic-class' => 'logistic_class_code',
+ 'favorite-rank' => 'favorite_rank',
+ 'origin-price' => 'discount/origin_price',
+ 'discount-start-date' => 'discount/start_date',
+ 'discount-end-date' => 'discount/end_date',
+ 'available-start-date' => 'availability/start_date',
+ 'available-end-date' => 'availability/end_date',
+ 'allow-quote-requests' => 'allow_quote_requests',
+ 'discount-price' => 'discount/discount_price',
+ 'discount-ranges' => 'discount/ranges',
+ 'price-ranges' => 'price_ranges',
+ 'currency-iso-code' => 'currency_iso_code',
+ 'leadtime-to-ship' => 'leadtime_to_ship',
+ 'eco-tax' => 'eco_tax',
+ 'product-tax-code' => 'product_tax_code',
+ 'min-order-quantity' => 'min_order_quantity',
+ 'max-order-quantity' => 'max_order_quantity',
+ 'package-quantity' => 'package_quantity',
+ ];
+
+ /**
+ * @var array
+ */
+ protected static $offerPricingFields = [
+ 'price' => 'price',
+ 'origin-price' => 'unit_origin_price',
+ 'price-ranges' => 'price_ranges',
+ 'discount-price' => 'unit_discount_price',
+ 'discount-start-date' => 'discount_start_date',
+ 'discount-end-date' => 'discount_end_date',
+ 'discount-ranges' => 'discount_ranges',
+ ];
+
+ /**
+ * Return origin price directly from offer to keep backwards compatibility
+ *
+ * @deprecated use getDiscount()->getOriginPrice()
+ * @return float
+ */
+ public function getOriginPrice()
+ {
+ if ($discount = $this->getDiscount()) {
+ return $discount->getOriginPrice();
+ }
+
+ return $this->getPrice();
+ }
+
+ /**
+ * @param array $data
+ * @param string|null $channelCode
+ * @return array|null
+ */
+ protected function getOfferPricingData($data, $channelCode = null)
+ {
+ // Collect original / channel data
+ $offerPricing = [];
+ foreach (self::$offerPricingFields as $column => $field) {
+ if ($channelCode) {
+ $column = sprintf('%s[channel=%s]', $column, $channelCode);
+ }
+ if (!empty($data[$column])) {
+ $offerPricing[$field] = $data[$column];
+ }
+ }
+
+ if (!count($offerPricing)) {
+ return null;
+ }
+
+ $offerPricing['channel_code'] = $channelCode;
+
+ // Merge price-ranges & discount-ranges for having volume pricing
+ $volumePrices = [];
+ $addPriceRange = function ($type, $field) use (&$offerPricing, &$volumePrices) {
+ if (isset($offerPricing[$field]) && $offerPricing[$field]) {
+ foreach (explode(',', $offerPricing[$field]) as $range) {
+ list ($qty, $price) = explode('|', $range);
+ if (!isset($volumePrices[$qty])) {
+ $volumePrices[$qty] = ['quantity_threshold' => $qty];
+ }
+ $volumePrices[$qty][$type] = $price;
+ }
+ }
+ unset($offerPricing[$field]);
+ };
+
+ $addPriceRange('unit_origin_price', 'price_ranges');
+ $addPriceRange('unit_discount_price', 'discount_ranges');
+
+ $offerPricing['volume_prices'] = array_values($volumePrices);
+
+ return $offerPricing;
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function setData($key, $value = null)
+ {
+ parent::setData($key, $value);
+
+ if (!is_array($key)) {
+ return $this;
+ }
+
+ $allPrices = new OfferPricesCollection();
+
+ $channels = array_merge([null], $this->getChannels());
+ foreach ($channels as $channel) {
+ if ($offerPricing = $this->getOfferPricingData($key, $channel)) {
+ $allPrices->add($offerPricing);
+ }
+ }
+ $this->setAllPrices($allPrices);
+
+ return $this;
+ }
+}
diff --git a/src/Mirakl/MMP/FrontOperator/Domain/Order.php b/src/Mirakl/MMP/FrontOperator/Domain/Order.php
new file mode 100644
index 0000000..751bbb5
--- /dev/null
+++ b/src/Mirakl/MMP/FrontOperator/Domain/Order.php
@@ -0,0 +1,37 @@
+ [OrderCustomer::class, 'create'],
+ 'order_lines' => [OrderLineCollection::class, 'create'],
+ ];
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/FrontOperator/Domain/Order/AdditionalField/UpdateAdditionalFields.php b/src/Mirakl/MMP/FrontOperator/Domain/Order/AdditionalField/UpdateAdditionalFields.php
new file mode 100644
index 0000000..a88a02b
--- /dev/null
+++ b/src/Mirakl/MMP/FrontOperator/Domain/Order/AdditionalField/UpdateAdditionalFields.php
@@ -0,0 +1,51 @@
+ 'additional_fields',
+ ];
+
+ /**
+ * @var array
+ */
+ protected static $dataTypes = [
+ 'order_lines' => [OrderLineWithAdditionalFieldsCollection::class, 'create'],
+ 'additional_fields' => [AdditionalFieldValueCollection::class, 'create'],
+ ];
+
+ /**
+ * @return AdditionalFieldValueCollection
+ *
+ * @deprecated use getOrderAdditionalFields()
+ */
+ public function getAdditionalFields()
+ {
+ return $this->getOrderAdditionalFields();
+ }
+
+ /**
+ * @param array|AdditionalFieldValueCollection $additionalFields
+ * @return $this
+ *
+ * @deprecated use setOrderAdditionalFields($additionalFields)
+ */
+ public function setAdditionalFields($additionalFields)
+ {
+ return $this->setOrderAdditionalFields($additionalFields);
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/FrontOperator/Domain/Order/AdditionalField/UpdateAdditionalFieldsResult.php b/src/Mirakl/MMP/FrontOperator/Domain/Order/AdditionalField/UpdateAdditionalFieldsResult.php
new file mode 100644
index 0000000..9248a84
--- /dev/null
+++ b/src/Mirakl/MMP/FrontOperator/Domain/Order/AdditionalField/UpdateAdditionalFieldsResult.php
@@ -0,0 +1,21 @@
+ [UpdateAdditionalFields::class, 'create'],
+ 'order_update_errors' => [UpdateAdditionalFieldsWithErrors::class, 'create'],
+ ];
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/FrontOperator/Domain/Order/AdditionalField/UpdateAdditionalFieldsWithErrors.php b/src/Mirakl/MMP/FrontOperator/Domain/Order/AdditionalField/UpdateAdditionalFieldsWithErrors.php
new file mode 100644
index 0000000..df7701b
--- /dev/null
+++ b/src/Mirakl/MMP/FrontOperator/Domain/Order/AdditionalField/UpdateAdditionalFieldsWithErrors.php
@@ -0,0 +1,14 @@
+ [UpdateAdditionalFields::class, 'create'],
+ ];
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/FrontOperator/Domain/Order/Cancelation/CancelationCreated.php b/src/Mirakl/MMP/FrontOperator/Domain/Order/Cancelation/CancelationCreated.php
new file mode 100644
index 0000000..1c214e6
--- /dev/null
+++ b/src/Mirakl/MMP/FrontOperator/Domain/Order/Cancelation/CancelationCreated.php
@@ -0,0 +1,7 @@
+ [CustomerShippingAddress::class, 'create'],
+ ];
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/FrontOperator/Domain/Order/OrderLine.php b/src/Mirakl/MMP/FrontOperator/Domain/Order/OrderLine.php
new file mode 100644
index 0000000..e4af9eb
--- /dev/null
+++ b/src/Mirakl/MMP/FrontOperator/Domain/Order/OrderLine.php
@@ -0,0 +1,11 @@
+ [DebitOrderLineCollection::class, 'create'],
+ ];
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/FrontOperator/Domain/Payment/Debit/DebitOrderLine.php b/src/Mirakl/MMP/FrontOperator/Domain/Payment/Debit/DebitOrderLine.php
new file mode 100644
index 0000000..4bf5d0f
--- /dev/null
+++ b/src/Mirakl/MMP/FrontOperator/Domain/Payment/Debit/DebitOrderLine.php
@@ -0,0 +1,17 @@
+ [RefundedOrderLineCollection::class, 'create'],
+ ];
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/FrontOperator/Domain/Payment/Refund/RefundOrderLine.php b/src/Mirakl/MMP/FrontOperator/Domain/Payment/Refund/RefundOrderLine.php
new file mode 100644
index 0000000..f0392bb
--- /dev/null
+++ b/src/Mirakl/MMP/FrontOperator/Domain/Payment/Refund/RefundOrderLine.php
@@ -0,0 +1,13 @@
+ [RefundOrderLineCollection::class, 'create'],
+ ];
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/FrontOperator/Domain/Product.php b/src/Mirakl/MMP/FrontOperator/Domain/Product.php
new file mode 100644
index 0000000..ee3dc9c
--- /dev/null
+++ b/src/Mirakl/MMP/FrontOperator/Domain/Product.php
@@ -0,0 +1,11 @@
+ 'offer_id',
+ 'product_sku' => 'product/sku',
+ 'product_title' => 'product/title',
+ 'product_references' => 'product/references',
+ 'category_code' => 'product/category/code',
+ 'category_label' => 'product/category/label',
+ 'category_type' => 'product/category/type',
+ 'min_shipping_price' => 'min_shipping/price',
+ 'min_shipping_price_additional' => 'min_shipping/price_additional',
+ 'min_shipping_type' => 'min_shipping/type_code',
+ 'min_shipping_zone' => 'min_shipping/zone_code',
+ 'available_start_date' => 'availability/start_date',
+ 'available_end_date' => 'availability/end_date',
+ 'offer_additional_fields' => 'additional_fields',
+ 'is_professional' => 'professional',
+ 'is_premium' => 'premium',
+ ];
+
+ /**
+ * @var array
+ */
+ protected static $dataTypes = [
+ 'additional_fields' => [AdditionalFieldValueCollection::class, 'create'],
+ 'availability' => [OfferAvailability::class, 'create'],
+ 'discount' => [Discount::class, 'create'],
+ 'logistic_class' => [LogisticClass::class, 'create'],
+ 'min_shipping' => [OfferMinimumShipping::class, 'create'],
+ 'product' => [ProductInfoWithRefs::class, 'create'],
+ 'all_prices' => [OfferPricesCollection::class, 'create'],
+ 'applicable_pricing' => [OfferPricing::class, 'create'],
+ ];
+
+ /**
+ * @return string
+ */
+ public function getId()
+ {
+ return $this->getOfferId();
+ }
+
+ /**
+ * @param mixed $product
+ * @return $this
+ */
+ public function setProductReferences($product)
+ {
+ if (is_array($product)) {
+ $product = ProductInfoWithRefs::create(['references' => $product]);
+ }
+
+ return $this->setProduct($product);
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/FrontOperator/Domain/Product/Offer/ProductWithOffers.php b/src/Mirakl/MMP/FrontOperator/Domain/Product/Offer/ProductWithOffers.php
new file mode 100644
index 0000000..6d96a73
--- /dev/null
+++ b/src/Mirakl/MMP/FrontOperator/Domain/Product/Offer/ProductWithOffers.php
@@ -0,0 +1,37 @@
+ 'product/sku',
+ 'product_title' => 'product/title',
+ 'product_references' => 'product/references',
+ 'category_code' => 'product/category/code',
+ 'category_label' => 'product/category/label',
+ 'category_type' => 'product/category/type',
+ ];
+
+ /**
+ * @var array
+ */
+ protected static $dataTypes = [
+ 'product' => [ProductInfoWithRefs::class, 'create'],
+ 'offers' => [OfferOnProductCollection::class, 'create'],
+ ];
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/FrontOperator/Domain/Product/Synchro/ProductSynchroResult.php b/src/Mirakl/MMP/FrontOperator/Domain/Product/Synchro/ProductSynchroResult.php
new file mode 100644
index 0000000..03dfe30
--- /dev/null
+++ b/src/Mirakl/MMP/FrontOperator/Domain/Product/Synchro/ProductSynchroResult.php
@@ -0,0 +1,15 @@
+setShopId($shopId);
+ $this->setPromotionId($promotionId);
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/FrontOperator/Domain/Promotion/PromotionOffersMapping.php b/src/Mirakl/MMP/FrontOperator/Domain/Promotion/PromotionOffersMapping.php
new file mode 100644
index 0000000..3a3cdc4
--- /dev/null
+++ b/src/Mirakl/MMP/FrontOperator/Domain/Promotion/PromotionOffersMapping.php
@@ -0,0 +1,51 @@
+ 'offer_id',
+ 'shop-id' => 'shop_id',
+ 'trigger-promotion-ids' => 'trigger_promotion_ids',
+ 'reward-promotion-ids' => 'reward_promotion_ids'
+ ];
+
+ /**
+ * @param array|string $triggerPromotionIds
+ * @return $this
+ */
+ function setTriggerPromotionIds($triggerPromotionIds) {
+ if (!is_array($triggerPromotionIds))
+ $this->setData('trigger_promotion_ids',explode(',',$triggerPromotionIds));
+ else
+ $this->setData('trigger_promotion_ids',$triggerPromotionIds);
+
+ return $this;
+ }
+
+ /**
+ * @param array|string $rewardPromotionIds
+ * @return $this
+ */
+ function setRewardPromotionIds($rewardPromotionIds) {
+ if (!is_array($rewardPromotionIds))
+ $this->setData('reward_promotion_ids',explode(',',$rewardPromotionIds));
+ else
+ $this->setData('reward_promotion_ids',$rewardPromotionIds);
+
+ return $this;
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/FrontOperator/Domain/Promotion/PromotionWithOffers.php b/src/Mirakl/MMP/FrontOperator/Domain/Promotion/PromotionWithOffers.php
new file mode 100644
index 0000000..7334813
--- /dev/null
+++ b/src/Mirakl/MMP/FrontOperator/Domain/Promotion/PromotionWithOffers.php
@@ -0,0 +1,7 @@
+ [CustomerBillingAddress::class, 'create'],
+ 'shipping_address' => [CustomerShippingAddress::class, 'create'],
+ ];
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/FrontOperator/Domain/Reason.php b/src/Mirakl/MMP/FrontOperator/Domain/Reason.php
new file mode 100644
index 0000000..cb1fd91
--- /dev/null
+++ b/src/Mirakl/MMP/FrontOperator/Domain/Reason.php
@@ -0,0 +1,33 @@
+ 'customer_right',
+ 'is_operator_right' => 'operator_right',
+ 'is_shop_right' => 'shop_right',
+ ];
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/FrontOperator/Domain/Shop.php b/src/Mirakl/MMP/FrontOperator/Domain/Shop.php
new file mode 100644
index 0000000..8835976
--- /dev/null
+++ b/src/Mirakl/MMP/FrontOperator/Domain/Shop.php
@@ -0,0 +1,25 @@
+ [PaymentDetails::class, 'create'],
+ ];
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/FrontOperator/Domain/Shop/AbstractCommonShop.php b/src/Mirakl/MMP/FrontOperator/Domain/Shop/AbstractCommonShop.php
new file mode 100644
index 0000000..df4b5db
--- /dev/null
+++ b/src/Mirakl/MMP/FrontOperator/Domain/Shop/AbstractCommonShop.php
@@ -0,0 +1,69 @@
+ 'closed_from',
+ 'closed_to_date' => 'closed_to',
+ 'shop_name' => 'name',
+ 'shop_additional_fields' => 'additional_field_values',
+ 'is_professional' => 'professional',
+ 'pro_details' => 'professional_info',
+ ];
+
+ /**
+ * @var array
+ */
+ protected static $dataTypes = [
+ 'additional_field_values' => [AdditionalFieldValueCollection::class, 'create'],
+ 'payment_info' => [PaymentInfo::class, 'factory'],
+ 'professional_info' => [ProfessionalInfo::class, 'create'],
+ ];
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/FrontOperator/Domain/Shop/Create/AbstractCreateShop.php b/src/Mirakl/MMP/FrontOperator/Domain/Shop/Create/AbstractCreateShop.php
new file mode 100644
index 0000000..22592e1
--- /dev/null
+++ b/src/Mirakl/MMP/FrontOperator/Domain/Shop/Create/AbstractCreateShop.php
@@ -0,0 +1,61 @@
+ [CreateShopAddress::class, 'create'],
+ 'additional_field_values' => [AdditionalFieldValueCollection::class, 'create'],
+ 'payment_info' => [PaymentInfo::class, 'factory'],
+ 'professional_info' => [ProfessionalInfo::class, 'create'],
+ ];
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/FrontOperator/Domain/Shop/Create/CreateShopAddress.php b/src/Mirakl/MMP/FrontOperator/Domain/Shop/Create/CreateShopAddress.php
new file mode 100644
index 0000000..44efba0
--- /dev/null
+++ b/src/Mirakl/MMP/FrontOperator/Domain/Shop/Create/CreateShopAddress.php
@@ -0,0 +1,12 @@
+ [Shop::class, 'create'],
+ 'shop_error' => [ShopWithErrors::class, 'create'],
+ ];
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/FrontOperator/Domain/Shop/Create/CreatedShops.php b/src/Mirakl/MMP/FrontOperator/Domain/Shop/Create/CreatedShops.php
new file mode 100644
index 0000000..6a8f0b4
--- /dev/null
+++ b/src/Mirakl/MMP/FrontOperator/Domain/Shop/Create/CreatedShops.php
@@ -0,0 +1,19 @@
+ [CreatedShopReturnCollection::class, 'create'],
+ ];
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/FrontOperator/Domain/Shop/Location/ShopTaxLocation.php b/src/Mirakl/MMP/FrontOperator/Domain/Shop/Location/ShopTaxLocation.php
new file mode 100644
index 0000000..7e657ec
--- /dev/null
+++ b/src/Mirakl/MMP/FrontOperator/Domain/Shop/Location/ShopTaxLocation.php
@@ -0,0 +1,37 @@
+ 'street_1',
+ 'street2' => 'street_2',
+ ];
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/FrontOperator/Domain/Shop/ShopWithErrors.php b/src/Mirakl/MMP/FrontOperator/Domain/Shop/ShopWithErrors.php
new file mode 100644
index 0000000..7fdbdae
--- /dev/null
+++ b/src/Mirakl/MMP/FrontOperator/Domain/Shop/ShopWithErrors.php
@@ -0,0 +1,7 @@
+ [Shop::class, 'create'],
+ 'shop_error' => [ShopWithErrors::class, 'create'],
+ ];
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/FrontOperator/Domain/Shop/Update/UpdatedShops.php b/src/Mirakl/MMP/FrontOperator/Domain/Shop/Update/UpdatedShops.php
new file mode 100644
index 0000000..de8705a
--- /dev/null
+++ b/src/Mirakl/MMP/FrontOperator/Domain/Shop/Update/UpdatedShops.php
@@ -0,0 +1,19 @@
+ [UpdatedShopReturnCollection::class, 'create'],
+ ];
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/FrontOperator/Domain/Synchro/AbstractSynchroResult.php b/src/Mirakl/MMP/FrontOperator/Domain/Synchro/AbstractSynchroResult.php
new file mode 100644
index 0000000..f29d3b7
--- /dev/null
+++ b/src/Mirakl/MMP/FrontOperator/Domain/Synchro/AbstractSynchroResult.php
@@ -0,0 +1,38 @@
+ 'error_report',
+ ];
+
+ /**
+ * @return bool
+ */
+ public function hasErrorReport()
+ {
+ return (bool) $this->getErrorReport();
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/FrontOperator/Domain/Synchro/AbstractSynchroTracking.php b/src/Mirakl/MMP/FrontOperator/Domain/Synchro/AbstractSynchroTracking.php
new file mode 100644
index 0000000..c91ff0b
--- /dev/null
+++ b/src/Mirakl/MMP/FrontOperator/Domain/Synchro/AbstractSynchroTracking.php
@@ -0,0 +1,11 @@
+
+ * use Mirakl\MMP\Front\Client\FrontApiClient;
+ * use Mirakl\MMP\FrontOperator\Request\Catalog\Category\CategorySynchroErrorReportRequest;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ *
+ * $request = new CategorySynchroErrorReportRequest('SYNCHRO_ID');
+ *
+ * $result = $api->getCategorySynchroErrorReport($request)->getFile();
+ * // $result => @see \Mirakl\Core\Domain\FileWrapper;
+ *
+ *
+ */
+class CategorySynchroErrorReportRequest extends AbstractSynchroErrorReportRequest
+{
+ use CsvResponseDecorator;
+
+ /**
+ * @var string
+ */
+ protected $endpoint = '/categories/synchros/{synchro}/error_report';
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/FrontOperator/Request/Catalog/Category/CategorySynchroRequest.php b/src/Mirakl/MMP/FrontOperator/Request/Catalog/Category/CategorySynchroRequest.php
new file mode 100644
index 0000000..89b0dbf
--- /dev/null
+++ b/src/Mirakl/MMP/FrontOperator/Request/Catalog/Category/CategorySynchroRequest.php
@@ -0,0 +1,42 @@
+
+ * use Mirakl\MMP\Front\Client\FrontApiClient;
+ * use Mirakl\MMP\FrontOperator\Request\Catalog\Category\CategorySynchroRequest;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ *
+ * $request = new CategorySynchroRequest('PATH_FILE');
+ *
+ * $result = $this->api->synchronizeCategories($request);
+ * // $result => @see \Mirakl\MMP\FrontOperator\Domain\Category\Synchro\CategorySynchroTracking;;
+ *
+ *
+ */
+class CategorySynchroRequest extends AbstractFileRequest
+{
+ /**
+ * @var string
+ */
+ protected $endpoint = '/categories/synchros';
+
+ /**
+ * @inheritdoc
+ */
+ public function getResponseDecorator()
+ {
+ return CategorySynchroTracking::decorator();
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/FrontOperator/Request/Catalog/Category/CategorySynchroStatusRequest.php b/src/Mirakl/MMP/FrontOperator/Request/Catalog/Category/CategorySynchroStatusRequest.php
new file mode 100644
index 0000000..8f2864a
--- /dev/null
+++ b/src/Mirakl/MMP/FrontOperator/Request/Catalog/Category/CategorySynchroStatusRequest.php
@@ -0,0 +1,39 @@
+
+ * use Mirakl\MMP\Front\Client\FrontApiClient;
+ * use Mirakl\MMP\FrontOperator\Request\Catalog\Category\CategorySynchroStatusRequest;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ *
+ * $request = new CategorySynchroStatusRequest('SYNCHRO_ID');
+ *
+ * $result = $this->api->getCategorySynchroResult($request);
+ * // $result => @see \Mirakl\MMP\FrontOperator\Domain\Category\Synchro\CategorySynchroResult;
+ *
+ *
+ */
+class CategorySynchroStatusRequest extends AbstractSynchroStatusRequest
+{
+ /**
+ * @var string
+ */
+ protected $endpoint = '/categories/synchros/{synchro}';
+
+ /**
+ * @inheritdoc
+ */
+ public function getResponseDecorator()
+ {
+ return CategorySynchroResult::decorator();
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/FrontOperator/Request/Catalog/Product/ProductSynchroErrorReportRequest.php b/src/Mirakl/MMP/FrontOperator/Request/Catalog/Product/ProductSynchroErrorReportRequest.php
new file mode 100644
index 0000000..ec5b955
--- /dev/null
+++ b/src/Mirakl/MMP/FrontOperator/Request/Catalog/Product/ProductSynchroErrorReportRequest.php
@@ -0,0 +1,33 @@
+
+ * use Mirakl\MMP\Front\Client\FrontApiClient;
+ * use Mirakl\MMP\FrontOperator\Request\Catalog\Product\ProductSynchroErrorReportRequest;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ *
+ * $request = new ProductSynchroErrorReportRequest('SYNCHRO_ID');
+ *
+ * $result = $api->getProductSynchroErrorReport($request);
+ * // $result => @see \Mirakl\Core\Domain\FileWrapper;
+ *
+ *
+ */
+class ProductSynchroErrorReportRequest extends AbstractSynchroErrorReportRequest
+{
+ use CsvResponseDecorator;
+
+ /**
+ * @var string
+ */
+ protected $endpoint = '/products/synchros/{synchro}/error_report';
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/FrontOperator/Request/Catalog/Product/ProductSynchroRequest.php b/src/Mirakl/MMP/FrontOperator/Request/Catalog/Product/ProductSynchroRequest.php
new file mode 100644
index 0000000..0bb7e1a
--- /dev/null
+++ b/src/Mirakl/MMP/FrontOperator/Request/Catalog/Product/ProductSynchroRequest.php
@@ -0,0 +1,47 @@
+
+ * use Mirakl\MMP\Front\Client\FrontApiClient;
+ * use Mirakl\MMP\FrontOperator\Request\Catalog\Product\ProductSynchroRequest;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ *
+ * $csv = <<+ * Returns CSV diff file with: + * offer-id;product-sku;min-shipping-price;min-shipping-price-additional; + * min-shipping-zone;min-shipping-type;price;total-price;price-additional-info;quantity;description; + * state-code;shop-id;shop-name;professional;premium;logistic-class;active;favorite-rank;channels; + * deleted;origin-price;discount-start-date;discount-end-date;available-start-date;available-end-date;currency-iso-code + *
+ * + * @method array getChannelCodes() + * @method $this setChannelCodes(array $channelCodes) + * @method bool isIncludeInactiveOffers() + * @method $this setIncludeInactiveOffers(bool $includeInactiveOffers) + * + * setIncludeInactiveOffers method can be used only if last_request_date is not specified. + * If true, active offers as well as inactive offers are returned. + * If false or not specified, only active offers are returned. + * If false or not specified, only active offers are returned. + * + * @method \DateTime getLastRequestDate() + * + * If the lastRequestDate param is not set the API returns all the active offers. + * If this params is set the export returns the active and inactive offers since the last API call. + * For inactive offers, the "active" field is set to "false" and only the "offer-id" and "product-sku" + * fields are specified. + * @method $this setLastRequestDate(\DateTime $lastRequestDate) + * + * Example: + * + *
+ * use Mirakl\MMP\Front\Client\FrontApiClient;
+ * use Mirakl\MMP\FrontOperator\Request\Offer\OffersExportFileRequest;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ *
+ * $request = new OffersExportFileRequest();
+ * $request->setIncludeInactiveOffers(true);
+ *
+ * $result = $this->api->exportOffersToFile($request);
+ * // $result => @see \Mirakl\Core\Domain\FileWrapper;
+ *
+ *
+ */
+class OffersExportFileRequest extends AbstractRequest
+{
+ use CsvResponseDecorator;
+
+ /**
+ * @var string
+ */
+ protected $endpoint = '/offers/export';
+
+ /**
+ * @var array
+ */
+ public $queryParams = ['last_request_date', 'channel_codes', 'include_inactive_offers'];
+
+ /**
+ * @param string|\Datetime $lastRequestDate
+ */
+ public function __construct($lastRequestDate = null)
+ {
+ parent::__construct();
+ if (null !== $lastRequestDate) {
+ $this->setLastRequestDate($lastRequestDate);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/FrontOperator/Request/Offer/OffersExportRequest.php b/src/Mirakl/MMP/FrontOperator/Request/Offer/OffersExportRequest.php
new file mode 100644
index 0000000..1fda724
--- /dev/null
+++ b/src/Mirakl/MMP/FrontOperator/Request/Offer/OffersExportRequest.php
@@ -0,0 +1,39 @@
+
+ * use Mirakl\MMP\Front\Client\FrontApiClient;
+ * use Mirakl\MMP\FrontOperator\Request\Offer\OffersExportRequest;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ *
+ * $request = new OffersExportRequest();
+ * $request->setIncludeInactiveOffers(true);
+ *
+ * $result = $this->api->exportOffers($request);
+ * // $result => @see \Mirakl\MMP\FrontOperator\Domain\Collection\Offer\ExportOfferCollection;
+ *
+ *
+ */
+class OffersExportRequest extends OffersExportFileRequest
+{
+ /**
+ * @inheritdoc
+ */
+ public function getResponseDecorator()
+ {
+ return new Decorator\CsvCollection(ExportOfferCollection::class);
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/FrontOperator/Request/Order/AdditionalField/UpdateAdditionalFieldsRequest.php b/src/Mirakl/MMP/FrontOperator/Request/Order/AdditionalField/UpdateAdditionalFieldsRequest.php
new file mode 100644
index 0000000..5c70df4
--- /dev/null
+++ b/src/Mirakl/MMP/FrontOperator/Request/Order/AdditionalField/UpdateAdditionalFieldsRequest.php
@@ -0,0 +1,135 @@
+
+ * [
+ * [
+ * 'type' => 'NUMERIC',
+ * 'code' => 'ecotax',
+ * 'value' => '42'
+ * ]
+ * ],
+ * 'order_lines' => [
+ * [
+ * 'order_line_id' => '1000',
+ * 'order_line_additional_fields' => [
+ * [
+ * 'type' => 'BOOLEAN',
+ * 'code' => 'gift-wrap',
+ * 'value' => 'true'
+ * ]
+ * ]
+ * ]
+ * ]
+ * ];
+ *
+ * $update = new UpdateAdditionalFields();
+ * $update->setOrderAdditionalFields($input['order_additional_fields']);
+ * $update->setOrderLines($input['order_lines']);
+ *
+ * // Building request with your order id
+ * $request = new UpdateAdditionalFieldsRequest('M2-QA-411-WHOLESALE000000020');
+ * $request->setOrderAdditionalFields($update);
+ *
+ * // Mirakl\MMP\FrontOperator\Domain\Order\AdditionalField\UpdateAdditionalFieldsResult
+ * $result = $client->updateOrderAdditionalFields($request);
+ *
+ * // Get Result
+ * // Mirakl\MMP\FrontOperator\Domain\Order\AdditionalField\UpdateAdditionalFieldsWithErrors
+ * var_dump($result->getOrderUpdateErrors());
+ *
+ * // Get updated additional fields
+ * // Mirakl\MMP\FrontOperator\Domain\Order\AdditionalField\UpdateAdditionalFields
+ * var_dump($result->getOrderUpdateResult());
+ *
+ * } catch (\Exception $e) {
+ * // An exception is thrown if the requested object is not found or if an error occurs
+ * var_dump($e->getMessage());
+ * }
+ *
+ */
+class UpdateAdditionalFieldsRequest extends AbstractOrderRequest
+{
+ /**
+ * @var string
+ */
+ protected $method = 'PUT';
+
+ /**
+ * @var string
+ */
+ protected $endpoint = '/orders/{order}/additional_fields';
+
+ /**
+ * @var array
+ */
+ public $bodyParams = ['order_additional_fields'];
+
+ /**
+ * @var array
+ */
+ protected static $dataTypes = [
+ 'order_additional_fields' => [UpdateAdditionalFields::class, 'create'],
+ ];
+
+ /**
+ * @inheritdoc
+ */
+ public function getResponseDecorator()
+ {
+ return new Decorator\Closure(function(ResponseInterface $response) {
+ $data = (new Decorator\AssocArray())->decorate($response);
+
+ $result = new UpdateAdditionalFieldsResult();
+
+ if (isset($data['order_update_result'])) {
+ $result->setOrderUpdateResult($data['order_update_result']);
+ }
+ if (isset($data['order_update_errors'])) {
+ $result->setOrderUpdateErrors($data['order_update_errors']);
+ }
+
+ return $result;
+ });
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function getBodyParams()
+ {
+ return $this->getOrderAdditionalFields()->toArray();
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/FrontOperator/Request/Order/Cancelation/CreateCancelationsRequest.php b/src/Mirakl/MMP/FrontOperator/Request/Order/Cancelation/CreateCancelationsRequest.php
new file mode 100644
index 0000000..4121693
--- /dev/null
+++ b/src/Mirakl/MMP/FrontOperator/Request/Order/Cancelation/CreateCancelationsRequest.php
@@ -0,0 +1,45 @@
+
+ * use Mirakl\MMP\Common\Domain\Order\Tax\OrderTaxAmount;
+ * use Mirakl\MMP\Front\Client\FrontApiClient;
+ * use Mirakl\MMP\FrontOperator\Domain\Order\Cancelation\CreateCancelation;
+ * use Mirakl\MMP\FrontOperator\Request\Order\Cancelation\CreateCancelationsRequest;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ *
+ * $createCancelation = new CreateCancelation();
+ * $createCancelation->setAmount(10.00);
+ * $createCancelation->setReasonCode('18');
+ * $createCancelation->setOrderLineId('OR01-A-1');
+ * $createCancelation->setQuantity(1);
+ * $createCancelation->setShippingAmount(1.00);
+ * $createCancelation->setCurrencyIsoCode('EUR');
+ * $createCancelation->setShippingTaxes([new OrderTaxAmount(1.53, 'VAT')]);
+ * $createCancelation->setTaxes([new OrderTaxAmount(0.98, 'GST')]);
+ *
+ * $request = new CreateCancelationsRequest([$createCancelation]);
+ *
+ * $result = $api->cancelOrderLines($request);
+ * // $result => @see \Mirakl\MMP\Common\Domain\Collection\Order\CancelationCreatedCollection
+ *
+ */
+class CreateCancelationsRequest extends AbstractCreateCancelationsRequest
+{
+ /**
+ * @inheritdoc
+ */
+ public function getResponseDecorator()
+ {
+ return CancelationCreatedCollection::decorator('cancelations');
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/FrontOperator/Request/Order/Document/DeleteOrderDocumentRequest.php b/src/Mirakl/MMP/FrontOperator/Request/Order/Document/DeleteOrderDocumentRequest.php
new file mode 100644
index 0000000..b9fe191
--- /dev/null
+++ b/src/Mirakl/MMP/FrontOperator/Request/Order/Document/DeleteOrderDocumentRequest.php
@@ -0,0 +1,46 @@
+
+ *
+ * deleteOrderDocument($request);
+ *
+ * var_dump(get_class($result));
+ * var_dump($result); // decorated response
+ *
+ * // You can also retrieve raw response by using run() method of API client:
+ * $result = $api->run($request); // or $api->raw()->deleteOrderDocument($request)
+ * //var_dump($result); // returns \Psr\Http\Message\ResponseInterface
+ *
+ * } catch (\Exception $e) {
+ * // An exception is thrown if object requested is not found or if an error occurs
+ * var_dump($e->getTraceAsString());
+ * }
+ *
+ */
+class DeleteOrderDocumentRequest extends AbstractDeleteOrderDocumentsRequest
+{}
+
diff --git a/src/Mirakl/MMP/FrontOperator/Request/Order/Evaluation/GetAssessmentsRequest.php b/src/Mirakl/MMP/FrontOperator/Request/Order/Evaluation/GetAssessmentsRequest.php
new file mode 100644
index 0000000..7c076c8
--- /dev/null
+++ b/src/Mirakl/MMP/FrontOperator/Request/Order/Evaluation/GetAssessmentsRequest.php
@@ -0,0 +1,44 @@
+
+ * use Mirakl\MMP\Common\Domain\Evaluation\AssessmentType;
+ * use Mirakl\MMP\Front\Client\FrontApiClient;
+ * use Mirakl\MMP\FrontOperator\Request\Order\Evaluation\GetAssessmentsRequest;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ *
+ * $request = new GetAssessmentsRequest();
+ * $request->setLocale('en_US');
+ *
+ * $result = $api->getAssessments($request);
+ * // $result => @see \Mirakl\MMP\Common\Domain\Collection\Evaluation\AssessmentCollection
+ *
+ */
+class GetAssessmentsRequest extends AbstractRequest
+{
+ use LocalizableTrait;
+
+ /**
+ * @var string
+ */
+ protected $endpoint = '/evaluations/assessments';
+
+ /**
+ * @inheritdoc
+ */
+ public function getResponseDecorator()
+ {
+ return AssessmentCollection::decorator('assessments');
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/FrontOperator/Request/Order/GetOrdersRequest.php b/src/Mirakl/MMP/FrontOperator/Request/Order/GetOrdersRequest.php
new file mode 100644
index 0000000..4bc1299
--- /dev/null
+++ b/src/Mirakl/MMP/FrontOperator/Request/Order/GetOrdersRequest.php
@@ -0,0 +1,72 @@
+
+ * use Mirakl\MMP\Front\Client\FrontApiClient;
+ * use Mirakl\MMP\FrontOperator\Request\Order\GetOrdersRequest;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ * $request = new GetOrdersRequest();
+ * // Optional parameters
+ * $request->setOrderIds(['ORDER_ID_1', 'ORDER_ID_2'])
+ * ->setOffset(10)
+ * ->setMax(25)
+ * ->setPaginate(false)
+ * ->setStartDate('2015-06-09')
+ * ->setEndDate('2015-06-30');
+ * $result = $api->getOrders($request);
+ * // $result => @see \Mirakl\MMP\Shop\Domain\Collection\Order\ShopOrderCollection
+ *
+ */
+class GetOrdersRequest extends AbstractGetOrdersRequest
+{
+ /**
+ * @var array
+ */
+ public $queryParams = [
+ 'order_ids',
+ 'order_states' => 'order_state_codes',
+ 'commercial_ids',
+ 'customer_ids',
+ 'offer_ids',
+ 'product_skus',
+ 'shop_ids',
+ 'start_update_date',
+ 'end_update_date',
+ 'channel_codes',
+ 'customer_debited',
+ 'payment_workflow',
+ 'only_null_channel',
+ 'has_incident',
+ ];
+
+ /**
+ * @inheritdoc
+ */
+ public function getResponseDecorator()
+ {
+ return OrderCollection::decorator('orders');
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/FrontOperator/Request/Order/Incident/AbstractIncidentRequest.php b/src/Mirakl/MMP/FrontOperator/Request/Order/Incident/AbstractIncidentRequest.php
new file mode 100644
index 0000000..ae1d72e
--- /dev/null
+++ b/src/Mirakl/MMP/FrontOperator/Request/Order/Incident/AbstractIncidentRequest.php
@@ -0,0 +1,38 @@
+ 'order_id',
+ '{line}' => 'order_line_id',
+ ];
+
+ /**
+ * @param string $orderId
+ * @param string $orderLineId
+ * @param string $reasonCode
+ */
+ public function __construct($orderId, $orderLineId, $reasonCode)
+ {
+ parent::__construct($orderId);
+ $this->setOrderLineId($orderLineId);
+ $this->setReasonCode($reasonCode);
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/FrontOperator/Request/Order/Incident/CloseIncidentRequest.php b/src/Mirakl/MMP/FrontOperator/Request/Order/Incident/CloseIncidentRequest.php
new file mode 100644
index 0000000..45476b4
--- /dev/null
+++ b/src/Mirakl/MMP/FrontOperator/Request/Order/Incident/CloseIncidentRequest.php
@@ -0,0 +1,31 @@
+
+ * use Mirakl\MMP\Front\Client\FrontApiClient;
+ * use Mirakl\MMP\FrontOperator\Request\Order\Incident\CloseIncidentRequest;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ *
+ * $request = new CloseIncidentRequest('ORDER_ID', 'ORDER_LINE_ID', 'REASON_CODE');
+ * $api->closeIncident($request);
+ *
+ *
+ */
+class CloseIncidentRequest extends AbstractIncidentRequest
+{
+ /**
+ * @var string
+ */
+ protected $method = 'PUT';
+
+ /**
+ * @var string
+ */
+ protected $endpoint = '/orders/{order}/lines/{line}/close_incident';
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/FrontOperator/Request/Order/Incident/OpenIncidentRequest.php b/src/Mirakl/MMP/FrontOperator/Request/Order/Incident/OpenIncidentRequest.php
new file mode 100644
index 0000000..ae48cc7
--- /dev/null
+++ b/src/Mirakl/MMP/FrontOperator/Request/Order/Incident/OpenIncidentRequest.php
@@ -0,0 +1,32 @@
+
+ * use Mirakl\MMP\Front\Client\FrontApiClient;
+ * use Mirakl\MMP\FrontOperator\Request\Order\Incident\CloseIncidentRequest;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ *
+ * $request = new CloseIncidentRequest('394IDJE-A', '394IDJE-A-1', '5');
+ *
+ * $api->closeIncident($request);
+ *
+ *
+ */
+class OpenIncidentRequest extends AbstractIncidentRequest
+{
+ /**
+ * @var string
+ */
+ protected $method = 'POST';
+
+ /**
+ * @var string
+ */
+ protected $endpoint = '/orders/{order}/lines/{line}/open_incident';
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/FrontOperator/Request/Order/Workflow/CancelOrderRequest.php b/src/Mirakl/MMP/FrontOperator/Request/Order/Workflow/CancelOrderRequest.php
new file mode 100644
index 0000000..8377c76
--- /dev/null
+++ b/src/Mirakl/MMP/FrontOperator/Request/Order/Workflow/CancelOrderRequest.php
@@ -0,0 +1,34 @@
+
+ * use Mirakl\MMP\Front\Client\FrontApiClient;
+ * use Mirakl\MMP\FrontOperator\Request\Order\Workflow\CancelOrderRequest;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ *
+ * $request = new CancelOrderRequest('ORDER_ID');
+ *
+ * $api->cancelOrder($request);
+ *
+ *
+ */
+class CancelOrderRequest extends AbstractOrderRequest
+{
+ /**
+ * @var string
+ */
+ protected $method = 'PUT';
+
+ /**
+ * @var string
+ */
+ protected $endpoint = '/orders/{order}/cancel';
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/FrontOperator/Request/Order/Workflow/ReceiveOrderRequest.php b/src/Mirakl/MMP/FrontOperator/Request/Order/Workflow/ReceiveOrderRequest.php
new file mode 100644
index 0000000..c64aa9a
--- /dev/null
+++ b/src/Mirakl/MMP/FrontOperator/Request/Order/Workflow/ReceiveOrderRequest.php
@@ -0,0 +1,34 @@
+
+ * use Mirakl\MMP\Front\Client\FrontApiClient;
+ * use Mirakl\MMP\FrontOperator\Request\Order\Workflow\ReceiveOrderRequest;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ *
+ * $request = new ReceiveOrderRequest('DKFSLFKZ-SDF993-A');
+ *
+ * $api->receiveOrder($request);
+ *
+ *
+ */
+class ReceiveOrderRequest extends AbstractOrderRequest
+{
+ /**
+ * @var string
+ */
+ protected $method = 'PUT';
+
+ /**
+ * @var string
+ */
+ protected $endpoint = '/orders/{order}/receive';
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/FrontOperator/Request/Order/Workflow/ToCollectOrderRequest.php b/src/Mirakl/MMP/FrontOperator/Request/Order/Workflow/ToCollectOrderRequest.php
new file mode 100644
index 0000000..9a0cc11
--- /dev/null
+++ b/src/Mirakl/MMP/FrontOperator/Request/Order/Workflow/ToCollectOrderRequest.php
@@ -0,0 +1,34 @@
+
+ * use Mirakl\MMP\Front\Client\FrontApiClient;
+ * use Mirakl\MMP\FrontOperator\Request\Order\Workflow\ToCollectOrderRequest;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ *
+ * $request = new ToCollectOrderRequest('DKFSLFKZ-SDF993-A');
+ *
+ * $api->collectOrder($request);
+ *
+ *
+ */
+class ToCollectOrderRequest extends AbstractOrderRequest
+{
+ /**
+ * @var string
+ */
+ protected $method = 'PUT';
+
+ /**
+ * @var string
+ */
+ protected $endpoint = '/orders/{order}/to_collect';
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/FrontOperator/Request/Payment/Debit/ConfirmOrderDebitRequest.php b/src/Mirakl/MMP/FrontOperator/Request/Payment/Debit/ConfirmOrderDebitRequest.php
new file mode 100644
index 0000000..7f7f369
--- /dev/null
+++ b/src/Mirakl/MMP/FrontOperator/Request/Payment/Debit/ConfirmOrderDebitRequest.php
@@ -0,0 +1,67 @@
+
+ * use Mirakl\MMP\Front\Client\FrontApiClient;
+ * use Mirakl\MMP\FrontOperator\Request\Payment\Debit\ConfirmOrderDebitRequest;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ *
+ * $input = ['orders'][
+ * 'amount' => 10,
+ * 'customer_id' => 'DFKFSOFK',
+ * 'order_id' => 'EOFKSEF',
+ * 'payment_status' => 'OK',
+ * 'transaction_date' => '2013-12-12T12:12:00.000+0000',
+ * 'transaction_number' => '57574ZEDZER42-QSDQF'
+ * ]
+ *
+ * $request = new ConfirmOrderDebitRequest($input['orders']);
+ * $api->confirmOrderDebit($request);
+ *
+ */
+class ConfirmOrderDebitRequest extends AbstractRequest
+{
+ /**
+ * @var string
+ */
+ protected $method = 'PUT';
+
+ /**
+ * @var string
+ */
+ protected $endpoint = '/payment/debit';
+
+ /**
+ * @var array
+ */
+ public $bodyParams = ['order_payments' => 'orders'];
+
+ /**
+ * @var array
+ */
+ protected static $dataTypes = [
+ 'order_payments' => [OrderPaymentCollection::class, 'create'],
+ ];
+
+ /**
+ * @param array|OrderPaymentCollection $orderPayments
+ */
+ public function __construct($orderPayments)
+ {
+ parent::__construct();
+ $this->setOrderPayments($orderPayments);
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/FrontOperator/Request/Payment/Debit/GetOrderDebitsRequest.php b/src/Mirakl/MMP/FrontOperator/Request/Payment/Debit/GetOrderDebitsRequest.php
new file mode 100644
index 0000000..c732b6c
--- /dev/null
+++ b/src/Mirakl/MMP/FrontOperator/Request/Payment/Debit/GetOrderDebitsRequest.php
@@ -0,0 +1,50 @@
+
+ * use Mirakl\MMP\Front\Client\FrontApiClient;
+ * use Mirakl\MMP\FrontOperator\Request\Payment\Debit\GetOrderDebitsRequest;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ *
+ * $request = new GetOrderDebitsRequest();
+ *
+ * $request->setOffset(1)
+ * ->setMax(5);
+ *
+ * $api->getOrderDebits($request);
+ *
+ */
+class GetOrderDebitsRequest extends AbstractRequest
+{
+ use PageableTrait;
+
+ /**
+ * @var string
+ */
+ protected $endpoint = '/payment/debit';
+
+ /**
+ * @inheritdoc
+ */
+ public function getResponseDecorator()
+ {
+ return new Decorator\Closure(function (ResponseInterface $response) {
+ $data = \Mirakl\parse_json_response($response);
+ $collection = new DebitOrderCollection($data['orders']['order'], $data['total_count']);
+
+ return $collection;
+ });
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/FrontOperator/Request/Payment/GetTransactionLogsRequest.php b/src/Mirakl/MMP/FrontOperator/Request/Payment/GetTransactionLogsRequest.php
new file mode 100644
index 0000000..b579b4e
--- /dev/null
+++ b/src/Mirakl/MMP/FrontOperator/Request/Payment/GetTransactionLogsRequest.php
@@ -0,0 +1,102 @@
+
+ * use Mirakl\MMP\Front\Client\FrontApiClient;
+ * use Mirakl\MMP\Commun\Domain\Payment\TransactionType;
+ * use Mirakl\MMP\Commun\Domain\Payment\TransactionLogState;
+ * use Mirakl\MMP\FrontOperator\Request\Payment\GetTransactionLogsRequest;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ * $request = new GetTransactionLogsRequest();
+ * $request->setMax(10)
+ * ->setOffset(0)
+ * ->setShopId('3249')
+ * ->setStartDate('2014-12-12')
+ * ->setEndDate('2014-12-12')
+ * ->setStartTransactionDate('2014-12-12')
+ * ->setEndTransactionDate('2014-12-12')
+ * ->setUpdatedSince('2014-12-12')
+ * ->setTransactionTypes([TransactionType::COMMISSION_FEE])
+ * ->setAccountingDocumentNumber('43902IRDJ')
+ * ->setPaymentVoucherNumber('3R93DJ')
+ * ->setPaymentStates([TransactionLogState::PAYABLE])
+ * ->setOrderIds(['349R34'])
+ * ->setOrderLineIds(['349R34-A'])
+ * ->setPaginate(true);
+ * $result = $api->getTransactionLogs($request);
+ * // $result => @see \Mirakl\MMP\Common\Domain\Collection\Payment\TransactionLogCollection
+ *
+ */
+class GetTransactionLogsRequest extends AbstractRequest
+{
+ use PageableTrait;
+ use DateRangeTrait;
+ use LocalizableTrait;
+
+ /**
+ * @var string
+ */
+ protected $endpoint = '/transactions_logs';
+
+ /**
+ * @var array
+ */
+ public $queryParams = [
+ 'shop_id' => 'shop_id',
+ 'start_transaction_date' => 'start_transaction_date',
+ 'end_transaction_date' => 'end_transaction_date',
+ 'updated_since' => 'updated_since',
+ 'payment_voucher_number' => 'payment_voucher',
+ 'payment_states' => 'payment_states',
+ 'transaction_types' => 'transaction_types',
+ 'accounting_document_number' => 'accounting_document_number',
+ 'order_ids' => 'order_ids',
+ 'order_line_ids' => 'order_line_ids',
+ ];
+
+ /**
+ * @inheritdoc
+ */
+ public function getResponseDecorator()
+ {
+ return TransactionLogCollection::decorator('lines');
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/FrontOperator/Request/Payment/Invoice/ConfirmAccountingDocumentPaymentRequest.php b/src/Mirakl/MMP/FrontOperator/Request/Payment/Invoice/ConfirmAccountingDocumentPaymentRequest.php
new file mode 100644
index 0000000..d447e62
--- /dev/null
+++ b/src/Mirakl/MMP/FrontOperator/Request/Payment/Invoice/ConfirmAccountingDocumentPaymentRequest.php
@@ -0,0 +1,72 @@
+
+ * use Mirakl\MMP\FrontOperator\Client\FrontOperatorApiClient;
+ * use Mirakl\MMP\FrontOperator\Domain\Collection\Invoice\AccountingDocumentPaymentConfirmationCollection;
+ * use Mirakl\MMP\FrontOperator\Domain\Invoice\AccountingDocumentPaymentConfirmation;
+ * use Mirakl\MMP\FrontOperator\Request\Payment\Invoice\ConfirmAccountingDocumentPaymentRequest;
+ *
+ * $api = new FrontOperatorApiClient('API_URL', 'API_KEY');
+ *
+ * $document = new AccountingDocumentPaymentConfirmation();
+ * $document->setInvoiceId('2003');
+ * $document->setAmount(10.00);
+ * $document->setCurrencyIsoCode('EUR');
+ * $document->setReference('REF_007');
+ * $document->setTransactionDate(new \DateTime('2018-10-12 12:12:00'));
+ *
+ * $documents = new AccountingDocumentPaymentConfirmationCollection();
+ * $documents->add($document);
+ *
+ * $request = new ConfirmAccountingDocumentPaymentRequest($documents);
+ *
+ * $api->confirmAccountingDocumentPayment($request);
+ * => no response output, should give 204 response status (success)
+ *
+ */
+class ConfirmAccountingDocumentPaymentRequest extends AbstractRequest
+{
+ /**
+ * @var string
+ */
+ protected $method = 'PUT';
+
+ /**
+ * @var string
+ */
+ protected $endpoint = '/invoices/confirm';
+
+ /**
+ * @var array
+ */
+ public $bodyParams = ['accounting_documents'];
+
+ /**
+ * @var array
+ */
+ protected static $dataTypes = [
+ 'accounting_documents' => [DocumentCollection::class, 'create'],
+ ];
+
+ /**
+ * @param array|DocumentCollection $accountingDocuments
+ */
+ public function __construct($accountingDocuments)
+ {
+ parent::__construct();
+ $this->setAccountingDocuments($accountingDocuments);
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/FrontOperator/Request/Payment/Refund/ConfirmOrderRefundRequest.php b/src/Mirakl/MMP/FrontOperator/Request/Payment/Refund/ConfirmOrderRefundRequest.php
new file mode 100644
index 0000000..f07c49f
--- /dev/null
+++ b/src/Mirakl/MMP/FrontOperator/Request/Payment/Refund/ConfirmOrderRefundRequest.php
@@ -0,0 +1,67 @@
+
+ * use Mirakl\MMP\Front\Client\FrontApiClient;
+ * use Mirakl\MMP\FrontOperator\Request\Payment\Refund\ConfirmOrderRefundRequest;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ *
+ * $input = ['refunds' => [
+ * 'amount' => 255.00,
+ * 'refund_id' => '1101',
+ * 'payment_status' => 'OK',
+ * 'transaction_date' => '2013-12-12T12:12:00.000+0000',
+ * 'transaction_number' => '49R349IUR34'
+ * ]
+ * ]
+ *
+ * $request = new ConfirmOrderRefundRequest($input['refunds']);
+ *
+ * $api->confirmOrderRefund($request);
+ *
+ */
+class ConfirmOrderRefundRequest extends AbstractRequest
+{
+ /**
+ * @var string
+ */
+ protected $method = 'PUT';
+
+ /**
+ * @var string
+ */
+ protected $endpoint = '/payment/refund';
+
+ /**
+ * @var array
+ */
+ public $bodyParams = ['refunds'];
+
+ /**
+ * @var array
+ */
+ protected static $dataTypes = [
+ 'refunds' => [OrderLineRefundCollection::class, 'create'],
+ ];
+
+ /**
+ * @param array|OrderLineRefundCollection $refunds
+ */
+ public function __construct($refunds)
+ {
+ parent::__construct();
+ $this->setRefunds($refunds);
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/FrontOperator/Request/Payment/Refund/GetOrderRefundsRequest.php b/src/Mirakl/MMP/FrontOperator/Request/Payment/Refund/GetOrderRefundsRequest.php
new file mode 100644
index 0000000..8c1f4e0
--- /dev/null
+++ b/src/Mirakl/MMP/FrontOperator/Request/Payment/Refund/GetOrderRefundsRequest.php
@@ -0,0 +1,57 @@
+
+ * use Mirakl\MMP\Front\Client\FrontApiClient;
+ * use Mirakl\MMP\FrontOperator\Request\Payment\Refund\GetOrderRefundsRequest;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ *
+ * $request = new GetOrderRefundsRequest();
+ *
+ * $request->setOffset(1)
+ * ->setMax(5);
+ *
+ * $api->getOrderRefunds($request);
+ *
+ */
+class GetOrderRefundsRequest extends AbstractRequest
+{
+ use PageableTrait;
+
+ /**
+ * @var string
+ */
+ protected $endpoint = '/payment/refund';
+
+ /**
+ * @var array
+ */
+ protected static $dataTypes = [
+ 'refunds' => [RefundOrderCollection::class, 'create'],
+ ];
+
+ /**
+ * @inheritdoc
+ */
+ public function getResponseDecorator()
+ {
+ return new Decorator\Closure(function (ResponseInterface $response) {
+ $data = \Mirakl\parse_json_response($response);
+ $collection = new RefundOrderCollection($data['orders']['order'], $data['total_count']);
+
+ return $collection;
+ });
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/FrontOperator/Request/Product/Offer/GetOffersOnProductsRequest.php b/src/Mirakl/MMP/FrontOperator/Request/Product/Offer/GetOffersOnProductsRequest.php
new file mode 100644
index 0000000..870d0e6
--- /dev/null
+++ b/src/Mirakl/MMP/FrontOperator/Request/Product/Offer/GetOffersOnProductsRequest.php
@@ -0,0 +1,59 @@
+
+ * use Mirakl\MMP\Front\Client\FrontApiClient;
+ * use Mirakl\MMP\FrontOperator\Request\Product\Offer\GetOffersOnProductsRequest;
+ * use Mirakl\MMP\FrontOperator\Domain\Product\Offer\OfferOnProduct;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ *
+ * $request = new GetOffersOnProductsRequest(['PRODUCT_ID_1', 'PRODUCT_ID_2'], ['OFFER_STATE_CODE_1']);
+ * $request->setPricingChannelCode('CHANNEL_1');
+ * $request->setShopIds(['SHOP_1', 'SHOP_2']);
+ *
+ * $result = $api->getOffersOnProducts($request);
+ * // $result => @see \Mirakl\MMP\Shop\Domain\Collection\Product\Offer\ProductWithOffersCollection
+ *
+ */
+class GetOffersOnProductsRequest extends AbstractGetOffersOnProductsRequest
+{
+ /**
+ * @var array
+ */
+ public $queryParams = [
+ 'product_ids',
+ 'offer_state_codes',
+ 'premium',
+ 'all_offers',
+ 'channel_codes',
+ 'all_channels',
+ 'product_references',
+ 'pricing_channel_code',
+ 'shop_ids'
+ ];
+
+ /**
+ * @inheritdoc
+ */
+ public function getResponseDecorator()
+ {
+ return ProductWithOffersCollection::decorator('products');
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/FrontOperator/Request/Promotion/GetPromotionWithOffersRequest.php b/src/Mirakl/MMP/FrontOperator/Request/Promotion/GetPromotionWithOffersRequest.php
new file mode 100644
index 0000000..8439afd
--- /dev/null
+++ b/src/Mirakl/MMP/FrontOperator/Request/Promotion/GetPromotionWithOffersRequest.php
@@ -0,0 +1,101 @@
+
+ * use Mirakl\MMP\Common\Domain\AdditionalFieldValue;
+ * use Mirakl\MMP\Common\Domain\Product\Offer\ProductReference;
+ * use Mirakl\MMP\Front\Client\FrontApiClient;
+ * use Mirakl\MMP\FrontOperator\Domain\Offer;
+ * use Mirakl\MMP\FrontOperator\Request\Promotion\GetPromotionWithOffersRequest;
+ *
+ * $request = new GetPromotionWithOffersRequest('123L','GOOD_SUMMER_BARGAIN_2017');
+ *
+ * $request->setOfferType(GetPromotionWithOffersRequest::OFFER_TYPE_REWARD)
+ * ->setLocale('fr_FR')
+ * ->setOffset(1)
+ * ->setMax(5)
+ * ->setPricingChannelCode('WEB')
+ * ->setSortBy('productTitle')
+ * ->sortDesc();
+ * $result = $api->getPromotionWithOffers($request);
+ * // $result => @see \Mirakl\MMP\FrontOperator\Domain\Promotion\PromotionWithOffers;
+ *
+ */
+class GetPromotionWithOffersRequest extends AbstractRequest
+{
+ use LocalizableTrait;
+ use PageableTrait;
+ use SortableTrait;
+
+ /**
+ * (DEFAULT) Wanted offer promotion type ALL
+ */
+ const OFFER_TYPE_ALL = 'ALL';
+
+ /**
+ * Wanted offer promotion type REWARD
+ */
+ const OFFER_TYPE_REWARD = 'REWARD';
+
+ /**
+ * Wanted offer promotion type TRIGGER
+ */
+ const OFFER_TYPE_TRIGGER = 'TRIGGER';
+
+ /**
+ * @var string
+ */
+ protected $endpoint = '/promotions/{shop_id}/{promotion_internal_id}';
+
+ /**
+ * @var array
+ */
+ protected $uriVars = [
+ '{shop_id}' => 'shop_id',
+ '{promotion_internal_id}' => 'promotion_internal_id'
+ ];
+
+ /**
+ * @var array
+ */
+ public $queryParams = ['offer_type', 'pricing_channel_code', 'locale'];
+
+ /**
+ * @param string $shopId
+ * @param int $promotionInternalId
+ */
+ public function __construct($shopId, $promotionInternalId)
+ {
+ parent::__construct();
+ $this->setShopId($shopId);
+ $this->setPromotionInternalId($promotionInternalId);
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function getResponseDecorator()
+ {
+ return PromotionWithOffers::decorator();
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/FrontOperator/Request/Promotion/GetPromotionsRequest.php b/src/Mirakl/MMP/FrontOperator/Request/Promotion/GetPromotionsRequest.php
new file mode 100644
index 0000000..cca4113
--- /dev/null
+++ b/src/Mirakl/MMP/FrontOperator/Request/Promotion/GetPromotionsRequest.php
@@ -0,0 +1,78 @@
+
+ * use Mirakl\MMP\Front\Client\FrontApiClient;
+ * use Mirakl\MMP\FrontOperator\Domain\Collection\Promotion\PromotionCollection;
+ * use Mirakl\MMP\FrontOperator\Domain\Promotion\Promotion;
+ * use Mirakl\MMP\FrontOperator\Domain\Promotion\PromotionIdentifier;
+ * use Mirakl\MMP\FrontOperator\Request\Promotion\GetPromotionsRequest;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ *
+ * $request = new GetPromotionsRequest();
+ * $request->setIds([new PromotionIdentifier('1', '2'), new PromotionIdentifier('3', '4')])
+ * ->setShopIds(['5', '6'])
+ * ->setStates([Promotion::STATE_ACTIVE, Promotion::STATE_PENDING])
+ * ->setTypes([Promotion::TYPE_AMOUNT_OFF, Promotion::TYPE_FREE_ITEMS])
+ * ->setDateCreatedFrom($this->createDateTime('2016-10-12 15:45:12'))
+ * ->setDateCreatedTo($this->createDateTime('2017-10-12 15:45:12'))
+ * ->setEndingAfter($this->createDateTime('2018-10-12 15:45:12'))
+ * ->setStartingBefore($this->createDateTime('2019-10-12 15:45:12'))
+ * ->setLocale('en_US')
+ * ->setTriggerOfferIds(['1100', '1101'])
+ * ->setRewardOfferIds(['2200', '2201'])
+ * ->setChannelCodes(['CA', 'FR'])
+ * ->setMax(5)
+ * ->setOffset(1)
+ * ->setSortBy('dateCreated')
+ * ->sortAsc();
+ *
+ * $result = $api->getPromotions($request);
+ * // $result => @see \Mirakl\MMP\FrontOperator\Domain\Collection\Promotion\PromotionCollection
+ *
+ */
+class GetPromotionsRequest extends AbstractGetPromotionsRequest
+{
+ /**
+ * @var array
+ */
+ protected static $dataTypes = [
+ 'ids' => [PromotionIdentifierCollection::class, 'create'],
+ ];
+
+ /**
+ * @inheritdoc
+ */
+ public function getQueryParams()
+ {
+ $params = parent::getQueryParams();
+ if (isset($params['ids'])) {
+ $params['ids'] = \Mirakl\tuples_to_query_param($this->getIds()->toArray());
+ }
+
+ return $params;
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function getResponseDecorator()
+ {
+ return PromotionCollection::decorator('promotions');
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/FrontOperator/Request/Promotion/PromotionOffersMappingFileRequest.php b/src/Mirakl/MMP/FrontOperator/Request/Promotion/PromotionOffersMappingFileRequest.php
new file mode 100644
index 0000000..47ba418
--- /dev/null
+++ b/src/Mirakl/MMP/FrontOperator/Request/Promotion/PromotionOffersMappingFileRequest.php
@@ -0,0 +1,54 @@
+
+ * use Mirakl\MMP\Front\Client\FrontApiClient;
+ * use Mirakl\MMP\FrontOperator\Request\Promotion\PromotionOffersMappingFileRequest;
+ *
+ * $request = new PromotionOffersMappingFileRequest($this->createDateTime('2017-10-15 10:15:12'));
+ * $result = $api->exportPromotionOffersMapping($request);
+ * // $result => @see \Mirakl\Core\FileWrapper
+ *
+ */
+class PromotionOffersMappingFileRequest extends AbstractRequest
+{
+ use CsvResponseDecorator;
+
+ /**
+ * @var string
+ */
+ protected $endpoint = '/promotions/offers';
+
+ /**
+ * @var array
+ */
+ public $queryParams = ['last_request_date'];
+
+ /**
+ * @param string|\Datetime $lastRequestDate
+ */
+ public function __construct($lastRequestDate = null)
+ {
+ parent::__construct();
+ if (null !== $lastRequestDate) {
+ $this->setLastRequestDate($lastRequestDate);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/FrontOperator/Request/Promotion/PromotionOffersMappingRequest.php b/src/Mirakl/MMP/FrontOperator/Request/Promotion/PromotionOffersMappingRequest.php
new file mode 100644
index 0000000..2f7c78a
--- /dev/null
+++ b/src/Mirakl/MMP/FrontOperator/Request/Promotion/PromotionOffersMappingRequest.php
@@ -0,0 +1,34 @@
+
+ * use Mirakl\MMP\Front\Client\FrontApiClient;
+ * use Mirakl\MMP\FrontOperator\Request\Promotion\PromotionOffersMappingFileRequest;
+ *
+ * $request = new PromotionOffersMappingFileRequest($this->createDateTime('2017-10-15 10:15:12'));
+ * $result = $api->exportPromotionOffersMapping($request);
+ * // $result => @see \Mirakl\MMP\FrontOperator\Domain\Collection\Promotion\PromotionOffersMappingCollection
+ *
+ */
+class PromotionOffersMappingRequest extends PromotionOffersMappingFileRequest
+{
+ /**
+ * @inheritdoc
+ */
+ public function getResponseDecorator()
+ {
+ return new Decorator\CsvCollection(PromotionOffersMappingCollection::class);
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/FrontOperator/Request/Reason/GetReasonsRequest.php b/src/Mirakl/MMP/FrontOperator/Request/Reason/GetReasonsRequest.php
new file mode 100644
index 0000000..0ab5b58
--- /dev/null
+++ b/src/Mirakl/MMP/FrontOperator/Request/Reason/GetReasonsRequest.php
@@ -0,0 +1,41 @@
+
+ * use Mirakl\MMP\Common\Domain\Reason\ReasonType;
+ * use Mirakl\MMP\Front\Client\FrontApiClient;
+ * use Mirakl\MMP\FrontOperator\Request\Reason\GetReasonsRequest;
+ *
+ * $request = new GetReasonsRequest();
+ * $result = $api->getReasons($request);
+ * // $result => @see \Mirakl\MMP\FrontOperator\Domain\Collection\Reason\ReasonCollection
+ *
+ */
+class GetReasonsRequest extends AbstractRequest
+{
+ use LocalizableTrait;
+
+ /**
+ * @var string
+ */
+ protected $endpoint = '/reasons';
+
+ /**
+ * @inheritdoc
+ */
+ public function getResponseDecorator()
+ {
+ return ReasonCollection::decorator('reasons');
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/FrontOperator/Request/Reason/GetTypeReasonsRequest.php b/src/Mirakl/MMP/FrontOperator/Request/Reason/GetTypeReasonsRequest.php
new file mode 100644
index 0000000..bbc64ff
--- /dev/null
+++ b/src/Mirakl/MMP/FrontOperator/Request/Reason/GetTypeReasonsRequest.php
@@ -0,0 +1,49 @@
+
+ * use Mirakl\MMP\Front\Client\FrontApiClient;
+ * use Mirakl\MMP\FrontOperator\Request\Reason\GetTypeReasonsRequest;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ *
+ * $request = new GetTypeReasonsRequest();
+ *
+ * $result = $api->getTypeReasons($request);
+ * // $result => @see \Mirakl\MMP\FrontOperator\Domain\Collection\Reason\ReasonCollection
+ *
+ */
+class GetTypeReasonsRequest extends GetReasonsRequest
+{
+ /**
+ * @var string
+ */
+ protected $endpoint = '/reasons/{reason_type}';
+
+ /**
+ * @var array
+ */
+ protected $uriVars = [
+ '{reason_type}' => 'reason_type',
+ ];
+
+ /**
+ * @param string $reasonType
+ */
+ public function __construct($reasonType = ReasonType::INCIDENT_OPEN)
+ {
+ parent::__construct();
+ $this->setReasonType($reasonType);
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/FrontOperator/Request/Shipment/CreateShipmentsRequest.php b/src/Mirakl/MMP/FrontOperator/Request/Shipment/CreateShipmentsRequest.php
new file mode 100644
index 0000000..e51d150
--- /dev/null
+++ b/src/Mirakl/MMP/FrontOperator/Request/Shipment/CreateShipmentsRequest.php
@@ -0,0 +1,46 @@
+
+ * use Mirakl\MMP\Front\Client\FrontApiClient;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ *
+ * $shipmentsLine1 = new \Mirakl\MMP\Common\Domain\Shipment\ShipmentLine();
+ * $shipmentsLine1->setOfferSku('22265148670033');
+ * $shipmentsLine1->setQuantity(1);
+ * $shipmentsLine2 = new \Mirakl\MMP\Common\Domain\Shipment\ShipmentLine();
+ * $shipmentsLine2->setOfferSku('22265145819217');
+ * $shipmentsLine2->setQuantity(1);
+ * $shipmentsLines = new \Mirakl\MMP\Common\Domain\Collection\Shipment\ShipmentLineCollection();
+ * $shipmentsLines->add($shipmentsLine1);
+ * $shipmentsLines->add($shipmentsLine2);
+ *
+ * $tracking = new \Mirakl\MMP\Common\Domain\Shipment\ShipmentTracking();
+ * $tracking->setCarrierCode('UPS');
+ * $tracking->setCarrierName('UPS');
+ * $tracking->setTrackingNumber('123456798');
+ *
+ * $shipment = new \Mirakl\MMP\Common\Domain\Shipment\CreateShipment();
+ * $shipment->setOrderId('MIR_000000023-A');
+ * $shipment->setShipmentLines($shipmentsLines);
+ * $shipment->setTracking($tracking);
+ *
+ * $shipments = new \Mirakl\MMP\Common\Domain\Collection\Shipment\CreateShipmentCollection();
+ * $shipments->add($shipment);
+ *
+ * $request = new \Mirakl\MMP\FrontOperator\Request\Shipment\CreateShipmentsRequest($shipments);
+ * $result = $api->createShipments($request);
+ *
+ * var_dump($result); // @see \Mirakl\MMP\Common\Domain\Shipment\CreatedShipments
+ *
+ */
+class CreateShipmentsRequest extends AbstractCreateShipmentsRequest
+{}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/FrontOperator/Request/Shipment/GetShipmentsRequest.php b/src/Mirakl/MMP/FrontOperator/Request/Shipment/GetShipmentsRequest.php
new file mode 100644
index 0000000..bd53879
--- /dev/null
+++ b/src/Mirakl/MMP/FrontOperator/Request/Shipment/GetShipmentsRequest.php
@@ -0,0 +1,36 @@
+
+ * use Mirakl\MMP\Front\Client\FrontApiClient;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ *
+ * $request = new \Mirakl\MMP\FrontOperator\Request\Shipment\GetShipmentsRequest();
+ * $request->addOrderId('ORD-123');
+ * $request->addShipmentStateCode(\Mirakl\MMP\Common\Domain\Shipment\ShipmentStatus::SHIPPED);
+ *
+ * $result = $api->getShipments($request);
+ *
+ * var_dump($result); // @see \Mirakl\MMP\Common\Domain\Collection\SeekableCollection
+ *
+ * // Loop on collection with $result->getCollection()
+ *
+ * // Get next results with token from response:
+ * $request = new \Mirakl\MMP\FrontOperator\Request\Shipment\GetShipmentsRequest();
+ * $request->setPageToken($result->getNextPageToken());
+ * $result = $api->getShipments($request);
+ * var_dump($result); // @see \Mirakl\MMP\Common\Domain\Collection\SeekableCollection
+ *
+ * // See also previous token: @see \Mirakl\MMP\Common\Domain\Collection\SeekableCollection::getPreviousPageToken()
+ *
+ */
+class GetShipmentsRequest extends AbstractGetShipmentsRequest
+{}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/FrontOperator/Request/Shipment/ReceiveShipmentsRequest.php b/src/Mirakl/MMP/FrontOperator/Request/Shipment/ReceiveShipmentsRequest.php
new file mode 100644
index 0000000..a8e1f1f
--- /dev/null
+++ b/src/Mirakl/MMP/FrontOperator/Request/Shipment/ReceiveShipmentsRequest.php
@@ -0,0 +1,32 @@
+
+ * use Mirakl\MMP\Front\Client\FrontApiClient;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ *
+ * $shipments = [
+ * ['id' => '9d6290c3-8b25-43c0-b448-914d0aab38c0'],
+ * ['id' => 'c8a18e47-9542-4c86-a770-50caa744abb6'],
+ * ['id' => '319d9463-e7b2-40a2-849c-32ebd8619398'],
+ * ];
+ * $request = new \Mirakl\MMP\FrontOperator\Request\Shipment\ReceiveShipmentsRequest($shipments);
+ *
+ * $result = $api->receiveShipments($request);
+ *
+ * var_dump($result); // @see \Mirakl\MMP\Common\Domain\Shipment\Workflow\ShipmentWorkflowResponse
+ *
+ * // $result->getShipmentErrors()
+ * // $result->getShipmentSuccess()
+ *
+ */
+class ReceiveShipmentsRequest extends AbstractReceiveShipmentsRequest
+{}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/FrontOperator/Request/Shipment/ShipShipmentsRequest.php b/src/Mirakl/MMP/FrontOperator/Request/Shipment/ShipShipmentsRequest.php
new file mode 100644
index 0000000..9ee8230
--- /dev/null
+++ b/src/Mirakl/MMP/FrontOperator/Request/Shipment/ShipShipmentsRequest.php
@@ -0,0 +1,32 @@
+
+ * use Mirakl\MMP\Front\Client\FrontApiClient;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ *
+ * $shipments = [
+ * ['id' => '9d6290c3-8b25-43c0-b448-914d0aab38c0'],
+ * ['id' => 'c8a18e47-9542-4c86-a770-50caa744abb6'],
+ * ['id' => '319d9463-e7b2-40a2-849c-32ebd8619398'],
+ * ];
+ * $request = new \Mirakl\MMP\FrontOperator\Request\Shipment\ShipShipmentsRequest($shipments);
+ *
+ * $result = $api->shipShipments($request);
+ *
+ * var_dump($result); // @see \Mirakl\MMP\Common\Domain\Shipment\Workflow\ShipmentWorkflowResponse
+ *
+ * // $result->getShipmentErrors()
+ * // $result->getShipmentSuccess()
+ *
+ */
+class ShipShipmentsRequest extends AbstractShipShipmentsRequest
+{}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/FrontOperator/Request/Shipment/ToCollectShipmentsRequest.php b/src/Mirakl/MMP/FrontOperator/Request/Shipment/ToCollectShipmentsRequest.php
new file mode 100644
index 0000000..f2d29bc
--- /dev/null
+++ b/src/Mirakl/MMP/FrontOperator/Request/Shipment/ToCollectShipmentsRequest.php
@@ -0,0 +1,32 @@
+
+ * use Mirakl\MMP\Front\Client\FrontApiClient;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ *
+ * $shipments = [
+ * ['id' => '9d6290c3-8b25-43c0-b448-914d0aab38c0'],
+ * ['id' => 'c8a18e47-9542-4c86-a770-50caa744abb6'],
+ * ['id' => '319d9463-e7b2-40a2-849c-32ebd8619398'],
+ * ];
+ * $request = new \Mirakl\MMP\FrontOperator\Request\Shipment\ToCollectShipmentsRequest($shipments);
+ *
+ * $result = $api->toCollectShipments($request);
+ *
+ * var_dump($result); // @see \Mirakl\MMP\Common\Domain\Shipment\Workflow\ShipmentWorkflowResponse
+ *
+ * // $result->getShipmentErrors()
+ * // $result->getShipmentSuccess()
+ *
+ */
+class ToCollectShipmentsRequest extends AbstractToCollectShipmentsRequest
+{}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/FrontOperator/Request/Shipment/UpdateShipmentTrackingsRequest.php b/src/Mirakl/MMP/FrontOperator/Request/Shipment/UpdateShipmentTrackingsRequest.php
new file mode 100644
index 0000000..7e7c175
--- /dev/null
+++ b/src/Mirakl/MMP/FrontOperator/Request/Shipment/UpdateShipmentTrackingsRequest.php
@@ -0,0 +1,35 @@
+
+ * use Mirakl\MMP\Front\Client\FrontApiClient;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ *
+ * $shipments = [
+ * ['id' => '9d6290c3-8b25-43c0-b448-914d0aab38c0'],
+ * ['id' => 'c8a18e47-9542-4c86-a770-50caa744abb6'],
+ * ['id' => '319d9463-e7b2-40a2-849c-32ebd8619398'],
+ * ];
+ * $request = new \Mirakl\MMP\FrontOperator\Request\Shipment\UpdateShipmentTrackingsRequest($shipments);
+ *
+ * $result = $api->updateShipmentTrackings($request);
+ *
+ * var_dump($result); // @see \Mirakl\MMP\Common\Domain\Shipment\Workflow\ShipmentWorkflowResponse
+ *
+ * // $result->getShipmentErrors()
+ * // $result->getShipmentSuccess()
+ *
+ */
+class UpdateShipmentTrackingsRequest extends AbstractUpdateShipmentTrackingsRequest
+{}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/FrontOperator/Request/Shop/AbstractCreateShopsRequest.php b/src/Mirakl/MMP/FrontOperator/Request/Shop/AbstractCreateShopsRequest.php
new file mode 100644
index 0000000..c75fe47
--- /dev/null
+++ b/src/Mirakl/MMP/FrontOperator/Request/Shop/AbstractCreateShopsRequest.php
@@ -0,0 +1,34 @@
+
+ *
+ * deleteShopDocument($request);
+ *
+ * var_dump(get_class($result));
+ * var_dump($result); // decorated response
+ *
+ * // You can also retrieve raw response by using run() method of API client:
+ * $result = $api->run($request); // or $api->raw()->deleteShopDocument($request)
+ * //var_dump($result); // returns \Psr\Http\Message\ResponseInterface
+ *
+ * } catch (\Exception $e) {
+ * // An exception is thrown if object requested is not found or if an error occurs
+ * var_dump($e->getTraceAsString());
+ * }
+ *
+ */
+class DeleteShopDocumentRequest extends AbstractDeleteShopDocumentRequest
+{}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/FrontOperator/Request/Shop/Document/DownloadShopsDocumentsRequest.php b/src/Mirakl/MMP/FrontOperator/Request/Shop/Document/DownloadShopsDocumentsRequest.php
new file mode 100644
index 0000000..8648450
--- /dev/null
+++ b/src/Mirakl/MMP/FrontOperator/Request/Shop/Document/DownloadShopsDocumentsRequest.php
@@ -0,0 +1,50 @@
+
+ * When documents are retrieved, they're wrapped into a ZIP archive except + * when only one document id is specified. The tree structure of this archive is as follow: + *
+ * documents-timestamp.zip + * |__ shop_id/ + * | |__ image.png + * | |__ image(1).png + * | |__ foo.txt + *+ * + * + * Example: + * + *
+ * use Mirakl\MMP\Front\Client\FrontApiClient;
+ * use Mirakl\MMP\Front\Request\Shop\Document\DownloadShopDocumentsRequest;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ * $request = new DownloadShopDocumentsRequest();
+ * $request->setDocumentIds(['DOCUMENT_ID_1', 'DOCUMENT_ID_2']);
+ * $request->setShopIds(['SHOP_ID_1', 'SHOP_ID_2'])
+ * $result = $api->downloadShopDocuments($request);
+ * // $result => @see \Mirakl\Core\Domain\FileWrapper
+ * // Download file:
+ * $result->download();
+ *
+ */
+class DownloadShopsDocumentsRequest extends AbstractDownloadShopsDocumentsRequest
+{}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/FrontOperator/Request/Shop/Document/GetShopDocumentsRequest.php b/src/Mirakl/MMP/FrontOperator/Request/Shop/Document/GetShopDocumentsRequest.php
new file mode 100644
index 0000000..afe2245
--- /dev/null
+++ b/src/Mirakl/MMP/FrontOperator/Request/Shop/Document/GetShopDocumentsRequest.php
@@ -0,0 +1,31 @@
+
+ * use Mirakl\MMP\Front\Client\FrontApiClient;
+ * use Mirakl\MMP\FrontOperator\Request\Shop\Document\GetShopDocumentsRequest;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ * $request = new GetShopDocumentsRequest(['SHOP_ID_1', 'SHOP_ID_2']);
+ * // $result => @see \Mirakl\MMP\Common\Domain\Collection\Shop\Document\ShopDocumentCollection
+ *
+ */
+class GetShopDocumentsRequest extends AbstractGetShopDocumentsRequest
+{
+ /**
+ * @var array
+ */
+ public $queryParams = ['shop_ids', 'updated_since', 'include_deleted'];
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/FrontOperator/Request/Shop/Document/UploadShopDocumentsRequest.php b/src/Mirakl/MMP/FrontOperator/Request/Shop/Document/UploadShopDocumentsRequest.php
new file mode 100644
index 0000000..04bce78
--- /dev/null
+++ b/src/Mirakl/MMP/FrontOperator/Request/Shop/Document/UploadShopDocumentsRequest.php
@@ -0,0 +1,31 @@
+
+ * The following extensions are supported: csv, doc, xls, ppt, pdf, odt, ods, odp, txt, rtf, png, jpg, gif, zip.
+ * NB. A shop can have a maximum of 50 documents.
+ *
+ * Example:
+ *
+ *
+ * use Mirakl\Core\Domain\Collection\DocumentCollection;
+ * use Mirakl\Core\Domain\Document;
+ * use Mirakl\MMP\FrontOperator\Client\FrontOperatorApiClient;
+ * use Mirakl\MMP\FrontOperator\Request\Shop\Document\UploadShopDocumentsRequest;
+ *
+ * $api = new FrontOperatorApiClient('API_URL', 'API_KEY');
+ * $file = new \SplFileObject('/path/to/file.pdf');
+ * $docs = new DocumentCollection();
+ * $docs->add(new Document($file, 'this is the document contents', 'ANOTHER_SPECIAL_FILE'));
+ * $request = new UploadShopDocumentsRequest($docs, 'SHOP_ID');
+ * $result = $api->uploadShopDocuments($request);
+ * // $result => @see \Mirakl\MMP\Common\Domain\Document\DocumentsUploadResult
+ *
+ */
+class UploadShopDocumentsRequest extends AbstractUploadShopDocumentsRequest
+{}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/FrontOperator/Request/Shop/GetShopEvaluationsRequest.php b/src/Mirakl/MMP/FrontOperator/Request/Shop/GetShopEvaluationsRequest.php
new file mode 100644
index 0000000..27cd8bf
--- /dev/null
+++ b/src/Mirakl/MMP/FrontOperator/Request/Shop/GetShopEvaluationsRequest.php
@@ -0,0 +1,56 @@
+
+ * use Mirakl\MMP\Front\Client\FrontApiClient;
+ * use Mirakl\MMP\FrontOperator\Request\Shop\GetShopEvaluationsRequest;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ * $request = new GetShopEvaluationsRequest('2008');
+ *
+ * $result = $api->getShopEvaluations($request);
+ * // $result => @see \Mirakl\MMP\Common\Domain\Collection\Evaluation\EvaluationCollection
+ *
+ */
+class GetShopEvaluationsRequest extends AbstractShopRequest
+{
+ use LocalizableTrait;
+ use PageableTrait;
+ use SortableTrait;
+
+ // (DEFAULT) Sort by creation date
+ const SORT_BY_DATE = 'date';
+
+ // Sort by grade
+ const SORT_BY_GRADE = 'grade';
+
+ /**
+ * @var string
+ */
+ protected $endpoint = '/shops/{shop}/evaluations';
+
+ /**
+ * @inheritdoc
+ */
+ public function getResponseDecorator()
+ {
+ return EvaluationCollection::decorator('evaluations');
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/FrontOperator/Request/Shop/GetShopsRequest.php b/src/Mirakl/MMP/FrontOperator/Request/Shop/GetShopsRequest.php
new file mode 100644
index 0000000..c13ce6f
--- /dev/null
+++ b/src/Mirakl/MMP/FrontOperator/Request/Shop/GetShopsRequest.php
@@ -0,0 +1,63 @@
+
+ * use Mirakl\MMP\Front\Client\FrontApiClient;
+ * use Mirakl\MMP\FrontOperator\Domain\Collection\Shop\ShopCollection;
+ * use Mirakl\MMP\FrontOperator\Request\Shop\GetShopsRequest;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ * $request = new GetShopsRequest();
+ *
+ * $result = $this->api->getShops($request);
+ * // $result => @see \Mirakl\MMP\FrontOperator\Domain\Collection\Shop\ShopCollection
+ *
+ */
+class GetShopsRequest extends AbstractRequest
+{
+ use PageableTrait;
+
+ /**
+ * @var string
+ */
+ protected $endpoint = '/shops';
+
+ /**
+ * @var array
+ */
+ public $queryParams = ['state', 'shop_ids', 'premium', 'updated_since', 'paginate', 'domains'];
+
+ /**
+ * @var array
+ */
+ public $boolOrAllParams = ['premium'];
+
+ /**
+ * @inheritdoc
+ */
+ public function getResponseDecorator()
+ {
+ return ShopCollection::decorator('shops');
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/FrontOperator/Request/Shop/Location/GetShopTaxLocationsRequest.php b/src/Mirakl/MMP/FrontOperator/Request/Shop/Location/GetShopTaxLocationsRequest.php
new file mode 100644
index 0000000..ef9f59c
--- /dev/null
+++ b/src/Mirakl/MMP/FrontOperator/Request/Shop/Location/GetShopTaxLocationsRequest.php
@@ -0,0 +1,83 @@
+
+ * getShopTaxLocations($request);
+ * // \Mirakl\MMP\FrontOperator\Domain\Collection\Shop\Location\ShopTaxLocationCollection
+ * var_dump($result); // decorated response
+ *
+ * // You can also retrieve raw response by using run() method of API client:
+ * $result = $api->run($request); // or $api->raw()->getShopTaxLocations($request)
+ * var_dump($result); // returns \Psr\Http\Message\ResponseInterface
+ * } catch (\Exception $e) {
+ * // An exception is thrown if object requested is not found or if an error occurs
+ * var_dump($e);
+ * }
+ *
+ *
+ * @method bool getIncludeDeleted()
+ * @method $this setIncludeDeleted(bool $includeDeleted)
+ * @method bool isIncludeDeleted()
+ * @method array getLocationTypes()
+ * @method $this setLocationTypes(array $locationTypes)
+ * @method array getShopIds()
+ * @method $this setShopIds(array $shopId)
+ * @method \DateTime getUpdatedSince()
+ * @method $this setUpdatedSince(\DateTime $updatedSince)
+ */
+class GetShopTaxLocationsRequest extends AbstractRequest
+{
+ /**
+ * @var string
+ */
+ protected $endpoint = '/shops/tax/locations';
+
+ /**
+ * @var array
+ */
+ public $queryParams = ['location_types', 'shop_ids', 'updated_since', 'include_deleted'];
+
+ /**
+ * @param array $shopIds
+ */
+ public function __construct(array $shopIds)
+ {
+ parent::__construct();
+ $this->setShopIds($shopIds);
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function getResponseDecorator()
+ {
+ return ShopTaxLocationCollection::decorator('tax_locations');
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Operator/Client/OperatorApiClient.php b/src/Mirakl/MMP/Operator/Client/OperatorApiClient.php
new file mode 100644
index 0000000..c26d19b
--- /dev/null
+++ b/src/Mirakl/MMP/Operator/Client/OperatorApiClient.php
@@ -0,0 +1,163 @@
+run($this);
+ }
+
+ /**
+ * (SH31) List all logistic classes
+ *
+ * @param null|string $locale
+ * @return LogisticClassCollection
+ */
+ public function getLogisticClasses($locale = null)
+ {
+ $request = new GetLogisticClassRequest();
+
+ if (null !== $locale) {
+ $request->setLocale((string) $locale);
+ }
+
+ return $request->run($this);
+ }
+
+ /**
+ * (SH21) List all carriers (sorted by sortIndex, defined in the BO)
+ *
+ * @return CarrierCollection
+ */
+ public function getShippingCarriers()
+ {
+ return (new GetShippingCarriersRequest())->run($this);
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Operator/Domain/Collection/Invoice/CreateManualAccountingDocumentCollection.php b/src/Mirakl/MMP/Operator/Domain/Collection/Invoice/CreateManualAccountingDocumentCollection.php
new file mode 100644
index 0000000..d1bb288
--- /dev/null
+++ b/src/Mirakl/MMP/Operator/Domain/Collection/Invoice/CreateManualAccountingDocumentCollection.php
@@ -0,0 +1,20 @@
+ [ManualAccountingDocumentLineCollection::class, 'create'],
+ ];
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Operator/Domain/Invoice/CreatedManualAccountingDocumentReturn.php b/src/Mirakl/MMP/Operator/Domain/Invoice/CreatedManualAccountingDocumentReturn.php
new file mode 100644
index 0000000..85c77d3
--- /dev/null
+++ b/src/Mirakl/MMP/Operator/Domain/Invoice/CreatedManualAccountingDocumentReturn.php
@@ -0,0 +1,23 @@
+ [Invoice::class, 'create'],
+ 'manual_accounting_document_error' => [InputWithErrors::class, 'create'],
+ ];
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Operator/Domain/Invoice/CreatedManualAccountingDocuments.php b/src/Mirakl/MMP/Operator/Domain/Invoice/CreatedManualAccountingDocuments.php
new file mode 100644
index 0000000..007b37c
--- /dev/null
+++ b/src/Mirakl/MMP/Operator/Domain/Invoice/CreatedManualAccountingDocuments.php
@@ -0,0 +1,20 @@
+ [DocumentReturnCollection::class, 'create'],
+ ];
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Operator/Domain/Invoice/EditManualAccountingDocument.php b/src/Mirakl/MMP/Operator/Domain/Invoice/EditManualAccountingDocument.php
new file mode 100644
index 0000000..9d18e22
--- /dev/null
+++ b/src/Mirakl/MMP/Operator/Domain/Invoice/EditManualAccountingDocument.php
@@ -0,0 +1,33 @@
+ [ManualAccountingDocumentLineCollection::class, 'create'],
+ ];
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Operator/Domain/Invoice/ManualAccountingDocumentLine.php b/src/Mirakl/MMP/Operator/Domain/Invoice/ManualAccountingDocumentLine.php
new file mode 100644
index 0000000..b3502ee
--- /dev/null
+++ b/src/Mirakl/MMP/Operator/Domain/Invoice/ManualAccountingDocumentLine.php
@@ -0,0 +1,17 @@
+ [CreateShopExistingUser::class, 'create'],
+ 'new_user' => [CreateShopNewUser::class, 'create'],
+ ];
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Operator/Domain/Shop/Create/CreateShopExistingUser.php b/src/Mirakl/MMP/Operator/Domain/Shop/Create/CreateShopExistingUser.php
new file mode 100644
index 0000000..7286ea4
--- /dev/null
+++ b/src/Mirakl/MMP/Operator/Domain/Shop/Create/CreateShopExistingUser.php
@@ -0,0 +1,28 @@
+setEmail($email);
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public static function create(array $data = [])
+ {
+ return new static($data['email']);
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Operator/Domain/Shop/Create/CreateShopNewUser.php b/src/Mirakl/MMP/Operator/Domain/Shop/Create/CreateShopNewUser.php
new file mode 100644
index 0000000..7dd467c
--- /dev/null
+++ b/src/Mirakl/MMP/Operator/Domain/Shop/Create/CreateShopNewUser.php
@@ -0,0 +1,31 @@
+setEmail($email);
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public static function create(array $data = [])
+ {
+ return new static($data['email']);
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Operator/Domain/Shop/Update/UpdateShop.php b/src/Mirakl/MMP/Operator/Domain/Shop/Update/UpdateShop.php
new file mode 100644
index 0000000..8c00c31
--- /dev/null
+++ b/src/Mirakl/MMP/Operator/Domain/Shop/Update/UpdateShop.php
@@ -0,0 +1,34 @@
+ 'channels',
+ ];
+
+ /**
+ * @var array
+ */
+ protected static $dataTypes = [
+ 'address' => [ShopAddress::class, 'create'],
+ ];
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Operator/Request/AdditionalField/GetAdditionalFieldRequest.php b/src/Mirakl/MMP/Operator/Request/AdditionalField/GetAdditionalFieldRequest.php
new file mode 100644
index 0000000..4f67231
--- /dev/null
+++ b/src/Mirakl/MMP/Operator/Request/AdditionalField/GetAdditionalFieldRequest.php
@@ -0,0 +1,24 @@
+
+ * use Mirakl\MMP\Operator\Client\OperatorApiClient;
+ * use Mirakl\MMP\Operator\Request\AdditionalField\GetAdditionalFieldRequest;
+ * use Mirakl\MMP\Common\Domain\AdditionalField\AdditionalFieldLinkedEntity;
+ *
+ * $api = new OperatorApiClient('API_URL', 'API_KEY');
+ * $request = new GetAdditionalFieldRequest();
+ * $request->setEntities([AdditionalFieldLinkedEntity::OFFER, AdditionalFieldLinkedEntity::SHOP]); // Optional
+ * $result = $api->getAdditionalFields($request);
+ * // $result => @see \Mirakl\MMP\Common\Domain\Collection\AdditionalFieldCollection
+ *
+ */
+class GetAdditionalFieldRequest extends AbstractGetAdditionalFieldRequest
+{}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Operator/Request/Document/GetDocumentsConfigurationRequest.php b/src/Mirakl/MMP/Operator/Request/Document/GetDocumentsConfigurationRequest.php
new file mode 100644
index 0000000..6d1b292
--- /dev/null
+++ b/src/Mirakl/MMP/Operator/Request/Document/GetDocumentsConfigurationRequest.php
@@ -0,0 +1,24 @@
+
+ * use Mirakl\MMP\Operator\Client\OperatorApiClient;
+ * use Mirakl\MMP\Operator\Request\Document\GetDocumentsConfigurationRequest;
+ *
+ * $api = new OperatorApiClient('API_URL', 'API_KEY');
+ * $request = new GetDocumentsConfigurationRequest();
+ * $request->setEntities(['ORDER', 'SHOP']);
+ *
+ * $result = $api->getDocumentsConfiguration($request);
+ * // $result => @see \Mirakl\MMP\Common\Domain\Collection\Document\DocumentsConfigurationCollection
+ *
+ */
+class GetDocumentsConfigurationRequest extends AbstractGetDocumentsConfigurationRequest
+{}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Operator/Request/Offer/GetOfferRequest.php b/src/Mirakl/MMP/Operator/Request/Offer/GetOfferRequest.php
new file mode 100644
index 0000000..64a38b3
--- /dev/null
+++ b/src/Mirakl/MMP/Operator/Request/Offer/GetOfferRequest.php
@@ -0,0 +1,31 @@
+
+ * use Mirakl\MMP\Operator\Client\OperatorApiClient;
+ * use Mirakl\MMP\Operator\Request\Offer\GetOfferRequest;
+ *
+ * $api = new OperatorApiClient('API_URL', 'API_KEY');
+ * $request = new GetOfferRequest('OFFER_ID');
+ * $result = $api->getOffer($request);
+ * // $result => @see \Mirakl\MMP\FrontOperator\Domain\Offer
+ *
+ */
+class GetOfferRequest extends AbstractGetOfferRequest
+{
+ /**
+ * @inheritdoc
+ */
+ public function getResponseDecorator()
+ {
+ return Offer::decorator();
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Operator/Request/Offer/Importer/OfferImportErrorReportRequest.php b/src/Mirakl/MMP/Operator/Request/Offer/Importer/OfferImportErrorReportRequest.php
new file mode 100644
index 0000000..6590139
--- /dev/null
+++ b/src/Mirakl/MMP/Operator/Request/Offer/Importer/OfferImportErrorReportRequest.php
@@ -0,0 +1,22 @@
+
+ * use Mirakl\MMP\Operator\Client\OperatorApiClient;
+ * use Mirakl\MMP\Operator\Request\Offer\Importer\OfferImportErrorReportRequest;
+ *
+ * $api = new OperatorApiClient('API_URL', 'API_KEY');
+ * $request = new OfferImportErrorReportRequest('IMPORT_ID');
+ * $result = $api->getOffersImportErrorReport($request);
+ * // $result => @see \Mirakl\Core\Domain\FileWrapper
+ *
+ */
+class OfferImportErrorReportRequest extends AbstractOfferImportErrorReportRequest
+{}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Operator/Request/Offer/Importer/OfferImportReportRequest.php b/src/Mirakl/MMP/Operator/Request/Offer/Importer/OfferImportReportRequest.php
new file mode 100644
index 0000000..5581d20
--- /dev/null
+++ b/src/Mirakl/MMP/Operator/Request/Offer/Importer/OfferImportReportRequest.php
@@ -0,0 +1,22 @@
+
+ * use Mirakl\MMP\Operator\Client\OperatorApiClient;
+ * use Mirakl\MMP\Operator\Request\Offer\Importer\OfferImportReportRequest;
+ *
+ * $api = new OperatorApiClient('API_URL', 'API_KEY');
+ * $request = new OfferImportReportRequest('IMPORT_ID');
+ * $result = $api->getOffersImportResult($request);
+ * // $result => @see \Mirakl\MMP\OperatorShop\Domain\Offer\Importer\OfferImportResult
+ *
+ */
+class OfferImportReportRequest extends AbstractOfferImportReportRequest
+{}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Operator/Request/Offer/Importer/OfferImportRequest.php b/src/Mirakl/MMP/Operator/Request/Offer/Importer/OfferImportRequest.php
new file mode 100644
index 0000000..082e6b8
--- /dev/null
+++ b/src/Mirakl/MMP/Operator/Request/Offer/Importer/OfferImportRequest.php
@@ -0,0 +1,49 @@
+
+ * use Mirakl\MMP\Operator\Client\OperatorApiClient;
+ * use Mirakl\MMP\Operator\Request\Offer\Importer\OfferImportRequest;
+ *
+ * $api = new OperatorApiClient('API_URL', 'API_KEY');
+ * $file = new \SplFileObject('/path/to/file.csv');
+ * $request = new OfferImportRequest($file, 'SHOP_ID');
+ * $request->setImportMode(\Mirakl\MMP\OperatorShop\Domain\Offer\Importer\ImportMode::PARTIAL_UPDATE); // Optional
+ * $request->setWithProducts(true); // Optional
+ * $result = $api->importOffers($request);
+ * // $result => @see \Mirakl\MMP\OperatorShop\Domain\Offer\Importer\OfferProductImportTracking
+ *
+ */
+class OfferImportRequest extends AbstractOfferImportRequest
+{
+ /**
+ * @var array
+ */
+ public $bodyParams = [
+ 'shop_id' => 'shop',
+ 'file',
+ 'import_mode',
+ 'with_products'
+ ];
+
+ /**
+ * @param mixed $file
+ * @param string $shopId
+ */
+ public function __construct($file, $shopId)
+ {
+ parent::__construct($file);
+ $this->setShopId($shopId);
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Operator/Request/Offer/Message/GetOfferMessagesRequest.php b/src/Mirakl/MMP/Operator/Request/Offer/Message/GetOfferMessagesRequest.php
new file mode 100644
index 0000000..f0d735c
--- /dev/null
+++ b/src/Mirakl/MMP/Operator/Request/Offer/Message/GetOfferMessagesRequest.php
@@ -0,0 +1,23 @@
+
+ * use Mirakl\MMP\Operator\Client\OperatorApiClient;
+ * use Mirakl\MMP\Operator\Request\Offer\Message\GetOfferMessagesRequest;
+ *
+ * $api = new OperatorApiClient('API_URL', 'API_KEY');
+ * $request = new GetOfferMessagesRequest('OFFER_ID');
+ * $result = $api->getOfferMessages($request);
+ * // $result => @see \Mirakl\MMP\Common\Domain\Collection\Message\OfferMessageCollection
+ *
+ */
+class GetOfferMessagesRequest extends AbstractGetOfferMessagesRequest
+{}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Operator/Request/Offer/State/GetOfferStateListRequest.php b/src/Mirakl/MMP/Operator/Request/Offer/State/GetOfferStateListRequest.php
new file mode 100644
index 0000000..fe17bdc
--- /dev/null
+++ b/src/Mirakl/MMP/Operator/Request/Offer/State/GetOfferStateListRequest.php
@@ -0,0 +1,51 @@
+
+ * use Mirakl\MMP\Operator\Client\OperatorApiClient;
+ * use Mirakl\MMP\Operator\Request\Offer\State\GetOfferStateListRequest;
+ *
+ * $api = new OperatorApiClient('API_URL', 'API_KEY');
+ * $request = new GetOfferStateListRequest();
+ * $request->setActive(true);
+ * $result = $api->getOfferStateList($request);
+ * // $result => @see \Mirakl\MMP\Operator\Domain\Collection\Offer\State\OfferStateCollection
+ *
+ */
+class GetOfferStateListRequest extends AbstractRequest
+{
+ use LocalizableTrait;
+
+ /**
+ * @var string
+ */
+ protected $endpoint = '/offers/states';
+
+ /**
+ * @var array
+ */
+ public $queryParams = ['active'];
+
+ /**
+ * @inheritdoc
+ */
+ public function getResponseDecorator()
+ {
+ return OfferStateCollection::decorator('offer_states');
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Operator/Request/Offer/State/GetOfferStatesRequest.php b/src/Mirakl/MMP/Operator/Request/Offer/State/GetOfferStatesRequest.php
new file mode 100644
index 0000000..c345e87
--- /dev/null
+++ b/src/Mirakl/MMP/Operator/Request/Offer/State/GetOfferStatesRequest.php
@@ -0,0 +1,25 @@
+
+ * use Mirakl\MMP\Operator\Client\OperatorApiClient;
+ *
+ * $api = new OperatorApiClient('API_URL', 'API_KEY');
+ * $result = $api->getOfferStates();
+ * // $result => @see \Mirakl\MMP\Common\Domain\Collection\Offer\State\OfferStateCollection
+ *
+ *
+ * @deprecated Class deprecated since 1.6.0
+ * @see \Mirakl\MMP\Operator\Request\Offer\State\GetOfferStateListRequest
+ */
+class GetOfferStatesRequest extends AbstractGetOfferStatesRequest
+{}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Operator/Request/Offer/UpdateOffersRequest.php b/src/Mirakl/MMP/Operator/Request/Offer/UpdateOffersRequest.php
new file mode 100644
index 0000000..01e5ee2
--- /dev/null
+++ b/src/Mirakl/MMP/Operator/Request/Offer/UpdateOffersRequest.php
@@ -0,0 +1,43 @@
+
+ * use Mirakl\MMP\Operator\Client\OperatorApiClient;
+ * use Mirakl\MMP\Operator\Request\Offer\UpdateOffersRequest;
+ *
+ * $api = new OperatorApiClient('API_URL', 'API_KEY');
+ * $request = new UpdateOffersRequest('SHOP_ID');
+ * $request->setOffers([
+ * 'shop_sku' => 'AAPL-CHASAW7852',
+ * 'description' => 'never used',
+ * ]);
+ * $result = $api->updateOffers($request);
+ * // $result => @see \Mirakl\MMP\OperatorShop\Domain\Offer\Importer\OfferImportTracking
+ *
+ */
+class UpdateOffersRequest extends AbstractUpdateOffersRequest
+{
+ /**
+ * @var array
+ */
+ public $queryParams = ['shop_id' => 'shop'];
+
+ /**
+ * @param string $shopId
+ */
+ public function __construct($shopId)
+ {
+ parent::__construct();
+ $this->setShopId($shopId);
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Operator/Request/Order/Accept/AcceptOrderRequest.php b/src/Mirakl/MMP/Operator/Request/Order/Accept/AcceptOrderRequest.php
new file mode 100644
index 0000000..48fedad
--- /dev/null
+++ b/src/Mirakl/MMP/Operator/Request/Order/Accept/AcceptOrderRequest.php
@@ -0,0 +1,24 @@
+
+ * use Mirakl\MMP\Operator\Client\OperatorApiClient;
+ * use Mirakl\MMP\Operator\Request\Order\Accept\AcceptOrderRequest;
+ * use Mirakl\MMP\Common\Domain\Order\Accept\AcceptOrderLine;
+ *
+ * $api = new OperatorApiClient('API_URL', 'API_KEY');
+ * $request = new AcceptOrderRequest('ORDER_ID', [
+ * new AcceptOrderLine(['id' => 'ORDER_LINE_ID', 'accepted' => true])
+ * ]);
+ * $api->acceptOrder($request);
+ *
+ */
+class AcceptOrderRequest extends AbstractAcceptOrderRequest
+{}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Operator/Request/Order/Document/DownloadOrdersDocumentsRequest.php b/src/Mirakl/MMP/Operator/Request/Order/Document/DownloadOrdersDocumentsRequest.php
new file mode 100644
index 0000000..db6d521
--- /dev/null
+++ b/src/Mirakl/MMP/Operator/Request/Order/Document/DownloadOrdersDocumentsRequest.php
@@ -0,0 +1,54 @@
+
+ * When documents are retrieved, they're wrapped into a ZIP archive except + * when only one document id is specified. The tree structure of this archive is as follow: + *
+ * documents-timestamp.zip + * | + * |__ order_id_x/ + * | |__ foo.txt + * | |__ bar.txt + * | |__ baz.pdf + * | + * |__ order_id_y/ + * | |__ image.png + * | |__ image(1).png + *+ * + * + * Example: + * + *
+ * use Mirakl\MMP\Operator\Client\OperatorApiClient;
+ * use Mirakl\MMP\Operator\Request\Order\Document\DownloadOrdersDocumentsRequest;
+ *
+ * $api = new OperatorApiClient('API_URL', 'API_KEY');
+ * $request = new DownloadOrdersDocumentsRequest();
+ * $request->setOrderIds(['ORDER_ID_1', 'ORDER_ID_2']);
+ * $result = $api->downloadOrdersDocuments($request);
+ * // $result => @see \Mirakl\Core\Domain\FileWrapper
+ * // Download file:
+ * $result->download();
+ *
+ */
+class DownloadOrdersDocumentsRequest extends AbstractDownloadOrdersDocumentsRequest
+{}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Operator/Request/Order/Document/GetOrderDocumentsRequest.php b/src/Mirakl/MMP/Operator/Request/Order/Document/GetOrderDocumentsRequest.php
new file mode 100644
index 0000000..3b5eb82
--- /dev/null
+++ b/src/Mirakl/MMP/Operator/Request/Order/Document/GetOrderDocumentsRequest.php
@@ -0,0 +1,23 @@
+
+ * use Mirakl\MMP\Operator\Client\OperatorApiClient;
+ * use Mirakl\MMP\Operator\Request\Order\Document\GetOrderDocumentsRequest;
+ *
+ * $api = new OperatorApiClient('API_URL', 'API_KEY');
+ * $request = new GetOrderDocumentsRequest();
+ * $request->setOrderIds(['ORDER_ID_1', 'ORDER_ID_2']);
+ * $result = $api->getOrderDocuments($request);
+ * // $result => @see \Mirakl\MMP\Common\Domain\Collection\Order\Document\OrderDocumentCollection
+ *
+ */
+class GetOrderDocumentsRequest extends AbstractGetOrderDocumentsRequest
+{}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Operator/Request/Order/Document/UploadOrdersDocumentsRequest.php b/src/Mirakl/MMP/Operator/Request/Order/Document/UploadOrdersDocumentsRequest.php
new file mode 100644
index 0000000..e3f1e0c
--- /dev/null
+++ b/src/Mirakl/MMP/Operator/Request/Order/Document/UploadOrdersDocumentsRequest.php
@@ -0,0 +1,31 @@
+
+ * use Mirakl\Core\Domain\Collection\DocumentCollection;
+ * use Mirakl\Core\Domain\Document;
+ * use Mirakl\MMP\Operator\Client\OperatorApiClient;
+ * use Mirakl\MMP\Operator\Request\Order\Document\UploadOrdersDocumentsRequest;
+ *
+ * $api = new OperatorApiClient('API_URL', 'API_KEY');
+ * $file = new \SplFileObject('/path/to/invoice.pdf');
+ * $docs = new DocumentCollection();
+ * $docs->add(new Document($file, 'invoice.pdf', 'CUSTOMER_INVOICE'));
+ * $request = new UploadOrdersDocumentsRequest($docs, 'ORDER_ID');
+ * $result = $api->uploadOrderDocuments($request);
+ * // $result => @see \Mirakl\MMP\Common\Domain\Order\Document\OrderDocumentsUploadResult
+ *
+ */
+class UploadOrdersDocumentsRequest extends AbstractUploadOrdersDocumentsRequest
+{}
diff --git a/src/Mirakl/MMP/Operator/Request/Order/Evaluation/GetOrderEvaluationRequest.php b/src/Mirakl/MMP/Operator/Request/Order/Evaluation/GetOrderEvaluationRequest.php
new file mode 100644
index 0000000..6dc7e81
--- /dev/null
+++ b/src/Mirakl/MMP/Operator/Request/Order/Evaluation/GetOrderEvaluationRequest.php
@@ -0,0 +1,22 @@
+
+ * use Mirakl\MMP\Operator\Client\OperatorApiClient;
+ * use Mirakl\MMP\Operator\Request\Order\Evaluation\GetOrderEvaluationRequest;
+ *
+ * $api = new OperatorApiClient('API_URL', 'API_KEY');
+ * $request = new GetOrderEvaluationRequest('ORDER_ID');
+ * $result = $api->getOrderEvaluation($request);
+ * // $result => @see \Mirakl\MMP\Common\Domain\Evaluation
+ *
+ */
+class GetOrderEvaluationRequest extends AbstractGetOrderEvaluationRequest
+{}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Operator/Request/Order/Message/CreateOrderMessageRequest.php b/src/Mirakl/MMP/Operator/Request/Order/Message/CreateOrderMessageRequest.php
new file mode 100644
index 0000000..d85bd38
--- /dev/null
+++ b/src/Mirakl/MMP/Operator/Request/Order/Message/CreateOrderMessageRequest.php
@@ -0,0 +1,32 @@
+
+ * use Mirakl\MMP\Operator\Client\OperatorApiClient;
+ * use Mirakl\MMP\Operator\Request\Order\Message\CreateOrderMessageRequest;
+ *
+ * $api = new OperatorApiClient('API_URL', 'API_KEY');
+ * $request = new CreateOrderMessageRequest('ORDER_ID', [
+ * 'subject' => 'Hey!',
+ * 'body' => 'I'm happy with the delivery!',
+ * 'customer_id' => 'DSIFEZK',
+ * 'customer_email' => 'foo@bar.com',
+ * 'customer_firstname' => 'Hap',
+ * 'customer_lastname' => 'Py',
+ * 'to_shop' => true,
+ * 'to_customer' => false,
+ * 'to_operator' => true,
+ * ]);
+ * $result = $api->createOrderMessage($request);
+ * // $result => @see \Mirakl\MMP\Common\Domain\Message\MessageCreated
+ *
+ */
+class CreateOrderMessageRequest extends AbstractCreateOrderMessageRequest
+{}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Operator/Request/Order/Message/GetOrderMessagesRequest.php b/src/Mirakl/MMP/Operator/Request/Order/Message/GetOrderMessagesRequest.php
new file mode 100644
index 0000000..d74b301
--- /dev/null
+++ b/src/Mirakl/MMP/Operator/Request/Order/Message/GetOrderMessagesRequest.php
@@ -0,0 +1,25 @@
+
+ * use Mirakl\MMP\Operator\Client\OperatorApiClient;
+ * use Mirakl\MMP\Operator\Request\Order\Message\GetOrderMessagesRequest;
+ *
+ * $api = new OperatorApiClient('API_URL', 'API_KEY');
+ * $request = new GetOrderMessagesRequest('ORDER_ID');
+ * $request->setReceived(false); // Optional (true: received by customer, false: sent to customer, null (default): both)
+ * $result = $api->getOrderMessages($request);
+ * // $result => @see \Mirakl\MMP\Common\Domain\Collection\Message\OrderMessageCollection
+ *
+ */
+class GetOrderMessagesRequest extends AbstractGetOrderMessagesRequest
+{}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Operator/Request/Order/Refund/CreateRefundRequest.php b/src/Mirakl/MMP/Operator/Request/Order/Refund/CreateRefundRequest.php
new file mode 100644
index 0000000..2e755d3
--- /dev/null
+++ b/src/Mirakl/MMP/Operator/Request/Order/Refund/CreateRefundRequest.php
@@ -0,0 +1,43 @@
+
+ * use Mirakl\MMP\Operator\Client\OperatorApiClient;
+ * use Mirakl\MMP\Operator\Request\Order\Refund\CreateRefundRequest;
+ *
+ * $api = new OperatorApiClient('API_URL', 'API_KEY');
+ * $request = new CreateRefundRequest([
+ * 'amount' => 10,
+ * 'reason_code' => '18',
+ * 'order_line_id' => 'MMP-OL-3305999877',
+ * 'quantity' => 1,
+ * 'shipping_amount' => 1,
+ * 'taxes' => [
+ * ['code' => 'TAX_A', 'amount' => 0.12]
+ * ],
+ * 'shipping_taxes' => [
+ * ['code' => 'TAX_B', 'amount' => 0.07]
+ * ],
+ * ]);
+ * $result = $api->refundOrder($request);
+ * // $result => @see \Mirakl\MMP\OperatorShop\Domain\Collection\Order\Refund\RefundCreatedCollection
+ *
+ */
+class CreateRefundRequest extends AbstractCreateRefundRequest
+{
+ /**
+ * @inheritdoc
+ */
+ public function getResponseDecorator()
+ {
+ return RefundCreatedCollection::decorator('refunds');
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Operator/Request/Order/Ship/ShipOrderRequest.php b/src/Mirakl/MMP/Operator/Request/Order/Ship/ShipOrderRequest.php
new file mode 100644
index 0000000..2e9727a
--- /dev/null
+++ b/src/Mirakl/MMP/Operator/Request/Order/Ship/ShipOrderRequest.php
@@ -0,0 +1,21 @@
+
+ * use Mirakl\MMP\Operator\Client\OperatorApiClient;
+ * use Mirakl\MMP\Operator\Request\Order\Ship\ShipOrderRequest;
+ *
+ * $api = new OperatorApiClient('API_URL', 'API_KEY');
+ * $request = new ShipOrderRequest('ORDER_ID');
+ * $api->shipOrder($request);
+ *
+ */
+class ShipOrderRequest extends AbstractShipOrderRequest
+{}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Operator/Request/Order/Tax/GetOrderTaxesRequest.php b/src/Mirakl/MMP/Operator/Request/Order/Tax/GetOrderTaxesRequest.php
new file mode 100644
index 0000000..7923665
--- /dev/null
+++ b/src/Mirakl/MMP/Operator/Request/Order/Tax/GetOrderTaxesRequest.php
@@ -0,0 +1,31 @@
+
+ * use Mirakl\MMP\Operator\Client\OperatorApiClient;
+ * use Mirakl\MMP\Operator\Request\Order\Tax\GetOrderTaxesRequest;
+ *
+ * $api = new OperatorApiClient('API_URL', 'API_KEY');
+ * $request = new GetOrderTaxesRequest();
+ * $result = $api->getOrderTaxes($request);
+ * // $result => @see \Mirakl\MMP\Operator\Domain\Collection\Order\Tax\OrderTaxCollection
+ *
+ */
+class GetOrderTaxesRequest extends AbstractGetOrderTaxesRequest
+{
+ /**
+ * @inheritdoc
+ */
+ public function getResponseDecorator()
+ {
+ return OrderTaxCollection::decorator('taxes');
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Operator/Request/Order/Tracking/UpdateOrderTrackingInfoRequest.php b/src/Mirakl/MMP/Operator/Request/Order/Tracking/UpdateOrderTrackingInfoRequest.php
new file mode 100644
index 0000000..46fa8cd
--- /dev/null
+++ b/src/Mirakl/MMP/Operator/Request/Order/Tracking/UpdateOrderTrackingInfoRequest.php
@@ -0,0 +1,26 @@
+
+ * use Mirakl\MMP\Operator\Client\OperatorApiClient;
+ * use Mirakl\MMP\Operator\Request\Order\Tax\UpdateOrderTrackingInfoRequest;
+ *
+ * $api = new OperatorApiClient('API_URL', 'API_KEY');
+ * $request = new UpdateOrderTrackingInfoRequest('ORDER_ID', [
+ * 'carrier_code' => 'FEDEX',
+ * 'carrier_name' => 'FedEx',
+ * 'carrier_url' => 'https://fex.ex?n=JFSKFJSDKF0923949',
+ * 'tracking_number' => 'JFSKFJSDKF0923949',
+ * ]);
+ * $api->updateOrderTrackingInfo($request);
+ *
+ */
+class UpdateOrderTrackingInfoRequest extends AbstractUpdateOrderTrackingInfoRequest
+{}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Operator/Request/Payment/Invoice/CreateManualAccountingDocumentRequest.php b/src/Mirakl/MMP/Operator/Request/Payment/Invoice/CreateManualAccountingDocumentRequest.php
new file mode 100644
index 0000000..ef7ea66
--- /dev/null
+++ b/src/Mirakl/MMP/Operator/Request/Payment/Invoice/CreateManualAccountingDocumentRequest.php
@@ -0,0 +1,87 @@
+
+ * use Mirakl\MMP\Front\Client\FrontApiClient;
+ * use Mirakl\MMP\FrontOperator\Domain\Collection\Shop\ShopCollection;
+ * use Mirakl\MMP\FrontOperator\Request\Shop\GetShopsRequest;
+ *
+ * $api = new FrontApiClient('API_URL', 'API_KEY');
+ *
+ * $input = [ 'manual_accounting_documents' => [
+ * 'shop_id' => 122,
+ * 'type' => 'INVOICE',
+ * 'emission_date' => '2014-12-12T12:12:00.000+0000',
+ * 'issued' => false,
+ * 'lines' => [
+ * [
+ * 'description' => 'Subscription',
+ * 'quantity' => '2',
+ * 'amount' => 34.54,
+ * 'tax_codes' => [
+ * 'TVA'
+ * ]
+ * ]
+ * ]
+ * ]
+ *
+ * $request = new CreateManualAccountingDocumentRequest($input['manual_accounting_documents']);
+ *
+ * $result = $api->createManualAccountingDocument($request);
+ * // $result => @see \Mirakl\MMP\Operator\Domain\Invoice\CreatedManualAccountingDocuments
+ *
+ */
+class CreateManualAccountingDocumentRequest extends AbstractRequest
+{
+ /**
+ * @var string
+ */
+ protected $method = 'POST';
+
+ /**
+ * @var string
+ */
+ protected $endpoint = '/invoices';
+
+ /**
+ * @var array
+ */
+ public $bodyParams = ['manual_accounting_documents'];
+
+ /**
+ * @var array
+ */
+ protected static $dataTypes = [
+ 'manual_accounting_documents' => [DocumentCollection::class, 'create'],
+ ];
+
+ /**
+ * @param array|DocumentCollection $manualAccountingDocuments
+ */
+ public function __construct($manualAccountingDocuments)
+ {
+ parent::__construct();
+ $this->setManualAccountingDocuments($manualAccountingDocuments);
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function getResponseDecorator()
+ {
+ return CreatedManualAccountingDocuments::decorator();
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Operator/Request/Payment/Invoice/DeleteDraftAccountingDocumentRequest.php b/src/Mirakl/MMP/Operator/Request/Payment/Invoice/DeleteDraftAccountingDocumentRequest.php
new file mode 100644
index 0000000..e581a4e
--- /dev/null
+++ b/src/Mirakl/MMP/Operator/Request/Payment/Invoice/DeleteDraftAccountingDocumentRequest.php
@@ -0,0 +1,52 @@
+
+ * use Mirakl\MMP\Operator\Client\OperatorApiClient;
+ * use Mirakl\MMP\Operator\Request\Payment\Invoice\DeleteDraftAccountingDocumentRequest;
+ *
+ * $api = new OperatorApiClient('API_URL', 'API_KEY');
+ *
+ * $draftDocumentUuid = 'c8e75c4f-598f-42b5-91e6-b76001218781';
+ * $request = new DeleteDraftAccountingDocumentRequest($draftDocumentUuid);
+ * $api->deleteDraftAccountingDocument($request);
+ *
+ */
+class DeleteDraftAccountingDocumentRequest extends AbstractRequest
+{
+ /**
+ * @var string
+ */
+ protected $method = 'DELETE';
+
+ /**
+ * @var string
+ */
+ protected $endpoint = '/invoices/{invoice}';
+
+ /**
+ * @var array
+ */
+ protected $uriVars = [
+ '{invoice}' => 'accounting_document_id'
+ ];
+
+ /**
+ * @param string $id
+ */
+ public function __construct($id)
+ {
+ parent::__construct();
+ $this->setAccountingDocumentId($id);
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Operator/Request/Payment/Invoice/DownloadInvoiceRequest.php b/src/Mirakl/MMP/Operator/Request/Payment/Invoice/DownloadInvoiceRequest.php
new file mode 100644
index 0000000..373aea8
--- /dev/null
+++ b/src/Mirakl/MMP/Operator/Request/Payment/Invoice/DownloadInvoiceRequest.php
@@ -0,0 +1,24 @@
+
+ * use Mirakl\MMP\Operator\Client\OperatorApiClient;
+ * use Mirakl\MMP\Operator\Request\Payment\Invoice\DownloadInvoiceRequest;
+ *
+ * $api = new OperatorApiClient('API_URL', 'API_KEY');
+ * $request = new DownloadInvoiceRequest('INVOICE_ID');
+ * $result = $api->downloadInvoice($request);
+ * // $result => @see \Mirakl\Core\Domain\FileWrapper
+ * // Download file:
+ * $result->download();
+ *
+ */
+class DownloadInvoiceRequest extends AbstractDownloadInvoiceRequest
+{}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Operator/Request/Payment/Invoice/GetInvoicesRequest.php b/src/Mirakl/MMP/Operator/Request/Payment/Invoice/GetInvoicesRequest.php
new file mode 100644
index 0000000..47a99e6
--- /dev/null
+++ b/src/Mirakl/MMP/Operator/Request/Payment/Invoice/GetInvoicesRequest.php
@@ -0,0 +1,32 @@
+
+ * use Mirakl\MMP\Operator\Client\OperatorApiClient;
+ * use Mirakl\MMP\Operator\Request\Payment\Invoice\GetInvoicesRequest;
+ *
+ * $api = new OperatorApiClient('API_URL', 'API_KEY');
+ * $request = new GetInvoicesRequest();
+ * $request->setShopId('1234'); // Optional
+ * $result = $api->getInvoices($request);
+ * // $result => @see \Mirakl\MMP\OperatorShop\Domain\Collection\Invoice\InvoiceCollection
+ *
+ */
+class GetInvoicesRequest extends AbstractGetInvoicesRequest
+{
+ /**
+ * @var array
+ */
+ public $queryParams = ['shop_id' => 'shop', 'type', 'currency'];
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Operator/Request/Payment/Invoice/IssueManualAccountingDocumentRequest.php b/src/Mirakl/MMP/Operator/Request/Payment/Invoice/IssueManualAccountingDocumentRequest.php
new file mode 100644
index 0000000..268a38b
--- /dev/null
+++ b/src/Mirakl/MMP/Operator/Request/Payment/Invoice/IssueManualAccountingDocumentRequest.php
@@ -0,0 +1,51 @@
+
+ * use Mirakl\MMP\Operator\Client\OperatorApiClient;
+ * use Mirakl\MMP\Operator\Request\Payment\Invoice\IssueManualAccountingDocumentRequest;
+ *
+ * $api = new OperatorApiClient('API_URL', 'API_KEY');
+ *
+ * $request = new IssueManualAccountingDocumentRequest('ID');
+ * $api->issueManualAccountingDocument($request);
+ *
+ */
+class IssueManualAccountingDocumentRequest extends AbstractRequest
+{
+ /**
+ * @var string
+ */
+ protected $method = 'PUT';
+
+ /**
+ * @var string
+ */
+ protected $endpoint = '/invoices/{manual_accounting_document_id}/issue';
+
+ /**
+ * @var array
+ */
+ protected $uriVars = [
+ '{manual_accounting_document_id}' => 'manual_accounting_document_id'
+ ];
+
+ /**
+ * @param string $id
+ */
+ public function __construct($id)
+ {
+ parent::__construct();
+ $this->setManualAccountingDocumentId($id);
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Operator/Request/Payment/Invoice/UpdateManualAccountingDocumentRequest.php b/src/Mirakl/MMP/Operator/Request/Payment/Invoice/UpdateManualAccountingDocumentRequest.php
new file mode 100644
index 0000000..2265259
--- /dev/null
+++ b/src/Mirakl/MMP/Operator/Request/Payment/Invoice/UpdateManualAccountingDocumentRequest.php
@@ -0,0 +1,87 @@
+
+ * use Mirakl\MMP\Operator\Client\OperatorApiClient;
+ * use Mirakl\MMP\Operator\Domain\Invoice\CreatedManualAccountingDocumentReturn;
+ * use Mirakl\MMP\Operator\Domain\Invoice\CreatedManualAccountingDocuments;
+ * use Mirakl\MMP\Operator\Request\Payment\Invoice\UpdateManualAccountingDocumentRequest;
+ *
+ * $api = new OperatorApiClient('API_URL', 'API_KEY');
+ *
+ *
+ * $input = 'manual_accounting_documents' => [
+ * 'id' => '5455011d-cf4a-4ddf-b76b-16d888fc11cf',
+ * 'shop_id' => 122,
+ * 'type' => 'INVOICE',
+ * 'emission_date' => '2014-12-12T12:12:00.000+0000',
+ * 'issued' => false,
+ * 'lines' => [
+ * 'description' => 'Subscription',
+ * 'quantity' => 2,
+ * 'amount' => 34.54,
+ * 'tax_codes' => [
+ * 'TVA'
+ * ]
+ * ];
+ *
+ * $request = new UpdateManualAccountingDocumentRequest($input['manual_accounting_documents']);
+ *
+ * $result = $api->updateManualAccountingDocument($request);
+ * * // $result => @see \Mirakl\MMP\Operator\Domain\Invoice\CreatedManualAccountingDocuments
+ *
+ */
+class UpdateManualAccountingDocumentRequest extends AbstractRequest
+{
+ /**
+ * @var string
+ */
+ protected $method = 'PUT';
+
+ /**
+ * @var string
+ */
+ protected $endpoint = '/invoices';
+
+ /**
+ * @var array
+ */
+ public $bodyParams = ['manual_accounting_documents'];
+
+ /**
+ * @var array
+ */
+ protected static $dataTypes = [
+ 'manual_accounting_documents' => [DocumentCollection::class, 'create'],
+ ];
+
+ /**
+ * @param array|DocumentCollection $documents
+ */
+ public function __construct($documents)
+ {
+ parent::__construct();
+ $this->setManualAccountingDocuments($documents);
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function getResponseDecorator()
+ {
+ return CreatedManualAccountingDocuments::decorator();
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Operator/Request/Product/GetProductsRequest.php b/src/Mirakl/MMP/Operator/Request/Product/GetProductsRequest.php
new file mode 100644
index 0000000..24a4961
--- /dev/null
+++ b/src/Mirakl/MMP/Operator/Request/Product/GetProductsRequest.php
@@ -0,0 +1,35 @@
+
+ * use Mirakl\MMP\Operator\Client\OperatorApiClient;
+ * use Mirakl\MMP\Operator\Request\Product\GetProductsRequest;
+ * use Mirakl\MMP\Common\Domain\Product\Offer\ProductReference;
+ *
+ * $api = new OperatorApiClient('API_URL', 'API_KEY');
+ * $request = new GetProductsRequest([new ProductReference('EAN', '0882780560413')]);
+ * $result = $api->getProducts($request);
+ * // $result => @see \Mirakl\MMP\Common\Domain\Collection\Product\ProductCollection
+ *
+ */
+class GetProductsRequest extends AbstractGetProductsRequest
+{
+ /**
+ * @inheritdoc
+ */
+ public function getResponseDecorator()
+ {
+ return ProductCollection::decorator('products');
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Operator/Request/Shipping/GetLogisticClassRequest.php b/src/Mirakl/MMP/Operator/Request/Shipping/GetLogisticClassRequest.php
new file mode 100644
index 0000000..8f526ae
--- /dev/null
+++ b/src/Mirakl/MMP/Operator/Request/Shipping/GetLogisticClassRequest.php
@@ -0,0 +1,20 @@
+
+ * use Mirakl\MMP\Operator\Client\OperatorApiClient;
+ *
+ * $api = new OperatorApiClient('API_URL', 'API_KEY');
+ * $result = $api->getLogisticClasses();
+ * // $result => @see \Mirakl\MMP\Common\Domain\Collection\Shipping\LogisticClassCollection
+ *
+ */
+class GetLogisticClassRequest extends AbstractGetLogisticClassRequest
+{}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Operator/Request/Shipping/GetShippingCarriersRequest.php b/src/Mirakl/MMP/Operator/Request/Shipping/GetShippingCarriersRequest.php
new file mode 100644
index 0000000..6ac2fcd
--- /dev/null
+++ b/src/Mirakl/MMP/Operator/Request/Shipping/GetShippingCarriersRequest.php
@@ -0,0 +1,20 @@
+
+ * use Mirakl\MMP\Operator\Client\OperatorApiClient;
+ *
+ * $api = new OperatorApiClient('API_URL', 'API_KEY');
+ * $result = $api->getShippingCarriers();
+ * // $result => @see \Mirakl\MMP\Common\Domain\Collection\Shipping\CarrierCollection
+ *
+ */
+class GetShippingCarriersRequest extends AbstractGetShippingCarriersRequest
+{}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Operator/Request/Shipping/GetShippingZonesRequest.php b/src/Mirakl/MMP/Operator/Request/Shipping/GetShippingZonesRequest.php
new file mode 100644
index 0000000..a7b3091
--- /dev/null
+++ b/src/Mirakl/MMP/Operator/Request/Shipping/GetShippingZonesRequest.php
@@ -0,0 +1,26 @@
+
+ * use Mirakl\MMP\Operator\Client\OperatorApiClient;
+ * use Mirakl\MMP\Operator\Request\Shipping\GetShippingZonesRequest;
+ *
+ * $api = new OperatorApiClient('API_URL', 'API_KEY');
+ *
+ * $request = new GetShippingZonesRequest();
+ * $request->setLocale('fr_FR');
+ *
+ * $result = $api->getShippingZones($request);
+ * // $result => @see \Mirakl\MMP\Common\Domain\Collection\Shipping\ShippingZoneDetailCollection
+ *
+ *
+ */
+class GetShippingZonesRequest extends AbstractGetShippingZonesRequest
+{}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Operator/Request/Shop/CreateShopsRequest.php b/src/Mirakl/MMP/Operator/Request/Shop/CreateShopsRequest.php
new file mode 100644
index 0000000..741bef4
--- /dev/null
+++ b/src/Mirakl/MMP/Operator/Request/Shop/CreateShopsRequest.php
@@ -0,0 +1,93 @@
+
+ * use Mirakl\MMP\Operator\Client\OperatorApiClient;
+ * use Mirakl\MMP\Operator\Request\Shop\CreateShopsRequest;
+ *
+ * $api = new OperatorApiClient('API_URL', 'API_KEY');
+ * $request = new CreateShopsRequest([
+ * [
+ * 'address' => [
+ * 'civility' => 'Mr',
+ * 'firstname' => 'Bob',
+ * 'lastname' => 'Smith',
+ * 'street1' => '10 E 40th St',
+ * 'street2' => '8th floor',
+ * 'zip_code' => '10016',
+ * 'state' => 'New York',
+ * 'city' => 'New York City',
+ * 'country' => 'USA',
+ * 'phone' => '(646) 320-3881',
+ * 'phone_secondary' => '(212) 204-1126'
+ * ],
+ * 'email' => 'sps@sps.com',
+ * 'fax' => 'none',
+ * 'web_site' => 'http://swisspostsolutions.com',
+ * 'operator_internal_id' => '94R9U3DI',
+ * 'shipping_country' => 'USA',
+ * 'description' => 'Sells letters, stamps...',
+ * 'return_policy' => 'All returns are free',
+ * 'pro_details' => [
+ * 'corporate_name' => 'Swiss Post Solutions',
+ * 'identification_number' => 'US-329JD93KKL',
+ * 'tax_identification_number' => 'USNY9403999'
+ * ],
+ * 'shop_name' => 'Swiss Post Store',
+ * 'is_professional' => true,
+ * 'closed_from_date' => '2014-12-12T12:12:00.000+0000',
+ * 'closed_to_date' => '2014-12-20T12:12:00.000+0000',
+ * 'immunity_date' => '2015-01-01T00:00:00.000+0000',
+ * 'shop_additional_fields' => [
+ * [
+ * 'code' => 'erp-reference-key',
+ * 'value' => '9ZE8DOIIII'
+ * ]
+ * ],
+ * 'payment_info' => [
+ * '@type' => 'ABA',
+ * 'owner' => 'Matt Marteens',
+ * 'bank_name' => 'Chase',
+ * 'bank_account_number' => '839383939',
+ * 'routing_number' => '121000248',
+ * 'bic' => 'BOAUSIIE999'
+ * ],
+ * 'new_user' => [
+ * 'email' => 'user@email.com',
+ * 'password' => 'password1234'
+ * ]
+ * ]
+ * ]);
+ * $result = $api->createShops($request);
+ * // $result => @see \Mirakl\MMP\FrontOperator\Domain\Shop\Create\CreatedShops
+ *
+ */
+class CreateShopsRequest extends AbstractCreateShopsRequest
+{
+ /**
+ * @var array
+ */
+ protected static $dataTypes = [
+ 'shops' => [CreateShopCollection::class, 'create'],
+ ];
+
+ /**
+ * @param mixed $shops
+ */
+ public function __construct($shops)
+ {
+ parent::__construct();
+ $this->setShops($shops);
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Operator/Request/Shop/UpdateShopsRequest.php b/src/Mirakl/MMP/Operator/Request/Shop/UpdateShopsRequest.php
new file mode 100644
index 0000000..f1d1fce
--- /dev/null
+++ b/src/Mirakl/MMP/Operator/Request/Shop/UpdateShopsRequest.php
@@ -0,0 +1,75 @@
+
+ * use Mirakl\MMP\Operator\Client\OperatorApiClient;
+ * use Mirakl\MMP\Operator\Domain\Shop\Update\UpdateShop;
+ * use Mirakl\MMP\Operator\Request\Shop\UpdateShopsRequest;
+ *
+ * $api = new OperatorApiClient('API_URL', 'API_KEY');
+ *
+ * $input = ['shops' => [
+ * 'shop_id' => '124',
+ * 'suspend' => true
+ * ]];
+ *
+ * $updateShop = new UpdateShop($input['shops'][0]);
+ *
+ * $request = new UpdateShopsRequest([$updateShop]);
+ * $result = $api->updateShops($request);
+ * // $result => @see \Mirakl\MMP\FrontOperator\Domain\Shop\Update\UpdatedShops
+ *
+ */
+class UpdateShopsRequest extends AbstractRequest
+{
+ /**
+ * @var string
+ */
+ protected $method = 'PUT';
+
+ /**
+ * @var string
+ */
+ protected $endpoint = '/shops';
+
+ /**
+ * @var array
+ */
+ public $bodyParams = ['shops'];
+
+ /**
+ * @var array
+ */
+ protected static $dataTypes = [
+ 'shops' => [UpdateShopCollection::class, 'create'],
+ ];
+
+ /**
+ * @param mixed $shops
+ */
+ public function __construct($shops)
+ {
+ parent::__construct();
+ $this->setShops($shops);
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function getResponseDecorator()
+ {
+ return UpdatedShops::decorator();
+ }
+}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/OperatorShop/Request/Message/GetThreadDetailsRequest.php b/src/Mirakl/MMP/OperatorShop/Request/Message/GetThreadDetailsRequest.php
new file mode 100644
index 0000000..bb803ab
--- /dev/null
+++ b/src/Mirakl/MMP/OperatorShop/Request/Message/GetThreadDetailsRequest.php
@@ -0,0 +1,22 @@
+
+ * use Mirakl\MMP\Shop\Client\ShopApiClient;
+ * use Mirakl\MMP\OperatorShop\Request\Message\GetThreadDetailsRequest;
+ *
+ * $api = new ShopApiClient('API_URL', 'API_KEY', 'SHOP_ID');
+ * $request = new GetThreadDetailsRequest('THREAD_ID');
+ * $result = $api->getThreadDetails($request);
+ * // $result => @see \Mirakl\MMP\Common\Domain\Message\Thread\ThreadDetails
+ *
+ */
+class GetThreadDetailsRequest extends AbstractGetThreadDetailsRequest
+{}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/OperatorShop/Request/Message/GetThreadsRequest.php b/src/Mirakl/MMP/OperatorShop/Request/Message/GetThreadsRequest.php
new file mode 100644
index 0000000..3011a9a
--- /dev/null
+++ b/src/Mirakl/MMP/OperatorShop/Request/Message/GetThreadsRequest.php
@@ -0,0 +1,24 @@
+
+ * use Mirakl\MMP\Shop\Client\ShopApiClient;
+ * use Mirakl\MMP\OperatorShop\Request\Message\GetThreadsRequest;
+ *
+ * $api = new ShopApiClient('API_URL', 'API_KEY', 'SHOP_ID');
+ * $request = new GetThreadsRequest('THREAD_ID');
+ * $request->setEntityType('MMP_ORDER');
+ * $request->setEntityId('ORDER_ID');
+ * $result = $api->getThreads($request);
+ * // $result => @see \Mirakl\Core\Response\Decorator\SeekableCollection
+ *
+ */
+class GetThreadsRequest extends AbstractGetThreadsRequest
+{}
\ No newline at end of file
diff --git a/src/Mirakl/MMP/Shop/Client/ShopApiClient.php b/src/Mirakl/MMP/Shop/Client/ShopApiClient.php
index 26bb8a8..590a76d 100755
--- a/src/Mirakl/MMP/Shop/Client/ShopApiClient.php
+++ b/src/Mirakl/MMP/Shop/Client/ShopApiClient.php
@@ -18,15 +18,23 @@
use Mirakl\MMP\Common\Domain\Document\DocumentsUploadResult;
use Mirakl\MMP\Common\Domain\Evaluation;
use Mirakl\MMP\Common\Domain\Message\MessageCreated;
+use Mirakl\MMP\Common\Domain\Message\Thread\ThreadCreated;
+use Mirakl\MMP\Common\Domain\Message\Thread\ThreadDetails;
+use Mirakl\MMP\Common\Domain\Message\Thread\ThreadReplyCreated;
use Mirakl\MMP\Common\Domain\Order\Document\OrderDocumentsUploadResult;
use Mirakl\MMP\Common\Domain\Shipment\CreatedShipments;
use Mirakl\MMP\Common\Domain\Shipment\UpdatedShipmentTrackings;
use Mirakl\MMP\Common\Domain\Shipment\Workflow\ShipmentWorkflowResponse;
+use Mirakl\MMP\Common\Request\Message\DownloadThreadMessageAttachmentRequest;
+use Mirakl\MMP\Common\Request\Message\ThreadReplyRequest;
+use Mirakl\MMP\Common\Request\Order\Message\CreateOrderThreadRequest;
use Mirakl\MMP\OperatorShop\Domain\Collection\Invoice\InvoiceCollection;
use Mirakl\MMP\OperatorShop\Domain\Collection\Order\Refund\RefundCreatedCollection;
use Mirakl\MMP\OperatorShop\Domain\Offer\Importer\OfferImportResult;
use Mirakl\MMP\OperatorShop\Domain\Offer\Importer\OfferImportTracking;
use Mirakl\MMP\OperatorShop\Domain\Offer\Importer\OfferProductImportTracking;
+use Mirakl\MMP\OperatorShop\Request\Message\GetThreadDetailsRequest;
+use Mirakl\MMP\OperatorShop\Request\Message\GetThreadsRequest;
use Mirakl\MMP\Shop\Domain\Collection\Offer\ShopOfferCollection;
use Mirakl\MMP\Shop\Domain\Collection\Offer\State\OfferStateCollection;
use Mirakl\MMP\Shop\Domain\Collection\Order\ShopOrderCollection;
@@ -90,11 +98,13 @@
* @method void cancelOrder(CancelOrderRequest $request)
* @method MessageCreated createOrderMessage(CreateOrderMessageRequest $request)
* @method CreatedShipments createShipments(CreateShipmentsRequest $request)
+ * @method ThreadCreated createOrderThread(CreateOrderThreadRequest $request)
* @method void deleteOrderDocument(DeleteOrderDocumentRequest $request)
* @method void deleteShopDocument(DeleteShopDocumentRequest $request)
* @method FileWrapper downloadInvoice(DownloadInvoiceRequest $request)
* @method FileWrapper downloadOrdersDocuments(DownloadOrdersDocumentsRequest $request)
* @method FileWrapper downloadShopDocuments(DownloadShopDocumentsRequest $request)
+ * @method FileWrapper downloadThreadMessageAttachment(DownloadThreadMessageAttachmentRequest $request)
* @method AdditionalFieldCollection getAdditionalFields(GetAdditionalFieldRequest $request)
* @method DocumentsConfigurationCollection getDocumentsConfiguration(GetDocumentsConfigurationRequest $request)
* @method InvoiceCollection getInvoices(GetInvoicesRequest $request)
@@ -114,11 +124,14 @@
* @method ProductCollection getProducts(GetProductsRequest $request)
* @method PromotionCollection getPromotions(GetPromotionsRequest $request)
* @method SeekableCollection getShipments(GetShipmentsRequest $request)
+ * @method ThreadDetails getThreadDetails(GetThreadDetailsRequest $request)
+ * @method SeekableCollection getThreads(GetThreadsRequest $request)
* @method ReasonCollection getTypeReasons(GetTypeReasonsRequest $request)
* @method ShippingZoneDetailCollection getShippingZones(GetShippingZonesRequest $request)
* @method ShopDocumentCollection getShopDocuments(GetShopDocumentsRequest $request)
* @method OfferProductImportTracking importOffers(OfferImportRequest $request)
* @method RefundCreatedCollection refundOrder(CreateRefundRequest $request)
+ * @method ThreadReplyCreated replyToThread(ThreadReplyRequest $request)
* @method void shipOrder(ShipOrderRequest $request)
* @method ShipmentWorkflowResponse shipShipments(ShipShipmentsRequest $request)
* @method OfferImportTracking updateOffers(UpdateOffersRequest $request)
diff --git a/src/Mirakl/MMP/Shop/Request/Order/Accept/AcceptOrderRequest.php b/src/Mirakl/MMP/Shop/Request/Order/Accept/AcceptOrderRequest.php
index 9045580..e1b5aa1 100755
--- a/src/Mirakl/MMP/Shop/Request/Order/Accept/AcceptOrderRequest.php
+++ b/src/Mirakl/MMP/Shop/Request/Order/Accept/AcceptOrderRequest.php
@@ -15,7 +15,7 @@
*
* $api = new ShopApiClient('API_URL', 'API_KEY', 'SHOP_ID');
* $request = new AcceptOrderRequest('ORDER_ID', [
- * new AcceptOrderLine(['id' => 'ORDER_ID', 'accepted' => true])
+ * new AcceptOrderLine(['id' => 'ORDER_LINE_ID', 'accepted' => true])
* ]);
* $api->acceptOrder($request);
*