Skip to Content

Odoo 19 Community: Vörusett í tilboði sem hluti – opna hugbúnaðareiningin okkar Sale Product Set Layout

2. nóvember 2026 | Odoo 19 Community | Eigin þróun
2. nóvember 2026 by
Odoo 19 Community: Vörusett í tilboði sem hluti – opna hugbúnaðareiningin okkar Sale Product Set Layout

Odoo 19 einingin Sale Product Set Layout: vörusett sem hluti í tilboði með prenthami, földum línum og föstu verði

Sá sem selur pakka í Odoo, til dæmis mælitæki með fylgihlutum og uppsetningu, vinnustöð með vélbúnaði og uppsetningu eða þjónustupakka úr nokkrum þjónustuþáttum, þarf tvennt í senn í tilboðinu: Samsetningin verður að vera í pöntuninni svo að lager, tæknideild og reikningagerð viti hvað er afhent. Á útprentuninni fyrir viðskiptavininn á hins vegar ekki alltaf að birtast hver einstök lína með hverju einstöku verði.

OCA-einingin sale_product_set gerir kleift að setja vörusett (efnislista fyrir sölu) inn í tilboð með einum smelli. Hún ræður þó ekki útliti útprentunarinnar. Til þess þróuðum við eininguna Sale Product Set Layout (sale_product_set_layout). Hún er skrifuð fyrir Odoo 19 og er aðgengileg ókeypis á GitHub sem frjáls hugbúnaður undir AGPL-3-leyfinu:

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

Vandinn: Vörusett án áhrifa á útlit útprentunar

Vörusett er í Odoo fyrirfram útbúinn listi yfir vörur með magni. Í stað þess að leita að tíu vörum hverri fyrir sig velur maður í tilboðinu Bæta við setti og fær allar línurnar í einu. Það sparar tíma og kemur í veg fyrir að línur gleymist. Einingin sale_product_set úr geymslunni OCA/sale-workflow gerir einmitt þetta; settin sjálf koma úr product_set í geymslunni OCA/product-attribute.

Í reynd eru þrjár eyður eftir:

  • Engin sýnileg flokkun. Línur settsins lenda sem lausar línur í tilboðinu. Eftir innsetninguna sést ekki lengur hvaða línur tilheyra saman, og heildarupphæð settsins kemur hvergi fram.
  • Engin áhrif á útprentunina. Stundum á viðskiptavinurinn að sjá hverja línu með verði, stundum aðeins pakkaverðið, stundum aðeins eina línu. Þetta er ákvörðun fyrir hvert sett eða hvern viðskiptavin, ekki eitthvað sem á að gera upp á nýtt í höndunum í hverju tilboði.
  • Verðleiðréttingar eru óþægilegar. Eigi pakki að hafa fast verð sem víkur frá summu listaverða þarf leiðréttingarlínu. Hún á heima í útreikningnum en ekki endilega á pappír viðskiptavinarins.

Odoo 19 hefur byggingarhluta til að leysa þetta á snyrtilegan hátt: hluta og undirhluta í tilboðslínum með valkostunum Fela verð og Fela samsetningu (reitirnir collapse_prices og collapse_composition). Einingin tengir vörusettið við þessa staðalvalkosti í stað þess að finna upp eigið prentsnið.

Hvað einingin gerir

  1. Setja sett inn sem hluta. Aðstoðarforritið Bæta við setti býr til hlutalínu með nafni settsins, til dæmis 2 × Mælisett Standard, og setur línur settsins fyrir neðan. Hlutar innan settsins verða að undirhlutum.
  2. Prentham fyrir hvert sett. Í settinu er einu sinni ákveðið hvernig það er prentað. Við innsetningu er hægt að breyta hamnum í aðstoðarforritinu fyrir það tiltekna skipti.
  3. Fela línur. Hægt er að merkja einstakar línur sem Ekki prenta (í settinu: Falið). Þær teljast með í summunni en eru hvorki prentaðar né birtar í viðskiptavinagáttinni. Merkið flyst úr tilboðinu yfir á reikninginn.
  4. Fast verð fyrir hverja settlínu. Settlína getur borið fast einingarverð sem kemur í stað verðs úr verðlistanum, til dæmis fyrir falda verðleiðréttingu.
Án einingarinnar (aðeins sale_product_set)Með sale_product_set_layout
Settlínur sem lausar línurHlutalína með nafni setts, magn í nafninu, línur fyrir neðan
Hlutar í setti haldast hlutar og slíta í sundur uppbyggingunaHlutar í setti verða undirhlutar (line_subsection)
Útlit útprentunar alltaf það samaPrentham fyrir hvert sett, hægt að breyta við innsetningu
Verðleiðrétting sýnileg á tilboði og reikningiHægt að fela línu, en hún telst samt með í summunni
Verð aðeins úr verðlistanumValfrjálst fast verð fyrir hverja settlínu
Útlitið nær aðeins til tilboðsinsÚtlit og földun gilda um tilboð, pöntun, reikning og viðskiptavinagátt

Prenthamirnir þrír í smáatriðum

Prenthamurinn er valreitur print_mode á vörusettinu. Við innsetningu er honum þýtt yfir í báða staðalrofana á hlutalínunni. Til þess er í einingunni ein, auðlesin varpun:

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

Þrjár útprentanir af sama vörusetti: hver lína með verði, aðeins heildarverð, ein lína

Hamur (print_mode)Birting í settiStaðalvalkostur í OdooÚtlit útprentunar
detailedHver lína með verðienginHluti, allar línur með upphæð
total_onlyLínur án verðs, aðeins summa settsinscollapse_prices (Fela verð)Hluti með summu, línur aðeins með heiti og magni
summaryAðeins ein lína með summu settsinscollapse_composition (Fela samsetningu)Aðeins hlutalínan með summunni

Þar sem einingin notar staðalvalkosti Odoo 19 en ekki eigið prentsnið virka tilboð, pöntunarstaðfesting, reikningur og viðskiptavinagátt án sérsniðinna skýrslusniðmáta. Sá sem er með eigin skýrslusniðmát sem taka tillit til hlutavalkostanna fær sömu hegðun.

Faldar línur og fast verð

Algengt tilvik: Pakki hefur pakkaverð sem er lægra en summa einingarverðanna. Í stað þess að beygja einingarverðin notar maður leiðréttingarlínu með föstu verði (til dæmis −50,00 € fyrir hvert sett) og felur hana. Í bakendanum er reikningurinn rekjanlegur, á útprentuninni stendur pakkaverðið.

Verðleiðrétting sýnileg og merkt í bakendanum, ekki sýnileg á útprentun tilboðs, PDF, reiknings og gáttar, summan er sú sama

Mikilvægt til skilnings: Merkið hide_in_report breytir engu í útreikningnum. Magn, verð, afsláttur, skattur, summur og bókhaldsfærslur verða til óbreytt með staðal-Odoo. Línan vantar aðeins á útprentunina og í gáttina.

  • Á vörusettinu: Settlína með Falið og valfrjálst Fast verð ásamt Einingarverði.
  • Á tilboðs- og reikningslínum: Dálkurinn Ekki prenta (hide_in_report), einnig fyrir venjulegar línur án setts.
  • Yfirfærsla: Þegar reikningur er búinn til úr pöntuninni flyst merkið yfir á reikningslínuna. Þegar tilboð er afritað helst það.

Tæknileg útfærsla

Einingin er viljandi lítil: Hún útvíkkar fyrirliggjandi líkön og yfirskrifar aðeins þá staði þar sem Odoo ákveður hvaða línur eru prentaðar og hvernig sett er sett inn. Engin ný skýrslusniðmát, engin ný líkön og engin bein SQL-inngrip.

Gagnaflæði: vörusett, aðstoðarforritið Bæta við setti, tilboðslínur, reikningslínur, PDF og viðskiptavinagátt

Útvíkkuð líkön og reitir

LíkanViðbót
product.setReitirnir insert_as_section (Boolean, sjálfgefið virkt) og print_mode (val, skyldureitur, sjálfgefið detailed)
product.set.lineReitirnir hide_in_report, fixed_price, price_unit; prepare_sale_order_line_values() sendir þá áfram á tilboðslínuna
sale.product.set.wizardReitirnir insert_as_section, section_name, print_mode; _prepare_order_lines() býr til hlutalínuna
sale.order / sale.order.lineReiturinn hide_in_report (með copy=True); _get_order_lines_to_report() sleppir földum línum; _prepare_invoice_line() sendir merkið áfram
account.move / account.move.lineReiturinn hide_in_report; _get_move_lines_to_report(), _get_detailed_lines() og _get_subsection_lines() sía burt faldar línur; _get_aml_vals() flytur merkið yfir í skýrslugögnin

Földun í tilboðinu

Odoo 19 finnur þær tilboðslínur sem á að prenta í _get_order_lines_to_report(). Einingin bætir síu við þar. Inngrip í skýrslusniðmátið er óþarft: Bæði skýrslusniðmát tilboðsins (sale/report/ir_actions_report_templates.xml) og gáttarsniðmátið (sale/views/sale_portal_templates.xml) kalla á þetta fall:

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
        )

Yfirfærsla á reikninginn

Þegar reikningslínan er búin til úr tilboðslínunni (_prepare_invoice_line()) er merkið afritað. Reikningsmegin eru í Odoo 19 nokkrar leiðir sem línur komast í skýrsluna: aðallistinn, línur hluta og línur undirhluta. Þess vegna síar einingin á nokkrum stöðum (_get_move_lines_to_report() á skjalinu, _get_detailed_lines() og _get_subsection_lines() á línunni), annars gæti falin lína birst aftur eftir einhverri hinna leiðanna:

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

Aðstoðarforritið: Hluti í stað lausra lína

Aðstoðarforritið sale.product.set.wizard úr sale_product_set býr til tilboðslínurnar í _prepare_order_lines(). Einingin yfirskrifar þetta fall. Sé Setja inn sem hluta óvirkt kallar hún einfaldlega á upprunalega fallið og hegðunin er þá eins og í OCA-einingunni. Annars verður hlutalínan til fyrst með báðum staðalrofunum og síðan koma línur settsins. Hlutar innan settsins verða að undirhlutum svo þeir slíti ekki aðalbygginguna í sundur:

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

Ákvarðanir sem sjást ekki

  • Aðskilin útreikningsföll í aðstoðarforritinu. Heiti hluta, prentham og Setja inn sem hluta hafa hvert sitt compute-fall (store=True, readonly=False). Ef öll þrjú hefðu sama fallið myndi gildi sem sent er beint fyrir einn reit endurstilla hina. Þetta sést helst þegar aðstoðarforritið er búið til úr kóða eða prófunum með gildum.
  • Heiti hluta með magni. Sé magnið annað en 1 stendur það í nafninu (2 × Mælisett Standard, með kommu sem tugabrotsskil) svo að á útprentuninni sjáist að um tvö sett er að ræða en ekki eitt sett með tvöföldu magni.
  • Fast verð aðeins á vörulínum. prepare_sale_order_line_values() setur hide_in_report og price_unit aðeins ef settlínan er hvorki hluta- né athugasemdarlína.
  • Staðal-Odoo í stað heimasmíðar. Prentham og földun nota fyrirliggjandi króka og reiti í Odoo 19. Það gerir uppfærslur viðráðanlegar: Breyti Odoo skýrslusniðmátinu helst einingin gild svo lengi sem föllin eru til staðar.

Uppsetning án óæskilegra aukaverkana

Forsendur: Odoo 19.0, sale_product_set (OCA/sale-workflow, grein 19.0) og product_set (OCA/product-attribute, grein 19.0). Einingin sjálf er háð sale_management, sale_product_set og account.

auto_install-gildran í OCA-einingum. Margar OCA-geymslur innihalda einingar með auto_install. Um leið og skilyrði þeirra eru uppfyllt setur Odoo þær óspurt upp við næstu uppsetningu eða uppfærslu. Sá sem leggur heila OCA-geymslu í addons_path framleiðsluumhverfis gæti því fengið einingar sem enginn vildi. Í OCA/product-attribute á þetta til dæmis við um purchase_product_template_tags. Okkar aðferð:

  1. Klóna báðar OCA-geymslurnar grunnt (git clone --depth 1 --branch 19.0).
  2. Tengja í sérstakri möppu aðeins einingarnar tvær sem þarf með symlink og bæta þeirri möppu við addons_path, ekki öllum geymslunum.
  3. Setja upp á prófunargagnagrunni og athuga hvaða einingar fá þar stöðuna uppsett.
  4. Fyrst þá setja upp í framleiðslu, með --workers=0, svo að skipunin keppi ekki við þjónustuna sem er í gangi um HTTP-gáttina.
odoo-bin -c /etc/odoo/odoo.conf -d <datenbank> -i sale_product_set_layout --stop-after-init

Nýir reitir og sýnir eru í gagnagrunninum eftir uppsetninguna. Keyri þjónustan í fjölvinnsluhami hlaða worker-ferlin breyttu registry í gegnum gagnagrunnsmerkið. Breytingar á Python-skrám einingarinnar taka ekki gildi fyrr en þjónustan hefur verið endurræst.

Notkun skref fyrir skref

  1. Búa til sett: Sala → Vörur → Vörusett. Nefna settið, velja Setja inn sem hluta og Prentham, færa inn vörurnar með magni. Merkja leiðréttingarlínur með Falið og Fast verð.
  2. Í tilboðinu: Smella á Bæta við setti, velja sett og magn. Heiti hluta og prentham má breyta áður en sett er inn.
  3. Fela einstakar línur: Virkja dálkinn Ekki prenta í tilboðinu eða reikningnum.
  4. Athuga: Opna forskoðun eða PDF. Viðskiptavinir sjá sömu framsetningu í gáttinni.

Prófanir

Einingin fylgir með sex sjálfvirkum prófunum sem við keyrum gegn prófunargagnagrunni áður en nokkuð fer í framleiðslu:

  • Innsetning sem hluti, þar með talinn prentham og undirhluti
  • Falin lína vantar í línurnar sem á að prenta
  • Hamurinn Ein lína (summary)
  • Innsetning án hluta, upprunaleg hegðun
  • Reikningur tekur við merkinu hide_in_report, línan vantar í _get_move_lines_to_report(), summa hlutans inniheldur hana áfram
  • Reikningur í hamnum Aðeins heildarverð sýnir földu línuna ekki í hlutalínunum, summa hlutans er áfram heil
odoo-bin -d <testdatenbank> -i sale_product_set_layout \
         --test-enable --test-tags=/sale_product_set_layout --stop-after-init

Þýska þýðingin er í i18n/de.po.

Takmarkanir og lagalegur fyrirvari

  • Aðeins útlit. Einingin breytir ekki því hvernig Odoo reiknar verð, afslætti eða skatta. Hún breytir aðeins því sem er prentað og birt í gáttinni.
  • Faldar línur sjást í bakendanum. Merkið varðar útprentun og gátt, ekki skjámynd starfsfólks.
  • Athugaðu reikningsupplýsingar. Faldar línur teljast með í summunni en standa ekki á skjalinu. Hvort það samrýmist kröfum um reikninga í þínu landi, til dæmis lögboðinni lýsingu á afhentum vörum eða veittri þjónustu, ættirðu að ganga úr skugga um áður en þetta er notað á reikningum með skattaráðgjafa þínum. Á tilboðum er földunin óvandasamari. Færslan er ekki lögfræðileg ráðgjöf.
  • Prófað fyrir Odoo 19. Við þróuðum og prófuðum eininguna fyrir Odoo 19.0 Community. Hún notar hlutavalkosti sem eru til í þessari mynd í Odoo 19. Við höfum ekki athugað hana fyrir aðrar útgáfur.

Algengar spurningar

Til hvers þarf ég eininguna ef Odoo 19 kann nú þegar hluta?

Hlutavalkostirnir eru til í Odoo sjálfu. Það vantaði tenginguna við vörusettið: Sett átti að setjast sjálfkrafa inn sem hluti, með þeim prenthami sem er skráður í settinu. Án einingarinnar þarf að búa til hlutalínuna í höndunum og stilla hana eftir hverja innsetningu.

Hver er munurinn á „Fela verð“ og „Fela samsetningu“?

„Fela verð“ (collapse_prices) lætur línurnar standa en sýnir engar upphæðir, aðeins summuna á hlutanum. „Fela samsetningu“ (collapse_composition) felur línurnar alveg, viðskiptavinurinn sér aðeins hlutann með summunni.

Telst falin lína með í reikningssummunni?

Já. Faldar línur haldast í summu, skatti og bókun. Merkið varðar aðeins framsetninguna á útprentun og í viðskiptavinagáttinni.

Get ég enn breytt prenthamnum við innsetningu?

Já. Hamurinn kemur sem sjálfgefið gildi úr settinu og í aðstoðarforritinu er hægt að breyta honum fyrir viðkomandi innsetningu. Settið sjálft helst óbreytt.

Hvað gerist ef ég slekk á Setja inn sem hluta?

Þá hegðar aðstoðarforritið sér eins og í OCA-einingunni sale_product_set: Línur settsins eru settar inn án hluta.

Setur einingin óvænt upp fleiri einingar?

Einingin sjálf ekki. Með OCA-geymslur getur hins vegar komið til auto_install-eininga ef heilar geymslur eru lagðar í addons_path. Tengdu því aðeins einingarnar tvær sem þarf (sjá kaflann Uppsetning).

Keyrir einingin með Odoo Enterprise?

Einingin er aðeins háð Community-einingum (sale_management, account) og OCA-einingunum tveimur. Við notum hana á Odoo 19 Community. Á Enterprise höfum við ekki prófað hana.

Undir hvaða leyfi er einingin?

Undir AGPL-3. Þú mátt nota hana, laga og dreifa, svo lengi sem breytingar haldast undir sama leyfi. Villur og tillögur að úrbótum eru vel þegnar sem issue í GitHub-geymslunni .

Aðstoð frá Biricon IT Services

Við sjáum um Odoo-uppsetningar fyrir lítil og meðalstór fyrirtæki: frá innleiðingu til sérsniðna og flutninga og áfram til daglegs reksturs. Ef þú vilt laga vörusett, tilboðssniðmát eða skýrslur í Odoo 19 að þínu verklagi, eða ef þú vilt fara yfir einingu eins og þessa og koma henni örugglega í framleiðsluumhverfið þitt, aðstoðum við þig með ánægju. Fleiri eigin þróunarverkefni finnur þú í blogginu okkar, til dæmis Sameina reikningsdrög og Úthluta bankagreiðslum sjálfkrafa á reikninga.

Hafðu samband núna

Staða: 2. nóvember 2026. Einingarútgáfa 19.0.1.0.0. Sýnigögnin á myndunum eru frjálst valin, upphæðir án vsk.