Mae unrhyw un sy'n anfonebu yn Odoo ar sail archebion, tocynnau desg gymorth a chofnodion amser yn gyfarwydd â'r canlyniad: mae cwsmer yn cael pum anfoneb ar ddiwedd y mis yn hytrach nag un. Mae pob un yn deillio o archeb neu docyn gwahanol, ac mae pob un yn gywir – ond mae'r cwsmer yn dal i ofyn a fyddai modd rhoi'r cyfan ar un ddogfen.
Nid oes ateb boddhaol i'r union broblem hon yn Odoo 19 Community. Nid yw'r modiwl OCA adnabyddus account_invoice_merge wedi'i ryddhau ar gyfer Odoo 19 eto, ac mae'n datrys y broblem mewn ffordd sy'n peri risg ddifrifol i ddarparwyr gwasanaethau: mae eitemau unfath yn cael eu cyfuno, gan golli'r cysylltiad yn ôl â'r archeb, y dasg a'r amser a gofnodwyd.
Dyna pam y gwnaethom ddatblygu'r modiwl Merge Draft Invoices ar gyfer ein gosodiad Odoo 19 Community ein hunain. Gan nad ni yn unig sy'n wynebu'r broblem hon, rydym yn ei ddarparu am ddim ar GitHub o dan y drwydded rydd AGPL-3.
Y prosiect ar GitHub:
Pam datblygu ein modiwl ein hunain yn lle defnyddio ateb OCA?
Mae OCA wedi cynnal account_invoice_merge yn ystorfa OCA/account-invoicing ers blynyddoedd lawer. Ar adeg ysgrifennu'r erthygl hon, cais tynnu agored yw'r mudo i 19.0 yno o hyd, yn hytrach na modiwl sydd wedi'i ryddhau.
Ond yr hyn sy'n bwysicach yw bod y ddau fodiwl yn gwneud pethau gwahanol:
| OCA account_invoice_merge | Merge Draft Invoices | |
|---|---|---|
| Canlyniad | cyfuno i mewn i un o'r anfonebau a ddewiswyd | anfoneb newydd bob tro |
| Eitemau | cyfunir eitemau unfath ac adio'r meintiau | trosglwyddir pob eitem yn union fel y mae |
| Tarddiad | cydgysylltu invoice_origin / payment_reference yn y pennyn | Meysydd tarddiad wedi’u copïo ar gyfer pob llinell drwy fachyn _copy_data_extend_business_fields Odoo ei hun |
| Cofnodi amser | heb ei ystyried | mae timesheet_invoice_id yn cael ei ailgysylltu â’r anfoneb newydd |
| Clir i’r cwsmer | dim byd | pennawd uwchben llinellau pob ffynhonnell sy’n nodi’r archeb a’r tocyn |
| Anfonebau ffynhonnell | yn cael eu canslo | canslo (diofyn), dileu neu gadw – gyda’r canlyniadau wedi’u nodi’n glir |
Cyfuno llinellau unfath yw’r gwahaniaeth allweddol. Dim ond un tarddiad y gall llinell gyfunol ei gadw. Cyn gynted ag y bydd dwy linell o ddwy archeb wahanol yn edrych yr un fath, mae’r cysylltiad o’r anfoneb yn ôl at yr archeb, y dasg a’r cofnod amser yn diflannu. Mewn busnes gwasanaethau lle mae’r broses filio’n dilyn tocyn → cofnodi amser → anfoneb, mae hynny’n golygu bod yr un oriau’n cael eu bilio ddwywaith neu’n diflannu.
Dyna pam nad yw ein modiwl byth yn cyfuno llinellau. Mae gan yr anfoneb gyfunol yr union un nifer o linellau â’i hanfonebau ffynhonnell gyda’i gilydd.
Ni ddefnyddiwyd unrhyw god o fodiwl OCA. Mae’r ddau fodiwl o dan AGPL-3.
Beth mae’r modiwl yn ei wneud
Yn y wedd rhestr anfonebau, dewiswch ddwy anfoneb ddrafft neu fwy, yna dewiswch Cyfuno anfonebau drafft yn y ddewislen gweithredoedd – bydd dewin yn dangos y dewis, y gwiriadau a’r opsiynau ar gyfer yr anfonebau ffynhonnell. Ar ôl cadarnhau, cewch eich tywys yn syth at yr anfoneb newydd.
Cyn cyfuno, mae’r modiwl yn gwirio’r holl bwyntiau canlynol ar unwaith, fel nad ydych yn gweld y gwall nesaf ar ôl pob cywiriad:
- o leiaf ddwy anfoneb wedi’u dewis
- pob un â’r statws Drafft
- dim un wedi’i phostio erioed (mae dogfen sydd wedi’i hailosod yn ddrafft yn cadw ei hanes postio ac yn cael ei gwrthod)
- dim un wedi’i chyfuno eisoes
- pob un yn anfoneb, anfoneb cyflenwr, nodyn credyd neu dderbynneb – dim cofnodion dyddlyfr plaen
- yr un partner, math o ddogfen, cwmni, arian cyfred a dyddlyfr
Nid yw gwahaniaethau o ran telerau talu, sefyllfa dreth, cyfeiriad danfon, cyfrif banc neu werthwr yn atal y cyfuno. Mae’r dewin yn rhoi rhybudd ac yn defnyddio gwerth yr anfoneb hynaf a ddewiswyd.
Beth sy’n cael ei gadw
Craidd y modiwl yw bod pob cysylltiad rhwng llinell anfoneb a’i tharddiad yn bodoli ar yr anfoneb newydd hefyd:
| Cysylltiad | Sut mae’n cael ei drin |
|---|---|
| Llinellau archeb werthu (sale_line_ids) | wedi’u copïo ar gyfer pob llinell drwy _copy_data_extend_business_fields Odoo |
| Llinellau archeb brynu (purchase_line_id) | yn yr un modd |
| Dosbarthiad canolfannau cost (analytic_distribution) | wedi’i gopïo ar gyfer pob llinell |
| meysydd tarddiad eraill ar bob llinell | yn awtomatig, os yw’r modiwl sy’n eu darparu yn gweithredu’r bachyn Odoo sydd wedi’i ddogfennu |
| Tarddiad a chyfeirnod ym mhennyn yr anfoneb | wedi’u cyfuno, gyda dyblygiadau wedi’u tynnu, a gellir eu golygu yn y dewin |
| Archeb werthu: invoice_ids, invoice_status, qty_invoiced | yn cael eu cyfrifo o’r llinellau – mae’r archeb yn adnabod yr anfoneb newydd yn awtomatig |
| Cofnodi amser (timesheet_invoice_id) | yn cael ei ailgysylltu â’r anfoneb newydd cyn i’r anfonebau ffynhonnell fynd yn annilys |
| Tocyn desg gymorth | wedi’i gysylltu â’r cofnod amser ac felly’n cyfeirio’n awtomatig at yr anfoneb newydd |
| Chatter | Neges ar yr anfoneb newydd sy’n rhestru’r holl ffynonellau, a neges ar bob ffynhonnell gyda dolen i’r anfoneb newydd |
| merged_into_move_id / merged_from_move_ids | cysylltiad wedi’i storio i’r ddau gyfeiriad |
Nid yw llinellau treth, llinellau telerau talu, llinellau talgrynnu na llinellau disgownt am dalu’n gynnar yn cael eu copïo; mae Odoo yn eu hailgyfrifo o’r cynnwys. Felly mae gan yr anfoneb gyfunol un llinell dreth fesul cyfradd dreth, yn hytrach nag un fesul ffynhonnell. Caiff ei chreu fel drafft heb rif; nid yw’r cyfuno ei hun yn defnyddio rhif dogfen.
Penawdau: mae’r cwsmer yn gweld o ble y daeth pob llinell
Dyma’r nodwedd sy’n gwneud gwahaniaeth wrth weithio o ddydd i ddydd. Uwchben llinellau pob anfoneb ffynhonnell, mae’r modiwl yn gosod llinell adran – yr un elfen y mae Odoo ei hun yn ei defnyddio ar gyfer yr adran “Blaendaliadau”:
BE10181 <- Pennawd
22,500 x Awr technegydd 3.577,50
Is-gyfanswm 3.577,50
BE10182 · Tocyn: HT00219 <- Pennawd
3,000 x Awr technegydd 477,00
Is-gyfanswm 477,00
SWM NET 4.054,50
Caiff y pennawd ei argraffu ar y ddogfen y mae’r cwsmer yn ei derbyn, ac mae adroddiad anfoneb safonol Odoo yn ychwanegu is-gyfanswm ar gyfer pob adran yn awtomatig. Felly mae’r cwsmer hefyd yn gweld faint gostiodd pob rhan.
Mae’r label yn cael ei lunio o’r wybodaeth sydd gan y ffynhonnell mewn gwirionedd:
- yr archebion, yn uniongyrchol o gysylltiadau’r llinellau – felly mae’r enwau’n fanwl gywir; os nad oes cysylltiadau ag archebion, defnyddir y testun rhydd o invoice_origin
- y tocynnau, a ganfyddir drwy’r cofnodion amser – wedi’u dangos fel Tocyn: HT00219 neu Tocynnau: …, hyd at bump ynghyd ag “a N arall”
- os nad oes yr un o’r ddau: rhif yr anfoneb ffynhonnell, yna ei chyfeirnod
- os nad oes dim o gwbl: y label niwtral “Llinellau ychwanegol”, fel na fydd llinellau ffynhonnell byth yn cael eu llyncu’n ddisylw gan y bloc uwchben
Caiff gwybodaeth sydd ar goll ei hepgor, nid ei dyfeisio. Caiff y tocyn ei argraffu â’i rif ei hun – rhif helpdesk_mgmt, ticket_ref Enterprise neu enw arddangos y model – byth ag ID y gronfa ddata.
Mae’r penawdau’n cael eu hysgrifennu yn iaith y cwsmer, fel y mae Odoo yn ei wneud wrth greu anfonebau o archebion. Mae Chatter yn aros yn iaith y defnyddiwr.
Nid oes gan bennawd gynnyrch, maint, pris, treth, cyfrif na dosbarthiad canolfannau cost. Ni all effeithio ar gyfansymiau, y sylfaen dreth na chyfrifyddu costau. Os byddwch yn diffodd y penawdau yn y dewin, cewch yr union anfoneb a fyddai wedi’i chreu heb y nodwedd hon – mae prawf yn cymharu’r ddau ganlyniad hyd at y geiniog.
Beth sy’n digwydd i’r anfonebau ffynhonnell
Mae’r dewin yn cynnig tri opsiwn:
- Canslo (diofyn, argymhellir). Nid oes unrhyw oblygiadau i ganslo drafft: dim rhif dogfen, dim postiad. Mae’r anfonebau’n aros yn y gronfa ddata fel dogfennau wedi’u canslo, gyda Chatter a dolen i’r anfoneb newydd. Mae qty_invoiced ar yr archeb werthu yn anwybyddu dogfennau wedi’u canslo, felly nid oes dim yn cael ei gyfrif ddwywaith. Dyma’r opsiwn y bydd modd olrhain yr hyn a ddigwyddodd gydag ef hyd yn oed ymhen chwe mis.
- Dileu. Yn anadferadwy. Mae'r Chatter a'r cyfeirnod yn ôl yn diflannu gyda'r cofnod; dim ond y neges ar yr anfoneb newydd sy'n aros. Yn ddefnyddiol ar gyfer drafftiau tafladwy na ddylai neb eu gweld mwyach.
- Gadael fel drafft. Mae’r anfonebau ffynhonnell yn aros ar agor. Yna mae eu harchebion gwerthu yn cyfrif y ffynhonnell a’r anfoneb newydd fel rhai sydd wedi’u hanfonebu – mae’n ymddangos bod y gwaith wedi’i filio ddwywaith nes i rywun dacluso’r drafftiau â llaw. Bwriedir hyn ar gyfer yr achos prin lle rydych am gymharu cyn penderfynu. Mae prawf yn cofnodi’r union gyfrif dwbl hwn fel nad yw’n peri syndod i neb.
Cyfyngiadau – beth nad yw’r modiwl yn ei wneud, a hynny’n fwriadol
Darllenwch hwn cyn ei ddefnyddio mewn amgylchedd byw:
- Dim ond drafftiau. Nid yw anfonebau wedi’u postio yn cael eu cyfuno. Mae angen nodiadau credyd ar gyfer hynny, nid gweithred gopïo.
- Gwrthodir drafftiau sydd wedi’u postio o’r blaen ac yna’u hailosod. Mae ganddynt rif a hanes postio; ni ddylai gweithred swp guddio hynny mewn dogfen arall yn ddisylw.
- Dim cyfuno rhwng gwahanol bartneriaid, arian cyfred, cwmnïau neu ddyddlyfrau. Nid oes un gwerth synhwyrol i’w ddefnyddio ar eu cyfer, felly mae’r modiwl yn gwrthod yn hytrach na dyfalu.
- Nid yw payment_reference yn cael ei drosglwyddo. Mae cyfeirnodau talu strwythuredig yn adnabod un ddogfen; ni fydd dau wedi’u cysylltu â’i gilydd yn cyfateb i ddim yn y banc. Mae’r anfoneb newydd yn cael ei chyfeirnod ei hun wrth ei phostio.
- Caiff llinellau blaendal eu copïo fel unrhyw linell arall. Os yw’r ffynonellau’n cynnwys llinellau blaendal o sale, rhaid gwirio’r canlyniad cyn postio.
- Dim ond timesheet_invoice_id sy’n cael ei ailgysylltu’n awtomatig. Mae pob model arall sydd â Many2one at account.move (rhediadau bilio personol, cysylltiadau tanysgrifio, trosglwyddiadau EDI) yn parhau i gyfeirio at y ffynhonnell. Mae’r bachyn _merge_draft_relink ar gael ar gyfer hynny.
- Dim cyfuno llinellau unfath – a hynny’n fwriadol. Nid dyma’r modiwl ar gyfer rhywun sydd am gael anfoneb fer a thaclus, gan mai colli’r cysylltiadau â’r tarddiad fyddai’r pris am hynny.
- Caiff penawdau eu creu unwaith wrth gyfuno. Ar ôl hynny, llinellau adran arferol ydynt: gellir eu golygu a’u dileu, ac nid ydynt yn cael eu diweddaru os caiff archeb neu docyn ei ailenwi’n ddiweddarach.
- Mae pennawd yn rhestru tocynnau’r anfoneb ffynhonnell gyfan, nid rhai’r llinell unigol.
Gosod yn Odoo 19 Community
Mae’r broses osod yr un fath ag ar gyfer modiwl ychwanegol arferol yn Odoo:
- Copïwch gyfeiriadur y modiwl i lwybr ychwanegion sydd wedi’i ffurfweddu.
- Diweddarwch y rhestr apiau yn Odoo.
- Gosodwch y modiwl account_invoice_merge_draft.
Dim ond ar account y mae’r modiwl yn dibynnu. Mae popeth y mae’n ei wybod am sale, purchase, project, hr_timesheet, sale_timesheet neu fodiwl desg gymorth yn cael ei ganfod wrth redeg – mae hefyd yn gosod ac yn gweithio ar gronfa ddata bilio yn unig.
Yna: Cyfrifyddu → Cwsmeriaid → Anfonebau (neu Cyflenwyr → Anfonebau), dewiswch ddwy anfoneb ddrafft neu fwy, dewislen yr olwyn ddannog → Cyfuno anfonebau drafft. Mae’r weithred ar gael i bob defnyddiwr yn y grŵp Bilio / Anfonebu.
Os ydych yn uwchraddio o fersiwn gynharach o’r modiwl, dylech ddiweddaru unwaith gyda -u account_invoice_merge_draft --i18n-overwrite er mwyn i’r labeli meysydd sydd wedi newid gael eu cynnwys yn y cyfieithiad Almaeneg. Nid yw hyn yn effeithio ar osodiad newydd.
I ddatblygwyr: API a bachau
Gallwch hefyd alw’r weithred gyfuno o’ch cod eich hun:
python
merged = draft_moves.merge_draft_moves(
extra_vals={"invoice_date": date(2026, 3, 31), "ref": "Q1"},
source_handling="cancel", # "delete" neu "keep"
add_source_sections=True, # Penawdau; True yn ddiofyn
)
Mae merge_draft_moves yn codi UserError gyda’r holl resymau dros wrthod os na ellir cyfuno’r dewis. Mae _merge_draft_get_errors() yn dychwelyd yr un rhesymau fel rhestr heb godi eithriad.
Os oes gennych ôl-gyfeiriadau eich hun at account.move, ailddiffiniwch y dull _merge_draft_relink:
python
class AccountMove(models.Model):
_inherit = "account.move"
def _merge_draft_relink(self, new_move):
super()._merge_draft_relink(new_move)
if "my_move_id" not in self.env["my.model"]._fields:
return
self.env["my.model"].search([("my_move_id", "in", self.ids)]).write(
{"my_move_id": new_move.id}
)
Os oes gennych ôl-gyfeiriad ar linell yr anfoneb, nid oes angen y modiwl hwn o gwbl: mae bachyn account.move.line._copy_data_extend_business_fields Odoo ei hun yn ddigon, a bydd y maes yn cael ei drosglwyddo wrth gyfuno, canslo a dyblygu fel ei gilydd. Ar gyfer modiwlau desg gymorth eraill neu eiriad gwahanol ar gyfer y penawdau, mae _merge_draft_get_source_tickets() a _merge_draft_section_name() ar gael.
Wedi’i brofi cyn ei redeg ar ddata byw
Mae 48 o brofion yn cwmpasu statysau cymysg, gwahanol bartneriaid, arian cyfred a mathau o ddogfennau, llinellau gydag archeb werthu neu brynu a hebddynt, trethi, adrannau a nodiadau, dosbarthiadau canolfannau cost, ailgysylltu cofnodion amser, y tri opsiwn ar gyfer yr anfonebau ffynhonnell, y dewin a’r penawdau – eu bod wedi’u galluogi’n ddiofyn, bod eu diffodd yn atgynhyrchu’r hen ganlyniad hyd at y geiniog, nad oes gan bennawd symiau na chyfrifon, bod llinellau ffynhonnell yn aros gyda’i gilydd, a bod y tocyn yn ymddangos â’i rif ei hun a byth ag ID y gronfa ddata.
Mae’r data prawf yn seiliedig ar siart cyfrifon presennol y cwmni gweithredol yn hytrach nag ar AccountTestInvoicingCommon – yn aml nid yw’r cymorthydd hwn yn cychwyn ar gronfeydd data byw sydd wedi’u mudo, a dyna’r union gronfeydd data y bwriedir i’r modiwl redeg arnynt.
odoo-bin -d <db> -u account_invoice_merge_draft --test-enable \
--test-tags /account_invoice_merge_draft --stop-after-init
Fel gydag unrhyw estyniad ym maes cyfrifyddu, rydym yn argymell profi’r gosodiad yn gyntaf mewn amgylchedd prawf gyda chopi o’ch cronfa ddata eich hun.
Am ddim a chod agored ar gyfer Odoo Community
Yn Biricon IT Services GmbH, rydym yn datblygu atebion yn gyntaf i fodloni gofynion penodol ein busnes ein hunain. Pan fydd hynny’n arwain at fodiwl y gall eraill ei ddefnyddio, nid ydym am ei guddio mewn un gosodiad yn unig.
Dyna pam mae Merge Draft Invoices ar gael am ddim fel prosiect cod agored. Gellir gweld, archwilio, addasu a datblygu’r cod ffynhonnell ymhellach o dan delerau trwydded AGPL-3.
Ein nod oedd creu anfoneb lle byddai modd olrhain pob llinell yn ôl at ei harcheb, ei thocyn a’i chofnod amser hyd yn oed ymhen blwyddyn, yn hytrach na chreu’r anfoneb fyrraf bosibl.
Y prosiect, y cod ffynhonnell a chyfrannu
Mae’r cod ffynhonnell llawn, y cyfarwyddiadau gosod a’r ddogfennaeth dechnegol ar gael ar GitHub:
Agor Odoo 19 Merge Draft Invoices ar GitHub
Rydym yn croesawu profiadau o ddefnydd ymarferol, adroddiadau am wallau, awgrymiadau ar gyfer gwella a chyfraniadau gan gymuned Odoo.
Am ddim. Yn olrheiniadwy. Cod agored. Ar gyfer Odoo 19 Community.