<?php // Полная загрузка сервисных книжек, создан 2025-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='\
Что-то не пойму, а смысл???? Если для ЕГАИС — то Документ Списание можно-же сделать и отправить в егаис?
(1)А вы что искали (какой смысл) когда сюда зашли? )))
Смысл такой же как и в Управлении торговлей 11. Там есть возможность заполнить отчет о розничных продажах на основании инвентаризации, когда из розничной точки не происходит выгрузка в базу, учет ведется по фактическим остаткам.
Стоит примитивная касса без возможности выгрузки в учетную программу, а учет в общей базе вести хочется. И таких точек не одна.
ЕГАИС то здесь причем?
(2)не поверите я тоже зашел сюда спросить то же самое (ну только не про ЕГАИС) значит нас уже как минимум двое, спасибо за разъяснения про ут не знал… как представлю что сумму продаж под Zотчет подгонять да еще чтоб правдоподобно было брррррр
(3)Зачем подгонять? Это же управленческий учет, а не бухгалтерский. Да и подогнать сложности нет — установил суммы какие нужны в строках и все. Больших расхождений быть не должно. Можно и строки ненужные удалить. Пример. 20 точек с эвотор, из которого данные в силу разных причин не передаются в базу. Учет товара ведется через проведение инвентаризаций. Так и так нужно делать инвентаризации. Если внести эти данные в программу, то можно видеть данные по продажам в разных вариантах отчетов. В т.ч. прибыль и ABC-XYZ анализ продаж, автоматически формировать заказы поставщикам, ну, и использовать пр. возможности программы.
Да и каким образом еще занести данные по продажам в программу если нет обмена с кассой?
Ну, можно, конечно, все продажи в тетрадке фиксировать)), потом переносить в документ. Это уж точно бррр.))
Если это управленческий учет то вопрос снят. Тетрадка естественно вообще не вариант. А вот с управленческой аналитикой я бы поостерегся, прибыль да, если иметь в виду что не все что списано продано, а вот анализы продаж и абц немного для другого нужны и потери магазина нам могут вывернуть картинку наизнанку, просто у вас скорее всего минимальные списания так что я за вас искренне рад. С другой стороны если товар штучный и продавцы на магазине несут полную мат ответственность то заплатили за все потери и все, как будто продали, однако тут тоже немало вопросов…
Ну и плюс ежедневная инва, невозможность круглосуточных продаж, проблемы со сменами на магазинах и т.п. короче решение для узкого круга розницы но вполне рабочее
(5)Инвентаризация раз в неделю при смене продавцов. Полная мат. ответственность. Можно сначала на основании приказа списать товар (стандартно) или оприходовать, тот, который посчитается нужным. То что останется — попадет в ОРП. Либо наоборот, сначала — ОРП, там удалить ненужное, то что осталось — стандартно списать/оприходовать — заполнение произойдет автоматически. Решение для мелких точек и ужатого бюджета, когда на оборудование денег нет, а информацию видеть хочется. Складской учет ведется в центральной базе. Использовать УТ — громоздко (требует другого ресурса, более сложная в обращении, медленнее).
Решение для узкого круга розницы — это верно. Я бы сказал: для очень мелкой, но разветвленной.