Min jagħmel il-fatturazzjoni f'Odoo minn ordnijiet, tickets tal-helpdesk u reġistrazzjoni tal-ħin, jaf ir-riżultat: Klijent fi tmiem ix-xahar ma jirċievix fattura waħda, iżda ħamsa. Kull waħda toriġina minn ordni jew ticket differenti, kull waħda hija korretta fil-kontenut – u xorta l-klijent jistaqsi jekk dan ma jistax jitpoġġa f'dokument wieħed.
Eżattament għal dan, f'Odoo 19 Community m'hemm l-ebda soluzzjoni nadifa. Il-modulu magħruf OCA account_invoice_merge għadu mhux rilaxxat għal Odoo 19, u jsolvi l-problema b'mod li jirrappreżenta riskju serju għal min jipprovdi servizzi: Linji identiċi jiġu miġbura flimkien, u b'hekk tintilef ir-rabta lura mal-ordni, mal-kompitu u mal-ħin irreġistrat.
Għall-installazzjoni tagħna stess ta' Odoo 19 Community żviluppajna għalhekk il-modulu Merge Draft Invoices. Billi din il-problema mhix tagħna biss, nipprovduh b'xejn fuq GitHub taħt il-liċenzja ħielsa AGPL-3.
Għall-proġett fuq GitHub:
Għaliex modulu proprju minflok is-soluzzjoni OCA?
L-OCA ilha snin twal żżomm account_invoice_merge fir-repożitorju OCA/account-invoicing. Fiż-żmien ta' dan l-artikolu, il-migrazzjoni għal 19.0 hemmhekk għadha Pull Request miftuħ, mhux modulu ppubblikat.
Aktar importanti, madankollu, huwa li ż-żewġ moduli jagħmlu affarijiet differenti:
| OCA account_invoice_merge | Merge Draft Invoices | |
|---|---|---|
| Riżultat | jiġi mgħaqqad f'waħda mill-fatturi magħżula | dejjem fattura ġdida |
| Linji | linji identiċi jinġabru flimkien, kwantitajiet jiġu miżjuda | kull linja tiġi meħuda wieħed għal wieħed |
| Oriġini | invoice_origin / payment_reference jiġu mwaħħlin flimkien fl-header | qasam tal-oriġini għal kull linja kkupjat permezz tal-hook proprju ta' Odoo _copy_data_extend_business_fields |
| Reġistrazzjoni tal-ħin | mhux meqjusa | timesheet_invoice_id jiġi mmuntat mill-ġdid fuq il-fattura l-ġdida |
| Li jinqara mill-klijent | xejn | intestatura fuq il-linji ta' kull sors b'ordni u ticket |
| Fatturi tas-sors | jiġu kkanċellati | ikkanċella (default), ħassar jew żomm – b'konsegwenzi mniżżla b'mod ċar |
Il-ġbir flimkien ta' linji identiċi huwa d-differenza deċiżiva. Linja miġbura flimkien tista' ġġorr oriġini waħda biss. Hekk kif żewġ linji minn żewġ ordnijiet differenti jidhru l-istess, ir-rabta mill-fattura lura mal-ordni, mal-kompitu u mar-reġistrazzjoni tal-ħin tmur. F'negozju tas-servizzi, fejn il-fatturazzjoni tgħaddi minn Ticket → Reġistrazzjoni tal-ħin → Fattura, dan ifisser: L-istess sigħat jiġu fatturati darbtejn jew jisparixxu.
Il-modulu tagħna għalhekk bażikament ma jiġbor xejn flimkien. Il-fattura mgħaqqda għandha eżattament daqs linji kemm għandhom is-sorsi tagħha flimkien.
Ma ttieħed l-ebda kodiċi mill-modulu OCA. Iż-żewġ moduli huma taħt AGPL-3.
Dak li jagħmel il-modulu
Fil-veduta tal-lista tal-fatturi immarka żewġ abbozzi jew aktar, fil-menu tal-azzjonijiet agħżel Għaqqad il-fatturi abbozzati – assistent juri l-għażla, il-verifiki u l-għażliet għall-fatturi tas-sors. Wara l-konferma tasal direttament fuq il-fattura l-ġdida.
Qabel l-għaqda, il-modulu jivverifika, u jagħmel dan fuq il-punti kollha f'daqqa waħda, biex wieħed ma jarax l-iżball li jmiss wara kull korrezzjoni:
- mill-inqas żewġ fatturi magħżula
- kollha fl-istatus Abbozz
- ebda waħda ma ġiet irreġistrata qatt (dokument irrisettjat għal abbozz iżomm l-istorja tar-reġistrazzjoni tiegħu u jiġi miċħud)
- ebda waħda ma ġiet diġà mgħaqqda
- kollha huma fattura, fattura tal-fornitur, nota ta' kreditu jew irċevuta – mhux sempliċi entrati tal-ġurnal
- l-istess sieħeb, tip ta' dokument, kumpanija, munita u ġurnal
Differenzi fil-kundizzjonijiet tal-ħlas, fl-assenjazzjoni tat-taxxa, fl-indirizz tal-kunsinna, fil-kont tal-bank jew fil-bejjiegħ ma jiblokkawx. L-assistent iwissi u jieħu l-valur tal-eqdem fattura magħżula.
Dak li jibqa' miżmum
Il-qalba tal-modulu hija li kull rabta li għandha linja tal-fattura mal-oriġini tagħha teżisti wkoll fuq il-fattura l-ġdida:
| Rabta | Trattament |
|---|---|
| Linji tal-ordni tal-bejgħ (sale_line_ids) | ikkupjati għal kull linja permezz ta' _copy_data_extend_business_fields ta' Odoo |
| Linji tal-ordni tax-xiri (purchase_line_id) | bl-istess mod |
| Distribuzzjoni taċ-ċentri tal-ispejjeż (analytic_distribution) | ikkupjata għal kull linja |
| oqsma oħra tal-oriġini għal kull linja | awtomatikament, jekk il-modulu li jipprovdi jimplimenta l-hook ta' Odoo ddokumentat |
| Oriġini u referenza fl-header tal-fattura | mgħaqqda, dedupplikata, editjabbli fl-assistent |
| Ordni tal-bejgħ: invoice_ids, invoice_status, qty_invoiced | jiġu kkalkulati mil-linji – l-ordni tagħraf il-fattura l-ġdida waħedha |
| Reġistrazzjoni tal-ħin (timesheet_invoice_id) | jiġi mmuntat mill-ġdid fuq il-fattura l-ġdida, qabel ma s-sorsi jsiru invalidi |
| Ticket tal-helpdesk | huwa marbut mar-reġistrazzjoni tal-ħin u b'hekk jindika awtomatikament lejn il-fattura l-ġdida |
| Chatter | Messaġġ fuq il-fattura l-ġdida bis-sorsi kollha, messaġġ fuq kull sors b'link lejn il-ġdida |
| merged_into_move_id / merged_from_move_ids | rabta maħżuna fiż-żewġ direzzjonijiet |
Linji tat-taxxa, linji tal-kundizzjonijiet tal-ħlas, linji tat-tondjar u tal-iskont ma jiġux ikkupjati, iżda jiġu kkalkulati mill-ġdid minn Odoo mill-kontenut. Il-fattura mgħaqqda għalhekk għandha linja tat-taxxa waħda għal kull rata tat-taxxa, mhux waħda għal kull sors. Tinħoloq bħala abbozz bla numru; l-għaqda nnifisha ma tikkonsmax numru ta' dokument.
Intestaturi: Il-klijent jara minn fejn toriġina kull linja
Din hija l-funzjoni li tagħmel id-differenza fl-użu ta' kuljum. Fuq il-linji ta' kull fattura tas-sors il-modulu jpoġġi linja ta' sezzjoni – l-istess element li Odoo stess juża għas-sezzjoni „Avvanzi":
BE10181 <- Intestatura
22,500 x Siegħa tat-tekniku 3.577,50
Subtotal 3.577,50
BE10182 · Ticket: HT00219 <- Intestatura
3,000 x Siegħa tat-tekniku 477,00
Subtotal 477,00
AMMONT NETT 4.054,50
L-intestatura tiġi stampata fuq id-dokument li jirċievi l-klijent, u r-rapport standard tal-fatturi ta' Odoo jżid waħdu subtotal għal kull sezzjoni. Il-klijent jara b'hekk ukoll kemm swiet kull parti.
It-tikketta tinħoloq minn dak li għandu fil-fatt is-sors:
- l-ordnijiet, direttament mir-rabtiet tal-linji – l-ismijiet huma għalhekk eżatti; jekk ir-rabtiet tal-ordni jkunu nieqsa, jintuża t-test liberu minn invoice_origin
- it-tickets, determinati permezz tar-reġistrazzjoni tal-ħin – maħruġin bħala Ticket: HT00219 jew Tickets: …, limitati għal ħamsa flimkien ma' „u N oħra"
- jekk ma jeżisti la wieħed u la l-ieħor: in-numru tal-fattura tas-sors, imbagħad ir-referenza tagħha
- jekk ma jeżisti xejn: „Linji oħra" newtrali, biex il-linji ta' sors ma jisparixxux qatt bil-kwiet fil-blokk ta' fuqhom
Dak li jonqos jitħalla barra, ma jiġix maħluq. It-ticket jiġi stampat bin-numru tiegħu stess – in-numru ta' helpdesk_mgmt, ticket_ref ta' Enterprise jew l-isem murija tal-mudell – qatt mal-ID tad-database.
L-intestaturi jinkitbu fil-lingwa tal-klijent, bħalma jagħmel Odoo meta joħloq fatturi minn ordnijiet. Il-Chatter jibqa' fil-lingwa tal-utent.
Intestatura ma ġġorr l-ebda prodott, l-ebda kwantità, l-ebda prezz, l-ebda taxxa, l-ebda kont u l-ebda distribuzzjoni taċ-ċentri tal-ispejjeż. Ma tistax tinfluwenza t-totali, il-bażi tat-taxxa u l-kontabilità tal-ispejjeż. Min jitfi l-intestaturi fl-assistent, jirċievi eżattament il-fattura li kienet tinħoloq mingħajr din il-funzjoni – test jqabbel iż-żewġ riżultati sa ċenteżmu.
Dak li jiġri bil-fatturi tas-sors
L-assistent joffri tliet għażliet:
- Ikkanċella (default, rakkomandat). Il-kanċellazzjoni ta' abbozz m'għandha l-ebda konsegwenzi: l-ebda numru ta' dokument, l-ebda reġistrazzjoni. Il-fatturi jibqgħu fid-database bħala dokumenti kkanċellati bil-Chatter u b'link lejn il-fattura l-ġdida. qty_invoiced fl-ordni tal-bejgħ jaqbeż id-dokumenti kkanċellati, xejn ma jingħadd darbtejn. Din hija l-għażla li tibqa' tista' titfassal anke wara sitt xhur.
- Ħassar. Irrevokabbli. Il-Chatter u r-rabta lura jmutu mar-rekord; jibqa' biss il-messaġġ fuq il-fattura l-ġdida. Utli għal abbozzi li jintremew u li ħadd ma jrid jarahom aktar.
- Ħalli bħala abbozz. Is-sorsi jibqgħu miftuħa. L-ordnijiet tal-bejgħ tagħhom imbagħad jgħoddu s-sors u l-fattura l-ġdida bħala fatturati – ix-xogħol jidher fatturat darbtejn sakemm xi ħadd inaddaf l-abbozzi bl-idejn. Maħsuba għall-każ rari li wieħed ikun irid iqabbel qabel ma jiddeċiedi. Test jirreġistra eżattament dan l-għadd doppju, biex ma jiżgħoqx lil ħadd.
Limiti – dak li l-modulu intenzjonalment ma jagħmilx
Jekk jogħġbok aqra qabel l-użu produttiv:
- Abbozzi biss. Fatturi rreġistrati ma jiġux mgħaqqda. Din hija ħidma ta' noti ta' kreditu, mhux proċess ta' kopjar.
- Abbozzi darba rreġistrati u rrisettjati jiġu miċħuda. Għandhom numru u storja ta' reġistrazzjoni; li wieħed jaħbi dan f'dokument ieħor mhuwiex xi ħaġa li azzjoni kollettiva għandha tagħmel bil-kwiet.
- L-ebda għaqda bejn sieħba, muniti, kumpaniji jew ġurnali differenti. M'hemm l-ebda valur uniku sensibbli għal dan, u għalhekk il-modulu jirrifjuta minflok ma jaħseb.
- payment_reference ma tittiħidx. Referenzi strutturati tal-ħlas jidentifikaw dokument; tnejn imwaħħlin flimkien ma jaqblu ma' xejn fil-bank. Il-fattura l-ġdida tirċievi tagħha stess meta tiġi rreġistrata.
- Linji ta' avvanz jiġu kkupjati bħal kull linja oħra. Jekk is-sorsi jinkludu linji ta' avvanz minn sale, ir-riżultat għandu jiġi vverifikat qabel ir-reġistrazzjoni.
- timesheet_invoice_id biss jiġi mmuntat mill-ġdid awtomatikament. Kull mudell ieħor b'Many2one fuq account.move (proċessi tal-fatturazzjoni proprji, rabtiet ta' abbonamenti, trasmissjonijiet EDI) ikompli jipponta lejn is-sors. Għal dan hemm il-hook _merge_draft_relink.
- L-ebda ġbir flimkien ta' linji identiċi – intenzjonalment. Min irid fattura qasira u nadifa, qiegħed fil-post ħażin hawnhekk u jħallas għal dan bir-rabtiet tal-oriġini.
- L-intestaturi jinħolqu darba waħda waqt l-għaqda. Wara dan huma linji normali ta' sezzjoni: editjabbli, jistgħu jitħassru u ma jiġux aġġornati jekk l-ordni jew it-ticket jiġu rinominati aktar tard.
- Intestatura tsemmi t-tickets tal-fattura tas-sors kollha, mhux tal-linja individwali.
Installazzjoni f'Odoo 19 Community
L-installazzjoni ssir bħal f'kull modulu addizzjonali tas-soltu ta' Odoo:
- Ikkopja d-direttorju tal-modulu f'path tal-addons ikkonfigurat.
- Aġġorna l-lista tal-apps f'Odoo.
- Installa l-modulu account_invoice_merge_draft.
Il-modulu jiddependi biss minn account. Dak kollu li jaf dwar sale, purchase, project, hr_timesheet, sale_timesheet jew modulu tal-helpdesk jiġi determinat fil-runtime – jinstalla u jaħdem anke fuq database tal-fatturazzjoni pura.
Wara: Kontabilità → Klijenti → Fatturi (jew Fornituri → Fatturi), immarka żewġ abbozzi jew aktar, menu tar-rota tal-ingranaġġ → Għaqqad il-fatturi abbozzati. L-azzjoni hija disponibbli għall-utenti kollha bil-grupp Fatturazzjoni / Billing.
Min jaġġorna minn verżjoni preċedenti tal-modulu, għandu darba waħda jaġġorna b'-u account_invoice_merge_draft --i18n-overwrite, biex it-tibdil fit-tikketti tal-oqsma jidħol fit-traduzzjoni bil-Ġermaniż. Installazzjoni ġdida ma tiġix affettwata minn dan.
Għall-iżviluppaturi: API u hooks
L-għaqda tista' tiġi msejħa wkoll minn kodiċi proprju:
python
merged = draft_moves.merge_draft_moves(
extra_vals={"invoice_date": date(2026, 3, 31), "ref": "Q1"},
source_handling="cancel", # "delete" jew "keep"
add_source_sections=True, # Intestaturi; default True
)
merge_draft_moves jitfa' UserError bir-raġunijiet kollha tar-rifjut, jekk l-għażla ma tistax tiġi mgħaqqda. _merge_draft_get_errors() jirritorna l-istess raġunijiet bħala lista mingħajr eċċezzjoni.
Min għandu referenzi lura proprji lejn account.move, jissostitwixxi _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}
)
Min għandu referenza lura fuq il-linja tal-fattura, ma jeħtieġ dan il-modulu xejn: il-hook proprju ta' Odoo account.move.line._copy_data_extend_business_fields huwa biżżejjed, u l-qasam jittieħed bl-istess mod mal-għaqda, mal-kanċellazzjoni u mad-duplikazzjoni. Għal moduli oħra tal-helpdesk jew formulazzjoni oħra tal-intestaturi hemm _merge_draft_get_source_tickets() u _merge_draft_section_name().
Ittestjat qabel ma jaħdem fuq dejta produttiva
48 test ikopru status imħallat, sieħba differenti, muniti u tipi ta' dokumenti, linji b'ordni tal-bejgħ jew tax-xiri u mingħajrha, taxxi, sezzjonijiet u noti, distribuzzjonijiet taċ-ċentri tal-ispejjeż, il-muntar mill-ġdid tar-reġistrazzjoni tal-ħin, it-tliet għażliet kollha għall-fatturi tas-sors, l-assistent u l-intestaturi – li huma attivi b'mod default, li t-tfiġġija tagħhom tirriproduċi r-riżultat l-antik sa ċenteżmu, li intestatura ma ġġorr l-ebda ammonti jew kontijiet, li l-linji ta' sors jibqgħu flimkien, li t-ticket jidher bin-numru tiegħu u qatt bl-ID tad-database.
Id-dejta tat-test tibni fuq il-pjan tal-kontijiet eżistenti tal-kumpanija attiva minflok fuq AccountTestInvoicingCommon – dan l-helper spiss ma jibdiex fuq databases produttivi mmigrati, u eżattament fuq dawn il-modulu suppost jaħdem.
odoo-bin -d <db> -u account_invoice_merge_draft --test-enable \
--test-tags /account_invoice_merge_draft --stop-after-init
Bħal b'kull estensjoni fil-qasam tal-kontabilità, nirrakkomandaw li l-installazzjoni tiġi vverifikata l-ewwel f'ambjent tat-test b'kopja tad-database tiegħek stess.
B'xejn u Open Source għall-Odoo Community
Aħna f'Biricon IT Services GmbH niżviluppaw soluzzjonijiet l-ewwel għal rekwiżiti konkreti mill-operat tagħna stess. Meta minn dan jinħoloq modulu li jista' jintuża b'mod ġenerali, ma rridux inħabbuh f'installazzjoni waħda.
Merge Draft Invoices għalhekk huwa disponibbli b'xejn bħala proġett Open Source. Il-kodiċi sors jista' jiġi eżaminat, vverifikat, adattat u żviluppat aktar fil-qafas tal-liċenzja AGPL-3.
L-għan tagħna ma kienx l-iqsar fattura possibbli, iżda fattura li fiha, anke f'sena, kull linja xorta twassal lura għall-ordni tagħha, għat-ticket tagħha u għar-reġistrazzjoni tal-ħin tagħha.
Proġett, kodiċi sors u kollaborazzjoni
Il-kodiċi sors sħiħ, in-noti dwar l-installazzjoni u d-dokumentazzjoni teknika huma disponibbli fuq GitHub:
Iftaħ Odoo 19 Merge Draft Invoices fuq GitHub
Nilqgħu b'ferħ esperjenzi prattiċi, rapporti ta' żbalji, suġġerimenti għal titjib u kontribuzzjonijiet mill-Odoo Community.
B'xejn. Li jista' jitfassal. Open Source. Għal Odoo 19 Community.