Skip to content

Commit

Permalink
Merge pull request #3374 from nanasess/shipped-csv
Browse files Browse the repository at this point in the history
出荷CSVでの受注ステータス変更を実装
  • Loading branch information
Chihiro Adachi committed Jul 24, 2018
2 parents 350ddff + 8c7e6bb commit 26236da
Show file tree
Hide file tree
Showing 5 changed files with 147 additions and 6 deletions.
5 changes: 5 additions & 0 deletions codeception/_support/Page/Admin/OrderManagePage.php
Original file line number Diff line number Diff line change
Expand Up @@ -211,4 +211,9 @@ public function 取得_出荷日($rowNum)
{
return $this->tester->grabTextFrom("#search_result > tbody > tr:nth-child(${rowNum}) > td:nth-child(7)");
}

public function 取得_ステータス($rowNum)
{
return $this->tester->grabTextFrom("#search_result > tbody > tr:nth-child(${rowNum}) > td:nth-child(4) > span");
}
}
78 changes: 77 additions & 1 deletion codeception/acceptance/EA09ShippingCest.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
use Codeception\Util\Fixtures;
use Eccube\Entity\Customer;
use Eccube\Entity\Order;
use Eccube\Entity\Master\OrderStatus;
use Page\Admin\OrderEditPage;
use Page\Admin\OrderManagePage;
use Page\Admin\ShippingCsvUploadPage;
Expand Down Expand Up @@ -211,10 +212,17 @@ public function shipping_出荷CSV登録(\AcceptanceTester $I)
{
$I->wantTo('EA0903-UC04-T01 出荷CSV登録');

$entityManager = Fixtures::get('entityManager');
/* @var Customer $Customer */
$Customer = (Fixtures::get('createCustomer'))();
/* @var Order[] $Orders */
$Orders = (Fixtures::get('createOrders'))($Customer, 3);
// 入金済みに更新しておく
$Status = $entityManager->getRepository('Eccube\Entity\Master\OrderStatus')->find(OrderStatus::PAID);
foreach ($Orders as $newOrder) {
$newOrder->setOrderStatus($Status);
}
$entityManager->flush();

/*
* 出荷再検索 出荷日/伝票番号が登録されていないことを確認
Expand Down Expand Up @@ -250,7 +258,6 @@ public function shipping_出荷CSV登録(\AcceptanceTester $I)
file_put_contents($csvFileName, $csv);

try {

ShippingCsvUploadPage::go($I)
->入力_CSVファイル('shipping.csv')
->CSVアップロード();
Expand All @@ -275,7 +282,76 @@ public function shipping_出荷CSV登録(\AcceptanceTester $I)
$I->assertEquals('2018/03/03', $OrderManagePage->取得_出荷日(1));
$I->assertEquals('2018/02/02', $OrderManagePage->取得_出荷日(2));
$I->assertEquals('2018/01/01', $OrderManagePage->取得_出荷日(3));
$I->assertEquals('発送済み', $OrderManagePage->取得_ステータス(1));
$I->assertEquals('発送済み', $OrderManagePage->取得_ステータス(2));
$I->assertEquals('発送済み', $OrderManagePage->取得_ステータス(3));
} finally {
if (file_exists($csvFileName)) {
unlink($csvFileName);
}
}
}

public function shipping_出荷CSV登録失敗(\AcceptanceTester $I)
{
$I->wantTo('EA0903-UC04-T02 出荷CSV登録失敗');

$entityManager = Fixtures::get('entityManager');
/* @var Customer $Customer */
$Customer = (Fixtures::get('createCustomer'))();
/* @var Order[] $Orders */
$Orders = (Fixtures::get('createOrders'))($Customer, 3);
// 決済処理中に更新しておく
$Status = $entityManager->getRepository('Eccube\Entity\Master\OrderStatus')->find(OrderStatus::PENDING);
foreach ($Orders as $newOrder) {
$newOrder->setOrderStatus($Status);
}
$entityManager->flush();

/*
* 出荷再検索 出荷日/伝票番号が登録されていないことを確認
*/

$OrderManagePage = OrderManagePage::go($I)
->詳細検索設定()
->入力_ご注文者お名前($Customer->getName01().$Customer->getName02())
->入力_ご注文者お名前フリガナ($Customer->getKana01().$Customer->getKana02())
->検索();

$I->see('検索結果:3件が該当しました', OrderManagePage::$検索結果_メッセージ);

$I->assertEmpty($OrderManagePage->取得_出荷伝票番号(1));
$I->assertEmpty($OrderManagePage->取得_出荷伝票番号(2));
$I->assertEmpty($OrderManagePage->取得_出荷伝票番号(3));
$I->assertEquals('未発送', $OrderManagePage->取得_出荷日(1));
$I->assertEquals('未発送', $OrderManagePage->取得_出荷日(2));
$I->assertEquals('未発送', $OrderManagePage->取得_出荷日(3));

/*
* 出荷CSV登録
*/

$csv = implode(PHP_EOL, [
'出荷ID,出荷伝票番号,出荷日',
$Orders[0]->getShippings()[0]->getId().',00001,2018-01-01',
$Orders[1]->getShippings()[0]->getId().',00002,2018-02-02',
$Orders[2]->getShippings()[0]->getId().',00003,2018-03-03',
]);

$csvFileName = codecept_data_dir().'/shipping.csv';
file_put_contents($csvFileName, $csv);

try {
ShippingCsvUploadPage::go($I)
->入力_CSVファイル('shipping.csv')
->CSVアップロード();

$I->see(sprintf('%s: %s から %s へステータス変更できませんでした', $Orders[0]->getShippings()[0]->getId(), '決済処理中', '発送済み'),
'#upload_file_box__upload_error--1');
$I->see(sprintf('%s: %s から %s へステータス変更できませんでした', $Orders[1]->getShippings()[0]->getId(), '決済処理中', '発送済み'),
'#upload_file_box__upload_error--2');
$I->see(sprintf('%s: %s から %s へステータス変更できませんでした', $Orders[2]->getShippings()[0]->getId(), '決済処理中', '発送済み'),
'#upload_file_box__upload_error--3');
} finally {
if (file_exists($csvFileName)) {
unlink($csvFileName);
Expand Down
36 changes: 34 additions & 2 deletions src/Eccube/Controller/Admin/Shipping/CsvImportController.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,11 @@

use Eccube\Controller\Admin\AbstractCsvImportController;
use Eccube\Entity\Shipping;
use Eccube\Entity\Master\OrderStatus;
use Eccube\Form\Type\Admin\CsvImportType;
use Eccube\Repository\ShippingRepository;
use Eccube\Service\CsvImportService;
use Eccube\Service\OrderStateMachine;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Component\HttpFoundation\Request;
Expand All @@ -29,9 +31,17 @@ class CsvImportController extends AbstractCsvImportController
*/
private $shippingRepository;

public function __construct(ShippingRepository $shippingRepository)
{
/**
* @var OrderStateMachine
*/
protected $orderStateMachine;

public function __construct(
ShippingRepository $shippingRepository,
OrderStateMachine $orderStateMachine
) {
$this->shippingRepository = $shippingRepository;
$this->orderStateMachine = $orderStateMachine;
}

/**
Expand Down Expand Up @@ -142,6 +152,28 @@ protected function loadCsv(CsvImportService $csv, &$errors)
$shippingDate->setTime(0, 0, 0);
$Shipping->setShippingDate($shippingDate);
}

$Order = $Shipping->getOrder();
$RelateShippings = $Order->getShippings();
$allShipped = true;
foreach ($RelateShippings as $RelateShipping) {
if (!$RelateShipping->getShippingDate()) {
$allShipped = false;
break;
}
}
$OrderStatus = $this->entityManager->find(OrderStatus::class, OrderStatus::DELIVERED);
if ($allShipped) {
// XXX 先行の行で OrderStateMachine が OrderStatus::id を変更している場合があるので refresh する
$this->entityManager->refresh($Order);
if ($this->orderStateMachine->can($Order, $OrderStatus)) {
$this->orderStateMachine->apply($Order, $OrderStatus);
} else {
$from = $Order->getOrderStatus()->getName();
$to = $OrderStatus->getName();
$errors[] = sprintf('%s: %s から %s へステータス変更できませんでした', $Shipping->getId(), $from, $to);
}
}
}
}

Expand Down
14 changes: 13 additions & 1 deletion src/Eccube/Service/OrderStateMachine.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@

namespace Eccube\Service;

use Doctrine\ORM\EntityManagerInterface;
use Eccube\Entity\Master\OrderStatus;
use Eccube\Entity\Order;
use Eccube\Entity\Shipping;
Expand Down Expand Up @@ -46,12 +47,18 @@ class OrderStateMachine implements EventSubscriberInterface
*/
private $stockReduceProcessor;

public function __construct(StateMachine $_orderStateMachine, OrderStatusRepository $orderStatusRepository, PointProcessor $pointProcessor, StockReduceProcessor $stockReduceProcessor)
/**
* @var EntityManagerInterface
*/
private $entityManager;

public function __construct(StateMachine $_orderStateMachine, OrderStatusRepository $orderStatusRepository, PointProcessor $pointProcessor, StockReduceProcessor $stockReduceProcessor, EntityManagerInterface $entityManager)
{
$this->machine = $_orderStateMachine;
$this->orderStatusRepository = $orderStatusRepository;
$this->pointProcessor = $pointProcessor;
$this->stockReduceProcessor = $stockReduceProcessor;
$this->entityManager = $entityManager;
}

/**
Expand Down Expand Up @@ -221,6 +228,11 @@ public function onCompleted(Event $event)
/** @var Order $Order */
$Order = $event->getSubject();
$OrderStatusId = $Order->getOrderStatus()->getId();

// XXX このまま EntityManager::flush() をコールすると、 OrderStatus::id が更新されてしまうため元に戻す
$TransitionlStatus = $Order->getOrderStatus();
$this->entityManager->detach($TransitionlStatus);

$CompletedOrderStatus = $this->orderStatusRepository->find($OrderStatusId);
$Order->setOrderStatus($CompletedOrderStatus);
}
Expand Down
20 changes: 18 additions & 2 deletions tests/Eccube/Tests/Web/Admin/Shipping/CsvImportControllerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
namespace Eccube\Tests\Web\Admin\Shipping;

use Eccube\Controller\Admin\Shipping\CsvImportController;
use Eccube\Entity\Master\OrderStatus;
use Eccube\Service\CsvImportService;
use Eccube\Tests\Web\Admin\AbstractAdminWebTestCase;
use Symfony\Component\HttpFoundation\File\UploadedFile;
Expand Down Expand Up @@ -129,14 +130,25 @@ private function loadCsv($csvRows)

public function testCsvShipping()
{
$Shipping1 = $this->createOrder($this->createCustomer())->getShippings()[0];
$Shipping2 = $this->createOrder($this->createCustomer())->getShippings()[0];
$OrderStatus = $this->entityManager->find(OrderStatus::class, OrderStatus::NEW);
$Order1 = $this->createOrder($this->createCustomer());
$Order1->setOrderStatus($OrderStatus);
$Order2 = $this->createOrder($this->createCustomer());
$Order2->setOrderStatus($OrderStatus);
$Order3 = $this->createOrder($this->createCustomer());
$Order3->setOrderStatus($OrderStatus);
$this->entityManager->flush();

$Shipping1 = $Order1->getShippings()[0];
$Shipping2 = $Order2->getShippings()[0];
$Shipping3 = $Order3->getShippings()[0];

$tempFile = tempnam(sys_get_temp_dir(), 'csv_import_controller_test');
file_put_contents($tempFile, implode(PHP_EOL, [
'出荷ID,出荷伝票番号,出荷日',
$Shipping1->getId().',1234,2018-01-11',
$Shipping2->getId().',5678,2018-02-22',
$Shipping3->getId().',9012,2018-03-22',
]));

$file = new UploadedFile($tempFile, 'shipping.csv', 'text/csv', null, null, true);
Expand Down Expand Up @@ -165,6 +177,10 @@ public function testCsvShipping()
$this->entityManager->refresh($Shipping2);
self::assertEquals('5678', $Shipping2->getTrackingNumber());
self::assertEquals($this->parseDate('2018-02-22'), $Shipping2->getShippingDate());

$this->entityManager->refresh($Shipping3);
self::assertEquals('9012', $Shipping3->getTrackingNumber());
self::assertEquals($this->parseDate('2018-03-22'), $Shipping3->getShippingDate());
}

private function parseDate($value)
Expand Down

0 comments on commit 26236da

Please sign in to comment.