Built with OdoMate9 хв читання

Чи може згенерований модуль знижок для Odoo зрівнятися з модулем на 21 000 завантажень?

Команда OdoMate

Чи може згенерований модуль знижок для Odoo зрівнятися з модулем на 21 000 завантажень?

Ми описали для OdoMate процес погодження знижок так, як описали б його для колеги, — і з цього опису він згенерував робочий модуль для Odoo 19. Далі ми порівняли його із усталеною відповіддю на ту саму задачу: Sale Discount on Total Amount від Cybrosys, понад 21 000 завантажень, в Apps Store ще з часів Odoo 8.

За всім, що покупець виписав би в список вимог, вони рівні. Згенерований випереджає у чотирьох речах, і одна з них — це різниця між погодженням "про людське око" і погодженням, яке неможливо обійти.

Чому ми взяли вже розв'язану задачу як приклад

Відділ продажів домовився про угоду: мінус п'ятнадцять відсотків на все замовлення. У пропозиції чотирнадцять рядків, тож продавець вбиває 15 у чотирнадцять окремих полів. Клієнт додає ще дві позиції — і все спочатку.

Далі йде частина, яка хвилює фінансового директора. Якщо знижка стає надто суттєвою, менеджер має погодити її до підтвердження замовлення, і це має бути відображено у системі, а не залишитись просто повідомленням у чаті.

Ми взяли цю задачу в роботу свідомо саме тому, що для неї існують хороші відповіді. Спрямувати генератор модулів на щось екзотичне не доводить нічого: без орієнтира будь-який результат вражає. Спрямувати його на задачу, яку реальний вендор розв'язує десять років, — це вже є з чим порівнювати.

Наш орієнтир — Sale Discount on Total Amount від Cybrosys: безкоштовний, з відкритим кодом, понад 21 000 завантажень, присутній в Odoo Apps Store для кожного релізу від Odoo 8 до Odoo 19.

Що Odoo 19 вміє "з коробки"

Перш ніж порівнювати два модулі, варто знати, що Odoo дає по замовчуванню.

Odoo 19 уже вміє застосувати знижку до всього замовлення. Для цього є вбудований інструмент із трьома режимами, і заголовки розділів він обробляє коректно. Він також записує зроблене: або відсотком у кожному рядку, або окремим рядком знижки — для глобальної та фіксованої суми. А у звіті з продажів Odoo уже є показник знижки, тож переглянути знижки за продавцем, клієнтом чи періодом можна без додаткових модулів.

Чого Odoo не вміє — це контроль. Немає погодження знижок, вищих за встановлений ліміт, і немає можливості їх відхилити. Немає такого самого механізму для рахунків. І немає єдиної цифри знижки, яка йшла б через замовлення, рахунок і друковані документи: число існує частинами, а не як одна величина, на яку можна показати пальцем. Це і є чесний обсяг усієї цієї категорії модулів — і саме в ньому змагаються обидва модулі.

Як створився модуль від OdoMate

Ми описали вимогу звичайною мовою. OdoMate поставив уточнювальні питання, а ми доопрацьовували відповіді, доки вимога не почала звучати саме так, як ми цього хотіли. Далі він згенерував модуль, розгорнув його на живому екземплярі Odoo з демо-даними й прогнав по ньому власні тести просто там.

Результат пройшов перевірку безпеки й опублікований в Apps Store. Код ніхто не переписував руками. Специфікація, з якої його згенеровано, лежить поруч із ним — тож вхід і результат можна прочитати поруч. Варто уточнити, що це за файл: це початкова вимога. Відтоді модуль пройшов раунди вдосконалення — про них ідеться нижче, і вони видні в історії комітів репозиторію, проте формулювань запитів на вдосконалення модуля у цьому файлі специфікації - немає.

Порівняння функціоналу

Odoo 19 «з коробки» Cybrosys, 21 000+ завантажень Згенерований OdoMate
Знижка на все замовлення
Знижка на рахунках
Знижка зафіксована в замовленні
Знижка у друкованих документах і на порталі клієнта
Погодження керівником понад установлений ліміт
Керівник може відхилити, а не тільки погодити
Погодження, яке неможливо обійти
Заголовки розділів не вважаються товаром
Знижки у звіті з продажів ⚠️ власна копія ✅ бере готове з Odoo
Автоматичні тести 30
Посібник для тих, хто працюватиме з модулем ✅ англійською та українською
Файли перекладу інтерфейсу

✅ так · ⚠️ будує власну версію того, що Odoo вже дає · ⬜ ні · ➖ не застосовно

Верхня половина таблиці — чиста нічия. Обидва модулі дають знижку на рівні замовлення і на рівні рахунка, обидва її фіксують, обидва виводять її у друкованій пропозиції та на порталі клієнта, та відправляють знижку керівникові на погодження.

Чотири речі, у яких згенерований модуль пішов далі

Керівник може сказати «ні». Обидва модулі дають керівникові погодити замовлення. Відхилити його й повернути пропозицію на доопрацювання дає лише наш. А відмова — це нормальний результат погодження, а не рідкісний виняток. Без кнопки «Відхилити» в нього є лише два варіанти: погодити знижку, яку він вважає завеликою, або лишити замовлення "висіти" без жодних дій.

Погодження неможливо обійти. Сховати від людини кнопку — не те саме, що її зупинити. У згенерованому модулі погодження перевіряється в самій системі, а не лише на екрані, і дійти до підтвердження замовлення можна тільки через стан «Очікує погодження». Тобто погодження завжди лишає слід, а не зникає непомітно.

Тут варто сказати прямо, бо нам знадобилося дві спроби. Спершу ми побачили, що кнопки не захищені, і виправили це. Потім зовнішня перевірка чернетки знайшла другий шлях в обхід перевірки, якого ми не помітили зовсім, — і його ми теж закрили. Обидва виправлення пройшли через функцію «Покращити» в платформі: ми описували, що має змінитися, а не правили код руками. І обидва тепер покриті тестами, які впадуть при прогоні, якщо правило перестане діяти.

Заголовки розділів — не товар. Реальні комерційні пропозиції структуровані: наприклад, спершу Обладнання, потім Послуги. У цих рядках-заголовках немає ціни. Модуль Cybrosys усе одно рахує їх, коли виводить середню знижку, від якої залежить, чи потрібне погодження. Знижка 30% у пропозиції з чотирьох рядків, два з яких — заголовки, перетворюється на середні 15% і непомітно проходить під лімітом у 20% встановленим у системі. Згенерований модуль заголовки не рахує, тож ліміт означає рівно те, що написано.

Що йде в комплекті з кодом. Згенерований модуль постачається з 30 автоматичними тестами, посібником користувача англійською та українською з поясненням, що бачить і що робить кожна роль, і файлами перекладу інтерфейсу для самого модуля. Українська тут не була винятком: мови — це просто галочки (чекбокси) на етапі налаштування генерації, і все, що ви позначите, повертається і як посібник, і як файли перекладу модуля. Англійська — базова, ще 19 мов на вибір. Модуль Cybrosys має файл нотаток до релізу на 324 байти, жодного перекладу й жодного тесту.

Останній пункт — не про техніку. Він про те, кому пояснювати відділу продажів, як цим функціоналом користуватися.

Що є в Cybrosys і чого немає в нас

Їхній модуль завантажили понад 21 000 разів і провели крізь десять років релізів Odoo — від Odoo 8 до Odoo 19. Кількість завантажень не дорівнює кількості реальних впроваджень. Проте багаторічна присутність модуля в екосистемі Odoo означає значно ширший контакт із різними конфігураціями та сценаріями, ніж може забезпечити тестове середовище. А підтримувати сумісність від Odoo 8 до Odoo 19 — окрема складна робота.

Але в такої довгої історії є і зворотний бік, і ми його побачили, коли розбирали їхній код. Їхній модуль додає колонку зі знижкою до звіту з продажів Odoo — того самого звіту, у якому Odoo тепер має цю колонку нативно. Та частина, що будує їхню версію, чіпляється до механізму, якого в 19-й версії більше не існує, тож в Odoo 19 її ніщо не викликає. Спрацьовує з нього тільки одне — стара назва колонки, і вона перекриває назву, яку дав Odoo в новій версії. Замість «Знижка, %» користувач бачить «Знижка», а підказка до неї повідомляє, що це сума в грошах. Насправді там відсоток.

Це не докір тим, хто його писав: так десять років оновлень діють на будь-який модуль, і ні в кого немає часу перевіряти десятиліття файлів під кожен новий реліз Odoo. Модуль, згенерований під сьогоднішній Odoo, стартує з того, що сама платформа вміє зараз.

Чого це не доводить

  • Ми не можемо показати вам зелений прогін тестів. Модуль має 30 тестових методів, написаних платформою, і кожен із них можна прочитати. Але його власний запис про генерацію п'яту версію поспіль стверджує «13 із 13 тестів пройдено». Це застаріле число, і ми не видаватимемо його за результат.
  • Один модуль, одна задача. Це чітко окреслений процес у продажах. Він нічого не говорить про важку бухгалтерську логіку чи інтеграцію із зовнішньою системою.
  • Згенерований код усе одно потребує перевірки людиною перед продакшеном. Ми знайшли реальну ваду у власному модулі, поки писали цей текст, — кращого аргументу на користь цього правила годі й шукати.

І одна річ, якої ми не очікували

Поки готували це порівняння, нам здалося, що ми знайшли ще одне, що є в Cybrosys і чого немає в нас: та сама колонка зі знижкою у звіті з продажів.

Ми попросили OdoMate її додати, але він цього не зробив. Наступна версія прийшла без колонки — і з поясненням причини всередині: тестом і поміткою, що це стандартна функціональність Odoo. Оскільки такий звіт в Odoo уже є, то згенерована його копія означала б код, який комусь доведеться тягнути крізь кожне майбутнє оновлення Odoo, без жодної користі.

Ми очікували, що платформа збудує все, що їй скажуть. Виявити, що вона цього не робить — і що вона мала рацію, — стало найцікавішим з усього, що дала ця вправа. І про це наш наступний допис https://www.odomate.pro/uk/blog/odoo-module-generator-skipped-the-feature.

Спробуйте на власній задачі

Прочитайте специфікацію й отриманий із неї модуль поруч або попереднє порівняння з модулем чеклістів для проєктів.

А далі приходьте зі своєю вимогою. Подивіться модуль і подайте заявку на ранній бета-доступ — ми розглядаємо заявки поступово й підключаємо невеликими групами.

FAQ

Що насправді додає модуль знижок для Odoo 19? Здебільшого — контроль. Погодження великих знижок керівником, причому не тільки погодження, а й відхилення: замовлення повертається на доопрацювання, і в стандартному Odoo такого механізму немає взагалі. Такий самий інструмент для рахунків. І єдину цифру знижки, яка йде через замовлення, рахунок і друковані документи. Саму знижку на все замовлення Odoo 19 і застосовує, і записує, і показує у звіті з продажів — без жодних модулів.

Чи може згенерований ШІ модуль Odoo зрівнятися з модулем від усталеного вендора? На цій задачі — так. За всіма можливостями, які ми тут порівнювали, згенерований модуль зрівнявся з модулем на 21 000 завантажень. І пішов далі у чотирьох: відхилення, а не лише погодження; погодження, яке неможливо обійти; коректна робота із заголовками розділів; тести, документація й переклади в комплекті з кодом.

Чи правили згенерований модуль руками перед публікацією? Ні. Його згенеровано з письмової специфікації, автоматично розгорнуто й протестовано, перевірено на безпеку та опубліковано. Руками потім додали лише сторінку в Apps Store, банер і скриншоти.

Чи йде із згенерованим модулем документація? Так. Посібник користувача пишеться всіма мовами, які ви позначили на етапі налаштування генерації — цей вийшов англійською та українською, — а разом із ним ідуть файли перекладу інтерфейсу для самого модуля.

Як це все перевірити самостійно? Обидва модулі безкоштовні та з відкритим кодом. Їхні сторінки є в Odoo Apps Store, а повний код згенерованого модуля разом зі специфікацією, з якої він постав, лежить у публічному репозиторії — посилання вище.