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
Selle artikli sisu
- Probleem: tootekomplektid ilma mõjuta väljatrüki vormingule
- Mida moodul teeb
- Kolm printimisrežiimi lähemalt
- Peidetud read ja fikseeritud hind
- Tehniline teostus
- Paigaldus ilma soovimatute kõrvalmõjudeta
- Kasutamine samm-sammult
- Testid
- Piirangud ja õiguslik märkus
- Korduma kippuvad küsimused
- Biricon IT Services'i tugi
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
- 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.
- Printimisrežiim komplekti kohta. Komplektis määratakse üks kord, kuidas seda prinditakse. Lisamisel saab režiimi viisardis selle ühe juhtumi jaoks muuta.
- 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.
- 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 positsioonidena | Jaotise rida komplekti nimega, kogus nimes, read all |
| Komplekti jaotised jäävad jaotisteks ja lõhuvad struktuuri | Komplekti jaotised muutuvad alamjaotisteks (line_subsection) |
| Väljatrüki vorming alati sama | Printimisrežiim komplekti kohta, lisamisel muudetav |
| Hinnaparandus nähtav pakkumisel ja arvel | Rida peidetav, kuid läheb summasse kaasa |
| Hind ainult hinnakirjast | Valikuline fikseeritud hind komplekti rea kohta |
| Paigutus lõpeb pakkumisel | Paigutus 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),
}
Režiim (print_mode) | Kuvamine komplektis | Odoo standardvalik | Väljatrüki vorming |
|---|---|---|---|
detailed | Iga rida koos hinnaga | puudub | Jaotis, kõik read koos summaga |
total_only | Read ilma hindadeta, ainult komplekti summa | collapse_prices (Peida hinnad) | Jaotis koos summaga, read ainult nimetuse ja kogusega |
summary | Ainult üks rida komplekti summaga | collapse_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.
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.
Laiendatud mudelid ja väljad
| Mudel | Täiendus |
|---|---|
product.set | Väljad insert_as_section (Boolean, vaikimisi sees) ja print_mode (valik, kohustuslik väli, vaikimisi detailed) |
product.set.line | Väljad hide_in_report, fixed_price, price_unit; prepare_sale_order_line_values() annab need edasi pakkumise reale |
sale.product.set.wizard | Väljad insert_as_section, section_name, print_mode; _prepare_order_lines() koostab jaotise rea |
sale.order / sale.order.line | Vä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.line | Vä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()seabhide_in_reportjaprice_unitainult 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:
- Kloonige mõlemad OCA hoidlad pinnapealselt (
git clone --depth 1 --branch 19.0). - Linkige eraldi kataloogis sümlinkidega ainult kaks vajalikku moodulit ja lisage see kataloog
addons_path-i, mitte terved hoidlad. - Paigaldage testandmebaasi ja kontrollige, millised moodulid saavad seejuures oleku paigaldatud.
- 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
- 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.
- Pakkumises: Klõpsake nuppu Lisa komplekt, valige komplekt ja kogus. Jaotise nime ja printimisrežiimi saab enne lisamist muuta.
- Üksikute ridade peitmine: Aktiveerige pakkumises või arvel veerg Ära prindi.
- 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.
Seisuga: 2. november 2026. Mooduli versioon 19.0.1.0.0. Illustratsioonide näiteandmed on vabalt valitud, summad neto.