Current File : /var/www/vinorea/modules/ipexportimport/classes/import/order/EIASheduledTasks.php
<?php
/**
 *
 * NOTICE OF LICENSE
 *
 *  @author    SmartPresta <tehran.alishov@gmail.com>
 *  @copyright 2024 SmartPresta
 *  @license   Commercial License
 */

if (!defined('_PS_VERSION_')) {
    exit;
}

//require_once dirname(__FILE__) . '/EIACronExpression.php';
require_once dirname(__FILE__) . '/EIAConfiguration.php';

class EIASheduledTasks
{
    const TABLE_NAME_SHEDULED_TASKS = 'mpm_ipexportimport_task';
    const TABLE_NAME_SHEDULED_TASKS_WITH_PREFIX = _DB_PREFIX_ . self::TABLE_NAME_SHEDULED_TASKS;

    public static function getModuleSheduledTasksList($id_shop = false, $id_shop_group = false, $active = false)
    {
        $where = "";
        if(!$id_shop){
            $id_shop = (int)Context::getContext()->shop->id;
        }
        if(!$id_shop_group){
            $id_shop_group = (int)Context::getContext()->shop->id_shop_group;
        }
        if($active){
            $where = " AND t.active = 1";
        }
        $sql = '
			  SELECT t.*, c.name 
              FROM ' . self::TABLE_NAME_SHEDULED_TASKS_WITH_PREFIX . '  AS t
              LEFT JOIN ' . EIAConfiguration::TABLE_NAME_IMPORT_WITH_PREFIX . ' AS c
              ON c.id_setting = t.id_setting
              WHERE t.id_shop = '.$id_shop.'
              AND t.id_shop_group = '.$id_shop_group.'
              '.$where.'
			';
        return Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($sql);
    }

    public static function getCountTasks()
    {
        $id_shop = (int)Context::getContext()->shop->id;
        $id_shop_group = (int)Context::getContext()->shop->id_shop_group;
        $sql = '
			  SELECT count(*) as count_settings
              FROM ' . self::TABLE_NAME_SHEDULED_TASKS_WITH_PREFIX . '  AS t
              WHERE t.id_shop = '.$id_shop.'
              AND t.id_shop_group = '.$id_shop_group.'
			';

        $res = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($sql);
        if(isset($res[0]['count_settings']) && $res[0]['count_settings']){
            return $res[0]['count_settings'];
        }
        return 0;
    }

    public static function getLastTaskRunDate($id_task)
    {
        $sql = '
			  SELECT p.start
              FROM ' .  _DB_PREFIX_  . 'mpm_ipexportimport_process  AS p
              WHERE p.id_task = '.(int)$id_task.'
              ORDER BY  p.start DESC 
			';

        $res = Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue($sql);
        if($res){
            return date(Context::getContext()->language->date_format_full, $res);
        }
        return false;
    }

    public static function changeStatus($id_task, $val)
    {
        if ($id_task) {
            Db::getInstance(_PS_USE_SQL_SLAVE_)->update(self::TABLE_NAME_SHEDULED_TASKS, array('active' => $val), 'id_task=' . (int)$id_task);
        }
    }

    public static function save($task)
    {
        self::validate($task);
        $id_task = $task['id_task'];
        unset($task['id_task']);
        
        $task['id_shop'] = (int)Context::getContext()->shop->id;
        $task['id_shop_group'] = (int)Context::getContext()->shop->id_shop_group;
        $task['active'] = 1;

        if ($id_task) {
            if (!$task['one_shot']) {
                $task['is_one_shot_executed'] = false;
            }
            Db::getInstance(_PS_USE_SQL_SLAVE_)->update(self::TABLE_NAME_SHEDULED_TASKS, $task, 'id_task=' . (int)$id_task);
        } else {
            Db::getInstance(_PS_USE_SQL_SLAVE_)->insert(self::TABLE_NAME_SHEDULED_TASKS, $task);
            $id_task = Db::getInstance(_PS_USE_SQL_SLAVE_)->Insert_ID();
        }

        return $id_task;
    }

    public static function delete($id_task)
    {
       Db::getInstance(_PS_USE_SQL_SLAVE_)->delete(self::TABLE_NAME_SHEDULED_TASKS, 'id_task=' . (int)$id_task);
        return true;
    }

    public static function validate($task)
    {
        $cron_expression = new EIACronExpression($task['frequency']);
        if (!$cron_expression->isValid()) {
            throw new Exception(EIATranslatorWrapper::l('Please enter task frequency!'));
        }

        if (!$task['id_setting']) {
            throw new Exception(EIATranslatorWrapper::l('Please select export configration!'));
        }

        if ($task['email_message'] && !$task['emails']) {
            throw new Exception(EIATranslatorWrapper::l('Please enter email address!'));
        }

        if ($task['email_message'] && $task['emails']) {
            $emails = explode("\n", trim($task['emails']));
            foreach ($emails as $email) {
                $is_valid_email = \Validate::isEmail($email);

                if (!$is_valid_email) {
                    throw new Exception(EIATranslatorWrapper::l('Email - ') . $email . EIATranslatorWrapper::l(' is not valid!'));
                }
            }
        }

        return true;
    }

    public static function getTaskById($id_task)
    {
        $sql = '
			  SELECT t.*, c.name 
              FROM ' . self::TABLE_NAME_SHEDULED_TASKS_WITH_PREFIX . '  AS t
              LEFT JOIN ' . EIAConfiguration::TABLE_NAME_IMPORT_WITH_PREFIX . ' AS c
              ON c.id_setting = t.id_setting
              WHERE t.id_task = '.(int)$id_task.'
			';

        return Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow($sql);
    }

    public static function getById($id_task)
    {
        $query = "SELECT t.*, s.name 
                  FROM " . self::TABLE_NAME_SHEDULED_TASKS_WITH_PREFIX . "  AS t
                  LEFT JOIN " . EIAConfiguration::TABLE_NAME_IMPORT_WITH_PREFIX . " AS s
                  ON s.id_setting = t.id_setting
                  WHERE t.id_task=" . (int)$id_task;

        $task = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($query);
        if (empty($task[0])) {
            return [];
        }
        $task = $task[0];
        $cron_expression = new EIACronExpression($task['frequency']);
        $task['next_run'] = date(\Context::getContext()->language->date_format_full, $cron_expression->getNextRunTime());
        return $task;
    }

    public static function checkNotImportedTaskOrders(){
        $query = "SELECT * 
                  FROM " . _DB_PREFIX_ . "mpm_ipexportimport_data
                  WHERE 1";
        return Db::getInstance()->getRow($query);
    }
    
    public static function getSheduledUrl($id_task = false, $limit = false, $id_process = false)
    {
        $token = Configuration::getGlobalValue('MPM_IMPORT_ORDERS_TASKS_KEY');
        $admin_folder = str_replace(_PS_ROOT_DIR_ . '/', null, basename(_PS_ADMIN_DIR_));
        $id_shop = (int)Context::getContext()->shop->id;
        $id_lang = (int)Context::getContext()->language->id;
        $id_shop_group = (int)Context::getContext()->shop->id_shop_group;
        if (version_compare(_PS_VERSION_, '1.7', '<') == true) {
            $path = Tools::getShopDomainSsl(true, true) . __PS_BASE_URI__ . $admin_folder . '/';
            $schedule_url = $path . Context::getContext()->link->getAdminLink('AdminImportTask', false);
            $schedule_url .= '&id_shop=' . $id_shop . '&id_lang=' . $id_lang . '&task=true&id_shop_group=' . $id_shop_group . '&secure_key=' . $token;
        } else {
            $schedule_url = Context::getContext()->link->getAdminLink('AdminImportTask', false);
            $schedule_url .= '&id_shop=' . $id_shop . '&id_lang=' . $id_lang . '&task=true&id_shop_group=' . $id_shop_group . '&secure_key=' . $token;
        }

        if($id_task){
            $schedule_url .= '&id_task='.$id_task;
        }

        if($limit){
            $schedule_url .= '&limit=1';
        }

        if($id_process){
            $schedule_url .= '&id_process='.$id_process;
        }
        return $schedule_url;
    }

    public static function isShouldBeExecuted($task)
    {
        if ($task['one_shot'] && self::isOneShotExecuted($task['id_task'])) {
            return false;
        }
        $cron_expression = new EIACronExpression($task['frequency']);
        $next_run = $cron_expression->getNextRunTime();
        $now = time();
        if (($next_run - $now) <= 30) {
            return true;
        }
        return false;
    }

    public static function isOneShotExecuted($id_task)
    {
        $query = "SELECT `is_one_shot_executed` 
                  FROM " . self::TABLE_NAME_SHEDULED_TASKS_WITH_PREFIX . "
                  WHERE `id_task` = '".(int)$id_task."'";
        return Db::getInstance()->getValue($query);
    }

    public static function setOneShotIsExecuted($id_task, $is_one_shot_executed)
    {
        return Db::getInstance()->update(self::TABLE_NAME_SHEDULED_TASKS, ['is_one_shot_executed' => (int)$is_one_shot_executed], 'id_task=' . (int)$id_task);
    }
    
}