diff --git a/Command/StatusesCommand.php b/Command/StatusesCommand.php
index 3168b18..1a92722 100644
--- a/Command/StatusesCommand.php
+++ b/Command/StatusesCommand.php
@@ -2,8 +2,7 @@
namespace RetailCrm\DeliveryModuleBundle\Command;
-use Doctrine\ORM\Tools\Pagination\Paginator;
-use RetailCrm\DeliveryModuleBundle\Exception\AbstractModuleException;
+use Doctrine\Persistence\ObjectManager;
use RetailCrm\DeliveryModuleBundle\Service\AccountManager;
use RetailCrm\DeliveryModuleBundle\Service\ModuleManagerInterface;
use Symfony\Component\Console\Command\Command;
@@ -16,6 +15,8 @@ class StatusesCommand extends Command
{
use LockableTrait;
+ const QUERY_MAX_RESULTS = 100;
+
/**
* @var ModuleManagerInterface
*/
@@ -26,6 +27,11 @@ class StatusesCommand extends Command
*/
private $accountManager;
+ /**
+ * @var ObjectManager
+ */
+ private $entityManager;
+
/**
* {@inheritdoc}
*/
@@ -34,13 +40,15 @@ class StatusesCommand extends Command
$this
->setName('statuses:update')
->setDescription('Update statuses')
- ->addArgument('accountId', InputArgument::OPTIONAL, 'Choose account, or make it for all');
+ ->addArgument('accountId', InputArgument::OPTIONAL, 'Choose account, or make it for all')
+ ;
}
- public function __construct(ModuleManagerInterface $moduleManager, AccountManager $accountManager)
+ public function __construct(ModuleManagerInterface $moduleManager, AccountManager $accountManager, ObjectManager $entityManager)
{
$this->moduleManager = $moduleManager;
$this->accountManager = $accountManager;
+ $this->entityManager = $entityManager;
parent::__construct();
}
@@ -60,40 +68,57 @@ class StatusesCommand extends Command
? (int) $input->getArgument('accountId')
: null;
- $paginator = [];
+ $accountQueryBuilder = $this->accountManager->getActiveQueryBuilder()
+ ->andWhere('account.id > :lastId')
+ ->setMaxResults(static::QUERY_MAX_RESULTS)
+ ;
+
if (null !== $accountId) {
- $paginator = [$this->accountManager - find($accountId)];
- } else {
- $accountQuery = $this->accountManager->getRepository()
- ->createQueryBuilder('account')
- ->where('account.active = true')
- ->andWhere('account.freeze != true')
- ->addOrderBy('account.id')
- ->getQuery()
- ->setFirstResult(0)
- ->setMaxResults(100);
- $paginator = new Paginator($accountQuery);
+ $accountQueryBuilder
+ ->andWhere('account.id = :accountId')
+ ->setParameter('accountId', $accountId)
+ ;
}
+ $accountQuery = $accountQueryBuilder->getQuery();
+
+ $commandResult = 0;
$count = 0;
- foreach ($paginator as $account) {
- try {
- $count += $this->moduleManager
- ->setAccount($account)
- ->updateStatuses()
- ;
- } catch (AbstractModuleException $e) {
- $output->writeln(
- "Failed to update statuses for account {$account->getCrmUrl()}[{$account->getId()}]"
- );
- $output->writeln("Error: {$e->getMessage()}");
+ $lastId = 0;
+ while (true) {
+ $accountQuery->setParameter('lastId', $lastId);
+
+ $result = $accountQuery->getResult();
+ if (empty($result)) {
+ break;
}
+
+ foreach ($result as $account) {
+ $lastId = $account->getId();
+
+ try {
+ $count += $this->moduleManager
+ ->setAccount($account)
+ ->updateStatuses()
+ ;
+ } catch (\Exception $e) {
+ $output->writeln(
+ "Failed to update statuses for account {$account->getCrmUrl()}[{$account->getId()}]"
+ );
+ $output->writeln("Error: {$e->getMessage()}");
+
+ $commandResult = 1;
+ }
+ }
+
+ $this->entityManager->clear();
+ gc_collect_cycles();
}
$output->writeln("{$count} statuses updated.");
$this->release();
- return 0;
+ return $commandResult;
}
}
diff --git a/Command/Traits/CommandOutputFormatterTrait.php b/Command/Traits/CommandOutputFormatterTrait.php
new file mode 100644
index 0000000..9db1b4b
--- /dev/null
+++ b/Command/Traits/CommandOutputFormatterTrait.php
@@ -0,0 +1,21 @@
+getMessage('INFO', $message);
+ }
+
+ public function getErrorMessage(string $message): string
+ {
+ return $this->getMessage('ERROR', $message);
+ }
+}
\ No newline at end of file
diff --git a/Command/UpdateModuleCommand.php b/Command/UpdateModuleCommand.php
index a5e6632..e36be72 100644
--- a/Command/UpdateModuleCommand.php
+++ b/Command/UpdateModuleCommand.php
@@ -2,7 +2,7 @@
namespace RetailCrm\DeliveryModuleBundle\Command;
-use Doctrine\ORM\Tools\Pagination\Paginator;
+use Doctrine\Persistence\ObjectManager;
use RetailCrm\DeliveryModuleBundle\Service\AccountManager;
use RetailCrm\DeliveryModuleBundle\Service\ModuleManagerInterface;
use Symfony\Component\Console\Command\Command;
@@ -15,6 +15,8 @@ class UpdateModuleCommand extends Command
{
use LockableTrait;
+ const QUERY_MAX_RESULTS = 100;
+
/**
* @var ModuleManagerInterface
*/
@@ -25,6 +27,11 @@ class UpdateModuleCommand extends Command
*/
private $accountManager;
+ /**
+ * @var ObjectManager
+ */
+ private $entityManager;
+
/**
* {@inheritdoc}
*/
@@ -33,13 +40,15 @@ class UpdateModuleCommand extends Command
$this
->setName('module:update')
->setDescription('Update module')
- ->addArgument('accountId', InputArgument::OPTIONAL, 'Choose account, or make it for all');
+ ->addArgument('accountId', InputArgument::OPTIONAL, 'Choose account, or make it for all')
+ ;
}
- public function __construct(ModuleManagerInterface $moduleManager, AccountManager $accountManager)
+ public function __construct(ModuleManagerInterface $moduleManager, AccountManager $accountManager, ObjectManager $entityManager)
{
$this->moduleManager = $moduleManager;
$this->accountManager = $accountManager;
+ $this->entityManager = $entityManager;
parent::__construct();
}
@@ -59,41 +68,59 @@ class UpdateModuleCommand extends Command
? $input->getArgument('accountId')
: null;
- $paginator = [];
+ $accountQueryBuilder = $this->accountManager->getActiveQueryBuilder()
+ ->andWhere('account.id > :lastId')
+ ->setMaxResults(static::QUERY_MAX_RESULTS)
+ ;
+
if (null !== $accountId) {
- $paginator = [$this->accountManager->find($accountId)];
- } else {
- $accountQuery = $this->accountManager->getRepository()
- ->createQueryBuilder('account')
- ->where('account.active = true')
- ->andWhere('account.freeze != true')
- ->addOrderBy('account.id')
- ->getQuery()
- ->setFirstResult(0)
- ->setMaxResults(100);
- $paginator = new Paginator($accountQuery);
+ $accountQueryBuilder
+ ->andWhere('account.id = :accountId')
+ ->setParameter('accountId', $accountId)
+ ;
}
+ $accountQuery = $accountQueryBuilder->getQuery();
+
+ $commandResult = 0;
$count = 0;
- foreach ($paginator as $account) {
- try {
- $this->moduleManager
- ->setAccount($account)
- ->updateModuleConfiguration()
- ;
- ++$count;
- } catch (\Exception $e) {
- $output->writeln(
- "Failed to update configuration for account {$account->getCrmUrl()}[{$account->getId()}]"
- );
- $output->writeln("Error: {$e->getMessage()}");
+
+ $lastId = 0;
+ while (true) {
+ $accountQuery->setParameter('lastId', $lastId);
+
+ $result = $accountQuery->getResult();
+ if (empty($result)) {
+ break;
}
+
+ foreach ($result as $account) {
+ $lastId = $account->getId();
+
+ try {
+ $this->moduleManager
+ ->setAccount($account)
+ ->updateModuleConfiguration()
+ ;
+ ++$count;
+ } catch (\Exception $e) {
+ $output->writeln(
+ "Failed to update configuration for account {$account->getCrmUrl()}[{$account->getId()}]"
+ );
+ $output->writeln("Error: {$e->getMessage()}");
+
+ $commandResult = 1;
+ }
+ }
+
+ $this->entityManager->clear();
+ gc_collect_cycles();
}
$output->writeln("{$count} modules updated.");
$this->release();
- return 0;
+ return $commandResult;
}
}
diff --git a/Model/Customer.php b/Model/Customer.php
index 83b18ec..30b250d 100644
--- a/Model/Customer.php
+++ b/Model/Customer.php
@@ -79,7 +79,7 @@ class Customer
*
* @Serializer\Groups({"get"})
* @Serializer\SerializedName("contragent")
- * @Serializer\Type("RetailCrm\DeliveryModuleBundle\Model\Model\Contragent")
+ * @Serializer\Type("RetailCrm\DeliveryModuleBundle\Model\Contragent")
*/
public $contragent;
diff --git a/Model/Request/RequestCalculate.php b/Model/Request/RequestCalculate.php
index f0eb59e..a5dad7b 100644
--- a/Model/Request/RequestCalculate.php
+++ b/Model/Request/RequestCalculate.php
@@ -1,13 +1,14 @@
+ *
+ * @Serializer\Groups({"request"})
+ * @Serializer\SerializedName("mo")
+ * @Serializer\Type("array")
+ */
+ public $monday;
+
+ /**
+ * @var array
+ *
+ * @Serializer\Groups({"request"})
+ * @Serializer\SerializedName("tu")
+ * @Serializer\Type("array")
+ */
+ public $tuesday;
+
+ /**
+ * @var array
+ *
+ * @Serializer\Groups({"request"})
+ * @Serializer\SerializedName("we")
+ * @Serializer\Type("array")
+ */
+ public $wednesday;
+
+ /**
+ * @var array
+ *
+ * @Serializer\Groups({"request"})
+ * @Serializer\SerializedName("th")
+ * @Serializer\Type("array")
+ */
+ public $thursday;
+
+ /**
+ * @var array
+ *
+ * @Serializer\Groups({"request"})
+ * @Serializer\SerializedName("fr")
+ * @Serializer\Type("array")
+ */
+ public $friday;
+
+ /**
+ * @var array
+ *
+ * @Serializer\Groups({"request"})
+ * @Serializer\SerializedName("sa")
+ * @Serializer\Type("array")
+ */
+ public $saturday;
+
+ /**
+ * @var array
+ *
+ * @Serializer\Groups({"request"})
+ * @Serializer\SerializedName("su")
+ * @Serializer\Type("array")
+ */
+ public $sunday;
+}
\ No newline at end of file
diff --git a/Model/StoreWorkTimeItem.php b/Model/StoreWorkTimeItem.php
new file mode 100644
index 0000000..80ebac8
--- /dev/null
+++ b/Model/StoreWorkTimeItem.php
@@ -0,0 +1,44 @@
+entityManager->getRepository($this->class);
}
+
+ public function getActiveQueryBuilder()
+ {
+ return $this->getRepository()->createQueryBuilder('account')
+ ->where('account.active = true')
+ ->andWhere('account.freeze != true')
+ ->orderBy('account.id')
+ ;
+ }
}
diff --git a/Service/DeliveryOrderManager.php b/Service/DeliveryOrderManager.php
index e68390f..4f8161c 100644
--- a/Service/DeliveryOrderManager.php
+++ b/Service/DeliveryOrderManager.php
@@ -8,8 +8,16 @@ use RetailCrm\DeliveryModuleBundle\Model\Entity\DeliveryOrder;
class DeliveryOrderManager
{
+ /**
+ * @var string
+ */
protected $class;
+ /**
+ * @var ObjectManager
+ */
+ protected $entityManager;
+
public function __construct(string $deliveryOrderClass, ObjectManager $entityManager)
{
$this->class = $deliveryOrderClass;
diff --git a/Service/ModuleManager.php b/Service/ModuleManager.php
index d20f512..da488ab 100644
--- a/Service/ModuleManager.php
+++ b/Service/ModuleManager.php
@@ -79,7 +79,7 @@ abstract class ModuleManager implements ModuleManagerInterface
/**
* @var LoggerInterface
*/
- private $logger;
+ protected $logger;
public function __construct(
array $moduleParameters,
@@ -157,8 +157,9 @@ abstract class ModuleManager implements ModuleManagerInterface
return true;
} else {
if ($this->logger) {
- $errorMsg = $response['error_msg'] ?? '';
- $this->logger->warning("Failed to update module configuration[account={$this->getAccount()->getCrmUrl()}]:{$errorMsg}");
+ $errorMsg = $response['errorMsg'] ?? '';
+ $errors = json_encode($response['errors'] ?? '');
+ $this->logger->warning("Failed to update module configuration[account={$this->getAccount()->getCrmUrl()}]: {$errorMsg}. Detailed errors: {$errors}");
}
return false;
@@ -238,7 +239,7 @@ abstract class ModuleManager implements ModuleManagerInterface
{
$deliveries = $this->deliveryManager->findBy([
'account' => $this->account,
- 'externalId' => $request->deliveryIds,
+ 'externalId' => $request->deliveryIds[0] ?? null,
]);
if (empty($deliveries)) {