<?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='\
нормальная статья, еще бы от себя добавил , что иногда при обсуждении с заказчиком все вопросы и цели вроде бы проговариваются, но в итоге получается что разработчиком и заказчиком подразумевались совершенно разные вещи. Вопрос формулировок так сказать.
А еще иногда (процентов 90 случаев) у заказчика семь пятниц на неделе. Сегодня хочу одно, завтра другое, после завтра третье. В итоге вообще не то давайте все переделаем. И благодарностью будет конечно — ваша тупая программа не работает как надо!
Это не его заказчиковское дело, какие объекты будут в системе. Заказчик «заказывает» вход и выход, остальное — вопрос реализации.
(3) При все уважении, Николай. И этого не могут — «вход и выход» заказать. Мычат только.
А история просто замечательная! Порадовало попадание:
я бы чуть-чуть изменил формулировку — «говори о целях». Уточняй звучит немного пассивно. В разговоре вы можете улучшить цель, или выбрать другую.
лично мне это кажется лишним. Лучше ставить себе задачу самому, зная цель. Тогда и анализировать не придется, когда сам себе постановщик.
Формулировка как в цикле Пока Цикл, но вроде можно не ограничивать условие выхода из цикла. Выходом может быть достигнутая совсем другими методами цель (не теми, что в задаче). У всех, наверное, бывала ситуация, когда создаешь готовое решение за время, в течение которого заказчик от тебя ждет прочтения ТЗ и вопросов.
Ничто так не укрепляет веру в успех проекта как предоплата! Вы когда брались за проект, Вас спросили «Как Вы видите?». Если нет, то Ваше дело выполнить проект и получить деньги. Даже если это не нужно, все будут знать, что Вы — профессионал и с Вами можно работать. Если Вас не спросили, а вы начинаете задавать «лишние» вопросы, т.е. вопросы не типа «КАК» а типа «ЗАЧЕМ», то это очень часто выглядит как попытка «отъехать» от проекта и, как следствие, невозможность выполнить именно Вами поставленную задачу (в глазах Заказчика).
(4)
Вы, Олег, еще более безжалостны, чем я 🙂
Да, это серьезная задача — научить заказчика говорить членораздельно. Мне приходилось интервьюировать заказчика с целью написать однозначно трактуемое обеими сторонами ТЗ. Прямо ощущал себя в роли следователя, который «колет» матерого преступника…
И ведь нигде не учат этому искусству. Или, может, уже учат?
(6)
Если честно, то мне кажется, что разработчик больше поднимется в глазах заказчика, когда будет демонстрировать, что он заинтересован в решении задачи (пусть даже больше заказчика), чем просто бездумно ее выполнит, пусть даже она и не нужна.
Гораздо приятнее получить отзыв от заказчика типа:
— Пришел разработчик и не ринулся бездумно выполнять задачу а все проанализировал и предложил более рациональное решение (переубедил меня, что мне это не нужно), в результате я сэкономил. Пожалуй, я обращусь к вам еще раз.
чем:
— Сделал нам этот разработчик какую-то ерунду, теперь не знаем, что с ней делать. И зачем только обратились к вам. Зря деньги потратили.
Хотя, просто, может мне еще не попался *тот самый заказчик* 🙂
И это не будет выглядеть как «попытка отъехать от проекта», если грамотно объяснить все заказчику. Никто не любит просто так тратить деньги, поэтому, я думаю, что при грамотном обсуждении задачи (и с рационально мыслящем заказчиком) все будет хорошо 🙂
(8) «- Пришел разработчик и не ринулся бездумно выполнять задачу а все проанализировал и предложил более рациональное решение (переубедил меня, что мне это не нужно), в результате я сэкономил. Пожалуй, я обращусь к вам еще раз. »
А в жизни это выглядит так.
— Пришел мальчик, начал нам говорить, что нам это не надо, что понимает больше нас в наших бизнес-процессах. Чудак какой-то, ему деньги не нужны что ли?
и
«- Сделал нам этот разработчик какую-то ерунду, теперь не знаем, что с ней делать. И зачем только обратились к вам. Зря деньги потратили. »
— Сделал нам разработчик то, что мы просили. Оно работает именно так, как мы хотели. Хоть сейчас это уже не актуально, но человек свою работу сделал качественно. В следующий раз обратимся к нему же.
«…Никто не любит просто так тратить деньги…»
Вот это в точку. И люди это понимают очень хорошо. И они не поймут, почему вы тратите свое время/деньги и не хотите заработать.
(9)
— это уже фантастика.
(9)
А вот тут уже нужно четко понимать, какой перед тобой заказчик. Если заказчик считает себя самым крутым, то бессмысленно его в этом переубеждать (может, у Андрея и на эту тему есть история? 🙂 ) и лучше сделать так, как он просит.
Если заказчик адекватный, грамотно воспринимает критику и осознает, что основной целью разработчика является не просто сделать, что его просят, а еще и сделать заказчика счастливым, то до него можно донести мысль, что его деньги будут потрачены в пустую.
P.S.
Опять же оговорюсь, мне еще не попался *тот самый заказчик* 🙂
не смешно
вопрос был всего один:кто это написал
Из выводов пункт №3 считаю самым важным.
(11) Александр, историй полно:)
«Скоро стану я седым и старым,
Вот тогда и напишу свои я мемуары…»
Слабаки) Любое ТЗ, если только его не писал профи-методист-внедренец, будет с пробелами, и таких подавляющее большинство. Надо или «чуйку» включать, или опыт (знание подводных камней), или делать универсал. А не ждать от заказчика у моря погоды.
Много раз делал задачу «вслепую». Пару конфигураций с нуля так написал. Работают. И знаете почему? Там, где у меня была неясность, я делал общее настраиваемое решение, универсальный регулируемый блок, как угодно, но чтоб потом можно было быстро докрутить, когда появится понимание. Благо общие бизнес-процессы предметных областей и хоз.операции учёта более-менее стандартны. А детали настраивались уже потом «на лету». Универсальность наше всё)
Да, это дольше и дороже по времени. Но это стократ окупается при запуске и опытно-промышленной эксплуатации, когда вдруг оказывается, что «всё не так» и «имели в виду не это». Причём это бывают как универсальные архитектурные решения, так и просто правильно структурированный и параметризованный код.
банально, скучновато и предсказуемо
в 5-м классе средней школы такие статейки пишут
это исключительно мое впечатление как на духу
(2) так говорят, если за работу не платят = не видят ценности работы разработчика (внедренца). с такими надо работать по предоплате (частичной или полной), чтобы почувствовали цену
(3) ага, точно = все учатся на своих ошибках
(4) сейчас надо одно, в другой момент — другой контекст = надо другое — нормальное требование к программе 1с — начните работать по предоплате — это спускает заказчика с небес на землю
Вам денег за эти 2 недели заплатили??
Если нет, тогда чем обосновали не уплату? Вины вашей нет!
Если бы сотрудник который в штате и на окладе делал бы этот проект, была бы вероятность что ему не заплатят его честно заработанную зарплату?
Были в похожей ситуации, приехали на переговоры КА 1.1, просят переписать блок себестоимости и весь партионный учет. Начали задавать вопросы, оказалось, то что они хотят решается типовыми средствами через ТипЦен ПлановойСебестоимости и флаг в правах запрещающий продавать выше этого типа цен. Вторая задача, привязать шаблоны проводок к справочнику проекты, мы сказали есть типовой механизм счета учета контрагентов. В результате реализация двух ТЗ, заняла несколько человеко часов, вместо нескольких человеко недель, с туманной перспективой дальнейших обновлений. А мы получили лояльного клиента.
(20) Да, клиент тогда сам поднял вопрос оплаты и заплатил денег без каких-либо обсуждений. Но в итоге клиент был не доволен ситуацией. И скорее всего я у клиента в голове связывался с негативными воспоминаниями, так как какое-то время он с неохотой работал со мной. Поэтому я достаточно долго менял это отношение максимально проактивными и безошибочными действиями с моей стороны.
(16)
Правильно ли я понял, что хотелось бы историю с более интересным сюжетом? Или хочется больше полезных практических идей в ней?
Эти истории я изначально пишу для своих сотрудников, чтобы лучше объяснить наши принципы. Так как принципы без истории не всегда сразу хорошо воспринимаются.
Но если история эмоционально не задела, значит надо другую.
(22) Я же написал — изложение скучновато.
Когда такое рассказывают обычно клонит ко сну и вылетает из головы сразу после звонка на перемену)
Чтобы принципы запомнили в повествовании желательно ввести хорошие, лучше яркие якоря. Поговорите со штатным психологом и пишете статьи вместе.
(23)
Понял. Спасибо за обратную связь.
(5)
Как всегда полезные дополнения) Спасибо!