Зарплата по месяцам




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

29 Comments

  1. e.kogan

    Только раскройте, пожалуйста, что в данном случае подразумевается под зарплатой (основные начисления, только оклад, если оклад — то откуда берётся и т.д.)

    Reply
  2. zba

    Зарплата — это все начисления (основные + дополнительные) за месяц, вообщем сколько всего начисленно.

    Reply
  3. Olyunchik

    Здорово!!! И не надо париться!!!

    Reply
  4. soda

    А должности то не правильные 😉

    Reply
  5. zba

    А у меня вроде все нормуль. А что именно не равельно?

    Reply
  6. filis

    Спасибо! то, что надо!

    Reply
  7. irishka77

    Спасибо! срочно сегодня понадобился!

    Reply
  8. irishka77

    ошибка ВнешняяОбработка.СредняЗарплата(396)}: Деление на 0

    сред=(((число(доходКСредний)/отрабденй)*РабДней)/МесяцдляСреднего);

    Reply
  9. irishka77

    и сбрасывает нужный период до одного месяца

    Reply
  10. irishka77

    с 9 разобралась- период д.б. одного года. полезем дальше

    Reply
  11. irishka77

    8 ошибка — нкжно проверять отрабденй не на нулл, а на 0. все работает и как будто правильно. Но мне надо за 12 месяцев средний( с переходом по году). ПОПРОБУЮ ДОДЕЛАТЬ

    Reply
  12. ves.Parnas

    может на чем и завалится, но, сходу сработало! Возможность настроек бы еще прикрутить…

    А так +

    Reply
  13. ves.Parnas

    таки, при делении на 0 валится

    Reply
  14. zba

    исправил вроде нормально, пробуй

    Reply
  15. b-dm

    А нет ли такого для 7.7 ? Очень нужно 🙂

    Подскажите, пожалуйста)

    Reply
  16. b-dm

    (14)

    Для 8-ки отличный отчет,сейчасскачаю…А для 7-ки есть аналогичный, автор ?)))

    Reply
  17. zba

    Для 7-ки не нету не делал, 7ок в моем ведении уже года 2 как нету поэтому не заморачивался, вот как то так.

    Reply
  18. n.lana

    Идея замечательная, вот только если у сотрудника история за несколько лет сложилась в 2009 г был принят внешним совместилем в Подразделение 1. В 2010 уволен из этого подразделения, в 2010 году принят был в другое подразделение на основное месо работы, в 2011 году уволен из этого подразделения и принят в другое (руководитель с контрактом) то в отчете выводятся начисления в 3 строках, затраиваются. То же самое происходит в случае, кадровых перемещений. И еще в отчете, даже для директора, сумма для расчета средней оплаты труда (по количеству отработанных дней) должна выводиться без учета больничных, отпуска по уходу за ребенком, материальной помощи (выплат из прибыли) и т.д.

    Reply
  19. zba

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

    Reply
  20. zba

    Все пробуйте подправил

    Reply
  21. триша

    Может быть, пока не многие скачали, вы заодно поправите заголовки «Начисления, входящие в среднюю», «Средняя зарплата по<пробел>среднему начислению» 🙁

    Reply
  22. zba

    Спасибо, исправил. С грамотностью у меня очень 🙁

    Reply
  23. buchacha

    Бухам очень пригодилась. Жаль, что не выводит отчет по периоду с переходом года и нет отбора по подразделениям(

    Reply
  24. orsh

    Сделал такой-же для 7.7.

    Пока на модерации.

    http://infostart.ru/public/117320/

    Reply
  25. b-dm

    (24) — было бы интересно увидеть.но пока не активен. а можете на почту кинуть ? dd собака land.ru

    Reply
  26. orsh

    У меня девчонки ругаются. 🙂

    1. Где выбор организации?

    2. Как сформировать такой-же, но сразу по 2? и что суммы суммировались.

    Reply
  27. orsh

    В базе 2 фирмы, а выводит отчет только по одной.

    Reply
  28. natalika1601

    Большое спасибо. Как раз сегодня понадобился такой отчет для плановиков. ПЛЮС!

    Reply
  29. lazebny

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

    Reply

Leave a Comment

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