Odoon paketeak saltzen dituenak, adibidez neurgailu bat osagarriekin eta muntaiarekin, lanpostu bat hardwarearekin eta konfigurazioarekin edo hainbat zerbitzuz osatutako mantentze-pakete bat, bi gauza behar ditu aldi berean eskaintzan: Osaera eskaeran agertu behar da, biltegiak, teknikariek eta fakturazioak zer entregatuko den jakin dezaten. Hala ere, bezeroarentzako inprimatuan ez da beti lerro bakoitza bere prezio indibidualarekin agertu behar.
sale_product_set OCA moduluak produktu-sortak (salmentarako materialen zerrendak) eskaintzan klik batez txertatzeko aukera ematen du. Inprimaketaren itxuraz ez du erabakitzen. Horretarako Sale Product Set Layout modulua (sale_product_set_layout) garatu dugu. Odoo 19rako idatzita dago eta software aske gisa, AGPL-3 lizentziapean, doan eskuragarri dago GitHuben:
github.com/Alex0176/odoo-sale-product-set-layout
Artikulu honen edukia
- Arazoa: inprimaketaren itxuran eraginik ez duten produktu-sortak
- Zer egiten duen moduluak
- Hiru inprimatze-moduak zehatz-mehatz
- Ezkutuko lerroak eta prezio finkoa
- Ezarpen teknikoa
- Instalazioa nahi ez diren albo-ondoriorik gabe
- Erabilera pausoz pauso
- Probak
- Mugak eta ohar juridikoa
- Maiz egiten diren galderak
- Biricon IT Services-en laguntza
Arazoa: inprimaketaren itxuran eraginik ez duten produktu-sortak
Odoon produktu-sorta kantitateak dituen produktu-zerrenda prestatu bat da. Hamar artikulu banan-banan bilatu beharrean, eskaintzan Gehitu sorta aukeratzen da eta lerro guztiak aldi berean jasotzen dira. Horrek denbora aurrezten du eta ahaztutako posizioak saihesten ditu. sale_product_set moduluak, biltegi honetatik datorrenak: OCA/sale-workflow hori egiten du; sortak berak product_set modulutik datoz, biltegi honetan: OCA/product-attribute.
Praktikan, hiru hutsune geratzen dira:
- Talde-multzorik ez. Sortako lerroak eskaintzan posizio solte gisa geratzen dira. Txertatu ondoren ez da ikusten zein lerro doazen elkarrekin, eta sortaren guztizkoa ez dago inon.
- Inprimatuan eraginik ez. Batzuetan bezeroak posizio guztiak prezioarekin ikusi behar ditu, beste batzuetan paketearen prezioa bakarrik, eta beste batzuetan lerro bakarra. Hori sorta bakoitzeko edo bezero bakoitzeko erabakia da, ez eskaintza bakoitzean eskuz berriro egin beharrekoa.
- Prezio-zuzenketak itsusiak dira. Pakete batek prezio finko bat izatea nahi bada, prezio-zerrendako prezioen batura ez datorrena, zuzenketa-lerro bat behar da. Hori kalkuluan egon behar da, baina ez nahitaez bezeroaren paperean.
Odoo 19k eraikuntza-blokeak ekartzen ditu hau modu garbian konpontzeko: eskaintza-lerroetako atalak eta azpiatalak, Prezioak ezkutatu eta Osaera ezkutatu aukerekin (collapse_prices eta collapse_composition eremuak). Moduluak produktu-sorta ohiko aukera horiekin lotzen du, inprimatze-formatu propio bat asmatu beharrean.
Zer egiten duen moduluak
- Sorta atal gisa txertatu. Gehitu sorta morroiak atal-lerro bat sortzen du sortaren izenarekin, adibidez 2 × Neurketa-kit estandarra, eta sortako lerroak azpian jartzen ditu. Sortaren barruko atalak azpiatal bihurtzen dira.
- Sorta bakoitzeko inprimatze-modua. Sortan behin finkatzen da nola inprimatuko den. Txertatzean, morroian modua aldatu daiteke kasu horretarako soilik.
- Lerroak ezkutatu. Lerro bakoitza Ez inprimatu gisa markatu daiteke (sortan: Ezkutuan). Guztizkoan kontatzen dira, baina ez dira inprimatzen ez bezeroen atarian erakusten. Marka eskaintzatik fakturara pasatzen da.
- Sortako lerro bakoitzeko prezio finkoa. Sortako lerro batek banakako prezio finko bat izan dezake, prezio-zerrendako prezioa ordezkatzen duena, adibidez ezkutuko prezio-zuzenketa baterako.
Modulurik gabe (sale_product_set bakarrik) | sale_product_set_layout moduluarekin |
|---|---|
| Sortako lerroak posizio solte gisa | Sortaren izena duen atal-lerroa, kantitatea izenean, lerroak azpian |
| Sortako atalak atal gisa geratzen dira eta egitura hausten dute | Sortako atalak azpiatal bihurtzen dira (line_subsection) |
| Inprimaketaren itxura beti berdina | Sorta bakoitzeko inprimatze-modua, txertatzean alda daiteke |
| Prezio-zuzenketa ikusgai eskaintzan eta fakturan | Lerroa ezkutatu daiteke, baina guztizkoan kontatzen da |
| Prezioa prezio-zerrendatik soilik | Aukeran, sortako lerro bakoitzeko prezio finkoa |
| Itxura eskaintzan amaitzen da | Itxura eta ezkutatzea eskaintzan, eskaeran, fakturan eta bezeroen atarian aplikatzen dira |
Hiru inprimatze-moduak zehatz-mehatz
Inprimatze-modua print_mode hautaketa-eremua da, produktu-sortan. Txertatzean atal-lerroaren ohiko bi etengailuetara itzultzen da. Horretarako, moduluan esleipen bakar eta erraz irakur daitekeen bat dago:
# Druckmodus -> (collapse_prices, collapse_composition) der Abschnittszeile
PRINT_MODE_FLAGS = {
"detailed": (False, False),
"total_only": (True, False),
"summary": (False, True),
}
Modua (print_mode) | Sortan erakustea | Odooko ohiko aukera | Inprimaketaren itxura |
|---|---|---|---|
detailed | Lerro bakoitza prezioarekin | bat ere ez | Atala, lerro guztiak zenbatekoarekin |
total_only | Lerroak prezio gabe, sortaren batura soilik | collapse_prices (Prezioak ezkutatu) | Atala baturarekin, lerroak izena eta kantitatea soilik dituztela |
summary | Sortaren baturaren lerro bakarra soilik | collapse_composition (Osaera ezkutatu) | Baturaren atal-lerroa soilik |
Moduluak Odoo 19ren ohiko aukerak erabiltzen dituenez eta ez inprimatze-formatu propiorik, eskaintzak, eskaera-berrespenak, fakturak eta bezeroen atariak ondo funtzionatzen dute txosten-txantiloi egokituen beharrik gabe. Atal-aukerak kontuan hartzen dituzten txosten-txantiloi propioak dituenak, portaera bera jasotzen du.
Ezkutuko lerroak eta prezio finkoa
Kasu arrunta: pakete batek paketearen prezio bat du, banakako prezioen batura baino baxuagoa. Banakako prezioak makurtu beharrean, prezio finkoko zuzenketa-lerro bat hartzen da (adibidez −50,00 € sorta bakoitzeko) eta ezkutatu egiten da. Backendean faktura jarraigarria da; inprimatuan paketearen prezioa agertzen da.
Ulertzeko garrantzitsua: hide_in_report markak ez du kalkuluan ezer aldatzen. Kantitatea, prezioa, deskontua, zerga, baturak eta kontabilitate-idazpenak Odoo estandarraren bidez sortzen dira aldatu gabe. Lerroa inprimatuan eta atarian falta da soilik.
- Produktu-sortan: sortako lerroa Ezkutuan aukerarekin eta, nahi izanez gero, Prezio finkoa eta Banakako prezioa aukerekin.
- Eskaintza- eta faktura-lerroetan: Ez inprimatu zutabea (
hide_in_report), sortarik gabeko lerro arruntetarako ere. - Transmisioa: Eskaeratik faktura sortzean, marka faktura-lerrora pasatzen da. Eskaintza kopiatzean, mantentzen da.
Ezarpen teknikoa
Modulua nahita txikia da: lehendik dauden ereduak zabaltzen ditu eta Odoo-k zein lerro inprimatuko diren eta sorta nola txertatuko den erabakitzen duen lekuak soilik gainidazten ditu. Ez dago txosten-txantiloi berririk, eredu berririk ez SQL esku-hartzerik.
Zabaldutako ereduak eta eremuak
| Eredua | Gehigarria |
|---|---|
product.set | insert_as_section (Boolean, lehenetsia aktibatuta) eta print_mode (hautaketa, derrigorrezko eremua, lehenetsia detailed) eremuak |
product.set.line | hide_in_report, fixed_price, price_unit eremuak; prepare_sale_order_line_values()-ek eskaintza-lerroari pasatzen dizkio |
sale.product.set.wizard | insert_as_section, section_name, print_mode eremuak; _prepare_order_lines()-ek atal-lerroa eraikitzen du |
sale.order / sale.order.line | hide_in_report eremua (copy=True aukerarekin); _get_order_lines_to_report()-ek ezkutuko lerroak saltatzen ditu; _prepare_invoice_line()-ek marka pasatzen du |
account.move / account.move.line | hide_in_report eremua; _get_move_lines_to_report(), _get_detailed_lines() eta _get_subsection_lines()-ek ezkutuko lerroak iragazten dituzte; _get_aml_vals()-ek marka txostenaren datuetara eramaten du |
Eskaintzan ezkutatzea
Odoo 19k inprimatu beharreko eskaintza-lerroak _get_order_lines_to_report() metodoan zehazten ditu. Moduluak iragazki bat erantsten dio. Ez da txosten-txantiloian esku-hartzerik behar: bai eskaintzaren txosten-txantiloiak (sale/report/ir_actions_report_templates.xml) bai ataria txantiloiak (sale/views/sale_portal_templates.xml) metodo hori deitzen dute:
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
)
Fakturara transmititzea
Eskaintza-lerrotik faktura-lerroa sortzean (_prepare_invoice_line()), marka kopiatzen da. Fakturaren aldean, Odoo 19n lerroak txostenera iristeko hainbat bide daude: zerrenda nagusia, atal baten lerroak eta azpiatal baten lerroak. Horregatik moduluak hainbat lekutan iragazten du (_get_move_lines_to_report() agirian, _get_detailed_lines() eta _get_subsection_lines() lerroan); bestela, ezkutuko lerro bat beste bideetako batetik berriro azal 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: lerro solteen ordez atala
sale_product_set moduluko sale.product.set.wizard morroiak eskaintza-lerroak _prepare_order_lines() metodoan sortzen ditu. Moduluak metodo hori gainidazten du. Atal gisa txertatu desaktibatuta badago, jatorrizko metodoa deitzen du besterik gabe, eta portaera OCA moduluan bezala geratzen da. Bestela, lehenik atal-lerroa sortzen da bi etengailu estandarrekin, eta ondoren sortako lerroak datoz. Sortaren barruko atalak azpiatal bihurtzen dira, egitura nagusia hauts 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 Atal gisa txertatu aukerak bere
computemetodo propioa dute (store=True,readonly=False). Hirurek metodo bera izango balute, eremu batean esplizituki pasatutako balio batek beste bi berrezarriko lituzke. Hori batez ere nabaritzen da morroia kodetik edo probetatik balioekin sortzen denean. - Atalaren izena kantitatearekin. Kantitatea 1 ez bada, izenean agertzen da (2 × Neurketa-kit estandarra, koma hamartar-bereizle gisa), inprimatuan bi sorta direla ikus dadin, eta ez kantitate bikoitzeko sorta bakarra.
- Prezio finkoa produktu-lerroetan soilik.
prepare_sale_order_line_values()-ekhide_in_reportetaprice_unitezartzen ditu sortako lerroa atal- edo ohar-lerroa ez denean soilik. - Odoo estandarra, ez eraikuntza propioa. Inprimatze-moduak eta ezkutatzeak Odoo 19ren lotura-puntu (hook) eta eremu existenteak erabiltzen dituzte. Horrek eguneratzeak kudeagarri egiten ditu: Odoo-k txosten-txantiloia aldatzen badu, modulua baliagarria izaten jarraitzen du metodoak existitzen diren bitartean.
Instalazioa nahi ez diren albo-ondoriorik gabe
Baldintzak: 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 moduluen menpe dago.
OCA moduluetako auto_install tranpa. OCA biltegi askok auto_install duten moduluak dituzte. Haien menpekotasunak eskuragarri egon bezain laster, Odoo-k galdetu gabe instalatzen ditu hurrengo instalazioan edo eguneraketan. Beraz, OCA biltegi osoa produkzio-instantzia baten addons_path-ean jartzen duenak, agian inork nahi ez zituen moduluak jasoko ditu. OCA/product-attribute biltegian, adibidez, purchase_product_template_tags moduluari eragiten dio. Gure prozedura:
- Bi OCA biltegiak azaleko klonatu (
git clone --depth 1 --branch 19.0). - Direktorio propio batean beharrezko bi moduluak soilik symlink bidez lotu eta direktorio hori gehitu
addons_path-era, ez biltegi osoak. - Proba-datu-base batean instalatu eta egiaztatu zein modulu geratzen diren instalatuta egoeran.
- Ondoren bakarrik instalatu produkzioan,
--workers=0aukerarekin, deiak martxan dagoen zerbitzuarekin HTTP portuagatik lehiatu ez dezan.
odoo-bin -c /etc/odoo/odoo.conf -d <datenbank> -i sale_product_set_layout --stop-after-init
Eremu eta ikuspegi berriak instalatu ondoren datu-basean daude. Zerbitzua prozesu anitzeko moduan badabil, worker-ek aldatutako erregistroa datu-baseko seinalearen bidez birkargatzen dute. Moduluaren Python fitxategietako aldaketak zerbitzua berrabiarazi ondoren bakarrik dira eraginkorrak.
Erabilera pausoz pauso
- Sorta sortu: Salmentak → Produktuak → Produktu-sortak. Sortari izena eman, Atal gisa txertatu eta Inprimatze-modua aukeratu, produktuak kantitateekin sartu. Zuzenketa-lerroei Ezkutuan eta Prezio finkoa jarri.
- Eskaintzan: Gehitu sorta botoian klik egin, sorta eta kantitatea aukeratu. Atalaren izena eta inprimatze-modua txertatu aurretik alda daitezke.
- Lerro bakoitza ezkutatu: Eskaintzan edo fakturan Ez inprimatu zutabea aktibatu.
- Egiaztatu: Aurrebista edo PDFa ireki. Bezeroek atarian irudi bera ikusten dute.
Probak
Moduluak sei proba automatizatu ekartzen ditu, produkziora joan aurretik proba-datu-base batean exekutatzen ditugunak:
- Atal gisa txertatzea, inprimatze-modua eta azpiatala barne
- Ezkutuko lerroa ez dago inprimatu beharreko lerroen artean
- Lerro bakarra modua (
summary) - Atalik gabe txertatzea, jatorrizko portaera
- Fakturak
hide_in_reportmarka hartzen du, lerroa ez dago_get_move_lines_to_report()-en, atalaren baturak oraindik barne hartzen du - Guztizko prezioa soilik moduko fakturak ez du ezkutuko lerroa atal-lerroetan erakusten, atalaren batura osorik geratzen da
odoo-bin -d <testdatenbank> -i sale_product_set_layout \
--test-enable --test-tags=/sale_product_set_layout --stop-after-init
Alemanerazko itzulpena i18n/de.po fitxategian dago.
Mugak eta ohar juridikoa
- Itxura soilik. Moduluak ez du aldatzen Odoo-k prezioak, deskontuak edo zergak nola kalkulatzen dituen. Inprimatzen eta atarian erakusten dena soilik aldatzen du.
- Ezkutuko lerroak backendean ikusgai daude. Markak inprimatuari eta atariari eragiten die, ez langileen pantaila-ikuspegiari.
- Faktura-datuak egiaztatu. Ezkutuko lerroak guztizkoan kontatzen dira, baina ez daude agirian. Hori zure herrialdeko fakturen baldintzekin bateragarria den, adibidez entregatutako gauzen edo emandako zerbitzuen derrigorrezko deskribapenarekin, fakturetan erabili aurretik zure zerga-aholkularitzarekin argitu beharko zenuke. Eskaintzetan, ezkutatzea arazo gutxiagokoa da. Artikulua ez da lege-aholkularitza.
- Odoo 19rako probatua. Modulua Odoo 19.0 Community-rako garatu eta probatu dugu. Odoo 19n horrela dauden atal-aukerak erabiltzen ditu. Beste bertsioetarako ez dugu egiaztatu.
Maiz egiten diren galderak
Zertarako behar dut modulua, Odoo 19k atalak badaki?
Atal-aukerak Odoo-n berean daude. Falta zena produktu-sortarekin lotura zen: sorta automatikoki atal gisa txertatu behar zen, sortan gordetako inprimatze-moduarekin. Modulurik gabe, txertatze bakoitzaren ondoren atal-lerroa eskuz sortu eta konfiguratu behar da.
Zer aldea dago “Prezioak ezkutatu” eta “Osaera ezkutatu” artean?
“Prezioak ezkutatu” (collapse_prices) aukerak lerroak mantentzen ditu, baina ez du zenbatekorik erakusten, atalaren batura soilik. “Osaera ezkutatu” (collapse_composition) aukerak lerroak guztiz ezkutatzen ditu; bezeroak baturadun atala soilik ikusten du.
Ezkutuko lerro batek fakturaren guztizkoan kontatzen du?
Bai. Ezkutuko lerroak baturan, zergan eta kontabilitate-idazpenean geratzen dira. Markak inprimatuko eta bezeroen atariko aurkezpenari soilik eragiten dio.
Inprimatze-modua txertatzean aldatu dezaket oraindik?
Bai. Modua sortatik datorren aurrezarpen gisa dator, eta morroian txertatze jakin baterako alda daiteke. Sorta bera aldatu gabe geratzen da.
Zer gertatzen da Atal gisa txertatu desaktibatzen badut?
Orduan morroiak sale_product_set OCA moduluan bezala jokatzen du: sortako lerroak atalik gabe txertatzen dira.
Moduluak espero ez diren beste modulu batzuk instalatzen ditu?
Moduluak berak ez. Hala ere, OCA biltegietan auto_install moduluak egon daitezke, biltegi osoak addons_path-ean jartzen badira. Beraz, lotu beharrezko bi moduluak soilik (ikus Instalazioa atala).
Modulua Odoo Enterprise-rekin funtzionatzen du?
Moduluak Community moduluen (sale_management, account) eta bi OCA moduluen menpe soilik dago. Odoo 19 Community-n erabiltzen dugu. Enterprise-n ez dugu probatu.
Zer lizentziapean dago modulua?
AGPL-3pean. Erabili, egokitu eta partekatu dezakezu, aldaketek lizentzia bera mantentzen duten bitartean. Akatsak eta hobekuntza-proposamenak Issue gisa ongi etorriak dira hemen: GitHub biltegia .
Biricon IT Services-en laguntza
Enpresa txiki eta ertainen Odoo instalazioak zaintzen ditugu: ezarpenetik hasita, egokitzapenetatik eta migrazioetatik eguneroko funtzionamendura arte. Odoo 19n produktu-sortak, eskaintza-txantiloiak edo txostenak zure lan-prozesuetara egokitu nahi badituzu, edo horrelako modulu bat aztertu eta zure produkzio-instantziara seguru eraman nahi baduzu, pozik lagunduko dizugu. Beste garapen propio batzuk gure blogean aurkituko dituzu, adibidez Faktura-zirriborroak batu eta Banku-ordainketak automatikoki fakturei esleitu.
Jarri gurekin harremanetan orain
Egoera: 2026ko azaroaren 2a. Moduluaren bertsioa 19.0.1.0.0. Irudietako adibide-datuak libreki aukeratuak dira, zenbatekoak garbi.