НДФЛ как на ладони




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

41 Comments

  1. ysb_ter

    На картинках выглядит «вкусно» 🙂

    Один вопрос. Все картинки — с распределением по «начисленному НДФЛ», а не по методологически-правильному «удержанному». Вы тоже не верите в то, что ЗиК-овскому «удержанному» можно доверять ?

    Reply
  2. DarkAn

    (2) Ну… Я правильно понял, что это риторический вопрос?

    Ну а вообще я специально добавил и тот и другой вариант. Просто начисленный НДФЛ расчетчики, еще как-то, могут разглядеть стандартными отчетами, а вот с удержанным все гораздо сложнее.

    Reply
  3. TrinitronOTV

    по описанию хорошая разработка, спасибо автору

    Reply
  4. finadezda

    Надо попробовать.. по описанию хороша обработка, наглядная

    Reply
  5. DarkAn

    (4) Так ведь и старался чтоб была наглядная 🙂

    Изначально просто стояла задача показать когда за какой месяц были оплаты, а потом… нашла муза, а может еще это прикрутить, а это добавить, и тут расшифровку не забыть — данные ведь есть… Вот и выродилось. Давно заметил, что когда нет принуждения и есть свободное время то можно много чего вкусного вкрутить 🙂

    Reply
  6. анфиска

    Добрый вечер, идея хорошая. А вычеты сотрудников учтены?? Многие пытались сделать обработки, только про вычеты забыли. Было бы не плохо видеть сколько вычетов предоставлено. Есть не плохие обработки про вычеты, только не все виды предоставленных вычетов опять же учтены. Все циклятся на стандартных вычетах и забывают про другие.

    Reply
  7. DarkAn

    (6) а какой смысл тут показывать вычеты???

    Тут нет базы по НДФЛ в привычном понимании слова (начисления), тут база имеется виду совокупный налог берется из начисленного удержанного НДФЛ. Все. Вычет уже давно учтены при расчете НДФЛ начисленного.

    Reply
  8. NPMar

    На первый взгляд, очень здорово! Просто и наглядно! Все другие обработки просто меркнут. Действительно человек постарался. Спасибо, обязательно скачаю!

    Reply
  9. NPMar

    Знаете, а мне кажется, что вычеты в этом отчете не к чему. Здесь отражен готовый НДФЛ, уже расчитанный. Казалось бы очень простой отчет, но никто такой не придумал. Спасибо автору!

    Reply
  10. server300183

    Спасибо! Очень часто бывают ситуации

    Reply
  11. NPMar

    Знаете, попробовала отчет за 2011 год. Проверила некоторые суммы, но в декабре у нас было несколько перечислений, отпускные, премии разные. Почему-то взялось только одно последнее перечисление 30.12.2011. До него были другие перечисления и 30.12.2011 и раньше в течение всего месяца. Всего 6 раз. А учлось только одно, последнее. Остальные перечисления ушли в остаток…Проверила два других месяца, все нормально. Только в декабре…

    Reply
  12. NPMar

    Поставила конечную дату не 31.12.2011, а 30.12.2011. Вообще не взялась ни одна сумма перечислений. Весь НДФЛ начисленный ушел в остаток. А несколько перечислений было именно 30.12.2011.

    Reply
  13. DarkAn

    (12) хм… посмотрю… Таких проблем не было…

    Reply
  14. DarkAn

    (12) поправил и обновил, добавил возможность выбора что считать периодом оплаты (раньше это была дата документа) сейчас еще добавил Дату платежа и дату платежного порученияы

    Возможно причина была именно в этом? что документы в декабре у вас имели дату документа иную, хотя они так или иначе должны били быть отражены тут, даже если бы они были проведены хоть в 2015 году.

    Гадать мне сложно, была бы база под рукой сказал бы в чем проблема, а так…

    У меня перебираются все документы оплаты:

    исключаются из анализа только:

    1) Не проведенные

    2) Не попадающие в период указанный в отчете (реквизит документа: Дата платежа … за [период оплаты])

    3) Если сумма перечисленного налога в документе = 0

    4) Если ОКАТО/КПП не попадает в фильтр указанный в отчете

    Все остальное должно быть отражено в отчете. Еще раз проверьте…

    Если не получиться дайте скрин документа который не попадает (Список сотрудников закрасьте).

    Reply
  15. knowikDen

    Судя по скринам, очень полезная вещь, вот было бы еще для 8.2

    Reply
  16. NPMar

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

    Reply
  17. NPMar

    Меняла все даты. Даже поставила 30.12.2011. И только сейчас обнаружила, что общий итог по ОКАТО/КПП сверху — правильный. Все перечисленные суммы декабря вошли в него. А когда идет помесячная расшифровка — декабрьские перечисления потеряны.

    Reply
  18. NPMar

    Спасибо Вам за участие. Я попробую сама разобраться в обработке. Только позже. Сейчас совершенно нет вренмеи.

    Может это только у меня так, больше ни у кого. Если я разберусь, обязательно Вам сообщу причину. Еще раз, большое Вам спасибо!

    Reply
  19. DarkAn

    (18) ОК, буду надеяться все у вас получиться.

    Reply
  20. klel

    Большое спасибо =) будем время от времени пользоваться 😉

    Reply
  21. aimerlive

    А для Комплексной обработку кто нибудь пробовал?Работает?

    Reply
  22. DarkAn

    (21) Если виды расчетов и документ имеют одинаковый идентификатор, а так же реквизиты документа, а это насколько я понимаю, так и должно быть, то должно работать :)))

    Reply
  23. tana1257

    Пока посмотрела только скрины и прочитала комментарии из которых следует, что программа неплохая. Мне же понравилось, что есть расшифровки, по которым легче работать. Большое спасибо

    Reply
  24. tana1257

    Сталкнулась с тем, что итоги по оплате выводит правильно, а в колонках по месяцам сумм нет.

    Reply
  25. tana1257

    Еще раз запустила программу и все данные появились.

    Reply
  26. DarkAn

    (25) Надеюсь все правильно и хорошо 🙂

    Reply
  27. Полковник

    Спасибо за обработку, однозначно (+). Скачала, проверила. Пока визуально один недочет: обработка не видит уплату НДФЛ по договорникам, наверное у вас их нет, не было возможности их проверить и учесть. В итого все суммы НДФЛ договорников, отражаются на остатке, хотя документы перечисления на них введены.

    Reply
  28. DarkAn

    (27) Да, действительно про них забыл 🙁

    Постараюсь в течении дня скорректировать 🙂

    Спасибо, за помощь 🙂

    Reply
  29. DarkAn

    (27) Нашел таки время посмотреть работу отчета с договорниками. У меня все нормально работает, проверил на 3-х договорниках. Специально все проверил, дополнительных фильтров ни где не стоит. Перебираются все записи по ЖР и все документы, и если договорник проходит хотя бы по ЖР, то в отчет он обязан попасть

    Reply
  30. forurchik

    Отличный отчет мне очень нрвитсяочень выручает при споре с бухами

    Reply
  31. EarlyBird

    Всё супер, сделано качественно.

    Имхо, ссылку на такую работу можно даже добавить в своё резюме.

    Только поправь пожалуйста грамматику в заголовках колонок (и на рисунках тоже, люди ведь в первую очередь рисунки смотрят, и решают, скачивать или нет).

    Reply
  32. DarkAn

    (31) Спасибо! Поправлю 🙂

    Reply
  33. maxim305

    Замечательная разработка 🙂

    Reply
  34. k

    СПАСИБО ОГРОМНОЕ за обработку очень очень помогла!УРА!

    Reply
  35. k

    Странно, по какой-то причине в данном отчете сумма начисленного НДФЛ ( разрезе КПП/ОКАТО)показывает не верные суммы, исходя из чего не правильно формирует документы Перечисление НДФЛ в бюджет…

    Reply
  36. DarkAn

    (35) Я данные суммы беру напрямую из журнала расчетов. Все зависит от базы. Но сколько не проверял все было верно. Можно по точнее?

    Reply
  37. k

    Если формируешь 2-ндфл для ИФНС в разрезе ОКАТО/КПП, то там в реестре есть сумма начисленного НДФЛ, которая не совпадает с данным отчетом.

    Reply
  38. DarkAn

    (37) Надо разбираться конкретно на вашем примере. Пока сходу может прийти только одна мысль, это скорее всего сотрудник сменивший статус не резидента, и по нему справка 2-ндфл перерассчитывает сумму налога, при формировании справки, а мой отчет берет данные по факту расчета в журнале расчетов. Но для точности, надо базу и посмотреть почему в вашем случае есть расхождения.

    Reply
  39. chmv

    Интересная идея

    Reply
  40. pjv

    (38)Для УПП подойдет ваш отчет?

    Reply
  41. DarkAn

    (41) — Нет, от для 7.7

    Reply

Leave a Comment

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