![]() Server : Apache System : Linux server2.corals.io 4.18.0-348.2.1.el8_5.x86_64 #1 SMP Mon Nov 15 09:17:08 EST 2021 x86_64 User : corals ( 1002) PHP Version : 7.4.33 Disable Function : exec,passthru,shell_exec,system Directory : /home/corals/old/dev/tests/integration/testsuite/Magento/Sales/Model/Service/ |
<?php /** * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ declare(strict_types=1); namespace Magento\Sales\Model\Service; use Magento\Sales\Api\Data\OrderInterface; use Magento\Sales\Model\Order; use Magento\TestFramework\Helper\Bootstrap; /** * Tests \Magento\Sales\Model\Service\InvoiceService */ class InvoiceServiceTest extends \PHPUnit\Framework\TestCase { /** * @var InvoiceService */ private $invoiceService; /** * @inheritdoc */ protected function setUp(): void { $this->invoiceService = Bootstrap::getObjectManager()->create(InvoiceService::class); } /** * @param int $invoiceQty * @magentoDataFixture Magento/Sales/_files/order_configurable_product.php * @return void * @dataProvider prepareInvoiceConfigurableProductDataProvider */ public function testPrepareInvoiceConfigurableProduct(int $invoiceQty): void { /** @var OrderInterface $order */ $order = Bootstrap::getObjectManager()->create(Order::class)->load('100000001', 'increment_id'); $orderItems = $order->getItems(); foreach ($orderItems as $orderItem) { if ($orderItem->getParentItemId()) { $parentItemId = $orderItem->getParentItemId(); } } $invoice = $this->invoiceService->prepareInvoice($order, [$parentItemId => $invoiceQty]); $invoiceItems = $invoice->getItems(); foreach ($invoiceItems as $invoiceItem) { $this->assertEquals($invoiceQty, $invoiceItem->getQty()); } } public function prepareInvoiceConfigurableProductDataProvider() { return [ 'full invoice' => [2], 'partial invoice' => [1] ]; } /** * @param int $invoiceQty * @magentoDataFixture Magento/Sales/_files/order.php * @return void * @dataProvider prepareInvoiceSimpleProductDataProvider */ public function testPrepareInvoiceSimpleProduct(int $invoiceQty): void { /** @var OrderInterface $order */ $order = Bootstrap::getObjectManager()->create(Order::class)->load('100000001', 'increment_id'); $orderItems = $order->getItems(); $invoiceQtys = []; foreach ($orderItems as $orderItem) { $invoiceQtys[$orderItem->getItemId()] = $invoiceQty; } $invoice = $this->invoiceService->prepareInvoice($order, $invoiceQtys); $invoiceItems = $invoice->getItems(); foreach ($invoiceItems as $invoiceItem) { $this->assertEquals($invoiceQty, $invoiceItem->getQty()); } } public function prepareInvoiceSimpleProductDataProvider() { return [ 'full invoice' => [2], 'partial invoice' => [1] ]; } /** * Checks if ordered and invoiced qty of bundle product does match. * * @param array $qtyToInvoice * @param array $qtyInvoiced * @param string $errorMsg * @return void * @throws \Magento\Framework\Exception\LocalizedException * @magentoDataFixture Magento/Sales/_files/order_with_bundle.php * @dataProvider bundleProductQtyOrderedDataProvider */ public function testPrepareInvoiceBundleProduct( array $qtyToInvoice, array $qtyInvoiced, string $errorMsg ): void { /** @var Order $order */ $order = Bootstrap::getObjectManager()->create(Order::class) ->load('100000001', 'increment_id'); $predefinedQtyToInvoice = $this->getPredefinedQtyToInvoice($order, $qtyToInvoice); $invoice = $this->invoiceService->prepareInvoice($order, $predefinedQtyToInvoice); foreach ($invoice->getItems() as $invoiceItem) { if (isset($qtyInvoiced[$invoiceItem->getSku()])) { $this->assertEquals( $qtyInvoiced[$invoiceItem->getSku()], $invoiceItem->getQty(), sprintf($errorMsg, $invoiceItem->getSku()) ); } } } /** * Data provider for invoice creation with and w/o predefined qty to invoice. * * @return array */ public function bundleProductQtyOrderedDataProvider(): array { return [ 'Create invoice w/o predefined qty' => [ 'Qty to invoice' => [], 'Qty ordered' => [ 'bundle_1' => 2, 'bundle_simple_1' => 10, ], 'Error msg' => 'Invoiced qty for product %s does not match.', ], 'Create invoice with predefined qty' => [ 'Qty to invoice' => [ 'bundle_1' => 2, 'bundle_simple_1' => 10, ], 'Qty ordered' => [ 'bundle_1' => 2, 'bundle_simple_1' => 10, ], 'Error msg' => 'Invoiced qty for product %s does not match.', ], 'Create invoice with partial predefined qty for bundle' => [ 'Qty to invoice' => [ 'bundle_1' => 1, ], 'Qty ordered' => [ 'bundle_1' => 1, 'bundle_simple_1' => 5, ], 'Error msg' => 'Invoiced qty for product %s does not match.', ], ]; } /** * Associate product qty to invoice to order item id. * * @param Order $order * @param array $qtyToInvoice * @return array */ private function getPredefinedQtyToInvoice(Order $order, array $qtyToInvoice): array { $predefinedQtyToInvoice = []; foreach ($order->getAllItems() as $orderItem) { if (array_key_exists($orderItem->getSku(), $qtyToInvoice)) { $predefinedQtyToInvoice[$orderItem->getId()] = $qtyToInvoice[$orderItem->getSku()]; } } return $predefinedQtyToInvoice; } }