Расчет процентов по займам




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?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='\

34 Comments

  1. alex1971

    давно искал нечто подобное. спасибо автору. просто умница и все так удобно. еще раз спасибо.

    а щас ложка дегтя: в НУ есть возможность учет займов вести по средней ставке, если есть несколько займов — так выгоднее больше можно на расходы списать. как-то это можно в программе реализовать?

    но в любом случае большое спасибо. я бы еще раз 5 на плюс нажал 🙂

    Reply
  2. gavrila

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

    будет время, добавлю

    Reply
  3. vip-niki

    спасибо большое то что нужно

    +10

    Reply
  4. gavrila

    Пофиксил расчет процентов по валютным договорам..

    2 alex1971: НК говорит следующее:

    «… расходом признаются проценты, начисленные по долговому обязательству любого вида при условии, что размер начисленных налогоплательщиком по долговому обязательству процентов существенно не отклоняется от среднего уровня процентов …

    … При этом существенным отклонением размера начисленных процентов по долговому обязательству считается отклонение более чем на 20 процентов в сторону повышения или в сторону понижения от среднего уровня процентов …»

    Не совсем понятна фраза «в сторону понижения».. Т.е. если моя средняя ставка будет 20%, верхний порог отклонения будет 24%, нижний — 16%.. И если я беру займ под 15%, то получается, что 15% существенно отклонились от 20% и следовательно в НУ приниматься не будут!

    В общем я в обработке сделал сравнение только с верхней границей отклонения..

    Reply
  5. karaw

    Просто класс!!! То же давно искал подобное…

    Reply
  6. buh

    А зачем ставку рефинансирования добавлять в справочник Валюты? В бухгалтерии есть штатная константа, которая так и называется «Ставка рефинансирования». ИМХО логичнее было бы использовать эту константу.

    Reply
  7. gavrila

    (6)

    Сакарментальный вопрос..

    Забыл я про эту константу 🙁

    Поправил

    Reply
  8. бубух

    + поставил. Правильная разработка. Буху нужная и полезная. Вот только провода не мои, попользоваться не могу, а править модуль я не умею.

    Reply
  9. Slava_64

    Очень полезная обработка, особенно при наличии большого количества договоров займа. Только хотелось бы чтобы процент ставился из Договоров, СтавкаШтрафныхСанкций. Повторюсь, что прибольшом количестве договоров с разными процентами это было бы очень удобно. Как это реализовать? Что и где прописать в модуле? Буду очень благодарен.

    Reply
  10. ctpeko3a

    Подскажите, как добавлять Ставки рефинансирования, которые заполняются из внешней таблицы (в архиве) ?

    Reply
  11. nikitishna

    Благодарствую от всего сердца!

    Reply
  12. Вольха

    Спасибо огромное за обработку! Давно такую искала!

    Reply
  13. Вольха

    + поставила:)

    Reply
  14. nora

    Подскажите, как добавить эту обработку в 1С.

    Reply
  15. gavrila

    nora, ее можно просто открывать через пункт меню Файл-Открыть

    Reply
  16. ЕЮИ

    КЛАССС,спасибо огромное!!!!!

    Все просто и понятно,без всяких заморочек!!!!

    Reply
  17. Доня

    Замечательно, тоже плюс!

    Только как можно корректировать ставку рефинансирования.

    Ведь даты меняются и ставка тоже.

    Подскажите — где что скорректировать

    Я не програмист, а бухгалтер, но мало-мало в кофигураторе работаю.

    Reply
  18. cppa

    И мне подскажите пожалуйста, как же всё таки ставку рефинансирования редактировать в обработке, в соответствии с изменениями?

    Reply
  19. gavrila

    В обработке используется стандартная константа из типовой бухгалтерии «Ставка рефинансирования».

    Выберите в меню Операции — Константы, найдите Ставку рефинансирования, правой кнопкой мыши выберите Историю значений и заполняйте ее как душе угодно.

    Reply
  20. natali_sch

    ой, молодец!!! Убивала целый день на эту хрень в экселе… Договоров много… А теперь можно время на другие дела потратить… Здорово! Огромное-преогромное спасибо! +10

    Reply
  21. natali_sch

    Протестировала… Результат такой: когда ставка рефинансирования меняется в середине месяца (а это чаще всего так и происходит), расчет процентов для НУ идет тупо по последней ставке, т. е. по той, что сложилась на конец месяца. А должно быть не так. Для НУ берется процент, равный ДЕЙСТВУЮЩЕЙ ставке рефинансирования на каждый день, увеличенной в 1,5 раза. И сколько раз в месяц менялась ставка ЦБ, столько раз и процент для НУ будет меняться…. Не знаю, понятно ли объяснила… Я не программер, а бухгалтер. Вооот…

    Reply
  22. Mortal

    Спасибо. Очень помогла Ваша обработка, надо было, как всегда, вчера… 😀

    Чуть-чуть подправил под себя — в целом: зачет!

    Reply
  23. KapasMordorov

    2(21)

    Ставка рефинансирования для НУ берется на конец квартала или месяца — по периоду авансовых платежей.

    Т.е. в конце периода сумма по НУ должна корректироваться.

    На ИС кстати есть обработка, которая это учитывает.

    Каждый день — это раньше было, сейчас не так.

    Reply
  24. LianaZ

    с 01 августа для целей НУ берется ставка рефин-я, увеличенная в 2 раза.

    а было 1,5, и считает по-старому. Подскажите пож-та, каким образом можно внести изменения в обработку?

    Reply
  25. gutentag

    ОШИБКА в Обработке: расчет ПНО ведется по ставке 24%, что действительно по 31.12.23008, далее с 01.01.2009 по сегодняшний день(05.05.2010)= 20%

    —————

    Хотя бы в строках 679 и 682 цифру 24 надо поменять на 20

    Reply
  26. gavrila

    Ну я бы не назвал это ошибкой.. Просто ПНО ввелось для частного случая, для займа до 2008-го года, когда было 24%..

    Внес поправку на дату относительно 01.01.2008

    Reply
  27. gavrila

    Немного дополнил.

    С 1 июля коэффициент 1.1 независимо от даты возникновения обязательств

    Reply
  28. nice-day

    Если доработать как следует, то может и можно будет пользоваться. Сейчас — никуда не годится. Ставки рефинансирования не вводит, налоговый учет ( сумму процентов, принимаемую в целях налогобложения) — вообще не считает. Ставка процентов задается говодая, а на месяц почему-то делится на 12… Чтобы рассчитать за месяц по ставке, например, 16% годовых, то надо годовую задать 192, а трезхначное число вообще не вводится, поле ввода ограничего двумя цифрами.

    так что очень сырая разработка, только время потеряно на загрузку…

    Reply
  29. LianaZ

    Андрей, а можно внести в обработку возможность самим менять поправочный коэффициент, на который меняется ставка рефинансирования. А то они ее постоянно меняют, и считает соответсвенно уже неправильно

    сейчас сделали 1,8, а было 1,1

    спасибо!

    Reply
  30. gavrila

    Да мне не охота ее переделывать.. Моих такая устраивает..

    Поправку на новый коэффициент сделал..

    Reply
  31. seandr

    Для 7.7 наверное уже не совсем актуально, где — то видел для БП 1.6, 2.0.

    Reply
  32. courageous

    Для 8ки делал подобную, а для 7.7 неохота было… хорошо что нашел эту, автору спасибо!

    Reply
  33. gavrila

    Ну в общем-то эта обработка ушла из разряда поддерживаемых:) Для меня более не актуальна..

    Сейчас она скорее заготовка для последующих доработок, чем готовый продукт..

    Reply
  34. fomix

    Обработка древняя для 1С 7.7. Поэтому можно спокойно списать в архив!!!!!

    Reply

Leave a Comment

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