Skip to Content

Odoo 19 Community: produktové sety v ponuke ako sekcia – náš open-source modul Sale Product Set Layout

2. novembra 2026 | Odoo 19 Community | Vlastný vývoj
2. novembra 2026 pomocou
Odoo 19 Community: produktové sety v ponuke ako sekcia – náš open-source modul Sale Product Set Layout

Modul Odoo 19 Sale Product Set Layout: produktové sety ako sekcia v ponuke s režimom tlače, skrytými riadkami a pevnou cenou

Kto v Odoo predáva balíky, napríklad merací prístroj s príslušenstvom a montážou, pracovisko s hardvérom a zriadením alebo servisný balík z viacerých služieb, potrebuje v ponuke dve veci naraz: Zloženie musí byť uvedené v objednávke, aby sklad, technika a fakturácia vedeli, čo sa dodáva. Na výtlačku pre zákazníka však nemá vždy figurovať každá jednotlivá položka s každou jednotkovou cenou.

Modul OCA sale_product_set umožňuje jedným kliknutím vložiť do ponuky produktové sety (kusovníky pre predaj). O vzhľade tlače však nerozhoduje. Preto sme vyvinuli modul Sale Product Set Layout (sale_product_set_layout). Je napísaný pre Odoo 19 a ako slobodný softvér pod licenciou AGPL-3 je bezplatne dostupný na GitHube:

github.com/Alex0176/odoo-sale-product-set-layout

Problém: produktové sety bez vplyvu na vzhľad tlače

Produktový set je v Odoo pripravený zoznam produktov s množstvami. Namiesto hľadania desiatich artiklov jednotlivo sa v ponuke zvolí Pridať set a všetky riadky sa objavia naraz. To šetrí čas a bráni zabudnutým položkám. Modul sale_product_set z repozitára OCA/sale-workflow robí presne toto; samotné sety pochádzajú z product_set v repozitári OCA/product-attribute.

V praxi zostávajú tri medzery:

  • Žiadne rozpoznateľné zoskupenie. Riadky setu skončia v ponuke ako voľné položky. Po vložení už nie je vidieť, ktoré riadky patria k sebe, a celkový súčet setu nie je nikde uvedený.
  • Žiadny vplyv na výtlačok. Raz má zákazník vidieť každú položku s cenou, inokedy len cenu balíka, inokedy len jediný riadok. Je to rozhodnutie pre každý set alebo každého zákazníka, nie pre každú ponuku znova ručne.
  • Cenové korekcie sú nepekné. Ak má mať balík pevnú cenu, ktorá sa odlišuje od súčtu cenníkových cien, potrebuje sa korekčný riadok. Patrí do výpočtu, ale nie nevyhnutne na papier zákazníka.

Odoo 19 prináša stavebné prvky na čisté vyriešenie: sekcie a podsekcie v riadkoch ponuky s voľbami Skryť ceny a Skryť zloženie (polia collapse_prices a collapse_composition). Modul prepája produktový set s týmito štandardnými voľbami namiesto vymýšľania vlastného formátu tlače.

Čo modul robí

  1. Vloženie setu ako sekcie. Asistent Pridať set vytvorí riadok sekcie s názvom setu, napríklad 2 × Štandardná meracia súprava, a riadky setu umiestni pod ňu. Sekcie v rámci setu sa stanú podsekciami.
  2. Režim tlače pre každý set. V sete sa raz určí, ako sa má tlačiť. Pri vkladaní sa dá režim v asistentovi pre daný jednotlivý prípad zmeniť.
  3. Skrývanie riadkov. Jednotlivé riadky možno označiť ako Netlačiť (pri sete: Skryté). Do súčtu sa započítavajú, ale nie sú vytlačené ani zobrazené v zákazníckom portáli. Príznak sa z ponuky prenáša na faktúru.
  4. Pevná cena pre riadok setu. Riadok setu môže mať pevnú jednotkovú cenu, ktorá nahrádza cenu z cenníka, napríklad pre skrytú cenovú korekciu.
Bez modulu (iba sale_product_set)S sale_product_set_layout
Riadky setu ako voľné položkyRiadok sekcie s názvom setu, množstvom v názve a riadkami pod ním
Sekcie v sete zostanú sekciami a narúšajú štruktúruSekcie v sete sa stanú podsekciami (line_subsection)
Vzhľad tlače vždy rovnakýRežim tlače pre každý set, pri vkladaní zmeniteľný
Cenová korekcia viditeľná na ponuke a faktúreRiadok možno skryť, no započítava sa do súčtu
Cena iba z cenníkaVoliteľne pevná cena pre riadok setu
Rozloženie končí pri ponukeRozloženie a skrývanie platia pre ponuku, objednávku, faktúru a zákaznícky portál

Tri režimy tlače podrobne

Režim tlače je výberové pole print_mode v produktovom sete. Pri vkladaní sa premieta do dvoch štandardných prepínačov riadka sekcie. V module na to slúži jediné, ľahko čitateľné priradenie:

# Druckmodus -> (collapse_prices, collapse_composition) der Abschnittszeile
PRINT_MODE_FLAGS = {
    "detailed":   (False, False),
    "total_only": (True,  False),
    "summary":    (False, True),
}

Tri vzhľady tlače toho istého produktového setu: každý riadok s cenou, iba celková cena, jediný riadok

Režim (print_mode)Zobrazenie v seteŠtandardná voľba v OdooVzhľad tlače
detailedKaždý riadok s cenoužiadneSekcia, všetky riadky so sumou
total_onlyRiadky bez cien, iba súčet setucollapse_prices (Skryť ceny)Sekcia so súčtom, riadky iba s označením a množstvom
summaryIba jeden riadok so súčtom setucollapse_composition (Skryť zloženie)Iba riadok sekcie so súčtom

Pretože modul používa štandardné voľby Odoo 19 a nie vlastný formát tlače, fungujú ponuka, potvrdenie objednávky, faktúra aj zákaznícky portál bez upravených šablón zostáv. Kto má vlastné šablóny zostáv, ktoré zohľadňujú voľby sekcií, získa rovnaké správanie.

Skryté riadky a pevná cena

Častý prípad: balík má cenu balíka, ktorá je nižšia než súčet jednotkových cien. Namiesto prekrúcania jednotkových cien sa použije korekčný riadok s pevnou cenou (napríklad −50,00 € na set), ktorý sa skryje. V backende je faktúra dohľadateľná, na výtlačku je uvedená cena balíka.

Cenová korekcia je v backende viditeľná a označená, vo výtlačku ponuky, PDF, faktúry a portálu nie je viditeľná, súčet je rovnaký

Dôležité pre pochopenie: príznak hide_in_report nemení nič na výpočte. Množstvo, cena, zľava, daň, súčty a účtovné zápisy vznikajú nezmenene štandardným Odoo. Riadok chýba iba vo výtlačku a v portáli.

  • V produktovom sete: riadok setu s Skryté a voliteľne Pevná cena spolu s Jednotková cena.
  • V riadkoch ponuky a faktúry: stĺpec Netlačiť (hide_in_report), aj pre bežné riadky bez setu.
  • Prenos: Pri vytváraní faktúry z objednávky sa príznak prenesie na riadok faktúry. Pri kopírovaní ponuky zostane zachovaný.

Technická realizácia

Modul je zámerne malý: rozširuje existujúce modely a prepisuje iba miesta, kde Odoo rozhoduje, ktoré riadky sa tlačia a ako sa set vkladá. Nie sú tu žiadne nové šablóny zostáv, žiadne nové modely ani zásahy do SQL.

Tok dát: produktový set, asistent Pridať set, riadky ponuky, riadky faktúry, PDF a zákaznícky portál

Rozšírené modely a polia

ModelDoplnok
product.setPolia insert_as_section (boolean, štandardne zapnuté) a print_mode (výber, povinné pole, štandardne detailed)
product.set.linePolia hide_in_report, fixed_price, price_unit; prepare_sale_order_line_values() ich odovzdá riadku ponuky
sale.product.set.wizardPolia insert_as_section, section_name, print_mode; _prepare_order_lines() zostaví riadok sekcie
sale.order / sale.order.linePole hide_in_report (s copy=True); _get_order_lines_to_report() preskakuje skryté riadky; _prepare_invoice_line() odovzdáva príznak ďalej
account.move / account.move.linePole hide_in_report; _get_move_lines_to_report(), _get_detailed_lines() a _get_subsection_lines() filtrujú skryté riadky; _get_aml_vals() prenáša príznak do údajov zostavy

Skrývanie v ponuke

Odoo 19 zisťuje riadky ponuky na tlač v _get_order_lines_to_report(). Modul tam pripojí filter. Zásah do šablóny zostavy nie je potrebný: šablóna zostavy ponuky (sale/report/ir_actions_report_templates.xml) aj šablóna portálu (sale/views/sale_portal_templates.xml) túto metódu volajú:

class SaleOrder(models.Model):
    _inherit = "sale.order"

    def _get_order_lines_to_report(self):
        return super()._get_order_lines_to_report().filtered(
            lambda line: not line.hide_in_report
        )

Prenos na faktúru

Pri vytváraní riadka faktúry z riadka ponuky (_prepare_invoice_line()) sa príznak skopíruje. Na strane faktúry existuje v Odoo 19 viacero ciest, ktorými sa riadky dostávajú do zostavy: hlavný zoznam, riadky sekcie a riadky podsekcie. Preto modul filtruje na viacerých miestach (_get_move_lines_to_report() pri doklade, _get_detailed_lines() a _get_subsection_lines() pri riadku), inak by sa skrytý riadok mohol cez jednu z ostatných ciest opäť objaviť:

class AccountMoveLine(models.Model):
    _inherit = "account.move.line"

    hide_in_report = fields.Boolean(string="Hidden in report")

    def _get_aml_vals(self, hide_taxes):
        res = super()._get_aml_vals(hide_taxes)
        res["hide_in_report"] = self.hide_in_report
        return res

    def _get_detailed_lines(self, children_lines, direct_children_lines, subsection_lines):
        res = super()._get_detailed_lines(children_lines, direct_children_lines, subsection_lines)
        return [vals for vals in res if not vals.get("hide_in_report")]

    def _get_subsection_lines(self, subsection_line, children_lines):
        res = super()._get_subsection_lines(subsection_line, children_lines)
        return [vals for vals in res if not vals.get("hide_in_report")]

Asistent: sekcia namiesto voľných riadkov

Asistent sale.product.set.wizard z sale_product_set vytvára riadky ponuky v _prepare_order_lines(). Modul túto metódu prepisuje. Ak je Vložiť ako sekciu vypnuté, jednoducho zavolá pôvodnú metódu, správanie zostane ako v module OCA. Inak vznikne najprv riadok sekcie s dvoma štandardnými prepínačmi, potom nasledujú riadky setu. Sekcie v rámci setu sa stanú podsekciami, aby nenarúšali hlavnú štruktúru:

def _prepare_order_lines(self):
    if not self.insert_as_section:
        return super()._prepare_order_lines()
    sequence = self._get_max_sequence() + 1
    collapse_prices, collapse_composition = PRINT_MODE_FLAGS[self.print_mode or "detailed"]
    order_lines = [Command.create({
        "display_type": "line_section",
        "name": self.section_name or self.product_set_id.name,
        "sequence": sequence,
        "collapse_prices": collapse_prices,
        "collapse_composition": collapse_composition,
    })]
    for set_line in self._get_lines():
        sequence += 1
        values = set_line.prepare_sale_order_line_values(self.order_id, self.quantity, sequence)
        if values.get("display_type") == "line_section":
            values["display_type"] = "line_subsection"
        order_lines.append(Command.create(values))
    return order_lines

Rozhodnutia, ktoré nie sú vidieť

  • Oddelené výpočtové metódy v asistentovi. Názov sekcie, režim tlače a Vložiť ako sekciu majú každý vlastnú metódu compute (store=True, readonly=False). Keby mali všetky tri tú istú metódu, explicitne odovzdaná hodnota jedného poľa by resetovala ostatné. Najviac to vyniká, keď sa asistent vytvára z kódu alebo testov s hodnotami.
  • Názov sekcie s množstvom. Pri množstve rôznom od 1 je uvedené v názve (2 × Štandardná meracia súprava, s čiarkou ako desatinným oddeľovačom), aby bolo vo výtlačku zrejmé, že ide o dva sety a nie o jeden set s dvojnásobným množstvom.
  • Pevná cena iba pri produktových riadkoch. prepare_sale_order_line_values() nastaví hide_in_report a price_unit iba vtedy, ak riadok setu nie je riadkom sekcie ani poznámky.
  • Štandardné Odoo namiesto vlastného riešenia. Režim tlače a skrývanie využívajú existujúce hooky a polia Odoo 19. Vďaka tomu sú aktualizácie zvládnuteľné: ak Odoo zmení šablónu zostavy, modul zostane platný, pokiaľ metódy existujú.

Inštalácia bez nežiaducich vedľajších účinkov

Predpoklady: Odoo 19.0, sale_product_set (OCA/sale-workflow, vetva 19.0) a product_set (OCA/product-attribute, vetva 19.0). Samotný modul závisí od sale_management, sale_product_set a account.

Pasca auto_install pri moduloch OCA. Mnohé repozitáre OCA obsahujú moduly s auto_install. Hneď ako sú dostupné ich závislosti, Odoo ich pri ďalšej inštalácii alebo aktualizácii nainštaluje bez opýtania. Kto preto vloží kompletný repozitár OCA do addons_path produkčnej inštancie, môže dostať moduly, ktoré nikto nechcel. Pri OCA/product-attribute sa to týka napríklad purchase_product_template_tags. Náš postup:

  1. Oba repozitáre OCA naklonovať plytko (git clone --depth 1 --branch 19.0).
  2. Vo vlastnom adresári prepojiť symlinkom iba dva potrebné moduly a tento adresár pridať do addons_path, nie celé repozitáre.
  3. Nainštalovať na testovaciu databázu a skontrolovať, ktoré moduly pritom získajú stav nainštalované.
  4. Až potom inštalovať produktívne, s --workers=0, aby volanie nesúperilo s bežiacou službou o port HTTP.
odoo-bin -c /etc/odoo/odoo.conf -d <datenbank> -i sale_product_set_layout --stop-after-init

Nové polia a zobrazenia sú po inštalácii v databáze. Ak služba beží vo viacprocesovom režime, workery si zmenený register dotiahnu cez signál databázy. Zmeny v súboroch Python modulu sa prejavia až po reštarte služby.

Obsluha krok za krokom

  1. Vytvorenie setu: Predaj → Produkty → Produktové sety. Set pomenovať, zvoliť Vložiť ako sekciu a Režim tlače, zadať produkty s množstvami. Korekčné riadky označiť Skryté a Pevná cena.
  2. V ponuke: Kliknúť na Pridať set, zvoliť set a množstvo. Názov sekcie a režim tlače možno pred vložením zmeniť.
  3. Skrytie jednotlivých riadkov: V ponuke alebo vo faktúre aktivovať stĺpec Netlačiť.
  4. Kontrola: Otvoriť náhľad alebo PDF. To isté zobrazenie vidia zákazníci v portáli.

Testy

Modul obsahuje šesť automatizovaných testov, ktoré spúšťame proti testovacej databáze skôr, než čokoľvek pôjde do produkcie:

  • Vloženie ako sekcia vrátane režimu tlače a podsekcie
  • Skrytý riadok chýba medzi riadkami na tlač
  • Režim Jeden riadok (summary)
  • Vloženie bez sekcie, pôvodné správanie
  • Faktúra preberie príznak hide_in_report, riadok chýba v _get_move_lines_to_report(), súčet sekcie ho naďalej obsahuje
  • Faktúra v režime Iba celková cena nezobrazuje skrytý riadok v riadkoch sekcie, súčet sekcie zostáva úplný
odoo-bin -d <testdatenbank> -i sale_product_set_layout \
         --test-enable --test-tags=/sale_product_set_layout --stop-after-init

Nemecký preklad sa nachádza v i18n/de.po.

Obmedzenia a právne upozornenie

  • Iba rozloženie. Modul nemení, ako Odoo počíta ceny, zľavy alebo dane. Mení iba to, čo sa tlačí a zobrazuje v portáli.
  • Skryté riadky sú v backende viditeľné. Príznak sa týka výtlačku a portálu, nie zobrazenia na obrazovke zamestnancov.
  • Skontrolujte náležitosti faktúr. Skryté riadky sa započítavajú do súčtu, ale nie sú uvedené na doklade. Či je to zlučiteľné s požiadavkami na faktúry vo vašej krajine, napríklad s predpísaným popisom dodaných tovarov alebo poskytnutých služieb, by ste mali pred nasadením na faktúrach objasniť so svojím daňovým poradcom. Pri ponukách je skrývanie menej problematické. Článok nie je právnym poradenstvom.
  • Testované pre Odoo 19. Modul sme vyvinuli a testovali pre Odoo 19.0 Community. Využíva voľby sekcií, ktoré sú v tejto podobe prítomné v Odoo 19. Pre iné verzie sme ho nepreverovali.

Časté otázky

Na čo potrebujem modul, ak Odoo 19 už sekcie ovláda?

Voľby sekcií existujú v samotnom Odoo. Chýbalo prepojenie s produktovým setom: set sa mal vkladať automaticky ako sekcia s režimom tlače uloženým v sete. Bez modulu treba po každom vložení riadok sekcie ručne vytvoriť a nastaviť.

Ako sa líšia „Skryť ceny“ a „Skryť zloženie“?

„Skryť ceny“ (collapse_prices) nechá riadky na mieste, ale nezobrazuje sumy, iba súčet pri sekcii. „Skryť zloženie“ (collapse_composition) riadky úplne skryje, zákazník vidí iba sekciu so súčtom.

Započítava sa skrytý riadok do súčtu faktúry?

Áno. Skryté riadky zostávajú v súčte, dani a účtovaní. Príznak sa týka iba zobrazenia na výtlačku a v zákazníckom portáli.

Môžem režim tlače pri vkladaní ešte zmeniť?

Áno. Režim sa preberá ako predvolená hodnota zo setu, v asistentovi ho možno pre dané vloženie zmeniť. Samotný set pritom zostane nezmenený.

Čo sa stane, ak vypnem Vložiť ako sekciu?

Potom sa asistent správa ako v module OCA sale_product_set: riadky setu sa vložia bez sekcie.

Nainštaluje modul neočakávane ďalšie moduly?

Samotný modul nie. Pri repozitároch OCA však môže dôjsť k modulom s auto_install, ak sa do addons_path vložia celé repozitáre. Prepojte preto iba dva potrebné moduly (pozri časť Inštalácia).

Funguje modul s Odoo Enterprise?

Modul závisí iba od modulov Community (sale_management, account) a od dvoch modulov OCA. Nasadzujeme ho na Odoo 19 Community. Na Enterprise sme ho netestovali.

Pod akou licenciou je modul?

Pod AGPL-3. Môžete ho používať, upravovať a šíriť, pokiaľ zmeny zostanú pod rovnakou licenciou. Chyby a návrhy na zlepšenie sú vítané ako issue v repozitári GitHub .

Podpora od Biricon IT Services

Spravujeme inštalácie Odoo pre malé a stredné podniky: od zavedenia cez úpravy a migrácie až po bežnú prevádzku. Ak chcete produktové sety, šablóny ponúk alebo zostavy v Odoo 19 prispôsobiť svojim postupom, alebo ak chcete modul ako tento preveriť a bezpečne dostať do svojej produkčnej inštancie, radi vás podporíme. Ďalšie vlastné vývoje nájdete v našom blogu, napríklad Zlučovanie návrhov faktúr a Automatické priraďovanie bankových platieb k faktúram.

Kontaktujte nás

Stav k 2. novembru 2026. Verzia modulu 19.0.1.0.0. Vzorové údaje na obrázkoch sú zvolené voľne, sumy netto.