Odoon paketeak saltzen dituenak —adibidez, neurketa-gailu bat osagarriekin eta muntaketarekin, lanpostu bat hardwarearekin eta konfigurazioarekin edo hainbat zerbitzuz osatutako mantentze-pakete bat— bi gauza behar ditu aldi berean aurrekontuan: osaerak eskaeran agertu behar du, biltegikoek, teknikariek eta fakturazio-arduradunek zer entregatuko den jakin dezaten. Baina bezeroarentzako inprimatutako dokumentuan ez da beti partida bakoitza bere prezioarekin agertu behar.
OCAren sale_product_set moduluak produktu-multzoak (salmentarako osagai-zerrendak) klik bakar batez aurrekontu batean txertatzeko aukera ematen du. Ez du, ordea, inprimatutako itxura zehazten. Horretarako garatu dugu Sale Product Set Layout modulua (sale_product_set_layout). Odoo 19rako idatzita dago, eta software libre gisa doan eskuratu daiteke GitHuben, AGPL-3 lizentziapean:
github.com/Alex0176/odoo-sale-product-set-layout
Artikulu honen edukia
- Arazoa: inprimatutako itxura kontrolatu ezin duten produktu-multzoak
- Zer egiten du moduluak?
- Hiru inprimatze-moduak, xehetasunez
- Ezkutatutako lerroak eta prezio finkoa
- Inplementazio teknikoa
- Instalazioa, nahi gabeko albo-ondoriorik gabe
- Erabilera, urratsez urrats
- Probak
- Mugak eta lege-oharra
- Ohiko galderak
- Biricon IT Services-en laguntza
Arazoa: inprimatutako itxura kontrolatu ezin duten produktu-multzoak
Odoon, produktu-multzo bat produktuen eta haien kopuruen zerrenda prestatua da. Hamar artikulu banan-banan bilatu beharrean, aurrekontuan Gehitu multzoa hautatu, eta lerro guztiak batera lortzen dira. Horrek denbora aurrezten du eta partidak ahaztea saihesten du. Honako biltegi honetako sale_product_set moduluak: OCA/sale-workflow horixe egiten du; multzoak berak, berriz, honako biltegi honetako product_set modulutik datoz: OCA/product-attribute.
Praktikan, hiru gabezia geratzen dira:
- Ez dago taldekatze argirik. Multzoko lerroak partida solte gisa sartzen dira aurrekontuan. Txertatu ondoren, ez da ikusten zein lerro dagozkion multzo berari, eta multzoaren guztizkoa ez da inon agertzen.
- Ezin da inprimatutakoa kontrolatu. Batzuetan bezeroak partida bakoitza bere prezioarekin ikusi behar du; beste batzuetan, paketearen prezioa soilik; eta beste batzuetan, lerro bakarra. Multzoaren edo bezeroaren arabera hartu beharreko erabakia da, aurrekontu bakoitzean eskuz berriro egin behar izan gabe.
- Prezio-doikuntzak ez dira txukun geratzen. Pakete batek tarifa-prezioen baturarekin bat ez datorren prezio finkoa izan behar badu, doikuntza-lerro bat behar da. Lerro horrek kalkuluan parte hartu behar du, baina ez du zertan bezeroaren dokumentuan agertu.
Odoo 19k baditu hori txukun konpontzeko osagaiak: aurrekontu-lerroetako atalak eta azpiatalak, Ezkutatu prezioak eta Ezkutatu osaera aukerekin (collapse_prices eta collapse_composition eremuak). Moduluak produktu-multzoa aukera estandar horiekin lotzen du, inprimatze-formatu propio bat asmatu beharrean.
Zer egiten du moduluak?
- Multzoa atal gisa txertatzea. Gehitu multzoa morroiak atal-lerro bat sortzen du multzoaren izenarekin, adibidez 2 × Messkit Standard, eta multzoko lerroak azpian jartzen ditu. Multzo barruko atalak azpiatal bihurtzen dira.
- Inprimatze-modua multzo bakoitzeko. Multzoan behin zehazten da nola inprimatuko den. Txertatzean, morroian alda daiteke modua kasu jakin horretarako.
- Lerroak ezkutatzea. Lerro jakinak Ez inprimatu aukerarekin marka daitezke (multzoan: Ezkutatuta). Guztizkoan kontuan hartzen dira, baina ez dira inprimatzen, ezta bezeroaren atarian erakusten ere. Marka aurrekontutik fakturara eramaten da.
- Prezio finkoa multzoko lerro bakoitzeko. Multzoko lerro batek unitateko prezio finkoa izan dezake, prezio-zerrendakoa ordezteko; adibidez, ezkutatutako prezio-doikuntza baterako.
Modulurik gabe (sale_product_set soilik) | sale_product_set_layout moduluarekin |
|---|---|
| Multzoko lerroak partida solte gisa | Atal-lerroa multzoaren izenarekin, kopurua izenean eta lerroak azpian |
| Multzoko atalek atal izaten jarraitzen dute eta egitura hausten dute | Multzoko atalak azpiatal bihurtzen dira (line_subsection) |
| Inprimatutako itxura beti bera | Inprimatze-modua multzo bakoitzeko, txertatzean alda daitekeena |
| Prezio-doikuntza ikusgai aurrekontuan eta fakturan | Lerroa ezkuta daiteke, baina guztizkoan kontuan hartzen da |
| Prezioa prezio-zerrendatik soilik | Aukerako prezio finkoa multzoko lerro bakoitzeko |
| Diseinua aurrekontura mugatzen da | Diseinua eta ezkutatzea aurrekontuan, eskaeran, fakturan eta bezeroaren atarian aplikatzen dira |
Hiru inprimatze-moduak, xehetasunez
Inprimatze-modua produktu-multzoko print_mode hautapen-eremua da. Txertatzean, atal-lerroko bi etengailu estandarretan gauzatzen da. Horretarako, moduluak erraz irakurtzeko moduko esleipen bakarra du:
# Inprimatze-modua -> atal-lerroko (collapse_prices, collapse_composition)
PRINT_MODE_FLAGS = {
"detailed": (False, False),
"total_only": (True, False),
"summary": (False, True),
}
Modua (print_mode) | Multzoan erakusten dena | Odooren aukera estandarra | Inprimatutako itxura |
|---|---|---|---|
detailed | Lerro bakoitza bere prezioarekin | bat ere ez | Atala, lerro guztiak beren zenbatekoekin |
total_only | Lerroak preziorik gabe, multzoaren guztizkoa soilik | collapse_prices (Ezkutatu prezioak) | Atala guztizkoarekin, lerroetan izena eta kopurua soilik |
summary | Lerro bakarra multzoaren guztizkoarekin | collapse_composition (Ezkutatu osaera) | Atalaren lerroa soilik, guztizkoarekin |
Moduluak Odoo 19ren aukera estandarrak erabiltzen dituenez, eta ez inprimatze-formatu propio bat, aurrekontuak, eskaera-berrespenak, fakturak eta bezeroaren atariak txosten-txantiloiak moldatu beharrik gabe funtzionatzen dute. Atalen aukerak kontuan hartzen dituzten txosten-txantiloi propioekin ere portaera bera lortzen da.
Ezkutatutako lerroak eta prezio finkoa
Ohiko kasu bat: pakete baten prezioa banakako prezioen batura baino txikiagoa da. Banakako prezioak behartu beharrean, prezio finkoko doikuntza-lerro bat erabiltzen da (adibidez, −50,00 € multzoko), eta ezkutatu egiten da. Kudeaketa-panelean kalkulua argi ikus daiteke; inprimatutako dokumentuan, berriz, paketearen prezioa agertzen da.
Ondo ulertzeko gakoa: hide_in_report markak ez du kalkulua batere aldatzen. Kopurua, prezioa, deskontua, zerga, guztizkoak eta kontabilitate-idazpenak Odoo estandarrak sortzen ditu, bere horretan. Lerroa inprimatutako dokumentuan eta atarian baino ez da ezkutatzen.
- Produktu-multzoan: multzoko lerroa Ezkutatuta aukerarekin eta, nahi izanez gero, Prezio finkoa aukerarekin eta dagokion Unitateko prezioa balioarekin.
- Aurrekontu- eta faktura-lerroetan: Ez inprimatu zutabea (
hide_in_report), multzorik gabeko lerro arruntetarako ere bai. - Markaren transferentzia: eskaeratik faktura sortzean, marka faktura-lerrora transferitzen da. Aurrekontua kopiatzean ere mantentzen da.
Inplementazio teknikoa
Modulua txikia da nahita: lehendik dauden ereduak hedatzen ditu, eta Odoo-k zein lerro inprimatuko diren eta multzo bat nola txertatuko den erabakitzen duen puntuak soilik gainidazten ditu. Ez dago txosten-txantiloi berririk, ez eredu berririk, ezta SQL bidezko esku-hartzerik ere.
Hedatutako ereduak eta eremuak
| Eredua | Gehigarria |
|---|---|
product.set | insert_as_section eremua (boolearra, lehenespenez aktibatuta) eta print_mode eremua (hautapena, nahitaezkoa, lehenetsia: detailed) |
product.set.line | hide_in_report, fixed_price eta price_unit eremuak; prepare_sale_order_line_values() metodoak aurrekontu-lerrora pasatzen ditu |
sale.product.set.wizard | insert_as_section, section_name eta print_mode eremuak; _prepare_order_lines() metodoak atal-lerroa sortzen du |
sale.order / sale.order.line | hide_in_report eremua (copy=True aukerarekin); _get_order_lines_to_report() metodoak ezkutatutako lerroak baztertzen ditu; _prepare_invoice_line() metodoak marka transferitzen du |
account.move / account.move.line | hide_in_report eremua; _get_move_lines_to_report(), _get_detailed_lines() eta _get_subsection_lines() metodoek ezkutatutako lerroak iragazten dituzte; _get_aml_vals() metodoak marka txostenaren datuetan sartzen du |
Aurrekontuan ezkutatzea
Odoo 19k _get_order_lines_to_report() metodoan zehazten du aurrekontuko zein lerro inprimatu behar diren. Moduluak iragazki bat gehitzen du bertan. Ez da txosten-txantiloia aldatu behar: aurrekontuaren txosten-txantiloiak (sale/report/ir_actions_report_templates.xml) zein atariaren txantiloiak (sale/views/sale_portal_templates.xml) metodo horri deitzen diote:
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
)
Marka fakturara transferitzea
Aurrekontu-lerrotik faktura-lerroa sortzean (_prepare_invoice_line()), marka kopiatu egiten da. Fakturazioaren aldetik, Odoo 19n lerroak hainbat bidetatik iristen dira txostenera: zerrenda nagusitik, atal bateko lerroetatik eta azpiatal bateko lerroetatik. Horregatik, moduluak hainbat puntutan iragazten ditu (_get_move_lines_to_report() dokumentuan, eta _get_detailed_lines() eta _get_subsection_lines() lerroan); bestela, ezkutatutako lerro bat beste bideetako batetik berriro ager liteke:
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")]
Morroia: atal bat lerro solteen ordez
sale_product_set moduluko sale.product.set.wizard morroiak _prepare_order_lines() metodoan sortzen ditu aurrekontu-lerroak. Moduluak metodo hori gainidazten du. Txertatu atal gisa desaktibatuta badago, jatorrizko metodoari deitzen dio zuzenean, eta portaera OCAren moduluko bera da. Bestela, lehenik atal-lerroa sortzen da bi etengailu estandarrekin, eta ondoren multzoko lerroak gehitzen dira. Multzo barruko atalak azpiatal bihurtzen dira, egitura nagusia hautsi ez dezaten:
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
Ikusten ez diren erabakiak
- Kalkulu-metodo bereiziak morroian. Atalaren izenak, inprimatze-moduak eta Txertatu atal gisa aukerak bakoitzak bere
computemetodoa dute (store=True,readonly=False). Hirurek metodo bera izango balute, eremu bati esplizituki emandako balioak besteak berrezarriko lituzke. Hori bereziki nabaritzen da morroia kodetik edo probetatik balioekin sortzen denean. - Atalaren izena kopuruarekin. Kopurua 1 ez bada, izenean agertzen da (2 × Messkit Standard, koma bereizle hamartar gisa erabilita), inprimatutako dokumentuan argi gera dadin bi multzo direla, eta ez kopuru bikoitza duen multzo bakarra.
- Prezio finkoa produktu-lerroetan soilik.
prepare_sale_order_line_values()metodoakhide_in_reportetaprice_unitsoilik ezartzen ditu multzoko lerroa atal-lerroa edo ohar-lerroa ez denean. - Odoo estandarra, neurrira egindako garapenaren ordez. Inprimatze-moduak eta ezkutatzeak Odoo 19n lehendik dauden hedapen-puntuak eta eremuak erabiltzen dituzte. Horrek eguneratzeak kudeatzea errazten du: Odoo-k txosten-txantiloia aldatzen badu, moduluak baliozkoa izaten jarraitzen du, metodoak mantentzen diren bitartean.
Instalazioa, nahi gabeko albo-ondoriorik gabe
Eskakizunak: Odoo 19.0, sale_product_set (OCA/sale-workflow, 19.0 adarra) eta product_set (OCA/product-attribute, 19.0 adarra). Moduluak berak sale_management, sale_product_set eta account ditu mendekotasun gisa.
OCA moduluen auto_install tranpa. OCA biltegi askok auto_install duten moduluak dituzte. Haien mendekotasunak eskuragarri daudenean, Odoo-k automatikoki instalatzen ditu hurrengo instalazioan edo eguneratzean, galdetu gabe. Horregatik, OCA biltegi osoa produkzio-instantzia baten addons_path bidean jarriz gero, inork nahi ez zituen moduluak instala daitezke. OCA/product-attribute biltegian, adibidez, purchase_product_template_tags moduluarekin gertatzen da hori. Gure prozedura:
- Klonatu bi OCA biltegiak historia mugatuarekin (
git clone --depth 1 --branch 19.0). - Direktorio bereizi batean, sortu esteka sinbolikoak behar diren bi moduluetarako soilik, eta gehitu direktorio hori
addons_path-era, ez biltegi osoak. - Instalatu probako datu base batean, eta egiaztatu zer moduluri ezartzen zaien instalatuta egoera.
- Ondoren bakarrik instalatu produkzioan,
--workers=0aukerarekin, komandoa martxan dagoen zerbitzuarekin HTTP ataka erabiltzeko lehian sar ez dadin.
odoo-bin -c /etc/odoo/odoo.conf -d <datenbank> -i sale_product_set_layout --stop-after-init
Instalatu ondoren, eremu eta ikuspegi berriak datu basean daude. Zerbitzua prozesu anitzekin exekutatzen bada, worker prozesuek aldatutako registry-a berriz kargatzen dute datu baseko seinalearen bidez. Moduluaren Python fitxategietako aldaketek zerbitzua berrabiarazi ondoren soilik dute eragina.
Erabilera, urratsez urrats
- Multzoa sortu: Salmentak → Produktuak → Produktu multzoak. Eman izena multzoari, hautatu Atal gisa txertatu eta Inprimatze modua, eta gehitu produktuak beren kopuruekin. Zuzenketa lerroetan, ezarri Ezkutuan eta Prezio finkoa.
- Eskaintzan: Sakatu Gehitu multzoa, eta hautatu multzoa eta kopurua. Atalaren izena eta inprimatze modua txertatu aurretik alda daitezke.
- Lerro jakinak ezkutatu: Eskaintzan edo fakturan, aktibatu Ez inprimatu zutabea.
- Egiaztatu: Ireki aurrebista edo PDFa. Bezeroek aurkezpen bera ikusiko dute atarian.
Probak
Moduluak sei proba automatizatu dakartza, eta probako datu base batean exekutatzen ditugu ezer produkziora eraman aurretik:
- Atal gisa txertatzea, inprimatze modua eta azpiatala barne
- Ezkutatutako lerroa inprimatu beharreko lerroetan ez agertzea
- Lerro bakarra modua (
summary) - Atalik gabe txertatzea, jatorrizko portaera
- Fakturak
hide_in_reportmarka hartzen du, lerroa ez da_get_move_lines_to_report()funtzioan agertzen, eta atalaren guztizkoak barne hartzen jarraitzen du - Guztizko prezioa soilik moduko fakturak ez du ezkutatutako lerroa ataleko lerroetan erakusten, eta atalaren guztizkoa osorik mantentzen da
odoo-bin -d <testdatenbank> -i sale_product_set_layout \
--test-enable --test-tags=/sale_product_set_layout --stop-after-init
Alemanezko itzulpena i18n/de.po fitxategian dago.
Mugak eta lege-oharra
- Diseinua soilik. Moduluak ez du aldatzen Odook prezioak, deskontuak edo zergak kalkulatzeko duen modua. Inprimatzen dena eta atarian erakusten dena soilik aldatzen ditu.
- Ezkutatutako lerroak backend-ean ikusgai daude. Markak inprimatutako dokumentuari eta atariari eragiten die, ez langileen pantailako ikuspegiari.
- Egiaztatu fakturako datuak. Ezkutatutako lerroak guztizkoan zenbatzen dira, baina ez dira dokumentuan agertzen. Zure herrialdeko fakturazio eskakizunekin bateragarria den argitu beharko zenuke zerga aholkularitzarekin, fakturetan erabili aurretik; esaterako, entregatutako ondasunen edo emandako zerbitzuen nahitaezko deskribapenari dagokionez. Eskaintzetan lerroak ezkutatzeak arazo gutxiago sortzen ditu. Artikulu hau ez da lege aholkularitza.
- Odoo 19rako probatua. Modulua Odoo 19.0 Community bertsiorako garatu eta probatu dugu. Odoo 19n modu horretan eskuragarri dauden atalen aukerak erabiltzen ditu. Ez dugu beste bertsioetarako egiaztatu.
Ohiko galderak
Zertarako behar dut modulua, Odoo 19k dagoeneko atalak onartzen baditu?
Atalen aukerak Odoon bertan daude. Produktu multzoarekiko lotura falta zen: multzo bat automatikoki atal gisa txertatzea, multzoan ezarritako inprimatze moduarekin. Modulurik gabe, txertatze bakoitzaren ondoren atalaren lerroa eskuz sortu eta konfiguratu behar da.
Zer alde dago «Prezioak ezkutatu» eta «Osaera ezkutatu» aukeren artean?
«Prezioak ezkutatu» aukerak (collapse_prices) lerroak mantentzen ditu, baina ez du zenbatekorik erakusten, atalaren guztizkoa soilik. «Osaera ezkutatu» aukerak (collapse_composition) lerroak erabat ezkutatzen ditu; bezeroak atala eta haren guztizkoa soilik ikusten ditu.
Ezkutatutako lerroa fakturaren guztizkoan zenbatzen al da?
Bai. Ezkutatutako lerroak guztizkoan, zergetan eta kontabilitate idazpenean mantentzen dira. Markak inprimatutako dokumentuaren eta bezeroen atariaren aurkezpenari soilik eragiten dio.
Inprimatze modua alda al dezaket txertatzean?
Bai. Modua multzotik hartzen da lehenespenez, baina morroian alda daiteke txertatze bakoitzerako. Multzoa bera ez da aldatzen.
Zer gertatzen da Atal gisa txertatu desaktibatzen badut?
Orduan, morroiak OCAren sale_product_set moduluan bezala jokatzen du: multzoko lerroak atalik gabe txertatzen dira.
Moduluak ustekabean beste modulu batzuk instalatzen al ditu?
Moduluak berak ez. Baina OCA biltegietan, biltegi osoak addons_path-ean sartuz gero, auto_install moduluak instala daitezke. Horregatik, sortu estekak behar diren bi moduluetarako soilik (ikusi Instalazioa atala).
Moduluak Odoo Enterprise-rekin funtzionatzen al du?
Moduluak Community moduluak (sale_management, account) eta bi OCA moduluak soilik ditu mendekotasun gisa. Guk Odoo 19 Community-n erabiltzen dugu. Ez dugu Enterprise-n probatu.
Zer lizentzia du moduluak?
AGPL-3 lizentzia du. Erabili, egokitu eta banatu dezakezu, betiere aldaketek lizentzia berari eusten badiote. Akatsen jakinarazpenak eta hobekuntza proposamenak issue gisa aurkez ditzakezu GitHub biltegian .
Biricon IT Services-en laguntza
Enpresa txiki eta ertainen Odoo instalazioez arduratzen gara: ezarpenetik hasi, egokitzapen eta migrazioetatik igaro, eta eguneroko funtzionamenduraino. Odoo 19ko produktu multzoak, eskaintza txantiloiak edo txostenak zure lan prozesuetara egokitu nahi badituzu, edo horrelako modulu bat egiaztatu eta zure produkzioko instantzian modu seguruan ezarri nahi baduzu, pozik lagunduko dizugu. Guk garatutako beste irtenbide batzuk gure blogean aurkituko dituzu, adibidez Faktura zirriborroak bateratzea eta Bankuko ordainketak fakturei automatikoki esleitzea.
Jarri gurekin harremanetan orain
Azken eguneratzea: 2026ko azaroaren 2a. Moduluaren bertsioa: 19.0.1.0.0. Irudietako adibide datuak asmatuak dira; zenbatekoak zergarik gabekoak dira.