Mae angen dau beth ar yr un pryd mewn dyfynbris ar unrhyw un sy'n gwerthu pecynnau yn Odoo, megis dyfais fesur gydag ategolion a gwasanaeth gosod, gweithfan gyda chaledwedd a gwasanaeth ffurfweddu, neu becyn cynnal a chadw sy'n cynnwys sawl gwasanaeth: rhaid i gynnwys y pecyn ymddangos yn yr archeb fel bod y warws, y tîm technegol a'r tîm anfonebu yn gwybod beth sydd i'w gyflenwi. Ond nid oes angen dangos pob eitem a phob pris unigol ar y copi printiedig i'r cwsmer bob tro.
Mae modiwl OCA sale_product_set yn caniatáu mewnosod setiau cynhyrchion (rhestrau deunyddiau ar gyfer gwerthu) mewn dyfynbris gydag un clic. Nid yw'n rheoli sut maent yn ymddangos ar y copi printiedig. Dyna pam y gwnaethom ddatblygu'r modiwl Sale Product Set Layout (sale_product_set_layout). Mae wedi'i ysgrifennu ar gyfer Odoo 19 ac ar gael am ddim ar GitHub fel meddalwedd rydd o dan drwydded AGPL-3:
github.com/Alex0176/odoo-sale-product-set-layout
Cynnwys yr erthygl hon
- Y broblem: setiau cynhyrchion heb reolaeth dros eu golwg wrth argraffu
- Beth mae'r modiwl yn ei wneud
- Y tri modd argraffu yn fanwl
- Llinellau cudd a phris sefydlog
- Gweithrediad technegol
- Gosod heb sgil effeithiau diangen
- Defnyddio gam wrth gam
- Profion
- Cyfyngiadau a nodyn cyfreithiol
- Cwestiynau cyffredin
- Cymorth gan Biricon IT Services
Y broblem: setiau cynhyrchion heb reolaeth dros eu golwg wrth argraffu
Yn Odoo, rhestr o gynhyrchion a meintiau wedi'i pharatoi ymlaen llaw yw set cynhyrchion. Yn lle chwilio am ddeg eitem ar wahân, rydych yn dewis Ychwanegu set yn y dyfynbris ac yn cael yr holl linellau ar unwaith. Mae hyn yn arbed amser ac yn atal eitemau rhag cael eu hanghofio. Mae'r modiwl sale_product_set o'r ystorfa OCA/sale-workflow yn gwneud hynny'n union; daw'r setiau eu hunain o product_set yn yr ystorfa OCA/product-attribute.
Yn ymarferol, mae tri diffyg o hyd:
- Dim grwpio amlwg. Mae llinellau'r set yn ymddangos fel eitemau ar wahân yn y dyfynbris. Ar ôl eu mewnosod, ni ellir gweld pa linellau sy'n perthyn i'w gilydd, ac nid yw cyfanswm y set yn ymddangos yn unman.
- Dim rheolaeth dros y copi printiedig. Weithiau dylai'r cwsmer weld pob eitem a'i phris, weithiau dim ond pris y pecyn, ac weithiau dim ond un llinell. Dylid penderfynu hyn fesul set neu fesul cwsmer, heb orfod ei wneud â llaw o'r newydd ar bob dyfynbris.
- Mae addasiadau pris yn edrych yn flêr. Os oes angen pris sefydlog ar becyn sy'n wahanol i gyfanswm y prisiau rhestr, mae angen llinell addasu. Mae hon yn rhan o'r cyfrifiad, ond nid oes angen iddi ymddangos ar gopi'r cwsmer o reidrwydd.
Mae gan Odoo 19 yr elfennau angenrheidiol i ddatrys hyn yn daclus: adrannau ac isadrannau yn llinellau dyfynbris, gyda'r opsiynau Cuddio prisiau a Cuddio cynnwys (y meysydd collapse_prices a collapse_composition). Mae'r modiwl yn cysylltu'r set cynhyrchion â'r opsiynau safonol hyn yn hytrach na chreu fformat argraffu ei hun.
Beth mae'r modiwl yn ei wneud
- Mewnosod set fel adran. Mae'r dewin Ychwanegu set yn creu llinell adran ag enw'r set, er enghraifft 2 × Pecyn mesur safonol, ac yn gosod llinellau'r set oddi tani. Mae adrannau o fewn y set yn troi'n isadrannau.
- Modd argraffu fesul set. Gosodir sut y caiff y set ei hargraffu unwaith yn y set ei hun. Wrth ei mewnosod, gellir newid y modd yn y dewin ar gyfer yr achos hwnnw yn unig.
- Cuddio llinellau. Gellir marcio llinellau unigol yn Peidio ag argraffu (Cudd yn y set). Maent yn cyfrannu at y cyfanswm, ond ni chânt eu hargraffu na'u dangos ym mhorth y cwsmer. Mae'r marc yn cael ei drosglwyddo o'r dyfynbris i'r anfoneb.
- Pris sefydlog fesul llinell set. Gall llinell set gael pris uned sefydlog sy'n disodli'r pris o'r rhestr brisiau, er enghraifft ar gyfer addasiad pris cudd.
Heb y modiwl (dim ond sale_product_set) | Gyda sale_product_set_layout |
|---|---|
| Llinellau'r set fel eitemau ar wahân | Llinell adran ag enw'r set, y nifer yn yr enw, a'r llinellau oddi tani |
| Mae adrannau yn y set yn aros yn adrannau ac yn torri'r strwythur | Mae adrannau yn y set yn troi'n isadrannau (line_subsection) |
| Yr un olwg wrth argraffu bob tro | Modd argraffu fesul set, y gellir ei newid wrth fewnosod |
| Addasiad pris yn weladwy ar y dyfynbris a'r anfoneb | Gellir cuddio'r llinell, ond mae'n dal i gyfrannu at y cyfanswm |
| Pris o'r rhestr brisiau yn unig | Pris sefydlog dewisol fesul llinell set |
| Mae'r cynllun yn berthnasol i'r dyfynbris yn unig | Mae'r cynllun a'r cuddio yn berthnasol i'r dyfynbris, yr archeb, yr anfoneb a phorth y cwsmer |
Y tri modd argraffu yn fanwl
Maes dewis print_mode ar y set cynhyrchion yw'r modd argraffu. Wrth fewnosod, caiff ei drosi'n osodiadau'r ddau switsh safonol ar linell yr adran. Mae'r modiwl yn defnyddio un mapio hawdd ei ddarllen ar gyfer hyn:
# Modd argraffu -> (collapse_prices, collapse_composition) llinell yr adran
PRINT_MODE_FLAGS = {
"detailed": (False, False),
"total_only": (True, False),
"summary": (False, True),
}
Modd (print_mode) | Dangos yn y set | Opsiwn safonol yn Odoo | Golwg wrth argraffu |
|---|---|---|---|
detailed | Pob llinell â phris | dim | Adran, pob llinell â swm |
total_only | Llinellau heb brisiau, dim ond cyfanswm y set | collapse_prices (Cuddio prisiau) | Adran â chyfanswm, llinellau â disgrifiad a maint yn unig |
summary | Un llinell yn unig â chyfanswm y set | collapse_composition (Cuddio cynnwys) | Dim ond llinell yr adran â'r cyfanswm |
Gan fod y modiwl yn defnyddio opsiynau safonol Odoo 19 yn hytrach na'i fformat argraffu ei hun, mae'r dyfynbris, cadarnhad yr archeb, yr anfoneb a phorth y cwsmer yn gweithio heb addasu templedi adroddiadau. Bydd templedi adroddiadau personol sy'n ystyried opsiynau'r adrannau yn ymddwyn yr un fath hefyd.
Llinellau cudd a phris sefydlog
Achos cyffredin: mae pris pecyn yn is na chyfanswm prisiau'r eitemau unigol. Yn hytrach na newid y prisiau unigol yn artiffisial, defnyddir llinell addasu â phris sefydlog (er enghraifft −50,00 € fesul set) a'i chuddio. Mae'r cyfrifiad yn glir yn y rhyngwyneb gweinyddol, a phris y pecyn sy'n ymddangos ar y copi printiedig.
Mae'n bwysig deall: nid yw'r marc hide_in_report yn newid y cyfrifiad o gwbl. Mae Odoo safonol yn dal i gyfrifo'r maint, y pris, y disgownt, y dreth, y cyfansymiau a'r cofnodion cyfrifyddu yn yr un modd. Dim ond yn y copi printiedig a'r porth y mae'r llinell yn cael ei hepgor.
- Ar y set cynhyrchion: llinell set â Cudd ac, yn ddewisol, Pris sefydlog ynghyd â Pris uned.
- Ar linellau dyfynbris ac anfoneb: colofn Peidio ag argraffu (
hide_in_report), hefyd ar gyfer llinellau arferol nad ydynt yn rhan o set. - Trosglwyddo: wrth greu'r anfoneb o'r archeb, caiff y marc ei drosglwyddo i linell yr anfoneb. Fe'i cedwir wrth gopïo dyfynbris.
Gweithrediad technegol
Mae'r modiwl yn fach yn fwriadol: mae'n ymestyn modelau presennol ac yn diystyru dim ond y mannau lle mae Odoo yn penderfynu pa linellau i'w hargraffu a sut i fewnosod set. Nid oes templedi adroddiadau newydd, modelau newydd nac ymyriadau SQL.
Modelau a meysydd estynedig
| Model | Ychwanegiad |
|---|---|
product.set | Meysydd insert_as_section (Boole, ymlaen yn ddiofyn) a print_mode (dewis, maes gorfodol, detailed yn ddiofyn) |
product.set.line | Meysydd hide_in_report, fixed_price, price_unit; mae prepare_sale_order_line_values() yn eu trosglwyddo i linell y dyfynbris |
sale.product.set.wizard | Meysydd insert_as_section, section_name, print_mode; mae _prepare_order_lines() yn creu llinell yr adran |
sale.order / sale.order.line | Maes hide_in_report (gyda copy=True); mae _get_order_lines_to_report() yn hepgor llinellau cudd; mae _prepare_invoice_line() yn trosglwyddo'r marc |
account.move / account.move.line | Maes hide_in_report; mae _get_move_lines_to_report(), _get_detailed_lines() a _get_subsection_lines() yn hidlo llinellau cudd allan; mae _get_aml_vals() yn cynnwys y marc yn nata'r adroddiad |
Cuddio yn y dyfynbris
Mae Odoo 19 yn pennu pa linellau dyfynbris i'w hargraffu yn _get_order_lines_to_report(). Mae'r modiwl yn ychwanegu hidlydd yno. Nid oes angen newid templed yr adroddiad: mae templed adroddiad y dyfynbris (sale/report/ir_actions_report_templates.xml) a thempled y porth (sale/views/sale_portal_templates.xml) ill dau yn galw'r dull hwn:
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
)
Trosglwyddo i'r anfoneb
Wrth greu llinell yr anfoneb o linell y dyfynbris (_prepare_invoice_line()), caiff y marc ei gopïo. Ar ochr yr anfoneb yn Odoo 19, mae sawl llwybr i linellau gyrraedd yr adroddiad: y brif restr, llinellau adran a llinellau isadran. Felly mae'r modiwl yn hidlo mewn sawl man (_get_move_lines_to_report() ar y ddogfen, _get_detailed_lines() a _get_subsection_lines() ar y llinell), neu gallai llinell gudd ailymddangos drwy un o'r llwybrau eraill:
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")]
Y dewin: adran yn lle llinellau ar wahân
Mae'r dewin sale.product.set.wizard o sale_product_set yn creu llinellau'r dyfynbris yn _prepare_order_lines(). Mae'r modiwl yn diystyru'r dull hwn. Os yw Mewnosod fel adran wedi'i ddiffodd, mae'n galw'r dull gwreiddiol yn syml, gan gadw'r un ymddygiad â modiwl OCA. Fel arall, caiff llinell yr adran ei chreu gyntaf gyda'r ddau switsh safonol, ac yna llinellau'r set. Mae adrannau o fewn y set yn troi'n isadrannau er mwyn peidio â thorri'r prif strwythur:
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
Penderfyniadau y tu ôl i'r llenni
- Dulliau cyfrifo ar wahân yn y dewin. Mae gan enw'r adran, y modd argraffu a Mewnosod fel adran eu dull
computeeu hunain (store=True,readonly=False). Pe bai'r tri yn rhannu'r un dull, byddai gwerth a basiwyd yn benodol i un maes yn ailosod y lleill. Mae hyn yn arbennig o amlwg wrth greu'r dewin gyda gwerthoedd drwy god neu brofion. - Enw'r adran yn cynnwys y nifer. Os nad yw'r nifer yn hafal i 1, mae'n ymddangos yn yr enw (2 × Pecyn mesur safonol, gyda choma yn wahanydd degol), fel ei bod yn glir ar y copi printiedig mai dwy set sydd yno yn hytrach nag un set â dwywaith y cynnwys.
- Pris sefydlog ar linellau cynhyrchion yn unig. Dim ond os nad yw llinell y set yn llinell adran neu nodyn y mae
prepare_sale_order_line_values()yn gosodhide_in_reportaprice_unit. - Odoo safonol yn lle datrysiad pwrpasol. Mae'r modd argraffu a'r cuddio yn defnyddio bachau a meysydd presennol Odoo 19. Mae hyn yn gwneud diweddariadau'n haws eu rheoli: os yw Odoo yn newid templed yr adroddiad, mae'r modiwl yn dal yn ddilys cyhyd â bod y dulliau'n parhau i fodoli.
Gosod heb sgil effeithiau diangen
Gofynion: Odoo 19.0, sale_product_set (OCA/sale-workflow, cangen 19.0) a product_set (OCA/product-attribute, cangen 19.0). Mae'r modiwl ei hun yn dibynnu ar sale_management, sale_product_set ac account.
Trap auto_install gyda modiwlau OCA. Mae llawer o ystorfeydd OCA yn cynnwys modiwlau gydag auto_install. Cyn gynted ag y bydd eu dibyniaethau ar gael, mae Odoo yn eu gosod heb ofyn wrth y gosod neu'r diweddaru nesaf. Felly, pwy bynnag sy'n rhoi'r ystorfa OCA gyfan yn yr addons_path o enghraifft gynhyrchiol, efallai y caiff fodiwlau nad oedd neb eu heisiau. Gydag OCA/product-attribute, mae hyn yn effeithio, er enghraifft, ar purchase_product_template_tags. Ein dull gweithredu:
- Cloniwch y ddwy ystorfa OCA yn fas (
git clone --depth 1 --branch 19.0). - Mewn cyfeiriadur ar wahân, crëwch ddolenni symbolaidd at y ddau fodiwl sydd eu hangen yn unig, ac ychwanegwch y cyfeiriadur hwnnw at
addons_path, yn hytrach na’r ystorfeydd cyfan. - Gosodwch ar gronfa ddata brawf a gwiriwch pa fodiwlau sy’n cael y statws wedi’i osod yn ystod y broses.
- Dim ond wedyn y dylech ei osod yn yr amgylchedd cynhyrchu, gyda
--workers=0, fel nad yw’r gorchymyn yn cystadlu â’r gwasanaeth sy’n rhedeg am y porth HTTP.
odoo-bin -c /etc/odoo/odoo.conf -d <datenbank> -i sale_product_set_layout --stop-after-init
Ar ôl gosod, mae’r meysydd a’r golygon newydd yn y gronfa ddata. Os yw’r gwasanaeth yn rhedeg gyda phrosesau lluosog, bydd y prosesau gweithiol yn ail-lwytho’r gofrestrfa sydd wedi newid drwy signal y gronfa ddata. Dim ond ar ôl ailgychwyn y gwasanaeth y daw newidiadau i ffeiliau Python y modiwl i rym.
Defnyddio gam wrth gam
- Creu set: Gwerthu → Cynhyrchion → Setiau cynhyrchion. Rhowch enw i’r set, dewiswch Mewnosod fel adran a’r Modd argraffu, ac ychwanegwch y cynhyrchion a’u meintiau. Marciwch linellau cywiro fel Cudd a Pris sefydlog.
- Yn y dyfynbris: Cliciwch Ychwanegu set, a dewiswch y set a’r maint. Gallwch newid enw’r adran a’r modd argraffu cyn mewnosod.
- Cuddio llinellau unigol: Galluogwch y golofn Peidio ag argraffu yn y dyfynbris neu’r anfoneb.
- Gwirio: Agorwch y rhagolwg neu’r PDF. Mae cwsmeriaid yn gweld yr un cyflwyniad yn y porth.
Profion
Mae’r modiwl yn cynnwys chwe phrawf awtomataidd, yr ydym yn eu rhedeg yn erbyn cronfa ddata brawf cyn rhoi unrhyw beth ar waith yn yr amgylchedd cynhyrchu:
- Mewnosod fel adran, gan gynnwys modd argraffu ac isadran
- Llinell gudd wedi’i hepgor o’r llinellau i’w hargraffu
- Modd Un llinell (
summary) - Mewnosod heb adran, sef yr ymddygiad gwreiddiol
- Mae’r anfoneb yn etifeddu’r dangosydd
hide_in_report, mae’r llinell wedi’i hepgor o_get_move_lines_to_report(), ac mae cyfanswm yr adran yn dal i’w chynnwys - Nid yw anfoneb yn y modd Cyfanswm y pris yn unig yn dangos y llinell gudd ymhlith llinellau’r adran, ond mae cyfanswm yr adran yn aros yn gyflawn
odoo-bin -d <testdatenbank> -i sale_product_set_layout \
--test-enable --test-tags=/sale_product_set_layout --stop-after-init
Mae’r cyfieithiad Almaeneg yn i18n/de.po.
Cyfyngiadau a nodyn cyfreithiol
- Cynllun yn unig. Nid yw’r modiwl yn newid sut mae Odoo yn cyfrifo prisiau, gostyngiadau na threthi. Dim ond yr hyn sy’n cael ei argraffu a’i ddangos yn y porth y mae’n ei newid.
- Mae llinellau cudd yn weladwy yn y rhyngwyneb gweinyddol. Mae’r dangosydd yn effeithio ar yr allbrint a’r porth, nid ar yr hyn y mae staff yn ei weld ar y sgrin.
- Gwirio manylion anfonebau. Mae llinellau cudd yn cyfrif tuag at y cyfanswm, ond nid ydynt yn ymddangos ar y ddogfen. Dylech gadarnhau â’ch ymgynghorydd treth cyn defnyddio hyn ar anfonebau a yw’n cydymffurfio â gofynion anfonebu eich gwlad, er enghraifft y gofyniad i ddisgrifio’r nwyddau a gyflenwyd neu’r gwasanaethau a ddarparwyd. Mae cuddio llinellau ar ddyfynbrisiau yn peri llai o broblemau. Nid cyngor cyfreithiol yw’r erthygl hon.
- Wedi’i brofi ar gyfer Odoo 19. Datblygwyd a phrofwyd y modiwl gennym ar gyfer Odoo 19.0 Community. Mae’n defnyddio opsiynau adrannau sydd ar gael yn y ffurf hon yn Odoo 19. Nid ydym wedi’i brofi ar gyfer fersiynau eraill.
Cwestiynau cyffredin
Pam mae angen y modiwl arnaf os yw Odoo 19 eisoes yn cefnogi adrannau?
Mae’r opsiynau adrannau ar gael yn Odoo ei hun. Yr hyn oedd ar goll oedd y cysylltiad â’r set cynhyrchion: dylai set gael ei mewnosod yn awtomatig fel adran, gyda’r modd argraffu sydd wedi’i gadw yn y set. Heb y modiwl, mae’n rhaid creu a ffurfweddu llinell yr adran â llaw ar ôl pob mewnosodiad.
Beth yw’r gwahaniaeth rhwng “Cuddio prisiau” a “Cuddio cynnwys y set”?
Mae “Cuddio prisiau” (collapse_prices) yn cadw’r llinellau ond nid yw’n dangos unrhyw symiau, dim ond cyfanswm yr adran. Mae “Cuddio cynnwys y set” (collapse_composition) yn cuddio’r llinellau’n gyfan gwbl; dim ond yr adran a’i chyfanswm y mae’r cwsmer yn eu gweld.
A yw llinell gudd yn cyfrif tuag at gyfanswm yr anfoneb?
Ydy. Mae llinellau cudd yn dal i gael eu cynnwys yn y cyfanswm, y dreth a’r cofnod cyfrifyddu. Dim ond y cyflwyniad ar yr allbrint ac ym mhorth y cwsmer y mae’r dangosydd yn effeithio arno.
A allaf newid y modd argraffu wrth fewnosod?
Gallwch. Daw’r modd diofyn o’r set, a gellir ei newid yn y dewin ar gyfer pob mewnosodiad unigol. Nid yw hyn yn newid y set ei hun.
Beth sy’n digwydd os byddaf yn diffodd Mewnosod fel adran?
Yna mae’r dewin yn ymddwyn fel ym modiwl OCA sale_product_set: caiff llinellau’r set eu mewnosod heb adran.
A yw’r modiwl yn gosod modiwlau ychwanegol yn annisgwyl?
Nid y modiwl ei hun. Fodd bynnag, gydag ystorfeydd OCA, gall modiwlau auto_install gael eu gosod os ydych yn rhoi ystorfeydd cyfan yn addons_path. Felly, crëwch ddolenni at y ddau fodiwl sydd eu hangen yn unig (gweler yr adran Gosod).
A yw’r modiwl yn gweithio gydag Odoo Enterprise?
Dim ond ar fodiwlau Community (sale_management, account) a’r ddau fodiwl OCA y mae’r modiwl yn dibynnu. Rydym yn ei ddefnyddio ar Odoo 19 Community. Nid ydym wedi’i brofi ar Enterprise.
O dan ba drwydded mae’r modiwl ar gael?
O dan AGPL-3. Cewch ei ddefnyddio, ei addasu a’i ailddosbarthu, ar yr amod bod unrhyw newidiadau yn aros o dan yr un drwydded. Mae croeso i chi roi gwybod am wallau a chynnig gwelliannau drwy agor mater yn yr ystorfa GitHub yn cael eu croesawu.
Cymorth gan Biricon IT Services
Rydym yn rheoli gosodiadau Odoo ar gyfer busnesau bach a chanolig: o’u cyflwyno, eu haddasu a’u mudo i’w rhedeg o ddydd i ddydd. Os hoffech addasu setiau cynhyrchion, templedi dyfynbrisiau neu adroddiadau yn Odoo 19 i weddu i’ch prosesau, neu os ydych am werthuso modiwl fel hwn a’i roi ar waith yn ddiogel yn eich amgylchedd cynhyrchu, byddwn yn falch o’ch helpu. Fe welwch ragor o’n datblygiadau ein hunain ar ein blog, er enghraifft Cyfuno anfonebau drafft a Cysylltu taliadau banc ag anfonebau’n awtomatig.
Dyddiad: 2 Tachwedd 2026. Fersiwn y modiwl 19.0.1.0.0. Mae data enghreifftiol y delweddau wedi'u dewis yn rhydd, symiau net.