Расчет дилерского процента с продаж менеджеров. Проверка на занижение цен.




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?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='\

27 Comments

  1. CheBurator

    Озвучь, пожалуйста, что является критерием «занижения».

    Учитывается ли превышение предоставленного срока кредита над установленной нормой?

    Оченно интересно. Самому такая задача стоит… обязательно покопаюсь в вашем отчете.

    Reply
  2. support

    а где скриншоты?

    Reply
  3. CheBurator

    Вот, например, хорошо было бы если бы цены продажи «нормализовались» и уже проводилась оценка отклонения нормализованной цены. Например: есть базовая цена, есть допустим цена оптовая (по факту) = базовая + 10%, есть цена отсрочка 15 дней — базовая +17%, 30 дней — базовая + 20%? есть система скидок (накопительная, по разовой сделке) — соответсвенно цена продажи нормализуется (приводится к «факту») и сравнивается… а если учесть не предоставленные сроки кредита, а реальные сроки оплаты, то цифры получатся совсем другие — одно дело если продавали на острочку 30 дней под 17%, а реально получилось что оплатили 45% — итого получается, что товар был «продан» по заниженной цене…

    вот такой продукт — вот это интересно было бы…

    Reply
  4. mdzen

    Отчет неплохой + 1

    «проверка цены в документе на отклонение от цен в справочнике» — какой смысл после драки руками махать.

    Не проще ли проверку выполнять на стадии проведения документов,в зависимости от установленный полномочий.

    Reply
  5. mdzen

    Упс..

    «Используется под типовой программой 1С:Торговля и склад 7.7»

    Сорри.. Проверку — это мы сами прикрутили, а это уже не типовая…

    Reply
  6. O-Planet

    Скрины — в описании, конечно же.

    > Озвучь, пожалуйста, что является критерием «занижения».

    Занижение — это, фактически, скидка. Предполагается фирма, где менеджеры имеют право делать клиенту скидку при обсуждении цен. Каждый клиент может работать по своему типу цен, опять же. Каждый тип цен предполагает некие границы возможной скидки. Занижение — это когда скидка перешагивает допустимые границы по выбранному типу цен.

    Reply
  7. O-Planet

    > Вот, например, хорошо было бы если бы …

    Не, делать отчет по такой схеме расчетов — чистая диверсия. Не много директоров вьедут и менеджеров, как и что. Потом, я больше ориентируюсь на розницу, а тут кридиты, сам понимаешь, встречаются крайне редко.

    Reply
  8. mdzen

    Со скидками это просто засада. Договорились, сделали скидку — результат — продали ниже закупки.

    Пришлось проверку цен на стадии проведения документов прикручивать.

    Причем смотреть не по ценам из справочника, а по партиям закупки. В справочнике цена стоит, делают скидку, а при просмотре отчета — продали ниже прихода.

    P.S. Когда накрутка составляет 20-30% , а скидки 1-5% можно оперировать ценами справочника, а когда накрутка составляет от 5 до 15% , а скидка от 1 до 10% — вот тут надо контроль жесткий.

    Reply
  9. CheBurator

    То как я озвучил — сейчас у себя реализовываю, в разработке… там и будет примерно то что я упоминал и плюс еще всякое…

    Reply
  10. O-Planet

    Елки, рейтинг дуром колотят! Мож и кафешку без пароля на пару дней выложить? Там вообще несколько тыщ скачиваний 🙂

    ОСТАВЛЯЮ БЕЗ ПАРОЛЯ ДО КОНЦА ВОСКРЕСЕНЬЯ.

    Reply
  11. skyp

    Автору — респект! Много интересного почерпнул (т.е. один к одному использовать не удастся, но в целом — очень полезно!

    Reply
  12. skyp

    Рейтинг приподнимем 🙂

    Reply
  13. CheBurator

    Елы-палы! О-планет, ты что, голым пиаром занялся 😉

    Reply
  14. O-Planet

    Какой это пиар, баловство!

    Впрочем, воскресение — последний день, похоже, когда енто можно скачать без пароля… Ну, если правда рейтинг подскочит еще пунктов на пять 😉

    Reply
  15. O-Planet

    По поводу «много интересного подчерпнул»…

    Эта обработка действительно является примером того, как можно легко построить отчет с произвольным количеством группировок. Эх, разбалтываю я секреты почем зря 🙂

    Reply
  16. CheBurator

    В комплекте с этим отчетом можно юзать

    http://www.infostart.ru/projects/index.php?id=413&ref=174

    Reply
  17. O-Planet

    Остались считанные часы для свободного скачивания …

    Reply
  18. марат

    + 1

    Reply
  19. O-Planet

    Если кто заметил…

    Народная любовь к этому отчету воспрепятствовала моей руке совершить жестокий акт запароливания.

    Reply
  20. O-Planet

    Елки! А кто плясанул? Только что 12 было? Хоть бы весточку черкнул, что ли?.. 🙂 Все равно, СПА-СИ-БО!!!

    Reply
  21. Super

    В поддержку O-Planet! +1

    Reply
  22. DELude

    Искала и нашла — УРА, спасибо разработчику))

    Reply
  23. O-Planet

    А оно что, до сих пор бесплатно скачивается? Какое упущение… 🙁

    Reply
  24. skyruner

    Очень сенкс 🙂 да же на нашу перекаряченую конфу встал прекрасно 🙂

    Reply
  25. O-Planet

    Точно, пора коммерческую версию делать ))

    Reply
  26. Sprite

    Мне обязательно пригодится. Пасиб.

    Reply
  27. undera

    спасибо

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *