Wprowadzenie
W Odoo modele określają strukturę danych w bazie. Wszystkie elementy biznesowe — zamówienia sprzedaży, faktury, zapisy księgowe — są przechowywane właśnie w modelach.
Zrozumienie sposobu działania modeli jest kluczowe zarówno dla programistów, jak i konsultantów funkcjonalnych. To one definiują pola, powiązania między rekordami oraz logikę biznesową stojącą za danymi.
Artykuł koncentruje się na jednym z najważniejszych modeli w module Księgowość: account.move.line. Bez względu na to, czy tworzysz raporty, integrujesz systemy czy konfigurujesz procesy uzgadniania, prędzej czy później trafisz na ten model.
Czym jest model account.move.line
Model account.move.line odpowiada za pojedyncze linie zapisu księgowego. Każda linia to pojedynczy wpis debetowy lub kredytowy. W ramach jednego zapisu księgowego wszystkie linie muszą się zrównoważyć — suma debetów równa się sumie kredytów.
Model jest wykorzystywany w module Księgowość i jest powiązany jako element podrzędny modelu account.move, który reprezentuje cały dokument księgowy (faktury, rachunki, wyciągi bankowe, wpisy ręczne). Każdy dokument składa się z jednej lub więcej linii.
Definicja modelu znajduje się w module account, a inne moduły rozszerzają go za pomocą dziedziczenia modeli Odoo. Moduł Sprzedaż dodaje szczegóły linii faktury, Zakupy — linie rachunków, a moduły analityczne — rozdzielenia analityczne. Dzięki temu rdzeń pozostaje spójny, a dodatkowa funkcjonalność wprowadzana jest bez duplikacji.
Kluczowe pola w modelu
Poniżej opisane zostały najważniejsze pola modelu account.move.line. Znajomość ich znaczenia ułatwi pracę z zapisami księgowymi i analizą danych finansowych.
1. name
Typ: Char. Pole przechowujące opis linii — etykietę widoczną w widokach i raportach. Na fakturach zwykle pochodzi z nazwy produktu lub z niestandardowego opisu. Pole jest wymagane.
2. move_id
Typ: Many2one (account.move). Łączy linię z nadrzędnym dokumentem księgowym. Każda linia należy do jednego move — to główne powiązanie w modelu.
3. account_id
Typ: Many2one (account.account). Konto, na które księgowana jest ta linia. Pole wymagane — nie może wskazywać konta typu view ani zamkniętego. Ma znaczenie przy raportach bilansowych i grupowaniu według kont.
4. debit
Typ: Float. Kwota debetowa. Domyślnie 0.0. Dla danej linii ustawiany jest albo debit, albo credit — nie oba. Debety zwiększają konta aktywów i kosztów.
5. credit
Typ: Float. Kwota kredytowa. Domyślnie 0.0. Kredyty powiększają zobowiązania, kapitał i przychody. W zapisie suma debetów musi równać się sumie kredytów.
6. balance
Typ: Float. Pole obliczane: debit minus credit. Pokazuje netto wpływ linii — wartość dodatnia dla debetów, ujemna dla kredytów. Używane w raportach i procesach uzgadniania.
7. partner_id
Typ: Many2one (res.partner). Kontrahent powiązany z linią (klient, dostawca). Kluczowe do śledzenia należności, zobowiązań, raportów wieku sald i uzgodnień.
8. date
Typ: Date. Data księgowania linii, zwykle dziedziczona z move. Ważna przy zamknięciach okresów, raportowaniu i obliczaniu wieku należności.
9. date_maturity
Typ: Date. Termin płatności. Istotny przy rozliczeniach z kontrahentami i planowaniu płatności oraz przy raportach wieku należności.
10. currency_id
Typ: Many2one (res.currency). Waluta tej linii. Może różnić się od waluty firmy — umożliwia księgowość wielowalutową.
11. amount_currency
Typ: Float. Kwota wyrażona w walucie linii. W parze z currency_id pozwala obsługiwać transakcje w walutach obcych.
12. quantity
Typ: Float. Opcjonalna ilość, używana przy liniach produktowych (faktury, rachunki). Przydatna do raportów ilościowych i obliczeń ceny jednostkowej.
13. product_id
Typ: Many2one (product.product). Produkt powiązany z linią — uzupełniane, gdy linia pochodzi z zamówienia sprzedaży, zakupu lub pozycji faktury.
14. product_uom_id
Typ: Many2one (uom.uom). Jednostka miary dla ilości. Współpracuje z product_id w celu poprawnego wyświetlania i konwersji ilości.
15. price_unit
Typ: Float. Cena jednostkowa. W połączeniu z quantity służy do obliczania wartości linii na fakturach i rachunkach.
16. tax_ids
Typ: Many2many (account.tax). Zastosowane podatki. Przy księgowaniu Odoo może tworzyć dodatkowe linie podatkowe; pole to służy do rozliczeń VAT i innych podatków.
17. tax_line_id
Typ: Many2one (account.tax). Dla linii podatkowych odniesienie do podatku, który wygenerował daną pozycję. Pozwala odróżnić linie podatkowe od standardowych.
18. analytic_account_id
Typ: Many2one (account.analytic.account). Konto analityczne do śledzenia kosztów i przychodów. Używane, gdy włączone jest księgowanie analityczne.
19. analytic_distribution
Typ: Json lub Text. Przechowuje rozkład analityczny na wiele kont. W nowszych wersjach zastępuje jedno pole analityczne przy planach analitycznych.
20. ref
Typ: Char. Odniesienie z dokumentu nadrzędnego — referencja zewnętrzna lub notatka. Widoczna w raportach i pomocna przy dopasowaniach.
21. narration
Typ: Text. Notatka wewnętrzna z dokumentu nadrzędnego. Zwykle nie jest drukowana na dokumentach wysyłanych do klientów.
22. journal_id
Typ: Many2one (account.journal). Dziennik, do którego należy move. Przydatne do filtrowania i raportów według dziennika.
23. company_id
Typ: Many2one (res.company). Firma właścicielska rekordu. W konfiguracjach wielofirmowych każda linia należy do jednej firmy — ma to wpływ na widoczność i konsolidację.
24. reconciled
Typ: Boolean. Flaga oznaczająca, czy linia została w pełni uzgodniona. Użyteczna do filtrowania pozycji nieuzgodnionych podczas procesu bankowego lub rozliczeń z kontrahentami.
25. full_reconcile_id
Typ: Many2one (account.full.reconcile). Łączy linie, które zostały dopasowane razem — przydatne do śledzenia grup uzgodnień.
26. payment_id
Typ: Many2one (account.payment). Dla linii powiązanych z płatnością — odniesienie do rekordu płatności, wykorzystywane przy uzgadnianiu faktur z płatnościami.
27. statement_id
Typ: Many2one (account.bank.statement). Dla linii pochodzących z wyciągu bankowego — odniesienie do wyciągu używane przy uzgadnianiu bankowym.
28. statement_line_id
Typ: Many2one (account.bank.statement.line). Wiąże linię z konkretnym wpisem na wyciągu bankowym — pomocne przy dopasowywaniu transakcji bankowych z zapisami księgowymi.
29. display_type
Typ: Selection. Może przyjmować wartości 'line_section' lub 'line_note' — służy do nagłówków i notatek w zapisie księgowym. Takie linie nie mają debetu ani kredytu i są tylko do celów prezentacyjnych.
30. create_date
Typ: Datetime. Data utworzenia rekordu, automatycznie nadzorowana przez Odoo — przydaje się przy audycie.
31. write_date
Typ: Datetime. Data ostatniej modyfikacji, również prowadzona automatycznie — pozwala śledzić zmiany w czasie.
Zastosowanie modelu w procesach biznesowych
1. Fakturowanie klientów
Po zatwierdzeniu faktury Odoo tworzy linie account.move.line: przychód trafia na konto przychodów, należność na konto należności klienta, a podatki na oddzielne linie podatkowe. partner_id powiązuje linię z klientem, co umożliwia raporty wieku sald i uzgodnienia.
2. Rachunki od dostawców
Rachunki generują linie kosztów, VAT naliczanego oraz zobowiązań. Struktura jest analogiczna do faktur sprzedaży, ale używa innych typów kont odpowiednich dla kosztów i zobowiązań.
3. Uzgadnianie bankowe
Pozycje wyciągu bankowego dopasowuje się do linii księgowych przez statement_line_id. Proces uzgadniania łączy linie i nadaje im full_reconcile_id, a pole reconciled przechodzi na True.
4. Ręczne zapisy księgowe
Użytkownicy mogą tworzyć ręczne zapisy z wieloma liniami; każda linia ma konto i kwotę debet lub kredit oraz opcjonalnego kontrahenta. Odoo wymusza równość debetów i kredytów przed zatwierdzeniem zapisu.
5. Raportowanie analityczne i kontroling
Gdy księgowość analityczna jest włączona, linie zawierają konto analityczne lub rozkład analityczny. Dzięki temu raporty grupują koszty i przychody według projektu, działu czy innego wymiaru.
Jak programiści rozszerzają ten model
Programiści rozszerzają account.move.line za pomocą kilku wzorców, z dziedziczeniem modelu jako główną techniką.
Dziedziczenie modelu
Użyj _inherit = 'account.move.line', aby rozszerzyć model. Możesz dodać pola, nadpisać metody lub dopisać ograniczenia. Dzięki separacji zmian w oddzielnym module łatwiej utrzymać aktualizacje systemu.
Dodawanie pól
W klasie dziedziczącej zdefiniuj nowe pola Odoo: Char, Many2one, Boolean, Integer, Text, Selection. Zastanów się nad polami zależnymi od firmy w środowisku multi-company i ostrożnie projektuj pola obliczane z właściwymi zależnościami.
Rozszerzenia w Pythonie
Nadpisuj metody takie jak create, write czy unlink, dodając własną logikę, ale zawsze wywołuj super(). Uważaj, by nie naruszyć zasady równości debetów i kredytów. API modelu udostępnia te punkty rozszerzeń również dla integracji zewnętrznych.
Odoo Studio
Odoo Studio daje możliwość dodawania pól do account.move.line bez kodowania — dobre rozwiązanie dla prostych etykiet czy tagów. Dla skomplikowanej logiki czy zasad uzgadniania lepszym wyborem są dedykowane moduły.
Dobre praktyki
- Nigdy nie twórz ani nie modyfikuj linii bezpośrednio omijając move. Korzystaj z API move (np. line_ids), aby Odoo mogło zachować spójność danych i wykonać wszystkie niezbędne walidacje.
- Przy tworzeniu raportów filtruj zapisy po move_id.state = 'posted', aby wykluczyć szkice i dokumenty anulowane.
- Dbaj, aby konto w account_id miało właściwy typ (receivable, payable itp.), co zapewni poprawne działanie raportów wieku sald i mechanizmów uzgadniania.
- W integracjach przez API twórz najpierw move, a następnie dodawaj linie — przed zatwierdzeniem upewnij się, że suma debetów i kredytów się zgadza.
- Dla pól niestandardowych stosuj prefiks
x_lub prefiks swojego modułu, aby uniknąć konfliktów z przyszłymi wersjami Odoo.
Najczęstsze błędy
- Ustawianie jednocześnie wartości debit i credit na tej samej linii. Każda linia powinna mieć albo debit, albo credit — nigdy oba pola równocześnie.
- Tworzenie niezbilansowanych zapisów. Suma debetów musi równać się sumie kredytów — Odoo sprawdza to przy zatwierdzaniu.
- Modyfikowanie zaksięgowanych linii bez użycia mechanizmów korekty lub odwrócenia. Zaksięgowane zapisy koryguje się poprzez nowe zapisy, a nie bezpośrednie edycje.
- Brak ustawienia partner_id na liniach należności i zobowiązań. To uniemożliwia poprawne raporty wieku sald i procesy uzgadniania.
- Nadpisywanie kluczowych metod bez wywołania super(). To może zaburzyć mechanizmy uzgadniania, blokowania czy integracje z innymi modułami.
Podsumowanie
Model account.move.line jest sercem księgowości w Odoo — rejestruje każdy debet i kredyt na fakturach, rachunkach i zapisach. Znajomość pól oraz sposobu rozszerzania modelu ułatwia konfigurację, personalizację i integrację systemu.
Niezależnie od tego, czy jesteś konsultantem definiującym procesy księgowe, czy programistą tworzącym raporty i integracje, solidne opanowanie account.move.line pozwoli zaoszczędzić czas i uniknąć błędów.
Potrzebujesz pomocy przy wdrożeniu Odoo?
Dasolo wspiera firmy we wdrożeniach, dostosowaniach i optymalizacji Odoo. Specjalizujemy się w integracjach API i rozwoju modułów — dobrze znamy architekturę danych Odoo oraz modele takie jak account.move.line.
Jeśli potrzebujesz wsparcia przy wdrożeniu Odoo, pisaniu modułów lub integracji, chętnie pomożemy. Umów demo aby omówić projekt.