<?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='\
Так получается нужно выключить контролирование при проведении документов. А если возьмут и спишут товар которого нету в системе
Проблема, которую решает данный инструмент, возникает только при отключенном контроле отрицательных остатков.
Обрабатывается только количество товара, которое есть в наличии и числится на другой организации.
Наверное не поняли. Пользователи могу взять и списать товар которого вообще нету в системе (или расход превышает то что есть в системе). И тогда обработка будет показывать минус но остатки по другим организациям не будут покрывать этот минус
Наверное не понял) Попробую объяснить на примере :
1) Купили 5 яблок на Организацию 1;
2) Продали 8 яблок от Организации 2;
3) После данных манипуляций по Организации 2 остаток: -8, по Организации 1 остаток: 5.
4) В результате обработки сформируются документы по перемещению 5 яблок с Организации 1 на Организацию 2.
5) Отрицательный остаток уменьшится до -3.
5) Отрицательный остаток уменьшится до -3. и что делать с остатком -3, от куда на него взять данные
Лучше уже для УНФ сделать контроль остатков в системе.
Обычно различают контроль остатков по Организациям и контроль остатков по Складам.
Отрицательные остатки на Складе — признак ошибок учёта!!! А отрицательные остатки по Организации обязательно компенсируются положительными остатками в другой Организации.
Для осуществления перепродажи «Собственным Фирмам» цены на товары могут отличаться от наценки в 1% и следует дать возможность контролировать данный параметр.
Часть реквизитов, Контрагенты связаны с Организациями (как минимум по ИНН/КПП), можно было бы автоматически подставлять с возможностью коррекции (в обработке задаётся только контрагент соответствующий Организации-Покупателю).
Как обработка срабатывает если имеется несколько складов и производят перемещения между складами?
Например, Орг1 закупила на Склад1, затем переместили на Склад2, и продали от Орг2…
(7)
-Полностью согласен с данным утверждением. Для исправления этих ошибок и создан данный инструмент. Также он поможет разобраться в их причинах и минимизировать их в будущем.
Возможно, реализую в следующих версиях.
(8)Обработка пригодится торговым компаниям, в которых 1 склад и продажа ведется от нескольких юр. лиц
(10) Хотите сказать, что остальные пусть «идут лесом»?
Обычно Перемещение, двигает ОстаткиОрганизации по Организации документа.
т.е. при перемещении со Склад1 на Склад2 по Орг2, то минусовые остатки образуются для Орг2 по Склад1. Отсюда методика учета — Склад обычно соответствует магазину принадлежащему Юр.Лицу, и продажи тоже будут по этой Организации. Минусовые остатки будут возникать до фактической продажи (в момент перемещения)…
P.S. По моему, надо в обработку добавить отбор по Складу (к отбору по Организации).
А можно «научить» Обработку создавать необходимые Доп.Реквизиты (например, в момент открытия проверять наличие «предопределенных», и при необходимости создавать с предложением Заполнить)? Тем самым исключить некорректные ручные свойства…
(11)
Хочу сказать, что предпочитаю тратить свое время под конкретные запросы потенциальных покупателей.
На данный момент у меня не было цели сделать супер универсальный инструмент.
(13) Вопрос о том, что Вы подразумеваете под
? Если только тех, кто обратился к Вам лично и изъявил желание оплатить Вашу работу, то конечно, «Нефига тратить своё время»!
А если представлять круг пользователей обработки и их потребности, и есть возможность «малыми трудозатратами» улучшить функционал… Я предпочитаю доделать. Тогда круг потенциальных потребителей выложенного продукта станет намного больше.
Подскажите, код обработки открыт? Хочу дописать под свои нужды, но с нуля подобное писать времени нет)
(15)Добрый день!
Код открыт. Можно дорабатывать под свои нужды.