Skip to Content

Odoo 19 Community: Sameina reikningsdrög – opna hugbúnaðareiningin okkar Merge Draft Invoices

18. september 2026 by
Odoo 19 Community: Sameina reikningsdrög – opna hugbúnaðareiningin okkar Merge Draft Invoices
Alexander Biringer | Biricon IT Services GmbH

Sá sem gefur út reikninga í Odoo út frá pöntunum, Helpdesk-beiðnum og tímaskráningu þekkir niðurstöðuna: Viðskiptavinur fær í lok mánaðar ekki einn reikning, heldur fimm. Hver þeirra er frá annarri pöntun eða beiðni, hver er efnislega réttur – og samt spyr viðskiptavinurinn hvort þetta komist ekki fyrir á einu skjali.

Einmitt fyrir þetta er engin hrein lausn í Odoo 19 Community. Þekkta OCA-einingin account_invoice_merge hefur ekki enn verið gefin út fyrir Odoo 19 og hún leysir vandamálið á hátt sem er alvarleg áhætta fyrir þjónustufyrirtæki: Eins línur eru sameinaðar og þar með glatast tengingin aftur að pöntuninni, verkefninu og skráða tímanum.

Fyrir okkar eigin Odoo-19-Community-uppsetningu höfum við því þróað eininguna Merge Draft Invoices. Þar sem þetta vandamál snertir ekki aðeins okkur, gerum við hana aðgengilega ókeypis á GitHub undir frjálsa AGPL-3-leyfinu.

Að verkefninu á GitHub:

Odoo 19 Merge Draft Invoices

Hvers vegna sérstök eining í stað OCA-lausnarinnar?

OCA hefur árum saman haldið við account_invoice_merge í hugbúnaðarsafninu OCA/account-invoicing. Þegar þessi grein er skrifuð er flutningur yfir í 19.0 þar enn opin Pull Request, ekki útgefin eining.

Mikilvægara er þó að einingarnar tvær gera ólíka hluti:


OCA account_invoice_mergeMerge Draft Invoices
Niðurstaðaer sameinaður í einn af völdum reikningumalltaf nýr reikningur
Línureins línur eru sameinaðar, magn lagt samanhver lína er tekin yfir óbreytt, eitt á móti einu
Uppruniinvoice_origin / payment_reference hengt saman í haus reikningsinsupprunareitir hverrar línu afritaðir með eigin _copy_data_extend_business_fields-krók Odoo
Tímaskráningekki tekin meðtimesheet_invoice_id er fært yfir á nýja reikninginn
Læsilegt fyrir viðskiptavininnekkertfyrirsögn yfir línum hverrar uppsprettu með pöntun og beiðni
Upprunalegir reikningareru felldir niðurfella niður (sjálfgefið), eyða eða halda – með skýrt skilgreindum afleiðingum

Sameining eins lína er afgerandi munurinn. Sameinuð lína getur aðeins haft einn uppruna. Um leið og tvær línur úr tveimur ólíkum pöntunum líta eins út er tengingin frá reikningnum aftur að pöntuninni, verkefninu og tímabókuninni horfin. Í þjónustufyrirtæki þar sem reikningagerð gengur í gegnum beiðni → tímaskráning → reikningur þýðir það: Sömu stundirnar eru annaðhvort rukkaðar tvisvar eða hverfa.

Eining okkar sameinar því í grundvallaratriðum ekkert. Sameinaði reikningurinn hefur nákvæmlega jafn margar línur og uppsprettur hans samanlagt.

Enginn kóði var tekinn úr OCA-einingunni. Báðar einingarnar eru undir AGPL-3.

Hvað einingin gerir

Í reikningslistasýninni eru tvö eða fleiri drög valin, í aðgerðavalmyndinni er valið Sameina reikningsdrög – hjálparhamur sýnir valið, athuganirnar og valkostina fyrir upprunalegu reikningana. Eftir staðfestingu lendir maður beint á nýja reikningnum.

Áður en sameining fer fram athugar einingin – og það öll atriðin í einu, svo maður sjái ekki næstu villu eftir hverja leiðréttingu:

  • að minnsta kosti tveir reikningar valdir
  • allir í stöðunni Drög
  • enginn hefur nokkru sinni verið bókaður (skjal sem sett var aftur í drög heldur bókunarsögu sinni og er hafnað)
  • enginn hefur þegar verið sameinaður
  • allir eru reikningur, innkaupareikningur, kreditreikningur eða kvittun – engar hreinar bókunarfærslur
  • sami viðskiptaaðili, skjalategund, fyrirtæki, gjaldmiðill og færslubók

Mismunur á greiðsluskilmálum, skattaúthlutun, afhendingarheimilisfangi, bankareikningi eða sölumanni hindrar ekki. Hjálparhamurinn varar við og tekur upp gildið úr elsta valda reikningnum.

Hvað varðveitist

Kjarni einingarinnar er að sérhver tenging sem reikningslína hefur við uppruna sinn sé einnig til staðar á nýja reikningnum:

TengingMeðhöndlun
Sölupöntunarlínur (sale_line_ids)afritað fyrir hverja línu með _copy_data_extend_business_fields frá Odoo
Innkaupapöntunarlínur (purchase_line_id)einnig
Dreifing á kostnaðarstaði (analytic_distribution)afritað fyrir hverja línu
aðrir upprunareitir á hverri línusjálfkrafa, ef einingin sem leggur þá til útfærir skjalfesta Odoo-krókinn
Uppruni og tilvísun í haus reikningsinssameinað, án tvítekninga, hægt að breyta í hjálparhamnum
Sölupöntun: invoice_ids, invoice_status, qty_invoicederu reiknuð út frá línunum – pöntunin þekkir nýja reikninginn sjálfkrafa
Tímaskráning (timesheet_invoice_id)er fært yfir á nýja reikninginn áður en uppsprettur verða ógildar
Helpdesk-beiðnihangir á tímaskráningunni og bendir þannig sjálfkrafa á nýja reikninginn
ChatterSkilaboð á nýja reikningnum með öllum uppsprettum, skilaboð á hverri uppsprettu með tengli á nýja reikninginn
merged_into_move_id / merged_from_move_idsvistuð tenging í báðar áttir

Skattalínur, greiðsluskilmálalínur, námundunar- og staðgreiðsluafsláttarlínur eru ekki afritaðar, heldur endurreiknaðar af Odoo út frá innihaldinu. Sameinaði reikningurinn hefur því eina skattalínu fyrir hvert skatthlutfall, ekki eina fyrir hverja uppsprettu. Hann er stofnaður ónúmeraður sem drög; sameiningin sjálf notar ekkert skjalanúmer.

Fyrirsagnir: Viðskiptavinurinn sér hvaðan hver lína kemur

Þetta er eiginleikinn sem gerir gæfumuninn í daglegri notkun. Yfir línum hvers upprunareiknings setur einingin hlutalínu – sama þátt og Odoo notar sjálft fyrir hlutann „Fyrirframgreiðslur“:

BE10181                                     <- Fyrirsögn
  22,500 x Tæknimannstími         3.577,50
                    Millisumma    3.577,50
BE10182 · Beiðni: HT00219                   <- Fyrirsögn
   3,000 x Tæknimannstími           477,00
                    Millisumma      477,00
                      NETTÓUPPHÆÐ 4.054,50

Fyrirsögnin er prentuð á skjalið sem viðskiptavinurinn fær og staðlaða reikningsskýrsla Odoo bætir sjálf við millisummu fyrir hvern hluta. Viðskiptavinurinn sér þannig einnig hvað hver hluti kostaði.

Textinn er settur saman úr því sem uppsprettan raunverulega hefur:

  1. pantanirnar, beint úr tengingum línanna – nöfnin eru því nákvæm; vanti pöntunartengingar er notaður frjáls texti úr invoice_origin
  2. beiðnirnar, fundnar út frá tímaskráningu – birtar sem Beiðni: HT00219 eða Beiðnir: …, takmarkað við fimm auk „og N til viðbótar“
  3. sé hvorugt til: númer upprunareikningsins, síðan tilvísun hans
  4. sé ekkert til: hlutlaust „Aðrar línur“, svo að línur uppsprettu hverfi aldrei þegjandi og hljóðalaust í blokkina fyrir ofan

Það sem vantar er látið vera, ekki búið til. Beiðnin er prentuð með eigin númeri – helpdesk_mgmt-númeri, Enterprise-ticket_ref eða birtingarnafni líkansins – aldrei með auðkenni úr gagnagrunni.

Fyrirsagnirnar eru skrifaðar á tungumáli viðskiptavinarins, eins og Odoo gerir þegar reikningar eru búnir til úr pöntunum. Chatter-inn helst á tungumáli notandans.

Fyrirsögn ber enga vöru, ekkert magn, ekkert verð, engan skatt, engan reikning og enga dreifingu á kostnaðarstaði. Hún getur ekki haft áhrif á summur, skattagrunn og kostnaðarbókhald. Sá sem slekkur á fyrirsögnunum í hjálparhamnum fær nákvæmlega þann reikning sem yrði til án þessa eiginleika – próf ber báðar niðurstöður saman upp á eyri.

Hvað verður um upprunalegu reikningana

Hjálparhamurinn býður upp á þrjá valkosti:

  • Fella niður (sjálfgefið, mælt með). Að fella niður drög hefur engar afleiðingar: ekkert skjalanúmer, engin bókun. Reikningarnir haldast í gagnagrunninum sem niðurfelld skjöl með Chatter og tengli á nýja reikninginn. qty_invoiced á sölupöntuninni sleppir niðurfelldum skjölum, ekkert er talið tvisvar. Þetta er valkosturinn sem er enn rekjanlegur eftir sex mánuði.
  • Eyða. Óafturkræft. Chatter og bakvísun hverfa með færslunni; aðeins skilaboðin á nýja reikningnum standa eftir. Hentar fyrir einnota drög sem enginn á að sjá framar.
  • Skilja eftir sem drög. Uppsprettur haldast opnar. Sölupantanir þeirra telja þá uppsprettu og nýja reikninginn sem reikningsfærða – vinnan lítur út fyrir að vera tvírukkuð þar til einhver hreinsar drögin upp í höndunum. Ætlað fyrir það sjaldgæfa tilvik að vilja bera saman áður en ákvörðun er tekin. Próf festir einmitt þessa tvítalningu í sessi svo hún komi engum á óvart.

Takmarkanir – hvað einingin gerir vísvitandi ekki

Vinsamlegast lesið áður en hún er tekin í notkun í rekstri:

  • Aðeins drög. Bókaðir reikningar eru ekki sameinaðir. Það er verkefni fyrir kreditreikninga, ekki afritunaraðgerð.
  • Drögum sem einu sinni voru bókuð og sett aftur í drög er hafnað. Þau hafa númer og bókunarsögu; að fela það í öðru skjali er ekki eitthvað sem hópaðgerð ætti að gera þegjandi og hljóðalaust.
  • Engin sameining yfir viðskiptaaðila, gjaldmiðla, fyrirtæki eða færslubækur. Ekkert skynsamlegt einstakt gildi er til fyrir það, þess vegna hafnar einingin í stað þess að giska.
  • payment_reference er ekki tekin yfir. Skipulagðar greiðslutilvísanir auðkenna eitt skjal; tvær hengdar saman passa við ekkert hjá bankanum. Nýi reikningurinn fær sína eigin við bókun.
  • Fyrirframgreiðslulínur eru afritaðar eins og hver önnur lína. Innihaldi uppsprettur fyrirframgreiðslulínur úr sale ber að yfirfara niðurstöðuna áður en bókað er.
  • Aðeins timesheet_invoice_id er fært yfir sjálfkrafa. Sérhvert annað líkan með Many2one á account.move (eigin reikningskeyrslur, áskriftartengingar, EDI-sendingar) bendir áfram á uppsprettuna. Fyrir það er krókurinn _merge_draft_relink.
  • Engin sameining eins lína – vísvitandi. Sá sem vill stuttan, snyrtilegan reikning er á röngum stað og myndi greiða fyrir það með upprunatengingunum.
  • Fyrirsagnir verða til einu sinni við sameiningu. Eftir það eru þær venjulegar hlutalínur: hægt að breyta þeim og eyða, og þær uppfærast ekki ef pöntun eða beiðni er endurnefnd síðar.
  • Fyrirsögn nefnir beiðnir alls upprunareikningsins, ekki einstakra lína.

Uppsetning í Odoo 19 Community

Uppsetningin fer fram eins og með venjulega Odoo-viðbótareiningu:

  1. Afrita einingamöppuna í stillta Addons-slóð.
  2. Uppfæra forritalistann í Odoo.
  3. Setja upp eininguna account_invoice_merge_draft.

Einingin er aðeins háð account. Allt sem hún veit um sale, purchase, project, hr_timesheet, sale_timesheet eða Helpdesk-einingu er ákvarðað á keyrslutíma – hún setur sig upp og virkar einnig á hreinum reikningagagnagrunni.

Því næst: Bókhald → Viðskiptavinir → Reikningar (eða Birgjar → Reikningar), velja tvö eða fleiri drög, tannhjólsvalmynd → Sameina reikningsdrög. Aðgerðin stendur öllum notendum með hópinn Reikningagerð / Innheimta til boða.

Sá sem uppfærir úr eldri útgáfu einingarinnar ætti einu sinni að uppfæra með -u account_invoice_merge_draft --i18n-overwrite, svo að breytt reitaheiti skili sér í íslensku þýðinguna. Ný uppsetning er ekki háð því.

Fyrir forritara: API og krókar

Einnig má kalla á sameininguna úr eigin kóða:

python

merged = draft_moves.merge_draft_moves(
    extra_vals={"invoice_date": date(2026, 3, 31), "ref": "Q1"},
    source_handling="cancel",   # "delete" eða "keep"
    add_source_sections=True,   # Fyrirsagnir; sjálfgefið True
)

merge_draft_moves kastar UserError með öllum höfnunarástæðum ef ekki er hægt að sameina valið. _merge_draft_get_errors() skilar sömu ástæðum sem lista án undantekningar.

Sá sem er með eigin bakvísanir í account.move yfirskrifar _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}
        )

Sá sem er með bakvísun á reikningslínunni þarf alls ekki þessa einingu: eigin krókur Odoo account.move.line._copy_data_extend_business_fields nægir og reiturinn er tekinn yfir jafnt við sameiningu, niðurfellingu og afritun. Fyrir aðrar Helpdesk-einingar eða annað orðalag fyrirsagna eru til _merge_draft_get_source_tickets() og _merge_draft_section_name().

Prófað áður en hún fer í keyrslu á raungögnum

48 próf ná yfir blandaða stöðu, ólíka viðskiptaaðila, gjaldmiðla og skjalategundir, línur með og án sölu- eða innkaupapöntunar, skatta, hluta og athugasemdir, dreifingu á kostnaðarstaði, yfirfærslu tímaskráningar, alla þrjá valkostina fyrir upprunalegu reikningana, hjálparhaminn og fyrirsagnirnar – að þær séu sjálfgefið virkar, að slökkt á þeim endurskapi gömlu niðurstöðuna upp á eyri, að fyrirsögn beri hvorki upphæðir né reikninga, að línur einnar uppsprettu haldist saman og að beiðnin birtist með númeri sínu en aldrei með auðkenni úr gagnagrunni.

Prófunargögnin byggjast á fyrirliggjandi bókhaldslykli virka fyrirtækisins í stað AccountTestInvoicingCommon – þessi hjálparhlutur ræsist oft ekki á fluttum raungagnagrunnum og einmitt á slíkum á einingin að keyra.

odoo-bin -d <db> -u account_invoice_merge_draft --test-enable \
         --test-tags /account_invoice_merge_draft --stop-after-init

Eins og með allar viðbætur á sviði bókhalds mælum við með því að uppsetningin sé fyrst prófuð í prófunarumhverfi með afriti af eigin gagnagrunni.

Ókeypis og opinn hugbúnaður fyrir Odoo Community

Hjá Biricon IT Services GmbH þróum við lausnir fyrst og fremst fyrir tilteknar kröfur úr okkar eigin rekstri. Ef úr því verður eining sem nýtist almennt viljum við ekki fela hana í einni uppsetningu.

Merge Draft Invoices er því fáanleg ókeypis sem opið hugbúnaðarverkefni. Frumkóðann má skoða, yfirfara, aðlaga og þróa áfram innan ramma AGPL-3-leyfisins.

Markmið okkar var ekki stysti mögulegi reikningurinn, heldur reikningur þar sem sérhver lína leiðir enn eftir ár aftur til pöntunar sinnar, beiðni sinnar og tímabókunar sinnar.

Verkefni, frumkóði og þátttaka

Allur frumkóðinn, uppsetningarleiðbeiningar og tæknileg skjölun eru aðgengileg á GitHub:

Opna Odoo 19 Merge Draft Invoices á GitHub

Við fögnum reynslusögum úr notkun, villutilkynningum, tillögum að úrbótum og framlögum frá Odoo Community.

Ókeypis. Rekjanlegt. Opinn hugbúnaður. Fyrir Odoo 19 Community.