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

Автор 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 в разных столбцах могут быть гибче. особенно если это будут просто целые числа, без текстового мусора.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

4_3

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

если Вы не против, вот первые вопросы, для того чтобы сделать самый простой комплект файлов

1. в каком порядке Вы создали файлы?

1.1. "договор прайс.ods",
1.2. "договор прайс.odb",
1.3. "договор спека.ods",
1.4. "договор прайс.odt"?

2. как сделать прайс, чтобы довески были столбцами?
видимо, работы нужно составлять не построчно, а.. постолбчато? это не очень удобный формат..


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

4. хорошая ли идея проставлять единички прямо в прайсе? а если договоров больше одного? сколько договоров,
 столько и прайсов? как тогда обновлять?

5 как Вы вставили в райтер? как должен выглядеть шаблон в райтере? как простой текст и вставленные где надо переменные? как выглядят переменные?

6. вот табличка с командами. этого довольно для задач? точно нужно? формулы выглядят понадежней..  (но я не против выучить и 2 варианта)

4_3


economist

Отвечу на выходных. Пока освойте Ctrl+Shift+F4 и перетаскивание оттуда данных во Writer/Calc/Impress/Draw. Объяснить это невозможно, только пробовать.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

4_3

про ctrl-shift-f4 что это за меню?
тут странный список. даже таблица с именами из другого примера тут есть.
а та таблица, что я сделал сейчас - тут не отображается. хотя я ее так же добавлял
вопрос1: как управлять добавлением и убавлением таблиц в меню?
вопрос2: поля перетаскивается по одному. в то время как мне нужно, чтобы строка с названием контрагента выбиралось из списка 1 раз и оно, вместе с другим реквизитами из этой строки,  подставлялось в разных местах договора. начиная с инн, заканчивая почтой, данными банка, и прочими индивидуальностями..
нужно как-то сделать шаблон, где все эти переменные заранее можно расставить, а потом 1 раз только выбрать номер строки из таблицы и все подставится (в нужных падежах)
я видел это целью или это не то и конирол шифт ф4 - это меню только для смет?
в общем, видео я не нашел, а текст - не особо-то красноречиво.. поделитесь мнением (если можно)

4_3

вопрос 2:
как управлять этим списком? должен быть способ подключать новые и отключать за ненадобностью старые источники.

4_3

я правильно понял метод использования?
https://youtu.be/8hxmYnfxcNQ
или можно использовать строку для подгрузки данных из нее во все необходимые переменные, расставленные в райтере?