<?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='\
Озвучь, пожалуйста, что является критерием «занижения».
Учитывается ли превышение предоставленного срока кредита над установленной нормой?
Оченно интересно. Самому такая задача стоит… обязательно покопаюсь в вашем отчете.
а где скриншоты?
Вот, например, хорошо было бы если бы цены продажи «нормализовались» и уже проводилась оценка отклонения нормализованной цены. Например: есть базовая цена, есть допустим цена оптовая (по факту) = базовая + 10%, есть цена отсрочка 15 дней — базовая +17%, 30 дней — базовая + 20%? есть система скидок (накопительная, по разовой сделке) — соответсвенно цена продажи нормализуется (приводится к «факту») и сравнивается… а если учесть не предоставленные сроки кредита, а реальные сроки оплаты, то цифры получатся совсем другие — одно дело если продавали на острочку 30 дней под 17%, а реально получилось что оплатили 45% — итого получается, что товар был «продан» по заниженной цене…
вот такой продукт — вот это интересно было бы…
Отчет неплохой + 1
«проверка цены в документе на отклонение от цен в справочнике» — какой смысл после драки руками махать.
Не проще ли проверку выполнять на стадии проведения документов,в зависимости от установленный полномочий.
Упс..
«Используется под типовой программой 1С:Торговля и склад 7.7»
Сорри.. Проверку — это мы сами прикрутили, а это уже не типовая…
Скрины — в описании, конечно же.
> Озвучь, пожалуйста, что является критерием «занижения».
Занижение — это, фактически, скидка. Предполагается фирма, где менеджеры имеют право делать клиенту скидку при обсуждении цен. Каждый клиент может работать по своему типу цен, опять же. Каждый тип цен предполагает некие границы возможной скидки. Занижение — это когда скидка перешагивает допустимые границы по выбранному типу цен.
> Вот, например, хорошо было бы если бы …
Не, делать отчет по такой схеме расчетов — чистая диверсия. Не много директоров вьедут и менеджеров, как и что. Потом, я больше ориентируюсь на розницу, а тут кридиты, сам понимаешь, встречаются крайне редко.
Со скидками это просто засада. Договорились, сделали скидку — результат — продали ниже закупки.
Пришлось проверку цен на стадии проведения документов прикручивать.
Причем смотреть не по ценам из справочника, а по партиям закупки. В справочнике цена стоит, делают скидку, а при просмотре отчета — продали ниже прихода.
P.S. Когда накрутка составляет 20-30% , а скидки 1-5% можно оперировать ценами справочника, а когда накрутка составляет от 5 до 15% , а скидка от 1 до 10% — вот тут надо контроль жесткий.
То как я озвучил — сейчас у себя реализовываю, в разработке… там и будет примерно то что я упоминал и плюс еще всякое…
Елки, рейтинг дуром колотят! Мож и кафешку без пароля на пару дней выложить? Там вообще несколько тыщ скачиваний 🙂
ОСТАВЛЯЮ БЕЗ ПАРОЛЯ ДО КОНЦА ВОСКРЕСЕНЬЯ.
Автору — респект! Много интересного почерпнул (т.е. один к одному использовать не удастся, но в целом — очень полезно!
Рейтинг приподнимем 🙂
Елы-палы! О-планет, ты что, голым пиаром занялся 😉
Какой это пиар, баловство!
Впрочем, воскресение — последний день, похоже, когда енто можно скачать без пароля… Ну, если правда рейтинг подскочит еще пунктов на пять 😉
По поводу «много интересного подчерпнул»…
Эта обработка действительно является примером того, как можно легко построить отчет с произвольным количеством группировок. Эх, разбалтываю я секреты почем зря 🙂
В комплекте с этим отчетом можно юзать
http://www.infostart.ru/projects/index.php?id=413&ref=174
Остались считанные часы для свободного скачивания …
+ 1
Если кто заметил…
Народная любовь к этому отчету воспрепятствовала моей руке совершить жестокий акт запароливания.
Елки! А кто плясанул? Только что 12 было? Хоть бы весточку черкнул, что ли?.. 🙂 Все равно, СПА-СИ-БО!!!
В поддержку O-Planet! +1
Искала и нашла — УРА, спасибо разработчику))
А оно что, до сих пор бесплатно скачивается? Какое упущение… 🙁
Очень сенкс 🙂 да же на нашу перекаряченую конфу встал прекрасно 🙂
Точно, пора коммерческую версию делать ))
Мне обязательно пригодится. Пасиб.
спасибо