Plan kont

W Odoo są dostępne definicje planu kont dla różnych krajów. Każde konto ma swój numer (code), opis i typ. Dostępne typy kont można wyświetlić otwierając widok account.account.type.tree (zob. moduł Ustawienia w trybie deweloperskim – Debug | Otwórz widok). W bazie danych spis ten zawarto w tabeli account_account_type. Są to:

Opis typu konta Opis po angielsku Grupa Referencje
Należności Receivable Należności (receivable) data_account_type_receivable
Zobowiązania Payable Zobowiązania (payable) data_account_type_payable
Bank i gotówka Bank and Cash Gotówkowe (liquidity) data_account_type_liquidity
karta kredytowa Credit Card Gotówkowe data_account_type_credit_card
Bieżące aktywa Current Assets Normalny (other) data_account_type_current_assets
Aktywa trwałe Non-current Assets Normalny data_account_type_non_current_assets
Przedpłaty Prepayments Normalny data_account_type_prepayments
Środki trwałe Fixed Assets Normalny data_account_type_fixed_assets
Bieżące zobowiązania Current Liabilities Normalny data_account_type_current_liabilities
Zobowiązania długoterminowe Non-current Liabilities Normalny data_account_type_non_current_liabilities
Kapitał własny Equity Normalny data_account_type_equity
Inny dochód Other Income Normalny data_account_type_other_income
Przychód Income Normalny data_account_type_revenue
Amortyzacja Depreciation Normalny data_account_type_depreciation
Wydatki Expenses Normalny data_account_type_expenses
Koszt przychodu Cost of Revenue Normalny data_account_type_direct_costs

Ostatnia kolumna zawiera referenacje (id) do obiektu w bazie danych (ir.model.data). Pochodzą one z modelu account – pełna nazwa zawiera więc przedrostek account. (na przykład account.data_account_type_credit_card).

Zapytanie do bazy danych zwracające te dane:

select aat.id, aat.name, aat.type, irmd.name as ref
from account_account_type aat, ir_model_data irmd
where (aat.id=irmd.res_id) and (irmd.name like '%account_type%') 
    and (irmd.module='account') 
    and (irmd.model='account.account.type')
order by aat.name;

Własne typy kont mogą być zdefiniowane jedynie w ramach definicji planu kont.

Na przykład standardowy plan dostępny dla Polski (l10n_pl) zawiera definicje:

  • Podatki (account_type_tax)
  • Rozrachunki (account_type_settlement)
  • Pozabilansowe (account_type_nonbalance)

Dodatkowo każde konto może być opisane znacznikami (tagami).

Definiowanie własnego planu kont

Konta można zmieniać w parametrach systemu. Możemy także przygotować odrębny moduł zawierający kompletne dane o planie kont (alternatywę dla l10n_pl). Definicje możemy zawrzeć w plikach XML (z rekordami do odpowiednich modeli), albo w pliku csv. Warto przejrzeć ten opis choćby po to, by zdawać sobie sprawę z rodzaju powiązań między obiektami planu kony.

1) Najpierw ustalamy nazwę planu kont i pliki w jakich zawrzemy definicję. Plan nazwiemy demo_chart_template. Pliki w których go przygotujemy opisano jako fragment manifestu:

'data': [
'data/demo_chart_template.xml', # definicja planu
'data/account.account.template.csv', # definicja kont
'data/account_chart_template_data.xml', # definicje parametrów dla tabeli (chart) kont
'data/account_tax_template_data.xml', # definicje podatków
'data/account_chart_template_data.yml' # procedura wczytania tabeli podatków
],

2) Ustalmy typy kont jakie chcemy obsłużyć. Jak wyżej wspomniano autor polskiego planu zdecydował się zdefiniować trzy własne typy. Przykład dla jednego z nich (dla podatków):

<recordmodel=account.account.typeid=account_type_tax>
 <fieldname=name>Podatki</field>
</record>

W naszym przykładzie zrezygnujmy z definiowania własnych typów.

3) Definiujemy plan kont (plik demo_chart_template.xml)

<!-- definiujemy jedno - które potrzebujemy użyć w definicji planu kont-->
<record id="pl_11_0" model="account.account.template">
<field name="code">11-0</field>
<field name="reconcile" eval="True"/>
<field name="user_type_id" ref="account.data_account_type_current_assets"/>
<field name="name">Środki pieniężne w drodze</field>
</record>
<!-- zasadnicza definicja planu -->
<record id="demo_chart_template" model="account.chart.template">
<field name="name">Prosty plan kont dla Polski</field>
<field name="code_digits">6</field>
<field name="currency_id" ref="base.PLN"/>
<field name="bank_account_code_prefix">13-0</field>
<field name="cash_account_code_prefix">10-0</field>
<field name="transfer_account_id" ref="pl_11_0"/>
</record>
<!-- uzupełnienie powyższej definicji konta 11-0 -->
<record id="pl_11_0" model="account.account.template">
<field name="chart_template_id" ref="demo_chart_template"/>
</record>

Konta mogą być definiowane w plikach XML lub CSV (zob. dalej). Tu zdecydowaliśmy się na CSV, ale kod jednego konta (pieniądze w drodze) musi być użyty w definicji planu – stąd powyższa „sztuczka”.

4) Definiujemy pozostałe konta (plik account.account.template.csv).

Użycie pliku CSV jest prostsze – bo można go edytować arkuszem kalkulacyjnym.

UWAGA! Nazwa pliku musi zawierać nazwę modelu do którego wczytujemy (tu:account.account.template).

Każde konto musi zawierać:

  • id – nadawany przez nas identyfikator
  • chart_template_id:id – identyfikator definiowanego planu (demo_chart_template)
  • code – kod, czyli tradycyjny numer konta
  • name – nazwa konta dla księgowych
  • user_type_id:id – typ konta o którym mowa wyżej (jeśli z modułu account – dpdajemy przedrostek)
  • reconcile – czy jest to konto rozrachunkowe (rozrachunki, rozliczenie zakupu)

Przykład dla jednego konta:

id pl_01_0
chart_template_id:id demo_chart_template
code 01-0
name Środki Trwałe
user_type_id:id account.data_account_type_non_current_assets
reconcile FALSE

Cały plan kont z pominięciem kolumnid, oraz chart_template_id:id (jednakowa watość dla wszystkich kont):

code name user_type_id:id reconcile
01-0 Środki Trwałe account.data_account_type_non_current_assets FALSE
02-0 Wartości niematerialne i prawne account.data_account_type_non_current_assets FALSE
07-0 Odpisy umorzeniowe środków trwałych account.data_account_type_depreciation FALSE
07-1 Odpisy umorzeniowe wartości niematerialnych i prawnych account.data_account_type_depreciation FALSE
10-0 Środki pieniężne w kasie account.data_account_type_liquidity FALSE
12-0 Inne środki pieniężne account.data_account_type_liquidity FALSE
13-0 Rachunek bieżący w banku account.data_account_type_liquidity FALSE
20-0 Rozrachunki z odbiorcami account.data_account_type_receivable TRUE
20-1 Rozrachunki z dostawcami account.data_account_type_payable TRUE
22-0 Rozrachunki z urzędem skarbowym account.data_account_type_payable TRUE
22-1 Rozrachunki publicznoprawne z ZUS account.data_account_type_payable TRUE
22-9 Pozostałe rozrachunki publicznoprawne account.data_account_type_payable TRUE
23-0 Rozrachunki z pracownikami account.data_account_type_payable TRUE
24-0 Pozostałe rozrachunki account.data_account_type_payable TRUE
30-0 Rozliczenie zakupu account.data_account_type_current_assets TRUE
33-0 Towary account.data_account_type_current_assets FALSE
40-0 Koszty według rodzajów i ich rozliczenie account.data_account_type_expenses FALSE
40-1 Zużycie materiałów i energii account.data_account_type_expenses FALSE
40-2 Usługi obce account.data_account_type_expenses FALSE
40-3 Podatki i opłaty account.data_account_type_expenses FALSE
40-4 Wynagrodzenia i narzuty account.data_account_type_expenses FALSE
40-5 Amortyzacja account.data_account_type_expenses FALSE
40-6 Pozostałe koszty rodzajowe account.data_account_type_expenses FALSE
49-0 Rozliczenie kosztów account.data_account_type_expenses FALSE
60-0 Produkty i rozliczenia międzyokresowe account.data_account_type_current_assets FALSE
70-0 Przychody ze sprzedaży account.data_account_type_revenue FALSE
70-1 Koszt własny sprzedaży account.data_account_type_direct_costs FALSE
75-0 Przychody finansowe account.data_account_type_revenue FALSE
75-1 Koszty finansowe account.data_account_type_direct_costs FALSE
76-0 Pozostałe przychody operacyjne account.data_account_type_revenue FALSE
76-1 Pozostałe koszty operacyjne account.data_account_type_direct_costs FALSE
77-0 Zyski nadzwyczajne account.data_account_type_revenue FALSE
77-1 Straty nadzwyczajne account.data_account_type_direct_costs FALSE
80-0 Fundusz podstawowy account.data_account_type_equity FALSE
86-0 Wynik finansowy account.data_account_type_equity FALSE
87-0 Obciążenia wyniku finansowego account.data_account_type_equity FALSE

5) Definiujemy jak ma się plan kont zachowywać w Odoo (plik account_chart_template_data.xml). Sama definicja kont nie wystarczy. Trzeba dodać im własności w systemie Odoo. Dzięki temu system będzie na przykład wiedział gdzie zaksięgować przychody ze sprzedaży (property_account_income_categ_id).

W naszym przykładzie:

<record id="demo_chart_template" model="account.chart.template">
<field name="property_account_receivable_id" ref="pl_20_0"/>
<field name="property_account_payable_id" ref="pl_20_1"/>
<field name="property_account_expense_categ_id" ref="pl_30_0"/>
<field name="property_account_income_categ_id" ref="pl_70_0"/>
</record>

Własności te są pamiętane jako parametry firmy (ir.property): Ustawienia --> Techniczne--> Parametry-->Własności firmy

6) Definicja podatków (account_tax_template_data.xml).

Definicja składa się z dwóch części:

  • definicji znaczników (tag) używanych do oznaczenia podatków jakie mają być naliczone (account.account.tag)
  • zasadniczej definicji sposobu naliczania dla każdego znacznika (account.tax.template).

Przykład dla podatku VAT w przypadku zwolnienia z niego:

<record id="demo_tag_sale_vat" model="account.account.tag">
<field name="name">Sprzedaż towarów/usług, kraj, zwolnione</field>
<field name="applicability">taxes</field>
</record>

<record id="vat_s_zw" model="account.tax.template">
<field name="chart_template_id" ref="demo_chart_template"/>
<field name="name">Zwolniony z VAT</field>
<field name="description">VZW</field>
<field name="amount">0</field>
<field name="amount_type">percent</field>
<field name="type_tax_use">sale</field>
<field name="tag_ids" eval="[(6,0,[ref('demo_chart .demo_tag_sale_vat')])]"/>
</record>

7) Ostatnim krokiem jest zdefiniowanie w języku YAML (https://pl.wikipedia.org/wiki/YAML) obiektu powodującego ustawienia planu kont dla aktualnej firmy (plik account_chart_template_data.yml):

-
!python {model: account.chart.template, id: demo_chart_template}: |
self[0].try_loading_for_current_company()

Możemy już tak przygotowany plan zainstalować – po ewentualnym uprzednim odinstalowaniu planu standardowego (l10n_pl).

UWAGA!

  1. Wczytanie planu kont powoduje ustawienie wzorców (account.tax.template), ale tabela podatktów (account.tax) zostanie uzupełniona tylko wtedy, gdy po raz pierwszy wczytamy plan kont (do nowej bazy). W przeciwnym przypadku trzeba wykonać aktualizację (moduł https://www.odoo.com/apps/modules/10.0/account\_chart\_update/ lub e14p).
  2. Znaczniki podatków (tag) nie są przypisane do planu. Trzeba zatem albo stosować wspólne, albo zadbać o różne nazwy.

Zob. też: https://www.odoo.com/slides/slide/how-to-adapt-odoo-accounting-to-your-own-country-464/pdf_content