<?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='\
Штатный отчет судя по отзывам (я сам штатным никогда не пользовался — написал свой отчет) редко выдавал правильные суммы. Вы свой тщательно тестировали ?
К каким именно суммам были претензии?
Возможны разногласия в том, что считать датой возникновения долга.
И соответственно, в какие интервалы сумма должна попасть.
(2) Вопросов было много разных, но суть в том что выдавались неадекватные суммы.
Начнем с простого — сумма общей задолженности по вашему отчету соответствует отчету «Ведомость по взаиморасчетам с контрагентами» ?
Да, соответствует
Соответствует отчету «Задолженость по контрагентам»
(2) Проверьте что правильно работает в случае если один документ делает несколько движений по взаиморасчетам (например, отчет комиссионера).
Проверьте что правильно работает в случае предоплаты (в том числе частичной).
1) Комиссионеров у нас нет, посмотреть не получится.
2) . Все договоры покупателей ведутся по заказам.В случае предоплаты, при дальнейшем появлении заказа покупателя, предоплата переносится на заказ документом «Корректировка долга». Да, у нас очень аккуратные бухгалтеры 🙂
(7) » у нас очень аккуратные бухгалтеры »
Везет вам 🙂
Вариант имеет право быть хотя бы для возможности выбора…
(3)(5) Сразу добавлю, что отчеты Взаиморасчеты с контрагентами и Задолженость по контрагентам — сами по себе дают разные результаты (по крайней мере в УПП). Во-первых. Задолженность формирует сумму в управленческой валюте через валюту договора. Т.е. если в валюте долга нет, то в задолженности его не увидите… Далее. Вне зависимости от уровня группировки задолженность Дебитовая/кредитовая формируется на основе договора (или сделки, не проверял). Т.е. если захотим посмотреть долг по контрагенту без учета договоров, то нужно врубать режим «Все» иначе получите не ту сумму. Сам сегодня замучился проверять свой отчет.
Честно говоря группировка, которая представлена на картинке для меня избыточна и только запутывает (: Мухи отдельно, котлеты отдельно. Просроченная задолженность — это одно, а задолженность по интервалам — другое. Хотя если отчет написан на СКД, то это поправимо.
(10)Руководство хотело видеть, насколько просрочена задолженность и кого из покупателей надо теребить в первую очередь.
Так достаточно вывести 4 показателя но более информативно — сумма долга (или сумма непросроченного долга), сумма просроченного долга, число дней просрочки (или число дней с возникновения задолженности) и процент просроченного долга. И всегда можно быстро отсортировать в соответствии с приоритетностью показателей
Вот хотели именно с интервалами :). Сказали нарисовать в соответствии с ТЗ — бланком из Экселя. Мне было б проще было просто дни отсрочки посчитать, чем с динамическими интервалами изгаляться
После того, как мне один раз выставили ТЗ на диаграмму Ганта, развернутую на 90 градусов, я уже ничему не удивляюсь
(14)Дорогу осилит идущий….
Я когда во франче работал, выполнял любой бред. Пик был — изменение типовой процедуры, которая вызывается в 57 местах системы. Очень полезный опыт. Было сразу понятно, что работать не будет, подошел к РП, объяснил ситуацию, а ему пофиг, тока бы деньги платили. В итоге клиенту впарили, а потом героически исправляли за отдельную плату. Если говорить на чистоту, 99% процентов, того что мы там навнедряли, попросту ненужно. Хорошо, что сейчас у меня есть возможность посылать граждан бухгалтеров, менеджеров и экономистов курить бамбук. И знаешь, не один миллион для собственника уже сэкономил.
а я сам себе бух, менеджер и экономист (:
(15) глянь всё-таки мой новый запрос. Он отдельно от обработки выложен. Просто хотелось бы узнать на всех ли машинах он быстрее твоего.
и чего поменял?
Галку не поставила, когда описание правила 🙁
Чтоб дату обновления не кидала
добавил свойство — интервалы суммы в интервалах не сменились… 😥
добавил свойство — суммы в интервалах не сменились… 😥
если есть корректировки долга, то сумма по договору не верна (не отнимает минуса).
Подскажите, учитывает ли Ваш отчет кредиторскую задолженность перед контрагентом, или только дебиторскую?
(24) OscarTT,
Только дебиторка.
Анна,привет.
Сравнил этот отчет со штатным в УТ 10.3.21.1 и почему-то ваш отчет дает задвоение по всем строчкам.Возможно из-за вашего левого соединения.
Делал похожий отчет для БП 2.0.Но я сдвигал интервал возникновения задолженности с учетом отсрочки.