Валовая прибыль для УТ, УПП с анализом по типу цены




Принцип обмена данными из 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='\

38 Comments

  1. zarius

    (1) Возможно! Но почему то не нашел когда искал пару недель назад…

    Если есть возможность — «ссылки в студию»…

    Reply
  2. zarius

    По поводу аналогов: недавно появилась обработка «Отчет по валовой прибыли УПП» (http://infostart.ru/public/68586/). Данный отчет отличается отсутствием выбора конкретного типа цены и, что самое главное, по ценам берется «срез последних». В предлагаемом мной отчете цены расчитываются на дату документа продажи, т.е. в расчете будет учавствовать именно та цена которая была на момент продажи, что, ИМХО, более правильно.

    Reply
  3. mir1m

    видимо что-то с поиском на сайте.

    вот так работает:

    http://www.google.ru/search?hl=ru&lr=&newwindow=1&q=site:infostart.ru+валовая+прибыль&start=20&sa=N

    Reply
  4. zarius

    (4) может я как то не так ищу? данный поиск не дал ссылок на какие-либо обработки с подобным функционалом (правда я платные разработки не смотрел). Из бесплатных — самая приближенная по смыслу разработка описана в посте 3 (там же и отличия). Возможно я что-то пропустил, если есть возможность, Eugeneer и mir1m, наставьте на путь истинный…

    Reply
  5. igor_gk

    (3) Тоже не нашел и тоже сомневаюсь, что вы имеете ввиду бесплатную обработку 😉

    Reply
  6. zarius

    почти 100 скачиваний и всего 3 комента …. 😥

    Reply
  7. zarius

    Если кому то надо добавить возможность пересчета в выбранной валюте — сообщите

    Reply
  8. gogast

    не подцепляет цены товара если ведётся учёт по характеристикам номенклатуры, а цены на отдельные характеристики не заданы

    и в итогах зачем то пишет цену расчёта

    Reply
  9. zarius

    (9) хм… вообще то по поводу цен с характеристиками — согласен, что может быть и такое, когда характеристики ведутся, а цены устанавливаются без учета характеристик…

    В принципе особо страшного ничего нет — пишите в личку… расмотрим варианты доработки…

    По поводу цены расчета в итогах — выводится максимальная встреченная цена по обходу запроса — это сделано для упрощения вывода цены расчета из запроса — вообще эта колонка носит больше информативный характер и вывожу ее лишь для удобства. Т.е. все группировки (в т.ч. по номенклатуре/группам номенклатуры) показывают лишь максимальную цену в пределах данной группировки. Передо мной не стояла задача показать по каким ценам были продажи, поэтому отдельной группировки по ценам не ведется. Расчет же выполняется корректно.

    Reply
  10. gogast

    он просто считает что цены не установлены… со всеми вытекающими

    Reply
  11. zarius

    (11) я прекрасно понимаю что в этом случае не считает 🙂

    Reply
  12. zarius

    (11) тут вариантов несколько:

    1) доработать отчет самим (код открыт)

    2) ждать когда у меня дойдут руки до этого

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

    Reply
  13. imshev

    Отчет работает на РАУЗ?

    Reply
  14. sashtet

    Спасибо за отчет, что раньше считал в ручную , то в твоём отчете прям на экран выскакивает.Мне очень подравилось совмещение стандартого отчета Валовая прибыль и твоего блока Валовая прибыль по ТЦ.При наличии распределения доп.услуг на поступление товаров в стандартом отчете показывается реальная себестоимость, а вот посмотреть реализацию в цене закупа не посмотришь.У тебя и то и то видно…Спасибо!

    Reply
  15. Craig

    У меня УПП, и проблема с себестоимостью, какой тут принцип расчета?! откуда берется себестоимость?

    Reply
  16. Craig

    У меня переменной себестоимостью является сумма затраты на выпуск, можете для меня сделать этот же самый отчет только в место вашей себестоимости поставить себестоимость из вот такого документа «Отчет производства за смену 00000000001», и в место рентабельности рассчитывать маржинальную прибыль. ???

    Reply
  17. sashtet
    Craig пишет:

    У меня УПП, и проблема с себестоимостью, какой тут принцип расчета?! откуда берется себестоимость?

    Этот отчет не показывает себестоимость в прямом виде.В отчете можно отразить валовую прибыль на один и тот же товар , но в двух типах цен, к примеру цена закупа и цена продажи.Если цена закупа и есть себестоимость(если не было других накладных расходов при осуществлении сделки),то это и есть себестоимость.Если при сделке пришлось доставить товар до покупателя, то эти расходы, я лично распределяю на накладную закупа документом «Услуги сторонних орг.», себестоимость перераспределяется или по сумме (деньги) или по кол-ву…,себестоимость товара увеличивается,валовая прибыль уменьшается…

    Reply
  18. Kostalmed

    Спасибо за отчет!!! Весьма помог! От начальства поступило как раз на разработку аналогичного отчета. по неведомым причинам стандартный отчет не подходил. так что спасли можно так сказать!!!!!

    Reply
  19. zarius

    (19) ну… я рад, что отчет пригодился 🙂

    кстати, если кому надо такой отчет, но по оплате — пишите в личку…

    Reply
  20. Tota

    На РАУЗе работает?

    Reply
  21. zarius

    (21) нет

    Reply
  22. revril

    спасибо за отчет)))

    Reply
  23. байт

    Неплохой отчет помог, только кое-что пришлось переделать изменить тип цен, не номенклатуры, а номенклатуры контрагентов, а так помог, использовал для Комплексной автоматизации редакция 1.1.9.1 по РАУЗу валовая не формируется да и вообще типовой отчет Валовая прибыль в КА кривой, позже познакомился с произвольными отчетами в типовой демо версии КА получилось еще быстрее, спасибо!

    Reply
  24. zarius

    (28) не совсем понял что имелось ввиду

    Reply
  25. revril

    а это под 8.1 или 8.2 отчет?

    Reply
  26. zarius

    (30) изначально писалось для 8.1, чтобы на 8.2 заработало — просто конвертируй в 8.2

    Reply
  27. sashtet

    До сих пользую этот отчет, еще раз спасибо!

    Reply
  28. revril

    ага__спасибо))конвертировала!!все нормально работает))

    Reply
  29. Halabala

    Спасибо за отчет. Весьма полезен будет. А то стандартный «Валовая прибыль» вообще не годится.

    Reply
  30. sashtet

    Как можно сделать сохранения выбора типа цены,постоянно приходиться показывать какую цену надо считать?

    Reply
  31. sinjevla

    Отчет хороший вот только партий не учитываются. Мне так кажется это не совсем правильно.

    Reply
  32. AlexO

    (8)

    Если кому то надо добавить возможность пересчета в выбранной валюте

    эдак вы одним отчетом и мультивалютность реализуете в УПП и УТ? 🙂

    Reply
  33. zarius

    (37) что значит «партий не учитываются»? Себестоимость считается как раз по партиям. Это по сути — типовой отчет «Валовая прибыль» с доп. колонками пересчета стоимости в соответствии с выбранным типом цены.

    Reply
  34. zarius

    (38) посмотрите на http://infostart.ru/public/69323/ — это по сути немного переделанный вариант текущей разработки — там есть вариант с пересчетом в выбранной валюте…

    Reply
  35. sinjevla

    (39) Типовой отчет считает все верно, а вот дополнительные колонки не совсем или я что-то не догоняю и хочу разобраться.

    Примеры писать не очень хочется, но посмотрим …

    Цены рассчитываются на дату документа продажи! что есть не совсем правильно так как товар может быть из более ранней партии и его закупочная цена не равна той цене которая стоит в день его продажи.

    Хотя по большому счету.

    Reply
  36. zarius

    (41) не совсем понимаю ход ваших мыслей… складывается впечатление что вы хотите в колонке пересчета от цены получить реальную себестоимость по партии… зачем? Реальная себестоимость у нас есть в колонке «Себестоимость», и она считается как в типовом отчете — по партиям. Колонки пересчета от типа цен сделаны для другого — это средство анализа продаж от типа цены. Бывает такие ситуации когда реальный закуп пляшет с большим разбросом, но тип цены закупа не меняется (закупили товар у другого поставщика по бросовой цене (возможно даже нулевой) и т.д.). В этом случае по партиям данный товар будет давать разную себестоимость и как результат — различную валовую прибыль. Это бывает не совсем удобно когда необходимо оценить результативность отдела продаж (особенно когда ЗП отдела продаж зависит от заработанной маржи), посмотреть среднюю наценку и т.д. В этом случае можно воспользоваться текущим отчетом и рассчитать данные в пересчете от выбранного типа цены. Повторюсь — это средство анализа — не надо в этих колонках искать себестоимость и т.д.

    Reply
  37. adhocprog

    (0) ценный отчет! спасибо автору )

    Reply
  38. vis_tmp

    Спасибо, очень пригодилось — взял отчёт как основу для своего!

    Reply

Leave a Comment

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