Word, Excel - заполнение файлов-шаблонов данными из профиля пользователя

Сб, 20/05/2017 - 10:52

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

Бизнес-задача: для двух пользователей сайта дать возможность заключить договор на некие услуги, оказываемые на сайте, а затем регулярно формировать отчетные документы на основании данных с сайта. Все указанные документы файлы должны быть выгружаемы в виде офисных файлов с сайта на ПК пользователей.

Техническая задача: Реализовать функционал загрузки, валидации и заполнения шаблонов в файлах word и excel данными с сайта, в частности из полей пользователей.

Подробно:

  1. Реализовать набор полей для пользователя - реквизиты организации (ИНН, КПП, БИК, Название банка, счёт и пр)
  2. Создать механизм заключения сделок, когда два пользователя создают некую общую сущность "Сделка", связывающую их
  3. К сущности "Сделка" автоматически цеплять стандартные шаблоны договора, (документы Word doc или docx), акта, счёта и отчёта (документы Ecxel xls или xlsx) с возможностью их замены
  4. Каждый из двух пользователей может выгрузить заполненный договор, который получается путём внесения данных из полей пользователя в шаблон, и остальные документы, когда они будут готовы

Моё видение решения:

  • п.1 - думаю делать на profile2, т.к. наборы полей будут отличаться для разных ролей
  • п.2 - видимо это будет нода, закрытая от любого просмотра. Создаваться она будет при заключении сделки. Юзеров цеплять - через два user reference, либо по автору ноды (инициатор сделки) и user reference (тот кому предложили сделку). Для этого думается написать модуль (пусть будет "dealer") со ссылкой "Заключить договор с этим пользователем", которая будет висеть в публичном профиле каждого юзера.
  • п.3 - при создании ноды буду автоматом цеплять прописанные в настройках модуля шаблоны. Шаблоны по умлочанию валидировать при загрузке на наличие всех нужных токенов. Тут нужен будет некий мэппинг токенов, упомянутых в шаблонах, и полей юзера.
  • п.4 - вот тут основная заковыка. Видимо в библиотеки library надобно воткнуть phpword и phpexcel, а в модуле dealer в нужный момент (для договоров по тыку на ссылку, для актов - по крону ежемесячно, складывая их в доступный для пользователей директории) по параметру nid подгружать ноду, тянуть из неё шаблоны и обоих юзеров, из юзеров тянуть их поля и проставлять их в документы через упомянутые библиотеки. Использовать мэппинг. Плюс научиться использовать эти библиотеки.

Вопросы:

  1. Насколько описанное выше - велосипед? Есть ли какие-либо готовые решения, умеющие хотя бы частично делать описанное?
  2. Насколько описанное выше адекватно, оптимально, разумно и прочее? Есть ли более красивые и правильные решения у поставленной задачи?
  3. Кто готов помочь мне в программировании выше описанного (за вознаграждение разумеется)?
0 Спасибо

Комментарии

Аватар пользователя bumble
3 months 15 часов назад bumble #

При особом желании - можно построить данную систему стандартными node, user, views, rules и прочий универсальный контриб.

Но, ИМХО, такой функционал заслуживает быть полностью кастомизированным (т.е. брать, и писать все сущности и референсы между ними, реализовывать интерфейсы и алгоритмы).

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

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

0 Спасибо
Аватар пользователя Grayw0lf
3 months 15 часов назад Grayw0lf #

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

0 Спасибо
Аватар пользователя iVor
3 months 5 часов назад iVor #

@bumble,

Но, ИМХО, такой функционал заслуживает быть полностью кастомизированным

спасибо! Я примерно этого и хочу.

можно построить данную систему стандартными node, user, views, rules и прочий универсальный контриб

А какой именно контриб умеет перерабатывать вордовые и эксельные файлы, заменяя в них вхождения типа {$client_account} на соответствующий ему кусок текста "12345678987654321"? Мне не удалось такого найти.

@Grayw0lf,
Спасибо за совет, но, насколько я понял, нужны именно "родные" форматы Word и Excel.

0 Спасибо
Аватар пользователя bumble
3 months 4 часа назад bumble #

Не уверен что есть готовый контриб, умеющий делать "все что нужно".

Из того что хорошо себя зарекомендовало:

Их можно пробовать укрощать в нужную сторону. Но, повторюсь - лучше написать то что нужно, чем писать под то что есть.

0 Спасибо