Skip to Content

Odoo 19 Community: tootekomplektid pakkumises 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 pakkumises jaotisena – meie avatud lähtekoodiga moodul Sale Product Set Layout

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

Kes müüb Odoos pakette, näiteks mõõteseadet koos lisatarvikute ja paigaldusega, tööjaama koos riistvara ja seadistusega või hoolduspaketti mitmest teenusest, vajab pakkumises korraga kahte asja: Koosseis peab olema tellimuses kirjas, et ladu, tehnika ja arvete koostamine teaksid, mida tarnitakse. Kliendile mõeldud väljatrükil ei peaks aga igal juhul olema näha iga üksikut rida koos iga üksikhinnaga.

OCA moodul sale_product_set võimaldab tootekomplekte (müügi komplektloendeid) ühe klõpsuga pakkumisse lisada. Väljatrüki vormingu üle see ei otsusta. Selleks töötasime välja mooduli Sale Product Set Layout (sale_product_set_layout). See on kirjutatud Odoo 19 jaoks ja on vaba tarkvarana AGPL-3 litsentsi all GitHubis tasuta kättesaadav:

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

Probleem: tootekomplektid ilma mõjuta väljatrüki vormingule

Tootekomplekt on Odoos ettevalmistatud toodete loend koos kogustega. Kümne artikli ükshaaval otsimise asemel valitakse pakkumises Lisa komplekt ja saadakse kõik read korraga. See säästab aega ja hoiab ära ununenud positsioonid. Täpselt seda teeb moodul sale_product_set hoidlast OCA/sale-workflow ; komplektid ise pärinevad moodulist product_set hoidlas OCA/product-attribute.

Praktikas jääb alles kolm lünka:

  • Nähtav rühmitus puudub. Komplekti read satuvad pakkumisse lahtiste positsioonidena. Pärast lisamist ei näe enam, millised read kuuluvad kokku, ja komplekti kogusumma pole kusagil näha.
  • Mõju väljatrükile puudub. Mõnikord peaks klient nägema iga positsiooni koos hinnaga, mõnikord ainult paketihinda, mõnikord vaid ühte ainsat rida. See on otsus komplekti või kliendi kohta, mitte iga pakkumise jaoks uuesti käsitsi tehtav toiming.
  • Hinnaparandused on ebameeldivad. Kui paketil peab olema fikseeritud hind, mis erineb hinnakirja hindade summast, on vaja parandusrida. See kuulub arvutusse, kuid mitte tingimata kliendi paberile.

Odoo 19 pakub ehituskivid, et see korralikult lahendada: jaotised ja alamjaotised pakkumise ridades koos valikutega Peida hinnad ja Peida koosseis (väljad collapse_prices ja collapse_composition). Moodul seob tootekomplekti nende standardvalikutega, selle asemel et leiutada oma printimisvormingut.

Mida moodul teeb

  1. Komplekti lisamine jaotisena. Viisard Lisa komplekt loob jaotise rea komplekti nimega, näiteks 2 × Messkit Standard, ja paneb komplekti read selle alla. Komplekti sees olevad jaotised muutuvad alamjaotisteks.
  2. Printimisrežiim komplekti kohta. Komplektis määratakse üks kord, kuidas seda prinditakse. Lisamisel saab režiimi viisardis selle ühe juhtumi jaoks muuta.
  3. Ridade peitmine. Üksikuid ridu saab märkida kui Ära prindi (komplektis: Peidetud). Need lähevad summasse kaasa, kuid neid ei prindita ega kuvata kliendiportaalis. Märge kandub pakkumiselt edasi arvele.
  4. Fikseeritud hind komplekti rea kohta. Komplekti real võib olla fikseeritud ühikuhind, mis asendab hinnakirja hinna, näiteks peidetud hinnaparanduse jaoks.
Ilma modulita (ainult sale_product_set)Moodulga sale_product_set_layout
Komplekti read lahtiste positsioonidenaJaotise rida komplekti nimega, kogus nimes, read all
Komplekti jaotised jäävad jaotisteks ja lõhuvad struktuuriKomplekti jaotised muutuvad alamjaotisteks (line_subsection)
Väljatrüki vorming alati samaPrintimisrežiim komplekti kohta, lisamisel muudetav
Hinnaparandus nähtav pakkumisel ja arvelRida peidetav, kuid läheb summasse kaasa
Hind ainult hinnakirjastValikuline fikseeritud hind komplekti rea kohta
Paigutus lõpeb pakkumiselPaigutus ja peitmine kehtivad pakkumisele, tellimusele, arvele ja kliendiportaalile

Kolm printimisrežiimi lähemalt

Printimisrežiim on tootekomplekti valikuväli print_mode. Lisamisel tõlgitakse see jaotise rea kaheks standardlüliti seadeks. Selleks on moodulis üks ainus, kergesti loetav vastavustabel:

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

Sama tootekomplekti kolm väljatrüki vormingut: iga rida koos hinnaga, ainult kogusumma, üks ainus rida

Režiim (print_mode)Kuvamine komplektisOdoo standardvalikVäljatrüki vorming
detailedIga rida koos hinnagapuudubJaotis, kõik read koos summaga
total_onlyRead ilma hindadeta, ainult komplekti summacollapse_prices (Peida hinnad)Jaotis koos summaga, read ainult nimetuse ja kogusega
summaryAinult üks rida komplekti summagacollapse_composition (Peida koosseis)Ainult jaotise rida koos summaga

Kuna moodul kasutab Odoo 19 standardvalikuid ja mitte oma printimisvormingut, toimivad pakkumine, tellimuse kinnitus, arve ja kliendiportaal ilma kohandatud aruandemallideta. Kes kasutab oma aruandemalle, mis arvestavad jaotise valikutega, saab sama käitumise.

Peidetud read ja fikseeritud hind

Sage juhtum: paketil on paketihind, mis on madalam üksikhindade summast. Üksikhindade moonutamise asemel lisatakse parandusrida fikseeritud hinnaga (näiteks −50,00 € komplekti kohta) ja see peidetakse. Taustaprogrammis on arve jälgitav, väljatrükil on kirjas paketihind.

Hinnaparandus on taustaprogrammis nähtav ja märgitud, pakkumise, PDF-i, arve ja portaali väljatrükil mitte nähtav, summa identne

Mõistmiseks oluline: märge hide_in_report ei muuda arvutuses midagi. Kogus, hind, allahindlus, maks, summad ja kandekirjed tekivad muutumatult standardse Odoo kaudu. Rida puudub ainult väljatrükil ja portaalis.

  • Tootekomplektis: komplekti rida koos valikuga Peidetud ja soovi korral Fikseeritud hind koos Ühikuhinnaga.
  • Pakkumise ja arve ridadel: veerg Ära prindi (hide_in_report), ka tavaliste ridade jaoks ilma komplektita.
  • Edasikandmine: arve koostamisel tellimusest kantakse märge üle arve reale. Pakkumise kopeerimisel see säilib.

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, uusi mudeleid ega SQL-sekkumisi pole.

Andmevoog: tootekomplekt, viisard Lisa komplekt, pakkumise read, arve read, PDF ja kliendiportaal

Laiendatud mudelid ja väljad

MudelTäiendus
product.setVäljad insert_as_section (Boolean, vaikimisi sees) ja print_mode (valik, kohustuslik väli, vaikimisi detailed)
product.set.lineVäljad hide_in_report, fixed_price, price_unit; prepare_sale_order_line_values() annab need edasi pakkumise reale
sale.product.set.wizardVäljad insert_as_section, section_name, print_mode; _prepare_order_lines() koostab jaotise rea
sale.order / sale.order.lineVäli hide_in_report (koos copy=True); _get_order_lines_to_report() jätab peidetud read vahele; _prepare_invoice_line() annab märke edasi
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() kannab märke aruandeandmetesse

Peitmine pakkumises

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

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
        )

Edasikandmine arvele

Arve rea loomisel pakkumise realt (_prepare_invoice_line()) kopeeritakse märge. Arve poolel on Odoo 19-s mitu teed, mille kaudu read aruandesse jõuavad: põhiloend, jaotise read ja alamjaotise read. Seetõttu filtreerib moodul mitmes kohas (_get_move_lines_to_report() dokumendil, _get_detailed_lines() ja _get_subsection_lines() real), muidu võiks peidetud rida mõne teise tee kaudu uuesti 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: jaotis lahtiste ridade asemel

Moodulis sale_product_set olev viisard sale.product.set.wizard loob pakkumise read meetodis _prepare_order_lines(). Moodul kirjutab selle meetodi üle. Kui Lisa jaotisena on välja lülitatud, kutsub see lihtsalt algset meetodit, käitumine jääb siis samaks nagu OCA moodulis. Vastasel juhul tekib kõigepealt jaotise rida kahe standardlülitiga, seejärel järgnevad komplekti read. Komplekti sees olevad jaotised muutuvad alamjaotisteks, et nad põhistruktuuri ei lõhuks:

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, mida ei näe

  • Viisardis 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 selgesõnaliselt antud väärtus teised. See torkab silma eelkõige siis, kui viisard luuakse koodist või testidest väärtustega.
  • Jaotise nimi koos kogusega. Kui kogus pole 1, on see nimes (2 × Messkit Standard, koma kümnendkohtade eraldajana), et väljatrükil oleks näha, et tegemist on kahe komplektiga, mitte ühe kahekordse kogusega komplektiga.
  • Fikseeritud hind ainult tooteridadel. prepare_sale_order_line_values() seab hide_in_report ja price_unit ainult siis, kui komplekti rida ei ole jaotise- ega märkusrida.
  • Standardne Odoo omaloomingu asemel. Printimisrežiim ja peitmine kasutavad Odoo 19 olemasolevaid konkse ja välju. See muudab uuendused hallatavaks: kui Odoo muudab aruandemalli, jääb moodul kehtivaks, kuni meetodid on olemas.

Paigaldus ilma 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.

auto_install lõks OCA moodulite puhul. Paljud OCA hoidlad sisaldavad mooduleid, millel on auto_install. Niipea kui nende sõltuvused on olemas, paigaldab Odoo need järgmisel paigaldamisel või uuendamisel küsimata kaasa. Kes seetõttu paneb kogu OCA hoidla tootmisinstantsi addons_path-i, saab võib-olla mooduleid, mida keegi ei soovinud. Hoidla OCA/product-attribute puhul puudutab see näiteks moodulit purchase_product_template_tags. Meie tegevuskava:

  1. Kloonige mõlemad OCA hoidlad pinnapealselt (git clone --depth 1 --branch 19.0).
  2. Linkige eraldi kataloogis sümlinkidega ainult kaks vajalikku moodulit ja lisage see kataloog addons_path-i, mitte terved hoidlad.
  3. Paigaldage testandmebaasi ja kontrollige, millised moodulid saavad seejuures oleku paigaldatud.
  4. Alles seejärel paigaldage tootmisse, valikuga --workers=0, et käivitus 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

Uued väljad ja vaated on pärast paigaldamist andmebaasis. Kui teenus töötab mitmeprotsessilises režiimis, laadivad töölised muudetud registri andmebaasi signaali kaudu uuesti. Mooduli Pythoni failide muudatused jõustuvad alles teenuse taaskäivitamise järel.

Kasutamine samm-sammult

  1. Komplekti loomine: Müük → Tooted → Tootekomplektid. Andke komplektile nimi, valige Lisa jaotisena ja Printimisrežiim, sisestage tooted koos kogustega. Märkige parandusread valikutega Peidetud ja Fikseeritud hind.
  2. Pakkumises: Klõpsake nuppu Lisa komplekt, valige komplekt ja kogus. Jaotise nime ja printimisrežiimi saab enne lisamist muuta.
  3. Üksikute ridade peitmine: Aktiveerige pakkumises või arvel veerg Ära prindi.
  4. Kontrollimine: Avage eelvaade või PDF. Sama kuva näevad kliendid portaalis.

Testid

Moodul sisaldab kuut automaattesti, mida käivitame testandmebaasi vastu enne, kui miski tootmisse läheb:

  • Lisamine jaotisena, sealhulgas printimisrežiim ja alamjaotis
  • Peidetud rida puudub prinditavate ridade hulgast
  • Režiim Üks rida (summary)
  • Lisamine ilma jaotiseta, algne käitumine
  • Arve võtab üle märke hide_in_report, rida puudub meetodis _get_move_lines_to_report(), jaotise summa sisaldab seda endiselt
  • Arve režiimis Ainult kogusumma ei näita peidetud rida jaotise ridades, jaotise summa 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 õiguslik märkus

  • Ainult paigutus. Moodul ei muuda, kuidas Odoo arvutab hindu, allahindlusi või makse. See muudab ainult seda, mis prinditakse ja portaalis kuvatakse.
  • Peidetud read on taustaprogrammis nähtavad. Märge puudutab väljatrükki ja portaali, mitte töötajate ekraanivaadet.
  • Kontrollige arve andmeid. Peidetud read lähevad summasse kaasa, kuid dokumendil neid ei ole. Kas see on kooskõlas teie riigi arvete nõuetega, näiteks tarnitud kaupade või osutatud teenuste ettenähtud kirjeldusega, peaksite enne arvetel kasutamist oma maksunõustajaga selgitama. Pakkumistel on peitmine ohutum. Artikkel ei ole õigusnõustamine.
  • Testitud Odoo 19 jaoks. Oleme mooduli välja töötanud ja testinud Odoo 19.0 Community jaoks. See kasutab jaotise valikuid, mis on Odoo 19-s selliselt olemas. Teiste versioonide puhul me seda kontrollinud ei ole.

Korduma kippuvad küsimused

Milleks mul seda moodulit vaja on, kui Odoo 19 oskab juba jaotisi?

Jaotise valikud on Odoos endas olemas. Puudus ühendus tootekomplektiga: komplekt peaks automaatselt lisanduma jaotisena, komplektis määratud printimisrežiimiga. Ilma mooduli peab pärast iga lisamist jaotise rea käsitsi looma ja seadistama.

Mille poolest erinevad „Peida hinnad“ ja „Peida koosseis“?

„Peida hinnad“ (collapse_prices) jätab read alles, kuid ei näita summasid, ainult jaotise kogusumma. „Peida koosseis“ (collapse_composition) peidab read täielikult, klient näeb ainult jaotist koos summaga.

Kas peidetud rida läheb arve summasse kaasa?

Jah. Peidetud read jäävad summasse, maksu ja kandesse. Märge puudutab ainult kuvamist väljatrükil ja kliendiportaalis.

Kas saan printimisrežiimi lisamisel veel muuta?

Jah. Režiim tuleb komplektist vaikeväärtusena, viisardis saab seda iga lisamise jaoks muuta. Komplekt ise jääb seejuures muutumatuks.

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

Siis käitub viisard nagu OCA moodulis sale_product_set: komplekti read lisatakse ilma jaotiseta.

Kas moodul paigaldab ootamatult täiendavaid mooduleid?

Moodul ise mitte. OCA hoidlate puhul võib aga ette tulla auto_install mooduleid, kui panna terved hoidlad addons_path-i. Linkige seetõttu ainult need kaks vajalikku moodulit (vt jaotist Paigaldus).

Kas moodul töötab Odoo Enterprise'iga?

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

Mis litsentsi all moodul on?

AGPL-3 all. Te võite seda kasutada, kohandada ja edasi anda, kui muudatused jäävad sama litsentsi alla. Vead ja parendusettepanekud on teretulnud issue'na GitHubi hoidlas .

Biricon IT Services'i tugi

Hooldame Odoo paigaldusi väikestele ja keskmise suurusega ettevõtetele: kasutuselevõtust ja kohandustest migratsioonide ja jooksva käitamiseni. Kui soovite Odoo 19 tootekomplekte, pakkumismalle või aruandeid oma töökorraldusega kohandada või kui soovite sellist moodulit kontrollida ja turvaliselt oma tootmisinstantsi tuua, aitame teid hea meelega. Muid omaarendusi leiate meie blogist, näiteks Arvete mustandite ühendamine ja Pangamaksete automaatne sidumine arvetega.

Võtke meiega ühendust

Seisuga: 2. november 2026. Mooduli versioon 19.0.1.0.0. Illustratsioonide näiteandmed on vabalt valitud, summad neto.