Məzmuna keçin

Odoo 19 Community: qaralama hesab-fakturaların birləşdirilməsi — açıq mənbəli Merge Draft Invoices modulumuz

18 sentyabr 2026 tərəfindən
Odoo 19 Community: qaralama hesab-fakturaların birləşdirilməsi — açıq mənbəli Merge Draft Invoices modulumuz
Alexander Biringer | Biricon IT Services GmbH

Odoo-da sifarişlər, dəstək sorğuları və iş vaxtı qeydləri əsasında faktura hazırlayanlar nəticəni yaxşı bilirlər: müştəri ayın sonunda bir faktura əvəzinə beş faktura alır. Hər biri ayrı bir sifarişə və ya sorğuya aiddir, hər biri məzmun baxımından düzgündür, amma müştəri yenə də bunların hamısını bir sənəddə birləşdirməyin mümkün olub-olmadığını soruşur.

Odoo 19 Community-də məhz bunun üçün tam uyğun bir həll yoxdur. Tanınmış OCA modulu account_invoice_merge hələ Odoo 19 üçün istifadəyə buraxılmayıb. Üstəlik, bu modul problemi xidmət göstərən şirkətlər üçün ciddi risk yaradan üsulla həll edir: eyni sətirlər birləşdirilir və nəticədə sifariş, tapşırıq və qeydə alınmış iş vaxtı ilə əlaqə itir.

Buna görə öz Odoo 19 Community sistemimiz üçün Merge Draft Invoices modulunu hazırladıq. Bu problemlə təkcə biz qarşılaşmadığımız üçün modulu azad AGPL-3 lisenziyası ilə GitHub-da ödənişsiz təqdim edirik.

GitHub-dakı layihəyə keçid:

Odoo 19 Merge Draft Invoices

Niyə OCA həlli əvəzinə öz modulumuzu hazırladıq?

OCA uzun illərdir OCA/account-invoicing repozitoriyasında account_invoice_merge modulunu dəstəkləyir. Bu yazının hazırlandığı vaxt 19.0 versiyasına keçid hələ açıq bir Pull Request mərhələsindədir; modul yayımlanmayıb.

Daha vacib məqam isə bu iki modulun fərqli işlər görməsidir:


OCA account_invoice_mergeMerge Draft Invoices
Nəticəseçilmiş fakturalardan birində birləşdirilirhəmişə yeni faktura yaradılır
Sətirləreyni sətirlər birləşdirilir, miqdarlar toplanırhər sətir olduğu kimi köçürülür
Mənbəinvoice_origin / payment_reference başlıq hissəsində birləşdirilirhər sətrin mənbə sahələri Odoo-nun öz _copy_data_extend_business_fields genişləndirmə nöqtəsi vasitəsilə köçürülür
İş vaxtının uçotunəzərə alınmırtimesheet_invoice_id yeni hesab-fakturaya bağlanır
Müştəri üçün aydınlıqheç nəhər mənbənin sətirlərinin üstündə sifariş və sorğu göstərilən başlıq
Mənbə hesab-fakturalarləğv edilirləğv etmək (standart), silmək və ya saxlamaq — hər seçimin nəticələri aydın göstərilir

Əsas fərq eyni sətirlərin birləşdirilməsidir. Birləşdirilmiş sətir yalnız bir mənbəyə bağlı ola bilər. İki müxtəlif sifarişdən gələn iki sətir eyni görünən kimi hesab-fakturadan sifarişə, tapşırığa və iş vaxtı qeydinə aparan əlaqə itir. Hesablaşmanın sorğu → iş vaxtının uçotu → hesab-faktura ardıcıllığı ilə aparıldığı xidmət müəssisəsində bu, eyni saatların iki dəfə hesablanması və ya uçotdan itməsidir.

Buna görə modulumuz heç bir sətri birləşdirmir. Birləşdirilmiş hesab-fakturada sətirlərin sayı mənbə hesab-fakturalardakı sətirlərin cəminə tam bərabər olur.

OCA modulundan heç bir kod götürülməyib. Hər iki modul AGPL-3 lisenziyası ilə yayımlanır.

Modul nə edir

Hesab-fakturaların siyahısında iki və ya daha çox qaralama seçin, əməliyyatlar menyusundan Qaralama hesab-fakturaları birləşdir seçin — köməkçi pəncərə seçilmiş sənədləri, yoxlamaları və mənbə hesab-fakturalar üçün seçimləri göstərir. Təsdiqdən sonra birbaşa yeni hesab-faktura açılır.

Hər düzəlişdən sonra növbəti xəta ilə qarşılaşmamaq üçün modul birləşdirmədən əvvəl bütün şərtləri eyni vaxtda yoxlayır:

  • ən azı iki hesab-faktura seçilib
  • hamısı Qaralama statusundadır
  • heç biri əvvəllər mühasibat uçotuna işlənməyib (qaralama statusuna qaytarılmış sənəd uçota işlənmə tarixçəsini saxlayır və qəbul edilmir)
  • heç biri əvvəllər birləşdirilməyib
  • hamısı müştəri hesab-fakturası, təchizatçı hesab-fakturası, kredit-nota və ya qəbzdir — sırf mühasibat yazılışları deyil
  • tərəfdaş, sənəd növü, şirkət, valyuta və jurnal eynidir

Ödəniş şərtləri, vergi uyğunlaşdırması, çatdırılma ünvanı, bank hesabı və ya satıcı ilə bağlı fərqlər birləşdirməyə mane olmur. Köməkçi pəncərə xəbərdarlıq edir və seçilmiş ən köhnə hesab-fakturanın dəyərini götürür.

Nələr qorunub saxlanılır

Modulun əsas prinsipi hesab-faktura sətrini mənbəyinə bağlayan bütün əlaqələrin yeni hesab-fakturada da saxlanılmasıdır:

Əlaqəİşlənmə qaydası
Satış sifarişinin sətirləri (sale_line_ids)hər sətir üçün Odoo-nun _copy_data_extend_business_fields mexanizmi vasitəsilə köçürülür
Satınalma sifarişinin sətirləri (purchase_line_id)eyni qaydada
Xərc mərkəzləri üzrə bölgü (analytic_distribution)hər sətir üçün köçürülür
hər sətrin digər mənbə sahələribu sahələri təmin edən modul sənədləşdirilmiş Odoo genişləndirmə nöqtəsini tətbiq edirsə, avtomatik köçürülür
Hesab-fakturanın başlıq hissəsində mənbə və istinadbirləşdirilir, təkrarlar silinir, köməkçi pəncərədə redaktə edilə bilir
Satış sifarişi: invoice_ids, invoice_status, qty_invoicedsətirlər əsasında hesablanır — sifariş yeni hesab-fakturanı avtomatik tanıyır
İş vaxtının uçotu (timesheet_invoice_id)mənbələr etibarsız olmamışdan əvvəl yeni hesab-fakturaya bağlanır
Dəstək sorğusuiş vaxtının uçotuna bağlı olduğu üçün avtomatik olaraq yeni hesab-fakturaya istinad edir
Chatteryeni hesab-fakturada bütün mənbələr göstərilən mesaj, hər mənbədə isə yeni hesab-fakturaya keçidi olan mesaj yaradılır
merged_into_move_id / merged_from_move_idshər iki istiqamətdə saxlanılan əlaqə

Vergi, ödəniş şərtləri, yuvarlaqlaşdırma və erkən ödəniş endirimi sətirləri köçürülmür; Odoo onları məzmuna əsasən yenidən hesablayır. Beləliklə, birləşdirilmiş hesab-fakturada hər mənbə üçün deyil, hər vergi dərəcəsi üçün bir vergi sətri olur. Yeni hesab-faktura nömrəsiz qaralama kimi yaradılır; birləşdirmə əməliyyatı sənəd nömrəsi sərf etmir.

Başlıqlar: müştəri hər sətrin haradan gəldiyini görür

Gündəlik işdə fərq yaradan funksiya budur. Modul hər mənbə hesab-fakturanın sətirlərinin üstündə bölmə sətri yaradır — Odoo-nun özünün “Avans ödənişləri” bölməsi üçün istifadə etdiyi elementin eynisini:

BE10181                                     <- Başlıq
  22,500 x Texnikin iş saatı      3.577,50
                        Ara cəm   3.577,50
BE10182 · Sorğu: HT00219                    <- Başlıq
   3,000 x Texnikin iş saatı        477,00
                        Ara cəm     477,00
                      XALİS MƏBLƏĞ 4.054,50

Başlıq müştəriyə verilən sənəddə çap olunur, Odoo-nun standart hesab-faktura hesabatı isə hər bölmə üçün avtomatik ara cəm əlavə edir. Beləliklə, müştəri hər hissənin neçəyə başa gəldiyini də görür.

Başlıq mənbədə həqiqətən mövcud olan məlumatlardan formalaşdırılır:

  1. sifarişlər birbaşa sətirlərdəki əlaqələrdən götürülür — buna görə adlar dəqiq olur; sifariş əlaqələri yoxdursa, invoice_origin sahəsindəki sərbəst mətn istifadə edilir
  2. sorğular iş vaxtının uçotu vasitəsilə müəyyənləşdirilir — “Sorğu: HT00219” və ya “Sorğular: …” şəklində göstərilir; ən çox beş sorğu sadalanır, qalanları üçün “və daha N sorğu” əlavə edilir
  3. bunların heç biri yoxdursa: mənbə hesab-fakturanın nömrəsi, o da yoxdursa, istinadı
  4. heç bir məlumat yoxdursa: mənbənin sətirlərinin fərq edilmədən yuxarıdakı bloka qarışmaması üçün neytral “Digər sətirlər” başlığı

Olmayan məlumat buraxılır, uydurulmur. Sorğu öz nömrəsi ilə çap olunur — helpdesk_mgmt nömrəsi, Enterprise-ticket_ref və ya modelin görünən adı ilə; verilənlər bazasındakı ID-si ilə heç vaxt çap olunmur.

Başlıqlar müştərinin dilində yazılır — Odoo sifarişlərdən hesab-faktura yaradarkən də belə edir. Chatter istifadəçinin dilində qalır.

Başlıqda məhsul, miqdar, qiymət, vergi, hesab və ya xərc mərkəzləri üzrə bölgü olmur. O, yekun məbləğlərə, vergitutma bazasına və xərclərin uçotuna təsir edə bilməz. Köməkçi pəncərədə başlıqları söndürdükdə bu funksiya olmadan yaranacaq hesab-faktura ilə tam eyni nəticə alınır — test hər iki nəticəni sentinə qədər müqayisə edir.

Mənbə hesab-fakturalarla nə baş verir

Köməkçi pəncərə üç seçim təklif edir:

  • Ləğv etmək (standart, tövsiyə olunur). Qaralamanın ləğvi əlavə nəticə doğurmur: sənəd nömrəsi verilmir, mühasibat yazılışı yaranmır. Hesab-fakturalar Chatter və yeni hesab-fakturaya keçidlə birlikdə verilənlər bazasında ləğv edilmiş sənədlər kimi qalır. Satış sifarişindəki qty_invoiced ləğv edilmiş sənədləri nəzərə almır, heç nə iki dəfə sayılmır. Bu seçim altı ay sonra da baş verənləri izləməyə imkan verir.
  • Silmək. Geri qaytarılmır. Qeydlə birlikdə Chatter və geriyə istinad da silinir; yalnız yeni hesab-fakturadakı mesaj qalır. Artıq heç kimin görməsinə ehtiyac olmayan müvəqqəti qaralamalar üçün uyğundur.
  • Qaralama kimi saxlamaq. Mənbələr açıq qalır. Bu halda onların satış sifarişləri həm mənbəni, həm də yeni hesab-fakturanı fakturalaşdırılmış sayır — kimsə qaralamaları əl ilə qaydaya salana qədər iş iki dəfə hesablanmış kimi görünür. Bu seçim qərar verməzdən əvvəl müqayisə aparmaq lazım gələn nadir hallar üçün nəzərdə tutulub. Məhz bu ikiqat sayılma testdə təsbit edilir ki, heç kim üçün gözlənilməz olmasın.

Məhdudiyyətlər — modulun qəsdən etmədikləri

İş mühitində istifadə etməzdən əvvəl oxuyun:

  • Yalnız qaralamalar. Mühasibat uçotuna işlənmiş hesab-fakturalar birləşdirilmir. Bunun üçün kredit-nota əməliyyatı tələb olunur, köçürmə əməliyyatı deyil.
  • Əvvəllər uçota işlənmiş, sonra qaralamaya qaytarılmış sənədlər qəbul edilmir. Onların nömrəsi və uçota işlənmə tarixçəsi var; bunları başqa sənəddə gizlətmək toplu əməliyyatın səssizcə görməli olduğu iş deyil.
  • Fərqli tərəfdaşlar, valyutalar, şirkətlər və ya jurnallar üzrə birləşdirmə aparılmır. Bunlar üçün məntiqli vahid dəyər seçmək mümkün olmadığından modul təxmin yürütmək əvəzinə əməliyyatı rədd edir.
  • payment_reference köçürülmür. Strukturlaşdırılmış ödəniş istinadları konkret sənədi müəyyənləşdirir; ikisini birləşdirdikdə bankda heç nəyə uyğun gəlmir. Yeni hesab-faktura uçota işlənərkən öz istinadını alır.
  • Avans sətirləri digər sətirlər kimi köçürülür. Mənbələrdə sale modulundan gələn avans sətirləri varsa, nəticə uçota işlənməzdən əvvəl yoxlanılmalıdır.
  • Yalnız timesheet_invoice_id avtomatik olaraq yeni hesab-fakturaya bağlanır. account.move modelinə Many2one əlaqəsi olan bütün digər modellər (xüsusi hesablaşma prosesləri, abunəlik əlaqələri, EDI ötürmələri) mənbəyə istinad etməyə davam edir. Bunun üçün _merge_draft_relink genişləndirmə nöqtəsi mövcuddur.
  • Eyni sətirlər birləşdirilmir — bu, şüurlu seçimdir. Qısa və yığcam hesab-faktura istəyənlər üçün bu modul uyğun deyil: belə bir yığcamlıq mənbə əlaqələrinin itirilməsi bahasına başa gələrdi.
  • Başlıqlar birləşdirmə zamanı bir dəfə yaradılır. Bundan sonra onlar adi bölmə sətirləridir: redaktə və silinə bilirlər, lakin sifarişin və ya sorğunun adı sonradan dəyişdirildikdə yenilənmirlər.
  • Başlıqda ayrıca sətrin deyil, bütün mənbə hesab-fakturanın sorğuları göstərilir.

Odoo 19 Community-də quraşdırma

Quraşdırma adi Odoo əlavə modullarında olduğu kimi aparılır:

  1. Modul qovluğunu konfiqurasiya edilmiş əlavə modullar yoluna köçürün.
  2. Odoo-da tətbiqlər siyahısını yeniləyin.
  3. account_invoice_merge_draft modulunu quraşdırın.

Modul yalnız account modulundan asılıdır. sale, purchase, project, hr_timesheet, sale_timesheet və ya dəstək modulu ilə bağlı bütün məlumatlar işləmə zamanı müəyyənləşdirilir — modul yalnız hesablaşma üçün istifadə olunan verilənlər bazasında da quraşdırılır və işləyir.

Sonra: Mühasibat → Müştərilər → Hesab-fakturalar (və ya Təchizatçılar → Hesab-fakturalar), iki və ya daha çox qaralama seçin, dişli çarx menyusu → Qaralama hesab-fakturaları birləşdir. Əməliyyat Hesablaşma / Fakturalaşdırma qrupuna daxil olan bütün istifadəçilər üçün əlçatandır.

Modulun əvvəlki versiyasından yeniləyənlər dəyişdirilmiş sahə adlarının almanca tərcümədə də əks olunması üçün bir dəfə -u account_invoice_merge_draft --i18n-overwrite ilə yeniləmə aparmalıdırlar. Bu, yeni quraşdırmalara aid deyil.

Tərtibatçılar üçün: API və genişləndirmə nöqtələri

Birləşdirməni öz kodunuzdan da çağırmaq olar:

python

merged = draft_moves.merge_draft_moves(
    extra_vals={"invoice_date": date(2026, 3, 31), "ref": "Q1"},
    source_handling="cancel",   # "delete" və ya "keep"
    add_source_sections=True,   # Başlıqlar; standart dəyər True
)

Seçilmiş sənədləri birləşdirmək mümkün deyilsə, merge_draft_moves bütün imtina səbəblərini ehtiva edən UserError yaradır. _merge_draft_get_errors() eyni səbəbləri istisna yaratmadan siyahı şəklində qaytarır.

account.move modelinə xüsusi geriyə istinadları olanlar _merge_draft_relink metodunu yenidən təyin etməlidirlər:

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}
        )

Geriyə istinad hesab-faktura sətrindədirsə, bu modula heç ehtiyac yoxdur: Odoo-nun öz account.move.line._copy_data_extend_business_fields genişləndirmə nöqtəsi kifayətdir və sahə birləşdirmə, ləğvetmə və surət yaratma zamanı eyni qaydada köçürülür. Digər dəstək modulları və ya başlıqların başqa cür formalaşdırılması üçün _merge_draft_get_source_tickets() və _merge_draft_section_name() mövcuddur.

İş mühitinin məlumatlarında istifadə olunmazdan əvvəl sınaqdan keçirilib

48 test müxtəlif statusları, fərqli tərəfdaşları, valyutaları və sənəd növlərini, satış və ya satınalma sifarişinə bağlı olan və olmayan sətirləri, vergiləri, bölmələri və qeydləri, xərc mərkəzləri üzrə bölgüləri, iş vaxtı qeydlərinin yeni hesab-fakturaya bağlanmasını, mənbə hesab-fakturalar üçün hər üç seçimi, köməkçi pəncərəni və başlıqları əhatə edir. Başlıqların standart olaraq aktiv olması, söndürüldükdə əvvəlki nəticənin sentinə qədər təkrarlanması, başlıqda məbləğ və hesabların olmaması, bir mənbənin sətirlərinin bir yerdə qalması, sorğunun verilənlər bazasındakı ID ilə deyil, öz nömrəsi ilə göstərilməsi də yoxlanılır.

Test məlumatları AccountTestInvoicingCommon əvəzinə aktiv şirkətin mövcud hesablar planına əsaslanır — bu köməkçi vasitə miqrasiya edilmiş iş bazalarında çox vaxt işə düşmür, halbuki modul məhz belə bazalarda işləməlidir.

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

Mühasibat sahəsindəki hər bir əlavə kimi, bu modulu da əvvəlcə öz verilənlər bazanızın surəti ilə sınaq mühitində quraşdırıb yoxlamağı tövsiyə edirik.

Odoo icması üçün ödənişsiz və açıq mənbəli

Biricon IT Services GmbH olaraq həlləri ilk növbədə öz fəaliyyətimizdə yaranan konkret tələblər üçün hazırlayırıq. Nəticədə geniş istifadə üçün yararlı bir modul ortaya çıxırsa, onu yalnız bir sistem daxilində saxlamaq istəmirik.

Buna görə Merge Draft Invoices pulsuz, açıq mənbəli layihə kimi təqdim olunur. Mənbə koduna baxmaq, onu yoxlamaq, uyğunlaşdırmaq və AGPL-3 lisenziyası çərçivəsində inkişaf etdirmək mümkündür.

Məqsədimiz mümkün qədər qısa hesab-faktura yaratmaq deyil, bir il sonra da hər sətrindən aid olduğu sifarişə, sorğuya və iş vaxtı qeydinə keçmək mümkün olan hesab-faktura yaratmaq idi.

Layihə, mənbə kodu və töhfələr

Tam mənbə kodu, quraşdırma təlimatları və texniki sənədlər GitHub-da mövcuddur:

Odoo 19 Merge Draft Invoices layihəsini GitHub-da açın

Odoo icmasından praktik istifadə təcrübələrini, xəta bildirişlərini, təkmilləşdirmə təkliflərini və layihəyə töhfələri məmnuniyyətlə qarşılayırıq.

Pulsuz. İzlənilə bilən. Açıq mənbəli. Odoo 19 Community üçün.