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;
}
}












