2018-04-01 Избыточное Решение

Нарушено правило: Не нужно решать простую задачу слишком хорошо с запасом на будущее.
Постановка задачи: Добавить проверку, если было более 3 FATAL задач обращений в тех.поддержку то создать задачу для проведения аудита клиента руками разработчика.
Ошибка: Решено слишком сложно и избыточно.
Как надо делать: Можно сделать в один два селекта и просто создание задачи и запускать срипт раз в мес.

Неверное решение

#!/usr/bin/php
 
<?php
/**
 * Created by PhpStorm.
 * User: 
 * Date: 23.03.18
 * Time: 16:58
 * Запускается раз в месяц по cron 1 числа и находит сервера с FATAL задачами.
 * Если на сервере больше 3 FATAL за месяц создается задача на аудит сервера
 */
 
require_once('/var/www/vcrm/carbon/utils/osv_lib2.php');
require_once('/var/www/vcrm/rest/ticket_for_alarm_patch.php');
 
$clients = sqlexec("SELECT DISTINCT vtiger_account.accountid AS accountid, cf_regnumber, cf_regproduct, accountname
 
	FROM vtiger_potential
 
	INNER JOIN vtiger_crmentity ON vtiger_crmentity.crmid = vtiger_potential.potentialid
 
	AND vtiger_crmentity.deleted =0
 
	INNER JOIN vtiger_potentialscf ON vtiger_potential.potentialid = vtiger_potentialscf.potentialid
	INNER JOIN vtiger_account ON vtiger_potential.related_to=vtiger_account.accountid
 
	INNER JOIN vtiger_invoice i ON vtiger_account.accountid=i.accountid AND invoicedate > DATE_SUB(NOW(),INTERVAL 1 YEAR)
 
	WHERE
	sales_stage='Closed Won'
	AND cf_regproduct NOT LIKE '%4-SoftRouter%'
	AND cf_regproduct NOT LIKE '%illing4%'
	AND cf_regproduct NOT LIKE '%ASR%'
	AND cf_regproduct NOT LIKE '%NAS%'
	AND cf_regproduct NOT LIKE '%ICS25'
 
	AND accountname NOT LIKE '%carbonsoft%'
	AND cf_regsupport NOT LIKE '%Без поддержки%'
 
	ORDER BY accountname, cf_regproduct, cf_regbranch");
 
 
function search_tasks_by_title($client, $title, $interval, $status = 0)
{
    $sql = "select tcf.ticketid, vtt.title from vtiger_ticketcf tcf 
			inner join vtiger_troubletickets t ON t.ticketid=tcf.ticketid
			JOIN vtiger_crmentity ce ON ce.crmid=tcf.ticketid
			JOIN vtiger_troubletickets vtt ON vtt.ticketid = tcf.ticketid
		WHERE
		t.parent_id = {$client[accountid]}
		AND t.title LIKE '%$title%'
		AND ce.deleted=0
		AND tcf.cf_regnom = '" . $client[cf_regnumber] . "'
		AND ce.createdtime > DATE_SUB(NOW(),INTERVAL $interval DAY)";
    if ($status == 1) {
        $sql = $sql . " AND t.STATUS != 'Closed' AND t.STATUS != 'Подтверждение закрытия' AND tcf.cf_chernovik = '" . $client[cf_chernovik] . "'";
    } else {
        $sql = $sql . "AND t.title NOT LIKE '%аудит сервера%'";
    }
    $open_tickets = sqlexec($sql);
    return $open_tickets;
}
 
foreach ($clients as $client) {
    $open_ticket_fatal = search_tasks_by_title($client, 'FATAL', 30);
    if (count($open_ticket_fatal) >= 3) {
        $date = new DateTime();
        $date = $date->format("y:m:d h:i:s");
        $carbon_client = array();
        $carbon_client['accountid'] = '200678';
        $carbon_client['cf_chernovik'] = $client['cf_regnumber'];
        $open_ticket_fatal_exist = search_tasks_by_title($carbon_client, "Провести аудит сервера", 30, 1);
        if (!empty($open_ticket_fatal_exist)) {
            echo($date . " Заявка на аудит сервера уже существует \n");
            echo($date . " https://crm.carbonsoft.ru/t/" . $open_ticket_fatal_exist[0]['ticketid'] . "\n");
            continue;
        }
        $description = '';
        echo($date . " Нужно создать заявку на аудит сервера " . $client['cf_regnumber'] . "\n");
        $title = "FATAL Провести аудит сервера " . $client['accountname'];
        foreach ($open_ticket_fatal as $ticket) {
            $description .= $ticket['title'] . " https://crm.carbonsoft.ru/t/" . $ticket['ticketid'] . "\n";
        }
        $alarm['user_email'] = 'reductor.sup.head@carbonsoft.ru';
        $alarm['title'] = iconv('utf-8', 'utf-8//IGNORE', $title);
        $alarm['description'] = $description;
        $alarm['cf_chernovik'] = $client['cf_regnumber'];
        rest_ticket_create($alarm);
    }
}

Правильное достаточное решение:

#!/usr/bin/php
<?php
/**
 * Запускается раз в месяц по cron 1 числа и находит сервера с FATAL задачами.
 * Если на сервере больше 3 FATAL за месяц создается задача на аудит сервера
 * Проходим по всем регномерам и ишем более 3 FATAL заявок за последний месяц
 */
require_once('/var/www/vcrm/carbon/utils/osv_lib2.php');
require_once('/var/www/vcrm/rest/ticket_for_alarm_patch.php');
$regnums = sqlexec("SELECT cf_regnom
	FROM vtiger_ticketcf
	INNER JOIN vtiger_troubletickets ON vtiger_ticketcf.ticketid = vtiger_troubletickets.ticketid
	INNER JOIN vtiger_crmentity ON vtiger_crmentity.crmid = vtiger_ticketcf.ticketid
	INNER JOIN vtiger_account  ON vtiger_account.accountid = vtiger_troubletickets.parent_id
	WHERE
	vtiger_troubletickets.title LIKE '%FATAL%'
	AND vtiger_crmentity.deleted=0
	AND vtiger_crmentity.createdtime > DATE_SUB(NOW(),INTERVAL 30 DAY)
	AND cf_regnom != ''
	AND vtiger_ticketcf.cf_viddeyatel_nosti LIKE '%Поддержка%'
	GROUP BY cf_regnom
	HAVING COUNT(vtiger_ticketcf.ticketid) > 3");
foreach ($regnums as $regnum) {
    $alarm['user_email'] = "reductor.sup.head@carbonsoft.ru";
    $alarm['regnumber'] = $regnum['cf_regnom'];
    $alarm['title'] = "Провести аудит сервера {$regnum['cf_regnom']}";
    rest_ticket_create($alarm);
}
Прочитал правила разработки как не надо делать 2018-04-01 избыточное решение
Yes(39) No(0) Clear

Yes:
, 1, -1 OR 2+708-708-1=0+0+0+1 -- , -1 OR 3+708-708-1=0+0+0+1 -- , -1 OR 3*2<(0+5+708-708) -- , -1 OR 3*2>(0+5+708-708) -- , -1 OR 2+1-1-1=1 AND 708=708 -- , -1 OR 2+1-1+1=1 AND 708=708 -- , -1 OR 2+436-436-1=0+0+0+1, -1 OR 3+436-436-1=0+0+0+1, -1 OR 3*2<(0+5+436-436), -1 OR 3*2>(0+5+436-436), -1' OR 2+292-292-1=0+0+0+1 -- , -1' OR 3+292-292-1=0+0+0+1 -- , -1' OR 3*2<(0+5+292-292) -- , -1' OR 3*2>(0+5+292-292) -- , -1' OR 2+468-468-1=0+0+0+1 or 'cJaNmFRA'=', -1' OR 3+468-468-1=0+0+0+1 or 'cJaNmFRA'=', -1" OR 2+479-479-1=0+0+0+1 -- , -1" OR 3+479-479-1=0+0+0+1 -- , if(now()=sysdate(),sleep(15),0), 0'XOR(if(now()=sysdate(),sleep(15),0))XOR'Z, 0"XOR(if(now()=sysdate(),sleep(15),0))XOR"Z, (select(0)from(select(sleep(15)))v)/*'+(select(0)from(select(sleep(15)))v)+'"+(select(0)from(select(sleep(15)))v)+"*/, -1; waitfor delay '0:0:15' -- , -1); waitfor delay '0:0:15' -- , 1 waitfor delay '0:0:15' -- , UQUdXtF7'; waitfor delay '0:0:15' -- , -5 OR 363=(SELECT 363 FROM PG_SLEEP(15))--, -5) OR 623=(SELECT 623 FROM PG_SLEEP(15))--, -1)) OR 562=(SELECT 562 FROM PG_SLEEP(15))--, 9Na5AOBf' OR 69=(SELECT 69 FROM PG_SLEEP(15))--, An5AYSbT') OR 520=(SELECT 520 FROM PG_SLEEP(15))--, q5b968NW')) OR 281=(SELECT 281 FROM PG_SLEEP(15))--, 1*DBMS_PIPE.RECEIVE_MESSAGE(CHR(99), 1', 1'", 1%2527%2522, @@8n4kj,

No:

~~OWNERAPPROVE~~

Ваш комментарий. Вики-синтаксис разрешён: