Автоматический ввод документов "Перечисление НДФЛ в бюджет РФ" по документам "Выплата заработной платы"




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

20 Comments

  1. АлексейН

    Привет

    Скажи пожалуйста как быть в следующей ситуации:

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

    2. уплаты в августе за август небыло.

    3. уплата 2 сентября за август — 20000 рублей, 10 сетября за август — 70000 рублей, 26 сентября по платежке 80000 рублей, из за август 10000 рублей и 70000 за сентябрь.

    уплачено было по всем сотрудникам (сотрубников 270 человек)

    И сам вопрос как в программе это будет разноситься?????

    т.е как и в какой пропорции разносить эти перечисленные суммы в программе в документе Перечисление НДФЛ?????

    Reply
  2. kgdrsu

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

    Reply
  3. АлексейН

    (2) kgdrsu, Согласен, сделать документ и мы знаем сумму для перечисления НДФЛ.

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

    Reply
  4. Katusha_iv

    Обработка не делит по окато-кпп.Просто формирует из каждой ведомости.Выбираю окато-кпп одного определенного подразделения,он собирает документы на основании всех выплат,независимо выбрала я окато -кпп или нет .В итоге во всех документах, сформированных за этот период проставляется окато кпп этого подразделения,а сотрудники садятся со всех подразделений.Смысл?как их делить?

    Reply
  5. Лена_Лена

    Спасибо, скачала, буду смотреть дальше правильно ли разносит суммы по каждому сотруднику.

    Reply
  6. АлексейН

    (4) Katusha_iv,

    Скачаю тоже посмотрю, что и как делается в самом отчете, при создании нового документа Перечисление НДФЛ.

    Вопрос к kgdrsu

    Что действительно такое получается ??? Собирает всех сотрудников в не зависимости от того какой документ выбран, только по выбранному ОКАТО/КПП, может там надо проверку добавить на наличие добавляемых сотрудников в выбранной ведомости выплаты.

    Reply
  7. svetik_svetiko

    Спасибо, буду смотреть, у нас тоже народу много

    Reply
  8. Rodriguezz

    Может кто нибудь скинуть мне эту обработку на почту, спасибо заранее android_x собака mail.ru

    Reply
  9. 2011b11

    Спасибо, буду смотреть, правда у нас не много народу

    Reply
  10. Rodriguezz

    А как сделать, чтобы суммы в табличную часть документа заполнялись сами, а не в ручную?

    Reply
  11. cluda

    Буду благодарна, если скинете обработку на почту, cluda собачка list.ru

    Reply
  12. b-dm

    Интересно, а автор читает замечания-пожелания к разработке, собирается ли дальше развизвать свою разработку ?)

    Без отбора по ОКАТО-КПП обрабока очень многое теряет..

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

    Обработку скачала 01.11.11(это к тому, что может уже были исправления?).Сейчас дошли руки посмотреть. Да, у нас тоже несколько окато, отбор не работает. И сумма в документе считается от выплаты, а не от начисления. Это не правильно! Т.е. начисленно 9000, на выплату 7830, в док. перечисления НДФЛ бъется 7830*13%=1018.00, а нужно 9000*13%=1170. Ну, ладно это в модуле можно поправить. А сами-то как работаете?

    Reply
  14. dtitov

    Хммм.. надо посмотреть код. Пока авансом + .

    Reply
  15. harutyunb

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

    Reply
  16. Ленкина

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

    Reply
  17. aimerlive

    Вот именно работа для бухгалтера практически не уменьшается тут как раз самое главное сумму налога рсчитать. тут же не просто 13 % но и вычеты надо учитывать.

    Reply
  18. KASPER011988

    Сталкнулся с такой ошибкой

    ПеречислениеНДФЛвБюджет.Записать();

    {E:ИЗ_ВЫПЛАТЫ_В_ПЕРЕЧИСЛ_НДФЛ.ERT(65)}: Номер не уникальный!

    что это? расчитываюся за 2011 год. В 2012 все создается правильно

    Reply
  19. анфиска

    А вычеты учтены???

    Reply
  20. анфиска

    А вычеты сотрудников не учтены. А то при автоматическом формировании НДФЛ уплаченный становится больше реально начисленного. То есть простая математика: Выплата — это 87% следовательно Выплата делится на 87 и умножается на 100%. Многие пытались сделать обработки, только про вычеты забыли. Было бы не плохо видеть сколько вычетов предоставлено. Есть не плохие обработки про вычеты, только не все виды предоставленных вычетов опять же учтены. Все циклятся на стандартных вычетах и забывают про другие. Например вычеты по подаркам, или чернобыльцы и т.д.

    Reply

Leave a Comment

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