„AN26000001“ кажува повеќе од „S00001“: тоа е понуда, потекнува од 2026 година и е првата. Многу претпријатија, пред сè оние што преминуваат од постар систем на Odoo, сакаат своите броеви на документи да ги задржат токму така. Самиот Odoo ги нумерира понудите, нарачките и испратниците со свои редови (S00001, WH/OUT/00001, P00001), а фактурите со префиксот на дневникот и годината (INV/2026/00001).
За тоа го напишавме модулот Document Numbering by Prefix and Year (document_number_prefix_year) за Odoo 19. Достапен е како слободен софтвер под лиценцата LGPL-3 на GitHub:
github.com/Alex0176/odoo-document-number-prefix-year
Однапред искрена оцена: Модулот не го користиме во Biricon IT Services. Го објавуваме затоа што е готов, документиран и опремен со тестови и може да им заштеди работа на другите. Кој го користи, треба да ги прочита деловите за ограничувања и Тестови .
Шемата на броевите
Секој број се состои од три дела: префикс по вид на документ, година и бројач со фиксен број на места. Префиксот, форматот на годината (26 или 2026) и бројот на места ги поставувате по фирма под Поставки → Нумерирање на документи.
Се опфатени понуди, нарачки на клиенти, фактури и кредитни ноти на клиенти, испратници, приемници на стока и набавни нарачки. Префиксите на сликата се само примери: AN, AU, RE, GU, LI, WE, BE. Кој ќе остави префикс празен, за тој вид на документ ја задржува стандардната нумерација на Odoo. Модулот значи не прави ништо додека не го поставите.
Како се однесуваат броевите
- Секоја година одново. Бројачот со промената на годината повторно започнува од 1.
- Продолжување по увезените броеви. Модулот го бара највисокиот постоечки број со ист префикс и година, без разлика колку е долг. Ако од стар систем во базата на податоци е
AN26119, следната понуда гласиAN26000120. Тоа е причината зошто модулот е погоден за преминување: старите документи се увезуваат со нивните оригинални броеви, а новите документи се надоврзуваат без прекин. - Нов број на нарачка при потврда. Потврдена понуда по желба добива број од редот на нарачките. Бројот на понудата останува зачуван во полето Број на понуда кај нарачката и е видлив во обрасцот, листата и пребарувањето.
- Фактури при книжење. Фактурите и кредитните ноти на клиенти го добиваат својот број дури при книжењето, а не при создавањето. Избришаните нацрти затоа не оставаат празнина. Годината потекнува од датумот на фактурата: фактура од 30.12.2025 што се книжи на 2.1.2026 се вика
RE25…. - Сè друго останува. Фактурите од добавувачи, плаќањата, книжењата и производните нарачки ги задржуваат стандардните редови на Odoo. Постоечките имиња никогаш не се препишуваат, ниту тогаш кога ќе го исклучите модулот.
Деликатниот дел: двајца корисници истовремено
Сопствената доделба на броеви изгледа едноставно: најди го највисокиот број, додај еден. Но не е така штом двајца корисници во истиот момент создаваат понуда. И двајцата читаат „највисок број = 0“, и двајцата го доделуваат AN26000001. Odoo за свои сопствени редови има секвенци во базата на податоци. Кај самоизграден број тоа недостасува, а за понуди и набавни нарачки во Odoo дополнително нема проверка на уникатност на името: два документа со ист број едноставно се зачувуваат.
Најприродната заштита е клучалка. Модулот по фирма, префикс и година зема клучалка на базата на податоци (PostgreSQL Advisory Lock) што трае до крајот на трансакцијата. Вториот корисник чека додека првиот не заврши. Но тоа не е доволно, а до тоа дојдовме преку обид на копија од производствената база на податоци:
Odoo работи со ниво на изолација REPEATABLE READ. Состојбата на базата на податоци што ја гледа една трансакција се замрзнува при нејзиното прво барање. Корисникот B ја има оваа состојба веќе пред A да заврши. Ако B потоа чека на клучалката и ја добие, со својата стара состојба чита „највисок број = 0“ и го доделува бројот по втор пат. Клучалката го уредила редоследот, но не го ажурирала знаењето.
Решението е второ читање преку сопствен, краткотраен пристап до базата на податоци што ги гледа сите веќе потврдени редови. Поголемата од двете вредности победува. Првото читање останува потребно, бидејќи само тоа знае за броеви што истата трансакција веќе ги доделила, но сè уште не ги потврдила, на пример при увоз на повеќе документи одеднаш.
Го проверивме тоа со две трансакции, кај кои втората докажано ја презела својата состојба пред commit-от на првата, а потоа чекала на клучалката. Без второто читање двете нарачки го добија истиот број, со него броевите 1 и 2.
Важно за вреднувањето: Овој обид е рачна проверка. Тој не е дел од автоматските тестови, бидејќи за тоа се потребни две вистински врски со базата на податоци, што тест-околината на Odoo (една единствена трансакција по тест) не ги обезбедува.
Техничка реализација
| Документ | Точка на закачување |
|---|---|
| Понуда | sale.order.create, ако името е празно, / или New |
| Нарачка на клиент | sale.order.action_confirm, пред стандардната потврда |
| Фактура, кредитна нота | account.move._set_next_sequence, се повикува при книжењето |
| Испратница, приемник на стока | stock.picking.create според видот на операцијата |
| Набавна нарачка | purchase.order.create |
- Бројач. Највисокиот број го наоѓа регуларен израз (
^<основа>([0-9]{1,15})$, основата се маскира) по фирма, вклучувајќи имиња без фирма. - Фактури.
_set_next_sequenceго запишува името и го повикува_compute_split_sequenceза логиката на секвенцата на Odoo (префикс, број, препознавање на годината за следната фактура во дневникот) да остане усогласена. - Поставки. Полињата на фирмата
document_number_*се огледуваат воres.config.settings. Поставките ги одбиваат префиксите со празно место или со цифра на крајот. - Превод. Германскиот превод е вклучен.
Инсталација и поставување
- Ставете ја папката
document_number_prefix_yearво патеката на addons. - Ажурирајте ја листата на апликации, инсталирајте го модулот. Предуслов се Продажба, Набавка, Магацин и Сметководство.
- Под Поставки → Нумерирање на документи внесете префикси, формат на годината и број на места.
- Прво испробајте на копија. Бројот на документот подоцна не може автоматски да се врати назад, а кај фактурите за бројот се врзани обврските за чување и проверка.
ограничувања
- Понудите се нумерираат при создавањето. Избришаните или откажаните понуди оставаат празнини. Истото важи за секоја нарачка на клиент што ја создава друг модул: кошничките на веб-продавницата (
website_sale) се нарачки во статус Понуда и трошат по еден број. Без празнини се само фактурите и кредитните ноти, бидејќи се нумерираат при книжењето. - Не го менувајте форматот на годината во тековно работење. Со основата
AN26модулот постоечкаAN2026000001ја чита како бројач26000001. Одредете го форматот пред првиот документ. - Бројачот најмногу 15 места. Подолги низи од цифри по основата се игнорираат при пребарувањето на највисокиот број.
- Нема одвоени серии по дневник или магацин. Бројачот важи по фирма, префикс и година. Повеќе дневници на продажба го делат бројачот на фактурите.
- Префиксите не смеат да содржат празно место и не смеат да завршуваат со цифра, инаку префиксот, годината и бројачот повеќе не можат да се разделат.
- Се обработуваат само наведените видови документи.
Тестови
Модулот носи десет автоматски теста. Тие проверуваат:
- Понуда и потврда: број на понуда и на нарачка, зачувување на бројот на понудата
- Продолжување на броењето по увезен број (
AN26119→AN26000120) - нема последователно ренумерирање на постојните документи
- Фактура, кредитна нота и промена на годината според датумот на фактурата
- Набавна нарачка и испратници
- празен префикс: стандардниот број на Odoo останува
- четирицифрена година
- Префикс со специјални знаци
- повеќе броеви во една трансакција
- многу долги низи од цифри се игнорираат
Повик:
odoo-bin -d <Testdatenbank> -i document_number_prefix_year --test-enable --test-tags=/document_number_prefix_year --stop-after-init
Тестовите се извршуваат со обични трансакции. Однесувањето при истовремено создавање од двајца корисници не е дел од нив, тоа беше проверено рачно на копија од базата на податоци, како што е опишано погоре. Кој го користи модулот во систем со многу истовремени корисници, треба овој обид да го повтори на сопствената база на податоци.
Правна напомена за бројот на фактурата
Според § 11 UStG фактурите мора да носат последователен број што се доделува еднократно за идентификување на фактурата. Модулот ги нумерира фактурите при книжењето и со сопствен бројач по префикс и година, што одговара на тоа. Дали вашата конкретна поставка (повеќе дневници, кредитни ноти со сопствен префикс, промена на годината) ги исполнува барањата на вашиот даночен советник, мора да го разјасните со него. Овој напис не е правен совет.
Често поставувани прашања
Зошто едноставно не ги прилагодиме редовите на Odoo?
За фактури тоа оди преку префиксот на дневникот. Кај понуди, нарачки, испратници и набавки пак нема заедничка шема од префикс, година и бројач со промена на годината, а бројачот не познава увезени стари броеви. Тука започнува модулот.
Дали постојното нумерирање се препишува?
Не. Модулот доделува само нови броеви. Веќе зачуваните имиња остануваат непроменети, и при исклучување.
Како повторно да го исклучам?
Испразнете го префиксот на видот на документ. Тогаш Odoo повторно сам го нумерира. И деинсталирањето не менува веќе доделени броеви.
Дали го користите сами?
Не. Кај нас работат стандардните броеви на Odoo. Го проверивме модулот со автоматските тестови и со опишаниот рачен обид, но не во тековно работење со многу корисници.
Дали работи со Odoo 17 или 18?
Го тестиравме само со Odoo 19.0 Community. За други верзии може да одговара или не, не сме го проверувале.
Под која лиценца е?
Под LGPL-3. Грешките и подобрувањата се добредојдени како issue во GitHub-репозиториумот .
Поддршка од Biricon IT Services
Се грижиме за инсталации на Odoo за мали и средни претпријатија: од воведувањето преку прилагодувања и миграции до тековното работење. Ако при преминувањето сакате да ги зачувате вашите броеви на документи, да дадете да се провери доделбата на броеви под оптоварување или безбедно да внесете модул како овој во вашата производствена инстанца, со задоволство ќе помогнеме. Други сопствени развивања: Firmenbuch и проверка на адреси за австриски клиенти, Сетови производи во понудата како дел и Web RBL, црната листа за нападен сообраќај.
Состојба: 3 ноември 2026 година. Верзија на модулот 19.0.1.0.0. Сите броеви во примерите и сликите се слободно избрани.