Как Колька руки выпрямлял

Тэ-Зэшница 2.0 ВОЙД!!!11

Реорганизация БД — шаг 3

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

Все кубики, из которых собирается Тэ-Зэ — должны иметь обдуманную, понятную, расширяемую структуру.

Начнем по-порядку:
Тэ-Зэ начинается с данных клиента. Этот момент разобрали ранее: отдельно храним организации, отдельно персонажей. Из этих компонентов, в последствии, собирается карточка организации. Делая разного рода выборки, можно будет отобразить разнообразную аналитику.

Далее — суть Тэ-Зэ — материалы, и что с ними делать, чтоб получилось то, что хочет клиент.
Получается, что второй кубик — не так прост. Он сам состоит из своих маленьких кубиков.

К примеру: материал «Баннер литой (Европа) 440 гр./м²» — Имеет, кроме категории «Рулонных материалов», под-категории «Литые баннеры», свойства «граммаж», свойсва «цена за м²» и проч., еще и некоторые связи с табличкой Услуги (которую, мы пока еще не создали).

Сейчас я предприму попытку перечислить возможные услуги, и прокомментирую категории материалов, к которым они применимы:

  • Широкоформатная печать — все рулонные
  • Интерьерная печать — все рулонные
  • Латексная печать — все рулонные (с ограничениями)
  • УФ печать — все рулонные (с ограничениями), все листовые (с ограничениями)
  • Обрезка ручная — все рулонные, листовые до 5 мм толщиной (подразумевается обрезка ножом/ножницами)
  • Обрезка механическая — все рулонные, и листовые (подразумевается обрезка лобзиками, болгарками и циркулярками)
  • Плоттерная резка — рулонные: пленки с клеем
  • Выборка — рулонные: пленки с клеем, после Плоттерной резки
  • Перенос на монтажную пленку — рулонные: пленки с клеем, после Выборки
  • Лазерная резка — листовые: без ПВХ и металла
  • Фрезеровка — листовые
  • Ламинация — рулонные: пленки, бумага
  • Прикатка — рулонные: пленки с клеем
  • Усиление краев — рулонные: баннеры
  • Установка люверсов — рулонные: баннеры
  • Стыковка-спайка — рулонные: баннеры
  • Изготовление карманов (для утяжелителей, к примеру) — рулонные: баннеры
  • Натяжка на подрамник — рулонные: баннеры, текстиль

Пока хватит.

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

  1. Интерьерная печать на самоклейке + прикатка на ПВХ
  2. УФ печать + ПВХ
  3. Плоттерная резка цветного оракала + выборка + перенос на монтажку + прикатка на ПВХ

Используя эти строительные блоки, мы будем генерировать инфо-текст для кейсов, а также будем использовать этот подход, для создания шаблонов Тэ-Зэ для типовых конструкций.

От сюда хорошо видно, что каждая услуга, применима к своему перечню материалов. Где-то к целой группе материалов, а где-то с ограничениями.

Более того, есть не очевидные моменты: скажем сразу — у каждой услуги, есть стоимость, и вот у люверсов, стоимостей ровно столько, сколько этих люверсов существует в природе диаметром.

Есть еще более не очевидные вещи — есть взаимоисключаемые услуги. Например, мы не можем пробить люверсы, по стороне баннера, на которой изготовлен карман — в карман тогда просто труба не войдет. Но относительно одного заказа, эти услуги можно применить обе. Бить люверсы и клеить карманы на разные стороны баннера.

А ламинация бывает двусторонней.

И ламинировать можно всеми материалами из категории «пленки с клеем».

Прикатка, тоже бывает двусторонней.

А усиление краев бывает двойным и тройным и еще в добавок с реп-шнуром ?

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

Следующий кубик Тэ-Зэ — Менеджер.

Почему-бы, не дать возможность Старшему менеджеру, или Руководству, написать Тэ-Зэ, и делегировать задачу другому менеджеру?

Ну или вот, заказали Пете, вчера, баннер. Он принял заказ, всё там провел, Тэ-Зэ запустил, и в отпуск лыжи намылил. И чего делать? Правильно — делегировать!

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

А раз мы об этом подумали, то неплохо бы предусмотреть логирование цепочки делегирований.

Далее — Даты

Даты, имеют свойства: срываться, переноситься, уточняться, отсутствовать вовсе, и прочее. Это не шутки, это жизнь =/

Даты будем хранить как есть, и логировать в случае изменений. Наверное даже комментарии какие-то задумаем, для оправданий ;))

Чем мельче мы разберем на компоненты Тэ-Зэшку, тем гибче сможем проводить аналитику. Но увлекаться и перегибать не стоит. Всё в рамках разумного.

В следующем посте, мы модернизируем существующую форму Тэ-Зэ на печать, подгрузив в выпадающий список материалов — материалы из БД.
Да-да, сейчас оно прямо в хтмле прописано О__О

21 сентября  

Реорганизация БД — шаг 2

Наполнение таблиц первичными данными

начнем с Клиентов и Организаций.

В нашей замечательной табличке zakazi есть следующие колонки:

  • «ime» — ФИО клиента
  • «firma» — Название организации
  • «tel» — телефон (непонятно чей, общий или личный).
  • «email» — мыло (тоже не ясно, но разберемся)

Сейчас я попытаюсь вывести информацию из базы (17898 строк) в сгруппированном по Фирмам виде.
Затем вручную очищу от фейков, и заведу их в базу Организаций.

создам файл omg.php такого содержания:

<?php 
$query = $mysqli->query("SELECT `ime`, `firma`,`tel`, `email`  FROM `zakazi` GROUP BY `firma`");

echo '<table>';

while($rows = $query->fetch_array()){
	echo '<tr>
		<td>'.$rows[firma].'</td>
		<td>'.$rows[ime].'</td>
		<td>'.$rows[tel].'</td>
		<td>'.$rows[email].'</td>
	</tr>';
};

echo '</table>';
?>

Запустил скрипт, он вывел мне 2423 строки.

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

Некоторые менеджеры (да и сам я так делал) указывали либо свой емейл, либо что-то вроде 1@1.ru, вместо телефона — цифру 1. И тп.
Опустим тот момент, почему так происходит, просто остановимся на том, что такие данные мы загружать в базу не будем.

Немножко цифр из зачистки, ну так, забавы ради:

  • фейковых телефонов — 1147 из 2423
  • фейковых емейлов — 1400
  • строк, в которых, по результатам зачистки, пустые оба поля мыла и телефона — 1641
  • фейковых названий организаций — 53. Хмм, подозрительно, наверное я плохо искал
    • самое забавное что нашел среди фейков — «Дама с собачкой»
  • итого, после тотальной зачистки — 478 строк идет в базу.

Как запихнуть данные из Excel обратно в БД?

Я предпочитаю не делать себе мозги с импортом в CSV. Хожу на этот Замечательный ресурс

  • выделяем в Экселе все ячейки таблицы,
  • Ctrl+C,
  • переходим в браузер, в этот конвертор,
  • Ctrl+V в верхее окошко,
  • между верхним и нижним окошком выбираем MySQL,
  • и в результате мощного колдунства — получается готовый SQL запрос.

С клиентами и организациями, покончено, ура.

Теперь к материалам

Тут не намного сложнее. У меня есть прайс лист в Экселевском виде. Приведем его в нужный вид, и через уже знакомый Mr. Data Converter запихнем в базу.

Первичные данные добавлены. Теперь к сложному — дополнение уже имеющихся таблиц. Об этом — следующий пост.

17 сентября  

Реорганизация БД — шаг 1

Начнем, пожалуй, с самого простого: создания новых табличек, для:

  1. кейсов
  2. клиентов
  3. материалов

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

Кейсы

В них мы соберем информацию, которая дублируется в каждой отдельной Тэ-Зэшке.

Кейс будет хранить:

  1. свой id — case_id
  2. id клиента — client_id
  3. id менеджера — manager_id
  4. дату создания — date_creation_case
  5. дату сдачи заказа — date_completion_case
  6. общую информацию по заказу в почти свободной форме — case_info, например:
    • Планшеты ПВХ 30х40 см: 10 шт.
    • Баннеры 100х160 см: 5 шт.
    • эта информация будет генерироваться автоматически, при составлении Тэ-Зэ
  7. id заказов из таблицы zakazi, через запятую — case_orders
  8. число — интикатор, на сколько процентов заказ выполнен на данный момент — case_status

В представлении кейса будет показано 6 пунктов, из 8. Первый и седьмой, нужны под капотом. Этой информаци, более чем достаточно, для быстрого анализа положения своих заказов в производственной цепочке на данный момент. Для более глубокого анализа — можно будет тыкнуть в кейс мышкой, и тут уже ЭВМ покажет, на какой стадии находится каждый отдельный элемент кейса — сколько пленки отпечатано, сколько накатано, сколько баннеров на обработке и проч.

Клиенты

Тут будет 2 таблицы. Для организаций, и их сотрудников.
Так сложилось, что в одной организации, может работать от 1 до 100500 сотрудников, и с кем именно мы контактируем по данному заказу — нужно знать.

Таблица организаций:

  1. id — organization_id
  2. Наименование — organization_name
  3. Общий емел — organization_email
  4. Общий телефон — organization_phone
  5. id сотрудников, из таблицы сотрудников, через запятую — organization_employees

Таблица сотрудников:

  1. id — client_id
  2. ФИО — client_name
  3. емейл — client_email
  4. телефон — client_phone
  5. id организации — organization_id
  6. комментарий — client_comment
    • если данный клиент мудак или неадекват, мы хотим быть предупреждены

Материалы

  1. id — material_id
  2. Категория  — material_category:
    • Рулонные — material_roll
      • Баннер — material_banner
      • Пленка с клеем — material_film_with_glue
      • Пленка без клея — material_film_not_glue
      • Бумага — material_paper
      • Текстиль — material_textile
    • Листовые — material_sheet
      • Акрил — material_acrylic
      • ПВХ — material_pvc
      • Полистирол — material_polystyrene
      • ПЭТ — material_pet
      • Дерево — material_wood
      • Поликарбонат сотовый — material_polycarbonate_honeycomb
      • Поликарбонат монолитный — material_polycarbonate_monolithic
      • Алюминиевая комп. панель — material_composite
      • Пенокартон  — material_foam_carton
      • Лист оцинкованный — material_galvanized_sheet
      • Сэндвич-панель — material_sandwich_panel
  1. Наименование — material_name, пример для рулонного материала — пленки с клеем:
    • Orajet 3640 M 010
  2. Комметарий — material_comment(не всем сходу понятно что это такое) пример для примера выше:
    • Самоклеящаяся пленка Orajet 3640 матовая, белая
  3. сколько квадратных метров в наличии — material_s
  4. индикатор — material_visible — вдруг мы расхотим показывать этот материал, но удалять пока не будем.
  5. стоимость за квадратный метр — material_price

Таблички готовы. Теперь их необходимо заполнить первичными данными. Об этом — следующий пост.

16 сентября  

Дверь в ТэЗэшницу

Эта заметка коснется только внешнего вида двери в кузницу ТэЗэшек.

Форма логина, сейчас, выглядит так:

А форма регистрации, вот так:

Я заменил логотип компании на логотип ТэЗэшницы. Слово ТэЗэшница — я придумал вчера, раньше у этой системы не было названия. Теперь есть. Я доволен.

16 сентября  

Девелопмент роад-мап

Перед тем как вы преступите к захвату мирового господства, вершению великих дел, или к женитьбе —

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

Взглянем поближе

Сперва-сначала, мы посмотрим на то что у нас есть. Разберемся с какими вещами ТэЗэшница справляется, а с какими нет. Пройдем по каждой кнопочке и окошку, пофантазируем, поразмышляем, и обрисуем задачи на карте разработки.

Взгляд на используемые технологии

Судя по дате самого первого ТэЗэ в БД (MySQL), а это январь 2014 года, при разработке ТэЗэшницы 1.0, использовались возможности php 5.4. На дворе сентябрь 2018 года, и мы будем использовать возможности php 7.0

Что же там в БД

Взглянем на то, что собственно система аккумулирует в базе, я приведу SQL запрос INSERT ко всем столбцам таблицы zakazi , чтоб вы воочию узрели весь лютый кошмар, там происходящий:

INSERT INTO `zakazi`(`nomer`, `ime`, `data_zakaza`, `firma`, `tel`, `email`, `web`, `ime_maketa`, `pechatni`, `material`, `material1`, `razreshenie`, `dlina`, `visota`, `kol`, `S`, `provarka`, `prokleyka`, `lyvers`, `karman`, `obrezka`, `laminaciy`, `vid`, `data_sdachi`, `data_dostavki`, `primechanie`, `edit`, `zametka`, `manager`, `otchet`, `Dir`, `Ruk`, `Pech`, `Ruk1`, `otcha1`, `otcha2`, `votch`, `vdir`, `vruk`, `vpech`, `vruk1`, `votch1`, `votch2`, `edit1`, `kosyk`, `brak`, `apolo`, `polka`) VALUES ([...])

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

Что хранится в первых столбцах, я примерно понимаю, а вот в столбцах начиная с `otchet` — тут без поллитра не разберешься.

Стратегически-полезной информации сохраняется откровенно мало, и сохраняется немножко не так:

  1. Данные клиента — замешаны в одну кучу с мухами и котлетами, их необходимо вынести в отдельную таблицу.
  2. Используемый в заказе материал и его площадь — почти ок, можно даже кое-какую аналитику проводить.
  3. Менеджера, ведущего заказ — ок, но не запоминает исполнителей.
  4. Стадии прохождения заказа — информация хранится в Булевом виде, что не дает нам простора для аналитики, а менеджерам полной ясности картины. Мы будем записывать таймштамп и юзера, отметившего стадию пройденной. И стадий, кстати, гораздо больше.

Мне необходимо внедрить ТэЗэшницу 2.0, сохранив при этом возможность хоть как-то анализировать старые задачи.

Что будем делать с базой?

  1. Тотал ренейм! Чтоб глаз дергаться перестал.
  2. Создадим отдельную табличку для клиентов, не будем писать их в явном виде в задаче, будем подтягивать по айди.
  3. Тоже самое сделаем с материалами.
  4. Добавим стратегически-полезных полей.

Я, как печатник, хочу отмечать с какими профилями и настройками станка, будет печататься тот или иной заказ. Это даст прямое представление о скорости выполнения этого заказа. В разных режимах печати — разные скорости, и они известны, я хочу использовать эту информацию. Так-же это люто сэкономит мое время, когда придет чувак, печатавший у нас постер 3 года назад, и скажет: «- Вот новый макет, но сделайте плз чтоб вот тут зеленый был таким-же зеленым как и здесь».

Взглянем на форму составления ТэЗэ:

Мы имеем две формы. Когда-то была одна (на первом скрине). Вторая появилась 2 года назад, моими силами. Сейчас будет отступление к истории предприятия, его внутренней организации.

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

С ТэЗэшками на фрезеровку и лазер она не справлялась, из-за организации БД. С задачами для макетчиков не справлялась по той же причине. ТэЗэшки макетчикам печатаются на бумаге, и передаются в руки. Для контроля исполнения задачи приходится ходить своим пешком в макетку.

Теперь оно кое-как контролируется. Всё так-же печатается на бумаге, но ходит и проверяет теперь только начальник производства, и ставит галочки во второй таблице.

Так сложилось исторически. Так сложилось от криворукости. От такого уклада у всех волосы дыбом. Я хочу объединить и формы, и таблицы в одну, хочу облагородить внешне, и принести дзен вовнутрь.

Хочу чтоб когда менеджер напечатал первые две буквы фамилии клиента, форма предложила варианты в автоподстановку, о которых уже знает.
Хочу, чтоб менеджер мог просто перетащить макет в форму, и она сама заполнила те поля, которые смогла прочитать.
Хочу чтоб форма подсказала менеджеру, что материала на производстве может не хватить на этот заказ, что нужно его докупить.
Хочу, чтоб она подсказала стоимость заказа.
Хочу чтоб менеджер мог иметь черновики. Чтоб мог пользоваться шаблонами для часто-одинаковых заказов. Хочу, чтоб менеджер не страдал, а работал быстро и эффективно.
Форма может помочь перестать делать двойную работу, и должна это делать.

Теперь к таблицам

Я их показывал прошлым постом, но взгляните, пожалуйста, на них еще раз:

Здесь нужно переделать абсолютно всё.
Я хочу иметь возможность сортировать задачи по материалам, по пособработке, по срокам сдачи, по клиентам, по менеджерам, скрывать отпечатанное, порезанное, заламинированное. Хочу отмечать профиля и настройки станка. Хочу отмечать на каком рулоне распакованного материала я напечатал это, а на каком вот это. Для чего? Чтоб понимать, сколько погонных метров в рулоне осталось.

Сейчас расскажу, как приблизительно прикинуть, сколько еще материала в рулоне:

Нужно посчитать «годовые кольца» и умножить на 30 сантиметров. Я устал так делать.

Хочу, чтоб менеджер мог развидеть поля, которые ему не хочется видеть, а в случае чего, увидеть снова. Чтоб перестал ломать глаза.
Для менеджмента, я намерен кардинально изменить представление задач. Я внесу, такую сущность, как кейсы.
Это будут такие папочки, внутри коротых будут лежать заказы от одного клиента, на настоящий момент времени.
Сейчас каждый макет — отдельное тз. В базе мы это так и оставим. Вот к примеру, у нас есть заказ от условного ООО «Рога и копыта», они хотят 3 баннера, и 5 постеров. Производству мы покажем их отдельными строками. Но менеджеру будем показывать кейс, внутри которого эти 8 строк будут сгруппированы, и опрятно отображены. Без вырвиглазности. Для глубоких раскопок внутри кейса — его можно будет развернуть, и посмотреть — скорректировать.

Чего еще нет, но хочется

Нет никакой системы управления юзерами, группами и тд. Вся админская работа ведется врукопашную, напрямую в бд и в коде.
Создадим эту самую одминку!

  • Чтоб старший менеджер мог зарегать нового менеджера, чтоб начальник печатки мог зарегать нового печатника, и тд.
  • Чтоб руководство могло работать с прайсом (от сюда, кстати, вырастет API)
  • Чтоб я мог добавлять новые материалы
  • Чтоб тот парень мог себе аватарку поменять, в конце то концов!

Хочется мобильную версию.

И так, теперь по пунктам

  1. Реорганизация БД.
    • Ренейм полей
    • Создание новых таблиц для клиентов и материалов
    • Добавление новых стратегически-важных полей
  2. Редизайн таблиц.
    • Изменение представлений
    • Добавление фильтров
    • Объединение двух таблиц в одну.
  3. Редизайн форм.
    • Объединение форм в одну
    • Добавление форме мозгов
  4. Одминка

Ну, вроде бы, общий план ясен.

Ой, совсем забыл о входе и регистрации. Там-ведь тоже конь не валялся

Начну я, пожалуй, с него. Об этом — следующий пост.

16 сентября  

Хеллоу Ворлд

Привет %username%!

Я должен сразу признаться, что сварщик я не настоящий, а только учусь.

И учиться я намерен, примерно, следующему:

  1. писать чистый, читаемый, работающий код,
  2. делать SQL запросы, чуточку сложнее чем SELECT и INSERT, познать PDO,
  3. перейти от процедурного стиля в php к ООП,
  4. перейти от Jquery к чистому JS
  5. проектировать приложение
  6. Git
  7. БЭМ
  8. Материал-дезигн
  9. проектировать API

— Что же делать?

У нас есть приложеньице, написанное в далеком 2014 году, неизвестным мне, ненастоящим сварщиком. Оно призвано облегчить страдания менеджмента на рекламном производстве, и доносить до производства что им сегодня делать. Это ТэЗэшница. Я своими силами, и кривыми руками, немножко её обновлял, допиливал под себя, немножко под менеджеров, но то что сейчас мы имеем — ужасно и неподдерживаемо.

В неподдерживаемости продукта, частично виновен Я, частично устаревшие технологии, и капельку тот чувак, который сотворил продукт 4 с половиной года назад.

По роду своей деятельности, на этом самом рекламном производстве, мне приходится пользоваться этой ТэЗэшницой, ежеминутно. И я, признаться, от этого страдаю. Она выполняет свои задачи, не совсем в том обьеме, в котором задумано.

Чем рассказывать, я лучше вам покажу. Вот, смотрите, пожалуйста:

Вот так её вижу Я. Помните, я сказал, что допиливал её под себя, а капельку для менеджмента? Я не шутил про капельку, а говорил серьезно, смотрите как её видят менеджеры:

Несмотря на не самый маленький монитор (1600х900 пикселей) мне пришлось уменьшить сайт на 175% чтоб заскриншотить это всё целиком.

В один прекрасный момент (год назад), я устал ломать глаза, и объединил для себя столбцы с пособработкой в один. Устав перепутывать количество отпечатков с площадью (например нужен 1 баннер 1х3 метра, площадь 3 квадрата, оно написано рядом, и нехер делать напечатать баннер трижды, поглядев замыленным взглядом не в тот столбец), раскрасил красным кол-во, если оно больше чем 1. Ну и еще мелочи всякие, типа как — шапку прибил, не уходит вврех при скроле. Но для менеджмента, повторить тоже самое, не дошли руки.
Архитектура на данный момент такова, что для каждой группы юзеров (печатники, начальники, манагеры, макетчики, дизигнеры), показываются поля общей таблицы, нужные только им. Но как это сделано? В лоб

if(user_prava == 1){
    портянка хтмла и пхп;
} else if(user_prava == 2){
    еще портянка;
}

То-есть — шаблона нет, для каждого юзер-гроупа нужно переписывать отдельно всё. И я, если честно, боюсь об этом думать.

Но настало время добрых дел. Пора принести радость и легкость бытия к менеджерам и производству!

ТэЗэшница 2.0 ВОЙД!!!11

15 сентября