Перейти к содержимому


Представление Воронка


  • Вы не можете ответить в тему
В этой теме нет ответов

#1 Oleg

    Новичок

  • Пользователи
  • Pip
  • 7 сообщений

Отправлено 14 Сентябрь 2016 - 22:40

if ($event['type'] == 'delete') {
    $deleteCond = " AND id<>" . $ID;
							    }

if (!$line['Тип клиента']) {
    $line['Тип клиента'] = $line['Клиент']['Тип'];
						   }
// значение при добавлении позиции
$line['Текущий тип клиента'] = $line['Клиент']['Тип'];

if ($line['Тип клиента'] == "Клиент") {
    if (!$line['Статус до']) {
	    $line['Статус до'] = $line['Клиент']['Статус'];
							 }
    if (!$line['Статус']) {
	    $line['Статус'] = $line['Статус до'];
						  }
									   }
/* Цель: находим сколько времени контрагент сидел в каждом статусе */
if ($line['Клиент']['raw']) {
    // статусы
    $result = sql_select_field(FIELDS_TABLE, "type_value", "id=", 530);
    $row = sql_fetch_assoc($result);
    $statusArray = explode("\r\n", $row['type_value']);
    $timeDiff = array();
    foreach ($statusArray as $status) {
	    $timeDiff[$status] = 0;
									  }
    // выбираем все позиции, кроме текущей
    $positions = data_select_array(
	    80,
	    "ALL_ROWS",
	    "f1660=",
	    $line['Клиент']['raw'],
	    "
													   AND status=0
													   AND f510='Да'
													   AND f480<>'0000-00-00 00:00:00'
													   AND f530<>''
													   AND f550='Клиент'
													   AND id<>",
	    $ID
    );
    foreach ($positions as $pid => $position) {
	    $positions[$pid]['date'] = strtotime($position['f480']);
	    $positions[$pid]['status'] = $position['f530'];
											  }
    // заносим данные текущей строки
    if ($line['Дата'] && $line['Дата'] != "0000-00-00 00:00:00"
	    && $line['Статус']
	    && $line['Выполнено'] == "Да"
	    && $line['Статус записи'] == 0
	    && !$deleteCond
	    && $line['Тип клиента'] == 'Клиент'
	    ) {
	    $positions[$ID] = $line;
	    $positions[$ID]['date'] = strtotime($line['Дата']);
	    $positions[$ID]['status'] = $line['Статус'];
		  }
    // сортируем по дате, если даты равные то по id
    if (!function_exists("mySort")) {
	    function mySort($a, $B)/>
	    {
		    if ($a['date'] == $b['date']) {
			    return ($a['id'] > $b['id']) ? -1 : 1;
										  }
		    return ($a['date'] > $b['date']) ? -1 : 1;
	    }
								    }
    uasort($positions, "mySort");
    //print_r($positions);
    // проходим по всем записям
    $last_status = "";
    $this_data = array();
    foreach ($positions as $id => $pos_data) {
	    // первая итерация, последний статус в клиента
	    if (!$last_status) {
		    $last_status = $pos_data['status'];
						   }
	    // считаем разницу во времени
	    if ($this_data['date']) {
		    $timeDiff[$pos_data['status']] += $this_data['date'] - $pos_data['date'];
							    }
	    // сохраняем данные для следующей итерации
	    $this_data = $pos_data;
											 }
    // после прохода по всем работам, рассчитываем время от времени добавления контрагента до первого статуса
    $timeDiff[$this_data['f480']] += $this_data['date'] - strtotime($line['Клиент']['Время добавления']);
    $line['Клиент']['Время в статусах'] = serialize($timeDiff);
    // ставим текущий статус клиента, если нет ставим самый первый статус
    if ($last_status) {
	    $line['Клиент']['Статус'] = $last_status;
					  }
								    }
Добрый вечер. Такая проблема: после того,как долго добивался,чтобы воронка(представление написанное самим) работала правильно,всё-таки этого добился!! Но после этого этого обнаружил лишний статус в воронке и удалил его через конфигурацию(просто удалил лишнюю строку/поле в поле статус в таблице и под таблице,по которой делалась воронка. После этого перестало корректно работать вот это вычисление (Сохранение работы по клиенту) ,"статус до" вписывался корректно,а " статус" который нужно выбирать не обновлялся в карте клиента в нормальной форме.(имею ввиду поле "статус" в подтаблице "работы с клиентом" ,сделанной по абсолютной аналогии с вашей. Статус начинал обновляться только при добавлении ещё одной записи тут же в подтаблице,при чем меняя статус второй записи,в карте обновлялся статус из первой записи. Много чего перепробовал, решил удалить вычисление и написать его заново( просто скопировал предыдущий код,представленный здесь). Сохранил,теперь переход из статуса в статус работает ещё более некорректно и изменяется как ему хочется(если вообще изменяется).
Подскажите , пожалуйста,всё перепробовал. Дело скорее всего не в коде,так как аналогичный код(имеется в виду сохранения изменения в записи подтаблицы) в другой таблице работает корректно. Дело ,скорее всего, в том,что удалил один из статусов " криво". Не знаю что теперь делать,чтобы всё работало как до этого!? Заново таблицы что ли создавать ??? Вот представлен код(сохранения работы с пострадавшим) из аналогичной таблицы.
P.S. при этом пока удалил временно Отображение (Воронку),чтобы не влияло на подтаблицу,так как ссылается на неё.
if ($event['type'] == 'delete') {
    $deleteCond = " AND id<>" . $ID;
}

// значение при добавлении позиции
// $line['Статус до'] = $line['Пострадавший']['Статус'];
  if (!$line['Статус до']) {
	 $line['Статус до'] = $line['Пострадавший']['Статус'];
						  }
	 if (!$line['Статус']) {
		 $line['Статус'] = $line['Статус до'];  
						   }				   
						
/* Цель: находим сколько времени контрагент сидел в каждом статусе */
if ($line['Пострадавший']['raw']) {
    // статусы
    $result = sql_select_field(FIELDS_TABLE, "type_value", "id=", 1050);
    $row = sql_fetch_assoc($result);
    $statusArray = explode("\r\n", $row['type_value']);
    $timeDiff = array();
    foreach ($statusArray as $status) {
	    $timeDiff[$status] = 0;
									  }
   
    // выбираем все позиции, кроме текущей
    $positions = data_select_array(
	    140,
	    "ALL_ROWS",
	    "f1100=",
	    $line['Пострадавший']['raw'],
	    "
													   AND status=0
													   AND f1030='Да'
													   AND f1000<>'0000-00-00 00:00:00'
													   AND f1050<>''
													   AND id<>",
	    $ID
    );
	 foreach ($positions as $pid => $position) {
	    $positions[$pid]['date'] = strtotime($position['f1000']);
	    $positions[$pid]['status'] = $position['f1050'];
    }
    // заносим данные текущей строки
    if ($line['Дата'] && $line['Дата'] != "0000-00-00 00:00:00"
	    && $line['Статус']
	    && $line['Выполнено'] == "Да"
	    && $line['Статус записи'] == 0
	    && !$deleteCond
	    ) {
	    $positions[$ID] = $line;
	    $positions[$ID]['date'] = strtotime($line['Дата']);
	    $positions[$ID]['status'] = $line['Статус'];
    }
   
	 // сортируем по дате, если даты равные то по id
    if (!function_exists("mySort")) {
	    function mySort($a, $B)/>
	    {
		    if ($a['date'] == $b['date']) {
			    return ($a['id'] > $b['id']) ? -1 : 1;
		    }
		    return ($a['date'] > $b['date']) ? -1 : 1;
	    }
    }
    uasort($positions, "mySort");  
   
    // проходим по всем записям
    $last_status = "";
    $this_data = array();
    foreach ($positions as $id => $pos_data) {
	    // первая итерация, последний статус в пострадавшего
	    if (!$last_status) {
		    $last_status = $pos_data['status'];
	    }
		 // считаем разницу во времени
	    if ($this_data['date']) {
		    $timeDiff[$pos_data['status']] += $this_data['date'] - $pos_data['date'];
	    }
	    // сохраняем данные для следующей итерации
	    $this_data = $pos_data;
    }
	 
    // после прохода по всем работам, рассчитываем время от времени добавления контрагента до первого статуса
    $timeDiff[$this_data['f980']] += $this_data['date'] - strtotime($line['Пострадавший']['Время добавления']);
    $line['Пострадавший']['Время в статусах'] = serialize($timeDiff);
    // ставим текущий статус компании, если нет ставим самый первый статус
    if ($last_status) {
	    $line['Пострадавший']['Статус'] = $last_status;
    }
}






Количество пользователей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 анонимных