Операционное планирование движения денежных средств или как построить систему контроля расходования денежных средств




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

36 Comments

  1. Vladimir_Konyrev

    Коллеги, прошу Вас оставлять комментарии и отзывы о прочитанной статье. Плюсы также приветствуются 🙂 Спасибо.

    Reply
  2. Raminus

    Оформлено аккуратненько, почитаем на досуге:)

    Reply
  3. Vladimir_Konyrev

    С нетерпением жду Ваших отзывов, спасибо.

    Reply
  4. tango

    (0) за овердрафт что-нибудь делали?

    Reply
  5. Vladimir_Konyrev

    (0) за овердрафт что-нибудь делали?

    Не понял вопрос.

    Reply
  6. tango

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

    Reply
  7. Vladimir_Konyrev

    Теперь понял вопрос. Собственно говоря овердрафт, как Вы правильно заметили, так же «стоит денег», причем как правило затраты на овердрафт сопоставимы с кредитом. Конечно овердрафт поможет решить текущую проблему по срочному платежу, но его нельзя назвать «панацеей» от «кассовых разрывов»

    Reply
  8. Vladimir_Konyrev

    Добавлю то, что в типовой конфигурации есть доп.право «Разрешить превышение свободного остатка денежных средств» им определяется, будет ли право у пользователя на превышение остатка

    Reply
  9. nanik

    Однозначно «+». Есть вопрос, есть случаи, когда надо провести заявку, когда бюджет подразделения израсходован. Например, сгорел АРМ или внеплановая смена ЭЦП связи со сменой руководителя, согласно схеме заявка будет записана. Разработана ли схема проведения таких заявок? Есть ли возможность кредитования у других подразделений?

    Reply
  10. Confucius

    Оформленно красиво и читабельно. Но на практике все по другому: например есть крупная сеть (наш покупатель) у него по договору (а их может быть несколько с разными компаниями и разными отсрочками) отсрочка платежа 21 день. т.е она выбирает товар в течение например 10 дней на несколько миллионов, то как мы можем запланировать поступление ДС если мы не знаем когда она оплатить в течение 21 дня? Тем самым создается мнимость планирования.

    Reply
  11. i_volodin

    На мой взгляд, вы: 1) упустили из вида подсистему бюджетирования, ведь уже при составлении заявки на расход ДС, система способна в подсистеме бюджетирования контролировать превышения бюджета. 2) Отчет ведомость по расчетам с контрагентами. наделен у вас мистическими свойствами, а ведь это единственный отчет по взаиморасчетам который показывает план. 3) Ну и упустили само планирование ДС. Перефразируя вышесказанное, конструктивная критика статьи следующая не раскрыта тема связи оперативного плаирования ДС с другими подсистемами программы. Не полностью раскрыта тема оперативного планирования ДС.

    Reply
  12. awk

    За статью однозначный плюс. Пример, для всех, как делать проекты. Сначала описать, что есть. Наложить на ис. И только потом решать о необходимости доработки.

    Reply
  13. nicxxx

    (7)овердрафт как раз предназначен для увеличения оборотных средств, т.е. для решения проблемы «кассовых разрывов», почитайте хотя бы определение в любом словаре. почему вы так не считаете, непонятно…

    Reply
  14. Vladimir_Konyrev

    (9) nanik, Если бюджет подразделения израсходован, то либо дается право на проведение платежей сверх утвержденного бюджета, это право дается конкретному сотруднику (имеющему на то полномочия), либо утверждает. Схемы кредитования у других подразделений нет, сейчас мы продумываем схему, при которой если в отчетном периоде №1 у подразделения остались не выбранные суммы, то остаток переходит на период №2 с нарастающим итогом.

    Reply
  15. Vladimir_Konyrev

    (10) Confucius, полностью с Вами согласен, что спланировать на 100% движение ДС не возможно, это утопия, в случае реализации такого сценария, компания была бы «королем» в своей области 🙂 Я бы рекомендовал Вам в плане указывать крайнюю дату поступления платежа, это было бы похоже на пессимистичный сценарий в части дат оплаты.

    Reply
  16. PAVI

    Так как статья озаглавлена «…планирование..», то мое замечание может быть и не к месту, но все же.

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

    Во-первых: кредиторка была до введения подсистемы планирования на фирме и ее надо гасить. А ее статьи уже «канули в Лету».

    Во-вторых: точно также, как ДО введения системы Заявок на расходование ДС, так и ПОСЛЕ, появлялись накладные, особенно на услуги, которые не проходили по Заявкам. А где-то через год… появлялся судебный иск к фирме за неуплату.

    В-третьих, тот вариант, который упомянут в посте №10.

    Вот такие «пирожки с котятами»…

    Reply
  17. Vladimir_Konyrev

    (11) i_volodin, Спасибо Вам за конструктивную критику. Отвечу:

    1) упустили из вида подсистему бюджетирования, ведь уже при составлении заявки на расход ДС, система способна в подсистеме бюджетирования контролировать превышения бюджета.

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

    2) Отчет ведомость по расчетам с контрагентами. наделен у вас мистическими свойствами, а ведь это единственный отчет по взаиморасчетам который показывает план.

    Да, действительно, следовало бы подробнее расписать

    3) Ну и упустили само планирование ДС.

    Перефразируя вышесказанное, конструктивная критика статьи следующая не раскрыта тема связи оперативного плаирования ДС с другими подсистемами программы. Не полностью раскрыта тема оперативного планирования ДС.

    Спасибо.

    Reply
  18. Vladimir_Konyrev

    (13) nicxxx, в ответе я сказал, что » Конечно овердрафт поможет решить текущую проблему по срочному платежу». В своей статье, в первом разделе я писал: «При возникновении «кассового разрыва» компании приходится прибегать к различным мерам по их устранению, например: привлечение банковских кредитов, займов, срочная продажа ликвидных активов и т.д. Несмотря на принятые меры, указанная ситуация так или иначе пагубно отразится на благосостоянии компании.». Таким образом я пытаюсь обозначить пути минимизации привлечения дополнительных средств, путем применения инструмента УПП (подсистема операционного планирования).

    Reply
  19. Vladimir_Konyrev

    (15) PAVI, Спасибо за обмен опытом, очень полезно услышать. Вы писали: «Во-первых: кредиторка была до введения подсистемы планирования на фирме и ее надо гасить. А ее статьи уже «канули в Лету».»

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

    «Во-вторых: точно также, как ДО введения системы Заявок на расходование ДС, так и ПОСЛЕ, появлялись накладные, особенно на услуги, которые не проходили по Заявкам. А где-то через год… появлялся судебный иск к фирме за неуплату.»

    Мне кажется это из разряда первого высказывания, нужно учитывать текущую ситуацию.

    Reply
  20. tango

    (19)

    нужно учитывать текущую ситуацию

    я бы сказал: нужно вести учет, раз уж взялись 🙂

    Reply
  21. Vladimir_Konyrev

    (20) tango, Согласен.

    Reply
  22. nicxxx

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

    Reply
  23. Vladimir_Konyrev

    (22) nicxxx, можете ли Вы привести аргументы в пользу привлечения кредита (при отсутствии потребности в таковом) взамен грамотного планирования движения денежных средств. Если есть возможность спланировать движение ДС таким образом, чтобы не было возможности кредитоваться, то это однозначно плюс, туи спорить бессмысленно. Привлечение кредита помогает в развитии компании, если его привлечение (кредита) целесообразно и обосновано, а так же объем кредита тоже должен быть обоснован. Например: компания решила построить здание, общий объем средств, требуемый для строительства: 1 млн. Компании выгоднее взять сразу не весь 1 млн, а частями, по мере необходимости, в таком случае проценты будут начисляться с отсрочкой, т.е. с момента получения кредита, это так же пример грамотного планирования движения ДС.

    Reply
  24. Vladimir_Konyrev

    (22) nicxxx, пример из жизни: у человека есть последние 5000 руб. до зарплаты, зарплата через 3 дня. До зарплаты еще нужно купить продуктов (2000) и заплатить за проезд на общественном транспорте (200). При этом у человека есть мечта купить новый телефон, стоимостью 4000 руб. в ближайшее время. Вопрос: когда лучше произвести покупку телефона? До зарплаты и далее взять кредит, чтобы купить продукты и т.д. на которые будет уже не хватать или после зарплаты? 🙂

    Reply
  25. nicxxx

    Про физлиц здесь разговор не идет, хотя все знают, что есть кредитки с грейсом, т.е. как минимум, благосостояние физлица не ухудшится, если он из грейса не вылетит.

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

    организация имеет товарооборот с циклом 3 месяца. договаривается с банком о возобновляемой кредитной линией, берет кредит 1млн на закупку товара, 900тыс оплачивает поставщику. аренда, налоги, зарплата, прочие поставщики — все это надо платить все 3 месяца пока будет товар будет ехать в организацию, лежать на складе, продаваться. где взять деньги? один из выходов — овердрафт. пусть это будет еще 1 млн. далее, чтобы хватило денег на все вышеперечисленные платежи в следующем периоде, какую надо сделать наценку? минимум 100%, чтобы хватило на следующую партию товара, и еще 100% чтобы покрыть издержки обращения. и еще ХХ% чтобы получить прибыль, но где гарантия, что эта цена в итоге будет конкурентоспособной?

    Reply
  26. Vladimir_Konyrev

    (25) nicxxx, прошу Вас учесть, что мы с Вами говорим не много о разных вещах. Еще раз обращу Ваше внимание: я писал в статье, что нужно стараться использовать все доступные инструменты, если есть возможность не брать кредит для покрытия операционных платежей. Кредит оправдан и необходим для развития бизнеса, но кредит так же имеет свою «стоимость», есть такое понятие «Стоимость привлечения капитала». Так вот в случае с операционным планированием, стоимость привлечения будет возможно ниже, чем привлечение кредита.

    Reply
  27. nicxxx

    с этим согласен

    Reply
  28. pro-rok

    Спасибо автору, статья полезная особенно понравилась схемка очень информативно.

    Такой вопрос, если заявка будет отклонена где то в середине процесса, то необходимо создавать новую ?? (многим клиентам эта линейность не нравиться).

    И еще какова средняя скорость прохождения заявки до статуса утверждена и признака разрешить оплату.

    Reply
  29. Vladimir_Konyrev

    На тех предприятиях, где мы внедряли и дорабатывали данную подсистему, то работает тот принцип, что нужно создавать новую. Один раз дорабатывали механизм, запрещающий вводить заново заявку, но естественно в зависимости от условия, делалось это, чтобы не «пропихивали» заявки всеми способами.

    Скорость прохождения заявки зависит от:

    1. Маршрута. Есть маршруты с 1-им участником, есть с 4-5 участниками.

    2. Срочности заявки

    3. Статьи ДДС (читай «от менеджера направления»)

    Так что бывает от 5-10 минут и до суток. Бывает что заявка не оплачивается и в итого она закрывается по концу месяца, т.к. не актуальна больше и компания «пережила» и без её оплаты.

    Reply
  30. Suulla Uola

    Хорошая статья. Насколько похожи в этом плане УПП и КА?

    Reply
  31. garant21

    Статья хорошая. Флаг «Включать в платежный календарь» нужно ставить на самом последнем этапе согласования заявок. А пользоваться удобнее не отчетом «Платежный календарь», а отчетом «Платежный календарь с учетом заказов».

    Reply
  32. Els11

    Статья хорошая. Наткнулся на данную статью в поиске решения следующей проблемы. Финансисты решили задействовать платежный календарь. Но наткнулись на след особенность. По заказу покупателя делается ППДС, например в начале декабря сделали ППДС с плановым поступлением в начале марта, например 01.03.2015. Но в конце декабря что то сорвалось и , например 19 декабря этот документ закрывается документом «Закрытие ППДС». В итоге в регистре ППДС два движения от 19.12.2014 с минусом, и от 01.03.2015 с плюсом. В отчете «Платежный календарь» получаем остаток на начало сегодняшнего дня 27.01.2015 минусовой. В статье не увидел отражения этой особенности отчета. Кто как решал данную проблему? То ли отчет переделывать, то ли подписку делать, чтобы дату в ППДС корректировать на дату документа закрытия.

    Reply
  33. Vladimir_Konyrev

    (32) Els11, Спасибо за оценку. С данной проблемой не сталкивались. Мне кажется, что проще переделать отчет, т.к. типовой отчет скудный.

    Reply
  34. dka80

    Добрый день!

    Не могу понять смысл применения отчета «Платежный календарь».

    У меня плановое поступление денежных средств (например, 01 числа в размере 1000 руб), есть плановый расход (2 числа — 100 руб, 3 — 100 руб, 4 — 100 руб). В отчете «Платежный календарь» я прекрасно вижу по дням когда у меня возможен кассовый разрыв.

    Теперь у меня прошло фактическое поступление денежных средств (1 числа — 1000 руб). В отчете «Платежный календарь» 2 числа возникает кассовый разрыв в размере -100 руб.

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

    Но я не понимаю, какой смысл в этой информации, так как по факту у нас никакого кассового разрыва нет и никаких корректирующих мероприятий по устранению кассового разрыва предпринимать не нужно.

    Мне непонятно как при такой информации я могу производить оперативное планирование платежей.

    Или я неправильно понимаю методологию?

    Reply
  35. stepan_s

    Если заказчик возжелает заплатить чуть больше в первом платеже, а в остальных чуть меньше — как это организовать? Сделать приход средств на сумму ППДС, и остаток на следующий ПДДС?

    Reply
  36. sarp

    Очень помогла статья разобраться в этой системе, автору спасибо!!!

    Reply

Leave a Comment

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