“AN26000001”, “S00001”den daha fazla şey söyler: Bu bir tekliftir, 2026’dandır ve ilkidir. Birçok şirket, özellikle eski bir sistemden Odoo’ya geçenler, belge numaralarını tam olarak böyle korumak ister. Odoo’nun kendisi teklifleri, siparişleri ve irsaliyeleri kendi dizileriyle (S00001, WH/OUT/00001, P00001), faturaları ise yevmiye defteri öneki ve yılla (INV/2026/00001) numaralandırır.
Bunun için Document Numbering by Prefix and Year modülünü (document_number_prefix_year) Odoo 19 için yazdık. LGPL-3 lisansı altında özgür yazılım olarak GitHub’da bulunur:
github.com/Alex0176/odoo-document-number-prefix-year
Önceden dürüst bir değerlendirme: Modülü Biricon IT Services’te kullanmıyoruz. Tamamlanmış, belgelenmiş ve testlerle donatılmış olduğu ve başkalarına iş yükü kazandırabileceği için yayımlıyoruz. Kullanacak olanlar Sınırlar ve Testler bölümünü okumalıdır.
Numaralandırma şeması
Her numara üç bölümden oluşur: belge türüne göre bir önek, yıl ve sabit basamak sayılı bir sayaç. Öneki, yıl biçimini (26 veya 2026) ve basamak sayısını şirket başına Ayarlar → Belge numaralandırma altında ayarlarsınız.
Teklifler, müşteri siparişleri, müşteri faturaları ve alacak dekontları, irsaliyeler, mal girişleri ve satın alma siparişleri ele alınır. Görseldeki önekler yalnızca örnektir: AN, AU, RE, GU, LI, WE, BE. Bir öneki boş bırakan, o belge türü için Odoo’nun standart numaralandırmasını korur. Yani modül, siz ayarlayana kadar hiçbir şey yapmaz.
Numaraların davranışı
- Her yıl yeniden. Sayaç, yıl değişiminde yeniden 1’den başlar.
- İçe aktarılan numaralardan sonra devam. Modül, uzunluğu fark etmeksizin aynı önek ve yıla ait mevcut en yüksek numarayı arar. Eski sistemden
AN26119veritabanında duruyorsa, bir sonraki teklifAN26000120olur. Modülün sistem geçişleri için uygun olmasının nedeni budur: Eski belgeler özgün numaralarıyla içe aktarılır ve yeni belgeler kesintisiz devam eder. - Onayda yeni sipariş numarası. Onaylanan bir teklif, isteğe bağlı olarak sipariş dizisinden bir numara alır. Teklif numarası siparişteki Teklif numarası alanında korunur ve formda, listede ve aramada görünür.
- Faturalar kayıt sırasında. Müşteri faturaları ve alacak dekontları numaralarını oluşturulurken değil, kaydedilirken alır. Silinen taslaklar bu nedenle boşluk bırakmaz. Yıl, Fatura tarihinden gelir: 30.12.2025 tarihli olup 2.1.2026’da kaydedilen bir fatura
RE25…olarak adlandırılır. - Geri kalan her şey aynı kalır. Tedarikçi faturaları, ödemeler, yevmiye kayıtları ve üretim emirleri Odoo’nun standart dizilerini korur. Mevcut adlar, modülü yeniden kapatsanız bile asla yeniden yazılmaz.
Hassas kısım: Aynı anda iki kullanıcı
Kendi numara atama sisteminiz basit görünür: en yüksek numarayı bul, bir ekle. İki kullanıcı aynı anda bir teklif oluşturduğunda ise öyle değildir. İkisi de “en yüksek numara = 0” okur, ikisi de AN26000001 numarasını verir. Odoo kendi dizileri için veritabanı sequence’lerine sahiptir. Kendi yaptığınız bir numarada bu yoktur; ayrıca Odoo’da teklifler ve satın alma siparişleri için ad üzerinde benzersizlik kontrolü yoktur: Aynı numaralı iki belge sorunsuzca kaydedilir.
Akla gelen koruma bir kilittir. Modül, şirket, önek ve yıl başına, işlemin sonuna kadar süren bir veritabanı kilidi (PostgreSQL Advisory Lock) alır. İkinci kullanıcı, birincisi bitene kadar bekler. Ancak bu yeterli değildir ve bunu, üretim veritabanının bir kopyası üzerinde yaptığımız bir denemeyle bulduk:
Odoo, REPEATABLE READ yalıtım düzeyiyle çalışır. Bir işlemin gördüğü veritabanı durumu, ilk sorgusunda dondurulur. B kullanıcısı bu duruma, A bitmeden önce zaten sahiptir. B daha sonra kilidi bekler ve kilidi aldığında, eski durumuyla “en yüksek numara = 0” okur ve numarayı ikinci kez verir. Kilit sırayı düzenlemiştir, ancak bilgiyi güncellememiştir.
Çözüm, tüm onaylanmış satırları gören kendi, kısa ömürlü bir veritabanı bağlantısı üzerinden ikinci bir okumadır. İki değerden büyük olan kazanır. İlk okuma yine de gereklidir, çünkü yalnızca o, aynı işlemin zaten verdiği ancak henüz onaylamadığı numaraları bilir, örneğin birden fazla belgenin tek seferde içe aktarılması sırasında.
Bunu iki işlemle denedik; ikincisi, birincinin commit’inden kesin olarak önce durumunu çekti ve ardından kilidi bekledi. İkinci okuma olmadan iki sipariş de aynı numarayı aldı, ikinci okumayla ise 1 ve 2 numaralarını aldılar.
Değerlendirme için önemli: Bu deneme elle yapılan bir kontroldür. Otomatik testlerin parçası değildir, çünkü bunun için Odoo’nun test ortamının (test başına tek bir işlem) sağlamadığı iki gerçek veritabanı bağlantısı gerekir.
Teknik uygulama
| Belge | Bağlanma noktası |
|---|---|
| Teklif | sale.order.create, ad boş, / veya New olduğunda |
| Müşteri siparişi | sale.order.action_confirm, standart onaydan önce |
| Fatura, alacak dekontu | account.move._set_next_sequence, kaydedilirken çağrılır |
| İrsaliye, mal girişi | stock.picking.create, işlem türüne göre |
| Satın alma siparişi | purchase.order.create |
- Sayaç. En yüksek numarayı, şirket başına (şirketsiz adlar dahil) düzenli bir ifade bulur (
^<Stamm>([0-9]{1,15})$, kök maskelenir). - Faturalar.
_set_next_sequenceadı yazar ve_compute_split_sequenceçağırır; böylece Odoo’nun dizi mantığı (önek, numara, yevmiye defterinin sonraki faturası için yıl tespiti) tutarlı kalır. - Ayarlar.
document_number_*şirket alanlarıres.config.settingsiçine yansıtılır. Ayarlar, boşluk içeren veya sonunda rakam bulunan önekleri reddeder. - Çeviri. Almanca çeviri dahildir.
Kurulum ve yapılandırma
document_number_prefix_yearklasörünü addons yoluna koyun.- Uygulama listesini güncelleyin, modülü kurun. Ön koşullar Satış, Satın alma, Envanter ve Muhasebe’dir.
- Ayarlar → Belge numaralandırma altında önekleri, yıl biçimini ve basamak sayısını girin.
- Önce bir kopyada deneyin. Bir belgenin numarası sonradan otomatik olarak geri alınamaz ve faturalarda numaraya saklama ve denetim yükümlülüğü bağlıdır.
Sınırlar
- Teklifler oluşturulurken numaralandırılır. Silinen veya iptal edilen teklifler boşluk bırakır. Aynısı başka bir modülün oluşturduğu her müşteri siparişi için de geçerlidir: Web mağazasının sepetleri (
website_sale) Teklif durumundaki siparişlerdir ve her biri bir numara tüketir. Yalnızca faturalar ve alacak dekontları boşluksuzdur, çünkü kaydedilirken numaralandırılırlar. - Yıl biçimini işletme sürerken değiştirmeyin.
AN26köküyle modül, mevcut birAN2026000001numarasını26000001sayacı olarak okur. Biçimi ilk belgeden önce belirleyin. - Sayaç en fazla 15 basamak. Kökten sonra gelen daha uzun rakam dizileri, en yüksek numara aranırken yok sayılır.
- Yevmiye defteri veya depo başına ayrı seri yok. Sayaç şirket, önek ve yıl başınadır. Birden fazla satış yevmiye defteri fatura sayacını paylaşır.
- Önekler boşluk içeremez ve rakamla bitemez; aksi hâlde önek, yıl ve sayaç artık ayrılamaz.
- Yalnızca belirtilen belge türleri ele alınır.
Testler
Modül on otomatik test ile birlikte gelir. Şunları kontrol ederler:
- Teklif ve onay: teklif ve sipariş numarası, teklif numarasının korunması
- İçe aktarılan bir numaradan sonra saymaya devam (
AN26119→AN26000120) - mevcut belgelerin sonradan yeniden numaralandırılmaması
- Fatura, alacak dekontu ve fatura tarihine göre yıl değişimi
- Satın alma siparişi ve irsaliyeler
- boş önek: Odoo’nun standart numarası kalır
- dört haneli yıl
- özel karakterli önek
- tek işlemde birden fazla numara
- çok uzun rakam dizileri yok sayılır
Çağrı:
odoo-bin -d <Testdatenbank> -i document_number_prefix_year --test-enable --test-tags=/document_number_prefix_year --stop-after-init
Testler sıradan işlemlerle çalışır. İki kullanıcının aynı anda oluşturması durumundaki davranış bunların arasında değildir, yukarıda anlatıldığı gibi bir veritabanı kopyasında elle denenmiştir. Modülü çok sayıda eşzamanlı kullanıcının bulunduğu bir sistemde kullanacak olanlar, bu denemeyi kendi veritabanlarında tekrarlamalıdır.
Fatura numarasıyla ilgili hukuki not
Faturalar, UStG § 11 uyarınca, faturanın belirlenmesi için bir kez verilen ardışık bir numara taşımalıdır. Modül, faturaları kaydedilirken ve önek ile yıl başına kendi sayacıyla numaralandırır; bu da uyumludur. Somut ayarınızın (birden fazla yevmiye defteri, kendi önekli alacak dekontları, yıl değişimi) mali müşavirinizin gerekliliklerini karşılayıp karşılamadığını onunla netleştirmelisiniz. Bu yazı hukuki danışmanlık değildir.
Sık sorulan sorular
Neden Odoo dizilerini basitçe uyarlamıyoruz?
Faturalar için bu, yevmiye defteri önekiyle mümkündür. Ancak teklifler, siparişler, irsaliyeler ve satın alma siparişleri için yıl değişimli ortak bir önek, yıl ve sayaç şeması yoktur ve sayaç içe aktarılan eski numaraları tanımaz. Modül tam burada devreye girer.
Mevcut numaralandırmanın üzerine yazılır mı?
Hayır. Modül yalnızca yeni numaralar verir. Önceden kaydedilmiş adlar, kapatma sırasında bile değişmeden kalır.
Modülü nasıl tekrar kapatırım?
Belge türünün önekini boşaltın. O zaman Odoo onu yine kendisi numaralandırır. Kaldırmak da verilmiş numaraları değiştirmez.
Siz bunu kendiniz kullanıyor musunuz?
Hayır. Bizde Odoo’nun standart numaraları çalışıyor. Modülü otomatik testler ve anlatılan elle deneme ile denedik, ancak çok sayıda kullanıcının bulunduğu canlı bir işletmede değil.
Odoo 17 veya 18 ile çalışır mı?
Yalnızca Odoo 19.0 Community ile test ettik. Diğer sürümler için uyabilir ya da uymayabilir, denemedik.
Hangi lisans altındadır?
LGPL-3 altında. Hatalar ve iyileştirmeler şu adreste bir issue olarak memnuniyetle karşılanır: GitHub deposu .
Biricon IT Services'ten destek
Küçük ve orta ölçekli işletmeler için Odoo kurulumlarına bakıyoruz: kurulumdan özelleştirmelere ve geçişlere, süregelen işletime kadar. Geçişte belge numaralarınızı korumak, numara atamasını yük altında test ettirmek veya bunun gibi bir modülü üretim ortamınıza güvenle almak istiyorsanız, memnuniyetle yardımcı oluruz. Diğer kendi geliştirmelerimiz: Avusturyalı müşteriler için ticaret sicili ve adres doğrulama, Tekliflerde bölüm olarak ürün setleri ve Web RBL, saldırı trafiği için engelleme listesi.
Durum: 3 Kasım 2026. Modül sürümü 19.0.1.0.0. Örneklerdeki ve görsellerdeki tüm numaralar serbestçe seçilmiştir.