Проблемы оценки ИТ-Проектов




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

21 Comments

  1. Steelvan

    Привет !

    Reply
  2. chavalah

    (1) Steelvan, Игорь, привет! Необычное место для «поздороваться»))

    Reply
  3. dag903

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

    Я всегда руководствуюсь двумя правилами:

    1. «Что для Заказчика СЛОЖНО — значит для Исполнителя будет ПРОСТО. И наоборот. Что для Заказчика ПРОСТО — для Исполнителя ОЧЕНЬ СЛОЖНО». Например, если Заказчик говорит (очень утрировано): «Мне надо чтобы я нажал одну кнопочку и всех была вся информация, все пересчиталось, СМС отправлены, письма всем клиентам отправлены, отчеты на мониторе у руководителя». Значит я понимаю, что придется попотеть, чтобы выполнить его требования. Соответственно, закладываюсь на увеличенное количество работ + привлечение квалифицированных специалистов. И таким образом обосновываю стоимость работ. Но если мне Заказчик говорит: «Сделайте мне 1-2 отчета, мы его потом выгрузим в Excel и сами выполним все дальнейшие расчеты и т.п.» Соответственно и стоимость будет небольшая. Тогда и к конечному результату претензий я не принимаю.

    2. Так называемая трех-факторная модель «ДЕШЕВО — БЫСТРО — ХОРОШО». Выполняются всегда только 2 фактора, при этом третий фактор принимает противоположное значение». Вот с этих позиций и оценивать проект. Понятно, что каждый фактор величина относительная, и тем не менее….

    Reply
  4. Nikola23

    Где-то я этот текст уже видел.

    Автор, вы Автор или просто перепостили?

    Текст полезный? не спорю.

    Reply
  5. graZy

    «плюс» статья хорошая

    надеюсь «заказчики» тоже со временем начнут понимать


    Reply
  6. hostguy

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

    Reply
  7. Gendalf_beliy

    Спасибо за статью очень полезно и содержательно.

    Reply
  8. chavalah

    (4) Nikola23, Вы ничего не курили? )) Может на Инфостарт приезжали и в зале слушали?

    Reply
  9. sergsqvo

    Считаю что автор описал всего 2 метода:

    1. На основании опыта (пилотный проект или коммерческое предложение);

    2. Составление укрупненной сметы (с максимальной детализацией за оплаченное время).

    Но это не разные методы, а разные этапы проектирования.

    Причем оба этапа убыточны (чаще), но нормализуют отношения с клиентом и формализуют этапы выполнения проекта.

    Рекомендую ознакомится с ГОСТОМ http://www.it-gost.ru/content/view/101/51/

    🙂

    В идеале лучше разделить программистов и аналитиков. Хотя и сыр и масло и сливки — молочные продукты.

    Reply
  10. Gesperid

    (9) sergsqvo, так всё таки считаешь, что описал два метода?

    Reply
  11. SunShinne

    Замечательная статья. Добавил бы еще три нюанса при оценке проектов:

    1. Загруженность очереди проектов. Если работы мало — демпингуем, если работы много — задираем ценник повыше и меньше тратим времени на ухаживание за Заказчиком

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

    3. Объективно отлаженные технологии позволяют держать низкий ценник и сохранять достойную рентабельность — но требуется специализация, что, в свою очередь, требует отлаженный процесс продаж и масштаб.

    Reply
  12. Steelvan

    (11) SunShinne,

    + за п.3

    Reply
  13. chavalah

    (9) sergsqvo, а что там в ГОСТе про оценку сказано?

    Reply
  14. chavalah

    (11) SunShinne, Да, все 3 пункта справедливы. Но с «меньше тратим времени на ухаживания за Заказчиком» надо осторожнее, чтобы не сказалось на качестве и репутации. Иногда лучше совсем отказаться, чем сделать плохо.

    Reply
  15. AlexO

    (11) SunShinne, (14) ну так, и по какому методу оценивать? По 6-ти, по 3-м, по 1-му? И как затраты на оценку — лягут потом в общие расходы?

    Reply
  16. chavalah

    (15) AlexO, по поводу затрат на оценку я говорил на круглом столе на позапрошлой конференции. Советую придерживаться следующего подхода:

    — если продажа состоялась, относить затраты на проект;

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

    А оценивать надо тем методом, которым чаще угадать получилось.

    Reply
  17. &rew

    Добрый день!

    По оценке проекта. Я оцениваю по личному опыту плюс 30% на непредвиденные (30% могут и не появится, т.е. опционально, о чем заказчик предупреждается заранее). Но это что касается, когда проект веду я. Когда начинаешь оценивать со своей колокольни, отдавая его другому исполнителю, то тут просто пальцем в мимо. Соответственно вопрос в оценке уровня компетенции исполнителей. Как с этим вопросом быть? Наличие сертификатов не в счет, иногда такие дубы колдуны с сертификатами попадаются…

    Reply
  18. chavalah

    (17)Добрый день, Андрей,

    Проблема известная, сталкивался с таким. Я когда оценивал, всегда исходил из того, своей командой делать, или это просто оценка. На конференции упоминал об этой проблеме. Раз Вы умеете оценивать для себя, значит сможете и для других. Что делать: наиболее подходящим в такой ситуации является метод, который я назвал «сметный» (№5 в презентации). Еще лучше сделать оценку несколькими специалистами, затем сравнить.

    Reply
  19. &rew

    (18) Проблема мне видится шире. Нет у нас в стране четкого понимания стоимости АйТи услуг у владельцев бизнеса. Я бы даже сказал хотя бы уровня затрат на АйТи. Многие относятся к этому как к неизбежному злу, а не как к реальной помощи и сокращению издержек (не будем употреблять слово Затарт). Посему оценка специалистом который даст меньше, будет заказчиком восприниматься как более объективная.

    Reply
  20. user866649

    А где ищут(компания или специалист) оценщиков web-проектов или специалисты, которые проводят экспертизу в 1С-проектах, справятся?

    Reply
  21. chavalah

    (20) Хотя технологии оценки аналогичные, все же это разные проекты, разный опыт требуется. Необходимы компетенции именно в аналогичных проектах. Поэтому для WEB-проектов лучше к студиям разработки сайтов обращаться.

    Reply

Leave a Comment

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