[БП 3.0] Помощник комиссионера по НДС 2024




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

17 Comments

  1. pm74

    с авансами по комиссии тот еще геморрой

    Reply
  2. Alex_E

    (1) pm74, В последней версии помощника для комиссионера на УСН можно «оптом» перекидывать авансы с дохода комитента на доходы УСН и наборот. А вот как быть с авансами, которые указали как доход комитента, если коминтент на ОСНО?

    Уточню вопрос — нужно ли на них выписывать счета-фактуры на аванс, и как это передавать комитенту?

    Reply
  3. pm74

    (2) сф на аванс комитента перевыставляются комитентом комиссионеру аналогично обычным СФ по реализации.

    Reply
  4. Alex_E

    (3) pm74, Это понятно, только вот беда, почему то никто (из мне известных) этого не делает, и в свой доход (если УСН) включать не хочет 🙂 И ещё вопрос, как комитент отнесётся к таким счетам-фактурам?

    Reply
  5. pm74

    (4)

    почему то никто (из мне известных) этого не делает

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

    Reply
  6. Alex_E

    (5) pm74, Не знаю, насколько выше, если комиссионер не предоставит информацию по авансам, то комитент получится «белым и пушистым». Комиссионер в таком случае должен принять аванс в свой доход… А вот если он не делает ни того ни этого — то вполне может оказаться крайним… Вот про эти моменты и хочется пообщаться, как у кого работают?

    Reply
  7. pm74

    выше по определению т.к. штрафные санкции за неуплату НДС лягут на него , «затихарить» эти СФ никак не получится в любом случае покупатель отразит этот аванс к вычету. Комиссионеру, если он на УСН, не выгодно принимать эти фактуры на свой счет — есть риск перебрать по сумме выручки ( 45 млн. ?? не помню точно предел для УСНщиков), если комиссионер на ОСН то тем более

    Reply
  8. Alex_E

    (7) pm74,

    «затихарить» эти СФ никак не получится в любом случае покупатель отразит этот аванс к вычету.

    — покупатель отразит в своём учета зачёт аванса поставщику, что в декларации по НДС не отразится никак. К вычету НДС с авансов выданных берут только те, кто в договоре с поставщиком прописал, что на эти авансы ему обязаны выписать и предоставить счет-фактура, что делается далеко не всегда, так что тут под проверку не попадает… По расчетному счету комиссионера пройдут деньги от покупателя, но то, что это был авансовый платёж отследить можно только по назначению платежа, а там слово аванс присутствует далеко не всегда.

    Так что, ИМХО, комиссионер под раздачу попадёт не так однозначно, а комиссионер может попасть, если будет проверка и будет выяснено, что полученному авансу не был передан комиссионеру счет-фактура на аванс, и комиссионер не отразил его как свой доход (который, после реализации был бы вычтен из его книги).

    Тут ещё одна деталь — как комитент и комиссионер связаны — т.е., например, в пределах одного холдинга тут кроется вполне легальная оптимизация налогообложения — принимать как свой доход выгоднее комиссионеру, и платить авансовые платежи 6%, чем 18% комитенту. Главное, чтобы на конец года не слететь с УСН. Я не прав?

    Reply
  9. pm74

    (8)

    Статья 120. Грубое нарушение правил учета доходов и расходов и объектов налогообложения

    [Налоговый кодекс РФ] [Глава 16] [Статья 120]

    1. Грубое нарушение правил учета доходов и (или) расходов и (или) объектов налогообложения, если эти деяния совершены в течение одного налогового периода, при отсутствии признаков налогового правонарушения, предусмотренного пунктом 2 настоящей статьи,

    влечет взыскание штрафа в размере десяти тысяч рублей.

    ….

    3. Те же деяния, если они повлекли занижение налоговой базы,

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

    ….

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

    Reply
  10. Alex_E

    (9) pm74, Вы меня не слышите, я говорю о том, что комитент не может знать, о том, что комиссионер получил аванс в счет поставки ЕГО товаров, если комиссионер не предоставил ему счета-фактуры. И комиссионер, если не хочет «влететь» должен как минимум заплатить с этих авансов свой налог, а по правильному выписать счет-фактуру на аванс. До 2015 года этим вообще никто не заморачивался — в декларации книги продаж и покупок не было, а про авансы, когда я начал говорить, вообще сделали большие глаза…

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

    Reply
  11. pm74

    (10)

    Суть в том, что комиссионер может торговать как собственными товарами (услугами), так и товарами комитента, и платежи от покупателей комиссионеру могут проходить по разному (один аванс на поставку и того и того, например)

    и я об этом же в (1) , плюсом ваш покупатель может попросить ТЗР отдельной фактурой , а это уже комиссия — покупка

    Reply
  12. Alex_E

    (11) pm74, Вот это то и хочется автоматизировать…

    Reply
  13. pm74

    Чтобы автоматизировать нужна какая то логика. Например вы продаете товар от 5 комитентов и собственный. Вам пришел аванс от покупателя (расчеты по договору) в конце квартала. Чей он спрашивается ? Как это определить ?? Рассылать всем комитентам авансовые СФ ? Тут , ИМХО , все сильно зависит от структуры продаж. Например в моем случае :99% комиссия ,один комитент, комисионные и собственные товары различаются , как правило, идут разными накладными и для очень ограниченного числа покупателей и как правило по предоплате 1:1 . Был выбран вариант когда договор покупателя просто разделили на условные «Договор-004» , «Договор-41» , соответственно авансы зачтенные в пределах квартала разносятся по договорам постфактум , незачтенные (если априори неясно ) выставляются на комитента. Все это довольно ущербно с точки зрения автоматизации , но лучшего решения пока у меня нет.

    Может быть конечно я чего нибудь недопонимаю , и делаю неправильно , но если честно нигде не видел объяснения как сделать правильно. (ИТС не в счет, там примеры из области нереальной фантастики )

    Reply
  14. pm74

    (12) вобще я думаю, что это очередная неработающая недоделка от минфина

    Reply
  15. Alex_E

    (13) pm74,

    все сильно зависит от структуры продаж.

    — вне всякого сомнения…

    в моем случае :99% комиссия ,один комитент, комисионные и собственные

    — в этом случае я бы все доходы относил на доход комитента, при собственной реализации в книгу всё равно попадёт правильно, при её проведении и зачете «своей» части аванса (проверено и на услугах и на товарах).

    Для торговля как своим, так и комиссионным товаром — вот тут самый цимус. когда это всё в одной накладной. В принципе всё отрабатывает, вот только непонятка со счетами-фактурами, выданными покупателю, если мы продаём свой товар и на платим УСН — тогда какой счет-фактура — НДС то нет? Или делать разные строки с НДС / без НДС? Походу не стоит одним документом такие продажи делать — иначе потом не разгрести…

    Reply
  16. pm74

    (15) у меня и комитент и комиссионер ОСНО , завод(комитент) и ТД(комиссионер)

    я бы все доходы относил на доход комитента, при собственной реализации в книгу всё равно попадёт правильно, при её проведении и зачете «своей» части аванса (проверено и на услугах и на товарах)

    у ТД попадет конечно, а завод что будет с этими авансами делать потом

    Или делать разные строки с НДС / без НДС?

    однозначно комиссия будет с ндс если комитент на осно

    Походу не стоит одним документом такие продажи делать — иначе потом не разгрести…

    о чем и речь, а если разные документы реализации то и договора покупателя можно сделать разные см.(13) тогда и платежки можно разнести по разным договорам возможно в этом направлении и стоит автоматизировать

    Reply
  17. Alex_E

    (16) pm74,

    у ТД попадет конечно, а завод что будет с этими авансами делать потом

    — платить НДС с аванса, что ещё 🙂

    однозначно комиссия будет с ндс если комитент на осно

    — это «внутренние» расчеты между комитентом и комиссионером, а про реализацию комиссионером конечному покупателю толкую — если в одной реализации, к примеру, продаётся продаётся одно наименование товара, а у комиссионера он как свой, так и комиссионный, как правильно это потом оформлять, или тупо не допускать таких ситуаций?

    Reply

Leave a Comment

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