src/console/controllers/NotifyController.php
public function actionQuantityEmails()
    {
        $countEmails = ShopQuantityNoticeEmail::find()
            ->andWhere(['is_notified' => 0])
            ->orderBy(['created_at' => SORT_ASC])
            ->count();

        if (!$countEmails) {
            $this->stdout("Уведомить некого\n", Console::BOLD);
            return;
        }
        $this->stdout("Количество клиентов для уведомлений: ".$countEmails."\n", Console::BOLD);


        //Самый старый запрос на уведомление, начинаем искать изменения от него
        $shopQuantityNoticeEmail = ShopQuantityNoticeEmail::find()
            ->andWhere(['is_notified' => 0])
            ->orderBy(['created_at' => SORT_ASC])
            ->one();

        $this->stdout("\tСамый старый запрос на уведомление: ".\Yii::$app->formatter->asDatetime($shopQuantityNoticeEmail->created_at)."\n");

        $productIds = ShopQuantityNoticeEmail::find()
            ->andWhere(['is_notified' => 0])
            ->orderBy(['>=', 'created_at', $shopQuantityNoticeEmail->created_at])
            ->orderBy(['created_at' => SORT_ASC])
            ->groupBy('shop_product_id')
            ->indexBy('shop_product_id')
            ->asArray()
            ->all();

        if (!$productIds) {
            $this->stdout("\tТоваров не найдено\n");
        }
        $this->stdout("\tНужно проверить изменения по товарам на которые подписались: ".count($productIds)."\n");

        $productIds = array_keys($productIds);

        //Какие товары появлялись в наличии за это время?
        $productIds = ShopProductQuantityChange::find()
            ->andWhere(['shop_product_id' => $productIds])
            ->andWhere(['>=', 'created_at', $shopQuantityNoticeEmail->created_at])
            ->andWhere(['>', 'quantity', 0])
            ->groupBy('shop_product_id')
            ->indexBy('shop_product_id')
            ->asArray()
            ->all();

        if (!$productIds) {
            $this->stdout("\tНе было изменений по товарам\n");
        }
        $productIds = array_keys($productIds);
        $this->stdout("\tИзменилось товаров: ".count($productIds)."\n");
        /**
         * @var ShopProduct $product
         */
        foreach (ShopProduct::find()->where(['id' => $productIds])->each(10) as $product) {
            $this->stdout("\t\tТовар: {$product->cmsContentElement->name}\n");
            $this->stdout("\t\tНаличие: {$product->quantity}\n");

            if ($product->quantity <= 0) {
                continue;
            }

            if ($noticeEmails = $product->getShopQuantityNoticeEmails()
                ->andWhere(['is_notified' => 0])
                ->groupBy('email')
                ->orderBy(['created_at' => SORT_DESC])
                ->all()
            ) {
                $count = count($noticeEmails);
                $this->stdout("\t\tУведомить клиентов: {$count}\n");
                /**
                 * @var ShopQuantityNoticeEmail $noticeEmail
                 */
                foreach ($noticeEmails as $noticeEmail) {
                    $this->stdout("\t\t\tКлиент: {$noticeEmail->email}\n");
                    $this->_notifyCleint($noticeEmail);
                }
            }
        }
    }
public function actionQuantityEmails()
    {
        $countEmails = ShopQuantityNoticeEmail::find()
            ->andWhere(['is_notified' => 0])
            ->orderBy(['created_at' => SORT_ASC])
            ->count();

        if (!$countEmails) {
            $this->stdout("Уведомить некого\n", Console::BOLD);
            return;
        }
        $this->stdout("Количество клиентов для уведомлений: ".$countEmails."\n", Console::BOLD);


        //Самый старый запрос на уведомление, начинаем искать изменения от него
        $shopQuantityNoticeEmail = ShopQuantityNoticeEmail::find()
            ->andWhere(['is_notified' => 0])
            ->orderBy(['created_at' => SORT_ASC])
            ->one();

        $this->stdout("\tСамый старый запрос на уведомление: ".\Yii::$app->formatter->asDatetime($shopQuantityNoticeEmail->created_at)."\n");

        $productIds = ShopQuantityNoticeEmail::find()
            ->andWhere(['is_notified' => 0])
            ->orderBy(['>=', 'created_at', $shopQuantityNoticeEmail->created_at])
            ->orderBy(['created_at' => SORT_ASC])
            ->groupBy('shop_product_id')
            ->indexBy('shop_product_id')
            ->asArray()
            ->all();

        if (!$productIds) {
            $this->stdout("\tТоваров не найдено\n");
        }
        $this->stdout("\tНужно проверить изменения по товарам на которые подписались: ".count($productIds)."\n");

        $productIds = array_keys($productIds);

        //Какие товары появлялись в наличии за это время?
        $productIds = ShopProductQuantityChange::find()
            ->andWhere(['shop_product_id' => $productIds])
            ->andWhere(['>=', 'created_at', $shopQuantityNoticeEmail->created_at])
            ->andWhere(['>', 'quantity', 0])
            ->groupBy('shop_product_id')
            ->indexBy('shop_product_id')
            ->asArray()
            ->all();

        if (!$productIds) {
            $this->stdout("\tНе было изменений по товарам\n");
        }
        $productIds = array_keys($productIds);
        $this->stdout("\tИзменилось товаров: ".count($productIds)."\n");
        /**
         * @var ShopProduct $product
         */
        foreach (ShopProduct::find()->where(['id' => $productIds])->each(10) as $product) {
            $this->stdout("\t\tТовар: {$product->cmsContentElement->name}\n");
            $this->stdout("\t\tНаличие: {$product->quantity}\n");

            if ($product->quantity <= 0) {
                continue;
            }

            if ($noticeEmails = $product->getShopQuantityNoticeEmails()
                ->andWhere(['is_notified' => 0])
                ->groupBy('email')
                ->orderBy(['created_at' => SORT_DESC])
                ->all()
            ) {
                $count = count($noticeEmails);
                $this->stdout("\t\tУведомить клиентов: {$count}\n");
                /**
                 * @var ShopQuantityNoticeEmail $noticeEmail
                 */
                foreach ($noticeEmails as $noticeEmail) {
                    $this->stdout("\t\t\tКлиент: {$noticeEmail->email}\n");
                    $this->_notifyCleint($noticeEmail);
                }
            }
        }
    }
Просмотр созданных бекапов баз данных