Skip to Content

Odoo 19 Community: Għaqqad il-fatturi abbozzati – il-modulu Open-Source tagħna Merge Draft Invoices

18 ta’ Settembru 2026 by
Odoo 19 Community: Għaqqad il-fatturi abbozzati – il-modulu Open-Source tagħna Merge Draft Invoices
Alexander Biringer | Biricon IT Services GmbH

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:

Odoo 19 Merge Draft Invoices

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_mergeMerge Draft Invoices
Riżultatjiġi mgħaqqad f'waħda mill-fatturi magħżuladejjem fattura ġdida
Linjilinji identiċi jinġabru flimkien, kwantitajiet jiġu miżjudakull linja tiġi meħuda wieħed għal wieħed
Oriġiniinvoice_origin / payment_reference jiġu mwaħħlin flimkien fl-headerqasam tal-oriġini għal kull linja kkupjat permezz tal-hook proprju ta' Odoo _copy_data_extend_business_fields
Reġistrazzjoni tal-ħinmhux meqjusatimesheet_invoice_id jiġi mmuntat mill-ġdid fuq il-fattura l-ġdida
Li jinqara mill-klijentxejnintestatura fuq il-linji ta' kull sors b'ordni u ticket
Fatturi tas-sorsjiġu kkanċellatiikkanċ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:

RabtaTrattament
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 linjaawtomatikament, jekk il-modulu li jipprovdi jimplimenta l-hook ta' Odoo ddokumentat
Oriġini u referenza fl-header tal-fatturamgħaqqda, dedupplikata, editjabbli fl-assistent
Ordni tal-bejgħ: invoice_ids, invoice_status, qty_invoicedjiġ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-helpdeskhuwa marbut mar-reġistrazzjoni tal-ħin u b'hekk jindika awtomatikament lejn il-fattura l-ġdida
ChatterMessaġġ fuq il-fattura l-ġdida bis-sorsi kollha, messaġġ fuq kull sors b'link lejn il-ġdida
merged_into_move_id / merged_from_move_idsrabta 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:

  1. 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
  2. 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"
  3. jekk ma jeżisti la wieħed u la l-ieħor: in-numru tal-fattura tas-sors, imbagħad ir-referenza tagħha
  4. 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:

  1. Ikkopja d-direttorju tal-modulu f'path tal-addons ikkonfigurat.
  2. Aġġorna l-lista tal-apps f'Odoo.
  3. 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.