<?php // Полная загрузка сервисных книжек, создан 2024-01-05 12:44:55
global $wpdb2;
global $failure;
global $file_hist;
///// echo '<H2><b>Старт загрузки</b></H2><br>';
$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
///// echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}
$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
///// echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}
/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
///// echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
///// echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist); ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7]; ////получаем размер файла
$m_mtime_file=$masiv_data_file[9]; ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file
///// echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
///// echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
///// echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);
if ($results)
{ foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));
////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
///// echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
///// echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}
////загружаем данные
$table='vin_history'; // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация // (путь от корня web-сервера)
$delim=';'; // Разделитель полей в CSV файле
$enclosed='"'; // Кавычки для содержимого полей
$escaped='\
Ну у меня, конечно, попроще… 🙂 Но ведь и простота — это иногда плюс! 🙂
Ууууу какая штука, для моей конторы в которой появляется и исчезает раз в день по 999 филиалов, подразделений, складов и торговых точек это просто находка.
(1) согласен, я его переписывал раз 5 с нуля, и были моменты когда хотелось плюнуть на дорисовки линий — их вручную за две минуты проще было дорисовать)))))
А если серьезно то простоту я старался реализовать с точки зрения пользователя — не надо ломать голову разрабатывая структуру иерархии основаную на коде или что-нибудь аналогичное. Тем более нет надобности постоянно проверять правильность указания кодов — при печати из справочника запускается процедура автопроверки уровней. ТО есть от пользователя требуется только знать родительское подразделение и все! А это действительно простота))
(2) по плюсам не видно что для тебя это находка)))))
Будет время выложу построение телефонного справочника на основе этого алгоритма.
Пока товарищ GSoft плохого не выкладывал. Можно структуры предприятия проектировать 🙂 Но было бы очень шикарно, если сюда привязать сотрудников, с описанием о количестве человек в каждом отделе… А при выборе определенного сотрудника показывать его историю повышения/понижения в должности (перемещение между отделами). Но плюсик обязательно надо ставить!
(5) спасибо за лестные слова)))))
>с описанием о количестве человек в каждом отделе
это можно, но если речь идет именно о количестве
что касается повышения — понижения — не вижу смысла, так как тогда отчет будет привязан к определенной конфигурации
Но все таки я не могу понять смысл этой строчки:
Показать полностью
Что такое Подчиненный.ВходитВСостав?
Наверное должно было выглядеть так:
Показать полностью
?
(7,8)ой…. сорри… уже увидел. Разобрался.
чтобы не запутаться там почти к каждой такой переменной в начале блока идет комментарий
Поставлю,попробую и тогда + или-
Вот так и бывает, сначала поставлю и попробую… а в результате ни тебе плюса ни тебе минуса. И непонятно то ли все плохо то ли наоборот все хорошо)
СПАСИБО! У меня в одной конторе 200 подразделений (ЗиК), Отчет по Штатному расписанию типовой моих бухгалтеров не устраивает, потому как долго формируется и мало информации, надеюсь, что с вашим отчетом облегчу им жизнь. А вообще искала отчет по ШР с ФИО людей по подразделениям и с вакансиями — занятыми, свободными и если чел временно не работает, то бишь в декрете. Пока не нашла. Буду смотреть Вашу. Ставлю плюс заранее — за идею 🙂
отпишитесь пожалуйста по результату — так как я сам на ЗиКе не тестировал то что получится, Единственно что придется выставить для каждого подразделения «родителя».
Интересно, а генеалогическое дерево с помощью этой обработки можно нарисовать? 😀
можно даже в текущем исполнении — вместо подразделений указать людей — вот только будет оно не сверху вниз как обычно(или наоборот) а слева направо