выбор пунктов из списка и генерация договора по этим пунктам с учетом цены

Автор 4_3, 15 марта 2024, 16:06

0 Пользователи и 1 гость просматривают эту тему.

4_3

есть много разных услуг. с зависимостями (нельзя красить не прогрунтовав) у каждой есть цена.
как сгенерировать договор и цену, выбрав в листе ТЗ нужные галки? это вопрос к BASE к райтеру или к калку?

economist

Красивый договор - это Writer.
Логика комплектации - это Calс и Формулы
Между ними Слияние - это Base (файл - пустышка)


Но так как нужен отбор флажками - нужна Форма, это Writer или Base или Calc.

Начать стоит с Calc, с прайса в нем. К нему создаём базу данных, в ней пишем SQL-запрос для столбца с флажками/единичками и получаем по Ctrl+Shift+F4 в Calc диапазон БД (на пустом листе). Его можно отразить в договоре Writer как DDE-связь с ods или TXT-файлом (Раздел со связью).

UPD: Сам Writer таблицы из Base по Ctrl+Shift+F4 обновлять не умеет, только отдельные поля БД или через ужасный Конструктор, который перемешивает поля (по алфавиту) и является одноразовым. Поэтому Calc неизбежен. Ну или придется много макросятничать во Writer
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

4_3

Вопрос 1:
"Начать стоит с Calc, с прайса в нем. К нему создаём базу данных, в ней пишем SQL-запрос для столбца с флажками/единичками и получаем по Ctrl+Shift+F4 в Calc диапазон БД (на пустом листе). Его можно отразить в договоре Writer как DDE-связь с ods или TXT-файлом (Раздел со связью)."
расшифруйте плиз:
сделал файл прайс.ods
сделал пустую базу Новая база.odb
и договор.odt, в котором надо суммировать работы, сроки и стоимость..
что именно и где надо набрать, чтобы из calc работы оформились в райтере?

вопрос 2. в файле прайс.ods в столбце H  в строке 10 и 17 показано, что указанные работы выполняются после выполнения работ под номерами id 6, id 10 и id 3. как сделать эту зависимость?

вопрос 3. как сделать календарный план в виде таблички?

economist

Создавать надо БД-пустышку в виде "подключения" к ODS-файлу. Тогда внутри пустышки вы получаете возможность фильтровать ODS-данные SQL-запросом, см рис. И по результату этого запроса вы можете строить Рассылку и Слияние дапнных по маршруту - ODS - ODB - SQL- ODT. Надеюсь расширения в файлов видны?   
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

economist

Ключ к решению проблемы трансформации Таблиц в Текст Договора/Спеки лежит в зоне SQL в файле Base (ODB). Именно на этой стадии можно в SELECT-запросе реализовать произвольную бизнес-логику комплектации услуги, не меняя саму ODS-таблицу с прайсом (что не удалось решить формулами, это легко если уметь и сложно если не захотеть). SQL - это еще один "слой фильтрации" с очень ясной логикой отбора. SQL надо полюбить всем, кто любит работать за компьютером, это требование XXI в. 

Другое дело что просто так перетащить данные  в окно Writer нельзя (можно не неудобно, пробуйте, см. рис.) Приходится перетаскивать по Ctrl+Shift+F4 в ODS (этот же или отдельный), а оттуда уже Вставлять в ODT как Связь по DDE. Для того чтобы все обновлялось при изменении в SQL-запросе -нужно открывать и ODS и ODT (это расплата за отсутствие макросов).

Пока идет все как надо, но вам надо пробовать ручками все сделать, см. вложения, распакуйте в любое место. БД надо зарегистировать по Alt+F12 - ...Base - Базы...

На самом деле путь автоматизации договоров в OpenOffice|LibreOffice прошли многие, но никто не поделился решением, слишком кастомные они оказались. Вас тоже ждет много нового и неочевидного. 
 
UPD: Ctrl+Shift+F4 из ODB в ODT в разных версиях LO (5-6-7-24) ведет себя по-разному, кое-где столбцы не сортируются при перетаскивании, т.е. почти отлично.

   
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

economist

Если взять самое "живучее" решение из моего опыта (холдинг 22 предприятия, 100 млрд. выручки в год)- оно оказалось для меня абс. неожиданным: чаще всего применяется "ручная сборка" Спек в Договоре методом Drag& Drop, причем перетаскивание делается не по Ctrl+Shift+F4 (хотя и это тоже), но в основном из Элемента управления (Контрола) вида Таблица (см. рис.)

Оно работает даже без макросов, вполне интуитивно, есть удобные Панели инструментов в LО - Навигация формы (для поиска нужной строки среди сотен тысяч). Штатный функционал OpenOffice|LibreOffice просто потрясающе большой, мы все сильно грешим, не используя его (а стремимся в макросы и прочие сложности). Опять же, никто не читает документацию и справку, мало проб.   

Но если в событие Таблицы добавить один макрос - он может анализировать контекст клика в верхней таблице и сделать самый удобный подбор строк с "перефильтрацией" на уровне Формы из, смею утверждать - лучше чем в самом  дорогом и легендарном своей "корпоративностью" ПО (1С, SAP, Navision, Галактика - в чем работал сам).

Такой вариант тоже "живет" в холдинге, у некоторых. Но любимым моим остаются Python/Pandas-способы работы с данными и генерации документов на базе SQLite (Base там позволяет править данные, а не только читать как в случае с ODS/Calc). Правда использую их в основном сам и никому не покажу  :)

Подытожим:
1. Проблема автоматизации сложных договоров сложна и не решена нигде, ни в одном дорогом ПО;
2. OpenOffice|LibreOffice имеют встроенный функционал для автоматизации договоров (изучайте);
3. Макросы OpenOffice|LibreOffice Basic/Python могут реализовать любую хотелку и даже "дичь";
4. Самое сложное - не переусложнить решение, потому что сложное останется невостребованным.

PS: Поражаюсь людскому трудолюбию. Часть персонала не готова к "пропасти" глубокой автоматизации, приходится действовать бережно, часто соглашаясь со сложившимся "тупизмом". Многие до сих пор реально любят заполнять конверты письменно, ручкой, и ничего вы с этим не поделаете. "Дураков работа любит" - поговорка именно про это.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

economist

Пара слов о логике комплектации услуг. Если честно, это сложно настолько, что иногда проще держать в голове, чем автоматизировать. Или надо идти от САПР, где, собственно, связь не логическая, а конструкционная. Или использовать ML c их рекомендательными системы "с этим чаще берут и всегда возвращаются".

А как у них? Например, берем самый крутой и дорогой коробочный продукт 1C:ERP, в нем в карточке договора есть вкладка "Условие оплаты", которое часто содержит условия отгрузки и намеки на сложную комплектацию. Для сложных договоров на заполнение вкладки уйдет 30 минут, потому что текст договора приходится вычитывать 5-6 раз. В результате половина пользователей просто не заполняет ее и лишает себя отчетов по срокам (следят по наитию или выборочно). Механизм поузловой комплектации/Спек тоже есть в ERP, но он тоже сложен до степени отвращения.

А как надо? Нужно делать такие вещи проще, прежде всего избегать сложных юридических конструкций (но с 20-ю млн. юристов Россия обречена еще долго вычитать договоры). Если упростили условия отгрузки в терминологии и сроках - остается колич. увязка. Здесь лишь базовая арифметика и логика, и очень хорошо что вы пытаетесь это автоматизировать.

Прежде всего нужно связать все что можно в "цепочки". Там где окажется слишком сложно - укрупнить изначально в Пакеты услуг (сотовые операторы прошли этот путь). То есть связи Наименование 3+16, 6+9, 10+9 можно назвать Пакет_А_3+16 и прописать формулой Calc в отдельный столбец. Скорее всего связь двух услуг не всегда двустороняя, она м.б. восходящей или нисходящей (краска (и после выбор грунтовки) чаще чем наоборот). И тогда SQL не ошибется, если написать два условия: по столбцу "да/нет" и/или по столбцам "пакетов".     
 
Итак, что выводить в Предмет договора или Спеку могут высчитать с выдачей "1" формулы в Calc и/или может сделать SQL-запрос в Base. SQL умеет выбирать не только строки (WHERE, HAVING) но и столбцы (CASE WHEN THEN END). По сложности реализации эти способы, пожалуй, примерно равнозначны и вполне могут "сожительствовать", потому что что-то где-то проще дается (или уже вам известно как и что делать). Язык SQL на редкость понятный и приятный, не надо его бояться. На мой взгляд 25% обычных пользователей быстро учатся писать простые одно-табличные SQL-запросы со сложными условиями и обработкой строк и находят в этом удовольствие (с макросами это, увы, лишь 1%).   

Часто развернуться с формулами в Calc мешает Общий доступ к файлу со стороны нескольких инженеров ПТО с сильно разной квалификацией. В Base (файле-пустышке с запросами) обычно никого нет (дайте себе доступ на Запись, остальным на Чтение, и сможете править SQL в копии в любое время, а затем сохранять поверх ReadOnly-файла с перезаписью).
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

4_3

я понял процентов 30.
буду разбирать потихоньку.
к тому же, Ваши указания из этой темы нужно соединить с Вашими же советами про freecad..
это весьма интересно. спасибо..
мы пробуем разобрать в своей группе в телеграм..
буду рад, если присоединитесь..
https://t.me/freecad_russia
 тема про апи
я пошел читать про sql, чтобы Вас понять =)

economist

Сначала надо скачать из #4 архив D.7z и "понять руками" как работает Ctrl+Shift+F4.

Инструкция по отбору на языке SQL уложится в одно предложение: 

SELECT КолонкиЧерезЗапятую FROM ИмяТаблицыДиапазонаИлиЛистаODS WHERE условие1 OR условие2...
Условие1 это что-то простое вида "да/нет"=1
Условие2 это что-то для цепочки (посложнее).

Написание условий в SQL от OpenOffice|LibreOffice крайне осложнено тем, что очень мало SQL-функций реализовано. Почитать стоит вот это:
- https://www.openoffice.org/dba/specifications/file_based_functions.html (почти все сделано)
- https://help.libreoffice.org/7.6/ru/text/sdatabase/02010100.html?DbPAR=BASE#bm_id3153323 (проверяйте все написанное)
   
Т.к. OpenOffice|LibreOffice Base самый заброшенный продукт - справка по SQL в нем такая же. На практике это означает несколько простых правил:

1) Представьте что у вас в SQL есть только строковые функции SUBSTRING, LEFT, RIGHT, LENGTH и единственная нормальная функция для сравнения LIKE с возможностью замены неизвестных символов знаком '%' или '*'   

2) Пустые "" ячейки и Null это разные вещи, нужно понять что такое Null и как с ним работать. Null в ODS нет, но он обязательно появится как результат других функций, объединений итд.

3) Храните в колонках данные так, чтобы их было легко выбирать простым прямым сравнением, по Null или не-Null или LIKE-сравнением. То есть если у вас к услуге 5 есть две довески в виде услуг 6 и 10 - храните их в отдельных столбцах Довеска1, Довеска2, Довеска3 итд. Это СИЛЬНО упростит логику написания сложных условий для SQL-запросов, не прибегая к еще более сложным SQL-подзапросам и SQL-объединениям.

Например SELECT * FROM Лист1 WHERE "тебуется выполнить" LIKE '*id 6*' выведет строку с 'id 6, id 10' То есть мы с помощью LIKE выполнили поиск в "массиве/списке/перечислении". Но отдельные коды id в разных столбцах могут быть гибче. особенно если это будут просто целые числа, без текстового мусора.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...