EventMailTask.php 10.5 KB
<?php

class EventMailTask extends \Phalcon\CLI\Task
{
    private $projects;
    private $event_info;
    private $post;



    function mainAction(){


        $projects      = \projects::find();

        $eventsData = $this->getEventData($projects);

        foreach($eventsData as $project_id => $events){
            foreach($events as $event){
                echo "call function \n";
                $this->eventMailerAction($project_id, $event);


            }

        }


    }

    public function startEventsAction(){
        $this->actionEventAction();
        $this->orderTimeAfterAction();
        $this->seriesOfLettersAction();
    }

    public function seriesOfLettersAction(){

        $projects = $this->getActiveProjects();

        foreach($projects as $project){


            $events = \eventInfo::getEventsByTrigger($this->modelsManager, $project->id, 'series_of_letter');

            foreach($events as $event){
                if($event instanceof \eventInfo){

                    $customers = (new customersEmailList())->findFirst("id={$event->customer_id}");

                    if($customers instanceof customersEmailList){

                        $eventEmail = ( new \eventEmail())->findFirst("id={$event->event_id}");
                        if($eventEmail instanceof eventEmail){
                            $eventEmail = $eventEmail->toArray();
                            print_r($eventEmail);
                        }else {
                            continue;
                        }
                        $template = \emailTemplates::findFirst("event_id = {$event->event_id} AND project_id = {$project->id}")->toArray();

                        $this->post['name']=$customers->name;
                        $this->post['email']=$customers->email;
                        $this->post['phone']=$customers->phone;
                        $this->post['address']=$customers->address;

                        $this->sendMailData($template,$customers->toArray(),$eventEmail,$project);

                        $event->last_delivery =  date("Y-m-d H:i:s");
                        $event->delete();
                    }




                }
            }

        }
    }

    public function actionEventAction(){
        $projects = $this->getActiveProjects();

        foreach($projects as $project){

            $events = $this->eventByTrigger($project,'action');

            foreach($events as $event){

                if(!$event->isNew() ){
                    if(!$event->isRecurring()){
                        continue;
                    }
                }
                print_r($event->toArray());
                switch ($event->event_action) {
                    case 'birthday':
                        $customers = $project->findUsersByBirthday();
                        foreach($customers as $customer){
                            $this->post['name']=$customer->name;
                            $this->post['email']=$customer->email;
                            $this->post['phone']=$customer->phone;
                            $this->post['address']=$customer->address;
                            $this->sendMail($customer->toArray(),$project,$event,$event->eventEmail->toArray());
                        }


                        break;
                }
            }
        }


    }


    public function orderTimeAfterAction(){
        $projects = $this->getActiveProjects();
        $model = new \spyEvent();
        $customers_model = new customersEmailList();
        foreach($projects as $project){

            $events = $this->eventByTrigger($project,'order_time_after');

            foreach($events as $event){

                if(!$event->isNew() ){
                    if(!$event->isRecurring()){
                        continue;
                    }
                }

                $users = $model->getSpyUsers( $this->modelsManager, $project);

                foreach( $users  as $user){
                    $event_data = $model->spyTimeAfter($project, $user['id'])->toArray();
                    $customers = $customers_model->findFirst("id={$user['id']}");

                    if($customers instanceof customersEmailList && $customers->checkEventForUser($event->id, $project->id)){
                        $sum = 0;
                        foreach($event_data as $item_one){
                            $sum += (integer)$item_one['price']*$item_one['quantity'];
                        }
                        $this->post['name']=$customers->name;
                        $this->post['email']=$customers->email;
                        $this->post['phone']=$customers->phone;
                        $this->post['address']=$customers->address;
                        $this->post['sum']=$sum;


                        $this->sendMail($customers->toArray(),$project,$event,$event->eventEmail->toArray(),$event_data);

                    }

                }

                //$customers = $project->findUsersTimeAfter()->toArray();

            }
        }
    }

    /**
     *TODO: $this->post array with dynamic data for static letters, need to change in some variable
     *
     *
     *
     **/
    private function prepareEventData($item_data, $template){

        if($template['text_type']=='static' ){


            if( $item_data ){
                $template['text']  = $this->MyMailer->OnlineEvent->itemSet( $template, $item_data );
            }
            $template['text']  = $this->MyMailer->OnlineEvent->dataSet( $template['text'], $this->post );




        } else {

            if( $item_data ) {
                $template['text'] = $this->MyMailer->OfflineEvent->itemDynamicSet($template, $item_data);
            }
            $template['text'] = $this->MyMailer->OnlineEvent->dataSet( $template['text'], $this->post );

        }
        return $template['text'];

    }


    private function eventByTrigger($project, $trigger){

        $result = array();

        foreach($project->offlineEvents() as $eventOffline){
            $offlineData = $eventOffline->selectByTrigger($trigger);
            foreach($offlineData as $data){
                $result[] = $data;
            }

        }

        return $result;
    }

    private function getActiveProjects(){

        return \projects::find("status = 'active'");

    }



    private function getEventInfo($event, $customers,$project){
        $info = \eventInfo::findFirst("event_id = {$event->id} AND customer_id = {$customers['id']}");

        if($info instanceof \eventInfo){
            return $info;
        } else {
            $info =  new \eventInfo();
            $info->customer_id = $customers['id'];
            $info->event_id = $event->id;
            $info->project_id = $project->id;
            $info->event_trigger = $event->event_trigger;
            $info->save();
            return $info;
        }
    }


    /**
     * send Email
     * @params array $customers
     * @params object $project
     * @params object $offline_data_model
     * @params array $event
     * @params array $event_data
    **/
    public function sendMail($customers,$project,$offline_data_model, $event,  $event_data = [] ){

        if($customers){

            $event_info = $this->getEventInfo($offline_data_model,$customers,$project);

            $template = \emailTemplates::findFirst("event_id = {$event['id']} AND project_id = {$project->id}")->toArray();



//            if(isset($get['item_data']) && !empty($get['item_data'])){
//                 $item_data = json_decode($get['item_data']);
//
//                 $template->text = $this->UTMParser->itemSet( $template->toArray(), $item_data );
//
//            }

            $this->sendMailData($template,$customers,$event,$project,$event_data);

            $event_info->last_delivery =  date("Y-m-d H:i:s");
            $event_info->save();

//            $model = \delivery::find();
//            foreach($model->toArray() as $data){
//                $result  =  $this->MyMailer->getCampaignDeliveryStats( $data['campaign_id']);
//
//                $result['status'] =  $this->MyMailer->getDeliveryStatus( $data['campaign_id']);
//                print_r($result);
//            }
//            $model->status =  $this->MyMailer->getCampaignDeliveryStats( $id);
        }
    }


    /**
     * send Email
     * @params array $customers
     * @params object $project
     * @params array $event
     * @params array $event_data
     * @params array $template
     **/

    private function sendMailData($template,$customers,$event,$project,$event_data=[])
    {
        $template['text'] = $this->prepareEventData($event_data, $template);

        $template['text'] = $this->UTMParser->parse($event, $template);

        $this->MyMailer->OfflineEvent->setFromName($project->name);

        $this->MyMailer->OfflineEvent->SendDelivery(new \delivery(),$template,$event,[$customers]);

    }



    public function getEventData($projects){
        $eventsData = array();
        $date = date('d.m.Y');

        foreach($projects as $project){

            $events = \eventEmail::find("email_type='event_offline' AND project_id=$project->id")->toArray();

            if( $events ){

                foreach($events as $k => $v){

                    $conditions = \eventOfflineData::find("event_id = {$v['id']}")->toArray();
                    if(!empty($conditions)){
                        $events[$k]['conditions'] = $conditions[0];
                    } else {
                        $events[$k]['conditions'] = array();
                    }


                    if(!empty($events[$k]['conditions']['event_trigger']) ) {

                        if($events[$k]['conditions']['event_trigger'] == 'birthday'){
                            $events[$k]['users'] = \customersEmailList::find("project_id=$project->id AND birthday = '$date'")->toArray();
                        }
                        continue;
                    }

                    if(!empty($events[$k]['conditions']['event_date']) && $events[$k]['conditions']['event_date'] == $date ) {
                        $events[$k]['users'] = \customersEmailList::find("project_id=$project->id")->toArray();
                        echo "will send today";
                    }

                    if(!empty($events[$k]['conditions']['equal_fields_one'])){

                        $events[$k]['users'] = \customersEmailList::find("project_id=$project->id AND {$events[$k]['conditions']['equal_fields_one']} = '{$events[$k]['conditions']['equal_fields_two']}'")->toArray();

                    }


                }

                $eventsData[$project->id] = $events;
            }

        }

        return $eventsData;
    }

}