Skip to Content

Odoo 19 Community: tootekomplektid pakkumisel jaotisena – meie avatud lähtekoodiga moodul Sale Product Set Layout

2. november 2026 | Odoo 19 Community | Omaarendus
2. november 2026 by
Odoo 19 Community: tootekomplektid pakkumisel jaotisena – meie avatud lähtekoodiga moodul Sale Product Set Layout

Odoo 19 moodul Sale Product Set Layout: tootekomplektid pakkumises jaotisena koos printimisrežiimi, peidetud ridade ja fikseeritud hinnaga

Kui müüte Odoos pakette, näiteks mõõteseadet koos tarvikute ja paigaldusega, töökohta koos riistvara ja seadistusega või mitmest teenusest koosnevat hoolduspaketti, vajate pakkumises korraga kahte asja: tellimus peab sisaldama paketi koosseisu, et ladu, tehnikud ja arveldajad teaksid, mida tarnitakse. Kliendile mõeldud väljatrükil ei pea aga alati olema näha iga üksik rida koos selle hinnaga.

OCA moodul sale_product_set võimaldab lisada tootekomplekte (müügiks mõeldud tootenimekirju) pakkumisse ühe klõpsuga. Väljatrüki kujundust see ei määra. Selleks oleme loonud mooduli Sale Product Set Layout (sale_product_set_layout). See on kirjutatud Odoo 19 jaoks ja on GitHubis tasuta saadaval vaba tarkvarana AGPL-3 litsentsi alusel:

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

Probleem: tootekomplektid ilma võimaluseta väljatrükki mõjutada

Tootekomplekt on Odoos eelnevalt koostatud toodete ja koguste loend. Kümne toote ükshaaval otsimise asemel valite pakkumises Lisa komplekt ja kõik read lisatakse korraga. See säästab aega ning aitab vältida ridade unustamist. Moodul sale_product_set hoidlast OCA/sale-workflow teebki just seda; komplektid ise pärinevad moodulist product_set hoidlas OCA/product-attribute.

Praktikas jääb lahendamata kolm probleemi:

  • Puudub selge rühmitus. Komplekti read lisatakse pakkumisse eraldiseisvate ridadena. Pärast lisamist pole enam näha, millised read kuuluvad kokku, ning komplekti kogusummat ei kuvata kusagil.
  • Väljatrükki ei saa mõjutada. Mõnikord peab klient nägema iga rida koos hinnaga, mõnikord ainult paketi hinda ja mõnikord vaid ühte rida. Seda peaks saama määrata komplekti või kliendi kaupa, ilma et iga pakkumist tuleks käsitsi uuesti kohandada.
  • Hinnaparandused pole ilusad. Kui paketil peab olema fikseeritud hind, mis erineb hinnakirjahindade summast, on vaja parandusrida. See peab osalema arvutuses, kuid ei pea tingimata olema kliendi väljatrükil.

Odoo 19 sisaldab vahendeid selle mugavaks lahendamiseks: pakkumiseridade jaotised ja alajaotised valikutega Peida hinnad ja Peida koosseis (väljad collapse_prices ja collapse_composition). Moodul seob tootekomplekti nende standardvalikutega, selle asemel et luua eraldi prindivorming.

Mida moodul teeb

  1. Komplekti lisamine jaotisena. Nõustaja Lisa komplekt loob komplekti nimega jaotiserea, näiteks 2 × Messkit Standard, ning lisab selle alla komplekti read. Komplektis olevad jaotised muudetakse alajaotisteks.
  2. Printimisrežiim iga komplekti jaoks. Komplekti juures määratakse üks kord, kuidas seda prinditakse. Lisamisel saab nõustajas režiimi selle konkreetse juhu jaoks muuta.
  3. Ridade peitmine. Üksikutele ridadele saab määrata valiku Ära prindi (komplekti juures: Peidetud). Need arvestatakse kogusumma sisse, kuid neid ei prindita ega kuvata kliendiportaalis. Märge kandub pakkumiselt arvele.
  4. Fikseeritud hind komplekti iga rea jaoks. Komplekti reale saab määrata fikseeritud ühikuhinna, mis asendab hinnakirja hinna, näiteks peidetud hinnaparanduse jaoks.
Ilma moodulita (ainult sale_product_set)Mooduliga sale_product_set_layout
Komplekti read eraldiseisvate pakkumiseridadenaJaotiserida komplekti nimega, kogus nimes, komplekti read selle all
Komplektis olevad jaotised jäävad jaotisteks ja lõhuvad struktuuriKomplekti jaotistest saavad alamjaotised (line_subsection)
Väljatrüki kujundus on alati samaIgal komplektil oma printimisrežiim, mida saab lisamisel muuta
Hinnakorrektsioon on pakkumisel ja arvel nähtavRea saab peita, kuid see arvestatakse kogusumma sisse
Hind ainult hinnakirjastSoovi korral fikseeritud hind igale komplektireale
Kujundus kehtib ainult pakkumiselKujundus ja peitmine kehtivad pakkumisel, tellimusel, arvel ja kliendiportaalis

Kolm printimisrežiimi lähemalt

Printimisrežiim määratakse tootekomplekti valikuväljal print_mode. Komplekti lisamisel teisendatakse see jaotiserea kahe standardse lüliti väärtusteks. Moodulis kasutatakse selleks üht lihtsat ja loetavat vastendust:

# Printimisrežiim -> jaotiserea (collapse_prices, collapse_composition)
PRINT_MODE_FLAGS = {
    "detailed":   (False, False),
    "total_only": (True,  False),
    "summary":    (False, True),
}

Sama tootekomplekti kolm väljatrükivarianti: iga rida koos hinnaga, ainult koguhind, üksainus rida

Režiim (print_mode)Kuva komplektisOdoo standardvalikVäljatrüki kujundus
detailedIga rida koos hinnagapuudubJaotis, kõik read koos summaga
total_onlyRead ilma hindadeta, ainult komplekti kogusummacollapse_prices (Peida hinnad)Jaotis koos kogusummaga, ridadel ainult nimetus ja kogus
summaryAinult üks rida komplekti kogusummagacollapse_composition (Peida koosseis)Ainult jaotiserida koos kogusummaga

Kuna moodul kasutab Odoo 19 standardvalikuid ega kasuta oma printimisvormingut, toimivad pakkumine, tellimuse kinnitus, arve ja kliendiportaal ilma kohandatud aruandemallideta. Sama toimib ka oma aruandemallidega, kui need arvestavad jaotiste valikutega.

Peidetud read ja fikseeritud hind

Levinud olukord: paketi hind on madalam kui üksikhindade summa. Üksikhindade muutmise asemel lisatakse fikseeritud hinnaga korrigeerimisrida (näiteks −50,00 € komplekti kohta) ja peidetakse see. Haldusvaates on arvutuskäik jälgitav, väljatrükil kuvatakse paketi hind.

Hinnakorrektsioon on haldusvaates nähtav ja märgistatud, kuid pakkumise väljatrükil, PDF-is, arvel ja portaalis peidetud; kogusumma on sama

Oluline on mõista: märge hide_in_report ei muuda arvutusi. Koguse, hinna, allahindluse, maksu, summad ja raamatupidamiskanded arvutab endiselt Odoo tavapärane loogika. Rida jäetakse välja ainult väljatrükilt ja portaalist.

  • Tootekomplektil: komplektirida märkega Peidetud ning soovi korral valikuga Fikseeritud hind ja väljaga Ühikuhind.
  • Pakkumise- ja arveridadel: veerg Ära prindi (hide_in_report), ka tavalistele ridadele, mis ei kuulu komplekti.
  • Edasikandmine: tellimusest arve loomisel kantakse märge arvereale üle. Pakkumise kopeerimisel jääb see alles.

Tehniline teostus

Moodul on teadlikult väike: see laiendab olemasolevaid mudeleid ja kirjutab üle ainult need kohad, kus Odoo otsustab, millised read prinditakse ja kuidas komplekt lisatakse. Uusi aruandemalle ega mudeleid ei lisata ning SQL-i tasandil muudatusi ei tehta.

Andmevoog: tootekomplekt, komplekti lisamise viisard, pakkumiseread, arveread, PDF ja kliendiportaal

Laiendatud mudelid ja väljad

MudelTäiendus
product.setVäljad insert_as_section (tõeväärtus, vaikimisi sisse lülitatud) ja print_mode (valik, kohustuslik väli, vaikeväärtus detailed)
product.set.lineVäljad hide_in_report, fixed_price, price_unit; prepare_sale_order_line_values() edastab need pakkumisereale
sale.product.set.wizardVäljad insert_as_section, section_name, print_mode; _prepare_order_lines() loob jaotiserea
sale.order / sale.order.lineVäli hide_in_report (seadega copy=True); _get_order_lines_to_report() jätab peidetud read vahele; _prepare_invoice_line() edastab märke
account.move / account.move.lineVäli hide_in_report; _get_move_lines_to_report(), _get_detailed_lines() ja _get_subsection_lines() filtreerivad peidetud read välja; _get_aml_vals() lisab märke aruandeandmetesse

Ridade peitmine pakkumisel

Odoo 19 määrab prinditavad pakkumiseread meetodis _get_order_lines_to_report(). Moodul lisab sinna filtri. Aruandemalli pole vaja muuta: seda meetodit kutsuvad välja nii pakkumise aruandemall (sale/report/ir_actions_report_templates.xml) kui ka portaalimall (sale/views/sale_portal_templates.xml):

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
        )

Märke edasikandmine arvele

Pakkumisereast arverea loomisel (_prepare_invoice_line()) kopeeritakse ka märge. Odoo 19 arvete puhul jõuavad read aruandesse mitut teed pidi: põhiloendi, jaotise ridade ja alamjaotise ridade kaudu. Seetõttu filtreerib moodul mitmes kohas (dokumendi meetodis _get_move_lines_to_report() ning rea meetodites _get_detailed_lines() ja _get_subsection_lines()), sest muidu võiks peidetud rida mõne teise tee kaudu uuesti nähtavale ilmuda:

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")]

Viisard: eraldiseisvate ridade asemel jaotis

Mooduli sale_product_set viisard sale.product.set.wizard loob pakkumiseread meetodis _prepare_order_lines(). Meie moodul kirjutab selle meetodi üle. Kui Lisa jaotisena on välja lülitatud, kutsutakse lihtsalt välja algne meetod ning käitumine jääb samaks nagu OCA moodulis. Vastasel juhul luuakse esmalt kahe standardse lülitiga jaotiserida ja seejärel komplektiread. Komplekti sees olevatest jaotistest saavad alamjaotised, et need ei lõhuks põhistruktuuri:

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

Otsused, mis kasutajale välja ei paista

  • Viisardi eraldi arvutusmeetodid. Jaotise nimel, printimisrežiimil ja valikul Lisa jaotisena on igaühel oma compute-meetod (store=True, readonly=False). Kui kõigil kolmel oleks sama meetod, lähtestaks ühe välja jaoks otseselt antud väärtus ülejäänud väljad. See ilmneb eelkõige siis, kui viisard luuakse koos väärtustega koodi või testide kaudu.
  • Jaotise nimi koos kogusega. Kui kogus ei ole 1, lisatakse see nimele (2 × Messkit Standard, kümnendkoha eraldajaks koma), et väljatrükilt oleks näha: tegemist on kahe komplektiga, mitte ühe komplektiga, mille kogused on kahekordsed.
  • Fikseeritud hind ainult tooteridadel. prepare_sale_order_line_values() määrab väljad hide_in_report ja price_unit ainult siis, kui komplektirida ei ole jaotise- ega märkuserida.
  • Odoo standardlahendus oma lahenduse asemel. Printimisrežiim ja peitmine kasutavad Odoo 19 olemasolevaid laienduspunkte ja välju. Nii on uuendusi lihtsam hallata: kui Odoo muudab aruandemalli, töötab moodul edasi seni, kuni meetodid säilivad.

Paigaldamine soovimatute kõrvalmõjudeta

Eeldused: Odoo 19.0, sale_product_set (OCA/sale-workflow, haru 19.0) ja product_set (OCA/product-attribute, haru 19.0). Moodul ise sõltub moodulitest sale_management, sale_product_set ja account.

OCA moodulite auto_install-lõks. Paljud OCA hoidlad sisaldavad mooduleid, millel on määratud auto_install. Niipea kui nende sõltuvused on olemas, paigaldab Odoo need järgmise paigaldamise või uuendamise käigus küsimata kaasa. Kui lisada terve OCA hoidla tootmiskeskkonna addons_path-i, võib tulemuseks olla hulk mooduleid, mida keegi ei soovinud. Hoidlas OCA/product-attribute puudutab see näiteks moodulit purchase_product_template_tags. Meie toimime nii:

  1. Kloonige mõlemad OCA hoidlad piiratud ajalooga (git clone --depth 1 --branch 19.0).
  2. Looge eraldi kataloogi sümbollingid ainult kahele vajalikule moodulile ning lisage addons_path-i see kataloog, mitte terved hoidlad.
  3. Paigaldage moodul testandmebaasi ja kontrollige, millised moodulid saavad selle käigus oleku paigaldatud.
  4. Alles seejärel paigaldage moodul tootmiskeskkonda, kasutades parameetrit --workers=0, et käsk ei konkureeriks töötava teenusega HTTP-pordi pärast.
odoo-bin -c /etc/odoo/odoo.conf -d <datenbank> -i sale_product_set_layout --stop-after-init

Pärast paigaldamist on uued väljad ja vaated andmebaasis olemas. Kui teenus töötab mitme protsessiga, laadivad tööprotsessid muudetud registri andmebaasisignaali alusel uuesti. Mooduli Pythoni failide muudatused jõustuvad alles pärast teenuse taaskäivitamist.

Kasutamine samm-sammult

  1. Komplekti loomine: Müük → Tooted → Tootekomplektid. Andke komplektile nimi, määrake Lisa jaotisena ja Printimisrežiim ning lisage tooted koos kogustega. Korrigeerimisridadel märkige Peidetud ja Fikseeritud hind.
  2. Pakkumisel: klõpsake Lisa komplekt ning valige komplekt ja kogus. Jaotise nime ja printimisrežiimi saab enne lisamist muuta.
  3. Üksikute ridade peitmine: märkige pakkumisel või arvel soovitud rea veerus Ära prindi olev ruut.
  4. Kontrollimine: avage eelvaade või PDF. Kliendid näevad portaalis sama kujundust.

Testid

Mooduliga on kaasas kuus automaattesti, mille käivitame testandmebaasis enne muudatuste tootmiskeskkonda viimist:

  • Lisamine jaotisena koos printimisrežiimi ja alamjaotisega
  • Peidetud rida puudub prinditavate ridade hulgast
  • Režiim Üks rida (summary)
  • Lisamine ilma jaotiseta ehk algne käitumine
  • Arvele kantakse üle märge hide_in_report, rida puudub meetodi _get_move_lines_to_report() tulemusest, kuid arvestatakse endiselt jaotise kogusumma sisse
  • Režiimis Ainult koguhind ei kuvata arve jaotiseridade hulgas peidetud rida, kuid jaotise kogusumma jääb täielikuks
odoo-bin -d <testdatenbank> -i sale_product_set_layout \
         --test-enable --test-tags=/sale_product_set_layout --stop-after-init

Saksakeelne tõlge asub failis i18n/de.po.

Piirangud ja õigusalane märkus

  • Ainult kujundus. Moodul ei muuda seda, kuidas Odoo hindu, allahindlusi või makse arvutab. See muudab ainult seda, mida prinditakse ja portaalis kuvatakse.
  • Peidetud read on haldusvaates nähtavad. Märge mõjutab väljatrükki ja portaali, mitte töötajate ekraanivaadet.
  • Kontrollige arve andmeid. Peidetud read arvestatakse kogusumma sisse, kuid neid dokumendil ei kuvata. Kas see vastab teie riigi arvenõuetele, näiteks kohustuslikule tarnitud kaupade või osutatud teenuste kirjeldusele, tuleks maksunõustajaga selgeks teha enne selle võimaluse kasutamist arvetel. Pakkumistel tekitab ridade peitmine vähem probleeme. See artikkel ei ole õigusnõuanne.
  • Testitud Odoo 19 jaoks. Töötasime mooduli välja ja testisime seda Odoo 19.0 Community jaoks. See kasutab jaotiste valikuid, mis on sellisel kujul olemas Odoo 19-s. Teiste versioonidega pole me seda kontrollinud.

Korduma kippuvad küsimused

Milleks on moodulit vaja, kui Odoo 19 juba toetab jaotisi?

Jaotiste valikud on Odoos endas olemas. Puudu oli seos tootekomplektiga: komplekt peaks lisatama automaatselt jaotisena, kasutades komplektile määratud printimisrežiimi. Ilma moodulita tuleb pärast iga lisamist jaotiserida käsitsi luua ja seadistada.

Mis vahe on valikutel „Peida hinnad“ ja „Peida koosseis“?

„Peida hinnad“ (collapse_prices) jätab read alles, kuid ei kuva summasid; näha on ainult jaotise kogusumma. „Peida koosseis“ (collapse_composition) peidab read täielikult ning klient näeb ainult jaotist koos kogusummaga.

Kas peidetud rida arvestatakse arve kogusumma sisse?

Jah. Peidetud read arvestatakse endiselt kogusumma, maksude ja raamatupidamiskannete sisse. Märge mõjutab ainult kuvamist väljatrükil ja kliendiportaalis.

Kas printimisrežiimi saab lisamisel veel muuta?

Jah. Vaikimisi kasutatakse komplektile määratud režiimi, kuid viisardis saab seda iga lisamise jaoks muuta. Komplekt ise jääb seejuures muutmata.

Mis juhtub, kui lülitan valiku Lisa jaotisena välja?

Siis toimib viisard nagu OCA moodulis sale_product_set: komplektiread lisatakse ilma jaotiseta.

Kas moodul paigaldab ootamatult ka teisi mooduleid?

Moodul ise seda ei tee. OCA hoidlate puhul võidakse aga paigaldada auto_install-mooduleid, kui lisada addons_path-i terved hoidlad. Seetõttu looge lingid ainult kahele vajalikule moodulile (vt paigaldamise jaotist).

Kas moodul töötab Odoo Enterprise'iga?

Moodul sõltub ainult Community moodulitest (sale_management, account) ja kahest OCA moodulist. Kasutame seda Odoo 19 Communityga. Enterprise'iga pole me seda testinud.

Millise litsentsi alusel moodulit levitatakse?

AGPL-3 alusel. Võite seda kasutada, kohandada ja edasi jagada, kui muudatused jäävad sama litsentsi alla. Veateated ja parandusettepanekud on probleemipiletitena GitHubi hoidlas oodatud.

Biricon IT Services aitab

Haldame väikeste ja keskmise suurusega ettevõtete Odoo paigaldusi alates juurutamisest, kohandamisest ja migreerimisest kuni igapäevase käigushoidmiseni. Kui soovite kohandada Odoo 19 tootekomplekte, pakkumismalle või aruandeid oma tööprotsessidele või kontrollida sellist moodulit ja võtta see turvaliselt tootmiskeskkonnas kasutusele, aitame teid hea meelega. Teisi meie loodud lahendusi leiate meie blogist, näiteks Mustandarvete ühendamine ja Pangamaksete automaatne sidumine arvetega.

Võtke kohe ühendust

Seisuga 2. november 2026. Mooduli versioon 19.0.1.0.0. Joonistel kasutatud näidisandmed on vabalt valitud, summad on käibemaksuta.