<?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='\
Очень нужная вещь.
Штука полезная!
Здорово, давно хотел найти что-то подобное!!!
Спасибо…
Пригодится полезная вещь
ндя… а 62.22 и аналогичные — типа ручками делайте по старинке? 😉
Раз людям понравилась эта штучка, то пригодится и вот эта:http://infostart.ru/projects/2957/
Просьба также автору пояснить: «при проверки правильности формирования дебиторской и кредиторской задолженности на любую конкретную дату» — счем это в принципе отличается от обычной ОСВ по счету?
При работе бухгалтерии могут образовываться остатки не закрытые по тем или иным причинам автоматическими проводками, также могут возникать ошибки в связи с разнесением аванса и основной задолженности по разным договорам, т.е. развернутое сальдо в балансе будет отражатся неверно.
Данная программа выбирает только тех контрагентов у которых есть по тем или иным причинам ситуации незакрытых авансов, что более удобно чем работать со стандартной ОСВ
В стандартной ОСВ если задавать счет первого уровня то сальдо показывается свернуто и не видно по каким контрагентам возникла данная ситуация. Можно конечно выдавать две ОСВ одну например по 62.1 а вторую по 62.2 и сравнивать либо вручную либо с помощью дополнительных программ, что не очень удобно. Кроме того при работе со стандартной ОСВ нет возможности автоматически выбрать именно данный вид ошибки и следовательно выдается полный список всех контрагентов, что тоже не очень удобно.
(8) ок, понятно.
тогда уже логично добавить сюда же проверку баланса на СЧФ по оборотке и по записям книг продаж/покупок… т.е. например могут быть ситуации когда по книге продаж счф закрыта в ноль, а по ОСВ — на ней висит остаток (или наоборот)
Интересно, а теханализ БУ ситуации с незачтенными суммами — ловит..? не помню…
C предложениями по поводу проверок согласен, будет время можно добавить.
Насчет теханализа БУ не помню чтобы имелась такая возможность, если и есть то менее наглядная.
Задумка хорошая, но сделана как-то «на скорую руку». Рекомендую довести до ума следующим образом:
1. Сделать чёткую иерархию по уровням субконто (Контрагент -> Договор) с агрегацией данных в отдельных строках.
2. Вместо статуса выводить сумму остатка. Если остаток не равен нулю, то, очевидно, что аванс не закрыт и наоборот: если равен нулю, то, столь же очевидно, что аванс закрыт.
3. В заголовке надо обязательно выводить дату отчета, иначе он вообще теряет какой бы то ни было смысл.
4. Отработать предложение (5) с обязательным указанием номера бухгалтерского счета и валюты цены договора (в отдельных колонках). В идеале суммы по каждой задолженности надо выводить в две строки: в валюте цены договора и в рублях.
Предложение (9) весьма разумное, но под него лучше сделать отдельный отчет, целью которого была бы именно выверка НДС посредством сопоставления дебиторки-кредиторки с суммами НДС. Алгоритм будет «тяжелее» на ставки НДС и на револьверные разборы частичного погашения авансов «N в M».
Уже есть внешний отчет 621_622.ert на этом сайте
он сделан лучше
Здесь же всё сыро… неработают кнопки обновить/настройка в печатной форме
Хорошо, когда люди сами делают и с другими делятся
Главное отчет работает и выполняет свои функции.
Отчет рабочий и сделан быстро для текущей работы, по мере появления сводного времени доработаю недочеты. Спасибо за замечания и предложения.
Удивительно. Явно слабый и по задумке и по реализации отчет столь популярен,
http://infostart.ru/projects/4669/
а целая группа аналогичных по назначению отчетов (в демо варианте — 20):
никому не интересна. Почему?
Почему этот отчет слаб по содержанию? Потому что при работе «от документа»
проблемы отсутствия зачета аванса решаются перепроведением
документов, и именно к этому нужно приучать пользователей. Тем более, что регламентное проведение документов нужно также для правильного расчета себестоимости ТМЦ, обнаружения ряда ошибок типа путаницы с субсчетами учета
ТМЦ и т.п.
Почему этот отчет слаб по реализации? Коротко. Если отчет строится по одному контрагенту нельзя выполнять запрос по всем контрагентам, да еще потом
обрабатывать результат запроса в цикле «до упора», т.е. продолжать цикл даже
после того, когда нужная запись уже найдена. Это грубая ошибка.
Что называется, ничего личного. Просто хочется понять, почему так происходит.
(16) Слабый рабочий вариант всегда предпочтительнее сильного неработающего ;))
(16)
http://infostart.ru/projects/4669/
>Удивительно. Явно слабый и по задумке и по реализации отчет столь
>популярен, а целая группа аналогичных по назначению отчетов (в демо
>варианте — 20):
>никому не интересна. Почему?
Известно почему: халява, сэр. 🙂
(18)
А в чем халява? У нас 20 отчетов, на каждый из них никаких ограничений. Ограничение демо-версии только в том, что в
каждый момент времени можно использовать один, а не все 20
сразу. Это равносильно тому, что вы скачали бы двадцать отчетов
с инфостарта и запускали бы их поочереди. Код закрыт? Так код
этого отчета никакой ценности не представляет.
Может быть кого-то заинтересует не отчет, а документ по зачету и корректировке авансов:
http://infostart.ru/projects/5016/
Очень необходимая вещь!
Просто и со вкусом 😀 😀