Compare commits
merge into: OCA:13.0
OCA:10.0
OCA:11.0
OCA:12.0
OCA:12.0-mis_builder_analytic_cash_flow
OCA:13.0
OCA:13.0-ocabot-merge-pr-804-by-JordiBForgeFlow-bump-patch
OCA:14.0
OCA:6.0
OCA:6.1
OCA:7.0
OCA:8.0
OCA:9.0
pull from: OCA:12.0-mis_builder_analytic_cash_flow
OCA:10.0
OCA:11.0
OCA:12.0
OCA:12.0-mis_builder_analytic_cash_flow
OCA:13.0
OCA:13.0-ocabot-merge-pr-804-by-JordiBForgeFlow-bump-patch
OCA:14.0
OCA:6.0
OCA:6.1
OCA:7.0
OCA:8.0
OCA:9.0
No commits in common. '13.0' and '12.0-mis_builder_analytic_cash_flow' have entirely different histories.
13.0
...
12.0-mis_b
232 changed files with 45919 additions and 25275 deletions
-
4.editorconfig
-
180.eslintrc.yml
-
10.flake8
-
12.isort.cfg
-
103.pre-commit-config.yaml
-
8.prettierrc.yml
-
88.pylintrc
-
66.pylintrc-mandatory
-
45.travis.yml
-
9README.md
-
82account_export_csv/README.rst
-
1account_export_csv/__init__.py
-
20account_export_csv/__manifest__.py
-
294account_export_csv/i18n/account_export_csv.pot
-
297account_export_csv/i18n/es_AR.po
-
307account_export_csv/i18n/fr.po
-
297account_export_csv/i18n/hr.po
-
305account_export_csv/i18n/nl.po
-
296account_export_csv/i18n/pt.po
-
16account_export_csv/readme/CONTRBUTORS.rst
-
9account_export_csv/readme/DESCRIPTION.rst
-
2account_export_csv/readme/ROADMAP.rst
-
BINaccount_export_csv/static/description/icon.png
-
426account_export_csv/static/description/index.html
-
1account_export_csv/tests/__init__.py
-
52account_export_csv/tests/test_account_export_csv.py
-
1account_export_csv/wizard/__init__.py
-
354account_export_csv/wizard/account_export_csv.py
-
64account_export_csv/wizard/account_export_csv_view.xml
-
39account_financial_report/README.rst
-
1account_financial_report/__init__.py
-
82account_financial_report/__manifest__.py
-
1775account_financial_report/i18n/account_financial_report.pot
-
1886account_financial_report/i18n/ar.po
-
2136account_financial_report/i18n/ca.po
-
2633account_financial_report/i18n/da.po
-
2139account_financial_report/i18n/de.po
-
1872account_financial_report/i18n/es.po
-
1829account_financial_report/i18n/es_AR.po
-
2014account_financial_report/i18n/fr.po
-
1930account_financial_report/i18n/fr_CH.po
-
1876account_financial_report/i18n/hr.po
-
1734account_financial_report/i18n/hr_HR.po
-
2001account_financial_report/i18n/it.po
-
1716account_financial_report/i18n/ja.po
-
2014account_financial_report/i18n/nl.po
-
1721account_financial_report/i18n/nl_NL.po
-
2172account_financial_report/i18n/pt.po
-
2084account_financial_report/i18n/pt_BR.po
-
2049account_financial_report/i18n/ro.po
-
2615account_financial_report/i18n/sl.po
-
8account_financial_report/menuitems.xml
-
1account_financial_report/models/__init__.py
-
9account_financial_report/models/account.py
-
63account_financial_report/models/account_group.py
-
24account_financial_report/models/account_move_line.py
-
25account_financial_report/models/ir_actions_report.py
-
14account_financial_report/readme/CONTRIBUTORS.rst
-
2account_financial_report/readme/DESCRIPTION.rst
-
7account_financial_report/readme/ROADMAP.rst
-
137account_financial_report/report/abstract_report.py
-
472account_financial_report/report/abstract_report_xlsx.py
-
951account_financial_report/report/aged_partner_balance.py
-
362account_financial_report/report/aged_partner_balance_xlsx.py
-
2565account_financial_report/report/general_ledger.py
-
358account_financial_report/report/general_ledger_xlsx.py
-
1185account_financial_report/report/journal_ledger.py
-
300account_financial_report/report/journal_ledger_xlsx.py
-
1207account_financial_report/report/open_items.py
-
208account_financial_report/report/open_items_xlsx.py
-
537account_financial_report/report/templates/aged_partner_balance.xml
-
666account_financial_report/report/templates/general_ledger.xml
-
567account_financial_report/report/templates/journal_ledger.xml
-
22account_financial_report/report/templates/layouts.xml
-
244account_financial_report/report/templates/open_items.xml
-
1165account_financial_report/report/templates/trial_balance.xml
-
184account_financial_report/report/templates/vat_report.xml
-
1294account_financial_report/report/trial_balance.py
-
347account_financial_report/report/trial_balance_xlsx.py
-
555account_financial_report/report/vat_report.py
-
60account_financial_report/report/vat_report_xlsx.py
-
158account_financial_report/reports.xml
-
72account_financial_report/static/description/index.html
-
28account_financial_report/static/src/css/report.css
-
120account_financial_report/static/src/js/account_financial_report_backend.js
-
86account_financial_report/static/src/js/account_financial_report_widgets.js
-
35account_financial_report/static/src/js/action_manager_report.js
-
51account_financial_report/static/src/js/client_action.js
-
58account_financial_report/static/src/js/report.js
-
17account_financial_report/static/src/xml/report.xml
-
5account_financial_report/tests/__init__.py
-
399account_financial_report/tests/abstract_test.py
-
78account_financial_report/tests/abstract_test_foreign_currency.py
-
75account_financial_report/tests/abstract_test_tax_report.py
-
41account_financial_report/tests/test_aged_partner_balance.py
-
835account_financial_report/tests/test_general_ledger.py
-
570account_financial_report/tests/test_journal_ledger.py
-
57account_financial_report/tests/test_open_items.py
-
1116account_financial_report/tests/test_trial_balance.py
-
594account_financial_report/tests/test_vat_report.py
@ -1,180 +0,0 @@ |
|||
env: |
|||
browser: true |
|||
|
|||
# See https://github.com/OCA/odoo-community.org/issues/37#issuecomment-470686449 |
|||
parserOptions: |
|||
ecmaVersion: 2017 |
|||
|
|||
# Globals available in Odoo that shouldn't produce errorings |
|||
globals: |
|||
_: readonly |
|||
$: readonly |
|||
fuzzy: readonly |
|||
jQuery: readonly |
|||
moment: readonly |
|||
odoo: readonly |
|||
openerp: readonly |
|||
Promise: readonly |
|||
|
|||
# Styling is handled by Prettier, so we only need to enable AST rules; |
|||
# see https://github.com/OCA/maintainer-quality-tools/pull/618#issuecomment-558576890 |
|||
rules: |
|||
accessor-pairs: warn |
|||
array-callback-return: warn |
|||
callback-return: warn |
|||
capitalized-comments: |
|||
- warn |
|||
- always |
|||
- ignoreConsecutiveComments: true |
|||
ignoreInlineComments: true |
|||
complexity: |
|||
- warn |
|||
- 15 |
|||
constructor-super: warn |
|||
dot-notation: warn |
|||
eqeqeq: warn |
|||
global-require: warn |
|||
handle-callback-err: warn |
|||
id-blacklist: warn |
|||
id-match: warn |
|||
init-declarations: error |
|||
max-depth: warn |
|||
max-nested-callbacks: warn |
|||
max-statements-per-line: warn |
|||
no-alert: warn |
|||
no-array-constructor: warn |
|||
no-caller: warn |
|||
no-case-declarations: warn |
|||
no-class-assign: warn |
|||
no-cond-assign: error |
|||
no-const-assign: error |
|||
no-constant-condition: warn |
|||
no-control-regex: warn |
|||
no-debugger: error |
|||
no-delete-var: warn |
|||
no-div-regex: warn |
|||
no-dupe-args: error |
|||
no-dupe-class-members: error |
|||
no-dupe-keys: error |
|||
no-duplicate-case: error |
|||
no-duplicate-imports: error |
|||
no-else-return: warn |
|||
no-empty-character-class: warn |
|||
no-empty-function: error |
|||
no-empty-pattern: error |
|||
no-empty: warn |
|||
no-eq-null: error |
|||
no-eval: error |
|||
no-ex-assign: error |
|||
no-extend-native: warn |
|||
no-extra-bind: warn |
|||
no-extra-boolean-cast: warn |
|||
no-extra-label: warn |
|||
no-fallthrough: warn |
|||
no-func-assign: error |
|||
no-global-assign: error |
|||
no-implicit-coercion: |
|||
- warn |
|||
- allow: ["~"] |
|||
no-implicit-globals: warn |
|||
no-implied-eval: warn |
|||
no-inline-comments: warn |
|||
no-inner-declarations: warn |
|||
no-invalid-regexp: warn |
|||
no-irregular-whitespace: warn |
|||
no-iterator: warn |
|||
no-label-var: warn |
|||
no-labels: warn |
|||
no-lone-blocks: warn |
|||
no-lonely-if: error |
|||
no-mixed-requires: error |
|||
no-multi-str: warn |
|||
no-native-reassign: error |
|||
no-negated-condition: warn |
|||
no-negated-in-lhs: error |
|||
no-new-func: warn |
|||
no-new-object: warn |
|||
no-new-require: warn |
|||
no-new-symbol: warn |
|||
no-new-wrappers: warn |
|||
no-new: warn |
|||
no-obj-calls: warn |
|||
no-octal-escape: warn |
|||
no-octal: warn |
|||
no-param-reassign: warn |
|||
no-path-concat: warn |
|||
no-process-env: warn |
|||
no-process-exit: warn |
|||
no-proto: warn |
|||
no-prototype-builtins: warn |
|||
no-redeclare: warn |
|||
no-regex-spaces: warn |
|||
no-restricted-globals: warn |
|||
no-restricted-imports: warn |
|||
no-restricted-modules: warn |
|||
no-restricted-syntax: warn |
|||
no-return-assign: error |
|||
no-script-url: warn |
|||
no-self-assign: warn |
|||
no-self-compare: warn |
|||
no-sequences: warn |
|||
no-shadow-restricted-names: warn |
|||
no-shadow: warn |
|||
no-sparse-arrays: warn |
|||
no-sync: warn |
|||
no-this-before-super: warn |
|||
no-throw-literal: warn |
|||
no-undef-init: warn |
|||
no-undef: error |
|||
no-unmodified-loop-condition: warn |
|||
no-unneeded-ternary: error |
|||
no-unreachable: error |
|||
no-unsafe-finally: error |
|||
no-unused-expressions: error |
|||
no-unused-labels: error |
|||
no-unused-vars: error |
|||
no-use-before-define: error |
|||
no-useless-call: warn |
|||
no-useless-computed-key: warn |
|||
no-useless-concat: warn |
|||
no-useless-constructor: warn |
|||
no-useless-escape: warn |
|||
no-useless-rename: warn |
|||
no-void: warn |
|||
no-with: warn |
|||
operator-assignment: [error, always] |
|||
prefer-const: warn |
|||
radix: warn |
|||
require-yield: warn |
|||
sort-imports: warn |
|||
spaced-comment: [error, always] |
|||
strict: [error, function] |
|||
use-isnan: error |
|||
valid-jsdoc: |
|||
- warn |
|||
- prefer: |
|||
arg: param |
|||
argument: param |
|||
augments: extends |
|||
constructor: class |
|||
exception: throws |
|||
func: function |
|||
method: function |
|||
prop: property |
|||
return: returns |
|||
virtual: abstract |
|||
yield: yields |
|||
preferType: |
|||
array: Array |
|||
bool: Boolean |
|||
boolean: Boolean |
|||
number: Number |
|||
object: Object |
|||
str: String |
|||
string: String |
|||
requireParamDescription: false |
|||
requireReturn: false |
|||
requireReturnDescription: false |
|||
requireReturnType: false |
|||
valid-typeof: warn |
|||
yoda: warn |
@ -1,10 +0,0 @@ |
|||
[flake8] |
|||
max-line-length = 80 |
|||
max-complexity = 16 |
|||
# B = bugbear |
|||
# B9 = bugbear opinionated (incl line length) |
|||
select = C,E,F,W,B,B9 |
|||
# E203: whitespace before ':' (black behaviour) |
|||
# E501: flake8 line length (covered by bugbear B950) |
|||
# W503: line break before binary operator (black behaviour) |
|||
ignore = E203,E501,W503 |
@ -1,12 +0,0 @@ |
|||
[settings] |
|||
; see https://github.com/psf/black |
|||
multi_line_output=3 |
|||
include_trailing_comma=True |
|||
force_grid_wrap=0 |
|||
combine_as_imports=True |
|||
use_parentheses=True |
|||
line_length=88 |
|||
known_odoo=odoo |
|||
known_odoo_addons=odoo.addons |
|||
sections=FUTURE,STDLIB,THIRDPARTY,ODOO,ODOO_ADDONS,FIRSTPARTY,LOCALFOLDER |
|||
default_section=THIRDPARTY |
@ -1,103 +0,0 @@ |
|||
exclude: | |
|||
(?x) |
|||
# Files and folders generated by bots, to avoid loops |
|||
^setup/|/static/description/index\.html$| |
|||
# Maybe reactivate this when all README files include prettier ignore tags? |
|||
^README\.md$| |
|||
# Library files can have extraneous formatting (even minimized) |
|||
/static/(src/)?lib/| |
|||
# Repos using Sphinx to generate docs don't need prettying |
|||
^docs/_templates/.*\.html$| |
|||
# You don't usually want a bot to modify your legal texts |
|||
(LICENSE.*|COPYING.*) |
|||
default_language_version: |
|||
python: python3 |
|||
node: "14.13.0" |
|||
repos: |
|||
- repo: https://github.com/psf/black |
|||
rev: 19.10b0 |
|||
hooks: |
|||
- id: black |
|||
- repo: https://github.com/prettier/pre-commit |
|||
rev: "v1.19.1" |
|||
hooks: |
|||
- id: prettier |
|||
# TODO Avoid awebdeveloper/pre-commit-prettier if possible |
|||
# HACK https://github.com/prettier/prettier/issues/7407 |
|||
- repo: https://github.com/awebdeveloper/pre-commit-prettier |
|||
rev: v0.0.1 |
|||
hooks: |
|||
- id: prettier |
|||
name: prettier xml plugin |
|||
additional_dependencies: |
|||
- "prettier@1.19.1" |
|||
- "@prettier/plugin-xml@0.7.2" |
|||
files: \.xml$ |
|||
- repo: https://github.com/pre-commit/mirrors-eslint |
|||
rev: v6.8.0 |
|||
hooks: |
|||
- id: eslint |
|||
verbose: true |
|||
args: |
|||
- --color |
|||
- --fix |
|||
- repo: https://github.com/pre-commit/pre-commit-hooks |
|||
rev: v2.4.0 |
|||
hooks: |
|||
- id: trailing-whitespace |
|||
# exclude autogenerated files |
|||
exclude: /README\.rst$|\.pot?$ |
|||
- id: end-of-file-fixer |
|||
# exclude autogenerated files |
|||
exclude: /README\.rst$|\.pot?$ |
|||
- id: debug-statements |
|||
- id: fix-encoding-pragma |
|||
args: ["--remove"] |
|||
- id: check-case-conflict |
|||
- id: check-docstring-first |
|||
- id: check-executables-have-shebangs |
|||
- id: check-merge-conflict |
|||
# exclude files where underlines are not distinguishable from merge conflicts |
|||
exclude: /README\.rst$|^docs/.*\.rst$ |
|||
- id: check-symlinks |
|||
- id: check-xml |
|||
- id: mixed-line-ending |
|||
args: ["--fix=lf"] |
|||
- repo: https://gitlab.com/pycqa/flake8 |
|||
rev: 3.7.9 |
|||
hooks: |
|||
- id: flake8 |
|||
name: flake8 except __init__.py |
|||
exclude: /__init__\.py$ |
|||
additional_dependencies: ["flake8-bugbear==19.8.0"] |
|||
- id: flake8 |
|||
name: flake8 only __init__.py |
|||
args: ["--extend-ignore=F401"] # ignore unused imports in __init__.py |
|||
files: /__init__\.py$ |
|||
additional_dependencies: ["flake8-bugbear==19.8.0"] |
|||
- repo: https://github.com/pre-commit/mirrors-pylint |
|||
rev: v2.5.3 |
|||
hooks: |
|||
- id: pylint |
|||
name: pylint with optional checks |
|||
args: ["--rcfile=.pylintrc", "--exit-zero"] |
|||
verbose: true |
|||
additional_dependencies: ["pylint-odoo==3.5.0"] |
|||
- id: pylint |
|||
name: pylint with mandatory checks |
|||
args: ["--rcfile=.pylintrc-mandatory"] |
|||
additional_dependencies: ["pylint-odoo==3.5.0"] |
|||
- repo: https://github.com/asottile/pyupgrade |
|||
rev: v1.26.2 |
|||
hooks: |
|||
- id: pyupgrade |
|||
- repo: https://github.com/pre-commit/mirrors-isort |
|||
rev: v4.3.21 |
|||
hooks: |
|||
- id: isort |
|||
name: isort except __init__.py |
|||
exclude: /__init__\.py$ |
|||
- repo: https://github.com/acsone/setuptools-odoo |
|||
rev: 2.5.2 |
|||
hooks: |
|||
- id: setuptools-odoo-make-default |
@ -1,8 +0,0 @@ |
|||
# Defaults for all prettier-supported languages. |
|||
# Prettier will complete this with settings from .editorconfig file. |
|||
bracketSpacing: false |
|||
printWidth: 88 |
|||
proseWrap: always |
|||
semi: true |
|||
trailingComma: "es5" |
|||
xmlWhitespaceSensitivity: "ignore" |
@ -1,88 +0,0 @@ |
|||
[MASTER] |
|||
load-plugins=pylint_odoo |
|||
score=n |
|||
|
|||
[ODOOLINT] |
|||
readme_template_url="https://github.com/OCA/maintainer-tools/blob/master/template/module/README.rst" |
|||
manifest_required_authors=Odoo Community Association (OCA) |
|||
manifest_required_keys=license |
|||
manifest_deprecated_keys=description,active |
|||
license_allowed=AGPL-3,GPL-2,GPL-2 or any later version,GPL-3,GPL-3 or any later version,LGPL-3 |
|||
valid_odoo_versions=13.0 |
|||
|
|||
[MESSAGES CONTROL] |
|||
disable=all |
|||
|
|||
# This .pylintrc contains optional AND mandatory checks and is meant to be |
|||
# loaded in an IDE to have it check everything, in the hope this will make |
|||
# optional checks more visible to contributors who otherwise never look at a |
|||
# green travis to see optional checks that failed. |
|||
# .pylintrc-mandatory containing only mandatory checks is used the pre-commit |
|||
# config as a blocking check. |
|||
|
|||
enable=anomalous-backslash-in-string, |
|||
api-one-deprecated, |
|||
api-one-multi-together, |
|||
assignment-from-none, |
|||
attribute-deprecated, |
|||
class-camelcase, |
|||
dangerous-default-value, |
|||
dangerous-view-replace-wo-priority, |
|||
development-status-allowed, |
|||
duplicate-id-csv, |
|||
duplicate-key, |
|||
duplicate-xml-fields, |
|||
duplicate-xml-record-id, |
|||
eval-referenced, |
|||
eval-used, |
|||
incoherent-interpreter-exec-perm, |
|||
license-allowed, |
|||
manifest-author-string, |
|||
manifest-deprecated-key, |
|||
manifest-required-author, |
|||
manifest-required-key, |
|||
manifest-version-format, |
|||
method-compute, |
|||
method-inverse, |
|||
method-required-super, |
|||
method-search, |
|||
missing-import-error, |
|||
missing-manifest-dependency, |
|||
openerp-exception-warning, |
|||
pointless-statement, |
|||
pointless-string-statement, |
|||
print-used, |
|||
redundant-keyword-arg, |
|||
redundant-modulename-xml, |
|||
reimported, |
|||
relative-import, |
|||
return-in-init, |
|||
rst-syntax-error, |
|||
sql-injection, |
|||
too-few-format-args, |
|||
translation-field, |
|||
translation-required, |
|||
unreachable, |
|||
use-vim-comment, |
|||
wrong-tabs-instead-of-spaces, |
|||
xml-syntax-error, |
|||
# messages that do not cause the lint step to fail |
|||
consider-merging-classes-inherited, |
|||
create-user-wo-reset-password, |
|||
dangerous-filter-wo-user, |
|||
deprecated-module, |
|||
file-not-used, |
|||
invalid-commit, |
|||
missing-newline-extrafiles, |
|||
missing-readme, |
|||
no-utf8-coding-comment, |
|||
odoo-addons-relative-import, |
|||
old-api7-method-defined, |
|||
redefined-builtin, |
|||
too-complex, |
|||
unnecessary-utf8-coding-comment |
|||
|
|||
[REPORTS] |
|||
msg-template={path}:{line}: [{msg_id}({symbol}), {obj}] {msg} |
|||
output-format=colorized |
|||
reports=no |
@ -1,66 +0,0 @@ |
|||
[MASTER] |
|||
load-plugins=pylint_odoo |
|||
score=n |
|||
|
|||
[ODOOLINT] |
|||
readme_template_url="https://github.com/OCA/maintainer-tools/blob/master/template/module/README.rst" |
|||
manifest_required_authors=Odoo Community Association (OCA) |
|||
manifest_required_keys=license |
|||
manifest_deprecated_keys=description,active |
|||
license_allowed=AGPL-3,GPL-2,GPL-2 or any later version,GPL-3,GPL-3 or any later version,LGPL-3 |
|||
valid_odoo_versions=13.0 |
|||
|
|||
[MESSAGES CONTROL] |
|||
disable=all |
|||
|
|||
enable=anomalous-backslash-in-string, |
|||
api-one-deprecated, |
|||
api-one-multi-together, |
|||
assignment-from-none, |
|||
attribute-deprecated, |
|||
class-camelcase, |
|||
dangerous-default-value, |
|||
dangerous-view-replace-wo-priority, |
|||
development-status-allowed, |
|||
duplicate-id-csv, |
|||
duplicate-key, |
|||
duplicate-xml-fields, |
|||
duplicate-xml-record-id, |
|||
eval-referenced, |
|||
eval-used, |
|||
incoherent-interpreter-exec-perm, |
|||
license-allowed, |
|||
manifest-author-string, |
|||
manifest-deprecated-key, |
|||
manifest-required-author, |
|||
manifest-required-key, |
|||
manifest-version-format, |
|||
method-compute, |
|||
method-inverse, |
|||
method-required-super, |
|||
method-search, |
|||
missing-import-error, |
|||
missing-manifest-dependency, |
|||
openerp-exception-warning, |
|||
pointless-statement, |
|||
pointless-string-statement, |
|||
print-used, |
|||
redundant-keyword-arg, |
|||
redundant-modulename-xml, |
|||
reimported, |
|||
relative-import, |
|||
return-in-init, |
|||
rst-syntax-error, |
|||
sql-injection, |
|||
too-few-format-args, |
|||
translation-field, |
|||
translation-required, |
|||
unreachable, |
|||
use-vim-comment, |
|||
wrong-tabs-instead-of-spaces, |
|||
xml-syntax-error |
|||
|
|||
[REPORTS] |
|||
msg-template={path}:{line}: [{msg_id}({symbol}), {obj}] {msg} |
|||
output-format=colorized |
|||
reports=no |
@ -0,0 +1,82 @@ |
|||
================== |
|||
Account Export CSV |
|||
================== |
|||
|
|||
.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
|||
!! This file is generated by oca-gen-addon-readme !! |
|||
!! changes will be overwritten. !! |
|||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
|||
|
|||
.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png |
|||
:target: https://odoo-community.org/page/development-status |
|||
:alt: Beta |
|||
.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png |
|||
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html |
|||
:alt: License: AGPL-3 |
|||
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Faccount--financial--reporting-lightgray.png?logo=github |
|||
:target: https://github.com/OCA/account-financial-reporting/tree/12.0/account_export_csv |
|||
:alt: OCA/account-financial-reporting |
|||
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png |
|||
:target: https://translation.odoo-community.org/projects/account-financial-reporting-12-0/account-financial-reporting-12-0-account_export_csv |
|||
:alt: Translate me on Weblate |
|||
.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png |
|||
:target: https://runbot.odoo-community.org/runbot/91/12.0 |
|||
:alt: Try me on Runbot |
|||
|
|||
|badge1| |badge2| |badge3| |badge4| |badge5| |
|||
|
|||
|
|||
Add a wizard that allow you to export a csv file based on accounting |
|||
journal entries |
|||
|
|||
- Trial Balance |
|||
- Analytic Balance (with accounts) |
|||
- Journal Entries |
|||
|
|||
You can filter by date range |
|||
|
|||
**Table of contents** |
|||
|
|||
.. contents:: |
|||
:local: |
|||
|
|||
Known issues / Roadmap |
|||
====================== |
|||
|
|||
|
|||
* rearange wizard view with only one button to generate file plus define a selection list to select report type |
|||
|
|||
Bug Tracker |
|||
=========== |
|||
|
|||
Bugs are tracked on `GitHub Issues <https://github.com/OCA/account-financial-reporting/issues>`_. |
|||
In case of trouble, please check there if your issue has already been reported. |
|||
If you spotted it first, help us smashing it by providing a detailed and welcomed |
|||
`feedback <https://github.com/OCA/account-financial-reporting/issues/new?body=module:%20account_export_csv%0Aversion:%2012.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_. |
|||
|
|||
Do not contact contributors directly about support or help with technical issues. |
|||
|
|||
Credits |
|||
======= |
|||
|
|||
Authors |
|||
~~~~~~~ |
|||
|
|||
* Camptocamp |
|||
|
|||
Maintainers |
|||
~~~~~~~~~~~ |
|||
|
|||
This module is maintained by the OCA. |
|||
|
|||
.. image:: https://odoo-community.org/logo.png |
|||
:alt: Odoo Community Association |
|||
:target: https://odoo-community.org |
|||
|
|||
OCA, or the Odoo Community Association, is a nonprofit organization whose |
|||
mission is to support the collaborative development of Odoo features and |
|||
promote its widespread use. |
|||
|
|||
This module is part of the `OCA/account-financial-reporting <https://github.com/OCA/account-financial-reporting/tree/12.0/account_export_csv>`_ project on GitHub. |
|||
|
|||
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. |
@ -0,0 +1 @@ |
|||
from . import wizard |
@ -0,0 +1,20 @@ |
|||
# Copyright 2013 Camptocamp SA |
|||
# Copyright 2017 ACSONE SA/NV |
|||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). |
|||
|
|||
{ |
|||
'name': 'Account Export CSV', |
|||
'summary': "Adds accounting CSV export", |
|||
'version': '12.0.1.2.0', |
|||
'depends': [ |
|||
'account', |
|||
'date_range', |
|||
], |
|||
'author': "Camptocamp,Odoo Community Association (OCA)", |
|||
'website': 'http://www.camptocamp.com', |
|||
'license': 'AGPL-3', |
|||
'data': [ |
|||
'wizard/account_export_csv_view.xml', |
|||
], |
|||
'installable': True, |
|||
} |
@ -0,0 +1,294 @@ |
|||
# Translation of Odoo Server. |
|||
# This file contains the translation of the following modules: |
|||
# * account_export_csv |
|||
# |
|||
msgid "" |
|||
msgstr "" |
|||
"Project-Id-Version: Odoo Server 12.0\n" |
|||
"Report-Msgid-Bugs-To: \n" |
|||
"Last-Translator: <>\n" |
|||
"Language-Team: \n" |
|||
"MIME-Version: 1.0\n" |
|||
"Content-Type: text/plain; charset=UTF-8\n" |
|||
"Content-Transfer-Encoding: \n" |
|||
"Plural-Forms: \n" |
|||
|
|||
#. module: account_export_csv |
|||
#: model_terms:ir.ui.view,arch_db:account_export_csv.account_csv_export_view |
|||
msgid "<span string=\"-\" class=\"oe_inline\"/>" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:256 |
|||
#, python-format |
|||
msgid "ACCOUNT CODE" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:175 |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:267 |
|||
#, python-format |
|||
msgid "ACCOUNT NAME" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:269 |
|||
#, python-format |
|||
msgid "AMOUNT CURRENCY" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:263 |
|||
#, python-format |
|||
msgid "ANALYTIC ACCOUNT CODE" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:271 |
|||
#, python-format |
|||
msgid "ANALYTIC ACCOUNT NAME" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:172 |
|||
#, python-format |
|||
msgid "ANALYTIC CODE" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:173 |
|||
#, python-format |
|||
msgid "ANALYTIC NAME" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.actions.act_window,name:account_export_csv.action_account_csv_export |
|||
#: model:ir.ui.menu,name:account_export_csv.menu_account_csv_export |
|||
#: model_terms:ir.ui.view,arch_db:account_export_csv.account_csv_export_view |
|||
msgid "Accounting CSV Export" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: model_terms:ir.ui.view,arch_db:account_export_csv.account_csv_export_view |
|||
msgid "Analytic Balance (with accounts)" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:121 |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:178 |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:268 |
|||
#, python-format |
|||
msgid "BALANCE" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:275 |
|||
#, python-format |
|||
msgid "BANK STATEMENT" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:117 |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:174 |
|||
#, python-format |
|||
msgid "CODE" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:120 |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:177 |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:261 |
|||
#, python-format |
|||
msgid "CREDIT" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,field_description:account_export_csv.field_account_csv_export__data |
|||
msgid "CSV" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:270 |
|||
#, python-format |
|||
msgid "CURRENCY" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: model_terms:ir.ui.view,arch_db:account_export_csv.account_csv_export_view |
|||
msgid "Close" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,field_description:account_export_csv.field_account_csv_export__company_id |
|||
msgid "Company" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,field_description:account_export_csv.field_account_csv_export__create_uid |
|||
msgid "Created by" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,field_description:account_export_csv.field_account_csv_export__create_date |
|||
msgid "Created on" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:254 |
|||
#, python-format |
|||
msgid "DATE" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:119 |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:176 |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:260 |
|||
#, python-format |
|||
msgid "DEBIT" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:259 |
|||
#, python-format |
|||
msgid "DESCRIPTION" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: model_terms:ir.ui.view,arch_db:account_export_csv.account_csv_export_view |
|||
msgid "Date" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,field_description:account_export_csv.field_account_csv_export__date_end |
|||
msgid "Date End" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,field_description:account_export_csv.field_account_csv_export__date_start |
|||
msgid "Date Start" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,field_description:account_export_csv.field_account_csv_export__date_range_id |
|||
msgid "Date range" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,field_description:account_export_csv.field_account_csv_export__display_name |
|||
msgid "Display Name" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:266 |
|||
#, python-format |
|||
msgid "ENTRY NUMBER" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model,name:account_export_csv.model_account_csv_export |
|||
msgid "Export Accounting" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,field_description:account_export_csv.field_account_csv_export__export_filename |
|||
msgid "Export CSV Filename" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:262 |
|||
#, python-format |
|||
msgid "FULL RECONCILE" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,field_description:account_export_csv.field_account_csv_export__id |
|||
msgid "ID" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,help:account_export_csv.field_account_csv_export__journal_ids |
|||
msgid "If empty, use all journals, only used for journal entries" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:272 |
|||
#, python-format |
|||
msgid "JOURNAL" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:255 |
|||
#, python-format |
|||
msgid "JOURNAL CODE" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: model_terms:ir.ui.view,arch_db:account_export_csv.account_csv_export_view |
|||
msgid "Journal Entries" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,field_description:account_export_csv.field_account_csv_export__journal_ids |
|||
msgid "Journals" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,field_description:account_export_csv.field_account_csv_export____last_update |
|||
msgid "Last Modified on" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,field_description:account_export_csv.field_account_csv_export__write_uid |
|||
msgid "Last Updated by" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,field_description:account_export_csv.field_account_csv_export__write_date |
|||
msgid "Last Updated on" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:118 |
|||
#, python-format |
|||
msgid "NAME" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:257 |
|||
#, python-format |
|||
msgid "PARTNER NAME" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:258 |
|||
#, python-format |
|||
msgid "REF" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: model_terms:ir.ui.view,arch_db:account_export_csv.account_csv_export_view |
|||
msgid "Report" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:273 |
|||
#, python-format |
|||
msgid "TAX CODE" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:274 |
|||
#, python-format |
|||
msgid "TAX NAME" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: model_terms:ir.ui.view,arch_db:account_export_csv.account_csv_export_view |
|||
msgid "Trial Balance" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: model_terms:ir.ui.view,arch_db:account_export_csv.account_csv_export_view |
|||
msgid "or" |
|||
msgstr "" |
|||
|
@ -0,0 +1,297 @@ |
|||
# Translation of Odoo Server. |
|||
# This file contains the translation of the following modules: |
|||
# * account_export_csv |
|||
# |
|||
msgid "" |
|||
msgstr "" |
|||
"Project-Id-Version: Odoo Server 12.0\n" |
|||
"Report-Msgid-Bugs-To: \n" |
|||
"PO-Revision-Date: 2020-09-10 19:00+0000\n" |
|||
"Last-Translator: Ignacio Buioli <ibuioli@gmail.com>\n" |
|||
"Language-Team: none\n" |
|||
"Language: es_AR\n" |
|||
"MIME-Version: 1.0\n" |
|||
"Content-Type: text/plain; charset=UTF-8\n" |
|||
"Content-Transfer-Encoding: \n" |
|||
"Plural-Forms: nplurals=2; plural=n != 1;\n" |
|||
"X-Generator: Weblate 3.10\n" |
|||
|
|||
#. module: account_export_csv |
|||
#: model_terms:ir.ui.view,arch_db:account_export_csv.account_csv_export_view |
|||
msgid "<span string=\"-\" class=\"oe_inline\"/>" |
|||
msgstr "<span string=\"-\" class=\"oe_inline\"/>" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:256 |
|||
#, python-format |
|||
msgid "ACCOUNT CODE" |
|||
msgstr "CÓDIGO DE CUENTA" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:175 |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:267 |
|||
#, python-format |
|||
msgid "ACCOUNT NAME" |
|||
msgstr "NOMBRE DE CUENTA" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:269 |
|||
#, python-format |
|||
msgid "AMOUNT CURRENCY" |
|||
msgstr "MONEDA DE LA CUENTA" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:263 |
|||
#, python-format |
|||
msgid "ANALYTIC ACCOUNT CODE" |
|||
msgstr "CÓDIGO DE LA CUENTA ANALÍTICA" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:271 |
|||
#, python-format |
|||
msgid "ANALYTIC ACCOUNT NAME" |
|||
msgstr "NOMBRE DE LA CUENTA ANALÍTICA" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:172 |
|||
#, python-format |
|||
msgid "ANALYTIC CODE" |
|||
msgstr "CÓDIGO ANALÍTICO" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:173 |
|||
#, python-format |
|||
msgid "ANALYTIC NAME" |
|||
msgstr "NOMBRE ANALÍTICO" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.actions.act_window,name:account_export_csv.action_account_csv_export |
|||
#: model:ir.ui.menu,name:account_export_csv.menu_account_csv_export |
|||
#: model_terms:ir.ui.view,arch_db:account_export_csv.account_csv_export_view |
|||
msgid "Accounting CSV Export" |
|||
msgstr "Exportar CSV de Contabilidad" |
|||
|
|||
#. module: account_export_csv |
|||
#: model_terms:ir.ui.view,arch_db:account_export_csv.account_csv_export_view |
|||
msgid "Analytic Balance (with accounts)" |
|||
msgstr "Saldo Analítico (con cuentas)" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:121 |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:178 |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:268 |
|||
#, python-format |
|||
msgid "BALANCE" |
|||
msgstr "SALDO" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:275 |
|||
#, python-format |
|||
msgid "BANK STATEMENT" |
|||
msgstr "DECLARACIÓN BANCARIA" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:117 |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:174 |
|||
#, python-format |
|||
msgid "CODE" |
|||
msgstr "CÓDIGO" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:120 |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:177 |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:261 |
|||
#, python-format |
|||
msgid "CREDIT" |
|||
msgstr "CRÉDITO" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,field_description:account_export_csv.field_account_csv_export__data |
|||
msgid "CSV" |
|||
msgstr "CSV" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:270 |
|||
#, python-format |
|||
msgid "CURRENCY" |
|||
msgstr "MONEDA" |
|||
|
|||
#. module: account_export_csv |
|||
#: model_terms:ir.ui.view,arch_db:account_export_csv.account_csv_export_view |
|||
msgid "Close" |
|||
msgstr "Cerrar" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,field_description:account_export_csv.field_account_csv_export__company_id |
|||
msgid "Company" |
|||
msgstr "Compañía" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,field_description:account_export_csv.field_account_csv_export__create_uid |
|||
msgid "Created by" |
|||
msgstr "Creado por" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,field_description:account_export_csv.field_account_csv_export__create_date |
|||
msgid "Created on" |
|||
msgstr "Creado en" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:254 |
|||
#, python-format |
|||
msgid "DATE" |
|||
msgstr "FECHA" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:119 |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:176 |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:260 |
|||
#, python-format |
|||
msgid "DEBIT" |
|||
msgstr "DÉBITO" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:259 |
|||
#, python-format |
|||
msgid "DESCRIPTION" |
|||
msgstr "DESCRIPCIÓN" |
|||
|
|||
#. module: account_export_csv |
|||
#: model_terms:ir.ui.view,arch_db:account_export_csv.account_csv_export_view |
|||
msgid "Date" |
|||
msgstr "Fecha" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,field_description:account_export_csv.field_account_csv_export__date_end |
|||
msgid "Date End" |
|||
msgstr "Fecha fin" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,field_description:account_export_csv.field_account_csv_export__date_start |
|||
msgid "Date Start" |
|||
msgstr "Fecha inicio" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,field_description:account_export_csv.field_account_csv_export__date_range_id |
|||
msgid "Date range" |
|||
msgstr "Periodo" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,field_description:account_export_csv.field_account_csv_export__display_name |
|||
msgid "Display Name" |
|||
msgstr "Mostrar Nombre" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:266 |
|||
#, python-format |
|||
msgid "ENTRY NUMBER" |
|||
msgstr "NÚMERO DE ENTRADA" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model,name:account_export_csv.model_account_csv_export |
|||
msgid "Export Accounting" |
|||
msgstr "Exportar Contabilidad" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,field_description:account_export_csv.field_account_csv_export__export_filename |
|||
msgid "Export CSV Filename" |
|||
msgstr "Exportar Nombre del archivo CSV" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:262 |
|||
#, python-format |
|||
msgid "FULL RECONCILE" |
|||
msgstr "RECONCILIACIÓN COMPLETA" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,field_description:account_export_csv.field_account_csv_export__id |
|||
msgid "ID" |
|||
msgstr "ID" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,help:account_export_csv.field_account_csv_export__journal_ids |
|||
msgid "If empty, use all journals, only used for journal entries" |
|||
msgstr "" |
|||
"Si está vacío, usa todos los diarios, solo se usa para entradas de diario" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:272 |
|||
#, python-format |
|||
msgid "JOURNAL" |
|||
msgstr "DIARIO" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:255 |
|||
#, python-format |
|||
msgid "JOURNAL CODE" |
|||
msgstr "CÓDIGO DEL DIARIO" |
|||
|
|||
#. module: account_export_csv |
|||
#: model_terms:ir.ui.view,arch_db:account_export_csv.account_csv_export_view |
|||
msgid "Journal Entries" |
|||
msgstr "Asientos Contables" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,field_description:account_export_csv.field_account_csv_export__journal_ids |
|||
msgid "Journals" |
|||
msgstr "Diarios" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,field_description:account_export_csv.field_account_csv_export____last_update |
|||
msgid "Last Modified on" |
|||
msgstr "Última modificación en" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,field_description:account_export_csv.field_account_csv_export__write_uid |
|||
msgid "Last Updated by" |
|||
msgstr "Última modificación por" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,field_description:account_export_csv.field_account_csv_export__write_date |
|||
msgid "Last Updated on" |
|||
msgstr "Última actualización en" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:118 |
|||
#, python-format |
|||
msgid "NAME" |
|||
msgstr "NOMBRE" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:257 |
|||
#, python-format |
|||
msgid "PARTNER NAME" |
|||
msgstr "NOMBRE DEL SOCIO" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:258 |
|||
#, python-format |
|||
msgid "REF" |
|||
msgstr "REF" |
|||
|
|||
#. module: account_export_csv |
|||
#: model_terms:ir.ui.view,arch_db:account_export_csv.account_csv_export_view |
|||
msgid "Report" |
|||
msgstr "Reporte" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:273 |
|||
#, python-format |
|||
msgid "TAX CODE" |
|||
msgstr "CÓDIGO DE IMPUESTO" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:274 |
|||
#, python-format |
|||
msgid "TAX NAME" |
|||
msgstr "NOMBRE DE IMPUESTO" |
|||
|
|||
#. module: account_export_csv |
|||
#: model_terms:ir.ui.view,arch_db:account_export_csv.account_csv_export_view |
|||
msgid "Trial Balance" |
|||
msgstr "Balance de Sumas y Saldos" |
|||
|
|||
#. module: account_export_csv |
|||
#: model_terms:ir.ui.view,arch_db:account_export_csv.account_csv_export_view |
|||
msgid "or" |
|||
msgstr "o" |
@ -0,0 +1,307 @@ |
|||
# Translation of OpenERP Server. |
|||
# This file contains the translation of the following modules: |
|||
# * account_export_csv |
|||
# |
|||
msgid "" |
|||
msgstr "" |
|||
"Project-Id-Version: OpenERP Server 7.0\n" |
|||
"Report-Msgid-Bugs-To: \n" |
|||
"POT-Creation-Date: 2013-04-10 15:11+0000\n" |
|||
"PO-Revision-Date: 2021-08-03 17:49+0000\n" |
|||
"Last-Translator: Pascal GOUHIER <pascal.gouhier@copagex.fr>\n" |
|||
"Language-Team: \n" |
|||
"Language: fr\n" |
|||
"MIME-Version: 1.0\n" |
|||
"Content-Type: text/plain; charset=UTF-8\n" |
|||
"Content-Transfer-Encoding: \n" |
|||
"Plural-Forms: nplurals=2; plural=n > 1;\n" |
|||
"X-Generator: Weblate 4.3.2\n" |
|||
|
|||
#. module: account_export_csv |
|||
#: model_terms:ir.ui.view,arch_db:account_export_csv.account_csv_export_view |
|||
msgid "<span string=\"-\" class=\"oe_inline\"/>" |
|||
msgstr "<span string=\"-\" class=\"oe_inline\"/>" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:256 |
|||
#, python-format |
|||
msgid "ACCOUNT CODE" |
|||
msgstr "Numéro de compte" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:175 |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:267 |
|||
#, python-format |
|||
msgid "ACCOUNT NAME" |
|||
msgstr "NOM DU COMPTE" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:269 |
|||
#, python-format |
|||
msgid "AMOUNT CURRENCY" |
|||
msgstr "MONTANT EN DEVISE" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:263 |
|||
#, python-format |
|||
msgid "ANALYTIC ACCOUNT CODE" |
|||
msgstr "CODE DU COMPTE ANALYTIQUE" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:271 |
|||
#, python-format |
|||
msgid "ANALYTIC ACCOUNT NAME" |
|||
msgstr "NOM DU COMPTE ANALYTIQUE" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:172 |
|||
#, python-format |
|||
msgid "ANALYTIC CODE" |
|||
msgstr "CODE ANALYTIQUE" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:173 |
|||
#, python-format |
|||
msgid "ANALYTIC NAME" |
|||
msgstr "NOM ANALYTIQUE" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.actions.act_window,name:account_export_csv.action_account_csv_export |
|||
#: model:ir.ui.menu,name:account_export_csv.menu_account_csv_export |
|||
#: model_terms:ir.ui.view,arch_db:account_export_csv.account_csv_export_view |
|||
msgid "Accounting CSV Export" |
|||
msgstr "Export comptable CSV" |
|||
|
|||
#. module: account_export_csv |
|||
#: model_terms:ir.ui.view,arch_db:account_export_csv.account_csv_export_view |
|||
msgid "Analytic Balance (with accounts)" |
|||
msgstr "Balance analytique (avec comptes)" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:121 |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:178 |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:268 |
|||
#, python-format |
|||
msgid "BALANCE" |
|||
msgstr "BALANCE" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:275 |
|||
#, python-format |
|||
msgid "BANK STATEMENT" |
|||
msgstr "RELEVE BANCAIRE" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:117 |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:174 |
|||
#, python-format |
|||
msgid "CODE" |
|||
msgstr "CODE" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:120 |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:177 |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:261 |
|||
#, python-format |
|||
msgid "CREDIT" |
|||
msgstr "CREDIT" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,field_description:account_export_csv.field_account_csv_export__data |
|||
msgid "CSV" |
|||
msgstr "CSV" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:270 |
|||
#, python-format |
|||
msgid "CURRENCY" |
|||
msgstr "DEVISE" |
|||
|
|||
#. module: account_export_csv |
|||
#: model_terms:ir.ui.view,arch_db:account_export_csv.account_csv_export_view |
|||
msgid "Close" |
|||
msgstr "Fermer" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,field_description:account_export_csv.field_account_csv_export__company_id |
|||
msgid "Company" |
|||
msgstr "Société" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,field_description:account_export_csv.field_account_csv_export__create_uid |
|||
msgid "Created by" |
|||
msgstr "Créé par" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,field_description:account_export_csv.field_account_csv_export__create_date |
|||
msgid "Created on" |
|||
msgstr "Créé le" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:254 |
|||
#, python-format |
|||
msgid "DATE" |
|||
msgstr "Date" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:119 |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:176 |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:260 |
|||
#, python-format |
|||
msgid "DEBIT" |
|||
msgstr "Débit" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:259 |
|||
#, python-format |
|||
msgid "DESCRIPTION" |
|||
msgstr "DESCRIPTION" |
|||
|
|||
#. module: account_export_csv |
|||
#: model_terms:ir.ui.view,arch_db:account_export_csv.account_csv_export_view |
|||
msgid "Date" |
|||
msgstr "Date" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,field_description:account_export_csv.field_account_csv_export__date_end |
|||
msgid "Date End" |
|||
msgstr "Date de fin" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,field_description:account_export_csv.field_account_csv_export__date_start |
|||
msgid "Date Start" |
|||
msgstr "Date de début de période" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,field_description:account_export_csv.field_account_csv_export__date_range_id |
|||
msgid "Date range" |
|||
msgstr "Période" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,field_description:account_export_csv.field_account_csv_export__display_name |
|||
msgid "Display Name" |
|||
msgstr "Nom affiché" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:266 |
|||
#, python-format |
|||
msgid "ENTRY NUMBER" |
|||
msgstr "Numéro d'écriture" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model,name:account_export_csv.model_account_csv_export |
|||
msgid "Export Accounting" |
|||
msgstr "Export comptable" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,field_description:account_export_csv.field_account_csv_export__export_filename |
|||
msgid "Export CSV Filename" |
|||
msgstr "Nom du fichier CSV d'export" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:262 |
|||
#, python-format |
|||
msgid "FULL RECONCILE" |
|||
msgstr "RECONCILIATION COMPLETE" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,field_description:account_export_csv.field_account_csv_export__id |
|||
msgid "ID" |
|||
msgstr "ID" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,help:account_export_csv.field_account_csv_export__journal_ids |
|||
msgid "If empty, use all journals, only used for journal entries" |
|||
msgstr "" |
|||
"Si vide, utilise tous les journaux, utilisé uniquement pour les écritures" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:272 |
|||
#, python-format |
|||
msgid "JOURNAL" |
|||
msgstr "JOURNAL" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:255 |
|||
#, python-format |
|||
msgid "JOURNAL CODE" |
|||
msgstr "CODE DU JOURNAL" |
|||
|
|||
#. module: account_export_csv |
|||
#: model_terms:ir.ui.view,arch_db:account_export_csv.account_csv_export_view |
|||
msgid "Journal Entries" |
|||
msgstr "Ecritures comptables" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,field_description:account_export_csv.field_account_csv_export__journal_ids |
|||
msgid "Journals" |
|||
msgstr "Journaux" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,field_description:account_export_csv.field_account_csv_export____last_update |
|||
msgid "Last Modified on" |
|||
msgstr "Dernière modification le" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,field_description:account_export_csv.field_account_csv_export__write_uid |
|||
msgid "Last Updated by" |
|||
msgstr "Dernière mise à jour par" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,field_description:account_export_csv.field_account_csv_export__write_date |
|||
msgid "Last Updated on" |
|||
msgstr "Dernière mise à jour le" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:118 |
|||
#, python-format |
|||
msgid "NAME" |
|||
msgstr "NOM" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:257 |
|||
#, python-format |
|||
msgid "PARTNER NAME" |
|||
msgstr "Nom du partenaire" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:258 |
|||
#, python-format |
|||
msgid "REF" |
|||
msgstr "REF" |
|||
|
|||
#. module: account_export_csv |
|||
#: model_terms:ir.ui.view,arch_db:account_export_csv.account_csv_export_view |
|||
msgid "Report" |
|||
msgstr "Rapport" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:273 |
|||
#, python-format |
|||
msgid "TAX CODE" |
|||
msgstr "CODE DE TAXE" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:274 |
|||
#, python-format |
|||
msgid "TAX NAME" |
|||
msgstr "NOM DE TAXE" |
|||
|
|||
#. module: account_export_csv |
|||
#: model_terms:ir.ui.view,arch_db:account_export_csv.account_csv_export_view |
|||
msgid "Trial Balance" |
|||
msgstr "Balance générale" |
|||
|
|||
#. module: account_export_csv |
|||
#: model_terms:ir.ui.view,arch_db:account_export_csv.account_csv_export_view |
|||
msgid "or" |
|||
msgstr "ou" |
|||
|
|||
#~ msgid "All periods in the fiscal year if empty" |
|||
#~ msgstr "Toutes les périodes de l'année fiscale si vide" |
|||
|
|||
#~ msgid "Periods" |
|||
#~ msgstr "Périodes" |
|||
|
|||
#~ msgid "Fiscalyear" |
|||
#~ msgstr "Année fiscale" |
@ -0,0 +1,297 @@ |
|||
# Translation of Odoo Server. |
|||
# This file contains the translation of the following modules: |
|||
# * account_export_csv |
|||
# |
|||
msgid "" |
|||
msgstr "" |
|||
"Project-Id-Version: Odoo Server 12.0\n" |
|||
"Report-Msgid-Bugs-To: \n" |
|||
"PO-Revision-Date: 2020-03-05 12:13+0000\n" |
|||
"Last-Translator: Bole <bole@dajmi5.com>\n" |
|||
"Language-Team: none\n" |
|||
"Language: hr\n" |
|||
"MIME-Version: 1.0\n" |
|||
"Content-Type: text/plain; charset=UTF-8\n" |
|||
"Content-Transfer-Encoding: \n" |
|||
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" |
|||
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" |
|||
"X-Generator: Weblate 3.10\n" |
|||
|
|||
#. module: account_export_csv |
|||
#: model_terms:ir.ui.view,arch_db:account_export_csv.account_csv_export_view |
|||
msgid "<span string=\"-\" class=\"oe_inline\"/>" |
|||
msgstr "<span string=\"-\" class=\"oe_inline\"/>" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:256 |
|||
#, python-format |
|||
msgid "ACCOUNT CODE" |
|||
msgstr "ŠIFRA KONTA" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:175 |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:267 |
|||
#, python-format |
|||
msgid "ACCOUNT NAME" |
|||
msgstr "NAZIV KONTA" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:269 |
|||
#, python-format |
|||
msgid "AMOUNT CURRENCY" |
|||
msgstr "IZNOS U VALUTI" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:263 |
|||
#, python-format |
|||
msgid "ANALYTIC ACCOUNT CODE" |
|||
msgstr "ŠIFRA ANALITIČKOG KONTA" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:271 |
|||
#, python-format |
|||
msgid "ANALYTIC ACCOUNT NAME" |
|||
msgstr "NAZIV ANALITIČKOG KONTA" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:172 |
|||
#, python-format |
|||
msgid "ANALYTIC CODE" |
|||
msgstr "ŠIFRA ANALITIKE" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:173 |
|||
#, python-format |
|||
msgid "ANALYTIC NAME" |
|||
msgstr "NAZIV ANALITIKE" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.actions.act_window,name:account_export_csv.action_account_csv_export |
|||
#: model:ir.ui.menu,name:account_export_csv.menu_account_csv_export |
|||
#: model_terms:ir.ui.view,arch_db:account_export_csv.account_csv_export_view |
|||
msgid "Accounting CSV Export" |
|||
msgstr "Izvoz podataka u CSV" |
|||
|
|||
#. module: account_export_csv |
|||
#: model_terms:ir.ui.view,arch_db:account_export_csv.account_csv_export_view |
|||
msgid "Analytic Balance (with accounts)" |
|||
msgstr "Analitički saldo (sa kontima)" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:121 |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:178 |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:268 |
|||
#, python-format |
|||
msgid "BALANCE" |
|||
msgstr "SALDO" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:275 |
|||
#, python-format |
|||
msgid "BANK STATEMENT" |
|||
msgstr "BANKOVNI IZVOD" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:117 |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:174 |
|||
#, python-format |
|||
msgid "CODE" |
|||
msgstr "ŠIFRA" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:120 |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:177 |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:261 |
|||
#, python-format |
|||
msgid "CREDIT" |
|||
msgstr "POTRAŽUJE" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,field_description:account_export_csv.field_account_csv_export__data |
|||
msgid "CSV" |
|||
msgstr "CSV" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:270 |
|||
#, python-format |
|||
msgid "CURRENCY" |
|||
msgstr "VALUTA" |
|||
|
|||
#. module: account_export_csv |
|||
#: model_terms:ir.ui.view,arch_db:account_export_csv.account_csv_export_view |
|||
msgid "Close" |
|||
msgstr "Zatvori" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,field_description:account_export_csv.field_account_csv_export__company_id |
|||
msgid "Company" |
|||
msgstr "Tvrtka" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,field_description:account_export_csv.field_account_csv_export__create_uid |
|||
msgid "Created by" |
|||
msgstr "Kreirao" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,field_description:account_export_csv.field_account_csv_export__create_date |
|||
msgid "Created on" |
|||
msgstr "Kreirano" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:254 |
|||
#, python-format |
|||
msgid "DATE" |
|||
msgstr "DATUM" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:119 |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:176 |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:260 |
|||
#, python-format |
|||
msgid "DEBIT" |
|||
msgstr "DUGUJE" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:259 |
|||
#, python-format |
|||
msgid "DESCRIPTION" |
|||
msgstr "OPIS" |
|||
|
|||
#. module: account_export_csv |
|||
#: model_terms:ir.ui.view,arch_db:account_export_csv.account_csv_export_view |
|||
msgid "Date" |
|||
msgstr "Datum" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,field_description:account_export_csv.field_account_csv_export__date_end |
|||
msgid "Date End" |
|||
msgstr "Završni datum" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,field_description:account_export_csv.field_account_csv_export__date_start |
|||
msgid "Date Start" |
|||
msgstr "Početni datum" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,field_description:account_export_csv.field_account_csv_export__date_range_id |
|||
msgid "Date range" |
|||
msgstr "Raspon datuma" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,field_description:account_export_csv.field_account_csv_export__display_name |
|||
msgid "Display Name" |
|||
msgstr "Naziv" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:266 |
|||
#, python-format |
|||
msgid "ENTRY NUMBER" |
|||
msgstr "BROJ STAVKE" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model,name:account_export_csv.model_account_csv_export |
|||
msgid "Export Accounting" |
|||
msgstr "Izvoz podataka računovodstva" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,field_description:account_export_csv.field_account_csv_export__export_filename |
|||
msgid "Export CSV Filename" |
|||
msgstr "Naziv CVS datoteke" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:262 |
|||
#, python-format |
|||
msgid "FULL RECONCILE" |
|||
msgstr "POTPUNO ZATVORENO" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,field_description:account_export_csv.field_account_csv_export__id |
|||
msgid "ID" |
|||
msgstr "ID" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,help:account_export_csv.field_account_csv_export__journal_ids |
|||
msgid "If empty, use all journals, only used for journal entries" |
|||
msgstr "Ako je prazno, koristi sve dnevnike, samo se odnosi na stavke dnevnika" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:272 |
|||
#, python-format |
|||
msgid "JOURNAL" |
|||
msgstr "DNEVNIK" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:255 |
|||
#, python-format |
|||
msgid "JOURNAL CODE" |
|||
msgstr "ŠIFRA DNEVNIKA" |
|||
|
|||
#. module: account_export_csv |
|||
#: model_terms:ir.ui.view,arch_db:account_export_csv.account_csv_export_view |
|||
msgid "Journal Entries" |
|||
msgstr "Stavke dnevnika" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,field_description:account_export_csv.field_account_csv_export__journal_ids |
|||
msgid "Journals" |
|||
msgstr "Dnevnici" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,field_description:account_export_csv.field_account_csv_export____last_update |
|||
msgid "Last Modified on" |
|||
msgstr "Zadnje modificirano" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,field_description:account_export_csv.field_account_csv_export__write_uid |
|||
msgid "Last Updated by" |
|||
msgstr "Zadnje ažurirao" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,field_description:account_export_csv.field_account_csv_export__write_date |
|||
msgid "Last Updated on" |
|||
msgstr "Zadnje ažurirano" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:118 |
|||
#, python-format |
|||
msgid "NAME" |
|||
msgstr "NAZIV" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:257 |
|||
#, python-format |
|||
msgid "PARTNER NAME" |
|||
msgstr "NAZIV PARTNERA" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:258 |
|||
#, python-format |
|||
msgid "REF" |
|||
msgstr "REF" |
|||
|
|||
#. module: account_export_csv |
|||
#: model_terms:ir.ui.view,arch_db:account_export_csv.account_csv_export_view |
|||
msgid "Report" |
|||
msgstr "Izvještaj" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:273 |
|||
#, python-format |
|||
msgid "TAX CODE" |
|||
msgstr "ŠIFRA POREZA" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:274 |
|||
#, python-format |
|||
msgid "TAX NAME" |
|||
msgstr "NAZIV POREZA" |
|||
|
|||
#. module: account_export_csv |
|||
#: model_terms:ir.ui.view,arch_db:account_export_csv.account_csv_export_view |
|||
msgid "Trial Balance" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: model_terms:ir.ui.view,arch_db:account_export_csv.account_csv_export_view |
|||
msgid "or" |
|||
msgstr "ili" |
@ -0,0 +1,305 @@ |
|||
# Translation of OpenERP Server. |
|||
# This file contains the translation of the following modules: |
|||
# * account_export_csv |
|||
# |
|||
msgid "" |
|||
msgstr "" |
|||
"Project-Id-Version: OpenERP Server 7.0\n" |
|||
"Report-Msgid-Bugs-To: \n" |
|||
"POT-Creation-Date: 2013-08-22 12:52+0000\n" |
|||
"PO-Revision-Date: 2013-08-22 12:52+0000\n" |
|||
"Last-Translator: <stefan@therp.nl>\n" |
|||
"Language-Team: \n" |
|||
"Language: \n" |
|||
"MIME-Version: 1.0\n" |
|||
"Content-Type: text/plain; charset=UTF-8\n" |
|||
"Content-Transfer-Encoding: \n" |
|||
"Plural-Forms: \n" |
|||
|
|||
#. module: account_export_csv |
|||
#: model_terms:ir.ui.view,arch_db:account_export_csv.account_csv_export_view |
|||
msgid "<span string=\"-\" class=\"oe_inline\"/>" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:256 |
|||
#, python-format |
|||
msgid "ACCOUNT CODE" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:175 |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:267 |
|||
#, python-format |
|||
msgid "ACCOUNT NAME" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:269 |
|||
#, python-format |
|||
msgid "AMOUNT CURRENCY" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:263 |
|||
#, python-format |
|||
msgid "ANALYTIC ACCOUNT CODE" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:271 |
|||
#, python-format |
|||
msgid "ANALYTIC ACCOUNT NAME" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:172 |
|||
#, python-format |
|||
msgid "ANALYTIC CODE" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:173 |
|||
#, python-format |
|||
msgid "ANALYTIC NAME" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.actions.act_window,name:account_export_csv.action_account_csv_export |
|||
#: model:ir.ui.menu,name:account_export_csv.menu_account_csv_export |
|||
#: model_terms:ir.ui.view,arch_db:account_export_csv.account_csv_export_view |
|||
msgid "Accounting CSV Export" |
|||
msgstr "CSV export financiën" |
|||
|
|||
#. module: account_export_csv |
|||
#: model_terms:ir.ui.view,arch_db:account_export_csv.account_csv_export_view |
|||
msgid "Analytic Balance (with accounts)" |
|||
msgstr "Kostenplaatsenbalans (met rekeningen)" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:121 |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:178 |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:268 |
|||
#, python-format |
|||
msgid "BALANCE" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:275 |
|||
#, python-format |
|||
msgid "BANK STATEMENT" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:117 |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:174 |
|||
#, python-format |
|||
msgid "CODE" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:120 |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:177 |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:261 |
|||
#, python-format |
|||
msgid "CREDIT" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,field_description:account_export_csv.field_account_csv_export__data |
|||
msgid "CSV" |
|||
msgstr "CSV" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:270 |
|||
#, python-format |
|||
msgid "CURRENCY" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: model_terms:ir.ui.view,arch_db:account_export_csv.account_csv_export_view |
|||
msgid "Close" |
|||
msgstr "Sluiten" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,field_description:account_export_csv.field_account_csv_export__company_id |
|||
msgid "Company" |
|||
msgstr "Bedrijf" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,field_description:account_export_csv.field_account_csv_export__create_uid |
|||
msgid "Created by" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,field_description:account_export_csv.field_account_csv_export__create_date |
|||
msgid "Created on" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:254 |
|||
#, python-format |
|||
msgid "DATE" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:119 |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:176 |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:260 |
|||
#, python-format |
|||
msgid "DEBIT" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:259 |
|||
#, python-format |
|||
msgid "DESCRIPTION" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: model_terms:ir.ui.view,arch_db:account_export_csv.account_csv_export_view |
|||
msgid "Date" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,field_description:account_export_csv.field_account_csv_export__date_end |
|||
msgid "Date End" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,field_description:account_export_csv.field_account_csv_export__date_start |
|||
msgid "Date Start" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,field_description:account_export_csv.field_account_csv_export__date_range_id |
|||
msgid "Date range" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,field_description:account_export_csv.field_account_csv_export__display_name |
|||
msgid "Display Name" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:266 |
|||
#, python-format |
|||
msgid "ENTRY NUMBER" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model,name:account_export_csv.model_account_csv_export |
|||
msgid "Export Accounting" |
|||
msgstr "Export Financiën" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,field_description:account_export_csv.field_account_csv_export__export_filename |
|||
msgid "Export CSV Filename" |
|||
msgstr "Export CSV bestandsnaam" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:262 |
|||
#, python-format |
|||
msgid "FULL RECONCILE" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,field_description:account_export_csv.field_account_csv_export__id |
|||
msgid "ID" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,help:account_export_csv.field_account_csv_export__journal_ids |
|||
msgid "If empty, use all journals, only used for journal entries" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:272 |
|||
#, python-format |
|||
msgid "JOURNAL" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:255 |
|||
#, python-format |
|||
msgid "JOURNAL CODE" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: model_terms:ir.ui.view,arch_db:account_export_csv.account_csv_export_view |
|||
msgid "Journal Entries" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,field_description:account_export_csv.field_account_csv_export__journal_ids |
|||
msgid "Journals" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,field_description:account_export_csv.field_account_csv_export____last_update |
|||
msgid "Last Modified on" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,field_description:account_export_csv.field_account_csv_export__write_uid |
|||
msgid "Last Updated by" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,field_description:account_export_csv.field_account_csv_export__write_date |
|||
msgid "Last Updated on" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:118 |
|||
#, python-format |
|||
msgid "NAME" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:257 |
|||
#, python-format |
|||
msgid "PARTNER NAME" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:258 |
|||
#, python-format |
|||
msgid "REF" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: model_terms:ir.ui.view,arch_db:account_export_csv.account_csv_export_view |
|||
msgid "Report" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:273 |
|||
#, python-format |
|||
msgid "TAX CODE" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:274 |
|||
#, python-format |
|||
msgid "TAX NAME" |
|||
msgstr "" |
|||
|
|||
#. module: account_export_csv |
|||
#: model_terms:ir.ui.view,arch_db:account_export_csv.account_csv_export_view |
|||
msgid "Trial Balance" |
|||
msgstr "Proefbalans" |
|||
|
|||
#. module: account_export_csv |
|||
#: model_terms:ir.ui.view,arch_db:account_export_csv.account_csv_export_view |
|||
msgid "or" |
|||
msgstr "" |
|||
|
|||
#~ msgid "All periods in the fiscal year if empty" |
|||
#~ msgstr "Alle periodes van het boekjaar indien leeg" |
|||
|
|||
#~ msgid "Periods" |
|||
#~ msgstr "Periodes" |
|||
|
|||
#~ msgid "Fiscalyear" |
|||
#~ msgstr "Boekjaar" |
@ -0,0 +1,296 @@ |
|||
# Translation of Odoo Server. |
|||
# This file contains the translation of the following modules: |
|||
# * account_export_csv |
|||
# |
|||
msgid "" |
|||
msgstr "" |
|||
"Project-Id-Version: Odoo Server 12.0\n" |
|||
"Report-Msgid-Bugs-To: \n" |
|||
"PO-Revision-Date: 2020-06-17 23:19+0000\n" |
|||
"Last-Translator: Fernando Colus <fcolus1@gmail.com>\n" |
|||
"Language-Team: none\n" |
|||
"Language: pt\n" |
|||
"MIME-Version: 1.0\n" |
|||
"Content-Type: text/plain; charset=UTF-8\n" |
|||
"Content-Transfer-Encoding: \n" |
|||
"Plural-Forms: nplurals=2; plural=n > 1;\n" |
|||
"X-Generator: Weblate 3.10\n" |
|||
|
|||
#. module: account_export_csv |
|||
#: model_terms:ir.ui.view,arch_db:account_export_csv.account_csv_export_view |
|||
msgid "<span string=\"-\" class=\"oe_inline\"/>" |
|||
msgstr "<span string=\"-\" class=\"oe_inline\"/>" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:256 |
|||
#, python-format |
|||
msgid "ACCOUNT CODE" |
|||
msgstr "CÓDIGO DE CONTA" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:175 |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:267 |
|||
#, python-format |
|||
msgid "ACCOUNT NAME" |
|||
msgstr "NOME DA CONTA" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:269 |
|||
#, python-format |
|||
msgid "AMOUNT CURRENCY" |
|||
msgstr "MONTANTE DA MOEDA" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:263 |
|||
#, python-format |
|||
msgid "ANALYTIC ACCOUNT CODE" |
|||
msgstr "CÓDIGO DE CONTA ANALÍTICA" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:271 |
|||
#, python-format |
|||
msgid "ANALYTIC ACCOUNT NAME" |
|||
msgstr "NOME DA CONTA ANALÍTICA" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:172 |
|||
#, python-format |
|||
msgid "ANALYTIC CODE" |
|||
msgstr "CÓDIGO ANALÍTICO" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:173 |
|||
#, python-format |
|||
msgid "ANALYTIC NAME" |
|||
msgstr "NOME ANALÍTICO" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.actions.act_window,name:account_export_csv.action_account_csv_export |
|||
#: model:ir.ui.menu,name:account_export_csv.menu_account_csv_export |
|||
#: model_terms:ir.ui.view,arch_db:account_export_csv.account_csv_export_view |
|||
msgid "Accounting CSV Export" |
|||
msgstr "Exportador de Contas csv" |
|||
|
|||
#. module: account_export_csv |
|||
#: model_terms:ir.ui.view,arch_db:account_export_csv.account_csv_export_view |
|||
msgid "Analytic Balance (with accounts)" |
|||
msgstr "Saldo Analítico (com contas)" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:121 |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:178 |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:268 |
|||
#, python-format |
|||
msgid "BALANCE" |
|||
msgstr "SALDO" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:275 |
|||
#, python-format |
|||
msgid "BANK STATEMENT" |
|||
msgstr "EXTRATO BANCÁRIO" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:117 |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:174 |
|||
#, python-format |
|||
msgid "CODE" |
|||
msgstr "CÓDIGO" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:120 |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:177 |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:261 |
|||
#, python-format |
|||
msgid "CREDIT" |
|||
msgstr "CRÉDITO" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,field_description:account_export_csv.field_account_csv_export__data |
|||
msgid "CSV" |
|||
msgstr "CSV" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:270 |
|||
#, python-format |
|||
msgid "CURRENCY" |
|||
msgstr "DIVISA" |
|||
|
|||
#. module: account_export_csv |
|||
#: model_terms:ir.ui.view,arch_db:account_export_csv.account_csv_export_view |
|||
msgid "Close" |
|||
msgstr "Fecho" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,field_description:account_export_csv.field_account_csv_export__company_id |
|||
msgid "Company" |
|||
msgstr "Empresa" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,field_description:account_export_csv.field_account_csv_export__create_uid |
|||
msgid "Created by" |
|||
msgstr "Criado por" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,field_description:account_export_csv.field_account_csv_export__create_date |
|||
msgid "Created on" |
|||
msgstr "Criado em" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:254 |
|||
#, python-format |
|||
msgid "DATE" |
|||
msgstr "DATA" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:119 |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:176 |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:260 |
|||
#, python-format |
|||
msgid "DEBIT" |
|||
msgstr "DÉBITO" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:259 |
|||
#, python-format |
|||
msgid "DESCRIPTION" |
|||
msgstr "DESCRIÇÃO" |
|||
|
|||
#. module: account_export_csv |
|||
#: model_terms:ir.ui.view,arch_db:account_export_csv.account_csv_export_view |
|||
msgid "Date" |
|||
msgstr "Data" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,field_description:account_export_csv.field_account_csv_export__date_end |
|||
msgid "Date End" |
|||
msgstr "Data Final" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,field_description:account_export_csv.field_account_csv_export__date_start |
|||
msgid "Date Start" |
|||
msgstr "Data Inicial" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,field_description:account_export_csv.field_account_csv_export__date_range_id |
|||
msgid "Date range" |
|||
msgstr "Período" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,field_description:account_export_csv.field_account_csv_export__display_name |
|||
msgid "Display Name" |
|||
msgstr "Exibir nome" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:266 |
|||
#, python-format |
|||
msgid "ENTRY NUMBER" |
|||
msgstr "NÚMERO DO MOVIMENTO" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model,name:account_export_csv.model_account_csv_export |
|||
msgid "Export Accounting" |
|||
msgstr "Exportar Contabilidade" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,field_description:account_export_csv.field_account_csv_export__export_filename |
|||
msgid "Export CSV Filename" |
|||
msgstr "Exportar Ficheiro CSV" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:262 |
|||
#, python-format |
|||
msgid "FULL RECONCILE" |
|||
msgstr "RECONCILIAÇÃO COMPLETA" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,field_description:account_export_csv.field_account_csv_export__id |
|||
msgid "ID" |
|||
msgstr "ID" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,help:account_export_csv.field_account_csv_export__journal_ids |
|||
msgid "If empty, use all journals, only used for journal entries" |
|||
msgstr "Se vazio, usa todos os diários, apenas usada para movimentos de diário" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:272 |
|||
#, python-format |
|||
msgid "JOURNAL" |
|||
msgstr "DIÁRIO" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:255 |
|||
#, python-format |
|||
msgid "JOURNAL CODE" |
|||
msgstr "CÓDIGO DE DIÁRIO" |
|||
|
|||
#. module: account_export_csv |
|||
#: model_terms:ir.ui.view,arch_db:account_export_csv.account_csv_export_view |
|||
msgid "Journal Entries" |
|||
msgstr "Movimentos de Diário" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,field_description:account_export_csv.field_account_csv_export__journal_ids |
|||
msgid "Journals" |
|||
msgstr "Diários" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,field_description:account_export_csv.field_account_csv_export____last_update |
|||
msgid "Last Modified on" |
|||
msgstr "Última modificação em" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,field_description:account_export_csv.field_account_csv_export__write_uid |
|||
msgid "Last Updated by" |
|||
msgstr "Última Atualização Feita em" |
|||
|
|||
#. module: account_export_csv |
|||
#: model:ir.model.fields,field_description:account_export_csv.field_account_csv_export__write_date |
|||
msgid "Last Updated on" |
|||
msgstr "Última Atualização em" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:118 |
|||
#, python-format |
|||
msgid "NAME" |
|||
msgstr "NOME" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:257 |
|||
#, python-format |
|||
msgid "PARTNER NAME" |
|||
msgstr "NOME DO PARCEIRO" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:258 |
|||
#, python-format |
|||
msgid "REF" |
|||
msgstr "REF" |
|||
|
|||
#. module: account_export_csv |
|||
#: model_terms:ir.ui.view,arch_db:account_export_csv.account_csv_export_view |
|||
msgid "Report" |
|||
msgstr "Relatório" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:273 |
|||
#, python-format |
|||
msgid "TAX CODE" |
|||
msgstr "CÓDIGO DE IMPOSTO" |
|||
|
|||
#. module: account_export_csv |
|||
#: code:addons/account_export_csv/wizard/account_export_csv.py:274 |
|||
#, python-format |
|||
msgid "TAX NAME" |
|||
msgstr "NOME DE IMPOSTO" |
|||
|
|||
#. module: account_export_csv |
|||
#: model_terms:ir.ui.view,arch_db:account_export_csv.account_csv_export_view |
|||
msgid "Trial Balance" |
|||
msgstr "Balancete" |
|||
|
|||
#. module: account_export_csv |
|||
#: model_terms:ir.ui.view,arch_db:account_export_csv.account_csv_export_view |
|||
msgid "or" |
|||
msgstr "ou" |
@ -0,0 +1,16 @@ |
|||
* Camptocamp |
|||
|
|||
* Yannick Vaucher <yannick.vaucher@camptocamp.com> |
|||
* Alexandre Fayolle <alexandre.fayolle@camptocamp.com> |
|||
* Vincent Renaville <vincent.renaville@camptocamp.com> |
|||
* Guewen Baconnier <guewen.baconnier@camptocamp.com> |
|||
|
|||
* Acsone |
|||
|
|||
* Stéphane Bidoul <stephane.bidoul@acsone.eu> |
|||
* Laetitia Gangloff <laetitia.gangloff@acsone.eu> |
|||
* Adrien Peiffer <adrien.peiffer@acsone.eu> |
|||
|
|||
* Akretion |
|||
|
|||
* David Béal <david.beal@akretion.com> |
@ -0,0 +1,9 @@ |
|||
|
|||
Add a wizard that allow you to export a csv file based on accounting |
|||
journal entries |
|||
|
|||
- Trial Balance |
|||
- Analytic Balance (with accounts) |
|||
- Journal Entries |
|||
|
|||
You can filter by date range |
@ -0,0 +1,2 @@ |
|||
|
|||
* rearange wizard view with only one button to generate file plus define a selection list to select report type |
After Width: 128 | Height: 128 | Size: 9.2 KiB |
@ -0,0 +1,426 @@ |
|||
<?xml version="1.0" encoding="utf-8" ?> |
|||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> |
|||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> |
|||
<head> |
|||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> |
|||
<meta name="generator" content="Docutils 0.15.1: http://docutils.sourceforge.net/" /> |
|||
<title>Account Export CSV</title> |
|||
<style type="text/css"> |
|||
|
|||
/* |
|||
:Author: David Goodger (goodger@python.org) |
|||
:Id: $Id: html4css1.css 7952 2016-07-26 18:15:59Z milde $ |
|||
:Copyright: This stylesheet has been placed in the public domain. |
|||
|
|||
Default cascading style sheet for the HTML output of Docutils. |
|||
|
|||
See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to |
|||
customize this style sheet. |
|||
*/ |
|||
|
|||
/* used to remove borders from tables and images */ |
|||
.borderless, table.borderless td, table.borderless th { |
|||
border: 0 } |
|||
|
|||
table.borderless td, table.borderless th { |
|||
/* Override padding for "table.docutils td" with "! important". |
|||
The right padding separates the table cells. */ |
|||
padding: 0 0.5em 0 0 ! important } |
|||
|
|||
.first { |
|||
/* Override more specific margin styles with "! important". */ |
|||
margin-top: 0 ! important } |
|||
|
|||
.last, .with-subtitle { |
|||
margin-bottom: 0 ! important } |
|||
|
|||
.hidden { |
|||
display: none } |
|||
|
|||
.subscript { |
|||
vertical-align: sub; |
|||
font-size: smaller } |
|||
|
|||
.superscript { |
|||
vertical-align: super; |
|||
font-size: smaller } |
|||
|
|||
a.toc-backref { |
|||
text-decoration: none ; |
|||
color: black } |
|||
|
|||
blockquote.epigraph { |
|||
margin: 2em 5em ; } |
|||
|
|||
dl.docutils dd { |
|||
margin-bottom: 0.5em } |
|||
|
|||
object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] { |
|||
overflow: hidden; |
|||
} |
|||
|
|||
/* Uncomment (and remove this text!) to get bold-faced definition list terms |
|||
dl.docutils dt { |
|||
font-weight: bold } |
|||
*/ |
|||
|
|||
div.abstract { |
|||
margin: 2em 5em } |
|||
|
|||
div.abstract p.topic-title { |
|||
font-weight: bold ; |
|||
text-align: center } |
|||
|
|||
div.admonition, div.attention, div.caution, div.danger, div.error, |
|||
div.hint, div.important, div.note, div.tip, div.warning { |
|||
margin: 2em ; |
|||
border: medium outset ; |
|||
padding: 1em } |
|||
|
|||
div.admonition p.admonition-title, div.hint p.admonition-title, |
|||
div.important p.admonition-title, div.note p.admonition-title, |
|||
div.tip p.admonition-title { |
|||
font-weight: bold ; |
|||
font-family: sans-serif } |
|||
|
|||
div.attention p.admonition-title, div.caution p.admonition-title, |
|||
div.danger p.admonition-title, div.error p.admonition-title, |
|||
div.warning p.admonition-title, .code .error { |
|||
color: red ; |
|||
font-weight: bold ; |
|||
font-family: sans-serif } |
|||
|
|||
/* Uncomment (and remove this text!) to get reduced vertical space in |
|||
compound paragraphs. |
|||
div.compound .compound-first, div.compound .compound-middle { |
|||
margin-bottom: 0.5em } |
|||
|
|||
div.compound .compound-last, div.compound .compound-middle { |
|||
margin-top: 0.5em } |
|||
*/ |
|||
|
|||
div.dedication { |
|||
margin: 2em 5em ; |
|||
text-align: center ; |
|||
font-style: italic } |
|||
|
|||
div.dedication p.topic-title { |
|||
font-weight: bold ; |
|||
font-style: normal } |
|||
|
|||
div.figure { |
|||
margin-left: 2em ; |
|||
margin-right: 2em } |
|||
|
|||
div.footer, div.header { |
|||
clear: both; |
|||
font-size: smaller } |
|||
|
|||
div.line-block { |
|||
display: block ; |
|||
margin-top: 1em ; |
|||
margin-bottom: 1em } |
|||
|
|||
div.line-block div.line-block { |
|||
margin-top: 0 ; |
|||
margin-bottom: 0 ; |
|||
margin-left: 1.5em } |
|||
|
|||
div.sidebar { |
|||
margin: 0 0 0.5em 1em ; |
|||
border: medium outset ; |
|||
padding: 1em ; |
|||
background-color: #ffffee ; |
|||
width: 40% ; |
|||
float: right ; |
|||
clear: right } |
|||
|
|||
div.sidebar p.rubric { |
|||
font-family: sans-serif ; |
|||
font-size: medium } |
|||
|
|||
div.system-messages { |
|||
margin: 5em } |
|||
|
|||
div.system-messages h1 { |
|||
color: red } |
|||
|
|||
div.system-message { |
|||
border: medium outset ; |
|||
padding: 1em } |
|||
|
|||
div.system-message p.system-message-title { |
|||
color: red ; |
|||
font-weight: bold } |
|||
|
|||
div.topic { |
|||
margin: 2em } |
|||
|
|||
h1.section-subtitle, h2.section-subtitle, h3.section-subtitle, |
|||
h4.section-subtitle, h5.section-subtitle, h6.section-subtitle { |
|||
margin-top: 0.4em } |
|||
|
|||
h1.title { |
|||
text-align: center } |
|||
|
|||
h2.subtitle { |
|||
text-align: center } |
|||
|
|||
hr.docutils { |
|||
width: 75% } |
|||
|
|||
img.align-left, .figure.align-left, object.align-left, table.align-left { |
|||
clear: left ; |
|||
float: left ; |
|||
margin-right: 1em } |
|||
|
|||
img.align-right, .figure.align-right, object.align-right, table.align-right { |
|||
clear: right ; |
|||
float: right ; |
|||
margin-left: 1em } |
|||
|
|||
img.align-center, .figure.align-center, object.align-center { |
|||
display: block; |
|||
margin-left: auto; |
|||
margin-right: auto; |
|||
} |
|||
|
|||
table.align-center { |
|||
margin-left: auto; |
|||
margin-right: auto; |
|||
} |
|||
|
|||
.align-left { |
|||
text-align: left } |
|||
|
|||
.align-center { |
|||
clear: both ; |
|||
text-align: center } |
|||
|
|||
.align-right { |
|||
text-align: right } |
|||
|
|||
/* reset inner alignment in figures */ |
|||
div.align-right { |
|||
text-align: inherit } |
|||
|
|||
/* div.align-center * { */ |
|||
/* text-align: left } */ |
|||
|
|||
.align-top { |
|||
vertical-align: top } |
|||
|
|||
.align-middle { |
|||
vertical-align: middle } |
|||
|
|||
.align-bottom { |
|||
vertical-align: bottom } |
|||
|
|||
ol.simple, ul.simple { |
|||
margin-bottom: 1em } |
|||
|
|||
ol.arabic { |
|||
list-style: decimal } |
|||
|
|||
ol.loweralpha { |
|||
list-style: lower-alpha } |
|||
|
|||
ol.upperalpha { |
|||
list-style: upper-alpha } |
|||
|
|||
ol.lowerroman { |
|||
list-style: lower-roman } |
|||
|
|||
ol.upperroman { |
|||
list-style: upper-roman } |
|||
|
|||
p.attribution { |
|||
text-align: right ; |
|||
margin-left: 50% } |
|||
|
|||
p.caption { |
|||
font-style: italic } |
|||
|
|||
p.credits { |
|||
font-style: italic ; |
|||
font-size: smaller } |
|||
|
|||
p.label { |
|||
white-space: nowrap } |
|||
|
|||
p.rubric { |
|||
font-weight: bold ; |
|||
font-size: larger ; |
|||
color: maroon ; |
|||
text-align: center } |
|||
|
|||
p.sidebar-title { |
|||
font-family: sans-serif ; |
|||
font-weight: bold ; |
|||
font-size: larger } |
|||
|
|||
p.sidebar-subtitle { |
|||
font-family: sans-serif ; |
|||
font-weight: bold } |
|||
|
|||
p.topic-title { |
|||
font-weight: bold } |
|||
|
|||
pre.address { |
|||
margin-bottom: 0 ; |
|||
margin-top: 0 ; |
|||
font: inherit } |
|||
|
|||
pre.literal-block, pre.doctest-block, pre.math, pre.code { |
|||
margin-left: 2em ; |
|||
margin-right: 2em } |
|||
|
|||
pre.code .ln { color: grey; } /* line numbers */ |
|||
pre.code, code { background-color: #eeeeee } |
|||
pre.code .comment, code .comment { color: #5C6576 } |
|||
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold } |
|||
pre.code .literal.string, code .literal.string { color: #0C5404 } |
|||
pre.code .name.builtin, code .name.builtin { color: #352B84 } |
|||
pre.code .deleted, code .deleted { background-color: #DEB0A1} |
|||
pre.code .inserted, code .inserted { background-color: #A3D289} |
|||
|
|||
span.classifier { |
|||
font-family: sans-serif ; |
|||
font-style: oblique } |
|||
|
|||
span.classifier-delimiter { |
|||
font-family: sans-serif ; |
|||
font-weight: bold } |
|||
|
|||
span.interpreted { |
|||
font-family: sans-serif } |
|||
|
|||
span.option { |
|||
white-space: nowrap } |
|||
|
|||
span.pre { |
|||
white-space: pre } |
|||
|
|||
span.problematic { |
|||
color: red } |
|||
|
|||
span.section-subtitle { |
|||
/* font-size relative to parent (h1..h6 element) */ |
|||
font-size: 80% } |
|||
|
|||
table.citation { |
|||
border-left: solid 1px gray; |
|||
margin-left: 1px } |
|||
|
|||
table.docinfo { |
|||
margin: 2em 4em } |
|||
|
|||
table.docutils { |
|||
margin-top: 0.5em ; |
|||
margin-bottom: 0.5em } |
|||
|
|||
table.footnote { |
|||
border-left: solid 1px black; |
|||
margin-left: 1px } |
|||
|
|||
table.docutils td, table.docutils th, |
|||
table.docinfo td, table.docinfo th { |
|||
padding-left: 0.5em ; |
|||
padding-right: 0.5em ; |
|||
vertical-align: top } |
|||
|
|||
table.docutils th.field-name, table.docinfo th.docinfo-name { |
|||
font-weight: bold ; |
|||
text-align: left ; |
|||
white-space: nowrap ; |
|||
padding-left: 0 } |
|||
|
|||
/* "booktabs" style (no vertical lines) */ |
|||
table.docutils.booktabs { |
|||
border: 0px; |
|||
border-top: 2px solid; |
|||
border-bottom: 2px solid; |
|||
border-collapse: collapse; |
|||
} |
|||
table.docutils.booktabs * { |
|||
border: 0px; |
|||
} |
|||
table.docutils.booktabs th { |
|||
border-bottom: thin solid; |
|||
text-align: left; |
|||
} |
|||
|
|||
h1 tt.docutils, h2 tt.docutils, h3 tt.docutils, |
|||
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils { |
|||
font-size: 100% } |
|||
|
|||
ul.auto-toc { |
|||
list-style-type: none } |
|||
|
|||
</style> |
|||
</head> |
|||
<body> |
|||
<div class="document" id="account-export-csv"> |
|||
<h1 class="title">Account Export CSV</h1> |
|||
|
|||
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
|||
!! This file is generated by oca-gen-addon-readme !! |
|||
!! changes will be overwritten. !! |
|||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> |
|||
<p><a class="reference external" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external" href="https://github.com/OCA/account-financial-reporting/tree/12.0/account_export_csv"><img alt="OCA/account-financial-reporting" src="https://img.shields.io/badge/github-OCA%2Faccount--financial--reporting-lightgray.png?logo=github" /></a> <a class="reference external" href="https://translation.odoo-community.org/projects/account-financial-reporting-12-0/account-financial-reporting-12-0-account_export_csv"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external" href="https://runbot.odoo-community.org/runbot/91/12.0"><img alt="Try me on Runbot" src="https://img.shields.io/badge/runbot-Try%20me-875A7B.png" /></a></p> |
|||
<p>Add a wizard that allow you to export a csv file based on accounting |
|||
journal entries</p> |
|||
<ul class="simple"> |
|||
<li>Trial Balance</li> |
|||
<li>Analytic Balance (with accounts)</li> |
|||
<li>Journal Entries</li> |
|||
</ul> |
|||
<p>You can filter by date range</p> |
|||
<p><strong>Table of contents</strong></p> |
|||
<div class="contents local topic" id="contents"> |
|||
<ul class="simple"> |
|||
<li><a class="reference internal" href="#known-issues-roadmap" id="id1">Known issues / Roadmap</a></li> |
|||
<li><a class="reference internal" href="#bug-tracker" id="id2">Bug Tracker</a></li> |
|||
<li><a class="reference internal" href="#credits" id="id3">Credits</a><ul> |
|||
<li><a class="reference internal" href="#authors" id="id4">Authors</a></li> |
|||
<li><a class="reference internal" href="#maintainers" id="id5">Maintainers</a></li> |
|||
</ul> |
|||
</li> |
|||
</ul> |
|||
</div> |
|||
<div class="section" id="known-issues-roadmap"> |
|||
<h1><a class="toc-backref" href="#id1">Known issues / Roadmap</a></h1> |
|||
<ul class="simple"> |
|||
<li>rearange wizard view with only one button to generate file plus define a selection list to select report type</li> |
|||
</ul> |
|||
</div> |
|||
<div class="section" id="bug-tracker"> |
|||
<h1><a class="toc-backref" href="#id2">Bug Tracker</a></h1> |
|||
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/account-financial-reporting/issues">GitHub Issues</a>. |
|||
In case of trouble, please check there if your issue has already been reported. |
|||
If you spotted it first, help us smashing it by providing a detailed and welcomed |
|||
<a class="reference external" href="https://github.com/OCA/account-financial-reporting/issues/new?body=module:%20account_export_csv%0Aversion:%2012.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p> |
|||
<p>Do not contact contributors directly about support or help with technical issues.</p> |
|||
</div> |
|||
<div class="section" id="credits"> |
|||
<h1><a class="toc-backref" href="#id3">Credits</a></h1> |
|||
<div class="section" id="authors"> |
|||
<h2><a class="toc-backref" href="#id4">Authors</a></h2> |
|||
<ul class="simple"> |
|||
<li>Camptocamp</li> |
|||
</ul> |
|||
</div> |
|||
<div class="section" id="maintainers"> |
|||
<h2><a class="toc-backref" href="#id5">Maintainers</a></h2> |
|||
<p>This module is maintained by the OCA.</p> |
|||
<a class="reference external image-reference" href="https://odoo-community.org"><img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" /></a> |
|||
<p>OCA, or the Odoo Community Association, is a nonprofit organization whose |
|||
mission is to support the collaborative development of Odoo features and |
|||
promote its widespread use.</p> |
|||
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/account-financial-reporting/tree/12.0/account_export_csv">OCA/account-financial-reporting</a> project on GitHub.</p> |
|||
<p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</body> |
|||
</html> |
@ -0,0 +1 @@ |
|||
from . import test_account_export_csv |
@ -0,0 +1,52 @@ |
|||
# Copyright 2017 ACSONE SA/NV |
|||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). |
|||
|
|||
from datetime import date |
|||
from dateutil import relativedelta |
|||
import base64 |
|||
|
|||
from odoo.tests.common import TransactionCase |
|||
from odoo import fields |
|||
|
|||
|
|||
class TestAccountExportCsv(TransactionCase): |
|||
|
|||
def setUp(self): |
|||
super(TestAccountExportCsv, self).setUp() |
|||
self.report_wizard = self.env['account.csv.export'] |
|||
today_dt = date.today() |
|||
next_month_date = today_dt + relativedelta.relativedelta(months=1) |
|||
self.report_date_start = fields.Date.to_string(today_dt) |
|||
self.report_date_end = fields.Date.to_string(next_month_date) |
|||
|
|||
def test_1(self): |
|||
report_wizard = self.report_wizard.create({ |
|||
'date_start': self.report_date_start, |
|||
'date_end': self.report_date_end |
|||
}) |
|||
report_wizard.action_manual_export_account() |
|||
|
|||
def test_2(self): |
|||
report_wizard = self.report_wizard.create({ |
|||
'date_start': self.report_date_start, |
|||
'date_end': self.report_date_end |
|||
}) |
|||
report_wizard.action_manual_export_analytic() |
|||
|
|||
def test_3(self): |
|||
report_wizard = self.report_wizard.create({ |
|||
'date_start': self.report_date_start, |
|||
'date_end': self.report_date_end |
|||
}) |
|||
report_wizard.action_manual_export_journal_entries() |
|||
|
|||
def test_file_content(self): |
|||
report_wizard = self.report_wizard.create({ |
|||
"date_start": "2000-01-01", |
|||
"date_end": "2200-01-01", |
|||
}) |
|||
report_wizard.action_manual_export_journal_entries() |
|||
res = base64.decodestring(report_wizard.data) |
|||
line_number = self.env["account.move.line"].search_count([]) |
|||
# check the number of lines in file: include header + EOF line |
|||
self.assertEqual(len(res.decode().split("\r\n")), line_number + 2) |
@ -0,0 +1 @@ |
|||
from . import account_export_csv |
@ -0,0 +1,354 @@ |
|||
# Copyright 2013 Camptocamp SA |
|||
# Copyright 2017 ACSONE SA/NV |
|||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). |
|||
|
|||
import itertools |
|||
import tempfile |
|||
from io import StringIO, BytesIO |
|||
import base64 |
|||
|
|||
import csv |
|||
import codecs |
|||
|
|||
from odoo import api, fields, models, _ |
|||
|
|||
|
|||
class AccountingWriter(object): |
|||
|
|||
""" |
|||
A CSV writer which will write rows to CSV file "f", |
|||
which is encoded in the given encoding. |
|||
""" |
|||
|
|||
def __init__(self, f, dialect=csv.excel, encoding="utf-8", **kwds): |
|||
# Redirect output to a queue |
|||
self.queue = StringIO() |
|||
# created a writer with Excel formating settings |
|||
self.writer = csv.writer(self.queue, dialect=dialect, **kwds) |
|||
self.stream = f |
|||
self.encoder = codecs.getincrementalencoder(encoding)() |
|||
|
|||
def writerow(self, row): |
|||
# we ensure that we do not try to encode none or bool |
|||
row = (x or '' for x in row) |
|||
self.writer.writerow(row) |
|||
# Fetch UTF-8 output from the queue ... |
|||
data = self.queue.getvalue() |
|||
# ... and reencode it into the target encoding as BytesIO |
|||
data = self.encoder.encode(data) |
|||
# write to the target stream |
|||
self.stream.write(data) |
|||
# seek() or truncate() have side effect if not used combinated |
|||
self.queue.truncate(0) |
|||
self.queue.seek(0) |
|||
# https://stackoverflow.com/questions/4330812/how-do-i-clear-a-stringio-object |
|||
# It fails when you use `self.queue = StringIO()` only add one line |
|||
|
|||
def writerows(self, rows): |
|||
for row in rows: |
|||
self.writerow(row) |
|||
# https://docs.python.org/3/library/io.html#io.IOBase.close |
|||
self.queue.close() |
|||
|
|||
|
|||
class AccountCSVExport(models.TransientModel): |
|||
_name = 'account.csv.export' |
|||
_description = 'Export Accounting' |
|||
|
|||
data = fields.Binary('CSV', readonly=True) |
|||
company_id = fields.Many2one( |
|||
comodel_name='res.company', string='Company', invisible=True, |
|||
default=lambda self: self._get_company_default()) |
|||
date_start = fields.Date(required=True) |
|||
date_end = fields.Date(required=True) |
|||
date_range_id = fields.Many2one( |
|||
comodel_name='date.range', string='Date range') |
|||
journal_ids = fields.Many2many( |
|||
comodel_name='account.journal', string='Journals', |
|||
default=lambda s: s._get_journal_default(), |
|||
help='If empty, use all journals, only used for journal entries') |
|||
export_filename = fields.Char( |
|||
string='Export CSV Filename', size=128, default='account_export.csv') |
|||
|
|||
@api.model |
|||
def _get_journal_default(self): |
|||
""" Implements your own default """ |
|||
return False |
|||
|
|||
@api.model |
|||
def _get_company_default(self): |
|||
return self.env.user.company_id |
|||
|
|||
@api.onchange('date_range_id') |
|||
def _onchange_date_range(self): |
|||
if self.date_range_id: |
|||
self.date_start = self.date_range_id.date_start |
|||
self.date_end = self.date_range_id.date_end |
|||
|
|||
@api.onchange('date_start', 'date_end') |
|||
def _onchange_dates(self): |
|||
if self.date_range_id: |
|||
if self.date_start != self.date_range_id.date_start or \ |
|||
self.date_end != self.date_range_id.date_end: |
|||
self.date_range_id = False |
|||
|
|||
def action_manual_export_account(self): |
|||
self.ensure_one() |
|||
rows = self._get_data("account") |
|||
file_data = BytesIO() |
|||
try: |
|||
writer = AccountingWriter(file_data) |
|||
writer.writerows(rows) |
|||
file_value = file_data.getvalue() |
|||
self.write({'data': base64.encodestring(file_value)}) |
|||
finally: |
|||
file_data.close() |
|||
return { |
|||
'type': 'ir.actions.act_window', |
|||
'res_model': 'account.csv.export', |
|||
'view_mode': 'form', |
|||
'res_id': self.id, |
|||
'views': [(False, 'form')], |
|||
'target': 'new', |
|||
} |
|||
|
|||
def _get_header_account(self): |
|||
return [ |
|||
_('CODE'), |
|||
_('NAME'), |
|||
_('DEBIT'), |
|||
_('CREDIT'), |
|||
_('BALANCE'), |
|||
] |
|||
|
|||
def _get_rows_account(self, journal_ids): |
|||
""" |
|||
Return list to generate rows of the CSV file |
|||
""" |
|||
self.ensure_one() |
|||
self.env.cr.execute(""" |
|||
select ac.code,ac.name, |
|||
sum(debit) as sum_debit, |
|||
sum(credit) as sum_credit, |
|||
sum(debit) - sum(credit) as balance |
|||
from account_move_line as aml,account_account as ac |
|||
where aml.account_id = ac.id |
|||
AND aml.date >= %(date_start)s |
|||
AND aml.date <= %(date_end)s |
|||
group by ac.id,ac.code,ac.name |
|||
order by ac.code |
|||
""", {'date_start': self.date_start, |
|||
'date_end': self.date_end}) |
|||
res = self.env.cr.fetchall() |
|||
|
|||
rows = [] |
|||
for line in res: |
|||
rows.append(list(line)) |
|||
return rows |
|||
|
|||
def action_manual_export_analytic(self): |
|||
self.ensure_one() |
|||
rows = self._get_data("analytic") |
|||
file_data = BytesIO() |
|||
try: |
|||
writer = AccountingWriter(file_data) |
|||
writer.writerows(rows) |
|||
file_value = file_data.getvalue() |
|||
self.write({'data': base64.encodestring(file_value)}) |
|||
finally: |
|||
file_data.close() |
|||
return { |
|||
'type': 'ir.actions.act_window', |
|||
'res_model': 'account.csv.export', |
|||
'view_mode': 'form', |
|||
'view_type': 'form', |
|||
'res_id': self.id, |
|||
'views': [(False, 'form')], |
|||
'target': 'new', |
|||
} |
|||
|
|||
def _get_header_analytic(self): |
|||
return [ |
|||
_('ANALYTIC CODE'), |
|||
_('ANALYTIC NAME'), |
|||
_('CODE'), |
|||
_('ACCOUNT NAME'), |
|||
_('DEBIT'), |
|||
_('CREDIT'), |
|||
_('BALANCE'), |
|||
] |
|||
|
|||
def _get_rows_analytic(self, journal_ids): |
|||
""" |
|||
Return list to generate rows of the CSV file |
|||
""" |
|||
self.ensure_one() |
|||
self.env.cr.execute(""" select aac.code as analytic_code, |
|||
aac.name as analytic_name, |
|||
ac.code,ac.name, |
|||
sum(debit) as sum_debit, |
|||
sum(credit) as sum_credit, |
|||
sum(debit) - sum(credit) as balance |
|||
from account_move_line |
|||
left outer join account_analytic_account as aac |
|||
on (account_move_line.analytic_account_id = aac.id) |
|||
inner join account_account as ac |
|||
on account_move_line.account_id = ac.id |
|||
AND account_move_line.date >= %(date_start)s |
|||
AND account_move_line.date <= %(date_end)s |
|||
group by aac.id,aac.code,aac.name,ac.id,ac.code,ac.name |
|||
order by aac.code |
|||
""", {'date_start': self.date_start, |
|||
'date_end': self.date_end}) |
|||
res = self.env.cr.fetchall() |
|||
|
|||
rows = [] |
|||
for line in res: |
|||
rows.append(list(line)) |
|||
return rows |
|||
|
|||
def action_manual_export_journal_entries(self): |
|||
""" |
|||
Here we use TemporaryFile to avoid full filling the Odoo worker |
|||
Memory |
|||
We also write the data to the wizard with SQL query as write seems |
|||
to use too much memory as well. |
|||
|
|||
Those improvements permitted to improve the export from a 100k line to |
|||
200k lines |
|||
with default `limit_memory_hard = 805306368` (768MB) with more lines, |
|||
you might encounter a MemoryError when trying to download the file even |
|||
if it has been generated. |
|||
|
|||
To be able to export bigger volume of data, it is advised to set |
|||
limit_memory_hard to 2097152000 (2 GB) to generate the file and let |
|||
Odoo load it in the wizard when trying to download it. |
|||
|
|||
Tested with up to a generation of 700k entry lines |
|||
""" |
|||
self.ensure_one() |
|||
rows = self._get_data("journal_entries") |
|||
with tempfile.TemporaryFile() as file_data: |
|||
writer = AccountingWriter(file_data) |
|||
writer.writerows(rows) |
|||
with tempfile.TemporaryFile() as base64_data: |
|||
file_data.seek(0) |
|||
base64.encode(file_data, base64_data) |
|||
base64_data.seek(0) |
|||
self.env.cr.execute(""" |
|||
UPDATE account_csv_export |
|||
SET data = %s |
|||
WHERE id = %s""", (base64_data.read(), self.id)) |
|||
return { |
|||
'type': 'ir.actions.act_window', |
|||
'res_model': 'account.csv.export', |
|||
'view_mode': 'form', |
|||
'res_id': self.id, |
|||
'views': [(False, 'form')], |
|||
'target': 'new', |
|||
} |
|||
|
|||
def _get_header_journal_entries(self): |
|||
return [ |
|||
# Standard Sage export fields |
|||
_('DATE'), |
|||
_('JOURNAL CODE'), |
|||
_('ACCOUNT CODE'), |
|||
_('PARTNER NAME'), |
|||
_('REF'), |
|||
_('DESCRIPTION'), |
|||
_('DEBIT'), |
|||
_('CREDIT'), |
|||
_('FULL RECONCILE'), |
|||
_('ANALYTIC ACCOUNT CODE'), |
|||
|
|||
# Other fields |
|||
_('ENTRY NUMBER'), |
|||
_('ACCOUNT NAME'), |
|||
_('BALANCE'), |
|||
_('AMOUNT CURRENCY'), |
|||
_('CURRENCY'), |
|||
_('ANALYTIC ACCOUNT NAME'), |
|||
_('JOURNAL'), |
|||
_('TAX CODE'), |
|||
_('TAX NAME'), |
|||
_('BANK STATEMENT'), |
|||
] |
|||
|
|||
def _get_rows_journal_entries(self, journal_ids): |
|||
""" |
|||
Create a generator of rows of the CSV file |
|||
""" |
|||
self.ensure_one() |
|||
self.env.cr.execute(""" |
|||
SELECT |
|||
account_move_line.date AS date, |
|||
account_journal.name as journal, |
|||
account_account.code AS account_code, |
|||
res_partner.name AS partner_name, |
|||
account_move_line.ref AS ref, |
|||
account_move_line.name AS description, |
|||
account_move_line.debit AS debit, |
|||
account_move_line.credit AS credit, |
|||
account_full_reconcile.name as full_reconcile, |
|||
account_analytic_account.code AS analytic_account_code, |
|||
account_move.name AS entry_number, |
|||
account_account.name AS account_name, |
|||
account_move_line.debit - account_move_line.credit AS balance, |
|||
account_move_line.amount_currency AS amount_currency, |
|||
res_currency.name AS currency, |
|||
account_analytic_account.name AS analytic_account_name, |
|||
account_journal.name as journal, |
|||
acct.description as tax_code, |
|||
acct.name as tax_name, |
|||
account_bank_statement.name AS bank_statement |
|||
FROM |
|||
public.account_move_line |
|||
JOIN account_account on |
|||
(account_account.id=account_move_line.account_id) |
|||
JOIN account_journal on |
|||
(account_journal.id = account_move_line.journal_id) |
|||
LEFT JOIN res_currency on |
|||
(res_currency.id=account_move_line.currency_id) |
|||
LEFT JOIN account_full_reconcile on |
|||
(account_full_reconcile.id = account_move_line.full_reconcile_id) |
|||
LEFT JOIN res_partner on |
|||
(res_partner.id=account_move_line.partner_id) |
|||
LEFT JOIN account_move on |
|||
(account_move.id=account_move_line.move_id) |
|||
LEFT JOIN account_analytic_account on |
|||
(account_analytic_account.id=account_move_line.analytic_account_id) |
|||
LEFT JOIN account_bank_statement on |
|||
(account_bank_statement.id=account_move_line.statement_id) |
|||
LEFT JOIN account_tax acct on |
|||
(acct.id=account_move_line.tax_line_id) |
|||
WHERE account_move_line.date >= %(date_start)s |
|||
AND account_move_line.date <= %(date_end)s |
|||
AND account_journal.id IN %(journal_ids)s |
|||
ORDER BY account_move_line.date |
|||
""", {'journal_ids': tuple(journal_ids), |
|||
'date_start': self.date_start, |
|||
'date_end': self.date_end}) |
|||
while 1: |
|||
# http://initd.org/psycopg/docs/cursor.html#cursor.fetchmany |
|||
# Set cursor.arraysize to minimize network round trips |
|||
self.env.cr.arraysize = 100 |
|||
rows = self.env.cr.fetchmany() |
|||
if not rows: |
|||
break |
|||
for row in rows: |
|||
yield row |
|||
|
|||
def _get_data(self, result_type): |
|||
self.ensure_one() |
|||
get_header_func = getattr( |
|||
self, ("_get_header_%s" % (result_type)), None) |
|||
get_rows_func = getattr(self, ("_get_rows_%s" % (result_type)), None) |
|||
if self.journal_ids: |
|||
journal_ids = [x.id for x in self.journal_ids] |
|||
else: |
|||
j_obj = self.env["account.journal"] |
|||
journal_ids = j_obj.search([]).ids |
|||
rows = itertools.chain((get_header_func(),), |
|||
get_rows_func(journal_ids)) |
|||
return rows |
@ -0,0 +1,64 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<odoo> |
|||
|
|||
<record id="account_csv_export_view" model="ir.ui.view"> |
|||
<field name="name">Accounting Entries CSV Export</field> |
|||
<field name="model">account.csv.export</field> |
|||
<field name="arch" type="xml"> |
|||
<form string="Accounting CSV Export"> |
|||
<group> |
|||
<group> |
|||
<field name="company_id" /> |
|||
</group> |
|||
</group> |
|||
<group> |
|||
<group> |
|||
<field name="date_range_id" domain="['|', ('company_id', '=', company_id), ('company_id', '=', False)]"/> |
|||
<label for="date_start" string="Date" class="oe_inline"/> |
|||
<div> |
|||
<field name="date_start" class="oe_inline"/> |
|||
<span string="-" class="oe_inline"/> |
|||
<field name="date_end" class="oe_inline"/> |
|||
</div> |
|||
</group> |
|||
<group> |
|||
</group> |
|||
</group> |
|||
<div> |
|||
<label for="journal_ids" /> |
|||
<field name="journal_ids"/> |
|||
</div> |
|||
<separator string ="Report" colspan="4"/> |
|||
<group colspan="4"> |
|||
<field name="data" filename="export_filename"/> |
|||
</group> |
|||
<footer> |
|||
<button name="action_manual_export_account" string="Trial Balance" type="object" icon="fa-cog"/> |
|||
<button name="action_manual_export_analytic" string="Analytic Balance (with accounts)" type="object" icon="fa-cog"/> |
|||
<button name="action_manual_export_journal_entries" string="Journal Entries" type="object" icon="fa-cog"/> |
|||
or |
|||
<button string="Close" class="oe_link" special="cancel" /> |
|||
</footer> |
|||
|
|||
</form> |
|||
</field> |
|||
</record> |
|||
|
|||
<record id="action_account_csv_export" model="ir.actions.act_window"> |
|||
<field name="name">Accounting CSV Export</field> |
|||
<field name="res_model">account.csv.export</field> |
|||
<field name="type">ir.actions.act_window</field> |
|||
<field name="view_mode">form</field> |
|||
<field name="view_id" ref="account_csv_export_view"/> |
|||
<field name="target">new</field> |
|||
</record> |
|||
|
|||
<menuitem |
|||
name="Accounting CSV Export" |
|||
action="action_account_csv_export" |
|||
id="menu_account_csv_export" |
|||
parent="account.menu_finance_reports" |
|||
sequence="110" |
|||
/> |
|||
|
|||
</odoo> |
@ -1,48 +1,50 @@ |
|||
# Author: Damien Crier |
|||
# Author: Julien Coux |
|||
# Copyright 2016 Camptocamp SA |
|||
# Copyright 2020 ForgeFlow S.L. (https://www.forgeflow.com) |
|||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). |
|||
{ |
|||
"name": "Account Financial Reports", |
|||
"version": "13.0.1.8.0", |
|||
"category": "Reporting", |
|||
"summary": "OCA Financial Reports", |
|||
"author": "Camptocamp SA," |
|||
"initOS GmbH," |
|||
"redCOR AG," |
|||
"ForgeFlow," |
|||
"Odoo Community Association (OCA)", |
|||
'name': 'Account Financial Reports', |
|||
'version': '12.0.1.4.5', |
|||
'category': 'Reporting', |
|||
'summary': 'OCA Financial Reports', |
|||
'author': 'Camptocamp SA,' |
|||
'initOS GmbH,' |
|||
'redCOR AG,' |
|||
'Eficent,' |
|||
'Odoo Community Association (OCA)', |
|||
"website": "https://odoo-community.org/", |
|||
"depends": ["account", "date_range", "report_xlsx"], |
|||
"data": [ |
|||
"wizard/aged_partner_balance_wizard_view.xml", |
|||
"wizard/general_ledger_wizard_view.xml", |
|||
"wizard/journal_ledger_wizard_view.xml", |
|||
"wizard/open_items_wizard_view.xml", |
|||
"wizard/trial_balance_wizard_view.xml", |
|||
"wizard/vat_report_wizard_view.xml", |
|||
"menuitems.xml", |
|||
"reports.xml", |
|||
"report/templates/layouts.xml", |
|||
"report/templates/aged_partner_balance.xml", |
|||
"report/templates/general_ledger.xml", |
|||
"report/templates/journal_ledger.xml", |
|||
"report/templates/open_items.xml", |
|||
"report/templates/trial_balance.xml", |
|||
"report/templates/vat_report.xml", |
|||
"view/account_view.xml", |
|||
"view/report_template.xml", |
|||
"view/report_general_ledger.xml", |
|||
"view/report_journal_ledger.xml", |
|||
"view/report_trial_balance.xml", |
|||
"view/report_open_items.xml", |
|||
"view/report_aged_partner_balance.xml", |
|||
"view/report_vat_report.xml", |
|||
'depends': [ |
|||
'account', |
|||
'date_range', |
|||
'report_xlsx', |
|||
], |
|||
"qweb": ["static/src/xml/report.xml"], |
|||
"installable": True, |
|||
"application": True, |
|||
"auto_install": False, |
|||
"license": "AGPL-3", |
|||
'data': [ |
|||
'wizard/aged_partner_balance_wizard_view.xml', |
|||
'wizard/general_ledger_wizard_view.xml', |
|||
'wizard/journal_ledger_wizard_view.xml', |
|||
'wizard/open_items_wizard_view.xml', |
|||
'wizard/trial_balance_wizard_view.xml', |
|||
'wizard/vat_report_wizard_view.xml', |
|||
'menuitems.xml', |
|||
'reports.xml', |
|||
'report/templates/layouts.xml', |
|||
'report/templates/aged_partner_balance.xml', |
|||
'report/templates/general_ledger.xml', |
|||
'report/templates/journal_ledger.xml', |
|||
'report/templates/open_items.xml', |
|||
'report/templates/trial_balance.xml', |
|||
'report/templates/vat_report.xml', |
|||
'view/account_view.xml', |
|||
'view/report_template.xml', |
|||
'view/report_general_ledger.xml', |
|||
'view/report_journal_ledger.xml', |
|||
'view/report_trial_balance.xml', |
|||
'view/report_open_items.xml', |
|||
'view/report_aged_partner_balance.xml', |
|||
'view/report_vat_report.xml', |
|||
], |
|||
'installable': True, |
|||
'application': True, |
|||
'auto_install': False, |
|||
'license': 'AGPL-3', |
|||
} |
1775
account_financial_report/i18n/account_financial_report.pot
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
1886
account_financial_report/i18n/ar.po
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
2136
account_financial_report/i18n/ca.po
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
2633
account_financial_report/i18n/da.po
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
2139
account_financial_report/i18n/de.po
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
1872
account_financial_report/i18n/es.po
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
1829
account_financial_report/i18n/es_AR.po
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
2014
account_financial_report/i18n/fr.po
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
1930
account_financial_report/i18n/fr_CH.po
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
1876
account_financial_report/i18n/hr.po
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
1734
account_financial_report/i18n/hr_HR.po
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
2001
account_financial_report/i18n/it.po
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
1716
account_financial_report/i18n/ja.po
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
2014
account_financial_report/i18n/nl.po
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
1721
account_financial_report/i18n/nl_NL.po
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
2172
account_financial_report/i18n/pt.po
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
2084
account_financial_report/i18n/pt_BR.po
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
2049
account_financial_report/i18n/ro.po
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
2615
account_financial_report/i18n/sl.po
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -1,45 +1,53 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<odoo> |
|||
|
|||
<menuitem |
|||
parent="account.menu_finance_reports" |
|||
id="menu_oca_reports" |
|||
name="OCA accounting reports" |
|||
groups="account.group_account_manager,account.group_account_user" |
|||
/> |
|||
|
|||
<menuitem |
|||
parent="menu_oca_reports" |
|||
action="action_general_ledger_wizard" |
|||
id="menu_general_ledger_wizard" |
|||
sequence="10" |
|||
/> |
|||
|
|||
<menuitem |
|||
parent="menu_oca_reports" |
|||
action="action_journal_ledger_wizard" |
|||
id="menu_journal_ledger_wizard" |
|||
sequence="15" |
|||
/> |
|||
|
|||
<menuitem |
|||
parent="menu_oca_reports" |
|||
action="action_trial_balance_wizard" |
|||
id="menu_trial_balance_wizard" |
|||
sequence="20" |
|||
/> |
|||
|
|||
<menuitem |
|||
parent="menu_oca_reports" |
|||
action="action_open_items_wizard" |
|||
id="menu_open_items_wizard" |
|||
sequence="30" |
|||
/> |
|||
|
|||
<menuitem |
|||
parent="menu_oca_reports" |
|||
action="action_aged_partner_balance_wizard" |
|||
id="menu_aged_partner_balance_wizard" |
|||
sequence="40" |
|||
/> |
|||
|
|||
<menuitem |
|||
parent="menu_oca_reports" |
|||
action="action_vat_report_wizard" |
|||
id="menu_vat_report_wizard" |
|||
sequence="50" |
|||
/> |
|||
|
|||
</odoo> |
@ -1,4 +1,3 @@ |
|||
from . import account |
|||
from . import account_group |
|||
from . import account_move_line |
|||
from . import ir_actions_report |
@ -1,14 +1,13 @@ |
|||
# © 2011 Guewen Baconnier (Camptocamp) |
|||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).- |
|||
from odoo import fields, models |
|||
from odoo import models, fields |
|||
|
|||
|
|||
class AccountAccount(models.Model): |
|||
_inherit = "account.account" |
|||
_inherit = 'account.account' |
|||
|
|||
centralized = fields.Boolean( |
|||
"Centralized", |
|||
'Centralized', |
|||
help="If flagged, no details will be displayed in " |
|||
"the General Ledger report (the webkit one only), " |
|||
"only centralized amounts per period.", |
|||
) |
|||
"only centralized amounts per period.") |
@ -1,25 +0,0 @@ |
|||
# Copyright 2020 Onestein (<https://www.onestein.eu>) |
|||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). |
|||
|
|||
from odoo import api, models |
|||
|
|||
|
|||
class IrActionsReport(models.Model): |
|||
_inherit = "ir.actions.report" |
|||
|
|||
@api.model |
|||
def _prepare_account_financial_report_context(self, data): |
|||
lang = data and data.get("account_financial_report_lang") or "" |
|||
return dict(self.env.context or {}, lang=lang) if lang else False |
|||
|
|||
@api.model |
|||
def render_qweb_html(self, docids, data=None): |
|||
context = self._prepare_account_financial_report_context(data) |
|||
obj = self.with_context(context) if context else self |
|||
return super(IrActionsReport, obj).render_qweb_html(docids, data) |
|||
|
|||
@api.model |
|||
def render_xlsx(self, docids, data): |
|||
context = self._prepare_account_financial_report_context(data) |
|||
obj = self.with_context(context) if context else self |
|||
return super(IrActionsReport, obj).render_xlsx(docids, data) |
@ -1,7 +0,0 @@ |
|||
* 'VAT Report' is valid only for cases where it's met that for each |
|||
Tax defined: all the "Account tags" of all the |
|||
'Repartition for Invoices' or 'Repartition for Credit Notes' |
|||
are different. |
|||
* It would be nice to have in reports a column indicating the |
|||
state of the entries when the option "All Entries" is selected |
|||
in "Target Moves" field in a wizard |
@ -1,126 +1,23 @@ |
|||
# Copyright 2020 ForgeFlow S.L. (https://www.forgeflow.com) |
|||
# Copyright 2018 Camptocamp SA |
|||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). |
|||
|
|||
from odoo import api, models |
|||
from odoo import models |
|||
from psycopg2.extensions import AsIs |
|||
|
|||
|
|||
class AgedPartnerBalanceReport(models.AbstractModel): |
|||
_name = "report.account_financial_report.abstract_report" |
|||
_description = "Abstract Report" |
|||
class AbstractReport(models.AbstractModel): |
|||
_name = 'account_financial_report_abstract' |
|||
_description = 'Abstract Report' |
|||
|
|||
@api.model |
|||
def _get_move_lines_domain_not_reconciled( |
|||
self, company_id, account_ids, partner_ids, only_posted_moves, date_from |
|||
): |
|||
domain = [ |
|||
("account_id", "in", account_ids), |
|||
("company_id", "=", company_id), |
|||
("reconciled", "=", False), |
|||
] |
|||
if partner_ids: |
|||
domain += [("partner_id", "in", partner_ids)] |
|||
if only_posted_moves: |
|||
domain += [("move_id.state", "=", "posted")] |
|||
else: |
|||
domain += [("move_id.state", "in", ["posted", "draft"])] |
|||
if date_from: |
|||
domain += [("date", ">", date_from)] |
|||
return domain |
|||
|
|||
@api.model |
|||
def _get_new_move_lines_domain( |
|||
self, new_ml_ids, account_ids, company_id, partner_ids, only_posted_moves |
|||
): |
|||
domain = [ |
|||
("account_id", "in", account_ids), |
|||
("company_id", "=", company_id), |
|||
("id", "in", new_ml_ids), |
|||
] |
|||
if partner_ids: |
|||
domain += [("partner_id", "in", partner_ids)] |
|||
if only_posted_moves: |
|||
domain += [("move_id.state", "=", "posted")] |
|||
else: |
|||
domain += [("move_id.state", "in", ["posted", "draft"])] |
|||
return domain |
|||
|
|||
def _recalculate_move_lines( |
|||
self, |
|||
move_lines, |
|||
debit_ids, |
|||
credit_ids, |
|||
debit_amount, |
|||
credit_amount, |
|||
ml_ids, |
|||
account_ids, |
|||
company_id, |
|||
partner_ids, |
|||
only_posted_moves, |
|||
): |
|||
debit_ids = set(debit_ids) |
|||
credit_ids = set(credit_ids) |
|||
in_credit_but_not_in_debit = credit_ids - debit_ids |
|||
reconciled_ids = list(debit_ids) + list(in_credit_but_not_in_debit) |
|||
reconciled_ids = set(reconciled_ids) |
|||
ml_ids = set(ml_ids) |
|||
new_ml_ids = reconciled_ids - ml_ids |
|||
new_ml_ids = list(new_ml_ids) |
|||
new_domain = self._get_new_move_lines_domain( |
|||
new_ml_ids, account_ids, company_id, partner_ids, only_posted_moves |
|||
) |
|||
ml_fields = [ |
|||
"id", |
|||
"name", |
|||
"date", |
|||
"move_id", |
|||
"journal_id", |
|||
"account_id", |
|||
"partner_id", |
|||
"amount_residual", |
|||
"date_maturity", |
|||
"ref", |
|||
"debit", |
|||
"credit", |
|||
"reconciled", |
|||
"currency_id", |
|||
"amount_currency", |
|||
"amount_residual_currency", |
|||
] |
|||
new_move_lines = self.env["account.move.line"].search_read( |
|||
domain=new_domain, fields=ml_fields |
|||
def _transient_clean_rows_older_than(self, seconds): |
|||
assert self._transient, \ |
|||
"Model %s is not transient, it cannot be vacuumed!" % self._name |
|||
# Never delete rows used in last 5 minutes |
|||
seconds = max(seconds, 300) |
|||
query = ( |
|||
"DELETE FROM %s" |
|||
" WHERE COALESCE(" |
|||
"write_date, create_date, (now() at time zone 'UTC'))" |
|||
"::timestamp < ((now() at time zone 'UTC') - interval %s)" |
|||
) |
|||
move_lines = move_lines + new_move_lines |
|||
for move_line in move_lines: |
|||
ml_id = move_line["id"] |
|||
if ml_id in debit_ids: |
|||
move_line["amount_residual"] += debit_amount[ml_id] |
|||
if ml_id in credit_ids: |
|||
move_line["amount_residual"] -= credit_amount[ml_id] |
|||
return move_lines |
|||
|
|||
def _get_accounts_data(self, accounts_ids): |
|||
accounts = self.env["account.account"].browse(accounts_ids) |
|||
accounts_data = {} |
|||
for account in accounts: |
|||
accounts_data.update( |
|||
{ |
|||
account.id: { |
|||
"id": account.id, |
|||
"code": account.code, |
|||
"name": account.name, |
|||
"hide_account": False, |
|||
"group_id": account.group_id.id, |
|||
"currency_id": account.currency_id or False, |
|||
"currency_name": account.currency_id.name, |
|||
"centralized": account.centralized, |
|||
} |
|||
} |
|||
) |
|||
return accounts_data |
|||
|
|||
def _get_journals_data(self, journals_ids): |
|||
journals = self.env["account.journal"].browse(journals_ids) |
|||
journals_data = {} |
|||
for journal in journals: |
|||
journals_data.update({journal.id: {"id": journal.id, "code": journal.code}}) |
|||
return journals_data |
|||
self.env.cr.execute(query, (AsIs(self._table), "%s seconds" % seconds)) |
@ -1,378 +1,633 @@ |
|||
# © 2016 Julien Coux (Camptocamp) |
|||
# Copyright 2020 ForgeFlow S.L. (https://www.forgeflow.com) |
|||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). |
|||
|
|||
import operator |
|||
from datetime import date, datetime, timedelta |
|||
from odoo import models, fields, api |
|||
|
|||
from odoo import api, models |
|||
from odoo.tools import float_is_zero |
|||
|
|||
class AgedPartnerBalanceReport(models.TransientModel): |
|||
""" Here, we just define class fields. |
|||
For methods, go more bottom at this file. |
|||
|
|||
class AgedPartnerBalanceReport(models.AbstractModel): |
|||
_name = "report.account_financial_report.aged_partner_balance" |
|||
_description = "Aged Partner Balance Report" |
|||
_inherit = "report.account_financial_report.abstract_report" |
|||
The class hierarchy is : |
|||
* AgedPartnerBalanceReport |
|||
** AgedPartnerBalanceReportAccount |
|||
*** AgedPartnerBalanceReportPartner |
|||
**** AgedPartnerBalanceReportLine |
|||
**** AgedPartnerBalanceReportMoveLine |
|||
If "show_move_line_details" is selected |
|||
""" |
|||
|
|||
@api.model |
|||
def _initialize_account(self, ag_pb_data, acc_id): |
|||
ag_pb_data[acc_id] = {} |
|||
ag_pb_data[acc_id]["id"] = acc_id |
|||
ag_pb_data[acc_id]["residual"] = 0.0 |
|||
ag_pb_data[acc_id]["current"] = 0.0 |
|||
ag_pb_data[acc_id]["30_days"] = 0.0 |
|||
ag_pb_data[acc_id]["60_days"] = 0.0 |
|||
ag_pb_data[acc_id]["90_days"] = 0.0 |
|||
ag_pb_data[acc_id]["120_days"] = 0.0 |
|||
ag_pb_data[acc_id]["older"] = 0.0 |
|||
return ag_pb_data |
|||
_name = 'report_aged_partner_balance' |
|||
_inherit = 'account_financial_report_abstract' |
|||
|
|||
@api.model |
|||
def _initialize_partner(self, ag_pb_data, acc_id, prt_id): |
|||
ag_pb_data[acc_id][prt_id] = {} |
|||
ag_pb_data[acc_id][prt_id]["id"] = acc_id |
|||
ag_pb_data[acc_id][prt_id]["residual"] = 0.0 |
|||
ag_pb_data[acc_id][prt_id]["current"] = 0.0 |
|||
ag_pb_data[acc_id][prt_id]["30_days"] = 0.0 |
|||
ag_pb_data[acc_id][prt_id]["60_days"] = 0.0 |
|||
ag_pb_data[acc_id][prt_id]["90_days"] = 0.0 |
|||
ag_pb_data[acc_id][prt_id]["120_days"] = 0.0 |
|||
ag_pb_data[acc_id][prt_id]["older"] = 0.0 |
|||
ag_pb_data[acc_id][prt_id]["move_lines"] = [] |
|||
return ag_pb_data |
|||
# Filters fields, used for data computation |
|||
date_at = fields.Date() |
|||
only_posted_moves = fields.Boolean() |
|||
company_id = fields.Many2one(comodel_name='res.company') |
|||
filter_account_ids = fields.Many2many(comodel_name='account.account') |
|||
filter_partner_ids = fields.Many2many(comodel_name='res.partner') |
|||
show_move_line_details = fields.Boolean() |
|||
|
|||
@api.model |
|||
def _calculate_amounts( |
|||
self, ag_pb_data, acc_id, prt_id, residual, due_date, date_at_object |
|||
): |
|||
ag_pb_data[acc_id]["residual"] += residual |
|||
ag_pb_data[acc_id][prt_id]["residual"] += residual |
|||
today = date_at_object |
|||
if not due_date or today <= due_date: |
|||
ag_pb_data[acc_id]["current"] += residual |
|||
ag_pb_data[acc_id][prt_id]["current"] += residual |
|||
elif today <= due_date + timedelta(days=30): |
|||
ag_pb_data[acc_id]["30_days"] += residual |
|||
ag_pb_data[acc_id][prt_id]["30_days"] += residual |
|||
elif today <= due_date + timedelta(days=60): |
|||
ag_pb_data[acc_id]["60_days"] += residual |
|||
ag_pb_data[acc_id][prt_id]["60_days"] += residual |
|||
elif today <= due_date + timedelta(days=90): |
|||
ag_pb_data[acc_id]["90_days"] += residual |
|||
ag_pb_data[acc_id][prt_id]["90_days"] += residual |
|||
elif today <= due_date + timedelta(days=120): |
|||
ag_pb_data[acc_id]["120_days"] += residual |
|||
ag_pb_data[acc_id][prt_id]["120_days"] += residual |
|||
else: |
|||
ag_pb_data[acc_id]["older"] += residual |
|||
ag_pb_data[acc_id][prt_id]["older"] += residual |
|||
return ag_pb_data |
|||
|
|||
def _get_account_partial_reconciled(self, company_id, date_at_object): |
|||
domain = [("max_date", ">", date_at_object), ("company_id", "=", company_id)] |
|||
fields = ["debit_move_id", "credit_move_id", "amount"] |
|||
accounts_partial_reconcile = self.env["account.partial.reconcile"].search_read( |
|||
domain=domain, fields=fields |
|||
) |
|||
debit_amount = {} |
|||
credit_amount = {} |
|||
for account_partial_reconcile_data in accounts_partial_reconcile: |
|||
debit_move_id = account_partial_reconcile_data["debit_move_id"][0] |
|||
credit_move_id = account_partial_reconcile_data["credit_move_id"][0] |
|||
if debit_move_id not in debit_amount.keys(): |
|||
debit_amount[debit_move_id] = 0.0 |
|||
debit_amount[debit_move_id] += account_partial_reconcile_data["amount"] |
|||
if credit_move_id not in credit_amount.keys(): |
|||
credit_amount[credit_move_id] = 0.0 |
|||
credit_amount[credit_move_id] += account_partial_reconcile_data["amount"] |
|||
account_partial_reconcile_data.update( |
|||
{"debit_move_id": debit_move_id, "credit_move_id": credit_move_id} |
|||
# Open Items Report Data fields, used as base for compute the data reports |
|||
open_items_id = fields.Many2one(comodel_name='report_open_items') |
|||
|
|||
# Data fields, used to browse report data |
|||
account_ids = fields.One2many( |
|||
comodel_name='report_aged_partner_balance_account', |
|||
inverse_name='report_id' |
|||
) |
|||
return accounts_partial_reconcile, debit_amount, credit_amount |
|||
|
|||
def _get_move_lines_data( |
|||
self, |
|||
company_id, |
|||
account_ids, |
|||
partner_ids, |
|||
date_at_object, |
|||
date_from, |
|||
only_posted_moves, |
|||
show_move_line_details, |
|||
): |
|||
domain = self._get_move_lines_domain_not_reconciled( |
|||
company_id, account_ids, partner_ids, only_posted_moves, date_from |
|||
|
|||
|
|||
class AgedPartnerBalanceReportAccount(models.TransientModel): |
|||
_name = 'report_aged_partner_balance_account' |
|||
_inherit = 'account_financial_report_abstract' |
|||
_order = 'code ASC' |
|||
|
|||
report_id = fields.Many2one( |
|||
comodel_name='report_aged_partner_balance', |
|||
ondelete='cascade', |
|||
index=True |
|||
) |
|||
ml_fields = [ |
|||
"id", |
|||
"name", |
|||
"date", |
|||
"move_id", |
|||
"journal_id", |
|||
"account_id", |
|||
"partner_id", |
|||
"amount_residual", |
|||
"date_maturity", |
|||
"ref", |
|||
"reconciled", |
|||
] |
|||
move_lines = self.env["account.move.line"].search_read( |
|||
domain=domain, fields=ml_fields |
|||
|
|||
# Data fields, used to keep link with real object |
|||
account_id = fields.Many2one( |
|||
'account.account', |
|||
index=True |
|||
) |
|||
journals_ids = set() |
|||
partners_ids = set() |
|||
partners_data = {} |
|||
ag_pb_data = {} |
|||
if date_at_object < date.today(): |
|||
( |
|||
acc_partial_rec, |
|||
debit_amount, |
|||
credit_amount, |
|||
) = self._get_account_partial_reconciled(company_id, date_at_object) |
|||
if acc_partial_rec: |
|||
ml_ids = list(map(operator.itemgetter("id"), move_lines)) |
|||
debit_ids = list( |
|||
map(operator.itemgetter("debit_move_id"), acc_partial_rec) |
|||
|
|||
# Data fields, used for report display |
|||
code = fields.Char() |
|||
name = fields.Char() |
|||
|
|||
cumul_amount_residual = fields.Float(digits=(16, 2)) |
|||
cumul_current = fields.Float(digits=(16, 2)) |
|||
cumul_age_30_days = fields.Float(digits=(16, 2)) |
|||
cumul_age_60_days = fields.Float(digits=(16, 2)) |
|||
cumul_age_90_days = fields.Float(digits=(16, 2)) |
|||
cumul_age_120_days = fields.Float(digits=(16, 2)) |
|||
cumul_older = fields.Float(digits=(16, 2)) |
|||
|
|||
percent_current = fields.Float(digits=(16, 2)) |
|||
percent_age_30_days = fields.Float(digits=(16, 2)) |
|||
percent_age_60_days = fields.Float(digits=(16, 2)) |
|||
percent_age_90_days = fields.Float(digits=(16, 2)) |
|||
percent_age_120_days = fields.Float(digits=(16, 2)) |
|||
percent_older = fields.Float(digits=(16, 2)) |
|||
|
|||
# Data fields, used to browse report data |
|||
partner_ids = fields.One2many( |
|||
comodel_name='report_aged_partner_balance_partner', |
|||
inverse_name='report_account_id' |
|||
) |
|||
credit_ids = list( |
|||
map(operator.itemgetter("credit_move_id"), acc_partial_rec) |
|||
|
|||
|
|||
class AgedPartnerBalanceReportPartner(models.TransientModel): |
|||
_name = 'report_aged_partner_balance_partner' |
|||
_inherit = 'account_financial_report_abstract' |
|||
|
|||
report_account_id = fields.Many2one( |
|||
comodel_name='report_aged_partner_balance_account', |
|||
ondelete='cascade', |
|||
index=True |
|||
) |
|||
move_lines = self._recalculate_move_lines( |
|||
move_lines, |
|||
debit_ids, |
|||
credit_ids, |
|||
debit_amount, |
|||
credit_amount, |
|||
ml_ids, |
|||
account_ids, |
|||
company_id, |
|||
partner_ids, |
|||
only_posted_moves, |
|||
|
|||
# Data fields, used to keep link with real object |
|||
partner_id = fields.Many2one( |
|||
'res.partner', |
|||
index=True |
|||
) |
|||
move_lines = [ |
|||
move_line |
|||
for move_line in move_lines |
|||
if move_line["date"] <= date_at_object |
|||
and not float_is_zero(move_line["amount_residual"], precision_digits=2) |
|||
] |
|||
for move_line in move_lines: |
|||
journals_ids.add(move_line["journal_id"][0]) |
|||
acc_id = move_line["account_id"][0] |
|||
if move_line["partner_id"]: |
|||
prt_id = move_line["partner_id"][0] |
|||
prt_name = move_line["partner_id"][1] |
|||
else: |
|||
prt_id = 0 |
|||
prt_name = "" |
|||
if prt_id not in partners_ids: |
|||
partners_data.update({prt_id: {"id": prt_id, "name": prt_name}}) |
|||
partners_ids.add(prt_id) |
|||
if acc_id not in ag_pb_data.keys(): |
|||
ag_pb_data = self._initialize_account(ag_pb_data, acc_id) |
|||
if prt_id not in ag_pb_data[acc_id]: |
|||
ag_pb_data = self._initialize_partner(ag_pb_data, acc_id, prt_id) |
|||
move_line_data = {} |
|||
if show_move_line_details: |
|||
if move_line["ref"] == move_line["name"]: |
|||
if move_line["ref"]: |
|||
ref_label = move_line["ref"] |
|||
else: |
|||
ref_label = "" |
|||
elif not move_line["ref"]: |
|||
ref_label = move_line["name"] |
|||
elif not move_line["name"]: |
|||
ref_label = move_line["ref"] |
|||
else: |
|||
ref_label = move_line["ref"] + str(" - ") + move_line["name"] |
|||
move_line_data.update( |
|||
{ |
|||
"date": move_line["date"], |
|||
"entry": move_line["move_id"][1], |
|||
"jnl_id": move_line["journal_id"][0], |
|||
"acc_id": acc_id, |
|||
"partner": prt_name, |
|||
"ref_label": ref_label, |
|||
"due_date": move_line["date_maturity"], |
|||
"residual": move_line["amount_residual"], |
|||
} |
|||
|
|||
# Data fields, used for report display |
|||
name = fields.Char() |
|||
|
|||
# Data fields, used to browse report data |
|||
move_line_ids = fields.One2many( |
|||
comodel_name='report_aged_partner_balance_move_line', |
|||
inverse_name='report_partner_id' |
|||
) |
|||
ag_pb_data[acc_id][prt_id]["move_lines"].append(move_line_data) |
|||
ag_pb_data = self._calculate_amounts( |
|||
ag_pb_data, |
|||
acc_id, |
|||
prt_id, |
|||
move_line["amount_residual"], |
|||
move_line["date_maturity"], |
|||
date_at_object, |
|||
line_ids = fields.One2many( |
|||
comodel_name='report_aged_partner_balance_line', |
|||
inverse_name='report_partner_id' |
|||
) |
|||
journals_data = self._get_journals_data(list(journals_ids)) |
|||
accounts_data = self._get_accounts_data(ag_pb_data.keys()) |
|||
return ag_pb_data, accounts_data, partners_data, journals_data |
|||
|
|||
@api.model |
|||
def _compute_maturity_date(self, ml, date_at_object): |
|||
ml.update( |
|||
{ |
|||
"current": 0.0, |
|||
"30_days": 0.0, |
|||
"60_days": 0.0, |
|||
"90_days": 0.0, |
|||
"120_days": 0.0, |
|||
"older": 0.0, |
|||
} |
|||
def _generate_order_by(self, order_spec, query): |
|||
"""Custom order to display "No partner allocated" at last position.""" |
|||
return """ |
|||
ORDER BY |
|||
CASE |
|||
WHEN |
|||
"report_aged_partner_balance_partner"."partner_id" IS NOT NULL |
|||
THEN 0 |
|||
ELSE 1 |
|||
END, |
|||
"report_aged_partner_balance_partner"."name" |
|||
""" |
|||
|
|||
|
|||
class AgedPartnerBalanceReportLine(models.TransientModel): |
|||
_name = 'report_aged_partner_balance_line' |
|||
_inherit = 'account_financial_report_abstract' |
|||
|
|||
report_partner_id = fields.Many2one( |
|||
comodel_name='report_aged_partner_balance_partner', |
|||
ondelete='cascade', |
|||
index=True |
|||
) |
|||
due_date = ml["due_date"] |
|||
amount = ml["residual"] |
|||
today = date_at_object |
|||
if not due_date or today <= due_date: |
|||
ml["current"] += amount |
|||
elif today <= due_date + timedelta(days=30): |
|||
ml["30_days"] += amount |
|||
elif today <= due_date + timedelta(days=60): |
|||
ml["60_days"] += amount |
|||
elif today <= due_date + timedelta(days=90): |
|||
ml["90_days"] += amount |
|||
elif today <= due_date + timedelta(days=120): |
|||
ml["120_days"] += amount |
|||
|
|||
# Data fields, used for report display |
|||
partner = fields.Char() |
|||
amount_residual = fields.Float(digits=(16, 2)) |
|||
current = fields.Float(digits=(16, 2)) |
|||
age_30_days = fields.Float(digits=(16, 2)) |
|||
age_60_days = fields.Float(digits=(16, 2)) |
|||
age_90_days = fields.Float(digits=(16, 2)) |
|||
age_120_days = fields.Float(digits=(16, 2)) |
|||
older = fields.Float(digits=(16, 2)) |
|||
|
|||
|
|||
class AgedPartnerBalanceReportMoveLine(models.TransientModel): |
|||
_name = 'report_aged_partner_balance_move_line' |
|||
_inherit = 'account_financial_report_abstract' |
|||
|
|||
report_partner_id = fields.Many2one( |
|||
comodel_name='report_aged_partner_balance_partner', |
|||
ondelete='cascade', |
|||
index=True |
|||
) |
|||
|
|||
# Data fields, used to keep link with real object |
|||
move_line_id = fields.Many2one('account.move.line') |
|||
|
|||
# Data fields, used for report display |
|||
date = fields.Date() |
|||
date_due = fields.Date() |
|||
entry = fields.Char() |
|||
journal = fields.Char() |
|||
account = fields.Char() |
|||
partner = fields.Char() |
|||
label = fields.Char() |
|||
|
|||
amount_residual = fields.Float(digits=(16, 2)) |
|||
current = fields.Float(digits=(16, 2)) |
|||
age_30_days = fields.Float(digits=(16, 2)) |
|||
age_60_days = fields.Float(digits=(16, 2)) |
|||
age_90_days = fields.Float(digits=(16, 2)) |
|||
age_120_days = fields.Float(digits=(16, 2)) |
|||
older = fields.Float(digits=(16, 2)) |
|||
|
|||
|
|||
class AgedPartnerBalanceReportCompute(models.TransientModel): |
|||
""" Here, we just define methods. |
|||
For class fields, go more top at this file. |
|||
""" |
|||
|
|||
_inherit = 'report_aged_partner_balance' |
|||
|
|||
@api.multi |
|||
def print_report(self, report_type): |
|||
self.ensure_one() |
|||
if report_type == 'xlsx': |
|||
report_name = 'a_f_r.report_aged_partner_balance_xlsx' |
|||
else: |
|||
ml["older"] += amount |
|||
|
|||
def _create_account_list( |
|||
self, |
|||
ag_pb_data, |
|||
accounts_data, |
|||
partners_data, |
|||
journals_data, |
|||
show_move_line_details, |
|||
date_at_oject, |
|||
): |
|||
aged_partner_data = [] |
|||
for account in accounts_data.values(): |
|||
acc_id = account["id"] |
|||
account.update( |
|||
{ |
|||
"residual": ag_pb_data[acc_id]["residual"], |
|||
"current": ag_pb_data[acc_id]["current"], |
|||
"30_days": ag_pb_data[acc_id]["30_days"], |
|||
"60_days": ag_pb_data[acc_id]["60_days"], |
|||
"90_days": ag_pb_data[acc_id]["90_days"], |
|||
"120_days": ag_pb_data[acc_id]["120_days"], |
|||
"older": ag_pb_data[acc_id]["older"], |
|||
"partners": [], |
|||
report_name = 'account_financial_report.' \ |
|||
'report_aged_partner_balance_qweb' |
|||
report = self.env['ir.actions.report'].search( |
|||
[('report_name', '=', report_name), |
|||
('report_type', '=', report_type)], limit=1) |
|||
return report.report_action(self, config=False) |
|||
|
|||
def _get_html(self): |
|||
result = {} |
|||
rcontext = {} |
|||
context = dict(self.env.context) |
|||
report = self.browse(context.get('active_id')) |
|||
if report: |
|||
rcontext['o'] = report |
|||
result['html'] = self.env.ref( |
|||
'account_financial_report.report_aged_partner_balance').render( |
|||
rcontext) |
|||
return result |
|||
|
|||
@api.model |
|||
def get_html(self, given_context=None): |
|||
return self._get_html() |
|||
|
|||
def _prepare_report_open_items(self): |
|||
self.ensure_one() |
|||
return { |
|||
'date_at': self.date_at, |
|||
'only_posted_moves': self.only_posted_moves, |
|||
'company_id': self.company_id.id, |
|||
'filter_account_ids': [(6, 0, self.filter_account_ids.ids)], |
|||
'filter_partner_ids': [(6, 0, self.filter_partner_ids.ids)], |
|||
} |
|||
|
|||
@api.multi |
|||
def compute_data_for_report(self): |
|||
self.ensure_one() |
|||
# Compute Open Items Report Data. |
|||
# The data of Aged Partner Balance Report |
|||
# are based on Open Items Report data. |
|||
model = self.env['report_open_items'] |
|||
self.open_items_id = model.create(self._prepare_report_open_items()) |
|||
self.open_items_id.compute_data_for_report() |
|||
|
|||
# Compute report data |
|||
self._inject_account_values() |
|||
self._inject_partner_values() |
|||
self._inject_line_values() |
|||
self._inject_line_values(only_empty_partner_line=True) |
|||
if self.show_move_line_details: |
|||
self._inject_move_line_values() |
|||
self._inject_move_line_values(only_empty_partner_line=True) |
|||
self._compute_accounts_cumul() |
|||
# Refresh cache because all data are computed with SQL requests |
|||
self.invalidate_cache() |
|||
|
|||
def _inject_account_values(self): |
|||
"""Inject report values for report_aged_partner_balance_account""" |
|||
query_inject_account = """ |
|||
INSERT INTO |
|||
report_aged_partner_balance_account |
|||
( |
|||
report_id, |
|||
create_uid, |
|||
create_date, |
|||
account_id, |
|||
code, |
|||
name |
|||
) |
|||
for prt_id in ag_pb_data[acc_id]: |
|||
if isinstance(prt_id, int): |
|||
partner = { |
|||
"name": partners_data[prt_id]["name"], |
|||
"residual": ag_pb_data[acc_id][prt_id]["residual"], |
|||
"current": ag_pb_data[acc_id][prt_id]["current"], |
|||
"30_days": ag_pb_data[acc_id][prt_id]["30_days"], |
|||
"60_days": ag_pb_data[acc_id][prt_id]["60_days"], |
|||
"90_days": ag_pb_data[acc_id][prt_id]["90_days"], |
|||
"120_days": ag_pb_data[acc_id][prt_id]["120_days"], |
|||
"older": ag_pb_data[acc_id][prt_id]["older"], |
|||
} |
|||
if show_move_line_details: |
|||
move_lines = [] |
|||
for ml in ag_pb_data[acc_id][prt_id]["move_lines"]: |
|||
ml.update( |
|||
{ |
|||
"journal": journals_data[ml["jnl_id"]]["code"], |
|||
"account": accounts_data[ml["acc_id"]]["code"], |
|||
} |
|||
SELECT |
|||
%s AS report_id, |
|||
%s AS create_uid, |
|||
NOW() AS create_date, |
|||
rao.account_id, |
|||
rao.code, |
|||
rao.name |
|||
FROM |
|||
report_open_items_account rao |
|||
WHERE |
|||
rao.report_id = %s |
|||
""" |
|||
query_inject_account_params = ( |
|||
self.id, |
|||
self.env.uid, |
|||
self.open_items_id.id, |
|||
) |
|||
self._compute_maturity_date(ml, date_at_oject) |
|||
move_lines.append(ml) |
|||
move_lines = sorted(move_lines, key=lambda k: (k["date"])) |
|||
partner.update({"move_lines": move_lines}) |
|||
account["partners"].append(partner) |
|||
aged_partner_data.append(account) |
|||
return aged_partner_data |
|||
self.env.cr.execute(query_inject_account, query_inject_account_params) |
|||
|
|||
@api.model |
|||
def _calculate_percent(self, aged_partner_data): |
|||
for account in aged_partner_data: |
|||
if abs(account["residual"]) > 0.01: |
|||
total = account["residual"] |
|||
account.update( |
|||
{ |
|||
"percent_current": abs( |
|||
round((account["current"] / total) * 100, 2) |
|||
), |
|||
"percent_30_days": abs( |
|||
round((account["30_days"] / total) * 100, 2) |
|||
), |
|||
"percent_60_days": abs( |
|||
round((account["60_days"] / total) * 100, 2) |
|||
), |
|||
"percent_90_days": abs( |
|||
round((account["90_days"] / total) * 100, 2) |
|||
), |
|||
"percent_120_days": abs( |
|||
round((account["120_days"] / total) * 100, 2) |
|||
), |
|||
"percent_older": abs( |
|||
round((account["older"] / total) * 100, 2) |
|||
), |
|||
} |
|||
def _inject_partner_values(self): |
|||
"""Inject report values for report_aged_partner_balance_partner""" |
|||
query_inject_partner = """ |
|||
INSERT INTO |
|||
report_aged_partner_balance_partner |
|||
( |
|||
report_account_id, |
|||
create_uid, |
|||
create_date, |
|||
partner_id, |
|||
name |
|||
) |
|||
else: |
|||
account.update( |
|||
{ |
|||
"percent_current": 0.0, |
|||
"percent_30_days": 0.0, |
|||
"percent_60_days": 0.0, |
|||
"percent_90_days": 0.0, |
|||
"percent_120_days": 0.0, |
|||
"percent_older": 0.0, |
|||
} |
|||
SELECT |
|||
ra.id AS report_account_id, |
|||
%s AS create_uid, |
|||
NOW() AS create_date, |
|||
rpo.partner_id, |
|||
rpo.name |
|||
FROM |
|||
report_open_items_partner rpo |
|||
INNER JOIN |
|||
report_open_items_account rao ON rpo.report_account_id = rao.id |
|||
INNER JOIN |
|||
report_aged_partner_balance_account ra ON rao.code = ra.code |
|||
WHERE |
|||
rao.report_id = %s |
|||
AND ra.report_id = %s |
|||
""" |
|||
query_inject_partner_params = ( |
|||
self.env.uid, |
|||
self.open_items_id.id, |
|||
self.id, |
|||
) |
|||
return aged_partner_data |
|||
|
|||
def _get_report_values(self, docids, data): |
|||
wizard_id = data["wizard_id"] |
|||
company = self.env["res.company"].browse(data["company_id"]) |
|||
company_id = data["company_id"] |
|||
account_ids = data["account_ids"] |
|||
partner_ids = data["partner_ids"] |
|||
date_at = data["date_at"] |
|||
date_at_object = datetime.strptime(date_at, "%Y-%m-%d").date() |
|||
date_from = data["date_from"] |
|||
only_posted_moves = data["only_posted_moves"] |
|||
show_move_line_details = data["show_move_line_details"] |
|||
self.env.cr.execute(query_inject_partner, query_inject_partner_params) |
|||
|
|||
def _inject_line_values(self, only_empty_partner_line=False): |
|||
""" Inject report values for report_aged_partner_balance_line. |
|||
|
|||
The "only_empty_partner_line" value is used |
|||
to compute data without partner. |
|||
""" |
|||
query_inject_line = """ |
|||
WITH |
|||
date_range AS |
|||
( |
|||
ag_pb_data, |
|||
accounts_data, |
|||
partners_data, |
|||
journals_data, |
|||
) = self._get_move_lines_data( |
|||
company_id, |
|||
account_ids, |
|||
partner_ids, |
|||
date_at_object, |
|||
date_from, |
|||
only_posted_moves, |
|||
show_move_line_details, |
|||
SELECT |
|||
DATE %s AS date_current, |
|||
DATE %s - INTEGER '30' AS date_less_30_days, |
|||
DATE %s - INTEGER '60' AS date_less_60_days, |
|||
DATE %s - INTEGER '90' AS date_less_90_days, |
|||
DATE %s - INTEGER '120' AS date_less_120_days |
|||
) |
|||
aged_partner_data = self._create_account_list( |
|||
ag_pb_data, |
|||
accounts_data, |
|||
partners_data, |
|||
journals_data, |
|||
show_move_line_details, |
|||
date_at_object, |
|||
INSERT INTO |
|||
report_aged_partner_balance_line |
|||
( |
|||
report_partner_id, |
|||
create_uid, |
|||
create_date, |
|||
partner, |
|||
amount_residual, |
|||
current, |
|||
age_30_days, |
|||
age_60_days, |
|||
age_90_days, |
|||
age_120_days, |
|||
older |
|||
) |
|||
aged_partner_data = self._calculate_percent(aged_partner_data) |
|||
return { |
|||
"doc_ids": [wizard_id], |
|||
"doc_model": "open.items.report.wizard", |
|||
"docs": self.env["open.items.report.wizard"].browse(wizard_id), |
|||
"company_name": company.display_name, |
|||
"company_currency": company.currency_id, |
|||
"currency_name": company.currency_id.name, |
|||
"date_at": date_at, |
|||
"only_posted_moves": only_posted_moves, |
|||
"aged_partner_balance": aged_partner_data, |
|||
"show_move_lines_details": show_move_line_details, |
|||
} |
|||
SELECT |
|||
rp.id AS report_partner_id, |
|||
%s AS create_uid, |
|||
NOW() AS create_date, |
|||
rp.name, |
|||
SUM(rlo.amount_residual) AS amount_residual, |
|||
SUM( |
|||
CASE |
|||
WHEN rlo.date_due >= date_range.date_current |
|||
THEN rlo.amount_residual |
|||
END |
|||
) AS current, |
|||
SUM( |
|||
CASE |
|||
WHEN |
|||
rlo.date_due >= date_range.date_less_30_days |
|||
AND rlo.date_due < date_range.date_current |
|||
THEN rlo.amount_residual |
|||
END |
|||
) AS age_30_days, |
|||
SUM( |
|||
CASE |
|||
WHEN |
|||
rlo.date_due >= date_range.date_less_60_days |
|||
AND rlo.date_due < date_range.date_less_30_days |
|||
THEN rlo.amount_residual |
|||
END |
|||
) AS age_60_days, |
|||
SUM( |
|||
CASE |
|||
WHEN |
|||
rlo.date_due >= date_range.date_less_90_days |
|||
AND rlo.date_due < date_range.date_less_60_days |
|||
THEN rlo.amount_residual |
|||
END |
|||
) AS age_90_days, |
|||
SUM( |
|||
CASE |
|||
WHEN |
|||
rlo.date_due >= date_range.date_less_120_days |
|||
AND rlo.date_due < date_range.date_less_90_days |
|||
THEN rlo.amount_residual |
|||
END |
|||
) AS age_120_days, |
|||
SUM( |
|||
CASE |
|||
WHEN rlo.date_due < date_range.date_less_120_days |
|||
THEN rlo.amount_residual |
|||
END |
|||
) AS older |
|||
FROM |
|||
date_range, |
|||
report_open_items_move_line rlo |
|||
INNER JOIN |
|||
report_open_items_partner rpo ON rlo.report_partner_id = rpo.id |
|||
INNER JOIN |
|||
report_open_items_account rao ON rpo.report_account_id = rao.id |
|||
INNER JOIN |
|||
report_aged_partner_balance_account ra ON rao.code = ra.code |
|||
INNER JOIN |
|||
report_aged_partner_balance_partner rp |
|||
ON |
|||
ra.id = rp.report_account_id |
|||
""" |
|||
if not only_empty_partner_line: |
|||
query_inject_line += """ |
|||
AND rpo.partner_id = rp.partner_id |
|||
""" |
|||
elif only_empty_partner_line: |
|||
query_inject_line += """ |
|||
AND rpo.partner_id IS NULL |
|||
AND rp.partner_id IS NULL |
|||
""" |
|||
query_inject_line += """ |
|||
WHERE |
|||
rao.report_id = %s |
|||
AND ra.report_id = %s |
|||
GROUP BY |
|||
rp.id |
|||
""" |
|||
query_inject_line_params = (self.date_at,) * 5 |
|||
query_inject_line_params += ( |
|||
self.env.uid, |
|||
self.open_items_id.id, |
|||
self.id, |
|||
) |
|||
self.env.cr.execute(query_inject_line, query_inject_line_params) |
|||
|
|||
def _inject_move_line_values(self, only_empty_partner_line=False): |
|||
""" Inject report values for report_aged_partner_balance_move_line |
|||
|
|||
The "only_empty_partner_line" value is used |
|||
to compute data without partner. |
|||
""" |
|||
query_inject_move_line = """ |
|||
WITH |
|||
date_range AS |
|||
( |
|||
SELECT |
|||
DATE %s AS date_current, |
|||
DATE %s - INTEGER '30' AS date_less_30_days, |
|||
DATE %s - INTEGER '60' AS date_less_60_days, |
|||
DATE %s - INTEGER '90' AS date_less_90_days, |
|||
DATE %s - INTEGER '120' AS date_less_120_days |
|||
) |
|||
INSERT INTO |
|||
report_aged_partner_balance_move_line |
|||
( |
|||
report_partner_id, |
|||
create_uid, |
|||
create_date, |
|||
move_line_id, |
|||
date, |
|||
date_due, |
|||
entry, |
|||
journal, |
|||
account, |
|||
partner, |
|||
label, |
|||
amount_residual, |
|||
current, |
|||
age_30_days, |
|||
age_60_days, |
|||
age_90_days, |
|||
age_120_days, |
|||
older |
|||
) |
|||
SELECT |
|||
rp.id AS report_partner_id, |
|||
%s AS create_uid, |
|||
NOW() AS create_date, |
|||
rlo.move_line_id, |
|||
rlo.date, |
|||
rlo.date_due, |
|||
rlo.entry, |
|||
rlo.journal, |
|||
rlo.account, |
|||
rlo.partner, |
|||
rlo.label, |
|||
rlo.amount_residual AS amount_residual, |
|||
CASE |
|||
WHEN rlo.date_due >= date_range.date_current |
|||
THEN rlo.amount_residual |
|||
END AS current, |
|||
CASE |
|||
WHEN |
|||
rlo.date_due >= date_range.date_less_30_days |
|||
AND rlo.date_due < date_range.date_current |
|||
THEN rlo.amount_residual |
|||
END AS age_30_days, |
|||
CASE |
|||
WHEN |
|||
rlo.date_due >= date_range.date_less_60_days |
|||
AND rlo.date_due < date_range.date_less_30_days |
|||
THEN rlo.amount_residual |
|||
END AS age_60_days, |
|||
CASE |
|||
WHEN |
|||
rlo.date_due >= date_range.date_less_90_days |
|||
AND rlo.date_due < date_range.date_less_60_days |
|||
THEN rlo.amount_residual |
|||
END AS age_90_days, |
|||
CASE |
|||
WHEN |
|||
rlo.date_due >= date_range.date_less_120_days |
|||
AND rlo.date_due < date_range.date_less_90_days |
|||
THEN rlo.amount_residual |
|||
END AS age_120_days, |
|||
CASE |
|||
WHEN rlo.date_due < date_range.date_less_120_days |
|||
THEN rlo.amount_residual |
|||
END AS older |
|||
FROM |
|||
date_range, |
|||
report_open_items_move_line rlo |
|||
INNER JOIN |
|||
report_open_items_partner rpo ON rlo.report_partner_id = rpo.id |
|||
INNER JOIN |
|||
report_open_items_account rao ON rpo.report_account_id = rao.id |
|||
INNER JOIN |
|||
report_aged_partner_balance_account ra ON rao.code = ra.code |
|||
INNER JOIN |
|||
report_aged_partner_balance_partner rp |
|||
ON |
|||
ra.id = rp.report_account_id |
|||
""" |
|||
if not only_empty_partner_line: |
|||
query_inject_move_line += """ |
|||
AND rpo.partner_id = rp.partner_id |
|||
""" |
|||
elif only_empty_partner_line: |
|||
query_inject_move_line += """ |
|||
AND rpo.partner_id IS NULL |
|||
AND rp.partner_id IS NULL |
|||
""" |
|||
query_inject_move_line += """ |
|||
WHERE |
|||
rao.report_id = %s |
|||
AND ra.report_id = %s |
|||
""" |
|||
query_inject_move_line_params = (self.date_at,) * 5 |
|||
query_inject_move_line_params += ( |
|||
self.env.uid, |
|||
self.open_items_id.id, |
|||
self.id, |
|||
) |
|||
self.env.cr.execute(query_inject_move_line, |
|||
query_inject_move_line_params) |
|||
|
|||
def _compute_accounts_cumul(self): |
|||
""" Compute cumulative amount for |
|||
report_aged_partner_balance_account. |
|||
""" |
|||
query_compute_accounts_cumul = """ |
|||
WITH |
|||
cumuls AS |
|||
( |
|||
SELECT |
|||
ra.id AS report_account_id, |
|||
SUM(rl.amount_residual) AS cumul_amount_residual, |
|||
SUM(rl.current) AS cumul_current, |
|||
SUM(rl.age_30_days) AS cumul_age_30_days, |
|||
SUM(rl.age_60_days) AS cumul_age_60_days, |
|||
SUM(rl.age_90_days) AS cumul_age_90_days, |
|||
SUM(rl.age_120_days) AS cumul_age_120_days, |
|||
SUM(rl.older) AS cumul_older |
|||
FROM |
|||
report_aged_partner_balance_line rl |
|||
INNER JOIN |
|||
report_aged_partner_balance_partner rp |
|||
ON rl.report_partner_id = rp.id |
|||
INNER JOIN |
|||
report_aged_partner_balance_account ra |
|||
ON rp.report_account_id = ra.id |
|||
WHERE |
|||
ra.report_id = %s |
|||
GROUP BY |
|||
ra.id |
|||
) |
|||
UPDATE |
|||
report_aged_partner_balance_account |
|||
SET |
|||
cumul_amount_residual = c.cumul_amount_residual, |
|||
cumul_current = c.cumul_current, |
|||
cumul_age_30_days = c.cumul_age_30_days, |
|||
cumul_age_60_days = c.cumul_age_60_days, |
|||
cumul_age_90_days = c.cumul_age_90_days, |
|||
cumul_age_120_days = c.cumul_age_120_days, |
|||
cumul_older = c.cumul_older, |
|||
percent_current = |
|||
CASE |
|||
WHEN c.cumul_amount_residual != 0 |
|||
THEN 100 * c.cumul_current / c.cumul_amount_residual |
|||
END, |
|||
percent_age_30_days = |
|||
CASE |
|||
WHEN c.cumul_amount_residual != 0 |
|||
THEN 100 * c.cumul_age_30_days / c.cumul_amount_residual |
|||
END, |
|||
percent_age_60_days = |
|||
CASE |
|||
WHEN c.cumul_amount_residual != 0 |
|||
THEN 100 * c.cumul_age_60_days / c.cumul_amount_residual |
|||
END, |
|||
percent_age_90_days = |
|||
CASE |
|||
WHEN c.cumul_amount_residual != 0 |
|||
THEN 100 * c.cumul_age_90_days / c.cumul_amount_residual |
|||
END, |
|||
percent_age_120_days = |
|||
CASE |
|||
WHEN c.cumul_amount_residual != 0 |
|||
THEN 100 * c.cumul_age_120_days / c.cumul_amount_residual |
|||
END, |
|||
percent_older = |
|||
CASE |
|||
WHEN c.cumul_amount_residual != 0 |
|||
THEN 100 * c.cumul_older / c.cumul_amount_residual |
|||
END |
|||
FROM |
|||
cumuls c |
|||
WHERE |
|||
id = c.report_account_id |
|||
""" |
|||
params_compute_accounts_cumul = (self.id,) |
|||
self.env.cr.execute(query_compute_accounts_cumul, |
|||
params_compute_accounts_cumul) |
2565
account_financial_report/report/general_ledger.py
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
1185
account_financial_report/report/journal_ledger.py
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
1207
account_financial_report/report/open_items.py
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -1,32 +1,26 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<odoo> |
|||
|
|||
<template id="account_financial_report.internal_layout"> |
|||
<div class="article o_account_financial_reports_page"> |
|||
<link |
|||
href="/account_financial_report/static/src/css/report.css" |
|||
rel="stylesheet" |
|||
/> |
|||
<div class="article"> |
|||
<link href="/account_financial_report/static/src/css/report.css" rel="stylesheet"/> |
|||
<t t-raw="0" /> |
|||
</div> |
|||
|
|||
<div class="footer"> |
|||
<div class="row"> |
|||
<div class="col-6 custom_footer"> |
|||
<span |
|||
t-esc="context_timestamp(datetime.datetime.now()).strftime('%Y-%m-%d %H:%M')" |
|||
/> |
|||
<span t-esc="context_timestamp(datetime.datetime.now()).strftime('%Y-%m-%d %H:%M')"/> |
|||
</div> |
|||
<div class="col-6 text-right custom_footer"> |
|||
<ul class="list-inline"> |
|||
<li class="list-inline-item"> |
|||
<span class="page" /> |
|||
</li> |
|||
<li class="list-inline-item"><span class="page"/></li> |
|||
<li class="list-inline-item">/</li> |
|||
<li class="list-inline-item"> |
|||
<span class="topage" /> |
|||
</li> |
|||
<li class="list-inline-item"><span class="topage"/></li> |
|||
</ul> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</template> |
|||
|
|||
</odoo> |
1165
account_financial_report/report/templates/trial_balance.xml
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
1294
account_financial_report/report/trial_balance.py
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -1,239 +1,356 @@ |
|||
# Copyright 2018 Forest and Biomass Romania |
|||
# Copyright 2020 ForgeFlow S.L. (https://www.forgeflow.com) |
|||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). |
|||
|
|||
import operator |
|||
|
|||
from odoo import api, models |
|||
|
|||
|
|||
class VATReport(models.AbstractModel): |
|||
_name = "report.account_financial_report.vat_report" |
|||
_description = "Vat Report Report" |
|||
|
|||
def _get_tax_data(self, tax_ids): |
|||
taxes = self.env["account.tax"].browse(tax_ids) |
|||
tax_data = {} |
|||
for tax in taxes: |
|||
tax_data.update( |
|||
{ |
|||
tax.id: { |
|||
"id": tax.id, |
|||
"name": tax.name, |
|||
"tax_group_id": tax.tax_group_id.id, |
|||
"type_tax_use": tax.type_tax_use, |
|||
"amount_type": tax.amount_type, |
|||
"tags_ids": tax.invoice_repartition_line_ids.tag_ids.ids, |
|||
} |
|||
} |
|||
) |
|||
return tax_data |
|||
from odoo import api, fields, models |
|||
|
|||
@api.model |
|||
def _get_tax_report_domain(self, company_id, date_from, date_to, only_posted_moves): |
|||
domain = [ |
|||
("company_id", "=", company_id), |
|||
("date", ">=", date_from), |
|||
("date", "<=", date_to), |
|||
("tax_line_id", "!=", False), |
|||
("tax_exigible", "=", True), |
|||
] |
|||
if only_posted_moves: |
|||
domain += [("move_id.state", "=", "posted")] |
|||
else: |
|||
domain += [("move_id.state", "in", ["posted", "draft"])] |
|||
return domain |
|||
|
|||
@api.model |
|||
def _get_net_report_domain(self, company_id, date_from, date_to, only_posted_moves): |
|||
domain = [ |
|||
("company_id", "=", company_id), |
|||
("date", ">=", date_from), |
|||
("date", "<=", date_to), |
|||
("tax_exigible", "=", True), |
|||
] |
|||
if only_posted_moves: |
|||
domain += [("move_id.state", "=", "posted")] |
|||
else: |
|||
domain += [("move_id.state", "in", ["posted", "draft"])] |
|||
return domain |
|||
class VATReport(models.TransientModel): |
|||
_name = "report_vat_report" |
|||
_inherit = 'account_financial_report_abstract' |
|||
""" Here, we just define class fields. |
|||
For methods, go more bottom at this file. |
|||
|
|||
def _get_vat_report_data(self, company_id, date_from, date_to, only_posted_moves): |
|||
tax_domain = self._get_tax_report_domain( |
|||
company_id, date_from, date_to, only_posted_moves |
|||
The class hierarchy is : |
|||
* VATReport |
|||
** VATReportTaxTags |
|||
*** VATReportTax |
|||
""" |
|||
|
|||
# Filters fields, used for data computation |
|||
company_id = fields.Many2one(comodel_name='res.company') |
|||
date_from = fields.Date() |
|||
date_to = fields.Date() |
|||
based_on = fields.Selection([('taxtags', 'Tax Tags'), |
|||
('taxgroups', 'Tax Groups')], |
|||
string='Based On', |
|||
required=True, |
|||
default='taxtags') |
|||
tax_detail = fields.Boolean('Tax Detail') |
|||
|
|||
# Data fields, used to browse report data |
|||
taxtags_ids = fields.One2many( |
|||
comodel_name='report_vat_report_taxtag', |
|||
inverse_name='report_id' |
|||
) |
|||
ml_fields = [ |
|||
"id", |
|||
"tax_base_amount", |
|||
"balance", |
|||
"tax_line_id", |
|||
"tax_ids", |
|||
"analytic_tag_ids", |
|||
"tag_ids", |
|||
] |
|||
tax_move_lines = self.env["account.move.line"].search_read( |
|||
domain=tax_domain, fields=ml_fields, |
|||
|
|||
|
|||
class VATReportTaxTags(models.TransientModel): |
|||
_name = 'report_vat_report_taxtag' |
|||
_inherit = 'account_financial_report_abstract' |
|||
_order = 'code ASC' |
|||
|
|||
report_id = fields.Many2one( |
|||
comodel_name='report_vat_report', |
|||
ondelete='cascade', |
|||
index=True |
|||
) |
|||
net_domain = self._get_net_report_domain( |
|||
company_id, date_from, date_to, only_posted_moves |
|||
|
|||
# Data fields, used to keep link with real object |
|||
taxtag_id = fields.Many2one( |
|||
'account.account.tag', |
|||
index=True |
|||
) |
|||
taxed_move_lines = self.env["account.move.line"].search_read( |
|||
domain=net_domain, fields=ml_fields, |
|||
taxgroup_id = fields.Many2one( |
|||
'account.tax.group', |
|||
index=True |
|||
) |
|||
taxed_move_lines = list(filter(lambda d: d["tax_ids"], taxed_move_lines)) |
|||
vat_data = [] |
|||
for tax_move_line in tax_move_lines: |
|||
vat_data.append( |
|||
{ |
|||
"net": 0.0, |
|||
"tax": tax_move_line["balance"], |
|||
"tax_line_id": tax_move_line["tax_line_id"][0], |
|||
} |
|||
|
|||
# Data fields, used for report display |
|||
code = fields.Char() |
|||
name = fields.Char() |
|||
net = fields.Float(digits=(16, 2)) |
|||
tax = fields.Float(digits=(16, 2)) |
|||
|
|||
# Data fields, used to browse report data |
|||
tax_ids = fields.One2many( |
|||
comodel_name='report_vat_report_tax', |
|||
inverse_name='report_tax_id', |
|||
string='Taxes' |
|||
) |
|||
for taxed_move_line in taxed_move_lines: |
|||
for tax_id in taxed_move_line["tax_ids"]: |
|||
vat_data.append( |
|||
{ |
|||
"net": taxed_move_line["balance"], |
|||
"tax": 0.0, |
|||
"tax_line_id": tax_id, |
|||
} |
|||
|
|||
|
|||
class VATReportTax(models.TransientModel): |
|||
_name = 'report_vat_report_tax' |
|||
_inherit = 'account_financial_report_abstract' |
|||
_order = 'name ASC' |
|||
|
|||
report_tax_id = fields.Many2one( |
|||
comodel_name='report_vat_report_taxtag', |
|||
ondelete='cascade', |
|||
index=True |
|||
) |
|||
tax_ids = list(map(operator.itemgetter("tax_line_id"), vat_data)) |
|||
tax_ids = list(set(tax_ids)) |
|||
tax_data = self._get_tax_data(tax_ids) |
|||
return vat_data, tax_data |
|||
|
|||
def _get_tax_group_data(self, tax_group_ids): |
|||
tax_groups = self.env["account.tax.group"].browse(tax_group_ids) |
|||
tax_group_data = {} |
|||
for tax_group in tax_groups: |
|||
tax_group_data.update( |
|||
{ |
|||
tax_group.id: { |
|||
"id": tax_group.id, |
|||
"name": tax_group.name, |
|||
"code": str(tax_group.sequence), |
|||
} |
|||
} |
|||
|
|||
# Data fields, used to keep link with real object |
|||
tax_id = fields.Many2one( |
|||
'account.tax', |
|||
index=True, |
|||
string='Tax ID', |
|||
) |
|||
return tax_group_data |
|||
|
|||
def _get_vat_report_group_data(self, vat_report_data, tax_data, tax_detail): |
|||
vat_report = {} |
|||
for tax_move_line in vat_report_data: |
|||
tax_id = tax_move_line["tax_line_id"] |
|||
if tax_data[tax_id]["amount_type"] == "group": |
|||
pass |
|||
else: |
|||
tax_group_id = tax_data[tax_id]["tax_group_id"] |
|||
if tax_group_id not in vat_report.keys(): |
|||
vat_report[tax_group_id] = {} |
|||
vat_report[tax_group_id]["net"] = 0.0 |
|||
vat_report[tax_group_id]["tax"] = 0.0 |
|||
vat_report[tax_group_id][tax_id] = dict(tax_data[tax_id]) |
|||
vat_report[tax_group_id][tax_id].update({"net": 0.0, "tax": 0.0}) |
|||
|
|||
# Data fields, used for report display |
|||
code = fields.Char() |
|||
name = fields.Char() |
|||
net = fields.Float(digits=(16, 2)) |
|||
tax = fields.Float(digits=(16, 2)) |
|||
|
|||
|
|||
class VATReportCompute(models.TransientModel): |
|||
""" Here, we just define methods. |
|||
For class fields, go more top at this file. |
|||
""" |
|||
|
|||
_inherit = 'report_vat_report' |
|||
|
|||
@api.multi |
|||
def print_report(self, report_type='qweb'): |
|||
self.ensure_one() |
|||
if report_type == 'xlsx': |
|||
report_name = 'a_f_r.report_vat_report_xlsx' |
|||
else: |
|||
if tax_id not in vat_report[tax_group_id].keys(): |
|||
vat_report[tax_group_id][tax_id] = dict(tax_data[tax_id]) |
|||
vat_report[tax_group_id][tax_id].update( |
|||
{"net": 0.0, "tax": 0.0} |
|||
report_name = 'account_financial_report.report_vat_report_qweb' |
|||
context = dict(self.env.context) |
|||
action = self.env['ir.actions.report'].search( |
|||
[('report_name', '=', report_name), |
|||
('report_type', '=', report_type)], limit=1) |
|||
return action.with_context(context).report_action(self, config=False) |
|||
|
|||
def _get_html(self): |
|||
result = {} |
|||
rcontext = {} |
|||
context = dict(self.env.context) |
|||
report = self.browse(context.get('active_id')) |
|||
if report: |
|||
rcontext['o'] = report |
|||
result['html'] = self.env.ref( |
|||
'account_financial_report.report_vat_report').render( |
|||
rcontext) |
|||
return result |
|||
|
|||
@api.model |
|||
def get_html(self, given_context=None): |
|||
return self.with_context(given_context)._get_html() |
|||
|
|||
@api.multi |
|||
def compute_data_for_report(self): |
|||
self.ensure_one() |
|||
# Compute report data |
|||
if self.based_on == 'taxtags': |
|||
self._inject_taxtags_values() |
|||
self._inject_tax_taxtags_values() |
|||
elif self.based_on == 'taxgroups': |
|||
self._inject_taxgroups_values() |
|||
self._inject_tax_taxgroups_values() |
|||
# Refresh cache because all data are computed with SQL requests |
|||
self.refresh() |
|||
|
|||
def _inject_taxtags_values(self): |
|||
"""Inject report values for report_vat_report_taxtags.""" |
|||
query_inject_taxtags = """ |
|||
WITH |
|||
taxtags AS |
|||
(SELECT coalesce(regexp_replace(tag.name, |
|||
'[^0-9\\.]+', '', 'g'), ' ') AS code, |
|||
tag.name, tag.id, |
|||
coalesce(sum(movetax.tax_base_amount), 0.00) AS net, |
|||
coalesce(sum(movetax.balance), 0.00) AS tax |
|||
FROM |
|||
account_account_tag AS tag |
|||
INNER JOIN account_tax_account_tag AS taxtag |
|||
ON tag.id = taxtag.account_account_tag_id |
|||
INNER JOIN account_tax AS tax |
|||
ON tax.id = taxtag.account_tax_id |
|||
INNER JOIN account_move_line AS movetax |
|||
ON movetax.tax_line_id = tax.id |
|||
INNER JOIN account_move AS move |
|||
ON move.id = movetax.move_id |
|||
WHERE tag.id is not null AND movetax.tax_exigible |
|||
AND move.company_id = %s AND move.date >= %s |
|||
AND move.date <= %s AND move.state = 'posted' |
|||
GROUP BY tag.id |
|||
ORDER BY code, tag.name |
|||
) |
|||
vat_report[tax_group_id]["net"] += tax_move_line["net"] |
|||
vat_report[tax_group_id]["tax"] += tax_move_line["tax"] |
|||
vat_report[tax_group_id][tax_id]["net"] += tax_move_line["net"] |
|||
vat_report[tax_group_id][tax_id]["tax"] += tax_move_line["tax"] |
|||
tax_group_data = self._get_tax_group_data(vat_report.keys()) |
|||
vat_report_list = [] |
|||
for tax_group_id in vat_report.keys(): |
|||
vat_report[tax_group_id]["name"] = tax_group_data[tax_group_id]["name"] |
|||
vat_report[tax_group_id]["code"] = tax_group_data[tax_group_id]["code"] |
|||
if tax_detail: |
|||
vat_report[tax_group_id]["taxes"] = [] |
|||
for tax_id in vat_report[tax_group_id]: |
|||
if isinstance(tax_id, int): |
|||
vat_report[tax_group_id]["taxes"].append( |
|||
vat_report[tax_group_id][tax_id] |
|||
INSERT INTO |
|||
report_vat_report_taxtag |
|||
( |
|||
report_id, |
|||
create_uid, |
|||
create_date, |
|||
taxtag_id, |
|||
code, |
|||
name, |
|||
net, tax |
|||
) |
|||
vat_report_list.append(vat_report[tax_group_id]) |
|||
return vat_report_list |
|||
|
|||
def _get_tags_data(self, tags_ids): |
|||
tags = self.env["account.account.tag"].browse(tags_ids) |
|||
tags_data = {} |
|||
for tag in tags: |
|||
tags_data.update({tag.id: {"code": "", "name": tag.name}}) |
|||
return tags_data |
|||
|
|||
def _get_vat_report_tag_data(self, vat_report_data, tax_data, tax_detail): |
|||
vat_report = {} |
|||
for tax_move_line in vat_report_data: |
|||
tax_id = tax_move_line["tax_line_id"] |
|||
tags_ids = tax_data[tax_id]["tags_ids"] |
|||
if tax_data[tax_id]["amount_type"] == "group": |
|||
continue |
|||
else: |
|||
if tags_ids: |
|||
for tag_id in tags_ids: |
|||
if tag_id not in vat_report.keys(): |
|||
vat_report[tag_id] = {} |
|||
vat_report[tag_id]["net"] = 0.0 |
|||
vat_report[tag_id]["tax"] = 0.0 |
|||
vat_report[tag_id][tax_id] = dict(tax_data[tax_id]) |
|||
vat_report[tag_id][tax_id].update({"net": 0.0, "tax": 0.0}) |
|||
else: |
|||
if tax_id not in vat_report[tag_id].keys(): |
|||
vat_report[tag_id][tax_id] = dict(tax_data[tax_id]) |
|||
vat_report[tag_id][tax_id].update( |
|||
{"net": 0.0, "tax": 0.0} |
|||
SELECT |
|||
%s AS report_id, |
|||
%s AS create_uid, |
|||
NOW() AS create_date, |
|||
tag.id, |
|||
tag.code, |
|||
tag.name, |
|||
abs(tag.net), |
|||
abs(tag.tax) |
|||
FROM |
|||
taxtags tag |
|||
""" |
|||
query_inject_taxtags_params = (self.company_id.id, self.date_from, |
|||
self.date_to, self.id, self.env.uid) |
|||
self.env.cr.execute(query_inject_taxtags, query_inject_taxtags_params) |
|||
|
|||
def _inject_taxgroups_values(self): |
|||
"""Inject report values for report_vat_report_taxtags.""" |
|||
query_inject_taxgroups = """ |
|||
WITH |
|||
taxgroups AS |
|||
(SELECT coalesce(taxgroup.sequence, 0) AS code, |
|||
taxgroup.name, taxgroup.id, |
|||
coalesce(sum(movetax.tax_base_amount), 0.00) AS net, |
|||
coalesce(sum(movetax.balance), 0.00) AS tax |
|||
FROM |
|||
account_tax_group AS taxgroup |
|||
INNER JOIN account_tax AS tax |
|||
ON tax.tax_group_id = taxgroup.id |
|||
INNER JOIN account_move_line AS movetax |
|||
ON movetax.tax_line_id = tax.id |
|||
INNER JOIN account_move AS move |
|||
ON move.id = movetax.move_id |
|||
WHERE taxgroup.id is not null AND movetax.tax_exigible |
|||
AND move.company_id = %s AND move.date >= %s |
|||
AND move.date <= %s AND move.state = 'posted' |
|||
GROUP BY taxgroup.id |
|||
ORDER BY code, taxgroup.name |
|||
) |
|||
vat_report[tag_id][tax_id]["net"] += tax_move_line["net"] |
|||
vat_report[tag_id][tax_id]["tax"] += tax_move_line["tax"] |
|||
vat_report[tag_id]["net"] += tax_move_line["net"] |
|||
vat_report[tag_id]["tax"] += tax_move_line["tax"] |
|||
tags_data = self._get_tags_data(vat_report.keys()) |
|||
vat_report_list = [] |
|||
for tag_id in vat_report.keys(): |
|||
vat_report[tag_id]["name"] = tags_data[tag_id]["name"] |
|||
vat_report[tag_id]["code"] = tags_data[tag_id]["code"] |
|||
if tax_detail: |
|||
vat_report[tag_id]["taxes"] = [] |
|||
for tax_id in vat_report[tag_id]: |
|||
if isinstance(tax_id, int): |
|||
vat_report[tag_id]["taxes"].append(vat_report[tag_id][tax_id]) |
|||
vat_report_list.append(vat_report[tag_id]) |
|||
return vat_report_list |
|||
|
|||
def _get_report_values(self, docids, data): |
|||
wizard_id = data["wizard_id"] |
|||
company = self.env["res.company"].browse(data["company_id"]) |
|||
company_id = data["company_id"] |
|||
date_from = data["date_from"] |
|||
date_to = data["date_to"] |
|||
based_on = data["based_on"] |
|||
tax_detail = data["tax_detail"] |
|||
only_posted_moves = data["only_posted_moves"] |
|||
vat_report_data, tax_data = self._get_vat_report_data( |
|||
company_id, date_from, date_to, only_posted_moves |
|||
INSERT INTO |
|||
report_vat_report_taxtag |
|||
( |
|||
report_id, |
|||
create_uid, |
|||
create_date, |
|||
taxgroup_id, |
|||
code, |
|||
name, |
|||
net, tax |
|||
) |
|||
if based_on == "taxgroups": |
|||
vat_report = self._get_vat_report_group_data( |
|||
vat_report_data, tax_data, tax_detail |
|||
SELECT |
|||
%s AS report_id, |
|||
%s AS create_uid, |
|||
NOW() AS create_date, |
|||
groups.id, |
|||
groups.code, |
|||
groups.name, |
|||
abs(groups.net), |
|||
abs(groups.tax) |
|||
FROM |
|||
taxgroups groups |
|||
""" |
|||
query_inject_taxgroups_params = (self.company_id.id, self.date_from, |
|||
self.date_to, self.id, self.env.uid) |
|||
self.env.cr.execute(query_inject_taxgroups, |
|||
query_inject_taxgroups_params) |
|||
|
|||
def _inject_tax_taxtags_values(self): |
|||
""" Inject report values for report_vat_report_tax. """ |
|||
# pylint: disable=sql-injection |
|||
query_inject_tax = """ |
|||
WITH |
|||
taxtags_tax AS |
|||
( |
|||
SELECT |
|||
tag.id AS report_tax_id, ' ' AS code, |
|||
tax.name, tax.id, |
|||
coalesce(sum(movetax.tax_base_amount), 0.00) AS net, |
|||
coalesce(sum(movetax.balance), 0.00) AS tax |
|||
FROM |
|||
report_vat_report_taxtag AS tag |
|||
INNER JOIN account_tax_account_tag AS taxtag |
|||
ON tag.taxtag_id = taxtag.account_account_tag_id |
|||
INNER JOIN account_tax AS tax |
|||
ON tax.id = taxtag.account_tax_id |
|||
INNER JOIN account_move_line AS movetax |
|||
ON movetax.tax_line_id = tax.id |
|||
INNER JOIN account_move AS move |
|||
ON move.id = movetax.move_id |
|||
WHERE tag.id is not null AND movetax.tax_exigible |
|||
AND tag.report_id = %s AND move.company_id = %s |
|||
AND move.date >= %s AND move.date <= %s |
|||
AND move.state = 'posted' |
|||
GROUP BY tag.id, tax.id |
|||
ORDER BY tax.name |
|||
) |
|||
else: |
|||
vat_report = self._get_vat_report_tag_data( |
|||
vat_report_data, tax_data, tax_detail |
|||
INSERT INTO |
|||
report_vat_report_tax |
|||
( |
|||
report_tax_id, |
|||
create_uid, |
|||
create_date, |
|||
tax_id, |
|||
name, |
|||
net, |
|||
tax |
|||
) |
|||
SELECT |
|||
tt.report_tax_id, |
|||
%s AS create_uid, |
|||
NOW() AS create_date, |
|||
tt.id, |
|||
tt.name, |
|||
abs(tt.net), |
|||
abs(tt.tax) |
|||
FROM |
|||
taxtags_tax tt |
|||
""" |
|||
query_inject_tax_params = (self.id, self.company_id.id, self.date_from, |
|||
self.date_to, self.env.uid) |
|||
self.env.cr.execute(query_inject_tax, query_inject_tax_params) |
|||
|
|||
def _inject_tax_taxgroups_values(self): |
|||
""" Inject report values for report_vat_report_tax. """ |
|||
# pylint: disable=sql-injection |
|||
query_inject_tax = """ |
|||
WITH |
|||
taxtags_tax AS |
|||
( |
|||
SELECT |
|||
taxtag.id AS report_tax_id, ' ' AS code, |
|||
tax.name, tax.id, |
|||
coalesce(sum(movetax.tax_base_amount), 0.00) AS net, |
|||
coalesce(sum(movetax.balance), 0.00) AS tax |
|||
FROM |
|||
report_vat_report_taxtag AS taxtag |
|||
INNER JOIN account_tax AS tax |
|||
ON tax.tax_group_id = taxtag.taxgroup_id |
|||
INNER JOIN account_move_line AS movetax |
|||
ON movetax.tax_line_id = tax.id |
|||
INNER JOIN account_move AS move |
|||
ON move.id = movetax.move_id |
|||
WHERE taxtag.id is not null AND movetax.tax_exigible |
|||
AND taxtag.report_id = %s AND move.company_id = %s |
|||
AND move.date >= %s AND move.date <= %s |
|||
AND move.state = 'posted' |
|||
GROUP BY taxtag.id, tax.id |
|||
ORDER BY tax.name |
|||
) |
|||
INSERT INTO |
|||
report_vat_report_tax |
|||
( |
|||
report_tax_id, |
|||
create_uid, |
|||
create_date, |
|||
tax_id, |
|||
name, |
|||
net, |
|||
tax |
|||
) |
|||
return { |
|||
"doc_ids": [wizard_id], |
|||
"doc_model": "open.items.report.wizard", |
|||
"docs": self.env["open.items.report.wizard"].browse(wizard_id), |
|||
"company_name": company.display_name, |
|||
"company_currency": company.currency_id, |
|||
"currency_name": company.currency_id.name, |
|||
"date_to": data["date_to"], |
|||
"date_from": data["date_from"], |
|||
"based_on": data["based_on"], |
|||
"tax_detail": data["tax_detail"], |
|||
"vat_report": vat_report, |
|||
} |
|||
SELECT |
|||
tt.report_tax_id, |
|||
%s AS create_uid, |
|||
NOW() AS create_date, |
|||
tt.id, |
|||
tt.name, |
|||
abs(tt.net), |
|||
abs(tt.tax) |
|||
FROM |
|||
taxtags_tax tt |
|||
""" |
|||
query_inject_tax_params = (self.id, self.company_id.id, self.date_from, |
|||
self.date_to, self.env.uid) |
|||
self.env.cr.execute(query_inject_tax, query_inject_tax_params) |
@ -0,0 +1,120 @@ |
|||
odoo.define('account_financial_report.account_financial_report_backend', function (require) { |
|||
'use strict'; |
|||
|
|||
var core = require('web.core'); |
|||
var Widget = require('web.Widget'); |
|||
var ControlPanelMixin = require('web.ControlPanelMixin'); |
|||
var ReportWidget = require( |
|||
'account_financial_report.account_financial_report_widget' |
|||
); |
|||
|
|||
|
|||
var report_backend = Widget.extend(ControlPanelMixin, { |
|||
// Stores all the parameters of the action.
|
|||
events: { |
|||
'click .o_account_financial_reports_print': 'print', |
|||
'click .o_account_financial_reports_export': 'export', |
|||
}, |
|||
init: function (parent, action) { |
|||
this.actionManager = parent; |
|||
this.given_context = {}; |
|||
this.odoo_context = action.context; |
|||
this.controller_url = action.context.url; |
|||
if (action.context.context) { |
|||
this.given_context = action.context.context; |
|||
} |
|||
this.given_context.active_id = action.context.active_id || |
|||
action.params.active_id; |
|||
this.given_context.model = action.context.active_model || false; |
|||
this.given_context.ttype = action.context.ttype || false; |
|||
return this._super.apply(this, arguments); |
|||
}, |
|||
willStart: function () { |
|||
return $.when(this.get_html()); |
|||
}, |
|||
set_html: function () { |
|||
var self = this; |
|||
var def = $.when(); |
|||
if (!this.report_widget) { |
|||
this.report_widget = new ReportWidget(this, this.given_context); |
|||
def = this.report_widget.appendTo(this.$el); |
|||
} |
|||
def.then(function () { |
|||
self.report_widget.$el.html(self.html); |
|||
}); |
|||
}, |
|||
start: function () { |
|||
this.set_html(); |
|||
return this._super(); |
|||
}, |
|||
// Fetches the html and is previous report.context if any,
|
|||
// else create it
|
|||
get_html: function () { |
|||
var self = this; |
|||
var defs = []; |
|||
return this._rpc({ |
|||
model: this.given_context.model, |
|||
method: 'get_html', |
|||
args: [self.given_context], |
|||
context: self.odoo_context, |
|||
}) |
|||
.then(function (result) { |
|||
self.html = result.html; |
|||
defs.push(self.update_cp()); |
|||
return $.when.apply($, defs); |
|||
}); |
|||
}, |
|||
// Updates the control panel and render the elements that have yet
|
|||
// to be rendered
|
|||
update_cp: function () { |
|||
if (this.$buttons) { |
|||
var status = { |
|||
breadcrumbs: this.actionManager.get_breadcrumbs(), |
|||
cp_content: {$buttons: this.$buttons}, |
|||
}; |
|||
return this.update_control_panel(status); |
|||
} |
|||
}, |
|||
do_show: function () { |
|||
this._super(); |
|||
this.update_cp(); |
|||
}, |
|||
print: function () { |
|||
var self = this; |
|||
this._rpc({ |
|||
model: this.given_context.model, |
|||
method: 'print_report', |
|||
args: [this.given_context.active_id, 'qweb-pdf'], |
|||
context: self.odoo_context, |
|||
}).then(function (result) { |
|||
self.do_action(result); |
|||
}); |
|||
}, |
|||
export: function () { |
|||
var self = this; |
|||
this._rpc({ |
|||
model: this.given_context.model, |
|||
method: 'print_report', |
|||
args: [this.given_context.active_id, 'xlsx'], |
|||
context: self.odoo_context, |
|||
}).then(function (result) { |
|||
self.do_action(result); |
|||
}); |
|||
}, |
|||
canBeRemoved: function () { |
|||
return $.when(); |
|||
}, |
|||
on_attach_callback: function () { |
|||
this.isInDOM = true; |
|||
}, |
|||
on_detach_callback: function () { |
|||
this.isInDOM = false; |
|||
}, |
|||
}); |
|||
|
|||
core.action_registry.add( |
|||
"account_financial_report_backend", |
|||
report_backend |
|||
); |
|||
return report_backend; |
|||
}); |
@ -0,0 +1,86 @@ |
|||
odoo.define('account_financial_report.account_financial_report_widget', function |
|||
(require) { |
|||
'use strict'; |
|||
|
|||
var Widget = require('web.Widget'); |
|||
|
|||
|
|||
var accountFinancialReportWidget = Widget.extend({ |
|||
events: { |
|||
'click .o_account_financial_reports_web_action': |
|||
'boundLink', |
|||
'click .o_account_financial_reports_web_action_multi': |
|||
'boundLinkmulti', |
|||
'click .o_account_financial_reports_web_action_monetary': |
|||
'boundLinkMonetary', |
|||
'click .o_account_financial_reports_web_action_monetary_multi': |
|||
'boundLinkMonetarymulti', |
|||
}, |
|||
init: function () { |
|||
this._super.apply(this, arguments); |
|||
}, |
|||
start: function () { |
|||
return this._super.apply(this, arguments); |
|||
}, |
|||
boundLink: function (e) { |
|||
var res_model = $(e.target).data('res-model'); |
|||
var res_id = $(e.target).data('active-id'); |
|||
return this.do_action({ |
|||
type: 'ir.actions.act_window', |
|||
res_model: res_model, |
|||
res_id: res_id, |
|||
views: [[false, 'form']], |
|||
target: 'current', |
|||
}); |
|||
}, |
|||
boundLinkmulti: function (e) { |
|||
var res_model = $(e.target).data('res-model'); |
|||
var domain = $(e.target).data('domain'); |
|||
if (!res_model) { |
|||
res_model = $(e.target.parentElement).data('res-model'); |
|||
} |
|||
if (!domain) { |
|||
domain = $(e.target.parentElement).data('domain'); |
|||
} |
|||
return this.do_action({ |
|||
type: 'ir.actions.act_window', |
|||
name: this._toTitleCase(res_model.split('.').join(' ')), |
|||
res_model: res_model, |
|||
domain: domain, |
|||
views: [[false, "list"], [false, "form"]], |
|||
target: 'current', |
|||
}); |
|||
}, |
|||
boundLinkMonetary: function (e) { |
|||
var res_model = $(e.target.parentElement).data('res-model'); |
|||
var res_id = $(e.target.parentElement).data('active-id'); |
|||
return this.do_action({ |
|||
type: 'ir.actions.act_window', |
|||
res_model: res_model, |
|||
res_id: res_id, |
|||
views: [[false, 'form']], |
|||
target: 'current', |
|||
}); |
|||
}, |
|||
boundLinkMonetarymulti: function (e) { |
|||
var res_model = $(e.target.parentElement).data('res-model'); |
|||
var domain = $(e.target.parentElement).data('domain'); |
|||
return this.do_action({ |
|||
type: 'ir.actions.act_window', |
|||
res_model: res_model, |
|||
domain: domain, |
|||
views: [[false, "list"], [false, "form"]], |
|||
target: 'current', |
|||
}); |
|||
}, |
|||
_toTitleCase: function (str) { |
|||
return str.replace(/\w\S*/g, function (txt) { |
|||
return txt.charAt(0).toUpperCase() + |
|||
txt.substr(1).toLowerCase(); |
|||
}); |
|||
}, |
|||
}); |
|||
|
|||
return accountFinancialReportWidget; |
|||
|
|||
}); |
@ -1,35 +0,0 @@ |
|||
odoo.define("account_financial_report.ReportActionManager", function(require) { |
|||
"use strict"; |
|||
|
|||
const ActionManager = require("web.ActionManager"); |
|||
require("web.ReportActionManager"); |
|||
|
|||
ActionManager.include({ |
|||
/** |
|||
* @override |
|||
*/ |
|||
_executeReportClientAction: function(action, options) { |
|||
const MODULE_NAME = "account_financial_report"; |
|||
|
|||
// When 'report_action' is called from the backend, Odoo hardcodes the action tag.
|
|||
// We have to make a hack to use our own report controller.
|
|||
if (action.report_file.startsWith(`${MODULE_NAME}.`)) { |
|||
const urls = this._makeReportUrls(action); |
|||
const clientActionOptions = _.extend({}, options, { |
|||
context: action.context, |
|||
data: action.data, |
|||
display_name: action.display_name, |
|||
name: action.name, |
|||
report_file: action.report_file, |
|||
report_name: action.report_name, |
|||
report_url: urls.html, |
|||
}); |
|||
return this.doAction( |
|||
"account_financial_report.client_action", |
|||
clientActionOptions |
|||
); |
|||
} |
|||
return this._super.apply(this, arguments); |
|||
}, |
|||
}); |
|||
}); |
@ -1,51 +0,0 @@ |
|||
odoo.define("account_financial_report.client_action", function(require) { |
|||
"use strict"; |
|||
|
|||
var ReportAction = require("report.client_action"); |
|||
var core = require("web.core"); |
|||
|
|||
var QWeb = core.qweb; |
|||
|
|||
const AFRReportAction = ReportAction.extend({ |
|||
start: function() { |
|||
return this._super.apply(this, arguments).then(() => { |
|||
this.$buttons = $( |
|||
QWeb.render( |
|||
"account_financial_report.client_action.ControlButtons", |
|||
{} |
|||
) |
|||
); |
|||
this.$buttons.on("click", ".o_report_print", this.on_click_print); |
|||
this.$buttons.on("click", ".o_report_export", this.on_click_export); |
|||
|
|||
this._update_control_panel(); |
|||
}); |
|||
}, |
|||
|
|||
on_click_export: function() { |
|||
const action = { |
|||
type: "ir.actions.report", |
|||
report_type: "xlsx", |
|||
report_name: this._get_xlsx_name(this.report_name), |
|||
report_file: this._get_xlsx_name(this.report_file), |
|||
data: this.data, |
|||
context: this.context, |
|||
display_name: this.title, |
|||
}; |
|||
return this.do_action(action); |
|||
}, |
|||
|
|||
/** |
|||
* @param {String} str |
|||
* @returns {String} |
|||
*/ |
|||
_get_xlsx_name: function(str) { |
|||
const parts = str.split("."); |
|||
return `a_f_r.report_${parts[parts.length - 1]}_xlsx`; |
|||
}, |
|||
}); |
|||
|
|||
core.action_registry.add("account_financial_report.client_action", AFRReportAction); |
|||
|
|||
return AFRReportAction; |
|||
}); |
@ -1,58 +0,0 @@ |
|||
odoo.define("account_financial_report.report", function(require) { |
|||
"use strict"; |
|||
|
|||
require("web.dom_ready"); |
|||
const utils = require("report.utils"); |
|||
|
|||
if (window.self === window.top) { |
|||
return; |
|||
} |
|||
|
|||
const web_base_url = $("html").attr("web-base-url"); |
|||
const trusted_host = utils.get_host_from_url(web_base_url); |
|||
const trusted_protocol = utils.get_protocol_from_url(web_base_url); |
|||
const trusted_origin = utils.build_origin(trusted_protocol, trusted_host); |
|||
|
|||
/** |
|||
* Convert a model name to a capitalized title style |
|||
* Example: account.mode.line --> Account Move Line |
|||
* |
|||
* @param {String} str |
|||
* @returns {String} |
|||
*/ |
|||
function toTitleCase(str) { |
|||
return str |
|||
.replaceAll(".", " ") |
|||
.replace( |
|||
/\w\S*/g, |
|||
txt => `${txt.charAt(0).toUpperCase()}${txt.substr(1).toLowerCase()}` |
|||
); |
|||
} |
|||
|
|||
// Allow sending commands to the webclient
|
|||
// `do_action` command with domain
|
|||
$("[res-model][domain]") |
|||
.wrap("<a/>") |
|||
.attr("href", "#") |
|||
.on("click", function(ev) { |
|||
ev.preventDefault(); |
|||
const res_model = $(this).attr("res-model"); |
|||
const action = { |
|||
type: "ir.actions.act_window", |
|||
res_model: res_model, |
|||
domain: $(this).attr("domain"), |
|||
name: toTitleCase(res_model), |
|||
views: [ |
|||
[false, "list"], |
|||
[false, "form"], |
|||
], |
|||
}; |
|||
window.parent.postMessage( |
|||
{ |
|||
message: "report:do_action", |
|||
action: action, |
|||
}, |
|||
trusted_origin |
|||
); |
|||
}); |
|||
}); |
@ -1,17 +0,0 @@ |
|||
<template> |
|||
<!-- Buttons of the Control Panel --> |
|||
<t t-name="account_financial_report.client_action.ControlButtons"> |
|||
<div class="o_report_buttons"> |
|||
<button |
|||
type="button" |
|||
class="btn btn-primary o_report_print" |
|||
title="Print" |
|||
>Print</button> |
|||
<button |
|||
type="button" |
|||
class="btn btn-secondary o_report_export" |
|||
title="Export" |
|||
>Export</button> |
|||
</div> |
|||
</t> |
|||
</template> |
@ -0,0 +1,399 @@ |
|||
# Author: Julien Coux |
|||
# Copyright 2016 Camptocamp SA |
|||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). |
|||
|
|||
import logging |
|||
|
|||
from odoo.tests import common |
|||
from odoo.tools import test_reports |
|||
|
|||
_logger = logging.getLogger(__name__) |
|||
|
|||
|
|||
class AbstractTest(common.TransactionCase): |
|||
"""Common technical tests for all reports.""" |
|||
at_install = False |
|||
post_install = True |
|||
|
|||
accounts = {} |
|||
|
|||
def with_context(self, *args, **kwargs): |
|||
context = dict(args[0] if args else self.env.context, **kwargs) |
|||
self.env = self.env(context=context) |
|||
return self |
|||
|
|||
def _chart_template_create(self): |
|||
transfer_account_id = self.env['account.account.template'].create({ |
|||
'code': '000', |
|||
'name': 'Liquidity Transfers', |
|||
'reconcile': True, |
|||
'user_type_id': self.ref( |
|||
"account.data_account_type_current_assets"), |
|||
}) |
|||
self.chart = self.env['account.chart.template'].create({ |
|||
'name': 'Test COA', |
|||
'code_digits': 4, |
|||
'bank_account_code_prefix': 1014, |
|||
'cash_account_code_prefix': 1014, |
|||
'currency_id': self.ref('base.USD'), |
|||
'transfer_account_code_prefix': '000', |
|||
}) |
|||
transfer_account_id.update({ |
|||
'chart_template_id': self.chart.id, |
|||
}) |
|||
self.env['ir.model.data'].create({ |
|||
'res_id': transfer_account_id.id, |
|||
'model': transfer_account_id._name, |
|||
'name': 'Liquidity Transfers', |
|||
}) |
|||
act = self.env['account.account.template'].create({ |
|||
'code': '001', |
|||
'name': 'Expenses', |
|||
'user_type_id': self.ref("account.data_account_type_expenses"), |
|||
'chart_template_id': self.chart.id, |
|||
'reconcile': True, |
|||
}) |
|||
self.env['ir.model.data'].create({ |
|||
'res_id': act.id, |
|||
'model': act._name, |
|||
'name': 'expenses', |
|||
}) |
|||
act = self.env['account.account.template'].create({ |
|||
'code': '002', |
|||
'name': 'Product Sales', |
|||
'user_type_id': self.ref("account.data_account_type_revenue"), |
|||
'chart_template_id': self.chart.id, |
|||
'reconcile': True, |
|||
}) |
|||
self.env['ir.model.data'].create({ |
|||
'res_id': act.id, |
|||
'model': act._name, |
|||
'name': 'sales', |
|||
}) |
|||
act = self.env['account.account.template'].create({ |
|||
'code': '003', |
|||
'name': 'Account Receivable', |
|||
'user_type_id': self.ref("account.data_account_type_receivable"), |
|||
'chart_template_id': self.chart.id, |
|||
'reconcile': True, |
|||
}) |
|||
self.env['ir.model.data'].create({ |
|||
'res_id': act.id, |
|||
'model': act._name, |
|||
'name': 'receivable', |
|||
}) |
|||
act = self.env['account.account.template'].create({ |
|||
'code': '004', |
|||
'name': 'Account Payable', |
|||
'user_type_id': self.ref("account.data_account_type_payable"), |
|||
'chart_template_id': self.chart.id, |
|||
'reconcile': True, |
|||
}) |
|||
self.env['ir.model.data'].create({ |
|||
'res_id': act.id, |
|||
'model': act._name, |
|||
'name': 'payable', |
|||
}) |
|||
|
|||
def _add_chart_of_accounts(self): |
|||
self.company = self.env['res.company'].create({ |
|||
'name': 'Spanish test company', |
|||
}) |
|||
self.env.ref('base.group_multi_company').write({ |
|||
'users': [(4, self.env.uid)], |
|||
}) |
|||
self.env.user.write({ |
|||
'company_ids': [(4, self.company.id)], |
|||
'company_id': self.company.id, |
|||
}) |
|||
self.with_context( |
|||
company_id=self.company.id, force_company=self.company.id) |
|||
self.chart.try_loading_for_current_company() |
|||
self.revenue = self.env['account.account'].search( |
|||
[('user_type_id', '=', self.ref( |
|||
"account.data_account_type_revenue"))], limit=1) |
|||
self.expense = self.env['account.account'].search( |
|||
[('user_type_id', '=', self.ref( |
|||
"account.data_account_type_expenses"))], limit=1) |
|||
self.receivable = self.env['account.account'].search( |
|||
[('user_type_id', '=', self.ref( |
|||
"account.data_account_type_receivable"))], limit=1) |
|||
self.payable = self.env['account.account'].search( |
|||
[('user_type_id', '=', self.ref( |
|||
"account.data_account_type_payable"))], limit=1) |
|||
return True |
|||
|
|||
def _journals_create(self): |
|||
self.journal_sale = self.env['account.journal'].create({ |
|||
'company_id': self.company.id, |
|||
'name': 'Test journal for sale', |
|||
'type': 'sale', |
|||
'code': 'TSALE', |
|||
'default_debit_account_id': self.revenue.id, |
|||
'default_credit_account_id': self.revenue.id, |
|||
}) |
|||
self.journal_purchase = self.env['account.journal'].create({ |
|||
'company_id': self.company.id, |
|||
'name': 'Test journal for purchase', |
|||
'type': 'purchase', |
|||
'code': 'TPUR', |
|||
'default_debit_account_id': self.expense.id, |
|||
'default_credit_account_id': self.expense.id, |
|||
}) |
|||
return True |
|||
|
|||
def _invoice_create(self): |
|||
self.partner = self.env['res.partner'].create({ |
|||
'name': 'Test partner', |
|||
'company_id': self.company.id, |
|||
'property_account_receivable_id': self.receivable.id, |
|||
'property_account_payable_id': self.payable.id, |
|||
}) |
|||
|
|||
# customer invoice |
|||
customer_invoice_lines = [(0, False, { |
|||
'name': 'Test description #1', |
|||
'account_id': self.revenue.id, |
|||
'quantity': 1.0, |
|||
'price_unit': 100.0, |
|||
}), (0, False, { |
|||
'name': 'Test description #2', |
|||
'account_id': self.revenue.id, |
|||
'quantity': 2.0, |
|||
'price_unit': 25.0, |
|||
})] |
|||
self.invoice_out = self.env['account.invoice'].create({ |
|||
'partner_id': self.partner.id, |
|||
'type': 'out_invoice', |
|||
'invoice_line_ids': customer_invoice_lines, |
|||
'account_id': self.partner.property_account_receivable_id.id, |
|||
'journal_id': self.journal_sale.id, |
|||
}) |
|||
self.invoice_out.action_invoice_open() |
|||
|
|||
# vendor bill |
|||
vendor_invoice_lines = [(0, False, { |
|||
'name': 'Test description #1', |
|||
'account_id': self.revenue.id, |
|||
'quantity': 1.0, |
|||
'price_unit': 100.0, |
|||
}), (0, False, { |
|||
'name': 'Test description #2', |
|||
'account_id': self.revenue.id, |
|||
'quantity': 2.0, |
|||
'price_unit': 25.0, |
|||
})] |
|||
self.invoice_in = self.env['account.invoice'].create({ |
|||
'partner_id': self.partner.id, |
|||
'type': 'in_invoice', |
|||
'invoice_line_ids': vendor_invoice_lines, |
|||
'account_id': self.partner.property_account_payable_id.id, |
|||
'journal_id': self.journal_purchase.id, |
|||
}) |
|||
self.invoice_in.action_invoice_open() |
|||
|
|||
def setUp(self): |
|||
super(AbstractTest, self).setUp() |
|||
|
|||
self.with_context() |
|||
self._chart_template_create() |
|||
self._add_chart_of_accounts() |
|||
self._journals_create() |
|||
self._invoice_create() |
|||
|
|||
self.model = self._getReportModel() |
|||
|
|||
self.qweb_report_name = self._getQwebReportName() |
|||
self.xlsx_report_name = self._getXlsxReportName() |
|||
self.xlsx_action_name = self._getXlsxReportActionName() |
|||
|
|||
self.report_title = self._getReportTitle() |
|||
|
|||
self.base_filters = self._getBaseFilters() |
|||
self.additional_filters = self._getAdditionalFiltersToBeTested() |
|||
|
|||
self.report = self.model.create(self.base_filters) |
|||
self.report.compute_data_for_report() |
|||
|
|||
def test_html(self): |
|||
test_reports.try_report(self.env.cr, self.env.uid, |
|||
self.qweb_report_name, |
|||
[self.report.id], |
|||
report_type='qweb-html') |
|||
|
|||
def test_qweb(self): |
|||
test_reports.try_report(self.env.cr, self.env.uid, |
|||
self.qweb_report_name, |
|||
[self.report.id], |
|||
report_type='qweb-pdf') |
|||
|
|||
def test_xlsx(self): |
|||
test_reports.try_report(self.env.cr, self.env.uid, |
|||
self.xlsx_report_name, |
|||
[self.report.id], |
|||
report_type='xlsx') |
|||
|
|||
def test_print(self): |
|||
self.report.print_report('qweb') |
|||
self.report.print_report('xlsx') |
|||
|
|||
def test_02_generation_report_html(self): |
|||
"""Check if report HTML is correctly generated""" |
|||
|
|||
# Check if returned report action is correct |
|||
report_type = 'qweb-html' |
|||
report_action = self.report.print_report(report_type) |
|||
self.assertDictContainsSubset( |
|||
{ |
|||
'type': 'ir.actions.report', |
|||
'report_name': self.qweb_report_name, |
|||
'report_type': 'qweb-html', |
|||
}, |
|||
report_action |
|||
) |
|||
|
|||
# Check if report template is correct |
|||
report = self.env['ir.actions.report'].search( |
|||
[('report_name', '=', self.qweb_report_name), |
|||
('report_type', '=', report_type)], limit=1) |
|||
self.assertEqual(report.report_type, 'qweb-html') |
|||
|
|||
rep = report.render(self.report.ids, {}) |
|||
|
|||
self.assertTrue(self.report_title.encode('utf8') in rep[0]) |
|||
self.assertTrue( |
|||
self.report.account_ids[0].name.encode('utf8') in rep[0] |
|||
) |
|||
|
|||
def test_04_compute_data(self): |
|||
"""Check that the SQL queries work with all filters options""" |
|||
|
|||
for filters in [{}] + self.additional_filters: |
|||
current_filter = self.base_filters.copy() |
|||
current_filter.update(filters) |
|||
|
|||
report = self.model.create(current_filter) |
|||
report.compute_data_for_report() |
|||
|
|||
self.assertGreaterEqual(len(report.account_ids), 1) |
|||
|
|||
# Same filters with only one account |
|||
current_filter = self.base_filters.copy() |
|||
current_filter.update(filters) |
|||
report_accounts = report.account_ids.filtered('account_id') |
|||
current_filter.update({ |
|||
'filter_account_ids': |
|||
[(6, 0, report_accounts[0].account_id.ids)], |
|||
}) |
|||
|
|||
report2 = self.model.create(current_filter) |
|||
report2.compute_data_for_report() |
|||
|
|||
self.assertEqual(len(report2.account_ids), 1) |
|||
self.assertEqual(report2.account_ids.name, |
|||
report_accounts[0].name) |
|||
|
|||
if self._partner_test_is_possible(filters): |
|||
# Same filters with only one partner |
|||
report_partner_ids = report.account_ids.mapped('partner_ids') |
|||
partner_ids = report_partner_ids.mapped('partner_id') |
|||
|
|||
current_filter = self.base_filters.copy() |
|||
current_filter.update(filters) |
|||
current_filter.update({ |
|||
'filter_partner_ids': [(6, 0, partner_ids[0].ids)], |
|||
}) |
|||
|
|||
report3 = self.model.create(current_filter) |
|||
report3.compute_data_for_report() |
|||
|
|||
self.assertGreaterEqual(len(report3.account_ids), 1) |
|||
|
|||
report_partner_ids3 = report3.account_ids.mapped('partner_ids') |
|||
partner_ids3 = report_partner_ids3.mapped('partner_id') |
|||
|
|||
self.assertEqual(len(partner_ids3), 1) |
|||
self.assertEqual( |
|||
partner_ids3.name, |
|||
partner_ids[0].name |
|||
) |
|||
|
|||
# Same filters with only one partner and one account |
|||
report_partner_ids = report3.account_ids.mapped('partner_ids') |
|||
report_account_id = report_partner_ids.filtered( |
|||
lambda p: p.partner_id |
|||
)[0].report_account_id |
|||
|
|||
current_filter = self.base_filters.copy() |
|||
current_filter.update(filters) |
|||
current_filter.update({ |
|||
'filter_account_ids': |
|||
[(6, 0, report_account_id.account_id.ids)], |
|||
'filter_partner_ids': [(6, 0, partner_ids[0].ids)], |
|||
}) |
|||
|
|||
report4 = self.model.create(current_filter) |
|||
report4.compute_data_for_report() |
|||
|
|||
self.assertEqual(len(report4.account_ids), 1) |
|||
self.assertEqual(report4.account_ids.name, |
|||
report_account_id.account_id.name) |
|||
|
|||
report_partner_ids4 = report4.account_ids.mapped('partner_ids') |
|||
partner_ids4 = report_partner_ids4.mapped('partner_id') |
|||
|
|||
self.assertEqual(len(partner_ids4), 1) |
|||
self.assertEqual( |
|||
partner_ids4.name, |
|||
partner_ids[0].name |
|||
) |
|||
|
|||
def _partner_test_is_possible(self, filters): |
|||
""" |
|||
:return: |
|||
a boolean to indicate if partner test is possible |
|||
with current filters |
|||
""" |
|||
return True |
|||
|
|||
def _getReportModel(self): |
|||
""" |
|||
:return: the report model name |
|||
""" |
|||
raise NotImplementedError() |
|||
|
|||
def _getQwebReportName(self): |
|||
""" |
|||
:return: the qweb report name |
|||
""" |
|||
raise NotImplementedError() |
|||
|
|||
def _getXlsxReportName(self): |
|||
""" |
|||
:return: the xlsx report name |
|||
""" |
|||
raise NotImplementedError() |
|||
|
|||
def _getXlsxReportActionName(self): |
|||
""" |
|||
:return: the xlsx report action name |
|||
""" |
|||
raise NotImplementedError() |
|||
|
|||
def _getReportTitle(self): |
|||
""" |
|||
:return: the report title displayed into the report |
|||
""" |
|||
raise NotImplementedError() |
|||
|
|||
def _getBaseFilters(self): |
|||
""" |
|||
:return: the minimum required filters to generate report |
|||
""" |
|||
raise NotImplementedError() |
|||
|
|||
def _getAdditionalFiltersToBeTested(self): |
|||
""" |
|||
:return: the additional filters to generate report variants |
|||
""" |
|||
raise NotImplementedError() |
@ -0,0 +1,78 @@ |
|||
# Copyright 2018 Forest and Biomass Romania |
|||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). |
|||
|
|||
import logging |
|||
from . import abstract_test |
|||
|
|||
_logger = logging.getLogger(__name__) |
|||
|
|||
|
|||
class AbstractTestForeignCurrency(abstract_test.AbstractTest): |
|||
"""Common technical tests for all reports.""" |
|||
|
|||
def _chart_template_create(self): |
|||
super(AbstractTestForeignCurrency, self)._chart_template_create() |
|||
# Account for foreign payments |
|||
self.account_type_other = self.env['account.account.type'].create( |
|||
{'name': 'foreign expenses', |
|||
'type': 'other', |
|||
}) |
|||
act = self.env['account.account.template'].create({ |
|||
'code': '0012', |
|||
'name': 'Foreign Expenses', |
|||
'user_type_id': self.account_type_other.id, |
|||
'chart_template_id': self.chart.id, |
|||
'currency_id': self.env.ref('base.EUR').id, |
|||
}) |
|||
self.env['ir.model.data'].create({ |
|||
'res_id': act.id, |
|||
'model': act._name, |
|||
'name': 'foreign expenses', |
|||
}) |
|||
return True |
|||
|
|||
def _add_chart_of_accounts(self): |
|||
super(AbstractTestForeignCurrency, self)._add_chart_of_accounts() |
|||
self.foreign_expense = self.env['account.account'].search( |
|||
[('currency_id', '=', self.env.ref('base.EUR').id)], limit=1) |
|||
self.foreign_currency_id = self.foreign_expense.currency_id |
|||
return True |
|||
|
|||
def _journals_create(self): |
|||
super(AbstractTestForeignCurrency, self)._journals_create() |
|||
self.journal_foreign_purchases = self.env['account.journal'].create({ |
|||
'company_id': self.company.id, |
|||
'name': 'Test journal for purchase', |
|||
'type': 'purchase', |
|||
'code': 'TFORPUR', |
|||
'default_debit_account_id': self.foreign_expense.id, |
|||
'default_credit_account_id': self.foreign_expense.id, |
|||
'currency_id': self.foreign_currency_id.id, |
|||
}) |
|||
return True |
|||
|
|||
def _invoice_create(self): |
|||
super(AbstractTestForeignCurrency, self)._invoice_create() |
|||
# vendor bill foreign currency |
|||
foreign_vendor_invoice_lines = [(0, False, { |
|||
'name': 'Test description #1', |
|||
'account_id': self.revenue.id, |
|||
'quantity': 1.0, |
|||
'price_unit': 100.0, |
|||
'currency_id': self.foreign_currency_id.id, |
|||
}), (0, False, { |
|||
'name': 'Test description #2', |
|||
'account_id': self.revenue.id, |
|||
'quantity': 2.0, |
|||
'price_unit': 25.0, |
|||
'currency_id': self.foreign_currency_id.id, |
|||
})] |
|||
self.foreign_invoice_in = self.env['account.invoice'].create({ |
|||
'partner_id': self.partner.id, |
|||
'type': 'in_invoice', |
|||
'invoice_line_ids': foreign_vendor_invoice_lines, |
|||
'account_id': self.partner.property_account_payable_id.id, |
|||
'journal_id': self.journal_foreign_purchases.id, |
|||
}) |
|||
self.foreign_invoice_in.action_invoice_open() |
|||
return True |
@ -0,0 +1,75 @@ |
|||
# Copyright 2018 Forest and Biomass Romania |
|||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). |
|||
|
|||
import logging |
|||
from odoo.tests.common import TransactionCase |
|||
from odoo.tools import test_reports |
|||
|
|||
_logger = logging.getLogger(__name__) |
|||
|
|||
|
|||
class AbstractTest(TransactionCase): |
|||
"""Common technical tests for all reports.""" |
|||
|
|||
def setUp(cls): |
|||
super(AbstractTest, cls).setUp() |
|||
|
|||
cls.model = cls._getReportModel() |
|||
|
|||
cls.qweb_report_name = cls._getQwebReportName() |
|||
cls.xlsx_report_name = cls._getXlsxReportName() |
|||
cls.xlsx_action_name = cls._getXlsxReportActionName() |
|||
|
|||
cls.report_title = cls._getReportTitle() |
|||
|
|||
cls.base_filters = cls._getBaseFilters() |
|||
|
|||
cls.report = cls.model.create(cls.base_filters) |
|||
cls.report.compute_data_for_report() |
|||
|
|||
def test_html(self): |
|||
test_reports.try_report(self.env.cr, self.env.uid, |
|||
self.qweb_report_name, |
|||
[self.report.id], |
|||
report_type='qweb-html') |
|||
|
|||
def test_qweb(self): |
|||
test_reports.try_report(self.env.cr, self.env.uid, |
|||
self.qweb_report_name, |
|||
[self.report.id], |
|||
report_type='qweb-pdf') |
|||
|
|||
def test_xlsx(self): |
|||
test_reports.try_report(self.env.cr, self.env.uid, |
|||
self.xlsx_report_name, |
|||
[self.report.id], |
|||
report_type='xlsx') |
|||
|
|||
def test_print(self): |
|||
self.report.print_report('qweb') |
|||
self.report.print_report('xlsx') |
|||
|
|||
def test_generation_report_html(self): |
|||
"""Check if report HTML is correctly generated""" |
|||
|
|||
# Check if returned report action is correct |
|||
report_type = 'qweb-html' |
|||
report_action = self.report.print_report(report_type) |
|||
self.assertDictContainsSubset( |
|||
{ |
|||
'type': 'ir.actions.report', |
|||
'report_name': self.qweb_report_name, |
|||
'report_type': 'qweb-html', |
|||
}, |
|||
report_action |
|||
) |
|||
|
|||
# Check if report template is correct |
|||
report = self.env['ir.actions.report'].search( |
|||
[('report_name', '=', self.qweb_report_name), |
|||
('report_type', '=', report_type)], limit=1) |
|||
self.assertEqual(report.report_type, 'qweb-html') |
|||
|
|||
rep = report.render(self.report.ids, {}) |
|||
|
|||
self.assertTrue(self.report_title.encode('utf8') in rep[0]) |
@ -0,0 +1,41 @@ |
|||
# Author: Julien Coux |
|||
# Copyright 2016 Camptocamp SA |
|||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). |
|||
|
|||
from datetime import date |
|||
from . import abstract_test |
|||
|
|||
|
|||
class TestAgedPartnerBalance(abstract_test.AbstractTest): |
|||
""" |
|||
Technical tests for Aged Partner Balance Report. |
|||
""" |
|||
|
|||
def _getReportModel(self): |
|||
return self.env['report_aged_partner_balance'] |
|||
|
|||
def _getQwebReportName(self): |
|||
return 'account_financial_report.report_aged_partner_balance_qweb' |
|||
|
|||
def _getXlsxReportName(self): |
|||
return 'a_f_r.report_aged_partner_balance_xlsx' |
|||
|
|||
def _getXlsxReportActionName(self): |
|||
return 'account_financial_report.' \ |
|||
'action_report_aged_partner_balance_xlsx' |
|||
|
|||
def _getReportTitle(self): |
|||
return 'Odoo' |
|||
|
|||
def _getBaseFilters(self): |
|||
return { |
|||
'date_at': date(date.today().year, 12, 31), |
|||
'company_id': self.company.id, |
|||
} |
|||
|
|||
def _getAdditionalFiltersToBeTested(self): |
|||
return [ |
|||
{'only_posted_moves': True}, |
|||
{'show_move_line_details': True}, |
|||
{'only_posted_moves': True, 'show_move_line_details': True}, |
|||
] |
835
account_financial_report/tests/test_general_ledger.py
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -1,340 +1,364 @@ |
|||
# Copyright 2017 ACSONE SA/NV |
|||
# Copyright 2019-20 ForgeFlow S.L. (https://www.forgeflow.com) |
|||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). |
|||
|
|||
from datetime import datetime |
|||
|
|||
from datetime import datetime, date |
|||
from dateutil.relativedelta import relativedelta |
|||
|
|||
from odoo.fields import Date |
|||
from odoo.tests.common import Form, TransactionCase |
|||
from odoo.tests.common import TransactionCase |
|||
|
|||
from . import abstract_test_foreign_currency as a_t_f_c |
|||
|
|||
class TestJournalReport(TransactionCase): |
|||
def setUp(self): |
|||
super(TestJournalReport, self).setUp() |
|||
self.AccountObj = self.env["account.account"] |
|||
self.InvoiceObj = self.env["account.move"] |
|||
self.JournalObj = self.env["account.journal"] |
|||
self.MoveObj = self.env["account.move"] |
|||
self.TaxObj = self.env["account.tax"] |
|||
|
|||
self.JournalLedgerReportWizard = self.env["journal.ledger.report.wizard"] |
|||
self.JournalLedgerReport = self.env[ |
|||
"report.account_financial_report.journal_ledger" |
|||
] |
|||
self.company = self.env.ref("base.main_company") |
|||
self.company.account_sale_tax_id = False |
|||
self.company.account_purchase_tax_id = False |
|||
|
|||
today = datetime.today() |
|||
last_year = today - relativedelta(years=1) |
|||
class TestJournalLedger(a_t_f_c.AbstractTestForeignCurrency): |
|||
""" |
|||
Technical tests for General Ledger Report. |
|||
""" |
|||
def _getReportModel(self): |
|||
return self.env['report_journal_ledger'] |
|||
|
|||
self.previous_fy_date_start = Date.to_string(last_year.replace(month=1, day=1)) |
|||
self.previous_fy_date_end = Date.to_string(last_year.replace(month=12, day=31)) |
|||
self.fy_date_start = Date.to_string(today.replace(month=1, day=1)) |
|||
self.fy_date_end = Date.to_string(today.replace(month=12, day=31)) |
|||
def _getQwebReportName(self): |
|||
return 'account_financial_report.report_journal_ledger_qweb' |
|||
|
|||
self.receivable_account = self.AccountObj.search( |
|||
[("user_type_id.name", "=", "Receivable")], limit=1 |
|||
) |
|||
self.income_account = self.AccountObj.search( |
|||
[("user_type_id.name", "=", "Income")], limit=1 |
|||
) |
|||
self.expense_account = self.AccountObj.search( |
|||
[("user_type_id.name", "=", "Expenses")], limit=1 |
|||
) |
|||
self.payable_account = self.AccountObj.search( |
|||
[("user_type_id.name", "=", "Payable")], limit=1 |
|||
) |
|||
def _getXlsxReportName(self): |
|||
return 'a_f_r.report_journal_ledger_xlsx' |
|||
|
|||
self.journal_sale = self.JournalObj.create( |
|||
{ |
|||
"name": "Test journal sale", |
|||
"code": "TST-JRNL-S", |
|||
"type": "sale", |
|||
"company_id": self.company.id, |
|||
} |
|||
) |
|||
self.journal_purchase = self.JournalObj.create( |
|||
{ |
|||
"name": "Test journal purchase", |
|||
"code": "TST-JRNL-P", |
|||
"type": "purchase", |
|||
"company_id": self.company.id, |
|||
} |
|||
) |
|||
def _getXlsxReportActionName(self): |
|||
return 'account_financial_report.' \ |
|||
'action_report_journal_ledger_xlsx' |
|||
|
|||
self.tax_15_s = self.TaxObj.create( |
|||
{ |
|||
"sequence": 30, |
|||
"name": "Tax 15.0% (Percentage of Price)", |
|||
"amount": 15.0, |
|||
"amount_type": "percent", |
|||
"include_base_amount": False, |
|||
"type_tax_use": "sale", |
|||
} |
|||
) |
|||
def _getReportTitle(self): |
|||
return 'Odoo' |
|||
|
|||
self.tax_20_s = self.TaxObj.create( |
|||
{ |
|||
"sequence": 30, |
|||
"name": "Tax 20.0% (Percentage of Price)", |
|||
"amount": 20.0, |
|||
"amount_type": "percent", |
|||
"include_base_amount": False, |
|||
"type_tax_use": "sale", |
|||
def _getBaseFilters(self): |
|||
return { |
|||
'date_from': date(date.today().year, 1, 1), |
|||
'date_to': date(date.today().year, 12, 31), |
|||
'company_id': self.company.id, |
|||
'journal_ids': [(6, 0, self.journal_sale.ids)] |
|||
} |
|||
) |
|||
|
|||
self.tax_15_p = self.TaxObj.create( |
|||
def _getAdditionalFiltersToBeTested(self): |
|||
return [ |
|||
{'move_target': "All", |
|||
'sort_option': "Date", |
|||
'group_option': "Journal", |
|||
'with_account_name': True, |
|||
'foreign_currency': True}, |
|||
] |
|||
|
|||
def test_02_generation_report_html(self): |
|||
"""Check if report HTML is correctly generated""" |
|||
|
|||
# Check if returned report action is correct |
|||
report_type = 'qweb-html' |
|||
report_action = self.report.print_report(report_type) |
|||
self.assertDictContainsSubset( |
|||
{ |
|||
"sequence": 30, |
|||
"name": "Tax 15.0% (Percentage of Price)", |
|||
"amount": 15.0, |
|||
"amount_type": "percent", |
|||
"include_base_amount": False, |
|||
"type_tax_use": "purchase", |
|||
} |
|||
'type': 'ir.actions.report', |
|||
'report_name': self.qweb_report_name, |
|||
'report_type': 'qweb-html', |
|||
}, |
|||
report_action |
|||
) |
|||
|
|||
self.tax_20_p = self.TaxObj.create( |
|||
{ |
|||
"sequence": 30, |
|||
"name": "Tax 20.0% (Percentage of Price)", |
|||
"amount": 20.0, |
|||
"amount_type": "percent", |
|||
"include_base_amount": False, |
|||
"type_tax_use": "purchase", |
|||
} |
|||
# Check if report template is correct |
|||
report = self.env['ir.actions.report'].search( |
|||
[('report_name', '=', self.qweb_report_name), |
|||
('report_type', '=', report_type)], limit=1) |
|||
self.assertEqual(report.report_type, 'qweb-html') |
|||
|
|||
rep = report.render(self.report.ids, {}) |
|||
|
|||
self.assertTrue(self.report_title.encode('utf8') in rep[0]) |
|||
self.assertTrue( |
|||
self.report.journal_ids[0].name.encode('utf8') in rep[0] |
|||
) |
|||
|
|||
self.partner_2 = self.env.ref("base.res_partner_2") |
|||
def test_04_compute_data(self): |
|||
return True |
|||
|
|||
|
|||
class TestJournalReport(TransactionCase): |
|||
|
|||
def setUp(self): |
|||
super(TestJournalReport, self).setUp() |
|||
self.AccountObj = self.env['account.account'] |
|||
self.InvoiceObj = self.env['account.invoice'] |
|||
self.JournalObj = self.env['account.journal'] |
|||
self.JournalReportObj = self.env['journal.ledger.report.wizard'] |
|||
self.MoveObj = self.env['account.move'] |
|||
self.ReportJournalLedger = self.env['report_journal_ledger'] |
|||
self.TaxObj = self.env['account.tax'] |
|||
|
|||
self.company = self.env.ref('base.main_company') |
|||
|
|||
today = datetime.today() |
|||
last_year = today - relativedelta(years=1) |
|||
|
|||
self.previous_fy_date_start = Date.to_string( |
|||
last_year.replace(month=1, day=1)) |
|||
self.previous_fy_date_end = Date.to_string( |
|||
last_year.replace(month=12, day=31)) |
|||
self.fy_date_start = Date.to_string( |
|||
today.replace(month=1, day=1)) |
|||
self.fy_date_end = Date.to_string( |
|||
today.replace(month=12, day=31)) |
|||
|
|||
self.receivable_account = self.AccountObj.search([ |
|||
('user_type_id.name', '=', 'Receivable') |
|||
], limit=1) |
|||
self.income_account = self.AccountObj.search([ |
|||
('user_type_id.name', '=', 'Income') |
|||
], limit=1) |
|||
self.payable_account = self.AccountObj.search([ |
|||
('user_type_id.name', '=', 'Payable') |
|||
], limit=1) |
|||
|
|||
self.journal_sale = self.JournalObj.create({ |
|||
'name': "Test journal sale", |
|||
'code': "TST-JRNL-S", |
|||
'type': 'sale', |
|||
'company_id': self.company.id, |
|||
}) |
|||
self.journal_purchase = self.JournalObj.create({ |
|||
'name': "Test journal purchase", |
|||
'code': "TST-JRNL-P", |
|||
'type': 'sale', |
|||
'company_id': self.company.id, |
|||
}) |
|||
|
|||
self.tax_15_s = self.TaxObj.create({ |
|||
'sequence': 30, |
|||
'name': 'Tax 15.0% (Percentage of Price)', |
|||
'amount': 15.0, |
|||
'amount_type': 'percent', |
|||
'include_base_amount': False, |
|||
'type_tax_use': 'sale', |
|||
}) |
|||
|
|||
self.tax_20_s = self.TaxObj.create({ |
|||
'sequence': 30, |
|||
'name': 'Tax 20.0% (Percentage of Price)', |
|||
'amount': 20.0, |
|||
'amount_type': 'percent', |
|||
'include_base_amount': False, |
|||
'type_tax_use': 'sale', |
|||
}) |
|||
|
|||
self.tax_15_p = self.TaxObj.create({ |
|||
'sequence': 30, |
|||
'name': 'Tax 15.0% (Percentage of Price)', |
|||
'amount': 15.0, |
|||
'amount_type': 'percent', |
|||
'include_base_amount': False, |
|||
'type_tax_use': 'purchase', |
|||
}) |
|||
|
|||
self.tax_20_p = self.TaxObj.create({ |
|||
'sequence': 30, |
|||
'name': 'Tax 20.0% (Percentage of Price)', |
|||
'amount': 20.0, |
|||
'amount_type': 'percent', |
|||
'include_base_amount': False, |
|||
'type_tax_use': 'purchase', |
|||
}) |
|||
|
|||
self.partner_2 = self.env.ref('base.res_partner_2') |
|||
|
|||
def _add_move( |
|||
self, |
|||
date, |
|||
journal, |
|||
receivable_debit, |
|||
receivable_credit, |
|||
income_debit, |
|||
income_credit, |
|||
): |
|||
move_name = "move name" |
|||
self, date, journal, |
|||
receivable_debit, receivable_credit, income_debit, income_credit): |
|||
move_name = 'move name' |
|||
move_vals = { |
|||
"journal_id": journal.id, |
|||
"date": date, |
|||
"line_ids": [ |
|||
( |
|||
0, |
|||
0, |
|||
{ |
|||
"name": move_name, |
|||
"debit": receivable_debit, |
|||
"credit": receivable_credit, |
|||
"account_id": self.receivable_account.id, |
|||
}, |
|||
), |
|||
( |
|||
0, |
|||
0, |
|||
{ |
|||
"name": move_name, |
|||
"debit": income_debit, |
|||
"credit": income_credit, |
|||
"account_id": self.income_account.id, |
|||
}, |
|||
), |
|||
], |
|||
'journal_id': journal.id, |
|||
'date': date, |
|||
'line_ids': [ |
|||
(0, 0, { |
|||
'name': move_name, |
|||
'debit': receivable_debit, |
|||
'credit': receivable_credit, |
|||
'account_id': self.receivable_account.id |
|||
}), |
|||
(0, 0, { |
|||
'name': move_name, |
|||
'debit': income_debit, |
|||
'credit': income_credit, |
|||
'account_id': self.income_account.id |
|||
}), |
|||
] |
|||
} |
|||
return self.MoveObj.create(move_vals) |
|||
|
|||
def check_report_journal_debit_credit( |
|||
self, res_data, expected_debit, expected_credit |
|||
): |
|||
self, report, expected_debit, expected_credit): |
|||
self.assertEqual( |
|||
expected_debit, sum([rec["debit"] for rec in res_data["Journal_Ledgers"]]) |
|||
expected_debit, |
|||
sum([journal.debit for journal in |
|||
report.report_journal_ledger_ids]) |
|||
) |
|||
|
|||
self.assertEqual( |
|||
expected_credit, sum([rec["credit"] for rec in res_data["Journal_Ledgers"]]) |
|||
expected_credit, |
|||
sum([journal.credit for journal in |
|||
report.report_journal_ledger_ids]) |
|||
) |
|||
|
|||
def check_report_journal_debit_credit_taxes( |
|||
self, |
|||
res_data, |
|||
expected_base_debit, |
|||
expected_base_credit, |
|||
expected_tax_debit, |
|||
expected_tax_credit, |
|||
): |
|||
for rec in res_data["Journal_Ledgers"]: |
|||
self, report, |
|||
expected_base_debit, expected_base_credit, |
|||
expected_tax_debit, expected_tax_credit): |
|||
|
|||
self.assertEqual( |
|||
expected_base_debit, |
|||
sum([tax_line["base_debit"] for tax_line in rec["tax_lines"]]), |
|||
sum([ |
|||
journal.base_debit |
|||
for journal in report.report_journal_ledger_tax_line_ids |
|||
]) |
|||
) |
|||
self.assertEqual( |
|||
expected_base_credit, |
|||
sum([tax_line["base_credit"] for tax_line in rec["tax_lines"]]), |
|||
sum([ |
|||
journal.base_credit |
|||
for journal in report.report_journal_ledger_tax_line_ids |
|||
]) |
|||
) |
|||
self.assertEqual( |
|||
expected_tax_debit, |
|||
sum([tax_line["tax_debit"] for tax_line in rec["tax_lines"]]), |
|||
sum([ |
|||
journal.tax_debit |
|||
for journal in report.report_journal_ledger_tax_line_ids |
|||
]) |
|||
) |
|||
self.assertEqual( |
|||
expected_tax_credit, |
|||
sum([tax_line["tax_credit"] for tax_line in rec["tax_lines"]]), |
|||
sum([ |
|||
journal.tax_credit |
|||
for journal in report.report_journal_ledger_tax_line_ids |
|||
]) |
|||
) |
|||
|
|||
def test_01_test_total(self): |
|||
today_date = Date.today() |
|||
last_year_date = Date.to_string(datetime.today() - relativedelta(years=1)) |
|||
last_year_date = Date.to_string( |
|||
datetime.today() - relativedelta(years=1)) |
|||
|
|||
move1 = self._add_move(today_date, self.journal_sale, 0, 100, 100, 0) |
|||
move2 = self._add_move(last_year_date, self.journal_sale, 0, 100, 100, 0) |
|||
move1 = self._add_move( |
|||
today_date, self.journal_sale, |
|||
0, 100, 100, 0) |
|||
move2 = self._add_move( |
|||
last_year_date, self.journal_sale, |
|||
0, 100, 100, 0) |
|||
|
|||
wiz = self.JournalLedgerReportWizard.create( |
|||
{ |
|||
"date_from": self.fy_date_start, |
|||
"date_to": self.fy_date_end, |
|||
"company_id": self.company.id, |
|||
"journal_ids": [(6, 0, self.journal_sale.ids)], |
|||
"move_target": "all", |
|||
} |
|||
) |
|||
data = wiz._prepare_report_journal_ledger() |
|||
res_data = self.JournalLedgerReport._get_report_values(wiz, data) |
|||
self.check_report_journal_debit_credit(res_data, 100, 100) |
|||
report = self.ReportJournalLedger.create({ |
|||
'date_from': self.fy_date_start, |
|||
'date_to': self.fy_date_end, |
|||
'company_id': self.company.id, |
|||
'journal_ids': [(6, 0, self.journal_sale.ids)] |
|||
}) |
|||
report.compute_data_for_report() |
|||
|
|||
self.check_report_journal_debit_credit(report, 100, 100) |
|||
|
|||
move3 = self._add_move(today_date, self.journal_sale, 0, 100, 100, 0) |
|||
move3 = self._add_move( |
|||
today_date, self.journal_sale, |
|||
0, 100, 100, 0) |
|||
|
|||
res_data = self.JournalLedgerReport._get_report_values(wiz, data) |
|||
self.check_report_journal_debit_credit(res_data, 200, 200) |
|||
wiz.move_target = "posted" |
|||
data = wiz._prepare_report_journal_ledger() |
|||
res_data = self.JournalLedgerReport._get_report_values(wiz, data) |
|||
self.check_report_journal_debit_credit(res_data, 0, 0) |
|||
report.compute_data_for_report() |
|||
self.check_report_journal_debit_credit(report, 200, 200) |
|||
|
|||
report.move_target = 'posted' |
|||
report.compute_data_for_report() |
|||
self.check_report_journal_debit_credit(report, 0, 0) |
|||
|
|||
move1.post() |
|||
res_data = self.JournalLedgerReport._get_report_values(wiz, data) |
|||
self.check_report_journal_debit_credit(res_data, 100, 100) |
|||
report.compute_data_for_report() |
|||
self.check_report_journal_debit_credit(report, 100, 100) |
|||
|
|||
move2.post() |
|||
res_data = self.JournalLedgerReport._get_report_values(wiz, data) |
|||
self.check_report_journal_debit_credit(res_data, 100, 100) |
|||
report.compute_data_for_report() |
|||
self.check_report_journal_debit_credit(report, 100, 100) |
|||
|
|||
move3.post() |
|||
res_data = self.JournalLedgerReport._get_report_values(wiz, data) |
|||
self.check_report_journal_debit_credit(res_data, 200, 200) |
|||
report.compute_data_for_report() |
|||
self.check_report_journal_debit_credit(report, 200, 200) |
|||
|
|||
wiz.date_from = self.previous_fy_date_start |
|||
data = wiz._prepare_report_journal_ledger() |
|||
res_data = self.JournalLedgerReport._get_report_values(wiz, data) |
|||
self.check_report_journal_debit_credit(res_data, 300, 300) |
|||
report.date_from = self.previous_fy_date_start |
|||
report.compute_data_for_report() |
|||
self.check_report_journal_debit_credit(report, 300, 300) |
|||
|
|||
def test_02_test_taxes_out_invoice(self): |
|||
move_form = Form( |
|||
self.env["account.move"].with_context(default_type="out_invoice") |
|||
) |
|||
move_form.partner_id = self.partner_2 |
|||
move_form.journal_id = self.journal_sale |
|||
with move_form.invoice_line_ids.new() as line_form: |
|||
line_form.name = "test" |
|||
line_form.quantity = 1.0 |
|||
line_form.price_unit = 100 |
|||
line_form.account_id = self.income_account |
|||
line_form.tax_ids.add(self.tax_15_s) |
|||
with move_form.invoice_line_ids.new() as line_form: |
|||
line_form.name = "test" |
|||
line_form.quantity = 1.0 |
|||
line_form.price_unit = 100 |
|||
line_form.account_id = self.income_account |
|||
line_form.tax_ids.add(self.tax_15_s) |
|||
line_form.tax_ids.add(self.tax_20_s) |
|||
invoice = move_form.save() |
|||
invoice.post() |
|||
|
|||
wiz = self.JournalLedgerReportWizard.create( |
|||
{ |
|||
"date_from": self.fy_date_start, |
|||
"date_to": self.fy_date_end, |
|||
"company_id": self.company.id, |
|||
"journal_ids": [(6, 0, self.journal_sale.ids)], |
|||
"move_target": "all", |
|||
invoice_values = { |
|||
'journal_id': self.journal_sale.id, |
|||
'partner_id': self.partner_2.id, |
|||
'type': 'out_invoice', |
|||
'invoice_line_ids': [ |
|||
(0, 0, { |
|||
'quantity': 1.0, |
|||
'price_unit': 100, |
|||
'account_id': self.receivable_account.id, |
|||
'name': "Test", |
|||
'invoice_line_tax_ids': [(6, 0, [self.tax_15_s.id])], |
|||
}), |
|||
(0, 0, { |
|||
'quantity': 1.0, |
|||
'price_unit': 100, |
|||
'account_id': self.receivable_account.id, |
|||
'name': "Test", |
|||
'invoice_line_tax_ids': [(6, 0, [ |
|||
self.tax_15_s.id, self.tax_20_s.id |
|||
])], |
|||
}) |
|||
] |
|||
} |
|||
) |
|||
data = wiz._prepare_report_journal_ledger() |
|||
res_data = self.JournalLedgerReport._get_report_values(wiz, data) |
|||
self.check_report_journal_debit_credit(res_data, 250, 250) |
|||
self.check_report_journal_debit_credit_taxes(res_data, 0, 300, 0, 50) |
|||
invoice = self.InvoiceObj.create(invoice_values) |
|||
invoice.action_invoice_open() |
|||
|
|||
report = self.ReportJournalLedger.create({ |
|||
'date_from': self.fy_date_start, |
|||
'date_to': self.fy_date_end, |
|||
'company_id': self.company.id, |
|||
'journal_ids': [(6, 0, self.journal_sale.ids)] |
|||
}) |
|||
report.compute_data_for_report() |
|||
|
|||
self.check_report_journal_debit_credit(report, 250, 250) |
|||
self.check_report_journal_debit_credit_taxes(report, 0, 300, 0, 50) |
|||
|
|||
def test_03_test_taxes_in_invoice(self): |
|||
# invoice_values = { |
|||
# "journal_id": self.journal_purchase.id, |
|||
# "partner_id": self.partner_2.id, |
|||
# "type": "in_invoice", |
|||
# "invoice_line_ids": [ |
|||
# ( |
|||
# 0, |
|||
# 0, |
|||
# { |
|||
# "quantity": 1.0, |
|||
# "price_unit": 100, |
|||
# "account_id": self.payable_account.id, |
|||
# "name": "Test", |
|||
# "tax_ids": [(6, 0, [self.tax_15_p.id])], |
|||
# }, |
|||
# ), |
|||
# ( |
|||
# 0, |
|||
# 0, |
|||
# { |
|||
# "quantity": 1.0, |
|||
# "price_unit": 100, |
|||
# "account_id": self.payable_account.id, |
|||
# "name": "Test", |
|||
# "tax_ids": [ |
|||
# (6, 0, [self.tax_15_p.id, self.tax_20_p.id]) |
|||
# ], |
|||
# }, |
|||
# ), |
|||
# ], |
|||
# } |
|||
# invoice = self.InvoiceObj.create(invoice_values) |
|||
# invoice.post() |
|||
|
|||
move_form = Form( |
|||
self.env["account.move"].with_context(default_type="in_invoice") |
|||
) |
|||
move_form.partner_id = self.partner_2 |
|||
move_form.journal_id = self.journal_purchase |
|||
with move_form.invoice_line_ids.new() as line_form: |
|||
line_form.name = "test" |
|||
line_form.quantity = 1.0 |
|||
line_form.price_unit = 100 |
|||
line_form.account_id = self.expense_account |
|||
line_form.tax_ids.add(self.tax_15_p) |
|||
with move_form.invoice_line_ids.new() as line_form: |
|||
line_form.name = "test" |
|||
line_form.quantity = 1.0 |
|||
line_form.price_unit = 100 |
|||
line_form.account_id = self.expense_account |
|||
line_form.tax_ids.add(self.tax_15_p) |
|||
line_form.tax_ids.add(self.tax_20_p) |
|||
invoice = move_form.save() |
|||
invoice.post() |
|||
|
|||
wiz = self.JournalLedgerReportWizard.create( |
|||
{ |
|||
"date_from": self.fy_date_start, |
|||
"date_to": self.fy_date_end, |
|||
"company_id": self.company.id, |
|||
"journal_ids": [(6, 0, self.journal_purchase.ids)], |
|||
"move_target": "all", |
|||
invoice_values = { |
|||
'journal_id': self.journal_sale.id, |
|||
'partner_id': self.partner_2.id, |
|||
'type': 'in_invoice', |
|||
'invoice_line_ids': [ |
|||
(0, 0, { |
|||
'quantity': 1.0, |
|||
'price_unit': 100, |
|||
'account_id': self.payable_account.id, |
|||
'name': "Test", |
|||
'invoice_line_tax_ids': [(6, 0, [self.tax_15_p.id])], |
|||
}), |
|||
(0, 0, { |
|||
'quantity': 1.0, |
|||
'price_unit': 100, |
|||
'account_id': self.payable_account.id, |
|||
'name': "Test", |
|||
'invoice_line_tax_ids': [(6, 0, [ |
|||
self.tax_15_p.id, self.tax_20_p.id |
|||
])], |
|||
}) |
|||
] |
|||
} |
|||
) |
|||
data = wiz._prepare_report_journal_ledger() |
|||
res_data = self.JournalLedgerReport._get_report_values(wiz, data) |
|||
|
|||
self.check_report_journal_debit_credit(res_data, 250, 250) |
|||
self.check_report_journal_debit_credit_taxes(res_data, 300, 0, 50, 0) |
|||
invoice = self.InvoiceObj.create(invoice_values) |
|||
invoice.action_invoice_open() |
|||
|
|||
report = self.ReportJournalLedger.create({ |
|||
'date_from': self.fy_date_start, |
|||
'date_to': self.fy_date_end, |
|||
'company_id': self.company.id, |
|||
'journal_ids': [(6, 0, self.journal_sale.ids)] |
|||
}) |
|||
report.compute_data_for_report() |
|||
|
|||
self.check_report_journal_debit_credit(report, 250, 250) |
|||
self.check_report_journal_debit_credit_taxes(report, 300, 0, 50, 0) |
1116
account_financial_report/tests/test_trial_balance.py
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -1,368 +1,300 @@ |
|||
# Copyright 2018 Forest and Biomass Romania |
|||
# Copyright 2020 ForgeFlow S.L. (https://www.forgeflow.com) |
|||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). |
|||
|
|||
import time |
|||
from datetime import date |
|||
|
|||
from odoo.tests import common |
|||
from . import abstract_test_tax_report |
|||
|
|||
|
|||
class TestVAT(abstract_test_tax_report.AbstractTest): |
|||
""" |
|||
Technical tests for VAT Report. |
|||
""" |
|||
|
|||
def _getReportModel(self): |
|||
return self.env['report_vat_report'] |
|||
|
|||
def _getQwebReportName(self): |
|||
return 'account_financial_report.report_vat_report_qweb' |
|||
|
|||
def _getXlsxReportName(self): |
|||
return 'a_f_r.report_vat_report_xlsx' |
|||
|
|||
def _getXlsxReportActionName(self): |
|||
return 'account_financial_report.action_report_vat_report_xlsx' |
|||
|
|||
def _getReportTitle(self): |
|||
return 'Odoo' |
|||
|
|||
def _getBaseFilters(self): |
|||
return { |
|||
'date_from': date(date.today().year, 1, 1), |
|||
'date_to': date(date.today().year, 12, 31), |
|||
'company_id': self.env.user.company_id.id, |
|||
} |
|||
|
|||
def _getAdditionalFiltersToBeTested(self): |
|||
return [ |
|||
{'based_on': 'taxtags'}, |
|||
{'based_on': 'taxgroups'}, |
|||
{'tax_details': True}, |
|||
{'based_on': 'taxtags', 'tax_details': True}, |
|||
{'based_on': 'taxgroups', 'tax_details': True}, |
|||
] |
|||
|
|||
|
|||
class TestVATReport(common.TransactionCase): |
|||
|
|||
def setUp(self): |
|||
super(TestVATReport, self).setUp() |
|||
self.date_from = time.strftime("%Y-%m-01") |
|||
self.date_to = time.strftime("%Y-%m-28") |
|||
self.company = self.env.ref("base.main_company") |
|||
self.receivable_account = self.env["account.account"].search( |
|||
[ |
|||
("company_id", "=", self.company.id), |
|||
("user_type_id.name", "=", "Receivable"), |
|||
], |
|||
limit=1, |
|||
) |
|||
self.income_account = self.env["account.account"].search( |
|||
[ |
|||
("company_id", "=", self.company.id), |
|||
("user_type_id.name", "=", "Income"), |
|||
], |
|||
limit=1, |
|||
) |
|||
self.tax_account = self.env["account.account"].search( |
|||
[ |
|||
("company_id", "=", self.company.id), |
|||
( |
|||
"user_type_id", |
|||
"=", |
|||
self.date_from = time.strftime('%Y-%m-01') |
|||
self.date_to = time.strftime('%Y-%m-28') |
|||
self.company = self.env.ref('base.main_company') |
|||
self.receivable_account = self.env['account.account'].search([ |
|||
('company_id', '=', self.company.id), |
|||
('user_type_id.name', '=', 'Receivable') |
|||
], limit=1) |
|||
self.income_account = self.env['account.account'].search([ |
|||
('company_id', '=', self.company.id), |
|||
('user_type_id.name', '=', 'Income') |
|||
], limit=1) |
|||
self.tax_account = self.env['account.account'].search([ |
|||
('company_id', '=', self.company.id), |
|||
('user_type_id', |
|||
'=', |
|||
self.env.ref( |
|||
"account.data_account_type_non_current_liabilities" |
|||
).id, |
|||
), |
|||
], |
|||
limit=1, |
|||
) |
|||
self.bank_journal = self.env["account.journal"].search( |
|||
[("type", "=", "bank"), ("company_id", "=", self.company.id)], limit=1 |
|||
) |
|||
self.tax_tag_01 = self.env["account.account.tag"].create( |
|||
{ |
|||
"name": "Tag 01", |
|||
"applicability": "taxes", |
|||
"country_id": self.company.country_id.id, |
|||
} |
|||
) |
|||
self.tax_tag_02 = self.env["account.account.tag"].create( |
|||
{ |
|||
"name": "Tag 02", |
|||
"applicability": "taxes", |
|||
"country_id": self.company.country_id.id, |
|||
} |
|||
) |
|||
self.tax_tag_03 = self.env["account.account.tag"].create( |
|||
{ |
|||
"name": "Tag 03", |
|||
"applicability": "taxes", |
|||
"country_id": self.company.country_id.id, |
|||
} |
|||
) |
|||
self.tax_group_10 = self.env["account.tax.group"].create( |
|||
{"name": "Tax 10%", "sequence": 1} |
|||
) |
|||
self.tax_group_20 = self.env["account.tax.group"].create( |
|||
{"name": "Tax 20%", "sequence": 2} |
|||
) |
|||
self.tax_10 = self.env["account.tax"].create( |
|||
{ |
|||
"name": "Tax 10.0%", |
|||
"amount": 10.0, |
|||
"amount_type": "percent", |
|||
"type_tax_use": "sale", |
|||
"company_id": self.company.id, |
|||
"tax_group_id": self.tax_group_10.id, |
|||
"invoice_repartition_line_ids": [ |
|||
(0, 0, {"factor_percent": 100, "repartition_type": "base"}), |
|||
( |
|||
0, |
|||
0, |
|||
{ |
|||
"factor_percent": 100, |
|||
"repartition_type": "tax", |
|||
"account_id": self.tax_account.id, |
|||
"tag_ids": [ |
|||
(6, 0, [self.tax_tag_01.id, self.tax_tag_02.id]) |
|||
], |
|||
}, |
|||
), |
|||
], |
|||
"refund_repartition_line_ids": [ |
|||
(0, 0, {"factor_percent": 100, "repartition_type": "base"}), |
|||
( |
|||
0, |
|||
0, |
|||
{ |
|||
"factor_percent": 100, |
|||
"repartition_type": "tax", |
|||
"account_id": self.tax_account.id, |
|||
}, |
|||
), |
|||
], |
|||
} |
|||
) |
|||
self.tax_20 = self.env["account.tax"].create( |
|||
{ |
|||
"sequence": 30, |
|||
"name": "Tax 20.0%", |
|||
"amount": 20.0, |
|||
"amount_type": "percent", |
|||
"type_tax_use": "sale", |
|||
"company_id": self.company.id, |
|||
"cash_basis_transition_account_id": self.tax_account.id, |
|||
"tax_group_id": self.tax_group_20.id, |
|||
"invoice_repartition_line_ids": [ |
|||
(0, 0, {"factor_percent": 100, "repartition_type": "base"}), |
|||
( |
|||
0, |
|||
0, |
|||
{ |
|||
"factor_percent": 100, |
|||
"repartition_type": "tax", |
|||
"account_id": self.tax_account.id, |
|||
"tag_ids": [ |
|||
(6, 0, [self.tax_tag_02.id, self.tax_tag_03.id]) |
|||
], |
|||
}, |
|||
), |
|||
], |
|||
"refund_repartition_line_ids": [ |
|||
(0, 0, {"factor_percent": 100, "repartition_type": "base"}), |
|||
( |
|||
0, |
|||
0, |
|||
{ |
|||
"factor_percent": 100, |
|||
"repartition_type": "tax", |
|||
"account_id": self.tax_account.id, |
|||
}, |
|||
), |
|||
], |
|||
} |
|||
) |
|||
'account.data_account_type_non_current_liabilities').id) |
|||
], limit=1) |
|||
self.bank_journal = self.env['account.journal'].search([ |
|||
('type', '=', 'bank'), ('company_id', '=', self.company.id) |
|||
], limit=1) |
|||
self.tax_tag_01 = self.env['account.account.tag'].create({ |
|||
'name': 'Tag 01', |
|||
'applicability': 'taxes' |
|||
}) |
|||
self.tax_tag_02 = self.env['account.account.tag'].create({ |
|||
'name': 'Tag 02', |
|||
'applicability': 'taxes' |
|||
}) |
|||
self.tax_tag_03 = self.env['account.account.tag'].create({ |
|||
'name': 'Tag 03', |
|||
'applicability': 'taxes' |
|||
}) |
|||
self.tax_group_10 = self.env['account.tax.group'].create({ |
|||
'name': 'Tax 10%', |
|||
'sequence': 1 |
|||
}) |
|||
self.tax_group_20 = self.env['account.tax.group'].create({ |
|||
'name': 'Tax 20%', |
|||
'sequence': 2 |
|||
}) |
|||
self.tax_10 = self.env['account.tax'].create({ |
|||
'name': 'Tax 10.0%', |
|||
'amount': 10.0, |
|||
'amount_type': 'percent', |
|||
'type_tax_use': 'sale', |
|||
'account_id': self.tax_account.id, |
|||
'company_id': self.company.id, |
|||
'refund_account_id': self.tax_account.id, |
|||
'tax_group_id': self.tax_group_10.id, |
|||
'tag_ids': [(6, 0, [self.tax_tag_01.id, self.tax_tag_02.id])] |
|||
}) |
|||
self.tax_20 = self.env['account.tax'].create({ |
|||
'sequence': 30, |
|||
'name': 'Tax 20.0%', |
|||
'amount': 20.0, |
|||
'amount_type': 'percent', |
|||
'type_tax_use': 'sale', |
|||
'tax_exigibility': 'on_payment', |
|||
'account_id': self.tax_account.id, |
|||
'company_id': self.company.id, |
|||
'refund_account_id': self.tax_account.id, |
|||
'cash_basis_account_id': self.tax_account.id, |
|||
'tax_group_id': self.tax_group_20.id, |
|||
'tag_ids': [(6, 0, [self.tax_tag_02.id, self.tax_tag_03.id])] |
|||
}) |
|||
|
|||
move_form = common.Form( |
|||
self.env["account.move"].with_context(default_type="out_invoice") |
|||
) |
|||
move_form.partner_id = self.env.ref("base.res_partner_2") |
|||
move_form.invoice_date = time.strftime("%Y-%m-03") |
|||
with move_form.invoice_line_ids.new() as line_form: |
|||
line_form.product_id = self.env.ref("product.product_product_4") |
|||
line_form.quantity = 1.0 |
|||
line_form.price_unit = 100.0 |
|||
line_form.account_id = self.income_account |
|||
line_form.tax_ids.add(self.tax_10) |
|||
invoice = move_form.save() |
|||
invoice.post() |
|||
invoice = self.env['account.invoice'].create({ |
|||
'partner_id': self.env.ref('base.res_partner_2').id, |
|||
'account_id': self.receivable_account.id, |
|||
'company_id': self.company.id, |
|||
'date_invoice': time.strftime('%Y-%m-03'), |
|||
'type': 'out_invoice', |
|||
}) |
|||
|
|||
move_form = common.Form( |
|||
self.env["account.move"].with_context(default_type="out_invoice") |
|||
) |
|||
move_form.partner_id = self.env.ref("base.res_partner_2") |
|||
move_form.invoice_date = time.strftime("%Y-%m-04") |
|||
with move_form.invoice_line_ids.new() as line_form: |
|||
line_form.product_id = self.env.ref("product.product_product_4") |
|||
line_form.quantity = 1.0 |
|||
line_form.price_unit = 250.0 |
|||
line_form.account_id = self.income_account |
|||
line_form.tax_ids.add(self.tax_20) |
|||
invoice = move_form.save() |
|||
invoice.post() |
|||
self.env['account.invoice.line'].create({ |
|||
'product_id': self.env.ref('product.product_product_4').id, |
|||
'quantity': 1.0, |
|||
'price_unit': 100.0, |
|||
'invoice_id': invoice.id, |
|||
'name': 'product', |
|||
'account_id': self.income_account.id, |
|||
'invoice_line_tax_ids': [(6, 0, [self.tax_10.id])], |
|||
}) |
|||
invoice.compute_taxes() |
|||
invoice.action_invoice_open() |
|||
|
|||
def _get_report_lines(self, taxgroups=False): |
|||
based_on = "taxtags" |
|||
if taxgroups: |
|||
based_on = "taxgroups" |
|||
vat_report = self.env["vat.report.wizard"].create( |
|||
{ |
|||
"date_from": self.date_from, |
|||
"date_to": self.date_to, |
|||
"company_id": self.company.id, |
|||
"based_on": based_on, |
|||
"tax_detail": True, |
|||
} |
|||
) |
|||
data = vat_report._prepare_vat_report() |
|||
res_data = self.env[ |
|||
"report.account_financial_report.vat_report" |
|||
]._get_report_values(vat_report, data) |
|||
return res_data |
|||
self.cbinvoice = self.env['account.invoice'].create({ |
|||
'partner_id': self.env.ref('base.res_partner_2').id, |
|||
'account_id': self.receivable_account.id, |
|||
'company_id': self.company.id, |
|||
'date_invoice': time.strftime('%Y-%m-05'), |
|||
'type': 'out_invoice', |
|||
}) |
|||
|
|||
def check_tag_or_group_in_report(self, tag_or_group_name, vat_report): |
|||
tag_or_group_in_report = False |
|||
for tag_or_group in vat_report: |
|||
if tag_or_group["name"] == tag_or_group_name: |
|||
tag_or_group_in_report = True |
|||
break |
|||
return tag_or_group_in_report |
|||
self.env['account.invoice.line'].create({ |
|||
'product_id': self.env.ref('product.product_product_4').id, |
|||
'quantity': 1.0, |
|||
'price_unit': 500.0, |
|||
'invoice_id': self.cbinvoice.id, |
|||
'name': 'product', |
|||
'account_id': self.income_account.id, |
|||
'invoice_line_tax_ids': [(6, 0, [self.tax_20.id])], |
|||
}) |
|||
self.cbinvoice.compute_taxes() |
|||
self.cbinvoice.action_invoice_open() |
|||
|
|||
def check_tax_in_report(self, tax_name, vat_report): |
|||
tax_in_report = False |
|||
for tag_or_group in vat_report: |
|||
if tag_or_group["taxes"]: |
|||
for tax in tag_or_group["taxes"]: |
|||
if tax["name"] == tax_name: |
|||
tax_in_report = True |
|||
return tax_in_report |
|||
|
|||
def _get_tag_or_group_line(self, tag_or_group_name, vat_report): |
|||
tag_or_group_net = False |
|||
tag_or_group_tax = False |
|||
for tag_or_group in vat_report: |
|||
if tag_or_group["name"] == tag_or_group_name: |
|||
tag_or_group_net = tag_or_group["net"] |
|||
tag_or_group_tax = tag_or_group["tax"] |
|||
return tag_or_group_net, tag_or_group_tax |
|||
|
|||
def _get_tax_line(self, tax_name, vat_report): |
|||
tax_net = False |
|||
tax_tax = False |
|||
for tag_or_group in vat_report: |
|||
if tag_or_group["taxes"]: |
|||
for tax in tag_or_group["taxes"]: |
|||
if tax["name"] == tax_name: |
|||
tax_net = tax["net"] |
|||
tax_tax = tax["tax"] |
|||
return tax_net, tax_tax |
|||
def _get_report_lines(self): |
|||
self.cbinvoice.pay_and_reconcile( |
|||
self.bank_journal.id, 300, date( |
|||
date.today().year, date.today().month, 10)) |
|||
vat_report = self.env['report_vat_report'].create({ |
|||
'date_from': self.date_from, |
|||
'date_to': self.date_to, |
|||
'company_id': self.company.id, |
|||
'based_on': 'taxtags', |
|||
'tax_detail': True, |
|||
}) |
|||
vat_report.compute_data_for_report() |
|||
lines = {} |
|||
vat_taxtag_model = self.env['report_vat_report_taxtag'] |
|||
lines['tag_01'] = vat_taxtag_model.search([ |
|||
('report_id', '=', vat_report.id), |
|||
('taxtag_id', '=', self.tax_tag_01.id), |
|||
]) |
|||
lines['tag_02'] = vat_taxtag_model.search([ |
|||
('report_id', '=', vat_report.id), |
|||
('taxtag_id', '=', self.tax_tag_02.id), |
|||
]) |
|||
lines['tag_03'] = vat_taxtag_model.search([ |
|||
('report_id', '=', vat_report.id), |
|||
('taxtag_id', '=', self.tax_tag_03.id), |
|||
]) |
|||
vat_tax_model = self.env['report_vat_report_tax'] |
|||
lines['tax_10'] = vat_tax_model.search([ |
|||
('report_tax_id', '=', lines['tag_02'].id), |
|||
('tax_id', '=', self.tax_10.id), |
|||
]) |
|||
lines['tax_20'] = vat_tax_model.search([ |
|||
('report_tax_id', '=', lines['tag_02'].id), |
|||
('tax_id', '=', self.tax_20.id), |
|||
]) |
|||
vat_report['based_on'] = 'taxgroups' |
|||
vat_report.compute_data_for_report() |
|||
lines['group_10'] = vat_taxtag_model.search([ |
|||
('report_id', '=', vat_report.id), |
|||
('taxgroup_id', '=', self.tax_group_10.id), |
|||
]) |
|||
lines['group_20'] = vat_taxtag_model.search([ |
|||
('report_id', '=', vat_report.id), |
|||
('taxgroup_id', '=', self.tax_group_20.id), |
|||
]) |
|||
vat_tax_model = self.env['report_vat_report_tax'] |
|||
lines['tax_group_10'] = vat_tax_model.search([ |
|||
('report_tax_id', '=', lines['group_10'].id), |
|||
('tax_id', '=', self.tax_10.id), |
|||
]) |
|||
lines['tax_group_20'] = vat_tax_model.search([ |
|||
('report_tax_id', '=', lines['group_20'].id), |
|||
('tax_id', '=', self.tax_20.id), |
|||
]) |
|||
return lines |
|||
|
|||
def test_01_compute(self): |
|||
# Generate the vat lines |
|||
res_data = self._get_report_lines() |
|||
vat_report = res_data["vat_report"] |
|||
lines = self._get_report_lines() |
|||
|
|||
# Check report based on taxtags |
|||
check_tax_tag_01 = self.check_tag_or_group_in_report( |
|||
self.tax_tag_01.name, vat_report |
|||
) |
|||
self.assertTrue(check_tax_tag_01) |
|||
check_tax_tag_02 = self.check_tag_or_group_in_report( |
|||
self.tax_tag_02.name, vat_report |
|||
) |
|||
self.assertTrue(check_tax_tag_02) |
|||
check_tax_tag_03 = self.check_tag_or_group_in_report( |
|||
self.tax_tag_03.name, vat_report |
|||
) |
|||
self.assertTrue(check_tax_tag_03) |
|||
check_tax_10 = self.check_tax_in_report(self.tax_10.name, vat_report) |
|||
self.assertTrue(check_tax_10) |
|||
check_tax_20 = self.check_tax_in_report(self.tax_20.name, vat_report) |
|||
self.assertTrue(check_tax_20) |
|||
|
|||
tag_01_net, tag_01_tax = self._get_tag_or_group_line( |
|||
self.tax_tag_01.name, vat_report |
|||
) |
|||
tag_02_net, tag_02_tax = self._get_tag_or_group_line( |
|||
self.tax_tag_02.name, vat_report |
|||
) |
|||
tag_03_net, tag_03_tax = self._get_tag_or_group_line( |
|||
self.tax_tag_03.name, vat_report |
|||
) |
|||
tax_10_net, tax_10_tax = self._get_tax_line(self.tax_10.name, vat_report) |
|||
tax_20_net, tax_20_tax = self._get_tax_line(self.tax_20.name, vat_report) |
|||
|
|||
self.assertEqual(tag_01_net, -100) |
|||
self.assertEqual(tag_01_tax, -10) |
|||
self.assertEqual(tag_02_net, -350) |
|||
self.assertEqual(tag_02_tax, -60) |
|||
self.assertEqual(tag_03_net, -250) |
|||
self.assertEqual(tag_03_tax, -50) |
|||
self.assertEqual(tax_10_net, -100) |
|||
self.assertEqual(tax_10_tax, -10) |
|||
self.assertEqual(tax_20_net, -250) |
|||
self.assertEqual(tax_20_tax, -50) |
|||
self.assertEqual(len(lines['tag_01']), 1) |
|||
self.assertEqual(len(lines['tag_02']), 1) |
|||
self.assertEqual(len(lines['tag_03']), 1) |
|||
self.assertEqual(len(lines['tax_10']), 1) |
|||
self.assertEqual(len(lines['tax_20']), 1) |
|||
self.assertEqual(lines['tag_01'].net, 100) |
|||
self.assertEqual(lines['tag_01'].tax, 10) |
|||
self.assertEqual(lines['tag_02'].net, 350) |
|||
self.assertEqual(lines['tag_02'].tax, 60) |
|||
self.assertEqual(lines['tag_03'].net, 250) |
|||
self.assertEqual(lines['tag_03'].tax, 50) |
|||
self.assertEqual(lines['tax_10'].net, 100) |
|||
self.assertEqual(lines['tax_10'].tax, 10) |
|||
self.assertEqual(lines['tax_20'].net, 250) |
|||
self.assertEqual(lines['tax_20'].tax, 50) |
|||
|
|||
# Check report based on taxgroups |
|||
res_data = self._get_report_lines(taxgroups=True) |
|||
vat_report = res_data["vat_report"] |
|||
|
|||
check_group_10 = self.check_tag_or_group_in_report( |
|||
self.tax_group_10.name, vat_report |
|||
) |
|||
self.assertTrue(check_group_10) |
|||
check_group_20 = self.check_tag_or_group_in_report( |
|||
self.tax_group_20.name, vat_report |
|||
) |
|||
self.assertTrue(check_group_20) |
|||
check_tax_10 = self.check_tax_in_report(self.tax_10.name, vat_report) |
|||
self.assertTrue(check_tax_10) |
|||
check_tax_20 = self.check_tax_in_report(self.tax_20.name, vat_report) |
|||
self.assertTrue(check_tax_20) |
|||
|
|||
group_10_net, group_10_tax = self._get_tag_or_group_line( |
|||
self.tax_group_10.name, vat_report |
|||
) |
|||
group_20_net, group_20_tax = self._get_tag_or_group_line( |
|||
self.tax_group_20.name, vat_report |
|||
) |
|||
tax_10_net, tax_10_tax = self._get_tax_line(self.tax_10.name, vat_report) |
|||
tax_20_net, tax_20_tax = self._get_tax_line(self.tax_20.name, vat_report) |
|||
self.assertEqual(len(lines['group_10']), 1) |
|||
self.assertEqual(len(lines['group_20']), 1) |
|||
self.assertEqual(len(lines['tax_group_10']), 1) |
|||
self.assertEqual(len(lines['tax_group_20']), 1) |
|||
self.assertEqual(lines['group_10'].net, 100) |
|||
self.assertEqual(lines['group_10'].tax, 10) |
|||
self.assertEqual(lines['group_20'].net, 250) |
|||
self.assertEqual(lines['group_20'].tax, 50) |
|||
self.assertEqual(lines['tax_group_10'].net, 100) |
|||
self.assertEqual(lines['tax_group_10'].tax, 10) |
|||
self.assertEqual(lines['tax_group_20'].net, 250) |
|||
self.assertEqual(lines['tax_group_20'].tax, 50) |
|||
|
|||
self.assertEqual(group_10_net, -100) |
|||
self.assertEqual(group_10_tax, -10) |
|||
self.assertEqual(group_20_net, -250) |
|||
self.assertEqual(group_20_tax, -50) |
|||
self.assertEqual(tax_10_net, -100) |
|||
self.assertEqual(tax_10_tax, -10) |
|||
self.assertEqual(tax_20_net, -250) |
|||
self.assertEqual(tax_20_tax, -50) |
|||
def test_get_report_html(self): |
|||
vat_report = self.env['report_vat_report'].create({ |
|||
'date_from': self.date_from, |
|||
'date_to': self.date_to, |
|||
'company_id': self.company.id, |
|||
'tax_detail': True, |
|||
}) |
|||
vat_report.compute_data_for_report() |
|||
vat_report.get_html(given_context={}) |
|||
|
|||
def test_wizard_date_range(self): |
|||
vat_wizard = self.env["vat.report.wizard"] |
|||
date_range = self.env["date.range"] |
|||
self.type = self.env["date.range.type"].create( |
|||
{"name": "Month", "company_id": False, "allow_overlap": False} |
|||
) |
|||
dt = date_range.create( |
|||
{ |
|||
"name": "FS2016", |
|||
"date_start": time.strftime("%Y-%m-01"), |
|||
"date_end": time.strftime("%Y-%m-28"), |
|||
"type_id": self.type.id, |
|||
} |
|||
) |
|||
vat_wizard = self.env['vat.report.wizard'] |
|||
date_range = self.env['date.range'] |
|||
self.type = self.env['date.range.type'].create( |
|||
{'name': 'Month', |
|||
'company_id': False, |
|||
'allow_overlap': False}) |
|||
dt = date_range.create({ |
|||
'name': 'FS2016', |
|||
'date_start': time.strftime('%Y-%m-01'), |
|||
'date_end': time.strftime('%Y-%m-28'), |
|||
'type_id': self.type.id, |
|||
}) |
|||
wizard = vat_wizard.create( |
|||
{ |
|||
"date_range_id": dt.id, |
|||
"date_from": time.strftime("%Y-%m-28"), |
|||
"date_to": time.strftime("%Y-%m-01"), |
|||
"tax_detail": True, |
|||
} |
|||
) |
|||
{'date_range_id': dt.id, |
|||
'date_from': time.strftime('%Y-%m-28'), |
|||
'date_to': time.strftime('%Y-%m-01'), |
|||
'tax_detail': True}) |
|||
wizard.onchange_date_range_id() |
|||
self.assertEqual( |
|||
wizard.date_from, date(date.today().year, date.today().month, 1) |
|||
) |
|||
self.assertEqual( |
|||
wizard.date_to, date(date.today().year, date.today().month, 28) |
|||
) |
|||
wizard._export("qweb-pdf") |
|||
self.assertEqual(wizard.date_from, date( |
|||
date.today().year, date.today().month, 1)) |
|||
self.assertEqual(wizard.date_to, date( |
|||
date.today().year, date.today().month, 28)) |
|||
wizard._export('qweb-pdf') |
|||
wizard.button_export_html() |
|||
wizard.button_export_pdf() |
|||
wizard.button_export_xlsx() |
|||
wizard = vat_wizard.create( |
|||
{ |
|||
"date_range_id": dt.id, |
|||
"date_from": time.strftime("%Y-%m-28"), |
|||
"date_to": time.strftime("%Y-%m-01"), |
|||
"based_on": "taxgroups", |
|||
"tax_detail": True, |
|||
} |
|||
) |
|||
{'date_range_id': dt.id, |
|||
'date_from': time.strftime('%Y-%m-28'), |
|||
'date_to': time.strftime('%Y-%m-01'), |
|||
'based_on': 'taxgroups', |
|||
'tax_detail': True}) |
|||
wizard.onchange_date_range_id() |
|||
self.assertEqual( |
|||
wizard.date_from, date(date.today().year, date.today().month, 1) |
|||
) |
|||
self.assertEqual( |
|||
wizard.date_to, date(date.today().year, date.today().month, 28) |
|||
) |
|||
wizard._export("qweb-pdf") |
|||
self.assertEqual(wizard.date_from, date( |
|||
date.today().year, date.today().month, 1)) |
|||
self.assertEqual(wizard.date_to, date( |
|||
date.today().year, date.today().month, 28)) |
|||
wizard._export('qweb-pdf') |
|||
wizard.button_export_html() |
|||
wizard.button_export_pdf() |
|||
wizard.button_export_xlsx() |
Some files were not shown because too many files changed in this diff
Write
Preview
Loading…
Cancel
Save
Reference in new issue