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
Efni þessarar greinar
- Vandinn: Vörusett án áhrifa á útlit útprentunar
- Hvað einingin gerir
- Prenthamirnir þrír í smáatriðum
- Faldar línur og fast verð
- Tæknileg útfærsla
- Uppsetning án óæskilegra aukaverkana
- Notkun skref fyrir skref
- Prófanir
- Takmarkanir og lagalegur fyrirvari
- Algengar spurningar
- Aðstoð frá Biricon IT Services
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
- 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.
- 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.
- 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.
- 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ínur | Hlutalína með nafni setts, magn í nafninu, línur fyrir neðan |
| Hlutar í setti haldast hlutar og slíta í sundur uppbygginguna | Hlutar í setti verða undirhlutar (line_subsection) |
| Útlit útprentunar alltaf það sama | Prentham fyrir hvert sett, hægt að breyta við innsetningu |
| Verðleiðrétting sýnileg á tilboði og reikningi | Hægt að fela línu, en hún telst samt með í summunni |
| Verð aðeins úr verðlistanum | Valfrjá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),
}
Hamur (print_mode) | Birting í setti | Staðalvalkostur í Odoo | Útlit útprentunar |
|---|---|---|---|
detailed | Hver lína með verði | engin | Hluti, allar línur með upphæð |
total_only | Línur án verðs, aðeins summa settsins | collapse_prices (Fela verð) | Hluti með summu, línur aðeins með heiti og magni |
summary | Aðeins ein lína með summu settsins | collapse_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ð.
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.
Útvíkkuð líkön og reitir
| Líkan | Viðbót |
|---|---|
product.set | Reitirnir insert_as_section (Boolean, sjálfgefið virkt) og print_mode (val, skyldureitur, sjálfgefið detailed) |
product.set.line | Reitirnir hide_in_report, fixed_price, price_unit; prepare_sale_order_line_values() sendir þá áfram á tilboðslínuna |
sale.product.set.wizard | Reitirnir insert_as_section, section_name, print_mode; _prepare_order_lines() býr til hlutalínuna |
sale.order / sale.order.line | Reiturinn 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.line | Reiturinn 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()seturhide_in_reportogprice_unitað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ð:
- Klóna báðar OCA-geymslurnar grunnt (
git clone --depth 1 --branch 19.0). - 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. - Setja upp á prófunargagnagrunni og athuga hvaða einingar fá þar stöðuna uppsett.
- 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
- 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ð.
- Í tilboðinu: Smella á Bæta við setti, velja sett og magn. Heiti hluta og prentham má breyta áður en sett er inn.
- Fela einstakar línur: Virkja dálkinn Ekki prenta í tilboðinu eða reikningnum.
- 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.
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.