Отчет о розничных продажах на основании инвентаризации в "Рознице 2.2" в неавтоматизированной торговой точке




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

6 Comments

  1. user635667

    Что-то не пойму, а смысл???? Если для ЕГАИС — то Документ Списание можно-же сделать и отправить в егаис?

    Reply
  2. Работник

    (1)А вы что искали (какой смысл) когда сюда зашли? )))

    Смысл такой же как и в Управлении торговлей 11. Там есть возможность заполнить отчет о розничных продажах на основании инвентаризации, когда из розничной точки не происходит выгрузка в базу, учет ведется по фактическим остаткам.

    Стоит примитивная касса без возможности выгрузки в учетную программу, а учет в общей базе вести хочется. И таких точек не одна.

    ЕГАИС то здесь причем?

    Reply
  3. AlexCherdakov

    (2)не поверите я тоже зашел сюда спросить то же самое (ну только не про ЕГАИС) значит нас уже как минимум двое, спасибо за разъяснения про ут не знал… как представлю что сумму продаж под Zотчет подгонять да еще чтоб правдоподобно было брррррр

    Reply
  4. Работник

    (3)Зачем подгонять? Это же управленческий учет, а не бухгалтерский. Да и подогнать сложности нет — установил суммы какие нужны в строках и все. Больших расхождений быть не должно. Можно и строки ненужные удалить. Пример. 20 точек с эвотор, из которого данные в силу разных причин не передаются в базу. Учет товара ведется через проведение инвентаризаций. Так и так нужно делать инвентаризации. Если внести эти данные в программу, то можно видеть данные по продажам в разных вариантах отчетов. В т.ч. прибыль и ABC-XYZ анализ продаж, автоматически формировать заказы поставщикам, ну, и использовать пр. возможности программы.

    Да и каким образом еще занести данные по продажам в программу если нет обмена с кассой?

    Ну, можно, конечно, все продажи в тетрадке фиксировать)), потом переносить в документ. Это уж точно бррр.))

    Reply
  5. AlexCherdakov

    Если это управленческий учет то вопрос снят. Тетрадка естественно вообще не вариант. А вот с управленческой аналитикой я бы поостерегся, прибыль да, если иметь в виду что не все что списано продано, а вот анализы продаж и абц немного для другого нужны и потери магазина нам могут вывернуть картинку наизнанку, просто у вас скорее всего минимальные списания так что я за вас искренне рад. С другой стороны если товар штучный и продавцы на магазине несут полную мат ответственность то заплатили за все потери и все, как будто продали, однако тут тоже немало вопросов…

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

    Reply
  6. Работник

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

    Решение для узкого круга розницы — это верно. Я бы сказал: для очень мелкой, но разветвленной.

    Reply

Leave a Comment

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