Min ibigħ pakketti f'Odoo, pereżempju strument tal-kejl b'aċċessorji u installazzjoni, post tax-xogħol b'hardware u twaqqif, jew pakkett ta' manutenzjoni magħmul minn diversi servizzi, għandu bżonn żewġ affarijiet fl-istess ħin fl-offerta: Il-kompożizzjoni trid tidher fl-ordni, biex il-maħżen, it-tekniku u l-fatturazzjoni jkunu jafu x'se jiġi kkunsinnat. Fuq l-istampa għall-klijent, madankollu, mhux f'kull każ għandha tidher kull pożizzjoni individwali b'kull prezz individwali.
Il-modulu OCA sale_product_set jippermetti li settijiet tal-prodotti (listi tal-materjali għall-bejgħ) jiddaħħlu f'offerta b'klikk wieħed. Hu ma jiddeċiedix dwar id-dehra tal-istampa. Għal dan żviluppajna l-modulu Sale Product Set Layout (sale_product_set_layout). Huwa miktub għal Odoo 19 u disponibbli b'xejn fuq GitHub bħala softwer ħieles taħt il-liċenzja AGPL-3:
github.com/Alex0176/odoo-sale-product-set-layout
Kontenut ta' dan l-artikolu
- Il-problema: Settijiet tal-prodotti mingħajr influwenza fuq id-dehra tal-istampa
- Dak li jagħmel il-modulu
- It-tliet modalitajiet ta' stampar fid-dettall
- Linji moħbija u prezz fiss
- Implimentazzjoni teknika
- Installazzjoni mingħajr effetti sekondarji mhux mixtieqa
- Użu pass pass
- Testijiet
- Limiti u avviż legali
- Mistoqsijiet frekwenti
- Appoġġ minn Biricon IT Services
Il-problema: Settijiet tal-prodotti mingħajr influwenza fuq id-dehra tal-istampa
Sett tal-prodotti f'Odoo huwa lista mħejjija ta' prodotti bil-kwantitajiet. Minflok ma tfittex għaxar artikli wieħed wieħed, fl-offerta tagħżel Żid sett u tikseb il-linji kollha f'daqqa. Dan iffrankalek il-ħin u jevita pożizzjonijiet minsija. Il-modulu sale_product_set mir-repożitorju OCA/sale-workflow jagħmel eżattament dan; is-settijiet infushom ġejjin minn product_set fir-repożitorju OCA/product-attribute.
Fil-prattika jibqgħu tliet lakuni:
- Ebda raggruppament rikonoxxibbli. Il-linji tas-sett jispiċċaw bħala pożizzjonijiet maħlula fl-offerta. Wara l-inserzjoni ma jibqax jidher liema linji jmorru flimkien, u t-total tas-sett ma jidher imkien.
- Ebda influwenza fuq l-istampa. Kultant il-klijent għandu jara kull pożizzjoni bil-prezz, kultant biss il-prezz tal-pakkett, kultant linja waħda biss. Din hija deċiżjoni għal kull sett jew għal kull klijent, mhux li ssir bl-idejn għal kull offerta mill-ġdid.
- Il-korrezzjonijiet tal-prezz mhumiex sbieħ. Jekk pakkett għandu jkollu prezz fiss li jvarja mis-somma tal-prezzijiet tal-lista, tinħtieġ linja ta' korrezzjoni. Din tappartjeni għall-kalkolu, iżda mhux neċessarjament fuq il-karta tal-klijent.
Odoo 19 jiġi bil-blokki bażiċi biex dan jissolva b'mod nadif: sezzjonijiet u subsezzjonijiet fil-linji tal-offerta bl-għażliet Aħbi l-prezzijiet u Aħbi l-kompożizzjoni (il-kampi collapse_prices u collapse_composition). Il-modulu jgħaqqad is-sett tal-prodotti ma' dawn l-għażliet standard, minflok ma jivvinta format tiegħu tal-istampar.
Dak li jagħmel il-modulu
- Daħħal is-sett bħala sezzjoni. L-assistent Żid sett joħloq linja ta' sezzjoni bl-isem tas-sett, pereżempju 2 × Messkit Standard, u jpoġġi l-linji tas-sett taħtha. Is-sezzjonijiet fi ħdan is-sett isiru subsezzjonijiet.
- Modalità ta' stampar għal kull sett. Fis-sett jiġi stabbilit darba kif jiġi stampat. Meta jiddaħħal, il-modalità tista' tinbidel fl-assistent għal dak il-każ wieħed.
- Aħbi l-linji. Linji individwali jistgħu jiġu mmarkati bħala Tistampax (fuq is-sett: Moħbi). Jingħaddu fit-total, iżda la jiġu stampati u lanqas murija fil-portal tal-klijent. Is-sinjal jinġarr mill-offerta għall-fattura.
- Prezz fiss għal kull linja tas-sett. Linja tas-sett tista' tkun fiha prezz fiss individwali li jieħu post il-prezz mil-lista tal-prezzijiet, pereżempju għal korrezzjoni tal-prezz moħbija.
Mingħajr il-modulu (biss sale_product_set) | Bi sale_product_set_layout |
|---|---|
| Linji tas-sett bħala pożizzjonijiet maħlula | Linja ta' sezzjoni bl-isem tas-sett, kwantità fl-isem, linji taħtha |
| Is-sezzjonijiet fis-sett jibqgħu sezzjonijiet u jfarrku l-istruttura | Is-sezzjonijiet fis-sett isiru subsezzjonijiet (line_subsection) |
| Dehra tal-istampa dejjem l-istess | Modalità ta' stampar għal kull sett, tista' tinbidel meta jiddaħħal |
| Korrezzjoni tal-prezz viżibbli fuq l-offerta u l-fattura | Linja li tista' tinħeba, iżda tingħadd fit-total |
| Prezz biss mil-lista tal-prezzijiet | Prezz fiss b'mod fakultattiv għal kull linja tas-sett |
| Il-layout jieqaf mal-offerta | Il-layout u l-ħbi japplikaw għall-offerta, l-ordni, il-fattura u l-portal tal-klijent |
It-tliet modalitajiet ta' stampar fid-dettall
Il-modalità ta' stampar hija qasam ta' għażla print_mode fuq is-sett tal-prodotti. Meta jiddaħħal, tiġi tradotta fiż-żewġ swiċċijiet standard tal-linja tas-sezzjoni. Għal dan, fil-modulu hemm mappjar wieħed biss, faċli biex jinqara:
# Druckmodus -> (collapse_prices, collapse_composition) der Abschnittszeile
PRINT_MODE_FLAGS = {
"detailed": (False, False),
"total_only": (True, False),
"summary": (False, True),
}
Modalità (print_mode) | Wiri fis-sett | Għażla standard f'Odoo | Dehra tal-istampa |
|---|---|---|---|
detailed | Kull linja bil-prezz | xejn | Sezzjoni, il-linji kollha bl-ammont |
total_only | Linji mingħajr prezzijiet, biss it-total tas-sett | collapse_prices (Aħbi l-prezzijiet) | Sezzjoni bit-total, linji biss bid-deskrizzjoni u l-kwantità |
summary | Linja waħda biss bit-total tas-sett | collapse_composition (Aħbi l-kompożizzjoni) | Biss il-linja tas-sezzjoni bit-total |
Peress li l-modulu juża l-għażliet standard ta' Odoo 19 u mhux format tiegħu tal-istampar, l-offerta, il-konferma tal-ordni, il-fattura u l-portal tal-klijent jaħdmu mingħajr mudelli tar-rapporti adattati. Min għandu mudelli tar-rapporti tiegħu li jqisu l-għażliet tas-sezzjonijiet, jikseb l-istess imġiba wkoll.
Linji moħbija u prezz fiss
Każ frekwenti: Pakkett għandu prezz tal-pakkett li jkun taħt is-somma tal-prezzijiet individwali. Minflok ma jiġu mgħawġa l-prezzijiet individwali, tittieħed linja ta' korrezzjoni b'prezz fiss (pereżempju −50,00 € għal kull sett) u titħeba. Fil-backend il-fattura tkun traċċabbli, fl-istampa jidher il-prezz tal-pakkett.
Importanti għall-fehim: Is-sinjal hide_in_report ma jbiddel xejn fil-kalkolu. Kwantità, prezz, skont, taxxa, totali u entrati kontabbli jinħolqu bla tibdil minn Odoo standard. Il-linja sempliċement tkun nieqsa fl-istampa u fil-portal.
- Fuq is-sett tal-prodotti: Linja tas-sett b'Moħbi u fakultattivament Prezz fiss flimkien mal-Prezz individwali.
- Fuq il-linji tal-offerta u tal-fattura: Kolonna Tistampax (
hide_in_report), anke għal-linji normali mingħajr sett. - Trasmissjoni: Meta tinħoloq il-fattura mill-ordni, is-sinjal jiġi trasferit fuq il-linja tal-fattura. Meta tikkopja offerta, jinżamm.
Implimentazzjoni teknika
Il-modulu huwa żgħir apposta: Jestendi mudelli eżistenti u jisbaq biss il-postijiet fejn Odoo jiddeċiedi liema linji jiġu stampati u kif jiddaħħal sett. M'hemmx mudelli ġodda tar-rapporti, m'hemmx mudelli ġodda u m'hemmx interventi SQL.
Mudelli u kampi estiżi
| Mudell | Żieda |
|---|---|
product.set | Kampi insert_as_section (Boolean, awtomatikament attiv) u print_mode (għażla, qasam obbligatorju, awtomatikament detailed) |
product.set.line | Kampi hide_in_report, fixed_price, price_unit; prepare_sale_order_line_values() jgħaddihom lill-linja tal-offerta |
sale.product.set.wizard | Kampi insert_as_section, section_name, print_mode; _prepare_order_lines() jibni l-linja tas-sezzjoni |
sale.order / sale.order.line | Qasam hide_in_report (b'copy=True); _get_order_lines_to_report() jaqbeż il-linji moħbija; _prepare_invoice_line() jgħaddi s-sinjal |
account.move / account.move.line | Qasam hide_in_report; _get_move_lines_to_report(), _get_detailed_lines() u _get_subsection_lines() jiffiltraw il-linji moħbija; _get_aml_vals() iġorr is-sinjal fid-data tar-rapport |
Ħbi fl-offerta
Odoo 19 jiddetermina l-linji tal-offerta li għandhom jiġu stampati f'_get_order_lines_to_report(). Il-modulu jehmeż filtru hemmhekk. Intervent fil-mudell tar-rapport mhuwiex meħtieġ: Kemm il-mudell tar-rapport tal-offerta (sale/report/ir_actions_report_templates.xml) kif ukoll il-mudell tal-portal (sale/views/sale_portal_templates.xml) isejħu dan il-metodu:
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
)
Trasmissjoni fuq il-fattura
Meta tinħoloq il-linja tal-fattura mil-linja tal-offerta (_prepare_invoice_line()), is-sinjal jiġi kkupjat. Fuq in-naħa tal-fattura, f'Odoo 19 hemm diversi toroq li bihom il-linji jaslu fir-rapport: il-lista prinċipali, il-linji ta' sezzjoni u l-linji ta' subsezzjoni. Għalhekk il-modulu jiffiltra f'diversi postijiet (_get_move_lines_to_report() fuq id-dokument, _get_detailed_lines() u _get_subsection_lines() fuq il-linja), inkella linja moħbija tista' terġa' tidher minn waħda mit-toroq l-oħra:
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")]
L-assistent: Sezzjoni minflok linji maħlula
L-assistent sale.product.set.wizard minn sale_product_set joħloq il-linji tal-offerta f'_prepare_order_lines(). Il-modulu jisbaq dan il-metodu. Jekk Daħħal bħala sezzjoni ikun mitfi, sempliċement isejjaħ il-metodu oriġinali, u l-imġiba tibqa' bħal fil-modulu OCA. Inkella tinħoloq l-ewwel il-linja tas-sezzjoni biż-żewġ swiċċijiet standard, u warajha jiġu l-linji tas-sett. Is-sezzjonijiet fi ħdan is-sett isiru subsezzjonijiet, biex ma jfarrkux l-istruttura prinċipali:
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
Deċiżjonijiet li ma jidhrux
- Metodi ta' kalkolu separati fl-assistent. L-isem tas-sezzjoni, il-modalità ta' stampar u Daħħal bħala sezzjoni għandhom kull wieħed metodu
computetiegħu (store=True,readonly=False). Li kieku t-tlieta kellhom l-istess metodu, valur mgħoddi b'mod espliċitu għal qasam kien iwaqqaf lill-oħrajn. Dan jidher l-aktar meta l-assistent jinħoloq mill-kodiċi jew mit-testijiet b'valuri. - Isem tas-sezzjoni bil-kwantità. Meta l-kwantità tkun differenti minn 1, tidher fl-isem (2 × Messkit Standard, bil-virgola bħala separatur deċimali), biex fl-istampa wieħed jaf li huma żewġ settijiet u mhux sett wieħed b'kwantità doppja.
- Prezz fiss biss fuq linji tal-prodotti.
prepare_sale_order_line_values()jistabbilixxihide_in_reportuprice_unitbiss jekk il-linja tas-sett ma tkunx linja ta' sezzjoni jew ta' nota. - Odoo standard minflok żvilupp tagħna. Il-modalità ta' stampar u l-ħbi jużaw hooks u kampi eżistenti ta' Odoo 19. Dan jagħmel l-aġġornamenti ġestibbli: Jekk Odoo jibdel il-mudell tar-rapport, il-modulu jibqa' validu sakemm il-metodi jkomplu jeżistu.
Installazzjoni mingħajr effetti sekondarji mhux mixtieqa
Rekwiżiti: Odoo 19.0, sale_product_set (OCA/sale-workflow, fergħa 19.0) u product_set (OCA/product-attribute, fergħa 19.0). Il-modulu nnifsu jiddependi minn sale_management, sale_product_set u account.
Il-ħabs tal-auto_install fil-moduli OCA. Ħafna repożitorji OCA fihom moduli b'auto_install. Hekk kif jinsabu d-dipendenzi tagħhom, Odoo jinstallahom mingħajr ma jistaqsi fl-installazzjoni jew fl-aġġornament li jmiss. Min għalhekk ipoġġi r-repożitorju OCA sħiħ fl-addons_path ta' istanza produttiva, jista' jikseb moduli li ħadd ma ried. B'OCA/product-attribute dan jolqot, pereżempju, purchase_product_template_tags. Il-proċedura tagħna:
- Ikklona ż-żewġ repożitorji OCA b'mod baxx (
git clone --depth 1 --branch 19.0). - F'direttorju separat orbot permezz ta' symlink biss iż-żewġ moduli meħtieġa u żid dan id-direttorju fl-
addons_path, mhux ir-repożitorji kollha. - Installa fuq database tat-test u ivverifika liema moduli jiksbu l-istatus installat b'dan.
- Biss imbagħad installa f'produzzjoni, b'
--workers=0, biex is-sejħa ma tikkompetix mas-servizz li jaħdem għall-port HTTP.
odoo-bin -c /etc/odoo/odoo.conf -d <datenbank> -i sale_product_set_layout --stop-after-init
Kampi u views ġodda jkunu fid-database wara l-installazzjoni. Jekk is-servizz jaħdem f'modalità ta' proċessi multipli, il-workers iniżżlu mill-ġdid ir-registry mibdul permezz tas-sinjal tad-database. Bidliet fil-fajls Python tal-modulu jsiru effettivi biss wara li s-servizz jerġa' jinbeda.
Użu pass pass
- Oħloq sett: Bejgħ → Prodotti → Settijiet tal-prodotti. Semmi s-sett, agħżel Daħħal bħala sezzjoni u Modalità ta' stampar, daħħal il-prodotti bil-kwantitajiet. Agħti lil-linji ta' korrezzjoni Moħbi u Prezz fiss.
- Fl-offerta: Ikklikkja fuq Żid sett, agħżel is-sett u l-kwantità. L-isem tas-sezzjoni u l-modalità ta' stampar jistgħu jinbidlu qabel l-inserzjoni.
- Aħbi linji individwali: Fl-offerta jew fil-fattura attiva l-kolonna Tistampax.
- Ivverifika: Iftaħ il-preview jew il-PDF. L-istess preżentazzjoni jarawha l-klijenti fil-portal.
Testijiet
Il-modulu jiġi b'sitt testijiet awtomatizzati, li nwettqu fuq database tat-test qabel ma xi ħaġa tmur fil-produzzjoni:
- Inserzjoni bħala sezzjoni inkluża l-modalità ta' stampar u s-subsezzjoni
- Linja moħbija ma tkunx fost il-linji li għandhom jiġu stampati
- Modalità Linja waħda (
summary) - Inserzjoni mingħajr sezzjoni, l-imġiba oriġinali
- Il-fattura tieħu s-sinjal
hide_in_report, il-linja ma tkunx f'_get_move_lines_to_report(), it-total tas-sezzjoni xorta jinkludiha - Il-fattura fil-modalità Biss il-prezz totali ma turix il-linja moħbija fil-linji tas-sezzjoni, it-total tas-sezzjoni jibqa' sħiħ
odoo-bin -d <testdatenbank> -i sale_product_set_layout \
--test-enable --test-tags=/sale_product_set_layout --stop-after-init
It-traduzzjoni Ġermaniża tinsab f'i18n/de.po.
Limiti u avviż legali
- Layout biss. Il-modulu ma jbiddilx kif Odoo jikkalkula l-prezzijiet, l-iskonti jew it-taxxi. Jibdel biss dak li jiġi stampat u murija fil-portal.
- Il-linji moħbija huma viżibbli fil-backend. Is-sinjal jolqot l-istampa u l-portal, mhux il-wiri fuq l-iskrin tal-impjegati.
- Ivverifika d-dettalji tal-fattura. Il-linji moħbija jingħaddu fit-total, iżda ma jidhrux fuq id-dokument. Jekk dan huwiex kompatibbli mar-rekwiżiti għall-fatturi f'pajjiżek, pereżempju mad-deskrizzjoni preskritta tal-oġġetti kkunsinnati jew tas-servizzi pprovduti, għandek tikkjarifika qabel l-użu fuq il-fatturi mal-konsulent tat-taxxa tiegħek. Fuq l-offerti l-ħbi huwa inqas problematiku. L-artikolu mhuwiex konsulenza legali.
- Ittestjat għal Odoo 19. Żviluppajna u ttestjajna l-modulu għal Odoo 19.0 Community. Juża għażliet tas-sezzjonijiet li jeżistu f'din il-forma f'Odoo 19. Għal verżjonijiet oħra ma ivverifikajnihx.
Mistoqsijiet frekwenti
Għala għandi bżonn il-modulu jekk Odoo 19 diġà jaf isezzjona?
L-għażliet tas-sezzjonijiet jeżistu f'Odoo nnifsu. Kienet nieqsa r-rabta mas-sett tal-prodotti: Sett kellu jiddaħħal awtomatikament bħala sezzjoni, bil-modalità ta' stampar mniżżla fis-sett. Mingħajr il-modulu wieħed irid joħloq u jikkonfigura l-linja tas-sezzjoni bl-idejn wara kull inserzjoni.
Kif jiddifferenzjaw “Aħbi l-prezzijiet” u “Aħbi l-kompożizzjoni”?
“Aħbi l-prezzijiet” (collapse_prices) iħalli l-linji, iżda ma juri ebda ammont, biss it-total fuq is-sezzjoni. “Aħbi l-kompożizzjoni” (collapse_composition) jaħbi l-linji għal kollox, il-klijent jara biss is-sezzjoni bit-total.
Linja moħbija tingħadd fit-total tal-fattura?
Iva. Il-linji moħbija jibqgħu fit-total, fit-taxxa u fl-entrata kontabbli. Is-sinjal jolqot biss il-preżentazzjoni fuq l-istampa u fil-portal tal-klijent.
Nista' nbiddel il-modalità ta' stampar meta ndaħħal?
Iva. Il-modalità tiġi bħala suġġeriment mis-sett, u fl-assistent tista' tinbidel għal dik l-inserzjoni partikolari. Is-sett innifsu jibqa' bla tibdil.
X'jiġri jekk intefi Daħħal bħala sezzjoni?
Allura l-assistent iġib ruħu bħal fil-modulu OCA sale_product_set: Il-linji tas-sett jiddaħħlu mingħajr sezzjoni.
Il-modulu jinstalla moduli oħra mhux mistennija?
Il-modulu nnifsu le. Fir-repożitorji OCA, madankollu, jistgħu jkunu hemm moduli b'auto_install jekk jitqiegħdu repożitorji sħaħ fl-addons_path. Għalhekk orbot biss iż-żewġ moduli meħtieġa (ara t-taqsima Installazzjoni).
Il-modulu jaħdem ma' Odoo Enterprise?
Il-modulu jiddependi biss minn moduli Community (sale_management, account) u miż-żewġ moduli OCA. Aħna nużawh fuq Odoo 19 Community. Fuq Enterprise ma ttestjajnihx.
Taħt liema liċenzja huwa l-modulu?
Taħt l-AGPL-3. Tistgħu tużawh, tadattawh u tqassmuh, sakemm il-bidliet jibqgħu taħt l-istess liċenzja. Żbalji u suġġerimenti għal titjib huma milqugħa bħala issue fuq repożitorju GitHub .
Appoġġ minn Biricon IT Services
Aħna nieħdu ħsieb installazzjonijiet Odoo għal impriżi żgħar u medji: mill-introduzzjoni, permezz ta' adattamenti u migrazzjonijiet, sat-tħaddim kontinwu. Jekk tixtiequ tadattaw settijiet tal-prodotti, mudelli tal-offerti jew rapporti f'Odoo 19 għall-proċessi tagħkom, jew jekk tixtiequ tivverifikaw modulu bħal dan u ġġibuh b'mod sigur fl-istanza produttiva tagħkom, aħna lesti nassistukom. Żviluppi oħra tagħna stess issibuhom fil-blog tagħna, pereżempju Għaqqad l-abbozzi tal-fatturi u Assenja awtomatikament il-ħlasijiet bankarji lill-fatturi.
Data: 2 ta' Novembru 2026. Verżjoni tal-modulu 19.0.1.0.0. Id-data tal-eżempju fl-illustrazzjonijiet hija magħżula liberament, ammonti netti.