Compare commits
7 Commits
fix-error-
...
v4.x.x
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
10e1452450 | ||
|
|
8320f758be | ||
|
|
093a3ecb43 | ||
|
|
8e261d2da7 | ||
|
|
f0aa1cfad3 | ||
|
|
8570f785c7 | ||
|
|
e3e7309cbf |
@@ -1,14 +0,0 @@
|
||||
# Root editor config file
|
||||
root = true
|
||||
|
||||
# Common settings
|
||||
[*]
|
||||
end_of_line = lf
|
||||
insert_final_newline = true
|
||||
trim_trailing_whitespace = true
|
||||
charset = utf-8
|
||||
|
||||
# python, js indentation settings
|
||||
[{*.py,*.js}]
|
||||
indent_style = tab
|
||||
indent_size = 4
|
||||
161
.eslintrc
161
.eslintrc
@@ -1,161 +0,0 @@
|
||||
{
|
||||
"env": {
|
||||
"browser": true,
|
||||
"node": true,
|
||||
"es6": true
|
||||
},
|
||||
"parserOptions": {
|
||||
"ecmaVersion": 9,
|
||||
"sourceType": "module"
|
||||
},
|
||||
"extends": "eslint:recommended",
|
||||
"rules": {
|
||||
"indent": [
|
||||
"error",
|
||||
"tab",
|
||||
{ "SwitchCase": 1 }
|
||||
],
|
||||
"brace-style": [
|
||||
"error",
|
||||
"1tbs"
|
||||
],
|
||||
"space-unary-ops": [
|
||||
"error",
|
||||
{ "words": true }
|
||||
],
|
||||
"linebreak-style": [
|
||||
"error",
|
||||
"unix"
|
||||
],
|
||||
"quotes": [
|
||||
"off"
|
||||
],
|
||||
"semi": [
|
||||
"warn",
|
||||
"always"
|
||||
],
|
||||
"camelcase": [
|
||||
"off"
|
||||
],
|
||||
"no-unused-vars": [
|
||||
"warn"
|
||||
],
|
||||
"no-redeclare": [
|
||||
"warn"
|
||||
],
|
||||
"no-console": [
|
||||
"warn"
|
||||
],
|
||||
"no-extra-boolean-cast": [
|
||||
"off"
|
||||
],
|
||||
"no-control-regex": [
|
||||
"off"
|
||||
],
|
||||
"space-before-blocks": "warn",
|
||||
"keyword-spacing": "warn",
|
||||
"comma-spacing": "warn",
|
||||
"key-spacing": "warn"
|
||||
},
|
||||
"root": true,
|
||||
"globals": {
|
||||
"frappe": true,
|
||||
"Vue": true,
|
||||
"erpnext": true,
|
||||
"hub": true,
|
||||
"$": true,
|
||||
"jQuery": true,
|
||||
"moment": true,
|
||||
"hljs": true,
|
||||
"Awesomplete": true,
|
||||
"CalHeatMap": true,
|
||||
"Sortable": true,
|
||||
"Showdown": true,
|
||||
"Taggle": true,
|
||||
"Gantt": true,
|
||||
"Slick": true,
|
||||
"PhotoSwipe": true,
|
||||
"PhotoSwipeUI_Default": true,
|
||||
"fluxify": true,
|
||||
"io": true,
|
||||
"c3": true,
|
||||
"__": true,
|
||||
"_p": true,
|
||||
"_f": true,
|
||||
"repl": true,
|
||||
"Class": true,
|
||||
"locals": true,
|
||||
"cint": true,
|
||||
"cstr": true,
|
||||
"cur_frm": true,
|
||||
"cur_dialog": true,
|
||||
"cur_page": true,
|
||||
"cur_list": true,
|
||||
"cur_tree": true,
|
||||
"cur_pos": true,
|
||||
"msg_dialog": true,
|
||||
"is_null": true,
|
||||
"in_list": true,
|
||||
"has_common": true,
|
||||
"has_words": true,
|
||||
"validate_email": true,
|
||||
"get_number_format": true,
|
||||
"format_number": true,
|
||||
"format_currency": true,
|
||||
"round_based_on_smallest_currency_fraction": true,
|
||||
"roundNumber": true,
|
||||
"comment_when": true,
|
||||
"replace_newlines": true,
|
||||
"open_url_post": true,
|
||||
"toTitle": true,
|
||||
"lstrip": true,
|
||||
"strip": true,
|
||||
"strip_html": true,
|
||||
"replace_all": true,
|
||||
"flt": true,
|
||||
"precision": true,
|
||||
"md5": true,
|
||||
"CREATE": true,
|
||||
"AMEND": true,
|
||||
"CANCEL": true,
|
||||
"copy_dict": true,
|
||||
"get_number_format_info": true,
|
||||
"print_table": true,
|
||||
"Layout": true,
|
||||
"web_form_settings": true,
|
||||
"$c": true,
|
||||
"$a": true,
|
||||
"$i": true,
|
||||
"$bg": true,
|
||||
"$y": true,
|
||||
"$c_obj": true,
|
||||
"$c_obj_csv": true,
|
||||
"refresh_many": true,
|
||||
"refresh_field": true,
|
||||
"toggle_field": true,
|
||||
"get_field_obj": true,
|
||||
"get_query_params": true,
|
||||
"unhide_field": true,
|
||||
"hide_field": true,
|
||||
"set_field_options": true,
|
||||
"getCookie": true,
|
||||
"getCookies": true,
|
||||
"get_url_arg": true,
|
||||
"get_server_fields": true,
|
||||
"set_multiple": true,
|
||||
"QUnit": true,
|
||||
"Chart": true,
|
||||
"Cypress": true,
|
||||
"cy": true,
|
||||
"describe": true,
|
||||
"expect": true,
|
||||
"it": true,
|
||||
"context": true,
|
||||
"before": true,
|
||||
"beforeEach": true,
|
||||
"onScan": true,
|
||||
"html2canvas": true,
|
||||
"extend_cscript": true,
|
||||
"localforage": true
|
||||
}
|
||||
}
|
||||
33
.flake8
33
.flake8
@@ -1,33 +0,0 @@
|
||||
[flake8]
|
||||
ignore =
|
||||
E121,
|
||||
E126,
|
||||
E127,
|
||||
E128,
|
||||
E203,
|
||||
E225,
|
||||
E226,
|
||||
E231,
|
||||
E241,
|
||||
E251,
|
||||
E261,
|
||||
E265,
|
||||
E302,
|
||||
E303,
|
||||
E305,
|
||||
E402,
|
||||
E501,
|
||||
E741,
|
||||
W291,
|
||||
W292,
|
||||
W293,
|
||||
W391,
|
||||
W503,
|
||||
W504,
|
||||
F403,
|
||||
B007,
|
||||
B950,
|
||||
W191,
|
||||
|
||||
max-line-length = 200
|
||||
exclude=.github/helper/semgrep_rules
|
||||
@@ -1,19 +0,0 @@
|
||||
# Since version 2.23 (released in August 2019), git-blame has a feature
|
||||
# to ignore or bypass certain commits.
|
||||
#
|
||||
# This file contains a list of commits that are not likely what you
|
||||
# are looking for in a blame, such as mass reformatting or renaming.
|
||||
# You can set this file as a default ignore file for blame by running
|
||||
# the following command.
|
||||
#
|
||||
# $ git config blame.ignoreRevsFile .git-blame-ignore-revs
|
||||
|
||||
# This commit just changes spaces to tabs for indentation in some files
|
||||
5f473611bd6ed57703716244a054d3fb5ba9cd23
|
||||
|
||||
# Whitespace trimming throughout codebase
|
||||
9bb69e711a5da43aaf8c8ecb5601aeffd89dbe5a
|
||||
f0bcb753fb7ebbb64bb0d6906d431d002f0f7d8f
|
||||
|
||||
# imports cleanup
|
||||
4b2be2999f2203493b49bf74c5b440d49e38b5e3
|
||||
36
.github/CONTRIBUTING.md
vendored
36
.github/CONTRIBUTING.md
vendored
@@ -1,36 +0,0 @@
|
||||
### Introduction (first timers)
|
||||
|
||||
Thank you for your interest in raising an Issue with ERPNext. An Issue could mean a bug report or a request for a missing feature. By raising a bug report, you are contributing to the development of ERPNext and this is the first step of participating in the community. Bug reports are very helpful for developers as they quickly fix the issue before other users start facing it.
|
||||
|
||||
Feature requests are also a great way to take the product forward. New ideas can come in any user scenario and the issue list also acts a roadmap of future features.
|
||||
|
||||
When you are raising an Issue, you should keep a few things in mind. Remember that the developer does not have access to your machine so you must give all the information you can while raising an Issue. If you are suggesting a feature, you should be very clear about what you want.
|
||||
|
||||
The Issue list is not the right place to ask a question or start a general discussion. If you want to do that , then the right place is the forum [https://discuss.erpnext.com](https://discuss.erpnext.com).
|
||||
|
||||
### Reply and Closing Policy
|
||||
|
||||
If your issue is not clear or does not meet the guidelines, then it will be closed. If it is closed, please supply the information asked and re-open it.
|
||||
|
||||
### General Issue Guidelines
|
||||
|
||||
1. **Search existing Issues:** Before raising a Issue, search if it has been raised before. Maybe add a 👍 or give additional help by creating a mockup if it is not already created.
|
||||
1. **Report each issue separately:** Don't club multiple, unreleated issues in one note.
|
||||
1. **Brief:** Please don't include long explanations. Use screenshots and bullet points instead of descriptive paragraphs.
|
||||
|
||||
### Bug Report Guidelines
|
||||
|
||||
1. **Steps to Reproduce:** The bug report must have a list of steps needed to reproduce a bug. If we cannot reproduce it, then we cannot solve it.
|
||||
1. **Version Number:** Please add the version number in your report. Often a bug is fixed in the latest version
|
||||
1. **Clear Title:** Add a clear subject to your bug report like "Unable to submit Purchase Order without Basic Rate" instead of just "Cannot Submit"
|
||||
1. **Screenshots:** Screenshots are a great way of communicating the issues. Try adding annotations or using LiceCAP to take a screencast in `gif`.
|
||||
|
||||
### Feature Request Guidelines
|
||||
|
||||
1. **Clarity:** Clearly specify how do you want the feature to behave. Don't just say "I would like multiple PDF formats", say that "Ability to add multiple print formats for customers with different languages".
|
||||
1. **Solution:** Try and identify how the feature should look like.
|
||||
1. **Mockups:** Mockups are a great way to explain your requirement.
|
||||
|
||||
### What if my Issue is closed
|
||||
|
||||
Don't worry, take the feedback, supply the correct information and re-open it!
|
||||
47
.github/ISSUE_TEMPLATE/bug_report.md
vendored
47
.github/ISSUE_TEMPLATE/bug_report.md
vendored
@@ -1,47 +0,0 @@
|
||||
---
|
||||
name: Bug report
|
||||
about: Report a bug encountered while using ERPNext
|
||||
labels: bug
|
||||
---
|
||||
|
||||
<!--
|
||||
Welcome to ERPNext issue tracker! Before creating an issue, please heed the following:
|
||||
|
||||
1. This tracker should only be used to report bugs and request features / enhancements to ERPNext
|
||||
- For questions and general support, checkout the manual https://erpnext.com/docs/user/manual/en or use https://discuss.erpnext.com
|
||||
- For documentation issues, refer to https://github.com/frappe/erpnext_com
|
||||
2. Use the search function before creating a new issue. Duplicates will be closed and directed to
|
||||
the original discussion.
|
||||
3. When making a bug report, make sure you provide all required information. The easier it is for
|
||||
maintainers to reproduce, the faster it'll be fixed.
|
||||
4. If you think you know what the reason for the bug is, share it with us. Maybe put in a PR 😉
|
||||
-->
|
||||
|
||||
## Description of the issue
|
||||
|
||||
## Context information (for bug reports)
|
||||
|
||||
**Output of `bench version`**
|
||||
```
|
||||
(paste here)
|
||||
```
|
||||
|
||||
## Steps to reproduce the issue
|
||||
|
||||
1.
|
||||
2.
|
||||
3.
|
||||
|
||||
### Observed result
|
||||
|
||||
### Expected result
|
||||
|
||||
### Stacktrace / full error message
|
||||
|
||||
```
|
||||
(paste here)
|
||||
```
|
||||
|
||||
## Additional information
|
||||
|
||||
OS version / distribution, `ERPNext` install method, etc.
|
||||
5
.github/ISSUE_TEMPLATE/config.yml
vendored
5
.github/ISSUE_TEMPLATE/config.yml
vendored
@@ -1,5 +0,0 @@
|
||||
blank_issues_enabled: false
|
||||
contact_links:
|
||||
- name: Community Forum
|
||||
url: https://discuss.erpnext.com/
|
||||
about: For general QnA, discussions and community help.
|
||||
28
.github/ISSUE_TEMPLATE/feature_request.md
vendored
28
.github/ISSUE_TEMPLATE/feature_request.md
vendored
@@ -1,28 +0,0 @@
|
||||
---
|
||||
name: Feature request
|
||||
about: Suggest an idea to improve ERPNext
|
||||
labels: feature-request
|
||||
---
|
||||
|
||||
<!--
|
||||
Welcome to ERPNext issue tracker! Before creating an issue, please heed the following:
|
||||
|
||||
1. This tracker should only be used to report bugs and request features / enhancements to ERPNext
|
||||
- For questions and general support, checkout the manual https://erpnext.com/docs/user/manual/en or use https://discuss.erpnext.com
|
||||
- For documentation issues, refer to https://github.com/frappe/erpnext_com
|
||||
2. Use the search function before creating a new issue. Duplicates will be closed and directed to
|
||||
the original discussion.
|
||||
3. When making a feature request, make sure to be as verbose as possible. The better you convey your message, the greater the drive to make it happen.
|
||||
-->
|
||||
|
||||
**Is your feature request related to a problem? Please describe.**
|
||||
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
|
||||
|
||||
**Describe the solution you'd like**
|
||||
A clear and concise description of what you want to happen.
|
||||
|
||||
**Describe alternatives you've considered**
|
||||
A clear and concise description of any alternative solutions or features you've considered.
|
||||
|
||||
**Additional context**
|
||||
Add any other context or screenshots about the feature request here.
|
||||
@@ -1,17 +0,0 @@
|
||||
---
|
||||
name: Question about using ERPNext
|
||||
about: This is not the appropriate channel
|
||||
labels: invalid
|
||||
---
|
||||
|
||||
Please post on our forums:
|
||||
|
||||
for questions about using `ERPNext`: https://discuss.erpnext.com
|
||||
|
||||
for questions about using the `Frappe Framework`: ~~https://discuss.frappe.io~~ => [stackoverflow](https://stackoverflow.com/questions/tagged/frappe) tagged under `frappe`
|
||||
|
||||
for questions about using `bench`, probably the best place to start is the [bench repo](https://github.com/frappe/bench)
|
||||
|
||||
For documentation issues, use the [ERPNext Documentation](https://erpnext.com/docs/) or [Frappe Framework Documentation](https://frappe.io/docs/user/en) or the [developer cheetsheet](https://github.com/frappe/frappe/wiki/Developer-Cheatsheet)
|
||||
|
||||
> **Posts that are not bug reports or feature requests will not be addressed on this issue tracker.**
|
||||
33
.github/PULL_REQUEST_TEMPLATE.md
vendored
33
.github/PULL_REQUEST_TEMPLATE.md
vendored
@@ -1,33 +0,0 @@
|
||||
<!--
|
||||
|
||||
Some key notes before you open a PR:
|
||||
|
||||
1. Select which branch should this PR be merged in?
|
||||
2. PR name follows [convention](http://karma-runner.github.io/4.0/dev/git-commit-msg.html)
|
||||
3. All tests pass locally, UI and Unit tests
|
||||
4. All business logic and validations must be on the server-side
|
||||
5. Update necessary Documentation
|
||||
6. Put `closes #XXXX` in your comment to auto-close the issue that your PR fixes
|
||||
|
||||
|
||||
Also, if you're new here
|
||||
|
||||
- Documentation Guidelines => https://github.com/frappe/erpnext/wiki/Updating-Documentation
|
||||
|
||||
- Contribution Guide => https://github.com/frappe/erpnext/blob/develop/.github/CONTRIBUTING.md
|
||||
|
||||
- Pull Request Checklist => https://github.com/frappe/erpnext/wiki/Pull-Request-Checklist
|
||||
|
||||
-->
|
||||
|
||||
> Please provide enough information so that others can review your pull request:
|
||||
|
||||
<!-- You can skip this if you're fixing a typo or updating existing documentation -->
|
||||
|
||||
> Explain the **details** for making this change. What existing problem does the pull request solve?
|
||||
|
||||
<!-- Example: When "Adding a function to do X", explain why it is necessary to have a way to do X. -->
|
||||
|
||||
> Screenshots/GIFs
|
||||
|
||||
<!-- Add images/recordings to better visualize the change: expected/current behviour -->
|
||||
72
.github/helper/.flake8_strict
vendored
72
.github/helper/.flake8_strict
vendored
@@ -1,72 +0,0 @@
|
||||
[flake8]
|
||||
ignore =
|
||||
B007,
|
||||
B009,
|
||||
B010,
|
||||
B950,
|
||||
E101,
|
||||
E111,
|
||||
E114,
|
||||
E116,
|
||||
E117,
|
||||
E121,
|
||||
E122,
|
||||
E123,
|
||||
E124,
|
||||
E125,
|
||||
E126,
|
||||
E127,
|
||||
E128,
|
||||
E131,
|
||||
E201,
|
||||
E202,
|
||||
E203,
|
||||
E211,
|
||||
E221,
|
||||
E222,
|
||||
E223,
|
||||
E224,
|
||||
E225,
|
||||
E226,
|
||||
E228,
|
||||
E231,
|
||||
E241,
|
||||
E242,
|
||||
E251,
|
||||
E261,
|
||||
E262,
|
||||
E265,
|
||||
E266,
|
||||
E271,
|
||||
E272,
|
||||
E273,
|
||||
E274,
|
||||
E301,
|
||||
E302,
|
||||
E303,
|
||||
E305,
|
||||
E306,
|
||||
E402,
|
||||
E501,
|
||||
E502,
|
||||
E701,
|
||||
E702,
|
||||
E703,
|
||||
E741,
|
||||
F403,
|
||||
W191,
|
||||
W291,
|
||||
W292,
|
||||
W293,
|
||||
W391,
|
||||
W503,
|
||||
W504,
|
||||
E711,
|
||||
E129,
|
||||
F841,
|
||||
E713,
|
||||
E712,
|
||||
|
||||
|
||||
max-line-length = 200
|
||||
exclude=.github/helper/semgrep_rules,test_*.py
|
||||
54
.github/helper/documentation.py
vendored
54
.github/helper/documentation.py
vendored
@@ -1,54 +0,0 @@
|
||||
import sys
|
||||
from urllib.parse import urlparse
|
||||
|
||||
import requests
|
||||
|
||||
docs_repos = [
|
||||
"frappe_docs",
|
||||
"erpnext_documentation",
|
||||
"erpnext_com",
|
||||
"frappe_io",
|
||||
]
|
||||
|
||||
|
||||
def uri_validator(x):
|
||||
result = urlparse(x)
|
||||
return all([result.scheme, result.netloc, result.path])
|
||||
|
||||
def docs_link_exists(body):
|
||||
for line in body.splitlines():
|
||||
for word in line.split():
|
||||
if word.startswith('http') and uri_validator(word):
|
||||
parsed_url = urlparse(word)
|
||||
if parsed_url.netloc == "github.com":
|
||||
parts = parsed_url.path.split('/')
|
||||
if len(parts) == 5 and parts[1] == "frappe" and parts[2] in docs_repos:
|
||||
return True
|
||||
elif parsed_url.netloc == "docs.erpnext.com":
|
||||
return True
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
pr = sys.argv[1]
|
||||
response = requests.get("https://api.github.com/repos/frappe/erpnext/pulls/{}".format(pr))
|
||||
|
||||
if response.ok:
|
||||
payload = response.json()
|
||||
title = (payload.get("title") or "").lower().strip()
|
||||
head_sha = (payload.get("head") or {}).get("sha")
|
||||
body = (payload.get("body") or "").lower()
|
||||
|
||||
if (title.startswith("feat")
|
||||
and head_sha
|
||||
and "no-docs" not in body
|
||||
and "backport" not in body
|
||||
):
|
||||
if docs_link_exists(body):
|
||||
print("Documentation Link Found. You're Awesome! 🎉")
|
||||
|
||||
else:
|
||||
print("Documentation Link Not Found! ⚠️")
|
||||
sys.exit(1)
|
||||
|
||||
else:
|
||||
print("Skipping documentation checks... 🏃")
|
||||
41
.github/helper/install.sh
vendored
41
.github/helper/install.sh
vendored
@@ -1,41 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -e
|
||||
|
||||
cd ~ || exit
|
||||
|
||||
sudo apt-get install redis-server libcups2-dev
|
||||
|
||||
pip install frappe-bench
|
||||
|
||||
git clone https://github.com/frappe/frappe --branch "${GITHUB_BASE_REF:-${GITHUB_REF##*/}}" --depth 1
|
||||
bench init --skip-assets --frappe-path ~/frappe --python "$(which python)" frappe-bench
|
||||
|
||||
mkdir ~/frappe-bench/sites/test_site
|
||||
cp -r "${GITHUB_WORKSPACE}/.github/helper/site_config.json" ~/frappe-bench/sites/test_site/
|
||||
|
||||
mysql --host 127.0.0.1 --port 3306 -u root -e "SET GLOBAL character_set_server = 'utf8mb4'"
|
||||
mysql --host 127.0.0.1 --port 3306 -u root -e "SET GLOBAL collation_server = 'utf8mb4_unicode_ci'"
|
||||
|
||||
mysql --host 127.0.0.1 --port 3306 -u root -e "CREATE USER 'test_frappe'@'localhost' IDENTIFIED BY 'test_frappe'"
|
||||
mysql --host 127.0.0.1 --port 3306 -u root -e "CREATE DATABASE test_frappe"
|
||||
mysql --host 127.0.0.1 --port 3306 -u root -e "GRANT ALL PRIVILEGES ON \`test_frappe\`.* TO 'test_frappe'@'localhost'"
|
||||
|
||||
mysql --host 127.0.0.1 --port 3306 -u root -e "UPDATE mysql.user SET Password=PASSWORD('travis') WHERE User='root'"
|
||||
mysql --host 127.0.0.1 --port 3306 -u root -e "FLUSH PRIVILEGES"
|
||||
|
||||
wget -O /tmp/wkhtmltox.tar.xz https://github.com/frappe/wkhtmltopdf/raw/master/wkhtmltox-0.12.3_linux-generic-amd64.tar.xz
|
||||
tar -xf /tmp/wkhtmltox.tar.xz -C /tmp
|
||||
sudo mv /tmp/wkhtmltox/bin/wkhtmltopdf /usr/local/bin/wkhtmltopdf
|
||||
sudo chmod o+x /usr/local/bin/wkhtmltopdf
|
||||
|
||||
cd ~/frappe-bench || exit
|
||||
|
||||
sed -i 's/watch:/# watch:/g' Procfile
|
||||
sed -i 's/schedule:/# schedule:/g' Procfile
|
||||
sed -i 's/socketio:/# socketio:/g' Procfile
|
||||
sed -i 's/redis_socketio:/# redis_socketio:/g' Procfile
|
||||
|
||||
bench get-app erpnext "${GITHUB_WORKSPACE}"
|
||||
bench start &> bench_run_logs.txt &
|
||||
bench --site test_site reinstall --yes
|
||||
38
.github/helper/semgrep_rules/README.md
vendored
38
.github/helper/semgrep_rules/README.md
vendored
@@ -1,38 +0,0 @@
|
||||
# Semgrep linting
|
||||
|
||||
## What is semgrep?
|
||||
Semgrep or "semantic grep" is language agnostic static analysis tool. In simple terms semgrep is syntax-aware `grep`, so unlike regex it doesn't get confused by different ways of writing same thing or whitespaces or code split in multiple lines etc.
|
||||
|
||||
Example:
|
||||
|
||||
To check if a translate function is using f-string or not the regex would be `r"_\(\s*f[\"']"` while equivalent rule in semgrep would be `_(f"...")`. As semgrep knows grammer of language it takes care of unnecessary whitespace, type of quotation marks etc.
|
||||
|
||||
You can read more such examples in `.github/helper/semgrep_rules` directory.
|
||||
|
||||
# Why/when to use this?
|
||||
We want to maintain quality of contributions, at the same time remembering all the good practices can be pain to deal with while evaluating contributions. Using semgrep if you can translate "best practice" into a rule then it can automate the task for us.
|
||||
|
||||
## Running locally
|
||||
|
||||
Install semgrep using homebrew `brew install semgrep` or pip `pip install semgrep`.
|
||||
|
||||
To run locally use following command:
|
||||
|
||||
`semgrep --config=.github/helper/semgrep_rules [file/folder names]`
|
||||
|
||||
## Testing
|
||||
semgrep allows testing the tests. Refer to this page: https://semgrep.dev/docs/writing-rules/testing-rules/
|
||||
|
||||
When writing new rules you should write few positive and few negative cases as shown in the guide and current tests.
|
||||
|
||||
To run current tests: `semgrep --test --test-ignore-todo .github/helper/semgrep_rules`
|
||||
|
||||
|
||||
## Reference
|
||||
|
||||
If you are new to Semgrep read following pages to get started on writing/modifying rules:
|
||||
|
||||
- https://semgrep.dev/docs/getting-started/
|
||||
- https://semgrep.dev/docs/writing-rules/rule-syntax
|
||||
- https://semgrep.dev/docs/writing-rules/pattern-examples/
|
||||
- https://semgrep.dev/docs/writing-rules/rule-ideas/#common-use-cases
|
||||
@@ -1,63 +0,0 @@
|
||||
import frappe
|
||||
from frappe import _
|
||||
from frappe.model.document import Document
|
||||
|
||||
|
||||
# ruleid: frappe-modifying-but-not-comitting
|
||||
def on_submit(self):
|
||||
if self.value_of_goods == 0:
|
||||
frappe.throw(_('Value of goods cannot be 0'))
|
||||
self.status = 'Submitted'
|
||||
|
||||
|
||||
# ok: frappe-modifying-but-not-comitting
|
||||
def on_submit(self):
|
||||
if self.value_of_goods == 0:
|
||||
frappe.throw(_('Value of goods cannot be 0'))
|
||||
self.status = 'Submitted'
|
||||
self.db_set('status', 'Submitted')
|
||||
|
||||
# ok: frappe-modifying-but-not-comitting
|
||||
def on_submit(self):
|
||||
if self.value_of_goods == 0:
|
||||
frappe.throw(_('Value of goods cannot be 0'))
|
||||
x = "y"
|
||||
self.status = x
|
||||
self.db_set('status', x)
|
||||
|
||||
|
||||
# ok: frappe-modifying-but-not-comitting
|
||||
def on_submit(self):
|
||||
x = "y"
|
||||
self.status = x
|
||||
self.save()
|
||||
|
||||
# ruleid: frappe-modifying-but-not-comitting-other-method
|
||||
class DoctypeClass(Document):
|
||||
def on_submit(self):
|
||||
self.good_method()
|
||||
self.tainted_method()
|
||||
|
||||
def tainted_method(self):
|
||||
self.status = "uptate"
|
||||
|
||||
|
||||
# ok: frappe-modifying-but-not-comitting-other-method
|
||||
class DoctypeClass(Document):
|
||||
def on_submit(self):
|
||||
self.good_method()
|
||||
self.tainted_method()
|
||||
|
||||
def tainted_method(self):
|
||||
self.status = "update"
|
||||
self.db_set("status", "update")
|
||||
|
||||
# ok: frappe-modifying-but-not-comitting-other-method
|
||||
class DoctypeClass(Document):
|
||||
def on_submit(self):
|
||||
self.good_method()
|
||||
self.tainted_method()
|
||||
self.save()
|
||||
|
||||
def tainted_method(self):
|
||||
self.status = "uptate"
|
||||
151
.github/helper/semgrep_rules/frappe_correctness.yml
vendored
151
.github/helper/semgrep_rules/frappe_correctness.yml
vendored
@@ -1,151 +0,0 @@
|
||||
# This file specifies rules for correctness according to how frappe doctype data model works.
|
||||
|
||||
rules:
|
||||
- id: frappe-modifying-but-not-comitting
|
||||
patterns:
|
||||
- pattern: |
|
||||
def $METHOD(self, ...):
|
||||
...
|
||||
self.$ATTR = ...
|
||||
- pattern-not: |
|
||||
def $METHOD(self, ...):
|
||||
...
|
||||
self.$ATTR = ...
|
||||
...
|
||||
self.db_set(..., self.$ATTR, ...)
|
||||
- pattern-not: |
|
||||
def $METHOD(self, ...):
|
||||
...
|
||||
self.$ATTR = $SOME_VAR
|
||||
...
|
||||
self.db_set(..., $SOME_VAR, ...)
|
||||
- pattern-not: |
|
||||
def $METHOD(self, ...):
|
||||
...
|
||||
self.$ATTR = $SOME_VAR
|
||||
...
|
||||
self.save()
|
||||
- metavariable-regex:
|
||||
metavariable: '$ATTR'
|
||||
# this is negative look-ahead, add more attrs to ignore like (ignore|ignore_this_too|ignore_me)
|
||||
regex: '^(?!ignore_linked_doctypes|status_updater)(.*)$'
|
||||
- metavariable-regex:
|
||||
metavariable: "$METHOD"
|
||||
regex: "(on_submit|on_cancel)"
|
||||
message: |
|
||||
DocType modified in self.$METHOD. Please check if modification of self.$ATTR is commited to database.
|
||||
languages: [python]
|
||||
severity: ERROR
|
||||
|
||||
- id: frappe-modifying-but-not-comitting-other-method
|
||||
patterns:
|
||||
- pattern: |
|
||||
class $DOCTYPE(...):
|
||||
def $METHOD(self, ...):
|
||||
...
|
||||
self.$ANOTHER_METHOD()
|
||||
...
|
||||
|
||||
def $ANOTHER_METHOD(self, ...):
|
||||
...
|
||||
self.$ATTR = ...
|
||||
- pattern-not: |
|
||||
class $DOCTYPE(...):
|
||||
def $METHOD(self, ...):
|
||||
...
|
||||
self.$ANOTHER_METHOD()
|
||||
...
|
||||
|
||||
def $ANOTHER_METHOD(self, ...):
|
||||
...
|
||||
self.$ATTR = ...
|
||||
...
|
||||
self.db_set(..., self.$ATTR, ...)
|
||||
- pattern-not: |
|
||||
class $DOCTYPE(...):
|
||||
def $METHOD(self, ...):
|
||||
...
|
||||
self.$ANOTHER_METHOD()
|
||||
...
|
||||
|
||||
def $ANOTHER_METHOD(self, ...):
|
||||
...
|
||||
self.$ATTR = $SOME_VAR
|
||||
...
|
||||
self.db_set(..., $SOME_VAR, ...)
|
||||
- pattern-not: |
|
||||
class $DOCTYPE(...):
|
||||
def $METHOD(self, ...):
|
||||
...
|
||||
self.$ANOTHER_METHOD()
|
||||
...
|
||||
self.save()
|
||||
def $ANOTHER_METHOD(self, ...):
|
||||
...
|
||||
self.$ATTR = ...
|
||||
- metavariable-regex:
|
||||
metavariable: "$METHOD"
|
||||
regex: "(on_submit|on_cancel)"
|
||||
message: |
|
||||
self.$ANOTHER_METHOD is called from self.$METHOD, check if changes to self.$ATTR are commited to database.
|
||||
languages: [python]
|
||||
severity: ERROR
|
||||
|
||||
- id: frappe-print-function-in-doctypes
|
||||
pattern: print(...)
|
||||
message: |
|
||||
Did you mean to leave this print statement in? Consider using msgprint or logger instead of print statement.
|
||||
languages: [python]
|
||||
severity: WARNING
|
||||
paths:
|
||||
include:
|
||||
- "*/**/doctype/*"
|
||||
|
||||
- id: frappe-modifying-child-tables-while-iterating
|
||||
pattern-either:
|
||||
- pattern: |
|
||||
for $ROW in self.$TABLE:
|
||||
...
|
||||
self.remove(...)
|
||||
- pattern: |
|
||||
for $ROW in self.$TABLE:
|
||||
...
|
||||
self.append(...)
|
||||
message: |
|
||||
Child table being modified while iterating on it.
|
||||
languages: [python]
|
||||
severity: ERROR
|
||||
paths:
|
||||
include:
|
||||
- "*/**/doctype/*"
|
||||
|
||||
- id: frappe-same-key-assigned-twice
|
||||
pattern-either:
|
||||
- pattern: |
|
||||
{..., $X: $A, ..., $X: $B, ...}
|
||||
- pattern: |
|
||||
dict(..., ($X, $A), ..., ($X, $B), ...)
|
||||
- pattern: |
|
||||
_dict(..., ($X, $A), ..., ($X, $B), ...)
|
||||
message: |
|
||||
key `$X` is uselessly assigned twice. This could be a potential bug.
|
||||
languages: [python]
|
||||
severity: ERROR
|
||||
|
||||
|
||||
- id: frappe-manual-commit
|
||||
patterns:
|
||||
- pattern: frappe.db.commit()
|
||||
- pattern-not-inside: |
|
||||
try:
|
||||
...
|
||||
except ...:
|
||||
...
|
||||
message: |
|
||||
Manually commiting a transaction is highly discouraged. Read about the transaction model implemented by Frappe Framework before adding manual commits: https://frappeframework.com/docs/user/en/api/database#database-transaction-model If you think manual commit is required then add a comment explaining why and `// nosemgrep` on the same line.
|
||||
paths:
|
||||
exclude:
|
||||
- "**/patches/**"
|
||||
- "**/demo/**"
|
||||
languages: [python]
|
||||
severity: ERROR
|
||||
14
.github/helper/semgrep_rules/report.py
vendored
14
.github/helper/semgrep_rules/report.py
vendored
@@ -1,14 +0,0 @@
|
||||
from frappe import _
|
||||
|
||||
# ruleid: frappe-missing-translate-function-in-report-python
|
||||
{"label": "Field Label"}
|
||||
|
||||
# ruleid: frappe-missing-translate-function-in-report-python
|
||||
dict(label="Field Label")
|
||||
|
||||
|
||||
# ok: frappe-missing-translate-function-in-report-python
|
||||
{"label": _("Field Label")}
|
||||
|
||||
# ok: frappe-missing-translate-function-in-report-python
|
||||
dict(label=_("Field Label"))
|
||||
34
.github/helper/semgrep_rules/report.yml
vendored
34
.github/helper/semgrep_rules/report.yml
vendored
@@ -1,34 +0,0 @@
|
||||
rules:
|
||||
- id: frappe-missing-translate-function-in-report-python
|
||||
paths:
|
||||
include:
|
||||
- "**/report"
|
||||
exclude:
|
||||
- "**/regional"
|
||||
pattern-either:
|
||||
- patterns:
|
||||
- pattern: |
|
||||
{..., "label": "...", ...}
|
||||
- pattern-not: |
|
||||
{..., "label": _("..."), ...}
|
||||
- patterns:
|
||||
- pattern: dict(..., label="...", ...)
|
||||
- pattern-not: dict(..., label=_("..."), ...)
|
||||
message: |
|
||||
All user facing text must be wrapped in translate function. Please refer to translation documentation. https://frappeframework.com/docs/user/en/guides/basics/translations
|
||||
languages: [python]
|
||||
severity: ERROR
|
||||
|
||||
- id: frappe-translated-values-in-business-logic
|
||||
paths:
|
||||
include:
|
||||
- "**/report"
|
||||
patterns:
|
||||
- pattern-inside: |
|
||||
{..., filters: [...], ...}
|
||||
- pattern: |
|
||||
{..., options: [..., __("..."), ...], ...}
|
||||
message: |
|
||||
Using translated values in options field will require you to translate the values while comparing in business logic. Instead of passing translated labels provide objects that contain both label and value. e.g. { label: __("Option value"), value: "Option value"}
|
||||
languages: [javascript]
|
||||
severity: ERROR
|
||||
6
.github/helper/semgrep_rules/security.py
vendored
6
.github/helper/semgrep_rules/security.py
vendored
@@ -1,6 +0,0 @@
|
||||
def function_name(input):
|
||||
# ruleid: frappe-codeinjection-eval
|
||||
eval(input)
|
||||
|
||||
# ok: frappe-codeinjection-eval
|
||||
eval("1 + 1")
|
||||
10
.github/helper/semgrep_rules/security.yml
vendored
10
.github/helper/semgrep_rules/security.yml
vendored
@@ -1,10 +0,0 @@
|
||||
rules:
|
||||
- id: frappe-codeinjection-eval
|
||||
patterns:
|
||||
- pattern-not: eval("...")
|
||||
- pattern: eval(...)
|
||||
message: |
|
||||
Detected the use of eval(). eval() can be dangerous if used to evaluate
|
||||
dynamic content. Avoid it or use safe_eval().
|
||||
languages: [python]
|
||||
severity: ERROR
|
||||
44
.github/helper/semgrep_rules/translate.js
vendored
44
.github/helper/semgrep_rules/translate.js
vendored
@@ -1,44 +0,0 @@
|
||||
// ruleid: frappe-translation-empty-string
|
||||
__("")
|
||||
// ruleid: frappe-translation-empty-string
|
||||
__('')
|
||||
|
||||
// ok: frappe-translation-js-formatting
|
||||
__('Welcome {0}, get started with ERPNext in just a few clicks.', [full_name]);
|
||||
|
||||
// ruleid: frappe-translation-js-formatting
|
||||
__(`Welcome ${full_name}, get started with ERPNext in just a few clicks.`);
|
||||
|
||||
// ok: frappe-translation-js-formatting
|
||||
__('This is fine');
|
||||
|
||||
|
||||
// ok: frappe-translation-trailing-spaces
|
||||
__('This is fine');
|
||||
|
||||
// ruleid: frappe-translation-trailing-spaces
|
||||
__(' this is not ok ');
|
||||
// ruleid: frappe-translation-trailing-spaces
|
||||
__('this is not ok ');
|
||||
// ruleid: frappe-translation-trailing-spaces
|
||||
__(' this is not ok');
|
||||
|
||||
// ok: frappe-translation-js-splitting
|
||||
__('You have {0} subscribers in your mailing list.', [subscribers.length])
|
||||
|
||||
// todoruleid: frappe-translation-js-splitting
|
||||
__('You have') + subscribers.length + __('subscribers in your mailing list.')
|
||||
|
||||
// ruleid: frappe-translation-js-splitting
|
||||
__('You have' + 'subscribers in your mailing list.')
|
||||
|
||||
// ruleid: frappe-translation-js-splitting
|
||||
__('You have {0} subscribers' +
|
||||
'in your mailing list', [subscribers.length])
|
||||
|
||||
// ok: frappe-translation-js-splitting
|
||||
__("Ctrl+Enter to add comment")
|
||||
|
||||
// ruleid: frappe-translation-js-splitting
|
||||
__('You have {0} subscribers \
|
||||
in your mailing list', [subscribers.length])
|
||||
61
.github/helper/semgrep_rules/translate.py
vendored
61
.github/helper/semgrep_rules/translate.py
vendored
@@ -1,61 +0,0 @@
|
||||
# Examples taken from https://frappeframework.com/docs/user/en/translations
|
||||
# This file is used for testing the tests.
|
||||
|
||||
from frappe import _
|
||||
|
||||
full_name = "Jon Doe"
|
||||
# ok: frappe-translation-python-formatting
|
||||
_('Welcome {0}, get started with ERPNext in just a few clicks.').format(full_name)
|
||||
|
||||
# ruleid: frappe-translation-python-formatting
|
||||
_('Welcome %s, get started with ERPNext in just a few clicks.' % full_name)
|
||||
# ruleid: frappe-translation-python-formatting
|
||||
_('Welcome %(name)s, get started with ERPNext in just a few clicks.' % {'name': full_name})
|
||||
|
||||
# ruleid: frappe-translation-python-formatting
|
||||
_('Welcome {0}, get started with ERPNext in just a few clicks.'.format(full_name))
|
||||
|
||||
|
||||
subscribers = ["Jon", "Doe"]
|
||||
# ok: frappe-translation-python-formatting
|
||||
_('You have {0} subscribers in your mailing list.').format(len(subscribers))
|
||||
|
||||
# ruleid: frappe-translation-python-splitting
|
||||
_('You have') + len(subscribers) + _('subscribers in your mailing list.')
|
||||
|
||||
# ruleid: frappe-translation-python-splitting
|
||||
_('You have {0} subscribers \
|
||||
in your mailing list').format(len(subscribers))
|
||||
|
||||
# ok: frappe-translation-python-splitting
|
||||
_('You have {0} subscribers') \
|
||||
+ 'in your mailing list'
|
||||
|
||||
# ruleid: frappe-translation-trailing-spaces
|
||||
msg = _(" You have {0} pending invoice ")
|
||||
# ruleid: frappe-translation-trailing-spaces
|
||||
msg = _("You have {0} pending invoice ")
|
||||
# ruleid: frappe-translation-trailing-spaces
|
||||
msg = _(" You have {0} pending invoice")
|
||||
|
||||
# ok: frappe-translation-trailing-spaces
|
||||
msg = ' ' + _("You have {0} pending invoices") + ' '
|
||||
|
||||
# ruleid: frappe-translation-python-formatting
|
||||
_(f"can not format like this - {subscribers}")
|
||||
# ruleid: frappe-translation-python-splitting
|
||||
_(f"what" + f"this is also not cool")
|
||||
|
||||
|
||||
# ruleid: frappe-translation-empty-string
|
||||
_("")
|
||||
# ruleid: frappe-translation-empty-string
|
||||
_('')
|
||||
|
||||
|
||||
class Test:
|
||||
# ok: frappe-translation-python-splitting
|
||||
def __init__(
|
||||
args
|
||||
):
|
||||
pass
|
||||
64
.github/helper/semgrep_rules/translate.yml
vendored
64
.github/helper/semgrep_rules/translate.yml
vendored
@@ -1,64 +0,0 @@
|
||||
rules:
|
||||
- id: frappe-translation-empty-string
|
||||
pattern-either:
|
||||
- pattern: _("")
|
||||
- pattern: __("")
|
||||
message: |
|
||||
Empty string is useless for translation.
|
||||
Please refer: https://frappeframework.com/docs/user/en/translations
|
||||
languages: [python, javascript, json]
|
||||
severity: ERROR
|
||||
|
||||
- id: frappe-translation-trailing-spaces
|
||||
pattern-either:
|
||||
- pattern: _("=~/(^[ \t]+|[ \t]+$)/")
|
||||
- pattern: __("=~/(^[ \t]+|[ \t]+$)/")
|
||||
message: |
|
||||
Trailing or leading whitespace not allowed in translate strings.
|
||||
Please refer: https://frappeframework.com/docs/user/en/translations
|
||||
languages: [python, javascript, json]
|
||||
severity: ERROR
|
||||
|
||||
- id: frappe-translation-python-formatting
|
||||
pattern-either:
|
||||
- pattern: _("..." % ...)
|
||||
- pattern: _("...".format(...))
|
||||
- pattern: _(f"...")
|
||||
message: |
|
||||
Only positional formatters are allowed and formatting should not be done before translating.
|
||||
Please refer: https://frappeframework.com/docs/user/en/translations
|
||||
languages: [python]
|
||||
severity: ERROR
|
||||
|
||||
- id: frappe-translation-js-formatting
|
||||
patterns:
|
||||
- pattern: __(`...`)
|
||||
- pattern-not: __("...")
|
||||
message: |
|
||||
Template strings are not allowed for text formatting.
|
||||
Please refer: https://frappeframework.com/docs/user/en/translations
|
||||
languages: [javascript, json]
|
||||
severity: ERROR
|
||||
|
||||
- id: frappe-translation-python-splitting
|
||||
pattern-either:
|
||||
- pattern: _(...) + _(...)
|
||||
- pattern: _("..." + "...")
|
||||
- pattern-regex: '[\s\.]_\([^\)]*\\\s*' # lines broken by `\`
|
||||
- pattern-regex: '[\s\.]_\(\s*\n' # line breaks allowed by python for using ( )
|
||||
message: |
|
||||
Do not split strings inside translate function. Do not concatenate using translate functions.
|
||||
Please refer: https://frappeframework.com/docs/user/en/translations
|
||||
languages: [python]
|
||||
severity: ERROR
|
||||
|
||||
- id: frappe-translation-js-splitting
|
||||
pattern-either:
|
||||
- pattern-regex: '__\([^\)]*[\\]\s+'
|
||||
- pattern: __('...' + '...', ...)
|
||||
- pattern: __('...') + __('...')
|
||||
message: |
|
||||
Do not split strings inside translate function. Do not concatenate using translate functions.
|
||||
Please refer: https://frappeframework.com/docs/user/en/translations
|
||||
languages: [javascript, json]
|
||||
severity: ERROR
|
||||
9
.github/helper/semgrep_rules/ux.js
vendored
9
.github/helper/semgrep_rules/ux.js
vendored
@@ -1,9 +0,0 @@
|
||||
|
||||
// ok: frappe-missing-translate-function-js
|
||||
frappe.msgprint('{{ _("Both login and password required") }}');
|
||||
|
||||
// ruleid: frappe-missing-translate-function-js
|
||||
frappe.msgprint('What');
|
||||
|
||||
// ok: frappe-missing-translate-function-js
|
||||
frappe.throw(' {{ _("Both login and password required") }}. ');
|
||||
30
.github/helper/semgrep_rules/ux.py
vendored
30
.github/helper/semgrep_rules/ux.py
vendored
@@ -1,30 +0,0 @@
|
||||
import frappe
|
||||
from frappe import _, msgprint, throw
|
||||
|
||||
# ruleid: frappe-missing-translate-function-python
|
||||
throw("Error Occured")
|
||||
|
||||
# ruleid: frappe-missing-translate-function-python
|
||||
frappe.throw("Error Occured")
|
||||
|
||||
# ruleid: frappe-missing-translate-function-python
|
||||
frappe.msgprint("Useful message")
|
||||
|
||||
# ruleid: frappe-missing-translate-function-python
|
||||
msgprint("Useful message")
|
||||
|
||||
|
||||
# ok: frappe-missing-translate-function-python
|
||||
translatedmessage = _("Hello")
|
||||
|
||||
# ok: frappe-missing-translate-function-python
|
||||
throw(translatedmessage)
|
||||
|
||||
# ok: frappe-missing-translate-function-python
|
||||
msgprint(translatedmessage)
|
||||
|
||||
# ok: frappe-missing-translate-function-python
|
||||
msgprint(_("Helpful message"))
|
||||
|
||||
# ok: frappe-missing-translate-function-python
|
||||
frappe.throw(_("Error occured"))
|
||||
30
.github/helper/semgrep_rules/ux.yml
vendored
30
.github/helper/semgrep_rules/ux.yml
vendored
@@ -1,30 +0,0 @@
|
||||
rules:
|
||||
- id: frappe-missing-translate-function-python
|
||||
pattern-either:
|
||||
- patterns:
|
||||
- pattern: frappe.msgprint("...", ...)
|
||||
- pattern-not: frappe.msgprint(_("..."), ...)
|
||||
- patterns:
|
||||
- pattern: frappe.throw("...", ...)
|
||||
- pattern-not: frappe.throw(_("..."), ...)
|
||||
message: |
|
||||
All user facing text must be wrapped in translate function. Please refer to translation documentation. https://frappeframework.com/docs/user/en/guides/basics/translations
|
||||
languages: [python]
|
||||
severity: ERROR
|
||||
|
||||
- id: frappe-missing-translate-function-js
|
||||
pattern-either:
|
||||
- patterns:
|
||||
- pattern: frappe.msgprint("...", ...)
|
||||
- pattern-not: frappe.msgprint(__("..."), ...)
|
||||
# ignore microtemplating e.g. msgprint("{{ _("server side translation") }}")
|
||||
- pattern-not: frappe.msgprint("=~/\{\{.*\_.*\}\}/i", ...)
|
||||
- patterns:
|
||||
- pattern: frappe.throw("...", ...)
|
||||
- pattern-not: frappe.throw(__("..."), ...)
|
||||
# ignore microtemplating
|
||||
- pattern-not: frappe.throw("=~/\{\{.*\_.*\}\}/i", ...)
|
||||
message: |
|
||||
All user facing text must be wrapped in translate function. Please refer to translation documentation. https://frappeframework.com/docs/user/en/guides/basics/translations
|
||||
languages: [javascript]
|
||||
severity: ERROR
|
||||
16
.github/helper/site_config.json
vendored
16
.github/helper/site_config.json
vendored
@@ -1,16 +0,0 @@
|
||||
{
|
||||
"db_host": "127.0.0.1",
|
||||
"db_port": 3306,
|
||||
"db_name": "test_frappe",
|
||||
"db_password": "test_frappe",
|
||||
"auto_email_id": "test@example.com",
|
||||
"mail_server": "smtp.example.com",
|
||||
"mail_login": "test@example.com",
|
||||
"mail_password": "test",
|
||||
"admin_password": "admin",
|
||||
"root_login": "root",
|
||||
"root_password": "travis",
|
||||
"host_name": "http://test_site:8000",
|
||||
"install_apps": ["erpnext"],
|
||||
"throttle_user_limit": 100
|
||||
}
|
||||
60
.github/helper/translation.py
vendored
60
.github/helper/translation.py
vendored
@@ -1,60 +0,0 @@
|
||||
import re
|
||||
import sys
|
||||
|
||||
errors_encounter = 0
|
||||
pattern = re.compile(r"_\(([\"']{,3})(?P<message>((?!\1).)*)\1(\s*,\s*context\s*=\s*([\"'])(?P<py_context>((?!\5).)*)\5)*(\s*,(\s*?.*?\n*?)*(,\s*([\"'])(?P<js_context>((?!\11).)*)\11)*)*\)")
|
||||
words_pattern = re.compile(r"_{1,2}\([\"'`]{1,3}.*?[a-zA-Z]")
|
||||
start_pattern = re.compile(r"_{1,2}\([f\"'`]{1,3}")
|
||||
f_string_pattern = re.compile(r"_\(f[\"']")
|
||||
starts_with_f_pattern = re.compile(r"_\(f")
|
||||
|
||||
# skip first argument
|
||||
files = sys.argv[1:]
|
||||
files_to_scan = [_file for _file in files if _file.endswith(('.py', '.js'))]
|
||||
|
||||
for _file in files_to_scan:
|
||||
with open(_file, 'r') as f:
|
||||
print(f'Checking: {_file}')
|
||||
file_lines = f.readlines()
|
||||
for line_number, line in enumerate(file_lines, 1):
|
||||
if 'frappe-lint: disable-translate' in line:
|
||||
continue
|
||||
|
||||
start_matches = start_pattern.search(line)
|
||||
if start_matches:
|
||||
starts_with_f = starts_with_f_pattern.search(line)
|
||||
|
||||
if starts_with_f:
|
||||
has_f_string = f_string_pattern.search(line)
|
||||
if has_f_string:
|
||||
errors_encounter += 1
|
||||
print(f'\nF-strings are not supported for translations at line number {line_number}\n{line.strip()[:100]}')
|
||||
continue
|
||||
else:
|
||||
continue
|
||||
|
||||
match = pattern.search(line)
|
||||
error_found = False
|
||||
|
||||
if not match and line.endswith((',\n', '[\n')):
|
||||
# concat remaining text to validate multiline pattern
|
||||
line = "".join(file_lines[line_number - 1:])
|
||||
line = line[start_matches.start() + 1:]
|
||||
match = pattern.match(line)
|
||||
|
||||
if not match:
|
||||
error_found = True
|
||||
print(f'\nTranslation syntax error at line number {line_number}\n{line.strip()[:100]}')
|
||||
|
||||
if not error_found and not words_pattern.search(line):
|
||||
error_found = True
|
||||
print(f'\nTranslation is useless because it has no words at line number {line_number}\n{line.strip()[:100]}')
|
||||
|
||||
if error_found:
|
||||
errors_encounter += 1
|
||||
|
||||
if errors_encounter > 0:
|
||||
print('\nVisit "https://frappeframework.com/docs/user/en/translations" to learn about valid translation strings.')
|
||||
sys.exit(1)
|
||||
else:
|
||||
print('\nGood To Go!')
|
||||
34
.github/stale.yml
vendored
34
.github/stale.yml
vendored
@@ -1,34 +0,0 @@
|
||||
# Configuration for probot-stale - https://github.com/probot/stale
|
||||
|
||||
# Number of days of inactivity before an Issue or Pull Request becomes stale
|
||||
daysUntilStale: 30
|
||||
|
||||
# Number of days of inactivity before a stale Issue or Pull Request is closed.
|
||||
# Set to false to disable. If disabled, issues still need to be closed manually, but will remain marked as stale.
|
||||
daysUntilClose: 7
|
||||
|
||||
# Issues or Pull Requests with these labels will never be considered stale. Set to `[]` to disable
|
||||
exemptLabels:
|
||||
- hotfix
|
||||
|
||||
# Set to true to ignore issues in a project (defaults to false)
|
||||
exemptProjects: false
|
||||
|
||||
# Set to true to ignore issues in a milestone (defaults to false)
|
||||
exemptMilestones: true
|
||||
|
||||
# Label to use when marking as stale
|
||||
staleLabel: inactive
|
||||
|
||||
# Comment to post when marking as stale. Set to `false` to disable
|
||||
markComment: >
|
||||
This pull request has been automatically marked as stale because it has not had
|
||||
recent activity. It will be closed within a week if no further activity occurs, but it
|
||||
only takes a comment to keep a contribution alive :) Also, even if it is closed,
|
||||
you can always reopen the PR when you're ready. Thank you for contributing.
|
||||
|
||||
# Limit the number of actions per hour, from 1-30. Default is 30
|
||||
limitPerRun: 30
|
||||
|
||||
# Limit to only `issues` or `pulls`
|
||||
only: pulls
|
||||
25
.github/workflows/backport.yml
vendored
25
.github/workflows/backport.yml
vendored
@@ -1,25 +0,0 @@
|
||||
name: Backport
|
||||
on:
|
||||
pull_request_target:
|
||||
types:
|
||||
- closed
|
||||
- labeled
|
||||
|
||||
jobs:
|
||||
main:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout Actions
|
||||
uses: actions/checkout@v2
|
||||
with:
|
||||
repository: "frappe/backport"
|
||||
path: ./actions
|
||||
ref: develop
|
||||
- name: Install Actions
|
||||
run: npm install --production --prefix ./actions
|
||||
- name: Run backport
|
||||
uses: ./actions/backport
|
||||
with:
|
||||
token: ${{secrets.BACKPORT_BOT_TOKEN}}
|
||||
labelsToAdd: "backport"
|
||||
title: "{{originalTitle}}"
|
||||
14
.github/workflows/docker-release.yml
vendored
14
.github/workflows/docker-release.yml
vendored
@@ -1,14 +0,0 @@
|
||||
name: Trigger Docker build on release
|
||||
on:
|
||||
release:
|
||||
types: [released]
|
||||
jobs:
|
||||
curl:
|
||||
runs-on: ubuntu-latest
|
||||
container:
|
||||
image: alpine:latest
|
||||
steps:
|
||||
- name: curl
|
||||
run: |
|
||||
apk add curl bash
|
||||
curl -s -X POST -H "Content-Type: application/json" -H "Accept: application/json" -H "Travis-API-Version: 3" -H "Authorization: token ${{ secrets.TRAVIS_CI_TOKEN }}" -d '{"request":{"branch":"master"}}' https://api.travis-ci.com/repo/frappe%2Ffrappe_docker/requests
|
||||
24
.github/workflows/docs-checker.yml
vendored
24
.github/workflows/docs-checker.yml
vendored
@@ -1,24 +0,0 @@
|
||||
name: 'Documentation Required'
|
||||
on:
|
||||
pull_request:
|
||||
types: [ opened, synchronize, reopened, edited ]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: 'Setup Environment'
|
||||
uses: actions/setup-python@v2
|
||||
with:
|
||||
python-version: 3.6
|
||||
|
||||
- name: 'Clone repo'
|
||||
uses: actions/checkout@v2
|
||||
|
||||
- name: Validate Docs
|
||||
env:
|
||||
PR_NUMBER: ${{ github.event.number }}
|
||||
run: |
|
||||
pip install requests --quiet
|
||||
python $GITHUB_WORKSPACE/.github/helper/documentation.py $PR_NUMBER
|
||||
27
.github/workflows/linters.yml
vendored
27
.github/workflows/linters.yml
vendored
@@ -1,27 +0,0 @@
|
||||
name: Linters
|
||||
|
||||
on:
|
||||
pull_request: { }
|
||||
|
||||
jobs:
|
||||
|
||||
linters:
|
||||
name: linters
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: returntocorp/semgrep-action@v1
|
||||
env:
|
||||
SEMGREP_TIMEOUT: 120
|
||||
with:
|
||||
config: >-
|
||||
r/python.lang.correctness
|
||||
.github/helper/semgrep_rules
|
||||
|
||||
- name: Set up Python 3.8
|
||||
uses: actions/setup-python@v2
|
||||
with:
|
||||
python-version: 3.8
|
||||
|
||||
- name: Install and Run Pre-commit
|
||||
uses: pre-commit/action@v2.0.0
|
||||
85
.github/workflows/patch.yml
vendored
85
.github/workflows/patch.yml
vendored
@@ -1,85 +0,0 @@
|
||||
name: Patch
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
paths-ignore:
|
||||
- '**.js'
|
||||
- '**.md'
|
||||
workflow_dispatch:
|
||||
|
||||
|
||||
jobs:
|
||||
test:
|
||||
runs-on: ubuntu-18.04
|
||||
|
||||
name: Patch Test
|
||||
|
||||
services:
|
||||
mysql:
|
||||
image: mariadb:10.3
|
||||
env:
|
||||
MYSQL_ALLOW_EMPTY_PASSWORD: YES
|
||||
ports:
|
||||
- 3306:3306
|
||||
options: --health-cmd="mysqladmin ping" --health-interval=5s --health-timeout=2s --health-retries=3
|
||||
|
||||
steps:
|
||||
- name: Clone
|
||||
uses: actions/checkout@v2
|
||||
|
||||
- name: Setup Python
|
||||
uses: actions/setup-python@v2
|
||||
with:
|
||||
python-version: 3.6
|
||||
|
||||
- name: Setup Node
|
||||
uses: actions/setup-node@v2
|
||||
with:
|
||||
node-version: 12
|
||||
check-latest: true
|
||||
|
||||
- name: Add to Hosts
|
||||
run: echo "127.0.0.1 test_site" | sudo tee -a /etc/hosts
|
||||
|
||||
- name: Cache pip
|
||||
uses: actions/cache@v2
|
||||
with:
|
||||
path: ~/.cache/pip
|
||||
key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}
|
||||
restore-keys: |
|
||||
${{ runner.os }}-pip-
|
||||
${{ runner.os }}-
|
||||
|
||||
- name: Cache node modules
|
||||
uses: actions/cache@v2
|
||||
env:
|
||||
cache-name: cache-node-modules
|
||||
with:
|
||||
path: ~/.npm
|
||||
key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }}
|
||||
restore-keys: |
|
||||
${{ runner.os }}-build-${{ env.cache-name }}-
|
||||
${{ runner.os }}-build-
|
||||
${{ runner.os }}-
|
||||
|
||||
- name: Get yarn cache directory path
|
||||
id: yarn-cache-dir-path
|
||||
run: echo "::set-output name=dir::$(yarn cache dir)"
|
||||
|
||||
- uses: actions/cache@v2
|
||||
id: yarn-cache
|
||||
with:
|
||||
path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
|
||||
key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
|
||||
restore-keys: |
|
||||
${{ runner.os }}-yarn-
|
||||
|
||||
- name: Install
|
||||
run: bash ${GITHUB_WORKSPACE}/.github/helper/install.sh
|
||||
|
||||
- name: Run Patch Tests
|
||||
run: |
|
||||
cd ~/frappe-bench/
|
||||
wget https://erpnext.com/files/v10-erpnext.sql.gz
|
||||
bench --site test_site --force restore ~/frappe-bench/v10-erpnext.sql.gz
|
||||
bench --site test_site migrate
|
||||
126
.github/workflows/server-tests.yml
vendored
126
.github/workflows/server-tests.yml
vendored
@@ -1,126 +0,0 @@
|
||||
name: Server
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
paths-ignore:
|
||||
- '**.js'
|
||||
- '**.md'
|
||||
workflow_dispatch:
|
||||
push:
|
||||
branches: [ develop ]
|
||||
paths-ignore:
|
||||
- '**.js'
|
||||
- '**.md'
|
||||
|
||||
jobs:
|
||||
test:
|
||||
runs-on: ubuntu-18.04
|
||||
|
||||
strategy:
|
||||
fail-fast: false
|
||||
|
||||
matrix:
|
||||
container: [1, 2, 3]
|
||||
|
||||
name: Python Unit Tests
|
||||
|
||||
services:
|
||||
mysql:
|
||||
image: mariadb:10.3
|
||||
env:
|
||||
MYSQL_ALLOW_EMPTY_PASSWORD: YES
|
||||
ports:
|
||||
- 3306:3306
|
||||
options: --health-cmd="mysqladmin ping" --health-interval=5s --health-timeout=2s --health-retries=3
|
||||
|
||||
steps:
|
||||
- name: Clone
|
||||
uses: actions/checkout@v2
|
||||
|
||||
- name: Setup Python
|
||||
uses: actions/setup-python@v2
|
||||
with:
|
||||
python-version: 3.7
|
||||
|
||||
- name: Setup Node
|
||||
uses: actions/setup-node@v2
|
||||
with:
|
||||
node-version: 12
|
||||
check-latest: true
|
||||
|
||||
- name: Add to Hosts
|
||||
run: echo "127.0.0.1 test_site" | sudo tee -a /etc/hosts
|
||||
|
||||
- name: Cache pip
|
||||
uses: actions/cache@v2
|
||||
with:
|
||||
path: ~/.cache/pip
|
||||
key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}
|
||||
restore-keys: |
|
||||
${{ runner.os }}-pip-
|
||||
${{ runner.os }}-
|
||||
|
||||
- name: Cache node modules
|
||||
uses: actions/cache@v2
|
||||
env:
|
||||
cache-name: cache-node-modules
|
||||
with:
|
||||
path: ~/.npm
|
||||
key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }}
|
||||
restore-keys: |
|
||||
${{ runner.os }}-build-${{ env.cache-name }}-
|
||||
${{ runner.os }}-build-
|
||||
${{ runner.os }}-
|
||||
|
||||
- name: Get yarn cache directory path
|
||||
id: yarn-cache-dir-path
|
||||
run: echo "::set-output name=dir::$(yarn cache dir)"
|
||||
|
||||
- uses: actions/cache@v2
|
||||
id: yarn-cache
|
||||
with:
|
||||
path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
|
||||
key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
|
||||
restore-keys: |
|
||||
${{ runner.os }}-yarn-
|
||||
|
||||
- name: Install
|
||||
run: bash ${GITHUB_WORKSPACE}/.github/helper/install.sh
|
||||
|
||||
- name: Run Tests
|
||||
run: cd ~/frappe-bench/ && bench --site test_site run-parallel-tests --app erpnext --use-orchestrator --with-coverage
|
||||
env:
|
||||
TYPE: server
|
||||
CI_BUILD_ID: ${{ github.run_id }}
|
||||
ORCHESTRATOR_URL: http://test-orchestrator.frappe.io
|
||||
|
||||
- name: Upload Coverage Data
|
||||
run: |
|
||||
cp ~/frappe-bench/sites/.coverage ${GITHUB_WORKSPACE}
|
||||
cd ${GITHUB_WORKSPACE}
|
||||
pip3 install coverage==5.5
|
||||
pip3 install coveralls==3.0.1
|
||||
coveralls
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
COVERALLS_FLAG_NAME: run-${{ matrix.container }}
|
||||
COVERALLS_SERVICE_NAME: ${{ github.event_name == 'pull_request' && 'github' || 'github-actions' }}
|
||||
COVERALLS_PARALLEL: true
|
||||
|
||||
coveralls:
|
||||
name: Coverage Wrap Up
|
||||
needs: test
|
||||
container: python:3-slim
|
||||
runs-on: ubuntu-18.04
|
||||
steps:
|
||||
- name: Clone
|
||||
uses: actions/checkout@v2
|
||||
|
||||
- name: Coveralls Finished
|
||||
run: |
|
||||
cd ${GITHUB_WORKSPACE}
|
||||
pip3 install coverage==5.5
|
||||
pip3 install coveralls==3.0.1
|
||||
coveralls --finish
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
22
.github/workflows/translation_linter.yml
vendored
22
.github/workflows/translation_linter.yml
vendored
@@ -1,22 +0,0 @@
|
||||
name: Frappe Linter
|
||||
on:
|
||||
pull_request:
|
||||
branches:
|
||||
- develop
|
||||
- version-12-hotfix
|
||||
- version-11-hotfix
|
||||
jobs:
|
||||
check_translation:
|
||||
name: Translation Syntax Check
|
||||
runs-on: ubuntu-18.04
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Setup python3
|
||||
uses: actions/setup-python@v1
|
||||
with:
|
||||
python-version: 3.6
|
||||
- name: Validating Translation Syntax
|
||||
run: |
|
||||
git fetch origin $GITHUB_BASE_REF:$GITHUB_BASE_REF -q
|
||||
files=$(git diff --name-only --diff-filter=d $GITHUB_BASE_REF)
|
||||
python $GITHUB_WORKSPACE/.github/helper/translation.py $files
|
||||
112
.github/workflows/ui-tests.yml
vendored
112
.github/workflows/ui-tests.yml
vendored
@@ -1,112 +0,0 @@
|
||||
name: UI
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
paths-ignore:
|
||||
- '**.md'
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
test:
|
||||
runs-on: ubuntu-18.04
|
||||
|
||||
strategy:
|
||||
fail-fast: false
|
||||
|
||||
name: UI Tests (Cypress)
|
||||
|
||||
services:
|
||||
mysql:
|
||||
image: mariadb:10.3
|
||||
env:
|
||||
MYSQL_ALLOW_EMPTY_PASSWORD: YES
|
||||
ports:
|
||||
- 3306:3306
|
||||
options: --health-cmd="mysqladmin ping" --health-interval=5s --health-timeout=2s --health-retries=3
|
||||
|
||||
steps:
|
||||
- name: Clone
|
||||
uses: actions/checkout@v2
|
||||
|
||||
- name: Setup Python
|
||||
uses: actions/setup-python@v2
|
||||
with:
|
||||
python-version: 3.7
|
||||
|
||||
- uses: actions/setup-node@v2
|
||||
with:
|
||||
node-version: 14
|
||||
check-latest: true
|
||||
|
||||
- name: Add to Hosts
|
||||
run: |
|
||||
echo "127.0.0.1 test_site" | sudo tee -a /etc/hosts
|
||||
|
||||
- name: Cache pip
|
||||
uses: actions/cache@v2
|
||||
with:
|
||||
path: ~/.cache/pip
|
||||
key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}
|
||||
restore-keys: |
|
||||
${{ runner.os }}-pip-
|
||||
${{ runner.os }}-
|
||||
|
||||
- name: Cache node modules
|
||||
uses: actions/cache@v2
|
||||
env:
|
||||
cache-name: cache-node-modules
|
||||
with:
|
||||
path: ~/.npm
|
||||
key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }}
|
||||
restore-keys: |
|
||||
${{ runner.os }}-build-${{ env.cache-name }}-
|
||||
${{ runner.os }}-build-
|
||||
${{ runner.os }}-
|
||||
|
||||
- name: Get yarn cache directory path
|
||||
id: yarn-cache-dir-path
|
||||
run: echo "::set-output name=dir::$(yarn cache dir)"
|
||||
|
||||
- uses: actions/cache@v2
|
||||
id: yarn-cache
|
||||
with:
|
||||
path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
|
||||
key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
|
||||
restore-keys: |
|
||||
${{ runner.os }}-yarn-
|
||||
|
||||
- name: Cache cypress binary
|
||||
uses: actions/cache@v2
|
||||
with:
|
||||
path: ~/.cache
|
||||
key: ${{ runner.os }}-cypress-
|
||||
restore-keys: |
|
||||
${{ runner.os }}-cypress-
|
||||
${{ runner.os }}-
|
||||
|
||||
- name: Install
|
||||
run: bash ${GITHUB_WORKSPACE}/.github/helper/install.sh
|
||||
env:
|
||||
DB: mariadb
|
||||
TYPE: ui
|
||||
|
||||
- name: Site Setup
|
||||
run: cd ~/frappe-bench/ && bench --site test_site execute erpnext.setup.utils.before_tests
|
||||
|
||||
- name: cypress pre-requisites
|
||||
run: cd ~/frappe-bench/apps/frappe && yarn add cypress-file-upload@^5 @testing-library/cypress@^8 --no-lockfile
|
||||
|
||||
|
||||
- name: Build Assets
|
||||
run: cd ~/frappe-bench/ && bench build
|
||||
env:
|
||||
CI: Yes
|
||||
|
||||
- name: UI Tests
|
||||
run: cd ~/frappe-bench/ && bench --site test_site run-ui-tests erpnext --headless
|
||||
env:
|
||||
CYPRESS_RECORD_KEY: 60a8e3bf-08f5-45b1-9269-2b207d7d30cd
|
||||
|
||||
- name: Show bench console if tests failed
|
||||
if: ${{ failure() }}
|
||||
run: cat ~/frappe-bench/bench_run_logs.txt
|
||||
8
.gitignore
vendored
8
.gitignore
vendored
@@ -7,11 +7,3 @@ latest_updates.json
|
||||
.wnf-lang-status
|
||||
*.egg-info
|
||||
dist/
|
||||
erpnext/docs/current
|
||||
*.swp
|
||||
*.swo
|
||||
__pycache__
|
||||
*~
|
||||
.idea/
|
||||
.vscode/
|
||||
node_modules/
|
||||
|
||||
58
.mergify.yml
58
.mergify.yml
@@ -1,58 +0,0 @@
|
||||
pull_request_rules:
|
||||
- name: Auto-close PRs on stable branch
|
||||
conditions:
|
||||
- and:
|
||||
- and:
|
||||
- author!=surajshetty3416
|
||||
- author!=gavindsouza
|
||||
- author!=rohitwaghchaure
|
||||
- author!=nabinhait
|
||||
- or:
|
||||
- base=version-13
|
||||
- base=version-12
|
||||
actions:
|
||||
close:
|
||||
comment:
|
||||
message: |
|
||||
@{{author}}, thanks for the contribution, but we do not accept pull requests on a stable branch. Please raise PR on an appropriate hotfix branch.
|
||||
https://github.com/frappe/erpnext/wiki/Pull-Request-Checklist#which-branch
|
||||
|
||||
- name: backport to version-13-hotfix
|
||||
conditions:
|
||||
- label="backport version-13-hotfix"
|
||||
actions:
|
||||
backport:
|
||||
branches:
|
||||
- version-13-hotfix
|
||||
assignees:
|
||||
- "{{ author }}"
|
||||
|
||||
- name: backport to version-13-pre-release
|
||||
conditions:
|
||||
- label="backport version-13-pre-release"
|
||||
actions:
|
||||
backport:
|
||||
branches:
|
||||
- version-13-pre-release
|
||||
assignees:
|
||||
- "{{ author }}"
|
||||
|
||||
- name: backport to version-12-hotfix
|
||||
conditions:
|
||||
- label="backport version-12-hotfix"
|
||||
actions:
|
||||
backport:
|
||||
branches:
|
||||
- version-12-hotfix
|
||||
assignees:
|
||||
- "{{ author }}"
|
||||
|
||||
- name: backport to version-12-pre-release
|
||||
conditions:
|
||||
- label="backport version-12-pre-release"
|
||||
actions:
|
||||
backport:
|
||||
branches:
|
||||
- version-12-pre-release
|
||||
assignees:
|
||||
- "{{ author }}"
|
||||
@@ -1,38 +0,0 @@
|
||||
exclude: 'node_modules|.git'
|
||||
default_stages: [commit]
|
||||
fail_fast: false
|
||||
|
||||
|
||||
repos:
|
||||
- repo: https://github.com/pre-commit/pre-commit-hooks
|
||||
rev: v4.0.1
|
||||
hooks:
|
||||
- id: trailing-whitespace
|
||||
files: "erpnext.*"
|
||||
exclude: ".*json$|.*txt$|.*csv|.*md"
|
||||
- id: check-yaml
|
||||
- id: no-commit-to-branch
|
||||
args: ['--branch', 'develop']
|
||||
- id: check-merge-conflict
|
||||
- id: check-ast
|
||||
|
||||
- repo: https://gitlab.com/pycqa/flake8
|
||||
rev: 3.9.2
|
||||
hooks:
|
||||
- id: flake8
|
||||
additional_dependencies: [
|
||||
'flake8-bugbear',
|
||||
]
|
||||
args: ['--config', '.github/helper/.flake8_strict']
|
||||
exclude: ".*setup.py$"
|
||||
|
||||
- repo: https://github.com/timothycrosley/isort
|
||||
rev: 5.9.1
|
||||
hooks:
|
||||
- id: isort
|
||||
exclude: ".*setup.py$"
|
||||
|
||||
ci:
|
||||
autoupdate_schedule: weekly
|
||||
skip: []
|
||||
submodules: false
|
||||
38
.travis.yml
Normal file
38
.travis.yml
Normal file
@@ -0,0 +1,38 @@
|
||||
language: python
|
||||
|
||||
python:
|
||||
- "2.7"
|
||||
|
||||
services:
|
||||
- mysql
|
||||
|
||||
install:
|
||||
- sudo service mysql stop
|
||||
- sudo apt-get install python-software-properties
|
||||
- sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xcbcb082a1bb943db
|
||||
- sudo add-apt-repository 'deb http://ftp.osuosl.org/pub/mariadb/repo/10.0/ubuntu precise main'
|
||||
- sudo apt-get update
|
||||
- sudo apt-get purge -y mysql-common
|
||||
- sudo apt-get install mariadb-server mariadb-common libmariadbclient-dev
|
||||
- ./ci/fix-mariadb.sh
|
||||
|
||||
- sudo apt-get install xfonts-75dpi xfonts-base -y
|
||||
- wget http://downloads.sourceforge.net/project/wkhtmltopdf/0.12.2.1/wkhtmltox-0.12.2.1_linux-precise-amd64.deb
|
||||
- sudo dpkg -i wkhtmltox-0.12.2.1_linux-precise-amd64.deb
|
||||
- CFLAGS=-O0 pip install git+https://github.com/frappe/frappe.git@v4.x.x
|
||||
- CFLAGS=-O0 pip install --editable .
|
||||
|
||||
before_script:
|
||||
- mysql -e 'create database test_frappe'
|
||||
- echo "USE mysql;\nCREATE USER 'test_frappe'@'localhost' IDENTIFIED BY 'test_frappe';\nFLUSH PRIVILEGES;\n" | mysql -u root
|
||||
- echo "USE mysql;\nGRANT ALL PRIVILEGES ON \`test_frappe\`.* TO 'test_frappe'@'localhost';\n" | mysql -u root
|
||||
|
||||
script:
|
||||
- cd ./test_sites/
|
||||
- frappe --use test_site
|
||||
- frappe --reinstall
|
||||
- frappe --install_app erpnext --verbose
|
||||
- frappe -b
|
||||
- frappe --build_website
|
||||
- frappe --serve_test &
|
||||
- frappe --verbose --run_tests --app erpnext
|
||||
35
CODEOWNERS
35
CODEOWNERS
@@ -1,35 +0,0 @@
|
||||
# Each line is a file pattern followed by one or more owners.
|
||||
|
||||
# These owners will be the default owners for everything in
|
||||
# the repo. Unless a later match takes precedence,
|
||||
|
||||
erpnext/accounts/ @nextchamp-saqib @deepeshgarg007
|
||||
erpnext/assets/ @nextchamp-saqib @deepeshgarg007
|
||||
erpnext/erpnext_integrations/ @nextchamp-saqib
|
||||
erpnext/loan_management/ @nextchamp-saqib @deepeshgarg007
|
||||
erpnext/regional @nextchamp-saqib @deepeshgarg007
|
||||
erpnext/selling @nextchamp-saqib @deepeshgarg007
|
||||
erpnext/support/ @nextchamp-saqib @deepeshgarg007
|
||||
pos* @nextchamp-saqib
|
||||
|
||||
erpnext/buying/ @marination @rohitwaghchaure @ankush
|
||||
erpnext/e_commerce/ @marination
|
||||
erpnext/maintenance/ @marination @rohitwaghchaure
|
||||
erpnext/manufacturing/ @marination @rohitwaghchaure @ankush
|
||||
erpnext/portal/ @marination
|
||||
erpnext/quality_management/ @marination @rohitwaghchaure
|
||||
erpnext/shopping_cart/ @marination
|
||||
erpnext/stock/ @marination @rohitwaghchaure @ankush
|
||||
|
||||
erpnext/crm/ @ruchamahabal @pateljannat
|
||||
erpnext/education/ @ruchamahabal @pateljannat
|
||||
erpnext/healthcare/ @ruchamahabal @pateljannat @chillaranand
|
||||
erpnext/hr/ @ruchamahabal @pateljannat
|
||||
erpnext/non_profit/ @ruchamahabal
|
||||
erpnext/payroll @ruchamahabal @pateljannat
|
||||
erpnext/projects/ @ruchamahabal @pateljannat
|
||||
|
||||
erpnext/controllers @deepeshgarg007 @nextchamp-saqib @rohitwaghchaure @marination
|
||||
|
||||
.github/ @surajshetty3416 @ankush
|
||||
requirements.txt @gavindsouza
|
||||
@@ -1,46 +0,0 @@
|
||||
# Contributor Covenant Code of Conduct
|
||||
|
||||
## Our Pledge
|
||||
|
||||
In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.
|
||||
|
||||
## Our Standards
|
||||
|
||||
Examples of behavior that contributes to creating a positive environment include:
|
||||
|
||||
* Using welcoming and inclusive language
|
||||
* Being respectful of differing viewpoints and experiences
|
||||
* Gracefully accepting constructive criticism
|
||||
* Focusing on what is best for the community
|
||||
* Showing empathy towards other community members
|
||||
|
||||
Examples of unacceptable behavior by participants include:
|
||||
|
||||
* The use of sexualized language or imagery and unwelcome sexual attention or advances
|
||||
* Trolling, insulting/derogatory comments, and personal or political attacks
|
||||
* Public or private harassment
|
||||
* Publishing others' private information, such as a physical or electronic address, without explicit permission
|
||||
* Other conduct which could reasonably be considered inappropriate in a professional setting
|
||||
|
||||
## Our Responsibilities
|
||||
|
||||
Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.
|
||||
|
||||
Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
|
||||
|
||||
## Scope
|
||||
|
||||
This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.
|
||||
|
||||
## Enforcement
|
||||
|
||||
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at hello@frappe.io. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
|
||||
|
||||
Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.
|
||||
|
||||
## Attribution
|
||||
|
||||
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]
|
||||
|
||||
[homepage]: http://contributor-covenant.org
|
||||
[version]: http://contributor-covenant.org/version/1/4/
|
||||
53
CONTRIBUTING.md
Normal file
53
CONTRIBUTING.md
Normal file
@@ -0,0 +1,53 @@
|
||||
# Contributing to Frappe / ERPNext
|
||||
|
||||
### Update 16-Sep-14
|
||||
|
||||
Please send pull requests to branch v5.0
|
||||
|
||||
## Reporting issues
|
||||
|
||||
We only accept issues that are bug reports or feature requests. Bugs must be isolated and reproducible problems. Please read the following guidelines before opening any issue.
|
||||
|
||||
1. **Search for existing issues:** We want to avoid duplication, and you'd help us out a lot by first checking if someone else has reported the same issue. The issue may have already been resolved with a fix available.
|
||||
1. **Report each issue separately:** Don't club multiple, unreleated issues in one note.
|
||||
1. **Mention the version number:** Please mention the application, browser and platform version numbers.
|
||||
|
||||
### Issues
|
||||
|
||||
1. **Share as much information as possible:** Include operating system and version, browser and version, when did you last update ERPNext, how is it customized, etc. where appropriate. Also include steps to reproduce the bug.
|
||||
1. **Include Screenshots if possible:** Consider adding screenshots annotated with what goes wrong.
|
||||
1. **Find and post the trace for bugs:** If you are reporting an issue from the browser, Open the Javascript Console and paste us any error messages you see.
|
||||
|
||||
|
||||
### Feature Requests
|
||||
|
||||
1. We need as much information you can to consider a feature request.
|
||||
1. Think about **how** you want us to build the feature. Consider including:
|
||||
1. Mockups (wireframes of features)
|
||||
1. Screenshots (annotated with what should change)
|
||||
1. Screenshots from other products if you want us to implement features present in other products.
|
||||
1. Basically, the more you help us, the faster your request is likely to be completed.
|
||||
1. A one line feature request like **Implement Capacity Planning** will be closed.
|
||||
|
||||
## Pull Requests
|
||||
|
||||
General guidelines for sending pull requests:
|
||||
|
||||
#### Don't Repeat Yourself (DRY)
|
||||
|
||||
We believe that the most effective way to manage a product like this is to ensure that
|
||||
there is minimum repetition of code. So before contributing a function, please make sure
|
||||
that such a feature or function does not exist else where. If it does, the try and extend
|
||||
that function to accommodate your use case.
|
||||
|
||||
#### Don't create new DocTypes Unless Absolutely Necessary
|
||||
|
||||
DocTypes are easy to create but hard to maintain. If you find that there is a another DocType with a similar functionality, then please try and extend that functionality. For example, by adding a "type" field to classify the new type of record.
|
||||
|
||||
#### Tabs or spaces?
|
||||
|
||||
Tabs!
|
||||
|
||||
### Copyright
|
||||
|
||||
Please see README.md
|
||||
20
MANIFEST.in
Normal file
20
MANIFEST.in
Normal file
@@ -0,0 +1,20 @@
|
||||
include MANIFEST.in
|
||||
include requirements.txt
|
||||
include *.json
|
||||
include *.md
|
||||
include *.py
|
||||
include *.txt
|
||||
include .travis.yml
|
||||
recursive-include erpnext *.txt
|
||||
recursive-include erpnext *.css
|
||||
recursive-include erpnext *.csv
|
||||
recursive-include erpnext *.html
|
||||
recursive-include erpnext *.ico
|
||||
recursive-include erpnext *.js
|
||||
recursive-include erpnext *.json
|
||||
recursive-include erpnext *.md
|
||||
recursive-include erpnext *.png
|
||||
recursive-include erpnext *.py
|
||||
recursive-include erpnext *.svg
|
||||
recursive-include erpnext/public *
|
||||
recursive-exclude * *.pyc
|
||||
73
README.md
73
README.md
@@ -1,51 +1,22 @@
|
||||
<div align="center">
|
||||
<img src="https://raw.githubusercontent.com/frappe/erpnext/develop/erpnext/public/images/erpnext-logo.png" height="128">
|
||||
<h2>ERPNext</h2>
|
||||
<p align="center">
|
||||
<p>ERP made simple</p>
|
||||
</p>
|
||||
# ERPNext - Open source ERP for small and medium-size business [](https://travis-ci.org/frappe/erpnext)
|
||||
|
||||
[](https://github.com/frappe/erpnext/actions/workflows/ci-tests.yml)
|
||||
[](https://www.codetriage.com/frappe/erpnext)
|
||||
[](https://coveralls.io/github/frappe/erpnext?branch=develop)
|
||||
[](https://gitter.im/frappe/erpnext?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
||||
|
||||
[https://erpnext.com](https://erpnext.com)
|
||||
|
||||
</div>
|
||||
Includes: Accounting, Inventory, CRM, Sales, Purchase, Projects, HRMS. Requires MariaDB.
|
||||
|
||||
ERPNext as a monolith includes the following areas for managing businesses:
|
||||
ERPNext is built on the [Frappe](https://github.com/frappe/frappe) Framework, a full-stack web app framework in Python & Javascript.
|
||||
|
||||
1. [Accounting](https://erpnext.com/open-source-accounting)
|
||||
1. [Warehouse Management](https://erpnext.com/distribution/warehouse-management-system)
|
||||
1. [CRM](https://erpnext.com/open-source-crm)
|
||||
1. [Sales](https://erpnext.com/open-source-sales-purchase)
|
||||
1. [Purchase](https://erpnext.com/open-source-sales-purchase)
|
||||
1. [HRMS](https://erpnext.com/open-source-hrms)
|
||||
1. [Project Management](https://erpnext.com/open-source-projects)
|
||||
1. [Support](https://erpnext.com/open-source-help-desk-software)
|
||||
1. [Asset Management](https://erpnext.com/open-source-asset-management-software)
|
||||
1. [Quality Management](https://erpnext.com/docs/user/manual/en/quality-management)
|
||||
1. [Manufacturing](https://erpnext.com/open-source-manufacturing-erp-software)
|
||||
1. [Website Management](https://erpnext.com/open-source-website-builder-software)
|
||||
1. [Customize ERPNext](https://erpnext.com/docs/user/manual/en/customize-erpnext)
|
||||
1. [And More](https://erpnext.com/docs/user/manual/en/)
|
||||
|
||||
ERPNext requires MariaDB.
|
||||
|
||||
ERPNext is built on the [Frappe Framework](https://github.com/frappe/frappe), a full-stack web app framework built with Python & JavaScript.
|
||||
|
||||
- [User Guide](https://erpnext.com/docs/user)
|
||||
- [Discussion Forum](https://discuss.erpnext.com/)
|
||||
- [User Guide](https://erpnext.com/user-guide)
|
||||
- [Getting Help](http://erpnext.org/getting-help.html)
|
||||
- [Discussion Forum](https://discuss.frappe.io/)
|
||||
|
||||
---
|
||||
|
||||
### Containerized Installation
|
||||
|
||||
Use docker to deploy ERPNext in production or for development of [Frappe](https://github.com/frappe/frappe) apps. See https://github.com/frappe/frappe_docker for more details.
|
||||
|
||||
### Full Install
|
||||
|
||||
The Easy Way: our install script for bench will install all dependencies (e.g. MariaDB). See https://github.com/frappe/bench for more details.
|
||||
The Easy Way install script for bench will install all dependencies (e.g. MariaDB). See https://github.com/frappe/bench
|
||||
|
||||
New passwords will be created for the ERPNext "Administrator" user, the MariaDB root user, and the frappe user (the script displays the passwords and saves them to ~/frappe_passwords.txt).
|
||||
|
||||
@@ -61,37 +32,27 @@ System and user credentials are listed on the download page.
|
||||
|
||||
## License
|
||||
|
||||
GNU/General Public License (see [license.txt](license.txt))
|
||||
GNU/General Public License (see LICENSE.txt)
|
||||
|
||||
The ERPNext code is licensed as GNU General Public License (v3) and the Documentation is licensed as Creative Commons (CC-BY-SA-3.0) and the copyright is owned by Frappe Technologies Pvt Ltd (Frappe) and Contributors.
|
||||
|
||||
---
|
||||
|
||||
## Contributing
|
||||
|
||||
1. [Issue Guidelines](https://github.com/frappe/erpnext/wiki/Issue-Guidelines)
|
||||
1. [Report Security Vulnerabilities](https://erpnext.com/security)
|
||||
1. [Pull Request Requirements](https://github.com/frappe/erpnext/wiki/Contribution-Guidelines)
|
||||
1. [Translations](https://translate.erpnext.com)
|
||||
1. [Chart of Accounts](https://charts.erpnext.com)
|
||||
The ERPNext code is licensed as GNU General Public License (v3) and the Documentation is licensed as Creative Commons (CC-BY-SA-3.0) and the copyright is owned by Web Notes Technologies Pvt Ltd (Web Notes) and Contributors.
|
||||
|
||||
---
|
||||
|
||||
## Logo and Trademark
|
||||
|
||||
The brand name ERPNext and the logo are trademarks of Frappe Technologies Pvt. Ltd.
|
||||
The brand name ERPNext and the logo are trademarks of Web Notes Technologies Pvt. Ltd.
|
||||
|
||||
### Introduction
|
||||
|
||||
Frappe Technologies Pvt. Ltd. (Frappe) owns and oversees the trademarks for the ERPNext name and logos. We have developed this trademark usage policy with the following goals in mind:
|
||||
Web Notes Technologies Pvt. Ltd. (Web Notes) owns and oversees the trademarks for the ERPNext name and logos. We have developed this trademark usage policy with the following goals in mind:
|
||||
|
||||
- We’d like to make it easy for anyone to use the ERPNext name or logo for community-oriented efforts that help spread and improve ERPNext.
|
||||
- We’d like to make it clear how ERPNext-related businesses and projects can (and cannot) use the ERPNext name and logo.
|
||||
- We’d like to make it hard for anyone to use the ERPNext name and logo to unfairly profit from, trick or confuse people who are looking for official ERPNext resources.
|
||||
|
||||
### Frappe Trademark Usage Policy
|
||||
### Web Notes Trademark Usage Policy
|
||||
|
||||
Permission from Frappe is required to use the ERPNext name or logo as part of any project, product, service, domain or company name.
|
||||
Permission from Web Notes is required to use the ERPNext name or logo as part of any project, product, service, domain or company name.
|
||||
|
||||
We will grant permission to use the ERPNext name and logo for projects that meet the following criteria:
|
||||
|
||||
@@ -102,7 +63,7 @@ Your project neither promotes nor is associated with entities that currently fai
|
||||
|
||||
Use of the ERPNext name and logo is additionally allowed in the following situations:
|
||||
|
||||
All other ERPNext-related businesses or projects can use the ERPNext name and logo to refer to and explain their services, but they cannot use them as part of a product, project, service, domain, or company name and they cannot use them in any way that suggests an affiliation with or endorsement by ERPNext or Frappe Technologies or the ERPNext open source project. For example, a consulting company can describe its business as “123 Web Services, offering ERPNext consulting for small businesses,” but cannot call its business “The ERPNext Consulting Company.”
|
||||
All other ERPNext-related businesses or projects can use the ERPNext name and logo to refer to and explain their services, but they cannot use them as part of a product, project, service, domain, or company name and they cannot use them in any way that suggests an affiliation with or endorsement by the ERPNext or WebNotes or the ERPNext open source project. For example, a consulting company can describe its business as “123 Web Services, offering ERPNext consulting for small businesses,” but cannot call its business “The ERPNext Consulting Company.”
|
||||
|
||||
Similarly, it’s OK to use the ERPNext logo as part of a page that describes your products or services, but it is not OK to use it as part of your company or product logo or branding itself. Under no circumstances is it permitted to use ERPNext as part of a top-level domain name.
|
||||
|
||||
@@ -110,6 +71,6 @@ We do not allow the use of the trademark in advertising, including AdSense/AdWor
|
||||
|
||||
Please note that it is not the goal of this policy to limit commercial activity around ERPNext. We encourage ERPNext-based businesses, and we would love to see hundreds of them.
|
||||
|
||||
When in doubt about your use of the ERPNext name or logo, please contact Frappe Technologies for clarification.
|
||||
When in doubt about your use of the ERPNext name or logo, please contact the Web Notes Technologies for clarification.
|
||||
|
||||
(inspired by WordPress)
|
||||
(inspired from Wordpress)
|
||||
|
||||
@@ -1,7 +0,0 @@
|
||||
# Security Policy
|
||||
|
||||
The ERPNext team and community take security issues seriously. To report a security issue, fill out the form at [https://erpnext.com/security/report](https://erpnext.com/security/report).
|
||||
|
||||
You can help us make ERPNext and all it's users more secure by following the [Reporting guidelines](https://erpnext.com/security).
|
||||
|
||||
We appreciate your efforts to responsibly disclose your findings. We'll endeavor to respond quickly, and will keep you updated throughout the process.
|
||||
@@ -1,7 +0,0 @@
|
||||
## ERPNext includes these public works
|
||||
|
||||
For Frappe Framework, please see attributions.md at https://github.com/frappe/frappe/
|
||||
|
||||
#### Images
|
||||
|
||||
POS Icon: https://thenounproject.com/icon/41958 by hunotika
|
||||
11
ci/fix-mariadb.sh
Executable file
11
ci/fix-mariadb.sh
Executable file
@@ -0,0 +1,11 @@
|
||||
#!/bin/bash
|
||||
|
||||
# stolen from http://cgit.drupalcode.org/octopus/commit/?id=db4f837
|
||||
includedir=`mysql_config --variable=pkgincludedir`
|
||||
thiscwd=`pwd`
|
||||
_THIS_DB_VERSION=`mysql -V 2>&1 | tr -d "\n" | cut -d" " -f6 | awk '{ print $1}' | cut -d"-" -f1 | awk '{ print $1}' | sed "s/[\,']//g"`
|
||||
if [ "$_THIS_DB_VERSION" = "5.5.40" ] && [ ! -e "$includedir-$_THIS_DB_VERSION-fixed.log" ] ; then
|
||||
cd $includedir
|
||||
sudo patch -p1 < $thiscwd/ci/my_config.h.patch &> /dev/null
|
||||
sudo touch $includedir-$_THIS_DB_VERSION-fixed.log
|
||||
fi
|
||||
22
ci/my_config.h.patch
Normal file
22
ci/my_config.h.patch
Normal file
@@ -0,0 +1,22 @@
|
||||
diff -burp a/my_config.h b/my_config.h
|
||||
--- a/my_config.h 2014-10-09 19:32:46.000000000 -0400
|
||||
+++ b/my_config.h 2014-10-09 19:35:12.000000000 -0400
|
||||
@@ -641,17 +641,4 @@
|
||||
#define SIZEOF_TIME_T 8
|
||||
/* #undef TIME_T_UNSIGNED */
|
||||
|
||||
-/*
|
||||
- stat structure (from <sys/stat.h>) is conditionally defined
|
||||
- to have different layout and size depending on the defined macros.
|
||||
- The correct macro is defined in my_config.h, which means it MUST be
|
||||
- included first (or at least before <features.h> - so, practically,
|
||||
- before including any system headers).
|
||||
-
|
||||
- __GLIBC__ is defined in <features.h>
|
||||
-*/
|
||||
-#ifdef __GLIBC__
|
||||
-#error <my_config.h> MUST be included first!
|
||||
-#endif
|
||||
-
|
||||
#endif
|
||||
|
||||
11
cypress.json
11
cypress.json
@@ -1,11 +0,0 @@
|
||||
{
|
||||
"baseUrl": "http://test_site:8000",
|
||||
"projectId": "da59y9",
|
||||
"adminPassword": "admin",
|
||||
"defaultCommandTimeout": 20000,
|
||||
"pageLoadTimeout": 15000,
|
||||
"retries": {
|
||||
"runMode": 2,
|
||||
"openMode": 2
|
||||
}
|
||||
}
|
||||
@@ -1,5 +0,0 @@
|
||||
{
|
||||
"name": "Using fixtures to represent data",
|
||||
"email": "hello@cypress.io",
|
||||
"body": "Fixtures are a great way to mock data for responses to routes"
|
||||
}
|
||||
@@ -1,13 +0,0 @@
|
||||
|
||||
context('Customer', () => {
|
||||
before(() => {
|
||||
cy.login();
|
||||
});
|
||||
it('Check Customer Group', () => {
|
||||
cy.visit(`app/customer/`);
|
||||
cy.get('.primary-action').click();
|
||||
cy.wait(500);
|
||||
cy.get('.custom-actions > .btn').click();
|
||||
cy.get_field('customer_group', 'Link').should('have.value', 'All Customer Groups');
|
||||
});
|
||||
});
|
||||
@@ -1,116 +0,0 @@
|
||||
context('Organizational Chart', () => {
|
||||
before(() => {
|
||||
cy.login();
|
||||
cy.visit('/app/website');
|
||||
});
|
||||
|
||||
it('navigates to org chart', () => {
|
||||
cy.visit('/app');
|
||||
cy.visit('/app/organizational-chart');
|
||||
cy.url().should('include', '/organizational-chart');
|
||||
|
||||
cy.window().its('frappe.csrf_token').then(csrf_token => {
|
||||
return cy.request({
|
||||
url: `/api/method/erpnext.tests.ui_test_helpers.create_employee_records`,
|
||||
method: 'POST',
|
||||
headers: {
|
||||
Accept: 'application/json',
|
||||
'Content-Type': 'application/json',
|
||||
'X-Frappe-CSRF-Token': csrf_token
|
||||
},
|
||||
timeout: 60000
|
||||
}).then(res => {
|
||||
expect(res.status).eq(200);
|
||||
cy.get('.frappe-control[data-fieldname=company] input').focus().as('input');
|
||||
cy.get('@input')
|
||||
.clear({ force: true })
|
||||
.type('Test Org Chart{downarrow}{enter}', { force: true })
|
||||
.blur({ force: true });
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
it('renders root nodes and loads children for the first expandable node', () => {
|
||||
// check rendered root nodes and the node name, title, connections
|
||||
cy.get('.hierarchy').find('.root-level ul.node-children').children()
|
||||
.should('have.length', 2)
|
||||
.first()
|
||||
.as('first-child');
|
||||
|
||||
cy.get('@first-child').get('.node-name').contains('Test Employee 1');
|
||||
cy.get('@first-child').get('.node-info').find('.node-title').contains('CEO');
|
||||
cy.get('@first-child').get('.node-info').find('.node-connections').contains('· 2 Connections');
|
||||
|
||||
cy.call('erpnext.tests.ui_test_helpers.get_employee_records').then(employee_records => {
|
||||
// children of 1st root visible
|
||||
cy.get(`div[data-parent="${employee_records.message[0]}"]`).as('child-node');
|
||||
cy.get('@child-node')
|
||||
.should('have.length', 1)
|
||||
.should('be.visible');
|
||||
cy.get('@child-node').get('.node-name').contains('Test Employee 3');
|
||||
|
||||
// connectors between first root node and immediate child
|
||||
cy.get(`path[data-parent="${employee_records.message[0]}"]`)
|
||||
.should('be.visible')
|
||||
.invoke('attr', 'data-child')
|
||||
.should('equal', employee_records.message[2]);
|
||||
});
|
||||
});
|
||||
|
||||
it('hides active nodes children and connectors on expanding sibling node', () => {
|
||||
cy.call('erpnext.tests.ui_test_helpers.get_employee_records').then(employee_records => {
|
||||
// click sibling
|
||||
cy.get(`#${employee_records.message[1]}`)
|
||||
.click()
|
||||
.should('have.class', 'active');
|
||||
|
||||
// child nodes and connectors hidden
|
||||
cy.get(`[data-parent="${employee_records.message[0]}"]`).should('not.be.visible');
|
||||
cy.get(`path[data-parent="${employee_records.message[0]}"]`).should('not.be.visible');
|
||||
});
|
||||
});
|
||||
|
||||
it('collapses previous level nodes and refreshes connectors on expanding child node', () => {
|
||||
cy.call('erpnext.tests.ui_test_helpers.get_employee_records').then(employee_records => {
|
||||
// click child node
|
||||
cy.get(`#${employee_records.message[3]}`)
|
||||
.click()
|
||||
.should('have.class', 'active');
|
||||
|
||||
// previous level nodes: parent should be on active-path; other nodes should be collapsed
|
||||
cy.get(`#${employee_records.message[0]}`).should('have.class', 'collapsed');
|
||||
cy.get(`#${employee_records.message[1]}`).should('have.class', 'active-path');
|
||||
|
||||
// previous level connectors refreshed
|
||||
cy.get(`path[data-parent="${employee_records.message[1]}"]`)
|
||||
.should('have.class', 'collapsed-connector');
|
||||
|
||||
// child node's children and connectors rendered
|
||||
cy.get(`[data-parent="${employee_records.message[3]}"]`).should('be.visible');
|
||||
cy.get(`path[data-parent="${employee_records.message[3]}"]`).should('be.visible');
|
||||
});
|
||||
});
|
||||
|
||||
it('expands previous level nodes', () => {
|
||||
cy.call('erpnext.tests.ui_test_helpers.get_employee_records').then(employee_records => {
|
||||
cy.get(`#${employee_records.message[0]}`)
|
||||
.click()
|
||||
.should('have.class', 'active');
|
||||
|
||||
cy.get(`[data-parent="${employee_records.message[0]}"]`)
|
||||
.should('be.visible');
|
||||
|
||||
cy.get('ul.hierarchy').children().should('have.length', 2);
|
||||
cy.get(`#connectors`).children().should('have.length', 1);
|
||||
});
|
||||
});
|
||||
|
||||
it('edit node navigates to employee master', () => {
|
||||
cy.call('erpnext.tests.ui_test_helpers.get_employee_records').then(employee_records => {
|
||||
cy.get(`#${employee_records.message[0]}`).find('.btn-edit-node')
|
||||
.click();
|
||||
|
||||
cy.url().should('include', `/employee/${employee_records.message[0]}`);
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -1,195 +0,0 @@
|
||||
context('Organizational Chart Mobile', () => {
|
||||
before(() => {
|
||||
cy.login();
|
||||
cy.visit('/app/website');
|
||||
});
|
||||
|
||||
it('navigates to org chart', () => {
|
||||
cy.viewport(375, 667);
|
||||
cy.visit('/app');
|
||||
cy.visit('/app/organizational-chart');
|
||||
cy.url().should('include', '/organizational-chart');
|
||||
|
||||
cy.window().its('frappe.csrf_token').then(csrf_token => {
|
||||
return cy.request({
|
||||
url: `/api/method/erpnext.tests.ui_test_helpers.create_employee_records`,
|
||||
method: 'POST',
|
||||
headers: {
|
||||
Accept: 'application/json',
|
||||
'Content-Type': 'application/json',
|
||||
'X-Frappe-CSRF-Token': csrf_token
|
||||
},
|
||||
timeout: 60000
|
||||
}).then(res => {
|
||||
expect(res.status).eq(200);
|
||||
cy.get('.frappe-control[data-fieldname=company] input').focus().as('input');
|
||||
cy.get('@input')
|
||||
.clear({ force: true })
|
||||
.type('Test Org Chart{downarrow}{enter}', { force: true })
|
||||
.blur({ force: true });
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
it('renders root nodes', () => {
|
||||
// check rendered root nodes and the node name, title, connections
|
||||
cy.get('.hierarchy-mobile').find('.root-level').children()
|
||||
.should('have.length', 2)
|
||||
.first()
|
||||
.as('first-child');
|
||||
|
||||
cy.get('@first-child').get('.node-name').contains('Test Employee 1');
|
||||
cy.get('@first-child').get('.node-info').find('.node-title').contains('CEO');
|
||||
cy.get('@first-child').get('.node-info').find('.node-connections').contains('· 2');
|
||||
});
|
||||
|
||||
it('expands root node', () => {
|
||||
cy.call('erpnext.tests.ui_test_helpers.get_employee_records').then(employee_records => {
|
||||
cy.get(`#${employee_records.message[1]}`)
|
||||
.click()
|
||||
.should('have.class', 'active');
|
||||
|
||||
// other root node removed
|
||||
cy.get(`#${employee_records.message[0]}`).should('not.exist');
|
||||
|
||||
// children of active root node
|
||||
cy.get('.hierarchy-mobile').find('.level').first().find('ul.node-children').children()
|
||||
.should('have.length', 2);
|
||||
|
||||
cy.get(`div[data-parent="${employee_records.message[1]}"]`).first().as('child-node');
|
||||
cy.get('@child-node').should('be.visible');
|
||||
|
||||
cy.get('@child-node')
|
||||
.get('.node-name')
|
||||
.contains('Test Employee 4');
|
||||
|
||||
// connectors between root node and immediate children
|
||||
cy.get(`path[data-parent="${employee_records.message[1]}"]`).as('connectors');
|
||||
cy.get('@connectors')
|
||||
.should('have.length', 2)
|
||||
.should('be.visible');
|
||||
|
||||
cy.get('@connectors')
|
||||
.first()
|
||||
.invoke('attr', 'data-child')
|
||||
.should('eq', employee_records.message[3]);
|
||||
});
|
||||
});
|
||||
|
||||
it('expands child node', () => {
|
||||
cy.call('erpnext.tests.ui_test_helpers.get_employee_records').then(employee_records => {
|
||||
cy.get(`#${employee_records.message[3]}`)
|
||||
.click()
|
||||
.should('have.class', 'active')
|
||||
.as('expanded_node');
|
||||
|
||||
// 2 levels on screen; 1 on active path; 1 collapsed
|
||||
cy.get('.hierarchy-mobile').children().should('have.length', 2);
|
||||
cy.get(`#${employee_records.message[1]}`).should('have.class', 'active-path');
|
||||
|
||||
// children of expanded node visible
|
||||
cy.get('@expanded_node')
|
||||
.next()
|
||||
.should('have.class', 'node-children')
|
||||
.as('node-children');
|
||||
|
||||
cy.get('@node-children').children().should('have.length', 1);
|
||||
cy.get('@node-children')
|
||||
.first()
|
||||
.get('.node-card')
|
||||
.should('have.class', 'active-child')
|
||||
.contains('Test Employee 7');
|
||||
|
||||
// orphan connectors removed
|
||||
cy.get(`#connectors`).children().should('have.length', 2);
|
||||
});
|
||||
});
|
||||
|
||||
it('renders sibling group', () => {
|
||||
cy.call('erpnext.tests.ui_test_helpers.get_employee_records').then(employee_records => {
|
||||
// sibling group visible for parent
|
||||
cy.get(`#${employee_records.message[1]}`)
|
||||
.next()
|
||||
.as('sibling_group');
|
||||
|
||||
cy.get('@sibling_group')
|
||||
.should('have.attr', 'data-parent', 'undefined')
|
||||
.should('have.class', 'node-group')
|
||||
.and('have.class', 'collapsed');
|
||||
|
||||
cy.get('@sibling_group').get('.avatar-group').children().as('siblings');
|
||||
cy.get('@siblings').should('have.length', 1);
|
||||
cy.get('@siblings')
|
||||
.first()
|
||||
.should('have.attr', 'title', 'Test Employee 1');
|
||||
|
||||
});
|
||||
});
|
||||
|
||||
it('expands previous level nodes', () => {
|
||||
cy.call('erpnext.tests.ui_test_helpers.get_employee_records').then(employee_records => {
|
||||
cy.get(`#${employee_records.message[6]}`)
|
||||
.click()
|
||||
.should('have.class', 'active');
|
||||
|
||||
// clicking on previous level node should remove all the nodes ahead
|
||||
// and expand that node
|
||||
cy.get(`#${employee_records.message[3]}`).click();
|
||||
cy.get(`#${employee_records.message[3]}`)
|
||||
.should('have.class', 'active')
|
||||
.should('not.have.class', 'active-path');
|
||||
|
||||
cy.get(`#${employee_records.message[6]}`).should('have.class', 'active-child');
|
||||
cy.get('.hierarchy-mobile').children().should('have.length', 2);
|
||||
cy.get(`#connectors`).children().should('have.length', 2);
|
||||
});
|
||||
});
|
||||
|
||||
it('expands sibling group', () => {
|
||||
cy.call('erpnext.tests.ui_test_helpers.get_employee_records').then(employee_records => {
|
||||
// sibling group visible for parent
|
||||
cy.get(`#${employee_records.message[6]}`).click();
|
||||
|
||||
cy.get(`#${employee_records.message[3]}`)
|
||||
.next()
|
||||
.click();
|
||||
|
||||
// siblings of parent should be visible
|
||||
cy.get('.hierarchy-mobile').prev().as('sibling_group');
|
||||
cy.get('@sibling_group')
|
||||
.should('exist')
|
||||
.should('have.class', 'sibling-group')
|
||||
.should('not.have.class', 'collapsed');
|
||||
|
||||
cy.get(`#${employee_records.message[1]}`)
|
||||
.should('be.visible')
|
||||
.should('have.class', 'active');
|
||||
|
||||
cy.get(`[data-parent="${employee_records.message[1]}"]`)
|
||||
.should('be.visible')
|
||||
.should('have.length', 2)
|
||||
.should('have.class', 'active-child');
|
||||
});
|
||||
});
|
||||
|
||||
it('goes to the respective level after clicking on non-collapsed sibling group', () => {
|
||||
cy.call('erpnext.tests.ui_test_helpers.get_employee_records').then(() => {
|
||||
// click on non-collapsed sibling group
|
||||
cy.get('.hierarchy-mobile')
|
||||
.prev()
|
||||
.click();
|
||||
|
||||
// should take you to that level
|
||||
cy.get('.hierarchy-mobile').find('li.level .node-card').should('have.length', 2);
|
||||
});
|
||||
});
|
||||
|
||||
it('edit node navigates to employee master', () => {
|
||||
cy.call('erpnext.tests.ui_test_helpers.get_employee_records').then(employee_records => {
|
||||
cy.get(`#${employee_records.message[0]}`).find('.btn-edit-node')
|
||||
.click();
|
||||
|
||||
cy.url().should('include', `/employee/${employee_records.message[0]}`);
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -1,17 +0,0 @@
|
||||
// ***********************************************************
|
||||
// This example plugins/index.js can be used to load plugins
|
||||
//
|
||||
// You can change the location of this file or turn off loading
|
||||
// the plugins file with the 'pluginsFile' configuration option.
|
||||
//
|
||||
// You can read more here:
|
||||
// https://on.cypress.io/plugins-guide
|
||||
// ***********************************************************
|
||||
|
||||
// This function is called when a project is opened or re-opened (e.g. due to
|
||||
// the project's config changing)
|
||||
|
||||
module.exports = () => {
|
||||
// `on` is used to hook into various events Cypress emits
|
||||
// `config` is the resolved Cypress config
|
||||
};
|
||||
@@ -1,31 +0,0 @@
|
||||
// ***********************************************
|
||||
// This example commands.js shows you how to
|
||||
// create various custom commands and overwrite
|
||||
// existing commands.
|
||||
//
|
||||
// For more comprehensive examples of custom
|
||||
// commands please read more here:
|
||||
// https://on.cypress.io/custom-commands
|
||||
// ***********************************************
|
||||
//
|
||||
//
|
||||
// -- This is a parent command --
|
||||
// Cypress.Commands.add("login", (email, password) => { ... });
|
||||
//
|
||||
//
|
||||
// -- This is a child command --
|
||||
// Cypress.Commands.add("drag", { prevSubject: 'element'}, (subject, options) => { ... });
|
||||
//
|
||||
//
|
||||
// -- This is a dual command --
|
||||
// Cypress.Commands.add("dismiss", { prevSubject: 'optional'}, (subject, options) => { ... });
|
||||
//
|
||||
//
|
||||
// -- This is will overwrite an existing command --
|
||||
// Cypress.Commands.overwrite("visit", (originalFn, url, options) => { ... });
|
||||
|
||||
const slug = (name) => name.toLowerCase().replace(" ", "-");
|
||||
|
||||
Cypress.Commands.add("go_to_doc", (doctype, name) => {
|
||||
cy.visit(`/app/${slug(doctype)}/${encodeURIComponent(name)}`);
|
||||
});
|
||||
@@ -1,26 +0,0 @@
|
||||
// ***********************************************************
|
||||
// This example support/index.js is processed and
|
||||
// loaded automatically before your test files.
|
||||
//
|
||||
// This is a great place to put global configuration and
|
||||
// behavior that modifies Cypress.
|
||||
//
|
||||
// You can change the location of this file or turn off
|
||||
// automatically serving support files with the
|
||||
// 'supportFile' configuration option.
|
||||
//
|
||||
// You can read more here:
|
||||
// https://on.cypress.io/configuration
|
||||
// ***********************************************************
|
||||
|
||||
// Import commands.js using ES2015 syntax:
|
||||
import './commands';
|
||||
import '../../../frappe/cypress/support/commands' // eslint-disable-line
|
||||
|
||||
|
||||
// Alternatively you can use CommonJS syntax:
|
||||
// require('./commands')
|
||||
|
||||
Cypress.Cookies.defaults({
|
||||
preserve: 'sid'
|
||||
});
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"allowJs": true,
|
||||
"baseUrl": "../node_modules",
|
||||
"types": [
|
||||
"cypress"
|
||||
]
|
||||
},
|
||||
"include": [
|
||||
"**/*.*"
|
||||
]
|
||||
}
|
||||
@@ -1,9 +0,0 @@
|
||||
{
|
||||
"extends": ["stylelint-config-recommended"],
|
||||
"plugins": ["stylelint-scss"],
|
||||
"rules": {
|
||||
"at-rule-no-unknown": null,
|
||||
"scss/at-rule-no-unknown": true,
|
||||
"no-descending-specificity": null
|
||||
}
|
||||
}
|
||||
@@ -1,143 +1 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from __future__ import unicode_literals
|
||||
|
||||
import inspect
|
||||
|
||||
import frappe
|
||||
|
||||
from erpnext.hooks import regional_overrides
|
||||
|
||||
__version__ = '13.13.0'
|
||||
|
||||
def get_default_company(user=None):
|
||||
'''Get default company for user'''
|
||||
from frappe.defaults import get_user_default_as_list
|
||||
|
||||
if not user:
|
||||
user = frappe.session.user
|
||||
|
||||
companies = get_user_default_as_list(user, 'company')
|
||||
if companies:
|
||||
default_company = companies[0]
|
||||
else:
|
||||
default_company = frappe.db.get_single_value('Global Defaults', 'default_company')
|
||||
|
||||
return default_company
|
||||
|
||||
|
||||
def get_default_currency():
|
||||
'''Returns the currency of the default company'''
|
||||
company = get_default_company()
|
||||
if company:
|
||||
return frappe.get_cached_value('Company', company, 'default_currency')
|
||||
|
||||
def get_default_cost_center(company):
|
||||
'''Returns the default cost center of the company'''
|
||||
if not company:
|
||||
return None
|
||||
|
||||
if not frappe.flags.company_cost_center:
|
||||
frappe.flags.company_cost_center = {}
|
||||
if not company in frappe.flags.company_cost_center:
|
||||
frappe.flags.company_cost_center[company] = frappe.get_cached_value('Company', company, 'cost_center')
|
||||
return frappe.flags.company_cost_center[company]
|
||||
|
||||
def get_company_currency(company):
|
||||
'''Returns the default company currency'''
|
||||
if not frappe.flags.company_currency:
|
||||
frappe.flags.company_currency = {}
|
||||
if not company in frappe.flags.company_currency:
|
||||
frappe.flags.company_currency[company] = frappe.db.get_value('Company', company, 'default_currency', cache=True)
|
||||
return frappe.flags.company_currency[company]
|
||||
|
||||
def set_perpetual_inventory(enable=1, company=None):
|
||||
if not company:
|
||||
company = "_Test Company" if frappe.flags.in_test else get_default_company()
|
||||
|
||||
company = frappe.get_doc("Company", company)
|
||||
company.enable_perpetual_inventory = enable
|
||||
company.save()
|
||||
|
||||
def encode_company_abbr(name, company):
|
||||
'''Returns name encoded with company abbreviation'''
|
||||
company_abbr = frappe.get_cached_value('Company', company, "abbr")
|
||||
parts = name.rsplit(" - ", 1)
|
||||
|
||||
if parts[-1].lower() != company_abbr.lower():
|
||||
parts.append(company_abbr)
|
||||
|
||||
return " - ".join(parts)
|
||||
|
||||
def is_perpetual_inventory_enabled(company):
|
||||
if not company:
|
||||
company = "_Test Company" if frappe.flags.in_test else get_default_company()
|
||||
|
||||
if not hasattr(frappe.local, 'enable_perpetual_inventory'):
|
||||
frappe.local.enable_perpetual_inventory = {}
|
||||
|
||||
if not company in frappe.local.enable_perpetual_inventory:
|
||||
frappe.local.enable_perpetual_inventory[company] = frappe.get_cached_value('Company',
|
||||
company, "enable_perpetual_inventory") or 0
|
||||
|
||||
return frappe.local.enable_perpetual_inventory[company]
|
||||
|
||||
def get_default_finance_book(company=None):
|
||||
if not company:
|
||||
company = get_default_company()
|
||||
|
||||
if not hasattr(frappe.local, 'default_finance_book'):
|
||||
frappe.local.default_finance_book = {}
|
||||
|
||||
if not company in frappe.local.default_finance_book:
|
||||
frappe.local.default_finance_book[company] = frappe.get_cached_value('Company',
|
||||
company, "default_finance_book")
|
||||
|
||||
return frappe.local.default_finance_book[company]
|
||||
|
||||
def get_party_account_type(party_type):
|
||||
if not hasattr(frappe.local, 'party_account_types'):
|
||||
frappe.local.party_account_types = {}
|
||||
|
||||
if not party_type in frappe.local.party_account_types:
|
||||
frappe.local.party_account_types[party_type] = frappe.db.get_value("Party Type",
|
||||
party_type, "account_type") or ''
|
||||
|
||||
return frappe.local.party_account_types[party_type]
|
||||
|
||||
def get_region(company=None):
|
||||
'''Return the default country based on flag, company or global settings
|
||||
|
||||
You can also set global company flag in `frappe.flags.company`
|
||||
'''
|
||||
if company or frappe.flags.company:
|
||||
return frappe.get_cached_value('Company',
|
||||
company or frappe.flags.company, 'country')
|
||||
elif frappe.flags.country:
|
||||
return frappe.flags.country
|
||||
else:
|
||||
return frappe.get_system_settings('country')
|
||||
|
||||
def allow_regional(fn):
|
||||
'''Decorator to make a function regionally overridable
|
||||
|
||||
Example:
|
||||
@erpnext.allow_regional
|
||||
def myfunction():
|
||||
pass'''
|
||||
def caller(*args, **kwargs):
|
||||
region = get_region()
|
||||
fn_name = inspect.getmodule(fn).__name__ + '.' + fn.__name__
|
||||
if region in regional_overrides and fn_name in regional_overrides[region]:
|
||||
return frappe.get_attr(regional_overrides[region][fn_name])(*args, **kwargs)
|
||||
else:
|
||||
return fn(*args, **kwargs)
|
||||
|
||||
return caller
|
||||
|
||||
def get_last_membership(member):
|
||||
'''Returns last membership if exists'''
|
||||
last_membership = frappe.get_all('Membership', 'name,to_date,membership_type',
|
||||
dict(member=member, paid=1), order_by='to_date desc', limit=1)
|
||||
|
||||
if last_membership:
|
||||
return last_membership[0]
|
||||
from erpnext.__version__ import __version__
|
||||
|
||||
2
erpnext/__version__.py
Normal file
2
erpnext/__version__.py
Normal file
@@ -0,0 +1,2 @@
|
||||
from __future__ import unicode_literals
|
||||
__version__ = '4.25.7'
|
||||
@@ -6,7 +6,7 @@ Accounting heads are called "Accounts" and they can be groups in a tree like
|
||||
|
||||
Entries are:
|
||||
|
||||
- Journal Entries
|
||||
- Journal Vouchers
|
||||
- Sales Invoice (Itemised)
|
||||
- Purchase Invoice (Itemised)
|
||||
|
||||
|
||||
@@ -1,58 +0,0 @@
|
||||
{
|
||||
"cards": [
|
||||
{
|
||||
"card": "Total Outgoing Bills"
|
||||
},
|
||||
{
|
||||
"card": "Total Incoming Bills"
|
||||
},
|
||||
{
|
||||
"card": "Total Incoming Payment"
|
||||
},
|
||||
{
|
||||
"card": "Total Outgoing Payment"
|
||||
}
|
||||
],
|
||||
"charts": [
|
||||
{
|
||||
"chart": "Profit and Loss",
|
||||
"width": "Full"
|
||||
},
|
||||
{
|
||||
"chart": "Incoming Bills (Purchase Invoice)",
|
||||
"width": "Half"
|
||||
},
|
||||
{
|
||||
"chart": "Outgoing Bills (Sales Invoice)",
|
||||
"width": "Half"
|
||||
},
|
||||
{
|
||||
"chart": "Accounts Receivable Ageing",
|
||||
"width": "Half"
|
||||
},
|
||||
{
|
||||
"chart": "Accounts Payable Ageing",
|
||||
"width": "Half"
|
||||
},
|
||||
{
|
||||
"chart": "Budget Variance",
|
||||
"width": "Full"
|
||||
},
|
||||
{
|
||||
"chart": "Bank Balance",
|
||||
"width": "Full"
|
||||
}
|
||||
],
|
||||
"creation": "2020-07-17 11:25:34.796608",
|
||||
"dashboard_name": "Accounts",
|
||||
"docstatus": 0,
|
||||
"doctype": "Dashboard",
|
||||
"idx": 0,
|
||||
"is_default": 0,
|
||||
"is_standard": 1,
|
||||
"modified": "2020-07-22 13:07:34.540574",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Accounts",
|
||||
"name": "Accounts",
|
||||
"owner": "Administrator"
|
||||
}
|
||||
@@ -1,126 +0,0 @@
|
||||
{
|
||||
"custom_fields": [
|
||||
{
|
||||
"_assign": null,
|
||||
"_comments": null,
|
||||
"_liked_by": null,
|
||||
"_user_tags": null,
|
||||
"allow_in_quick_entry": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"collapsible_depends_on": null,
|
||||
"columns": 0,
|
||||
"creation": "2018-12-28 22:29:21.828090",
|
||||
"default": null,
|
||||
"depends_on": null,
|
||||
"description": null,
|
||||
"docstatus": 0,
|
||||
"dt": "Address",
|
||||
"fetch_from": null,
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "tax_category",
|
||||
"fieldtype": "Link",
|
||||
"hidden": 0,
|
||||
"hide_border": 0,
|
||||
"hide_days": 0,
|
||||
"hide_seconds": 0,
|
||||
"idx": 15,
|
||||
"ignore_user_permissions": 0,
|
||||
"ignore_xss_filter": 0,
|
||||
"in_global_search": 0,
|
||||
"in_list_view": 0,
|
||||
"in_preview": 0,
|
||||
"in_standard_filter": 0,
|
||||
"insert_after": "fax",
|
||||
"label": "Tax Category",
|
||||
"length": 0,
|
||||
"mandatory_depends_on": null,
|
||||
"modified": "2018-12-28 22:29:21.828090",
|
||||
"modified_by": "Administrator",
|
||||
"name": "Address-tax_category",
|
||||
"no_copy": 0,
|
||||
"options": "Tax Category",
|
||||
"owner": "Administrator",
|
||||
"parent": null,
|
||||
"parentfield": null,
|
||||
"parenttype": null,
|
||||
"permlevel": 0,
|
||||
"precision": "",
|
||||
"print_hide": 0,
|
||||
"print_hide_if_no_value": 0,
|
||||
"print_width": null,
|
||||
"read_only": 0,
|
||||
"read_only_depends_on": null,
|
||||
"report_hide": 0,
|
||||
"reqd": 0,
|
||||
"search_index": 0,
|
||||
"translatable": 0,
|
||||
"unique": 0,
|
||||
"width": null
|
||||
},
|
||||
{
|
||||
"_assign": null,
|
||||
"_comments": null,
|
||||
"_liked_by": null,
|
||||
"_user_tags": null,
|
||||
"allow_in_quick_entry": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"collapsible_depends_on": null,
|
||||
"columns": 0,
|
||||
"creation": "2020-10-14 17:41:40.878179",
|
||||
"default": "0",
|
||||
"depends_on": null,
|
||||
"description": null,
|
||||
"docstatus": 0,
|
||||
"dt": "Address",
|
||||
"fetch_from": null,
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "is_your_company_address",
|
||||
"fieldtype": "Check",
|
||||
"hidden": 0,
|
||||
"hide_border": 0,
|
||||
"hide_days": 0,
|
||||
"hide_seconds": 0,
|
||||
"idx": 20,
|
||||
"ignore_user_permissions": 0,
|
||||
"ignore_xss_filter": 0,
|
||||
"in_global_search": 0,
|
||||
"in_list_view": 0,
|
||||
"in_preview": 0,
|
||||
"in_standard_filter": 0,
|
||||
"insert_after": "linked_with",
|
||||
"label": "Is Your Company Address",
|
||||
"length": 0,
|
||||
"mandatory_depends_on": null,
|
||||
"modified": "2020-10-14 17:41:40.878179",
|
||||
"modified_by": "Administrator",
|
||||
"name": "Address-is_your_company_address",
|
||||
"no_copy": 0,
|
||||
"options": null,
|
||||
"owner": "Administrator",
|
||||
"parent": null,
|
||||
"parentfield": null,
|
||||
"parenttype": null,
|
||||
"permlevel": 0,
|
||||
"precision": "",
|
||||
"print_hide": 0,
|
||||
"print_hide_if_no_value": 0,
|
||||
"print_width": null,
|
||||
"read_only": 0,
|
||||
"read_only_depends_on": null,
|
||||
"report_hide": 0,
|
||||
"reqd": 0,
|
||||
"search_index": 0,
|
||||
"translatable": 0,
|
||||
"unique": 0,
|
||||
"width": null
|
||||
}
|
||||
],
|
||||
"custom_perms": [],
|
||||
"doctype": "Address",
|
||||
"property_setters": [],
|
||||
"sync_on_migrate": 1
|
||||
}
|
||||
@@ -1,61 +0,0 @@
|
||||
import frappe
|
||||
from frappe import _
|
||||
from frappe.contacts.doctype.address.address import (
|
||||
Address,
|
||||
get_address_display,
|
||||
get_address_templates,
|
||||
)
|
||||
|
||||
|
||||
class ERPNextAddress(Address):
|
||||
def validate(self):
|
||||
self.validate_reference()
|
||||
super(ERPNextAddress, self).validate()
|
||||
|
||||
def link_address(self):
|
||||
"""Link address based on owner"""
|
||||
if self.is_your_company_address:
|
||||
return
|
||||
|
||||
return super(ERPNextAddress, self).link_address()
|
||||
|
||||
def validate_reference(self):
|
||||
if self.is_your_company_address and not [
|
||||
row for row in self.links if row.link_doctype == "Company"
|
||||
]:
|
||||
frappe.throw(_("Address needs to be linked to a Company. Please add a row for Company in the Links table."),
|
||||
title=_("Company Not Linked"))
|
||||
|
||||
def on_update(self):
|
||||
"""
|
||||
After Address is updated, update the related 'Primary Address' on Customer.
|
||||
"""
|
||||
address_display = get_address_display(self.as_dict())
|
||||
filters = {
|
||||
"customer_primary_address": self.name
|
||||
}
|
||||
|
||||
customers = frappe.db.get_all("Customer", filters=filters, as_list=True)
|
||||
for customer_name in customers:
|
||||
frappe.db.set_value("Customer", customer_name[0], "primary_address", address_display)
|
||||
|
||||
@frappe.whitelist()
|
||||
def get_shipping_address(company, address = None):
|
||||
filters = [
|
||||
["Dynamic Link", "link_doctype", "=", "Company"],
|
||||
["Dynamic Link", "link_name", "=", company],
|
||||
["Address", "is_your_company_address", "=", 1]
|
||||
]
|
||||
fields = ["*"]
|
||||
if address and frappe.db.get_value('Dynamic Link',
|
||||
{'parent': address, 'link_name': company}):
|
||||
filters.append(["Address", "name", "=", address])
|
||||
if not address:
|
||||
filters.append(["Address", "is_shipping_address", "=", 1])
|
||||
|
||||
address = frappe.get_all("Address", filters=filters, fields=fields) or {}
|
||||
|
||||
if address:
|
||||
address_as_dict = address[0]
|
||||
name, address_template = get_address_templates(address_as_dict)
|
||||
return address_as_dict.get("name"), frappe.render_template(address_template, address_as_dict)
|
||||
@@ -1,23 +0,0 @@
|
||||
{
|
||||
"chart_name": "Accounts Payable Ageing",
|
||||
"chart_type": "Report",
|
||||
"creation": "2020-07-17 11:25:34.564015",
|
||||
"docstatus": 0,
|
||||
"doctype": "Dashboard Chart",
|
||||
"dynamic_filters_json": "{\"company\":\"frappe.defaults.get_user_default(\\\"Company\\\")\",\"report_date\":\"frappe.datetime.now_date()\"}",
|
||||
"filters_json": "{\"ageing_based_on\":\"Due Date\",\"range1\":30,\"range2\":60,\"range3\":90,\"range4\":120,\"group_by_party\":0,\"based_on_payment_terms\":0}",
|
||||
"idx": 0,
|
||||
"is_public": 1,
|
||||
"is_standard": 1,
|
||||
"modified": "2020-07-22 12:29:33.584419",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Accounts",
|
||||
"name": "Accounts Payable Ageing",
|
||||
"number_of_groups": 0,
|
||||
"owner": "Administrator",
|
||||
"report_name": "Accounts Payable",
|
||||
"timeseries": 0,
|
||||
"type": "Donut",
|
||||
"use_report_chart": 1,
|
||||
"y_axis": []
|
||||
}
|
||||
@@ -1,23 +0,0 @@
|
||||
{
|
||||
"chart_name": "Accounts Receivable Ageing",
|
||||
"chart_type": "Report",
|
||||
"creation": "2020-07-17 11:25:34.535388",
|
||||
"docstatus": 0,
|
||||
"doctype": "Dashboard Chart",
|
||||
"dynamic_filters_json": "{\"company\":\"frappe.defaults.get_user_default(\\\"Company\\\")\",\"report_date\":\"frappe.datetime.now_date()\"}",
|
||||
"filters_json": "{\"ageing_based_on\":\"Due Date\",\"range1\":30,\"range2\":60,\"range3\":90,\"range4\":120,\"group_by_party\":0,\"based_on_payment_terms\":0,\"show_future_payments\":0,\"show_delivery_notes\":0,\"show_sales_person\":0}",
|
||||
"idx": 0,
|
||||
"is_public": 1,
|
||||
"is_standard": 1,
|
||||
"modified": "2020-07-22 12:28:42.743551",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Accounts",
|
||||
"name": "Accounts Receivable Ageing",
|
||||
"number_of_groups": 0,
|
||||
"owner": "Administrator",
|
||||
"report_name": "Accounts Receivable",
|
||||
"timeseries": 0,
|
||||
"type": "Donut",
|
||||
"use_report_chart": 1,
|
||||
"y_axis": []
|
||||
}
|
||||
@@ -1,26 +0,0 @@
|
||||
{
|
||||
"chart_name": "Bank Balance",
|
||||
"chart_type": "Custom",
|
||||
"creation": "2020-07-17 11:25:34.620221",
|
||||
"docstatus": 0,
|
||||
"doctype": "Dashboard Chart",
|
||||
"dynamic_filters_json": "{\"company\":\"frappe.defaults.get_user_default(\\\"Company\\\")\",\"account\":\"locals[\\\":Company\\\"][frappe.defaults.get_user_default(\\\"Company\\\")][\\\"default_bank_account\\\"]\"}",
|
||||
"filters_json": "{}",
|
||||
"idx": 0,
|
||||
"is_public": 1,
|
||||
"is_standard": 1,
|
||||
"last_synced_on": "2020-07-22 12:19:59.879476",
|
||||
"modified": "2020-07-22 12:21:48.780513",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Accounts",
|
||||
"name": "Bank Balance",
|
||||
"number_of_groups": 0,
|
||||
"owner": "Administrator",
|
||||
"source": "Account Balance Timeline",
|
||||
"time_interval": "Quarterly",
|
||||
"timeseries": 0,
|
||||
"timespan": "Last Year",
|
||||
"type": "Line",
|
||||
"use_report_chart": 0,
|
||||
"y_axis": []
|
||||
}
|
||||
@@ -1,23 +0,0 @@
|
||||
{
|
||||
"chart_name": "Budget Variance",
|
||||
"chart_type": "Report",
|
||||
"creation": "2020-07-17 11:25:34.593061",
|
||||
"docstatus": 0,
|
||||
"doctype": "Dashboard Chart",
|
||||
"dynamic_filters_json": "{\"company\":\"frappe.defaults.get_user_default(\\\"Company\\\")\",\"from_fiscal_year\":\"frappe.sys_defaults.fiscal_year\",\"to_fiscal_year\":\"frappe.sys_defaults.fiscal_year\"}",
|
||||
"filters_json": "{\"period\":\"Monthly\",\"budget_against\":\"Cost Center\",\"show_cumulative\":0}",
|
||||
"idx": 0,
|
||||
"is_public": 1,
|
||||
"is_standard": 1,
|
||||
"modified": "2020-07-22 12:24:49.144210",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Accounts",
|
||||
"name": "Budget Variance",
|
||||
"number_of_groups": 0,
|
||||
"owner": "Administrator",
|
||||
"report_name": "Budget Variance Report",
|
||||
"timeseries": 0,
|
||||
"type": "Bar",
|
||||
"use_report_chart": 1,
|
||||
"y_axis": []
|
||||
}
|
||||
@@ -1,29 +0,0 @@
|
||||
{
|
||||
"based_on": "posting_date",
|
||||
"chart_name": "Incoming Bills (Purchase Invoice)",
|
||||
"chart_type": "Sum",
|
||||
"color": "#a83333",
|
||||
"creation": "2020-07-17 11:25:34.479703",
|
||||
"docstatus": 0,
|
||||
"doctype": "Dashboard Chart",
|
||||
"document_type": "Purchase Invoice",
|
||||
"dynamic_filters_json": "",
|
||||
"filters_json": "[[\"Purchase Invoice\",\"docstatus\",\"=\",1]]",
|
||||
"idx": 0,
|
||||
"is_public": 1,
|
||||
"is_standard": 1,
|
||||
"last_synced_on": "2020-07-21 17:37:30.727306",
|
||||
"modified": "2020-07-21 17:51:07.374917",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Accounts",
|
||||
"name": "Incoming Bills (Purchase Invoice)",
|
||||
"number_of_groups": 0,
|
||||
"owner": "Administrator",
|
||||
"time_interval": "Monthly",
|
||||
"timeseries": 1,
|
||||
"timespan": "Last Year",
|
||||
"type": "Bar",
|
||||
"use_report_chart": 0,
|
||||
"value_based_on": "base_net_total",
|
||||
"y_axis": []
|
||||
}
|
||||
@@ -1,28 +0,0 @@
|
||||
{
|
||||
"based_on": "posting_date",
|
||||
"chart_name": "Outgoing Bills (Sales Invoice)",
|
||||
"chart_type": "Sum",
|
||||
"color": "#7b933d",
|
||||
"creation": "2020-07-17 11:25:34.507547",
|
||||
"docstatus": 0,
|
||||
"doctype": "Dashboard Chart",
|
||||
"document_type": "Sales Invoice",
|
||||
"filters_json": "[[\"Sales Invoice\",\"docstatus\",\"=\",1]]",
|
||||
"idx": 0,
|
||||
"is_public": 1,
|
||||
"is_standard": 1,
|
||||
"last_synced_on": "2020-07-21 17:37:31.574666",
|
||||
"modified": "2020-07-21 17:52:03.970530",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Accounts",
|
||||
"name": "Outgoing Bills (Sales Invoice)",
|
||||
"number_of_groups": 0,
|
||||
"owner": "Administrator",
|
||||
"time_interval": "Monthly",
|
||||
"timeseries": 1,
|
||||
"timespan": "Last Year",
|
||||
"type": "Bar",
|
||||
"use_report_chart": 0,
|
||||
"value_based_on": "base_net_total",
|
||||
"y_axis": []
|
||||
}
|
||||
@@ -1,23 +0,0 @@
|
||||
{
|
||||
"chart_name": "Profit and Loss",
|
||||
"chart_type": "Report",
|
||||
"creation": "2020-07-17 11:25:34.448572",
|
||||
"docstatus": 0,
|
||||
"doctype": "Dashboard Chart",
|
||||
"dynamic_filters_json": "{\"company\":\"frappe.defaults.get_user_default(\\\"Company\\\")\",\"from_fiscal_year\":\"frappe.sys_defaults.fiscal_year\",\"to_fiscal_year\":\"frappe.sys_defaults.fiscal_year\"}",
|
||||
"filters_json": "{\"filter_based_on\":\"Fiscal Year\",\"period_start_date\":\"2020-04-01\",\"period_end_date\":\"2021-03-31\",\"periodicity\":\"Yearly\",\"include_default_book_entries\":1}",
|
||||
"idx": 0,
|
||||
"is_public": 1,
|
||||
"is_standard": 1,
|
||||
"modified": "2020-07-22 12:33:48.888943",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Accounts",
|
||||
"name": "Profit and Loss",
|
||||
"number_of_groups": 0,
|
||||
"owner": "Administrator",
|
||||
"report_name": "Profit and Loss Statement",
|
||||
"timeseries": 0,
|
||||
"type": "Bar",
|
||||
"use_report_chart": 1,
|
||||
"y_axis": []
|
||||
}
|
||||
@@ -1,22 +0,0 @@
|
||||
frappe.provide('frappe.dashboards.chart_sources');
|
||||
|
||||
frappe.dashboards.chart_sources["Account Balance Timeline"] = {
|
||||
method: "erpnext.accounts.dashboard_chart_source.account_balance_timeline.account_balance_timeline.get",
|
||||
filters: [
|
||||
{
|
||||
fieldname: "company",
|
||||
label: __("Company"),
|
||||
fieldtype: "Link",
|
||||
options: "Company",
|
||||
default: frappe.defaults.get_user_default("Company"),
|
||||
reqd: 1
|
||||
},
|
||||
{
|
||||
fieldname: "account",
|
||||
label: __("Account"),
|
||||
fieldtype: "Link",
|
||||
options: "Account",
|
||||
reqd: 1
|
||||
},
|
||||
]
|
||||
};
|
||||
@@ -1,13 +0,0 @@
|
||||
{
|
||||
"creation": "2019-02-06 07:57:10.377718",
|
||||
"docstatus": 0,
|
||||
"doctype": "Dashboard Chart Source",
|
||||
"idx": 0,
|
||||
"modified": "2019-04-09 18:30:49.943174",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Accounts",
|
||||
"name": "Account Balance Timeline",
|
||||
"owner": "Administrator",
|
||||
"source_name": "Account Balance Timeline",
|
||||
"timeseries": 1
|
||||
}
|
||||
@@ -1,122 +0,0 @@
|
||||
# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
|
||||
# License: GNU General Public License v3. See license.txt
|
||||
|
||||
from __future__ import unicode_literals
|
||||
|
||||
import frappe
|
||||
from frappe import _
|
||||
from frappe.utils import add_to_date, formatdate, get_link_to_form, getdate, nowdate
|
||||
from frappe.utils.dashboard import cache_source
|
||||
from frappe.utils.dateutils import get_from_date_from_timespan, get_period_ending
|
||||
from frappe.utils.nestedset import get_descendants_of
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
@cache_source
|
||||
def get(chart_name = None, chart = None, no_cache = None, filters = None, from_date = None,
|
||||
to_date = None, timespan = None, time_interval = None, heatmap_year = None):
|
||||
if chart_name:
|
||||
chart = frappe.get_doc('Dashboard Chart', chart_name)
|
||||
else:
|
||||
chart = frappe._dict(frappe.parse_json(chart))
|
||||
timespan = chart.timespan
|
||||
|
||||
if chart.timespan == 'Select Date Range':
|
||||
from_date = chart.from_date
|
||||
to_date = chart.to_date
|
||||
|
||||
timegrain = chart.time_interval
|
||||
filters = frappe.parse_json(filters) or frappe.parse_json(chart.filters_json)
|
||||
|
||||
account = filters.get("account")
|
||||
company = filters.get("company")
|
||||
|
||||
if not account and chart_name:
|
||||
frappe.throw(_("Account is not set for the dashboard chart {0}")
|
||||
.format(get_link_to_form("Dashboard Chart", chart_name)))
|
||||
|
||||
if not frappe.db.exists("Account", account) and chart_name:
|
||||
frappe.throw(_("Account {0} does not exists in the dashboard chart {1}")
|
||||
.format(account, get_link_to_form("Dashboard Chart", chart_name)))
|
||||
|
||||
if not to_date:
|
||||
to_date = nowdate()
|
||||
if not from_date:
|
||||
if timegrain in ('Monthly', 'Quarterly'):
|
||||
from_date = get_from_date_from_timespan(to_date, timespan)
|
||||
|
||||
# fetch dates to plot
|
||||
dates = get_dates_from_timegrain(from_date, to_date, timegrain)
|
||||
|
||||
# get all the entries for this account and its descendants
|
||||
gl_entries = get_gl_entries(account, get_period_ending(to_date, timegrain))
|
||||
|
||||
# compile balance values
|
||||
result = build_result(account, dates, gl_entries)
|
||||
|
||||
return {
|
||||
"labels": [formatdate(r[0].strftime('%Y-%m-%d')) for r in result],
|
||||
"datasets": [{
|
||||
"name": account,
|
||||
"values": [r[1] for r in result]
|
||||
}]
|
||||
}
|
||||
|
||||
def build_result(account, dates, gl_entries):
|
||||
result = [[getdate(date), 0.0] for date in dates]
|
||||
root_type = frappe.db.get_value('Account', account, 'root_type')
|
||||
|
||||
# start with the first date
|
||||
date_index = 0
|
||||
|
||||
# get balances in debit
|
||||
for entry in gl_entries:
|
||||
|
||||
# entry date is after the current pointer, so move the pointer forward
|
||||
while getdate(entry.posting_date) > result[date_index][0]:
|
||||
date_index += 1
|
||||
|
||||
result[date_index][1] += entry.debit - entry.credit
|
||||
|
||||
# if account type is credit, switch balances
|
||||
if root_type not in ('Asset', 'Expense'):
|
||||
for r in result:
|
||||
r[1] = -1 * r[1]
|
||||
|
||||
# for balance sheet accounts, the totals are cumulative
|
||||
if root_type in ('Asset', 'Liability', 'Equity'):
|
||||
for i, r in enumerate(result):
|
||||
if i > 0:
|
||||
r[1] = r[1] + result[i-1][1]
|
||||
|
||||
return result
|
||||
|
||||
def get_gl_entries(account, to_date):
|
||||
child_accounts = get_descendants_of('Account', account, ignore_permissions=True)
|
||||
child_accounts.append(account)
|
||||
|
||||
return frappe.db.get_all('GL Entry',
|
||||
fields = ['posting_date', 'debit', 'credit'],
|
||||
filters = [
|
||||
dict(posting_date = ('<', to_date)),
|
||||
dict(account = ('in', child_accounts)),
|
||||
dict(voucher_type = ('!=', 'Period Closing Voucher'))
|
||||
],
|
||||
order_by = 'posting_date asc')
|
||||
|
||||
def get_dates_from_timegrain(from_date, to_date, timegrain):
|
||||
days = months = years = 0
|
||||
if "Daily" == timegrain:
|
||||
days = 1
|
||||
elif "Weekly" == timegrain:
|
||||
days = 7
|
||||
elif "Monthly" == timegrain:
|
||||
months = 1
|
||||
elif "Quarterly" == timegrain:
|
||||
months = 3
|
||||
|
||||
dates = [get_period_ending(from_date, timegrain)]
|
||||
while getdate(dates[-1]) < getdate(to_date):
|
||||
date = get_period_ending(add_to_date(dates[-1], years=years, months=months, days=days), timegrain)
|
||||
dates.append(date)
|
||||
return dates
|
||||
@@ -1,470 +0,0 @@
|
||||
from __future__ import unicode_literals
|
||||
|
||||
import frappe
|
||||
from frappe import _
|
||||
from frappe.email import sendmail_to_system_managers
|
||||
from frappe.utils import (
|
||||
add_days,
|
||||
add_months,
|
||||
cint,
|
||||
date_diff,
|
||||
flt,
|
||||
get_first_day,
|
||||
get_last_day,
|
||||
get_link_to_form,
|
||||
getdate,
|
||||
rounded,
|
||||
today,
|
||||
)
|
||||
|
||||
from erpnext.accounts.doctype.accounting_dimension.accounting_dimension import (
|
||||
get_accounting_dimensions,
|
||||
)
|
||||
from erpnext.accounts.utils import get_account_currency
|
||||
|
||||
|
||||
def validate_service_stop_date(doc):
|
||||
''' Validates service_stop_date for Purchase Invoice and Sales Invoice '''
|
||||
|
||||
enable_check = "enable_deferred_revenue" \
|
||||
if doc.doctype=="Sales Invoice" else "enable_deferred_expense"
|
||||
|
||||
old_stop_dates = {}
|
||||
old_doc = frappe.db.get_all("{0} Item".format(doc.doctype),
|
||||
{"parent": doc.name}, ["name", "service_stop_date"])
|
||||
|
||||
for d in old_doc:
|
||||
old_stop_dates[d.name] = d.service_stop_date or ""
|
||||
|
||||
for item in doc.items:
|
||||
if not item.get(enable_check): continue
|
||||
|
||||
if item.service_stop_date:
|
||||
if date_diff(item.service_stop_date, item.service_start_date) < 0:
|
||||
frappe.throw(_("Service Stop Date cannot be before Service Start Date"))
|
||||
|
||||
if date_diff(item.service_stop_date, item.service_end_date) > 0:
|
||||
frappe.throw(_("Service Stop Date cannot be after Service End Date"))
|
||||
|
||||
if old_stop_dates and old_stop_dates.get(item.name) and item.service_stop_date!=old_stop_dates.get(item.name):
|
||||
frappe.throw(_("Cannot change Service Stop Date for item in row {0}").format(item.idx))
|
||||
|
||||
def build_conditions(process_type, account, company):
|
||||
conditions=''
|
||||
deferred_account = "item.deferred_revenue_account" if process_type=="Income" else "item.deferred_expense_account"
|
||||
|
||||
if account:
|
||||
conditions += "AND %s='%s'"%(deferred_account, account)
|
||||
elif company:
|
||||
conditions += f"AND p.company = {frappe.db.escape(company)}"
|
||||
|
||||
return conditions
|
||||
|
||||
def convert_deferred_expense_to_expense(deferred_process, start_date=None, end_date=None, conditions=''):
|
||||
# book the expense/income on the last day, but it will be trigger on the 1st of month at 12:00 AM
|
||||
|
||||
if not start_date:
|
||||
start_date = add_months(today(), -1)
|
||||
if not end_date:
|
||||
end_date = add_days(today(), -1)
|
||||
|
||||
# check for the purchase invoice for which GL entries has to be done
|
||||
invoices = frappe.db.sql_list('''
|
||||
select distinct item.parent
|
||||
from `tabPurchase Invoice Item` item, `tabPurchase Invoice` p
|
||||
where item.service_start_date<=%s and item.service_end_date>=%s
|
||||
and item.enable_deferred_expense = 1 and item.parent=p.name
|
||||
and item.docstatus = 1 and ifnull(item.amount, 0) > 0
|
||||
{0}
|
||||
'''.format(conditions), (end_date, start_date)) #nosec
|
||||
|
||||
# For each invoice, book deferred expense
|
||||
for invoice in invoices:
|
||||
doc = frappe.get_doc("Purchase Invoice", invoice)
|
||||
book_deferred_income_or_expense(doc, deferred_process, end_date)
|
||||
|
||||
if frappe.flags.deferred_accounting_error:
|
||||
send_mail(deferred_process)
|
||||
|
||||
def convert_deferred_revenue_to_income(deferred_process, start_date=None, end_date=None, conditions=''):
|
||||
# book the expense/income on the last day, but it will be trigger on the 1st of month at 12:00 AM
|
||||
|
||||
if not start_date:
|
||||
start_date = add_months(today(), -1)
|
||||
if not end_date:
|
||||
end_date = add_days(today(), -1)
|
||||
|
||||
# check for the sales invoice for which GL entries has to be done
|
||||
invoices = frappe.db.sql_list('''
|
||||
select distinct item.parent
|
||||
from `tabSales Invoice Item` item, `tabSales Invoice` p
|
||||
where item.service_start_date<=%s and item.service_end_date>=%s
|
||||
and item.enable_deferred_revenue = 1 and item.parent=p.name
|
||||
and item.docstatus = 1 and ifnull(item.amount, 0) > 0
|
||||
{0}
|
||||
'''.format(conditions), (end_date, start_date)) #nosec
|
||||
|
||||
for invoice in invoices:
|
||||
doc = frappe.get_doc("Sales Invoice", invoice)
|
||||
book_deferred_income_or_expense(doc, deferred_process, end_date)
|
||||
|
||||
if frappe.flags.deferred_accounting_error:
|
||||
send_mail(deferred_process)
|
||||
|
||||
def get_booking_dates(doc, item, posting_date=None):
|
||||
if not posting_date:
|
||||
posting_date = add_days(today(), -1)
|
||||
|
||||
last_gl_entry = False
|
||||
|
||||
deferred_account = "deferred_revenue_account" if doc.doctype=="Sales Invoice" else "deferred_expense_account"
|
||||
|
||||
prev_gl_entry = frappe.db.sql('''
|
||||
select name, posting_date from `tabGL Entry` where company=%s and account=%s and
|
||||
voucher_type=%s and voucher_no=%s and voucher_detail_no=%s
|
||||
order by posting_date desc limit 1
|
||||
''', (doc.company, item.get(deferred_account), doc.doctype, doc.name, item.name), as_dict=True)
|
||||
|
||||
prev_gl_via_je = frappe.db.sql('''
|
||||
SELECT p.name, p.posting_date FROM `tabJournal Entry` p, `tabJournal Entry Account` c
|
||||
WHERE p.name = c.parent and p.company=%s and c.account=%s
|
||||
and c.reference_type=%s and c.reference_name=%s
|
||||
and c.reference_detail_no=%s and c.docstatus < 2 order by posting_date desc limit 1
|
||||
''', (doc.company, item.get(deferred_account), doc.doctype, doc.name, item.name), as_dict=True)
|
||||
|
||||
if prev_gl_via_je:
|
||||
if (not prev_gl_entry) or (prev_gl_entry and
|
||||
prev_gl_entry[0].posting_date < prev_gl_via_je[0].posting_date):
|
||||
prev_gl_entry = prev_gl_via_je
|
||||
|
||||
if prev_gl_entry:
|
||||
start_date = getdate(add_days(prev_gl_entry[0].posting_date, 1))
|
||||
else:
|
||||
start_date = item.service_start_date
|
||||
|
||||
end_date = get_last_day(start_date)
|
||||
if end_date >= item.service_end_date:
|
||||
end_date = item.service_end_date
|
||||
last_gl_entry = True
|
||||
elif item.service_stop_date and end_date >= item.service_stop_date:
|
||||
end_date = item.service_stop_date
|
||||
last_gl_entry = True
|
||||
|
||||
if end_date > getdate(posting_date):
|
||||
end_date = posting_date
|
||||
|
||||
if getdate(start_date) <= getdate(end_date):
|
||||
return start_date, end_date, last_gl_entry
|
||||
else:
|
||||
return None, None, None
|
||||
|
||||
def calculate_monthly_amount(doc, item, last_gl_entry, start_date, end_date, total_days, total_booking_days, account_currency):
|
||||
amount, base_amount = 0, 0
|
||||
|
||||
if not last_gl_entry:
|
||||
total_months = (item.service_end_date.year - item.service_start_date.year) * 12 + \
|
||||
(item.service_end_date.month - item.service_start_date.month) + 1
|
||||
|
||||
prorate_factor = flt(date_diff(item.service_end_date, item.service_start_date)) \
|
||||
/ flt(date_diff(get_last_day(item.service_end_date), get_first_day(item.service_start_date)))
|
||||
|
||||
actual_months = rounded(total_months * prorate_factor, 1)
|
||||
|
||||
already_booked_amount, already_booked_amount_in_account_currency = get_already_booked_amount(doc, item)
|
||||
base_amount = flt(item.base_net_amount / actual_months, item.precision("base_net_amount"))
|
||||
|
||||
if base_amount + already_booked_amount > item.base_net_amount:
|
||||
base_amount = item.base_net_amount - already_booked_amount
|
||||
|
||||
if account_currency==doc.company_currency:
|
||||
amount = base_amount
|
||||
else:
|
||||
amount = flt(item.net_amount/actual_months, item.precision("net_amount"))
|
||||
if amount + already_booked_amount_in_account_currency > item.net_amount:
|
||||
amount = item.net_amount - already_booked_amount_in_account_currency
|
||||
|
||||
if not (get_first_day(start_date) == start_date and get_last_day(end_date) == end_date):
|
||||
partial_month = flt(date_diff(end_date, start_date)) \
|
||||
/ flt(date_diff(get_last_day(end_date), get_first_day(start_date)))
|
||||
|
||||
base_amount = rounded(partial_month, 1) * base_amount
|
||||
amount = rounded(partial_month, 1) * amount
|
||||
else:
|
||||
already_booked_amount, already_booked_amount_in_account_currency = get_already_booked_amount(doc, item)
|
||||
base_amount = flt(item.base_net_amount - already_booked_amount, item.precision("base_net_amount"))
|
||||
if account_currency==doc.company_currency:
|
||||
amount = base_amount
|
||||
else:
|
||||
amount = flt(item.net_amount - already_booked_amount_in_account_currency, item.precision("net_amount"))
|
||||
|
||||
return amount, base_amount
|
||||
|
||||
def calculate_amount(doc, item, last_gl_entry, total_days, total_booking_days, account_currency):
|
||||
amount, base_amount = 0, 0
|
||||
if not last_gl_entry:
|
||||
base_amount = flt(item.base_net_amount*total_booking_days/flt(total_days), item.precision("base_net_amount"))
|
||||
if account_currency==doc.company_currency:
|
||||
amount = base_amount
|
||||
else:
|
||||
amount = flt(item.net_amount*total_booking_days/flt(total_days), item.precision("net_amount"))
|
||||
else:
|
||||
already_booked_amount, already_booked_amount_in_account_currency = get_already_booked_amount(doc, item)
|
||||
|
||||
base_amount = flt(item.base_net_amount - already_booked_amount, item.precision("base_net_amount"))
|
||||
if account_currency==doc.company_currency:
|
||||
amount = base_amount
|
||||
else:
|
||||
amount = flt(item.net_amount - already_booked_amount_in_account_currency, item.precision("net_amount"))
|
||||
|
||||
return amount, base_amount
|
||||
|
||||
def get_already_booked_amount(doc, item):
|
||||
if doc.doctype == "Sales Invoice":
|
||||
total_credit_debit, total_credit_debit_currency = "debit", "debit_in_account_currency"
|
||||
deferred_account = "deferred_revenue_account"
|
||||
else:
|
||||
total_credit_debit, total_credit_debit_currency = "credit", "credit_in_account_currency"
|
||||
deferred_account = "deferred_expense_account"
|
||||
|
||||
gl_entries_details = frappe.db.sql('''
|
||||
select sum({0}) as total_credit, sum({1}) as total_credit_in_account_currency, voucher_detail_no
|
||||
from `tabGL Entry` where company=%s and account=%s and voucher_type=%s and voucher_no=%s and voucher_detail_no=%s
|
||||
group by voucher_detail_no
|
||||
'''.format(total_credit_debit, total_credit_debit_currency),
|
||||
(doc.company, item.get(deferred_account), doc.doctype, doc.name, item.name), as_dict=True)
|
||||
|
||||
journal_entry_details = frappe.db.sql('''
|
||||
SELECT sum(c.{0}) as total_credit, sum(c.{1}) as total_credit_in_account_currency, reference_detail_no
|
||||
FROM `tabJournal Entry` p , `tabJournal Entry Account` c WHERE p.name = c.parent and
|
||||
p.company = %s and c.account=%s and c.reference_type=%s and c.reference_name=%s and c.reference_detail_no=%s
|
||||
and p.docstatus < 2 group by reference_detail_no
|
||||
'''.format(total_credit_debit, total_credit_debit_currency),
|
||||
(doc.company, item.get(deferred_account), doc.doctype, doc.name, item.name), as_dict=True)
|
||||
|
||||
already_booked_amount = gl_entries_details[0].total_credit if gl_entries_details else 0
|
||||
already_booked_amount += journal_entry_details[0].total_credit if journal_entry_details else 0
|
||||
|
||||
if doc.currency == doc.company_currency:
|
||||
already_booked_amount_in_account_currency = already_booked_amount
|
||||
else:
|
||||
already_booked_amount_in_account_currency = gl_entries_details[0].total_credit_in_account_currency if gl_entries_details else 0
|
||||
already_booked_amount_in_account_currency += journal_entry_details[0].total_credit_in_account_currency if journal_entry_details else 0
|
||||
|
||||
return already_booked_amount, already_booked_amount_in_account_currency
|
||||
|
||||
def book_deferred_income_or_expense(doc, deferred_process, posting_date=None):
|
||||
enable_check = "enable_deferred_revenue" \
|
||||
if doc.doctype=="Sales Invoice" else "enable_deferred_expense"
|
||||
|
||||
def _book_deferred_revenue_or_expense(item, via_journal_entry, submit_journal_entry, book_deferred_entries_based_on):
|
||||
start_date, end_date, last_gl_entry = get_booking_dates(doc, item, posting_date=posting_date)
|
||||
if not (start_date and end_date): return
|
||||
|
||||
account_currency = get_account_currency(item.expense_account)
|
||||
if doc.doctype == "Sales Invoice":
|
||||
against, project = doc.customer, doc.project
|
||||
credit_account, debit_account = item.income_account, item.deferred_revenue_account
|
||||
else:
|
||||
against, project = doc.supplier, item.project
|
||||
credit_account, debit_account = item.deferred_expense_account, item.expense_account
|
||||
|
||||
total_days = date_diff(item.service_end_date, item.service_start_date) + 1
|
||||
total_booking_days = date_diff(end_date, start_date) + 1
|
||||
|
||||
if book_deferred_entries_based_on == 'Months':
|
||||
amount, base_amount = calculate_monthly_amount(doc, item, last_gl_entry,
|
||||
start_date, end_date, total_days, total_booking_days, account_currency)
|
||||
else:
|
||||
amount, base_amount = calculate_amount(doc, item, last_gl_entry,
|
||||
total_days, total_booking_days, account_currency)
|
||||
|
||||
if not amount:
|
||||
return
|
||||
|
||||
if via_journal_entry:
|
||||
book_revenue_via_journal_entry(doc, credit_account, debit_account, against, amount,
|
||||
base_amount, end_date, project, account_currency, item.cost_center, item, deferred_process, submit_journal_entry)
|
||||
else:
|
||||
make_gl_entries(doc, credit_account, debit_account, against,
|
||||
amount, base_amount, end_date, project, account_currency, item.cost_center, item, deferred_process)
|
||||
|
||||
# Returned in case of any errors because it tries to submit the same record again and again in case of errors
|
||||
if frappe.flags.deferred_accounting_error:
|
||||
return
|
||||
|
||||
if getdate(end_date) < getdate(posting_date) and not last_gl_entry:
|
||||
_book_deferred_revenue_or_expense(item, via_journal_entry, submit_journal_entry, book_deferred_entries_based_on)
|
||||
|
||||
via_journal_entry = cint(frappe.db.get_singles_value('Accounts Settings', 'book_deferred_entries_via_journal_entry'))
|
||||
submit_journal_entry = cint(frappe.db.get_singles_value('Accounts Settings', 'submit_journal_entries'))
|
||||
book_deferred_entries_based_on = frappe.db.get_singles_value('Accounts Settings', 'book_deferred_entries_based_on')
|
||||
|
||||
for item in doc.get('items'):
|
||||
if item.get(enable_check):
|
||||
_book_deferred_revenue_or_expense(item, via_journal_entry, submit_journal_entry, book_deferred_entries_based_on)
|
||||
|
||||
def process_deferred_accounting(posting_date=None):
|
||||
''' Converts deferred income/expense into income/expense
|
||||
Executed via background jobs on every month end '''
|
||||
|
||||
if not posting_date:
|
||||
posting_date = today()
|
||||
|
||||
if not cint(frappe.db.get_singles_value('Accounts Settings', 'automatically_process_deferred_accounting_entry')):
|
||||
return
|
||||
|
||||
start_date = add_months(today(), -1)
|
||||
end_date = add_days(today(), -1)
|
||||
|
||||
companies = frappe.get_all('Company')
|
||||
|
||||
for company in companies:
|
||||
for record_type in ('Income', 'Expense'):
|
||||
doc = frappe.get_doc(dict(
|
||||
doctype='Process Deferred Accounting',
|
||||
company=company.name,
|
||||
posting_date=posting_date,
|
||||
start_date=start_date,
|
||||
end_date=end_date,
|
||||
type=record_type
|
||||
))
|
||||
|
||||
doc.insert()
|
||||
doc.submit()
|
||||
|
||||
def make_gl_entries(doc, credit_account, debit_account, against,
|
||||
amount, base_amount, posting_date, project, account_currency, cost_center, item, deferred_process=None):
|
||||
# GL Entry for crediting the amount in the deferred expense
|
||||
from erpnext.accounts.general_ledger import make_gl_entries
|
||||
|
||||
if amount == 0: return
|
||||
|
||||
gl_entries = []
|
||||
gl_entries.append(
|
||||
doc.get_gl_dict({
|
||||
"account": credit_account,
|
||||
"against": against,
|
||||
"credit": base_amount,
|
||||
"credit_in_account_currency": amount,
|
||||
"cost_center": cost_center,
|
||||
"voucher_detail_no": item.name,
|
||||
'posting_date': posting_date,
|
||||
'project': project,
|
||||
'against_voucher_type': 'Process Deferred Accounting',
|
||||
'against_voucher': deferred_process
|
||||
}, account_currency, item=item)
|
||||
)
|
||||
# GL Entry to debit the amount from the expense
|
||||
gl_entries.append(
|
||||
doc.get_gl_dict({
|
||||
"account": debit_account,
|
||||
"against": against,
|
||||
"debit": base_amount,
|
||||
"debit_in_account_currency": amount,
|
||||
"cost_center": cost_center,
|
||||
"voucher_detail_no": item.name,
|
||||
'posting_date': posting_date,
|
||||
'project': project,
|
||||
'against_voucher_type': 'Process Deferred Accounting',
|
||||
'against_voucher': deferred_process
|
||||
}, account_currency, item=item)
|
||||
)
|
||||
|
||||
if gl_entries:
|
||||
try:
|
||||
make_gl_entries(gl_entries, cancel=(doc.docstatus == 2), merge_entries=True)
|
||||
frappe.db.commit()
|
||||
except Exception as e:
|
||||
if frappe.flags.in_test:
|
||||
raise e
|
||||
else:
|
||||
frappe.db.rollback()
|
||||
traceback = frappe.get_traceback()
|
||||
frappe.log_error(message=traceback)
|
||||
|
||||
frappe.flags.deferred_accounting_error = True
|
||||
|
||||
def send_mail(deferred_process):
|
||||
title = _("Error while processing deferred accounting for {0}").format(deferred_process)
|
||||
link = get_link_to_form('Process Deferred Accounting', deferred_process)
|
||||
content = _("Deferred accounting failed for some invoices:") + "\n"
|
||||
content += _("Please check Process Deferred Accounting {0} and submit manually after resolving errors.").format(link)
|
||||
sendmail_to_system_managers(title, content)
|
||||
|
||||
def book_revenue_via_journal_entry(doc, credit_account, debit_account, against,
|
||||
amount, base_amount, posting_date, project, account_currency, cost_center, item,
|
||||
deferred_process=None, submit='No'):
|
||||
|
||||
if amount == 0: return
|
||||
|
||||
journal_entry = frappe.new_doc('Journal Entry')
|
||||
journal_entry.posting_date = posting_date
|
||||
journal_entry.company = doc.company
|
||||
journal_entry.voucher_type = 'Deferred Revenue' if doc.doctype == 'Sales Invoice' \
|
||||
else 'Deferred Expense'
|
||||
|
||||
debit_entry = {
|
||||
'account': credit_account,
|
||||
'credit': base_amount,
|
||||
'credit_in_account_currency': amount,
|
||||
'party_type': 'Customer' if doc.doctype == 'Sales Invoice' else 'Supplier',
|
||||
'party': against,
|
||||
'account_currency': account_currency,
|
||||
'reference_name': doc.name,
|
||||
'reference_type': doc.doctype,
|
||||
'reference_detail_no': item.name,
|
||||
'cost_center': cost_center,
|
||||
'project': project,
|
||||
}
|
||||
|
||||
credit_entry = {
|
||||
'account': debit_account,
|
||||
'debit': base_amount,
|
||||
'debit_in_account_currency': amount,
|
||||
'party_type': 'Customer' if doc.doctype == 'Sales Invoice' else 'Supplier',
|
||||
'party': against,
|
||||
'account_currency': account_currency,
|
||||
'reference_name': doc.name,
|
||||
'reference_type': doc.doctype,
|
||||
'reference_detail_no': item.name,
|
||||
'cost_center': cost_center,
|
||||
'project': project,
|
||||
}
|
||||
|
||||
for dimension in get_accounting_dimensions():
|
||||
debit_entry.update({
|
||||
dimension: item.get(dimension)
|
||||
})
|
||||
|
||||
credit_entry.update({
|
||||
dimension: item.get(dimension)
|
||||
})
|
||||
|
||||
journal_entry.append('accounts', debit_entry)
|
||||
journal_entry.append('accounts', credit_entry)
|
||||
|
||||
try:
|
||||
journal_entry.save()
|
||||
|
||||
if submit:
|
||||
journal_entry.submit()
|
||||
except Exception:
|
||||
frappe.db.rollback()
|
||||
traceback = frappe.get_traceback()
|
||||
frappe.log_error(message=traceback)
|
||||
|
||||
frappe.flags.deferred_accounting_error = True
|
||||
|
||||
def get_deferred_booking_accounts(doctype, voucher_detail_no, dr_or_cr):
|
||||
|
||||
if doctype == 'Sales Invoice':
|
||||
credit_account, debit_account = frappe.db.get_value('Sales Invoice Item', {'name': voucher_detail_no},
|
||||
['income_account', 'deferred_revenue_account'])
|
||||
else:
|
||||
credit_account, debit_account = frappe.db.get_value('Purchase Invoice Item', {'name': voucher_detail_no},
|
||||
['deferred_expense_account', 'expense_account'])
|
||||
|
||||
if dr_or_cr == 'Debit':
|
||||
return debit_account
|
||||
else:
|
||||
return credit_account
|
||||
@@ -1,186 +1,122 @@
|
||||
// Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and Contributors
|
||||
// Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
|
||||
// License: GNU General Public License v3. See license.txt
|
||||
|
||||
frappe.ui.form.on('Account', {
|
||||
setup: function(frm) {
|
||||
frm.add_fetch('parent_account', 'report_type', 'report_type');
|
||||
frm.add_fetch('parent_account', 'root_type', 'root_type');
|
||||
},
|
||||
onload: function(frm) {
|
||||
frm.set_query('parent_account', function(doc) {
|
||||
return {
|
||||
filters: {
|
||||
"is_group": 1,
|
||||
"company": doc.company
|
||||
}
|
||||
};
|
||||
});
|
||||
},
|
||||
refresh: function(frm) {
|
||||
frm.toggle_display('account_name', frm.is_new());
|
||||
cur_frm.list_route = "Accounts Browser/Account";
|
||||
|
||||
// hide fields if group
|
||||
frm.toggle_display(['account_type', 'tax_rate'], cint(frm.doc.is_group) == 0);
|
||||
|
||||
// disable fields
|
||||
frm.toggle_enable(['is_group', 'company'], false);
|
||||
|
||||
if (cint(frm.doc.is_group) == 0) {
|
||||
frm.toggle_display('freeze_account', frm.doc.__onload
|
||||
&& frm.doc.__onload.can_freeze_account);
|
||||
}
|
||||
|
||||
// read-only for root accounts
|
||||
if (!frm.is_new()) {
|
||||
if (!frm.doc.parent_account) {
|
||||
frm.set_read_only();
|
||||
frm.set_intro(__("This is a root account and cannot be edited."));
|
||||
} else {
|
||||
// credit days and type if customer or supplier
|
||||
frm.set_intro(null);
|
||||
frm.trigger('account_type');
|
||||
// show / hide convert buttons
|
||||
frm.trigger('add_toolbar_buttons');
|
||||
}
|
||||
if (frm.has_perm('write')) {
|
||||
frm.add_custom_button(__('Update Account Name / Number'), function () {
|
||||
frm.trigger("update_account_number");
|
||||
});
|
||||
frm.add_custom_button(__('Merge Account'), function () {
|
||||
frm.trigger("merge_account");
|
||||
});
|
||||
}
|
||||
}
|
||||
},
|
||||
account_type: function (frm) {
|
||||
if (frm.doc.is_group == 0) {
|
||||
frm.toggle_display(['tax_rate'], frm.doc.account_type == 'Tax');
|
||||
frm.toggle_display('warehouse', frm.doc.account_type == 'Stock');
|
||||
}
|
||||
},
|
||||
add_toolbar_buttons: function(frm) {
|
||||
frm.add_custom_button(__('Chart of Accounts'),
|
||||
function () { frappe.set_route("Tree", "Account"); });
|
||||
|
||||
if (frm.doc.is_group == 1) {
|
||||
frm.add_custom_button(__('Group to Non-Group'), function () {
|
||||
return frappe.call({
|
||||
doc: frm.doc,
|
||||
method: 'convert_group_to_ledger',
|
||||
callback: function() {
|
||||
frm.refresh();
|
||||
}
|
||||
});
|
||||
});
|
||||
} else if (cint(frm.doc.is_group) == 0
|
||||
&& frappe.boot.user.can_read.indexOf("GL Entry") !== -1) {
|
||||
frm.add_custom_button(__('Ledger'), function () {
|
||||
frappe.route_options = {
|
||||
"account": frm.doc.name,
|
||||
"from_date": frappe.sys_defaults.year_start_date,
|
||||
"to_date": frappe.sys_defaults.year_end_date,
|
||||
"company": frm.doc.company
|
||||
};
|
||||
frappe.set_route("query-report", "General Ledger");
|
||||
});
|
||||
|
||||
frm.add_custom_button(__('Non-Group to Group'), function () {
|
||||
return frappe.call({
|
||||
doc: frm.doc,
|
||||
method: 'convert_ledger_to_group',
|
||||
callback: function() {
|
||||
frm.refresh();
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
merge_account: function(frm) {
|
||||
var d = new frappe.ui.Dialog({
|
||||
title: __('Merge with Existing Account'),
|
||||
fields: [
|
||||
{
|
||||
"label" : "Name",
|
||||
"fieldname": "name",
|
||||
"fieldtype": "Data",
|
||||
"reqd": 1,
|
||||
"default": frm.doc.name
|
||||
}
|
||||
],
|
||||
primary_action: function() {
|
||||
var data = d.get_values();
|
||||
frappe.call({
|
||||
method: "erpnext.accounts.doctype.account.account.merge_account",
|
||||
args: {
|
||||
old: frm.doc.name,
|
||||
new: data.name,
|
||||
is_group: frm.doc.is_group,
|
||||
root_type: frm.doc.root_type,
|
||||
company: frm.doc.company
|
||||
},
|
||||
callback: function(r) {
|
||||
if(!r.exc) {
|
||||
if(r.message) {
|
||||
frappe.set_route("Form", "Account", r.message);
|
||||
}
|
||||
d.hide();
|
||||
}
|
||||
}
|
||||
});
|
||||
},
|
||||
primary_action_label: __('Merge')
|
||||
});
|
||||
d.show();
|
||||
},
|
||||
|
||||
update_account_number: function(frm) {
|
||||
var d = new frappe.ui.Dialog({
|
||||
title: __('Update Account Number / Name'),
|
||||
fields: [
|
||||
{
|
||||
"label": "Account Name",
|
||||
"fieldname": "account_name",
|
||||
"fieldtype": "Data",
|
||||
"reqd": 1,
|
||||
"default": frm.doc.account_name
|
||||
},
|
||||
{
|
||||
"label": "Account Number",
|
||||
"fieldname": "account_number",
|
||||
"fieldtype": "Data",
|
||||
"default": frm.doc.account_number
|
||||
}
|
||||
],
|
||||
primary_action: function() {
|
||||
var data = d.get_values();
|
||||
if(data.account_number === frm.doc.account_number && data.account_name === frm.doc.account_name) {
|
||||
d.hide();
|
||||
return;
|
||||
}
|
||||
|
||||
frappe.call({
|
||||
method: "erpnext.accounts.doctype.account.account.update_account_number",
|
||||
args: {
|
||||
account_number: data.account_number,
|
||||
account_name: data.account_name,
|
||||
name: frm.doc.name
|
||||
},
|
||||
callback: function(r) {
|
||||
if(!r.exc) {
|
||||
if(r.message) {
|
||||
frappe.set_route("Form", "Account", r.message);
|
||||
} else {
|
||||
frm.set_value("account_number", data.account_number);
|
||||
frm.set_value("account_name", data.account_name);
|
||||
}
|
||||
d.hide();
|
||||
}
|
||||
}
|
||||
});
|
||||
},
|
||||
primary_action_label: __('Update')
|
||||
});
|
||||
d.show();
|
||||
cur_frm.cscript.refresh = function(doc, cdt, cdn) {
|
||||
if(doc.__islocal) {
|
||||
msgprint(__("Please create new account from Chart of Accounts."));
|
||||
throw "cannot create";
|
||||
}
|
||||
});
|
||||
|
||||
cur_frm.toggle_display('account_name', doc.__islocal);
|
||||
|
||||
// hide fields if group
|
||||
cur_frm.toggle_display(['account_type', 'master_type', 'master_name',
|
||||
'credit_days', 'credit_limit', 'tax_rate'], doc.group_or_ledger=='Ledger')
|
||||
|
||||
// disable fields
|
||||
cur_frm.toggle_enable(['account_name', 'group_or_ledger', 'company'], false);
|
||||
|
||||
if(doc.group_or_ledger=='Ledger') {
|
||||
cur_frm.toggle_display('freeze_account', doc.__onload && doc.__onload.can_freeze_account);
|
||||
}
|
||||
|
||||
// read-only for root accounts
|
||||
if(!doc.parent_account) {
|
||||
cur_frm.set_read_only();
|
||||
cur_frm.set_intro(__("This is a root account and cannot be edited."));
|
||||
} else {
|
||||
// credit days and type if customer or supplier
|
||||
cur_frm.set_intro(null);
|
||||
cur_frm.toggle_display(['credit_days', 'credit_limit'], in_list(['Customer', 'Supplier'],
|
||||
doc.master_type));
|
||||
|
||||
cur_frm.cscript.master_type(doc, cdt, cdn);
|
||||
cur_frm.cscript.account_type(doc, cdt, cdn);
|
||||
|
||||
// show / hide convert buttons
|
||||
cur_frm.cscript.add_toolbar_buttons(doc);
|
||||
}
|
||||
}
|
||||
|
||||
cur_frm.cscript.master_type = function(doc, cdt, cdn) {
|
||||
cur_frm.toggle_display(['credit_days', 'credit_limit'], in_list(['Customer', 'Supplier'],
|
||||
doc.master_type));
|
||||
|
||||
cur_frm.toggle_display('master_name', doc.account_type=='Warehouse' ||
|
||||
in_list(['Customer', 'Supplier'], doc.master_type));
|
||||
}
|
||||
|
||||
cur_frm.add_fetch('parent_account', 'report_type', 'report_type');
|
||||
cur_frm.add_fetch('parent_account', 'root_type', 'root_type');
|
||||
|
||||
cur_frm.cscript.account_type = function(doc, cdt, cdn) {
|
||||
if(doc.group_or_ledger=='Ledger') {
|
||||
cur_frm.toggle_display(['tax_rate'], doc.account_type == 'Tax');
|
||||
cur_frm.toggle_display('master_name', doc.account_type=='Warehouse' ||
|
||||
in_list(['Customer', 'Supplier'], doc.master_type));
|
||||
}
|
||||
}
|
||||
|
||||
cur_frm.cscript.add_toolbar_buttons = function(doc) {
|
||||
cur_frm.add_custom_button(__('Chart of Accounts'),
|
||||
function() { frappe.set_route("Accounts Browser", "Account"); }, 'icon-sitemap')
|
||||
|
||||
if (cstr(doc.group_or_ledger) == 'Group') {
|
||||
cur_frm.add_custom_button(__('Convert to Ledger'),
|
||||
function() { cur_frm.cscript.convert_to_ledger(); }, 'icon-retweet', 'btn-default');
|
||||
} else if (cstr(doc.group_or_ledger) == 'Ledger') {
|
||||
cur_frm.add_custom_button(__('View Ledger'), function() {
|
||||
frappe.route_options = {
|
||||
"account": doc.name,
|
||||
"from_date": sys_defaults.year_start_date,
|
||||
"to_date": sys_defaults.year_end_date,
|
||||
"company": doc.company
|
||||
};
|
||||
frappe.set_route("query-report", "General Ledger");
|
||||
}, "icon-table");
|
||||
|
||||
cur_frm.add_custom_button(__('Convert to Group'),
|
||||
function() { cur_frm.cscript.convert_to_group(); }, 'icon-retweet', 'btn-default')
|
||||
}
|
||||
}
|
||||
|
||||
cur_frm.cscript.convert_to_ledger = function(doc, cdt, cdn) {
|
||||
return $c_obj(cur_frm.doc,'convert_group_to_ledger','',function(r,rt) {
|
||||
if(r.message == 1) {
|
||||
cur_frm.refresh();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
cur_frm.cscript.convert_to_group = function(doc, cdt, cdn) {
|
||||
return $c_obj(cur_frm.doc,'convert_ledger_to_group','',function(r,rt) {
|
||||
if(r.message == 1) {
|
||||
cur_frm.refresh();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
cur_frm.fields_dict['master_name'].get_query = function(doc) {
|
||||
if (doc.master_type || doc.account_type=="Warehouse") {
|
||||
var dt = doc.master_type || "Warehouse";
|
||||
return {
|
||||
doctype: dt,
|
||||
query: "erpnext.accounts.doctype.account.account.get_master_name",
|
||||
filters: {
|
||||
"master_type": dt,
|
||||
"company": doc.company
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
cur_frm.fields_dict['parent_account'].get_query = function(doc) {
|
||||
return {
|
||||
filters: {
|
||||
"group_or_ledger": "Group",
|
||||
"company": doc.company
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,136 +1,74 @@
|
||||
{
|
||||
"actions": [],
|
||||
"allow_copy": 1,
|
||||
"allow_import": 1,
|
||||
"allow_rename": 1,
|
||||
"creation": "2013-01-30 12:49:46",
|
||||
"description": "Heads (or groups) against which Accounting Entries are made and balances are maintained.",
|
||||
"docstatus": 0,
|
||||
"doctype": "DocType",
|
||||
"document_type": "Setup",
|
||||
"engine": "InnoDB",
|
||||
"field_order": [
|
||||
"properties",
|
||||
"column_break0",
|
||||
"disabled",
|
||||
"account_name",
|
||||
"account_number",
|
||||
"is_group",
|
||||
"company",
|
||||
"root_type",
|
||||
"report_type",
|
||||
"account_currency",
|
||||
"inter_company_account",
|
||||
"column_break1",
|
||||
"parent_account",
|
||||
"account_type",
|
||||
"tax_rate",
|
||||
"freeze_account",
|
||||
"balance_must_be",
|
||||
"lft",
|
||||
"rgt",
|
||||
"old_parent",
|
||||
"include_in_gross"
|
||||
],
|
||||
"document_type": "Master",
|
||||
"fields": [
|
||||
{
|
||||
"fieldname": "properties",
|
||||
"fieldtype": "Section Break",
|
||||
"in_list_view": 0,
|
||||
"label": "Account Details",
|
||||
"oldfieldtype": "Section Break",
|
||||
"show_days": 1,
|
||||
"show_seconds": 1
|
||||
"permlevel": 0
|
||||
},
|
||||
{
|
||||
"fieldname": "column_break0",
|
||||
"fieldtype": "Column Break",
|
||||
"show_days": 1,
|
||||
"show_seconds": 1,
|
||||
"in_list_view": 0,
|
||||
"permlevel": 0,
|
||||
"width": "50%"
|
||||
},
|
||||
{
|
||||
"fieldname": "account_name",
|
||||
"fieldtype": "Data",
|
||||
"in_filter": 1,
|
||||
"in_list_view": 1,
|
||||
"label": "Account Name",
|
||||
"no_copy": 1,
|
||||
"oldfieldname": "account_name",
|
||||
"oldfieldtype": "Data",
|
||||
"reqd": 1,
|
||||
"show_days": 1,
|
||||
"show_seconds": 1
|
||||
},
|
||||
{
|
||||
"fieldname": "account_number",
|
||||
"fieldtype": "Data",
|
||||
"in_list_view": 1,
|
||||
"in_standard_filter": 1,
|
||||
"label": "Account Number",
|
||||
"permlevel": 0,
|
||||
"read_only": 1,
|
||||
"show_days": 1,
|
||||
"show_seconds": 1
|
||||
"reqd": 1,
|
||||
"search_index": 1
|
||||
},
|
||||
{
|
||||
"default": "0",
|
||||
"fieldname": "is_group",
|
||||
"fieldtype": "Check",
|
||||
"label": "Is Group",
|
||||
"show_days": 1,
|
||||
"show_seconds": 1
|
||||
"default": "Ledger",
|
||||
"fieldname": "group_or_ledger",
|
||||
"fieldtype": "Select",
|
||||
"in_filter": 1,
|
||||
"in_list_view": 1,
|
||||
"label": "Group or Ledger",
|
||||
"oldfieldname": "group_or_ledger",
|
||||
"oldfieldtype": "Select",
|
||||
"options": "\nLedger\nGroup",
|
||||
"permlevel": 0,
|
||||
"read_only": 1,
|
||||
"reqd": 1,
|
||||
"search_index": 1
|
||||
},
|
||||
{
|
||||
"fieldname": "company",
|
||||
"fieldtype": "Link",
|
||||
"in_standard_filter": 1,
|
||||
"in_filter": 1,
|
||||
"label": "Company",
|
||||
"oldfieldname": "company",
|
||||
"oldfieldtype": "Link",
|
||||
"options": "Company",
|
||||
"permlevel": 0,
|
||||
"read_only": 1,
|
||||
"remember_last_selected_value": 1,
|
||||
"reqd": 1,
|
||||
"show_days": 1,
|
||||
"show_seconds": 1
|
||||
},
|
||||
{
|
||||
"fieldname": "root_type",
|
||||
"fieldtype": "Select",
|
||||
"in_standard_filter": 1,
|
||||
"label": "Root Type",
|
||||
"options": "\nAsset\nLiability\nIncome\nExpense\nEquity",
|
||||
"read_only": 1,
|
||||
"show_days": 1,
|
||||
"show_seconds": 1
|
||||
},
|
||||
{
|
||||
"fieldname": "report_type",
|
||||
"fieldtype": "Select",
|
||||
"in_standard_filter": 1,
|
||||
"label": "Report Type",
|
||||
"options": "\nBalance Sheet\nProfit and Loss",
|
||||
"read_only": 1,
|
||||
"show_days": 1,
|
||||
"show_seconds": 1
|
||||
},
|
||||
{
|
||||
"depends_on": "eval:doc.is_group==0",
|
||||
"fieldname": "account_currency",
|
||||
"fieldtype": "Link",
|
||||
"label": "Currency",
|
||||
"options": "Currency",
|
||||
"show_days": 1,
|
||||
"show_seconds": 1
|
||||
},
|
||||
{
|
||||
"default": "0",
|
||||
"fieldname": "inter_company_account",
|
||||
"fieldtype": "Check",
|
||||
"label": "Inter Company Account",
|
||||
"show_days": 1,
|
||||
"show_seconds": 1
|
||||
"search_index": 1
|
||||
},
|
||||
{
|
||||
"fieldname": "column_break1",
|
||||
"fieldtype": "Column Break",
|
||||
"show_days": 1,
|
||||
"show_seconds": 1,
|
||||
"permlevel": 0,
|
||||
"width": "50%"
|
||||
},
|
||||
{
|
||||
@@ -141,32 +79,32 @@
|
||||
"oldfieldname": "parent_account",
|
||||
"oldfieldtype": "Link",
|
||||
"options": "Account",
|
||||
"permlevel": 0,
|
||||
"reqd": 1,
|
||||
"search_index": 1,
|
||||
"show_days": 1,
|
||||
"show_seconds": 1
|
||||
"search_index": 1
|
||||
},
|
||||
{
|
||||
"description": "Setting Account Type helps in selecting this Account in transactions.",
|
||||
"fieldname": "account_type",
|
||||
"fieldtype": "Select",
|
||||
"in_standard_filter": 1,
|
||||
"in_filter": 1,
|
||||
"label": "Account Type",
|
||||
"oldfieldname": "account_type",
|
||||
"oldfieldtype": "Select",
|
||||
"options": "\nAccumulated Depreciation\nAsset Received But Not Billed\nBank\nCash\nChargeable\nCapital Work in Progress\nCost of Goods Sold\nDepreciation\nEquity\nExpense Account\nExpenses Included In Asset Valuation\nExpenses Included In Valuation\nFixed Asset\nIncome Account\nPayable\nReceivable\nRound Off\nStock\nStock Adjustment\nStock Received But Not Billed\nService Received But Not Billed\nTax\nTemporary",
|
||||
"show_days": 1,
|
||||
"show_seconds": 1
|
||||
"options": "\nBank\nCash\nTax\nChargeable\nWarehouse\nReceivable\nPayable\nEquity\nFixed Asset\nCost of Goods Sold\nExpense Account\nIncome Account\nStock Received But Not Billed\nExpenses Included In Valuation\nStock Adjustment\nStock",
|
||||
"permlevel": 0,
|
||||
"search_index": 0
|
||||
},
|
||||
{
|
||||
"description": "Rate at which this tax is applied",
|
||||
"fieldname": "tax_rate",
|
||||
"fieldtype": "Float",
|
||||
"hidden": 0,
|
||||
"label": "Rate",
|
||||
"oldfieldname": "tax_rate",
|
||||
"oldfieldtype": "Currency",
|
||||
"show_days": 1,
|
||||
"show_seconds": 1
|
||||
"permlevel": 0,
|
||||
"reqd": 0
|
||||
},
|
||||
{
|
||||
"description": "If the account is frozen, entries are allowed to restricted users.",
|
||||
@@ -176,130 +114,219 @@
|
||||
"oldfieldname": "freeze_account",
|
||||
"oldfieldtype": "Select",
|
||||
"options": "No\nYes",
|
||||
"show_days": 1,
|
||||
"show_seconds": 1
|
||||
"permlevel": 0
|
||||
},
|
||||
{
|
||||
"fieldname": "credit_days",
|
||||
"fieldtype": "Int",
|
||||
"hidden": 1,
|
||||
"label": "Credit Days",
|
||||
"oldfieldname": "credit_days",
|
||||
"oldfieldtype": "Int",
|
||||
"permlevel": 0,
|
||||
"print_hide": 1
|
||||
},
|
||||
{
|
||||
"fieldname": "credit_limit",
|
||||
"fieldtype": "Currency",
|
||||
"hidden": 1,
|
||||
"label": "Credit Limit",
|
||||
"oldfieldname": "credit_limit",
|
||||
"oldfieldtype": "Currency",
|
||||
"options": "Company:company:default_currency",
|
||||
"permlevel": 0,
|
||||
"print_hide": 1
|
||||
},
|
||||
{
|
||||
"description": "If this Account represents a Customer, Supplier or Employee, set it here.",
|
||||
"fieldname": "master_type",
|
||||
"fieldtype": "Select",
|
||||
"label": "Master Type",
|
||||
"oldfieldname": "master_type",
|
||||
"oldfieldtype": "Select",
|
||||
"options": "\nSupplier\nCustomer\nEmployee",
|
||||
"permlevel": 0
|
||||
},
|
||||
{
|
||||
"fieldname": "master_name",
|
||||
"fieldtype": "Link",
|
||||
"label": "Master Name",
|
||||
"oldfieldname": "master_name",
|
||||
"oldfieldtype": "Link",
|
||||
"options": "[Select]",
|
||||
"permlevel": 0
|
||||
},
|
||||
{
|
||||
"fieldname": "balance_must_be",
|
||||
"fieldtype": "Select",
|
||||
"label": "Balance must be",
|
||||
"options": "\nDebit\nCredit",
|
||||
"show_days": 1,
|
||||
"show_seconds": 1
|
||||
"permlevel": 0
|
||||
},
|
||||
{
|
||||
"fieldname": "root_type",
|
||||
"fieldtype": "Select",
|
||||
"label": "Root Type",
|
||||
"options": "\nAsset\nLiability\nIncome\nExpense\nEquity",
|
||||
"permlevel": 0,
|
||||
"read_only": 1
|
||||
},
|
||||
{
|
||||
"fieldname": "report_type",
|
||||
"fieldtype": "Select",
|
||||
"label": "Report Type",
|
||||
"options": "\nBalance Sheet\nProfit and Loss",
|
||||
"permlevel": 0,
|
||||
"read_only": 1
|
||||
},
|
||||
{
|
||||
"fieldname": "lft",
|
||||
"fieldtype": "Int",
|
||||
"hidden": 1,
|
||||
"label": "Lft",
|
||||
"permlevel": 0,
|
||||
"print_hide": 1,
|
||||
"read_only": 1,
|
||||
"search_index": 1,
|
||||
"show_days": 1,
|
||||
"show_seconds": 1
|
||||
"read_only": 1
|
||||
},
|
||||
{
|
||||
"fieldname": "rgt",
|
||||
"fieldtype": "Int",
|
||||
"hidden": 1,
|
||||
"label": "Rgt",
|
||||
"permlevel": 0,
|
||||
"print_hide": 1,
|
||||
"read_only": 1,
|
||||
"search_index": 1,
|
||||
"show_days": 1,
|
||||
"show_seconds": 1
|
||||
"read_only": 1
|
||||
},
|
||||
{
|
||||
"fieldname": "old_parent",
|
||||
"fieldtype": "Data",
|
||||
"hidden": 1,
|
||||
"label": "Old Parent",
|
||||
"permlevel": 0,
|
||||
"print_hide": 1,
|
||||
"read_only": 1,
|
||||
"show_days": 1,
|
||||
"show_seconds": 1
|
||||
},
|
||||
{
|
||||
"default": "0",
|
||||
"depends_on": "eval:(doc.report_type == 'Profit and Loss' && !doc.is_group)",
|
||||
"fieldname": "include_in_gross",
|
||||
"fieldtype": "Check",
|
||||
"label": "Include in gross",
|
||||
"show_days": 1,
|
||||
"show_seconds": 1
|
||||
},
|
||||
{
|
||||
"default": "0",
|
||||
"fieldname": "disabled",
|
||||
"fieldtype": "Check",
|
||||
"label": "Disable",
|
||||
"show_days": 1,
|
||||
"show_seconds": 1
|
||||
"read_only": 1
|
||||
}
|
||||
],
|
||||
"icon": "fa fa-money",
|
||||
"icon": "icon-money",
|
||||
"idx": 1,
|
||||
"is_tree": 1,
|
||||
"links": [],
|
||||
"modified": "2020-06-11 15:15:54.338622",
|
||||
"in_create": 1,
|
||||
"modified": "2014-06-19 18:27:58.109303",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Accounts",
|
||||
"name": "Account",
|
||||
"nsm_parent_field": "parent_account",
|
||||
"owner": "Administrator",
|
||||
"permissions": [
|
||||
{
|
||||
"amend": 0,
|
||||
"apply_user_permissions": 1,
|
||||
"create": 1,
|
||||
"delete": 1,
|
||||
"email": 1,
|
||||
"export": 1,
|
||||
"import": 1,
|
||||
"permlevel": 0,
|
||||
"print": 1,
|
||||
"read": 1,
|
||||
"report": 1,
|
||||
"role": "Accounts User",
|
||||
"share": 1,
|
||||
"submit": 0,
|
||||
"write": 1
|
||||
},
|
||||
{
|
||||
"amend": 0,
|
||||
"apply_user_permissions": 1,
|
||||
"create": 0,
|
||||
"delete": 0,
|
||||
"email": 1,
|
||||
"permlevel": 0,
|
||||
"print": 1,
|
||||
"read": 1,
|
||||
"report": 1,
|
||||
"role": "Auditor"
|
||||
"role": "Auditor",
|
||||
"submit": 0,
|
||||
"write": 0
|
||||
},
|
||||
{
|
||||
"amend": 0,
|
||||
"apply_user_permissions": 1,
|
||||
"create": 0,
|
||||
"delete": 0,
|
||||
"email": 1,
|
||||
"permlevel": 0,
|
||||
"print": 1,
|
||||
"read": 1,
|
||||
"report": 1,
|
||||
"role": "Sales User"
|
||||
"role": "Sales User",
|
||||
"submit": 0,
|
||||
"write": 0
|
||||
},
|
||||
{
|
||||
"amend": 0,
|
||||
"apply_user_permissions": 1,
|
||||
"create": 0,
|
||||
"delete": 0,
|
||||
"email": 1,
|
||||
"permlevel": 0,
|
||||
"print": 1,
|
||||
"read": 1,
|
||||
"report": 1,
|
||||
"role": "Purchase User"
|
||||
"role": "Purchase User",
|
||||
"submit": 0,
|
||||
"write": 0
|
||||
},
|
||||
{
|
||||
"amend": 0,
|
||||
"cancel": 0,
|
||||
"create": 0,
|
||||
"delete": 0,
|
||||
"permlevel": 2,
|
||||
"read": 1,
|
||||
"report": 1,
|
||||
"role": "Auditor",
|
||||
"submit": 0,
|
||||
"write": 0
|
||||
},
|
||||
{
|
||||
"amend": 0,
|
||||
"apply_user_permissions": 0,
|
||||
"create": 1,
|
||||
"delete": 1,
|
||||
"email": 1,
|
||||
"export": 1,
|
||||
"import": 1,
|
||||
"permlevel": 0,
|
||||
"print": 1,
|
||||
"read": 1,
|
||||
"report": 1,
|
||||
"role": "Accounts Manager",
|
||||
"set_user_permissions": 1,
|
||||
"share": 1,
|
||||
"submit": 0,
|
||||
"write": 1
|
||||
},
|
||||
{
|
||||
"amend": 0,
|
||||
"cancel": 0,
|
||||
"create": 0,
|
||||
"delete": 0,
|
||||
"permlevel": 2,
|
||||
"read": 1,
|
||||
"report": 1,
|
||||
"role": "Accounts Manager",
|
||||
"submit": 0,
|
||||
"write": 1
|
||||
},
|
||||
{
|
||||
"amend": 0,
|
||||
"cancel": 0,
|
||||
"create": 0,
|
||||
"delete": 0,
|
||||
"permlevel": 2,
|
||||
"read": 1,
|
||||
"report": 1,
|
||||
"role": "Accounts User",
|
||||
"submit": 0,
|
||||
"write": 0
|
||||
}
|
||||
],
|
||||
"search_fields": "account_number",
|
||||
"show_name_in_global_search": 1,
|
||||
"sort_field": "modified",
|
||||
"sort_order": "ASC",
|
||||
"track_changes": 1
|
||||
}
|
||||
"search_fields": "group_or_ledger"
|
||||
}
|
||||
|
||||
@@ -1,151 +1,76 @@
|
||||
# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
|
||||
# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
|
||||
# License: GNU General Public License v3. See license.txt
|
||||
|
||||
from __future__ import unicode_literals
|
||||
|
||||
import frappe
|
||||
from frappe import _, throw
|
||||
from frappe.utils import cint, cstr
|
||||
from frappe.utils.nestedset import NestedSet, get_ancestors_of, get_descendants_of
|
||||
from frappe.utils import flt, cstr, cint, getdate
|
||||
from frappe import msgprint, throw, _
|
||||
from frappe.model.document import Document
|
||||
|
||||
import erpnext
|
||||
|
||||
|
||||
class RootNotEditable(frappe.ValidationError): pass
|
||||
class BalanceMismatchError(frappe.ValidationError): pass
|
||||
|
||||
class Account(NestedSet):
|
||||
class Account(Document):
|
||||
nsm_parent_field = 'parent_account'
|
||||
def on_update(self):
|
||||
if frappe.local.flags.ignore_update_nsm:
|
||||
return
|
||||
else:
|
||||
super(Account, self).on_update()
|
||||
|
||||
def onload(self):
|
||||
frozen_accounts_modifier = frappe.db.get_value("Accounts Settings", "Accounts Settings",
|
||||
"frozen_accounts_modifier")
|
||||
if not frozen_accounts_modifier or frozen_accounts_modifier in frappe.get_roles():
|
||||
self.set_onload("can_freeze_account", True)
|
||||
if not frozen_accounts_modifier or frozen_accounts_modifier in frappe.user.get_roles():
|
||||
self.get("__onload").can_freeze_account = True
|
||||
|
||||
def autoname(self):
|
||||
from erpnext.accounts.utils import get_autoname_with_number
|
||||
self.name = get_autoname_with_number(self.account_number, self.account_name, None, self.company)
|
||||
self.name = self.account_name.strip() + ' - ' + \
|
||||
frappe.db.get_value("Company", self.company, "abbr")
|
||||
|
||||
def get_address(self):
|
||||
return {'address': frappe.db.get_value(self.master_type, self.master_name, "address")}
|
||||
|
||||
def validate(self):
|
||||
from erpnext.accounts.utils import validate_field_number
|
||||
if frappe.local.flags.allow_unverified_charts:
|
||||
return
|
||||
self.validate_master_name()
|
||||
self.validate_parent()
|
||||
self.validate_root_details()
|
||||
validate_field_number("Account", self.name, self.account_number, self.company, "account_number")
|
||||
self.validate_group_or_ledger()
|
||||
self.set_root_and_report_type()
|
||||
self.validate_mandatory()
|
||||
self.validate_warehouse_account()
|
||||
self.validate_frozen_accounts_modifier()
|
||||
self.validate_balance_must_be_debit_or_credit()
|
||||
self.validate_account_currency()
|
||||
self.validate_root_company_and_sync_account_to_children()
|
||||
|
||||
def validate_master_name(self):
|
||||
if self.master_type in ('Customer', 'Supplier') or self.account_type == "Warehouse":
|
||||
if not self.master_name:
|
||||
msgprint(_("Please enter Master Name once the account is created."))
|
||||
elif not frappe.db.exists(self.master_type or self.account_type, self.master_name):
|
||||
throw(_("Invalid Master Name"))
|
||||
|
||||
def validate_parent(self):
|
||||
"""Fetch Parent Details and validate parent account"""
|
||||
if self.parent_account:
|
||||
par = frappe.db.get_value("Account", self.parent_account,
|
||||
["name", "is_group", "company"], as_dict=1)
|
||||
["name", "group_or_ledger", "report_type", "root_type", "company"], as_dict=1)
|
||||
if not par:
|
||||
throw(_("Account {0}: Parent account {1} does not exist").format(self.name, self.parent_account))
|
||||
elif par.name == self.name:
|
||||
throw(_("Account {0}: You can not assign itself as parent account").format(self.name))
|
||||
elif not par.is_group:
|
||||
elif par.group_or_ledger != 'Group':
|
||||
throw(_("Account {0}: Parent account {1} can not be a ledger").format(self.name, self.parent_account))
|
||||
elif par.company != self.company:
|
||||
throw(_("Account {0}: Parent account {1} does not belong to company: {2}")
|
||||
.format(self.name, self.parent_account, self.company))
|
||||
|
||||
def set_root_and_report_type(self):
|
||||
if self.parent_account:
|
||||
par = frappe.db.get_value("Account", self.parent_account,
|
||||
["report_type", "root_type"], as_dict=1)
|
||||
|
||||
if par.report_type:
|
||||
self.report_type = par.report_type
|
||||
if par.root_type:
|
||||
self.root_type = par.root_type
|
||||
|
||||
if self.is_group:
|
||||
db_value = frappe.db.get_value("Account", self.name, ["report_type", "root_type"], as_dict=1)
|
||||
if db_value:
|
||||
if self.report_type != db_value.report_type:
|
||||
frappe.db.sql("update `tabAccount` set report_type=%s where lft > %s and rgt < %s",
|
||||
(self.report_type, self.lft, self.rgt))
|
||||
if self.root_type != db_value.root_type:
|
||||
frappe.db.sql("update `tabAccount` set root_type=%s where lft > %s and rgt < %s",
|
||||
(self.root_type, self.lft, self.rgt))
|
||||
|
||||
if self.root_type and not self.report_type:
|
||||
self.report_type = "Balance Sheet" \
|
||||
if self.root_type in ("Asset", "Liability", "Equity") else "Profit and Loss"
|
||||
|
||||
def validate_root_details(self):
|
||||
# does not exists parent
|
||||
#does not exists parent
|
||||
if frappe.db.exists("Account", self.name):
|
||||
if not frappe.db.get_value("Account", self.name, "parent_account"):
|
||||
throw(_("Root cannot be edited."), RootNotEditable)
|
||||
|
||||
if not self.parent_account and not self.is_group:
|
||||
frappe.throw(_("The root account {0} must be a group").format(frappe.bold(self.name)))
|
||||
|
||||
def validate_root_company_and_sync_account_to_children(self):
|
||||
# ignore validation while creating new compnay or while syncing to child companies
|
||||
if frappe.local.flags.ignore_root_company_validation or self.flags.ignore_root_company_validation:
|
||||
return
|
||||
ancestors = get_root_company(self.company)
|
||||
if ancestors:
|
||||
if frappe.get_value("Company", self.company, "allow_account_creation_against_child_company"):
|
||||
return
|
||||
if not frappe.db.get_value("Account",
|
||||
{'account_name': self.account_name, 'company': ancestors[0]}, 'name'):
|
||||
frappe.throw(_("Please add the account to root level Company - {}").format(ancestors[0]))
|
||||
elif self.parent_account:
|
||||
descendants = get_descendants_of('Company', self.company)
|
||||
if not descendants: return
|
||||
parent_acc_name_map = {}
|
||||
parent_acc_name, parent_acc_number = frappe.db.get_value('Account', self.parent_account, \
|
||||
["account_name", "account_number"])
|
||||
filters = {
|
||||
"company": ["in", descendants],
|
||||
"account_name": parent_acc_name,
|
||||
}
|
||||
if parent_acc_number:
|
||||
filters["account_number"] = parent_acc_number
|
||||
|
||||
for d in frappe.db.get_values('Account', filters=filters, fieldname=["company", "name"], as_dict=True):
|
||||
parent_acc_name_map[d["company"]] = d["name"]
|
||||
|
||||
if not parent_acc_name_map: return
|
||||
|
||||
self.create_account_for_child_company(parent_acc_name_map, descendants, parent_acc_name)
|
||||
|
||||
def validate_group_or_ledger(self):
|
||||
if self.get("__islocal"):
|
||||
return
|
||||
|
||||
existing_is_group = frappe.db.get_value("Account", self.name, "is_group")
|
||||
if cint(self.is_group) != cint(existing_is_group):
|
||||
if self.check_gle_exists():
|
||||
throw(_("Account with existing transaction cannot be converted to ledger"))
|
||||
elif self.is_group:
|
||||
if self.account_type and not self.flags.exclude_account_type_check:
|
||||
throw(_("Cannot covert to Group because Account Type is selected."))
|
||||
elif self.check_if_child_exists():
|
||||
throw(_("Account with child nodes cannot be set as ledger"))
|
||||
throw(_("Root cannot be edited."))
|
||||
|
||||
def validate_frozen_accounts_modifier(self):
|
||||
old_value = frappe.db.get_value("Account", self.name, "freeze_account")
|
||||
if old_value and old_value != self.freeze_account:
|
||||
frozen_accounts_modifier = frappe.db.get_value('Accounts Settings', None, 'frozen_accounts_modifier')
|
||||
if not frozen_accounts_modifier or \
|
||||
frozen_accounts_modifier not in frappe.get_roles():
|
||||
frozen_accounts_modifier not in frappe.user.get_roles():
|
||||
throw(_("You are not authorized to set Frozen value"))
|
||||
|
||||
def validate_balance_must_be_debit_or_credit(self):
|
||||
@@ -158,84 +83,23 @@ class Account(NestedSet):
|
||||
elif account_balance < 0 and self.balance_must_be == "Debit":
|
||||
frappe.throw(_("Account balance already in Credit, you are not allowed to set 'Balance Must Be' as 'Debit'"))
|
||||
|
||||
def validate_account_currency(self):
|
||||
if not self.account_currency:
|
||||
self.account_currency = frappe.get_cached_value('Company', self.company, "default_currency")
|
||||
|
||||
elif self.account_currency != frappe.db.get_value("Account", self.name, "account_currency"):
|
||||
if frappe.db.get_value("GL Entry", {"account": self.name}):
|
||||
frappe.throw(_("Currency can not be changed after making entries using some other currency"))
|
||||
|
||||
def create_account_for_child_company(self, parent_acc_name_map, descendants, parent_acc_name):
|
||||
for company in descendants:
|
||||
company_bold = frappe.bold(company)
|
||||
parent_acc_name_bold = frappe.bold(parent_acc_name)
|
||||
if not parent_acc_name_map.get(company):
|
||||
frappe.throw(_("While creating account for Child Company {0}, parent account {1} not found. Please create the parent account in corresponding COA")
|
||||
.format(company_bold, parent_acc_name_bold), title=_("Account Not Found"))
|
||||
|
||||
# validate if parent of child company account to be added is a group
|
||||
if (frappe.db.get_value("Account", self.parent_account, "is_group")
|
||||
and not frappe.db.get_value("Account", parent_acc_name_map[company], "is_group")):
|
||||
msg = _("While creating account for Child Company {0}, parent account {1} found as a ledger account.").format(company_bold, parent_acc_name_bold)
|
||||
msg += "<br><br>"
|
||||
msg += _("Please convert the parent account in corresponding child company to a group account.")
|
||||
frappe.throw(msg, title=_("Invalid Parent Account"))
|
||||
|
||||
filters = {
|
||||
"account_name": self.account_name,
|
||||
"company": company
|
||||
}
|
||||
|
||||
if self.account_number:
|
||||
filters["account_number"] = self.account_number
|
||||
|
||||
child_account = frappe.db.get_value("Account", filters, 'name')
|
||||
if not child_account:
|
||||
doc = frappe.copy_doc(self)
|
||||
doc.flags.ignore_root_company_validation = True
|
||||
doc.update({
|
||||
"company": company,
|
||||
# parent account's currency should be passed down to child account's curreny
|
||||
# if it is None, it picks it up from default company currency, which might be unintended
|
||||
"account_currency": erpnext.get_company_currency(company),
|
||||
"parent_account": parent_acc_name_map[company]
|
||||
})
|
||||
|
||||
doc.save()
|
||||
frappe.msgprint(_("Account {0} is added in the child company {1}")
|
||||
.format(doc.name, company))
|
||||
elif child_account:
|
||||
# update the parent company's value in child companies
|
||||
doc = frappe.get_doc("Account", child_account)
|
||||
parent_value_changed = False
|
||||
for field in ['account_type', 'freeze_account', 'balance_must_be']:
|
||||
if doc.get(field) != self.get(field):
|
||||
parent_value_changed = True
|
||||
doc.set(field, self.get(field))
|
||||
|
||||
if parent_value_changed:
|
||||
doc.save()
|
||||
|
||||
@frappe.whitelist()
|
||||
def convert_group_to_ledger(self):
|
||||
if self.check_if_child_exists():
|
||||
throw(_("Account with child nodes cannot be converted to ledger"))
|
||||
elif self.check_gle_exists():
|
||||
throw(_("Account with existing transaction cannot be converted to ledger"))
|
||||
else:
|
||||
self.is_group = 0
|
||||
self.group_or_ledger = 'Ledger'
|
||||
self.save()
|
||||
return 1
|
||||
|
||||
@frappe.whitelist()
|
||||
def convert_ledger_to_group(self):
|
||||
if self.check_gle_exists():
|
||||
throw(_("Account with existing transaction can not be converted to group."))
|
||||
elif self.account_type and not self.flags.exclude_account_type_check:
|
||||
throw(_("Cannot convert to Group because Account Type is selected."))
|
||||
elif self.master_type or self.account_type:
|
||||
throw(_("Cannot covert to Group because Master Type or Account Type is selected."))
|
||||
else:
|
||||
self.is_group = 1
|
||||
self.group_or_ledger = 'Group'
|
||||
self.save()
|
||||
return 1
|
||||
|
||||
@@ -248,140 +112,123 @@ class Account(NestedSet):
|
||||
and docstatus != 2""", self.name)
|
||||
|
||||
def validate_mandatory(self):
|
||||
if not self.root_type:
|
||||
throw(_("Root Type is mandatory"))
|
||||
|
||||
if not self.report_type:
|
||||
throw(_("Report Type is mandatory"))
|
||||
|
||||
def on_trash(self):
|
||||
# checks gl entries and if child exists
|
||||
if not self.root_type:
|
||||
throw(_("Root Type is mandatory"))
|
||||
|
||||
def validate_warehouse_account(self):
|
||||
if not cint(frappe.defaults.get_global_default("auto_accounting_for_stock")):
|
||||
return
|
||||
|
||||
if self.account_type == "Warehouse":
|
||||
old_warehouse = cstr(frappe.db.get_value("Account", self.name, "master_name"))
|
||||
if old_warehouse != cstr(self.master_name):
|
||||
if old_warehouse:
|
||||
self.validate_warehouse(old_warehouse)
|
||||
if self.master_name:
|
||||
self.validate_warehouse(self.master_name)
|
||||
else:
|
||||
throw(_("Master Name is mandatory if account type is Warehouse"))
|
||||
|
||||
def validate_warehouse(self, warehouse):
|
||||
if frappe.db.get_value("Stock Ledger Entry", {"warehouse": warehouse}):
|
||||
throw(_("Stock entries exist against warehouse {0} cannot re-assign or modify 'Master Name'").format(warehouse))
|
||||
|
||||
def update_nsm_model(self):
|
||||
"""update lft, rgt indices for nested set model"""
|
||||
import frappe
|
||||
import frappe.utils.nestedset
|
||||
frappe.utils.nestedset.update_nsm(self)
|
||||
|
||||
def on_update(self):
|
||||
self.update_nsm_model()
|
||||
|
||||
def get_authorized_user(self):
|
||||
# Check logged-in user is authorized
|
||||
if frappe.db.get_value('Accounts Settings', None, 'credit_controller') \
|
||||
in frappe.user.get_roles():
|
||||
return 1
|
||||
|
||||
def check_credit_limit(self, total_outstanding):
|
||||
# Get credit limit
|
||||
credit_limit_from = 'Customer'
|
||||
|
||||
cr_limit = frappe.db.sql("""select t1.credit_limit from tabCustomer t1, `tabAccount` t2
|
||||
where t2.name=%s and t1.name = t2.master_name""", self.name)
|
||||
credit_limit = cr_limit and flt(cr_limit[0][0]) or 0
|
||||
if not credit_limit:
|
||||
credit_limit = frappe.db.get_value('Company', self.company, 'credit_limit')
|
||||
credit_limit_from = 'Company'
|
||||
|
||||
# If outstanding greater than credit limit and not authorized person raise exception
|
||||
if credit_limit > 0 and flt(total_outstanding) > credit_limit \
|
||||
and not self.get_authorized_user():
|
||||
throw(_("{0} Credit limit {1} crossed").format(_(credit_limit_from), credit_limit))
|
||||
|
||||
def validate_due_date(self, posting_date, due_date):
|
||||
credit_days = (self.credit_days or frappe.db.get_value("Company", self.company, "credit_days"))
|
||||
posting_date, due_date = getdate(posting_date), getdate(due_date)
|
||||
diff = (due_date - posting_date).days
|
||||
|
||||
if diff < 0:
|
||||
frappe.throw(_("Due Date cannot be before Posting Date"))
|
||||
|
||||
elif credit_days is not None and diff > credit_days:
|
||||
msgprint(_("Note: Due Date exceeds the allowed credit days by {0} day(s)").format(diff - credit_days))
|
||||
|
||||
def validate_trash(self):
|
||||
"""checks gl entries and if child exists"""
|
||||
if not self.parent_account:
|
||||
throw(_("Root account can not be deleted"))
|
||||
|
||||
if self.check_gle_exists():
|
||||
throw(_("Account with existing transaction can not be deleted"))
|
||||
if self.check_if_child_exists():
|
||||
throw(_("Child account exists for this account. You can not delete this account."))
|
||||
|
||||
super(Account, self).on_trash(True)
|
||||
def on_trash(self):
|
||||
self.validate_trash()
|
||||
self.update_nsm_model()
|
||||
|
||||
def before_rename(self, old, new, merge=False):
|
||||
# Add company abbr if not provided
|
||||
from erpnext.setup.doctype.company.company import get_name_with_abbr
|
||||
new_account = get_name_with_abbr(new, self.company)
|
||||
|
||||
# Validate properties before merging
|
||||
if merge:
|
||||
if not frappe.db.exists("Account", new):
|
||||
throw(_("Account {0} does not exist").format(new))
|
||||
|
||||
val = list(frappe.db.get_value("Account", new_account,
|
||||
["group_or_ledger", "root_type", "company"]))
|
||||
|
||||
if val != [self.group_or_ledger, self.root_type, self.company]:
|
||||
throw(_("""Merging is only possible if following properties are same in both records. Group or Ledger, Root Type, Company"""))
|
||||
|
||||
return new_account
|
||||
|
||||
def after_rename(self, old, new, merge=False):
|
||||
if not merge:
|
||||
frappe.db.set_value("Account", new, "account_name",
|
||||
" - ".join(new.split(" - ")[:-1]))
|
||||
else:
|
||||
from frappe.utils.nestedset import rebuild_tree
|
||||
rebuild_tree("Account", "parent_account")
|
||||
|
||||
def get_master_name(doctype, txt, searchfield, start, page_len, filters):
|
||||
conditions = (" and company='%s'"% filters["company"].replace("'", "\'")) if doctype == "Warehouse" else ""
|
||||
|
||||
return frappe.db.sql("""select name from `tab%s` where %s like %s %s
|
||||
order by name limit %s, %s""" %
|
||||
(filters["master_type"], searchfield, "%s", conditions, "%s", "%s"),
|
||||
("%%%s%%" % txt, start, page_len), as_list=1)
|
||||
|
||||
@frappe.whitelist()
|
||||
@frappe.validate_and_sanitize_search_inputs
|
||||
def get_parent_account(doctype, txt, searchfield, start, page_len, filters):
|
||||
return frappe.db.sql("""select name from tabAccount
|
||||
where is_group = 1 and docstatus != 2 and company = %s
|
||||
where group_or_ledger = 'Group' and docstatus != 2 and company = %s
|
||||
and %s like %s order by name limit %s, %s""" %
|
||||
("%s", searchfield, "%s", "%s", "%s"),
|
||||
(filters["company"], "%%%s%%" % txt, start, page_len), as_list=1)
|
||||
|
||||
def get_account_currency(account):
|
||||
"""Helper function to get account currency"""
|
||||
if not account:
|
||||
return
|
||||
def generator():
|
||||
account_currency, company = frappe.get_cached_value("Account", account, ["account_currency", "company"])
|
||||
if not account_currency:
|
||||
account_currency = frappe.get_cached_value('Company', company, "default_currency")
|
||||
|
||||
return account_currency
|
||||
|
||||
return frappe.local_cache("account_currency", account, generator)
|
||||
|
||||
def on_doctype_update():
|
||||
frappe.db.add_index("Account", ["lft", "rgt"])
|
||||
|
||||
def get_account_autoname(account_number, account_name, company):
|
||||
# first validate if company exists
|
||||
company = frappe.get_cached_value('Company', company, ["abbr", "name"], as_dict=True)
|
||||
if not company:
|
||||
frappe.throw(_('Company {0} does not exist').format(company))
|
||||
|
||||
parts = [account_name.strip(), company.abbr]
|
||||
if cstr(account_number).strip():
|
||||
parts.insert(0, cstr(account_number).strip())
|
||||
return ' - '.join(parts)
|
||||
|
||||
def validate_account_number(name, account_number, company):
|
||||
if account_number:
|
||||
account_with_same_number = frappe.db.get_value("Account",
|
||||
{"account_number": account_number, "company": company, "name": ["!=", name]})
|
||||
if account_with_same_number:
|
||||
frappe.throw(_("Account Number {0} already used in account {1}")
|
||||
.format(account_number, account_with_same_number))
|
||||
|
||||
@frappe.whitelist()
|
||||
def update_account_number(name, account_name, account_number=None, from_descendant=False):
|
||||
account = frappe.db.get_value("Account", name, "company", as_dict=True)
|
||||
if not account: return
|
||||
|
||||
old_acc_name, old_acc_number = frappe.db.get_value('Account', name, \
|
||||
["account_name", "account_number"])
|
||||
|
||||
# check if account exists in parent company
|
||||
ancestors = get_ancestors_of("Company", account.company)
|
||||
allow_independent_account_creation = frappe.get_value("Company", account.company, "allow_account_creation_against_child_company")
|
||||
|
||||
if ancestors and not allow_independent_account_creation:
|
||||
for ancestor in ancestors:
|
||||
if frappe.db.get_value("Account", {'account_name': old_acc_name, 'company': ancestor}, 'name'):
|
||||
# same account in parent company exists
|
||||
allow_child_account_creation = _("Allow Account Creation Against Child Company")
|
||||
|
||||
message = _("Account {0} exists in parent company {1}.").format(frappe.bold(old_acc_name), frappe.bold(ancestor))
|
||||
message += "<br>"
|
||||
message += _("Renaming it is only allowed via parent company {0}, to avoid mismatch.").format(frappe.bold(ancestor))
|
||||
message += "<br><br>"
|
||||
message += _("To overrule this, enable '{0}' in company {1}").format(allow_child_account_creation, frappe.bold(account.company))
|
||||
|
||||
frappe.throw(message, title=_("Rename Not Allowed"))
|
||||
|
||||
validate_account_number(name, account_number, account.company)
|
||||
if account_number:
|
||||
frappe.db.set_value("Account", name, "account_number", account_number.strip())
|
||||
else:
|
||||
frappe.db.set_value("Account", name, "account_number", "")
|
||||
frappe.db.set_value("Account", name, "account_name", account_name.strip())
|
||||
|
||||
if not from_descendant:
|
||||
# Update and rename in child company accounts as well
|
||||
descendants = get_descendants_of('Company', account.company)
|
||||
if descendants:
|
||||
sync_update_account_number_in_child(descendants, old_acc_name, account_name, account_number, old_acc_number)
|
||||
|
||||
new_name = get_account_autoname(account_number, account_name, account.company)
|
||||
if name != new_name:
|
||||
frappe.rename_doc("Account", name, new_name, force=1)
|
||||
return new_name
|
||||
|
||||
@frappe.whitelist()
|
||||
def merge_account(old, new, is_group, root_type, company):
|
||||
# Validate properties before merging
|
||||
if not frappe.db.exists("Account", new):
|
||||
throw(_("Account {0} does not exist").format(new))
|
||||
|
||||
val = list(frappe.db.get_value("Account", new,
|
||||
["is_group", "root_type", "company"]))
|
||||
|
||||
if val != [cint(is_group), root_type, company]:
|
||||
throw(_("""Merging is only possible if following properties are same in both records. Is Group, Root Type, Company"""))
|
||||
|
||||
if is_group and frappe.db.get_value("Account", new, "parent_account") == old:
|
||||
frappe.db.set_value("Account", new, "parent_account",
|
||||
frappe.db.get_value("Account", old, "parent_account"))
|
||||
|
||||
frappe.rename_doc("Account", old, new, merge=1, force=1)
|
||||
|
||||
return new
|
||||
|
||||
@frappe.whitelist()
|
||||
def get_root_company(company):
|
||||
# return the topmost company in the hierarchy
|
||||
ancestors = get_ancestors_of('Company', company, "lft asc")
|
||||
return [ancestors[0]] if ancestors else []
|
||||
|
||||
def sync_update_account_number_in_child(descendants, old_acc_name, account_name, account_number=None, old_acc_number=None):
|
||||
filters = {
|
||||
"company": ["in", descendants],
|
||||
"account_name": old_acc_name,
|
||||
}
|
||||
if old_acc_number:
|
||||
filters["account_number"] = old_acc_number
|
||||
|
||||
for d in frappe.db.get_values('Account', filters=filters, fieldname=["company", "name"], as_dict=True):
|
||||
update_account_number(d["name"], account_name, account_number, from_descendant=True)
|
||||
|
||||
@@ -1,201 +0,0 @@
|
||||
frappe.provide("frappe.treeview_settings")
|
||||
|
||||
frappe.treeview_settings["Account"] = {
|
||||
breadcrumb: "Accounts",
|
||||
title: __("Chart of Accounts"),
|
||||
get_tree_root: false,
|
||||
filters: [
|
||||
{
|
||||
fieldname: "company",
|
||||
fieldtype:"Select",
|
||||
options: erpnext.utils.get_tree_options("company"),
|
||||
label: __("Company"),
|
||||
default: erpnext.utils.get_tree_default("company"),
|
||||
on_change: function() {
|
||||
var me = frappe.treeview_settings['Account'].treeview;
|
||||
var company = me.page.fields_dict.company.get_value();
|
||||
if (!company) {
|
||||
frappe.throw(__("Please set a Company"));
|
||||
}
|
||||
frappe.call({
|
||||
method: "erpnext.accounts.doctype.account.account.get_root_company",
|
||||
args: {
|
||||
company: company,
|
||||
},
|
||||
callback: function(r) {
|
||||
if(r.message) {
|
||||
let root_company = r.message.length ? r.message[0] : "";
|
||||
me.page.fields_dict.root_company.set_value(root_company);
|
||||
|
||||
frappe.db.get_value("Company", {"name": company}, "allow_account_creation_against_child_company", (r) => {
|
||||
frappe.flags.ignore_root_company_validation = r.allow_account_creation_against_child_company;
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
},
|
||||
{
|
||||
fieldname: "root_company",
|
||||
fieldtype:"Data",
|
||||
label: __("Root Company"),
|
||||
hidden: true,
|
||||
disable_onchange: true
|
||||
}
|
||||
],
|
||||
root_label: "Accounts",
|
||||
get_tree_nodes: 'erpnext.accounts.utils.get_children',
|
||||
on_get_node: function(nodes, deep=false) {
|
||||
if (frappe.boot.user.can_read.indexOf("GL Entry") == -1) return;
|
||||
|
||||
let accounts = [];
|
||||
if (deep) {
|
||||
// in case of `get_all_nodes`
|
||||
accounts = nodes.reduce((acc, node) => [...acc, ...node.data], []);
|
||||
} else {
|
||||
accounts = nodes;
|
||||
}
|
||||
|
||||
const get_balances = frappe.call({
|
||||
method: 'erpnext.accounts.utils.get_account_balances',
|
||||
args: {
|
||||
accounts: accounts,
|
||||
company: cur_tree.args.company
|
||||
},
|
||||
});
|
||||
|
||||
get_balances.then(r => {
|
||||
if (!r.message || r.message.length == 0) return;
|
||||
|
||||
for (let account of r.message) {
|
||||
|
||||
const node = cur_tree.nodes && cur_tree.nodes[account.value];
|
||||
if (!node || node.is_root) continue;
|
||||
|
||||
// show Dr if positive since balance is calculated as debit - credit else show Cr
|
||||
const balance = account.balance_in_account_currency || account.balance;
|
||||
const dr_or_cr = balance > 0 ? "Dr": "Cr";
|
||||
const format = (value, currency) => format_currency(Math.abs(value), currency);
|
||||
|
||||
if (account.balance!==undefined) {
|
||||
$('<span class="balance-area pull-right">'
|
||||
+ (account.balance_in_account_currency ?
|
||||
(format(account.balance_in_account_currency, account.account_currency) + " / ") : "")
|
||||
+ format(account.balance, account.company_currency)
|
||||
+ " " + dr_or_cr
|
||||
+ '</span>').insertBefore(node.$ul);
|
||||
}
|
||||
}
|
||||
});
|
||||
},
|
||||
add_tree_node: 'erpnext.accounts.utils.add_ac',
|
||||
menu_items:[
|
||||
{
|
||||
label: __('New Company'),
|
||||
action: function() { frappe.new_doc("Company", true) },
|
||||
condition: 'frappe.boot.user.can_create.indexOf("Company") !== -1'
|
||||
}
|
||||
],
|
||||
fields: [
|
||||
{fieldtype:'Data', fieldname:'account_name', label:__('New Account Name'), reqd:true,
|
||||
description: __("Name of new Account. Note: Please don't create accounts for Customers and Suppliers")},
|
||||
{fieldtype:'Data', fieldname:'account_number', label:__('Account Number'),
|
||||
description: __("Number of new Account, it will be included in the account name as a prefix")},
|
||||
{fieldtype:'Check', fieldname:'is_group', label:__('Is Group'),
|
||||
description: __('Further accounts can be made under Groups, but entries can be made against non-Groups')},
|
||||
{fieldtype:'Select', fieldname:'root_type', label:__('Root Type'),
|
||||
options: ['Asset', 'Liability', 'Equity', 'Income', 'Expense'].join('\n'),
|
||||
depends_on: 'eval:doc.is_group && !doc.parent_account'},
|
||||
{fieldtype:'Select', fieldname:'account_type', label:__('Account Type'),
|
||||
options: frappe.get_meta("Account").fields.filter(d => d.fieldname=='account_type')[0].options,
|
||||
description: __("Optional. This setting will be used to filter in various transactions.")
|
||||
},
|
||||
{fieldtype:'Float', fieldname:'tax_rate', label:__('Tax Rate'),
|
||||
depends_on: 'eval:doc.is_group==0&&doc.account_type=="Tax"'},
|
||||
{fieldtype:'Link', fieldname:'account_currency', label:__('Currency'), options:"Currency",
|
||||
description: __("Optional. Sets company's default currency, if not specified.")}
|
||||
],
|
||||
ignore_fields:["parent_account"],
|
||||
onload: function(treeview) {
|
||||
frappe.treeview_settings['Account'].treeview = {};
|
||||
$.extend(frappe.treeview_settings['Account'].treeview, treeview);
|
||||
function get_company() {
|
||||
return treeview.page.fields_dict.company.get_value();
|
||||
}
|
||||
|
||||
// tools
|
||||
treeview.page.add_inner_button(__("Chart of Cost Centers"), function() {
|
||||
frappe.set_route('Tree', 'Cost Center', {company: get_company()});
|
||||
}, __('View'));
|
||||
|
||||
treeview.page.add_inner_button(__("Opening Invoice Creation Tool"), function() {
|
||||
frappe.set_route('Form', 'Opening Invoice Creation Tool', {company: get_company()});
|
||||
}, __('View'));
|
||||
|
||||
treeview.page.add_inner_button(__("Period Closing Voucher"), function() {
|
||||
frappe.set_route('List', 'Period Closing Voucher', {company: get_company()});
|
||||
}, __('View'));
|
||||
|
||||
|
||||
treeview.page.add_inner_button(__("Journal Entry"), function() {
|
||||
frappe.new_doc('Journal Entry', {company: get_company()});
|
||||
}, __('Create'));
|
||||
treeview.page.add_inner_button(__("Company"), function() {
|
||||
frappe.new_doc('Company');
|
||||
}, __('Create'));
|
||||
|
||||
// financial statements
|
||||
for (let report of ['Trial Balance', 'General Ledger', 'Balance Sheet',
|
||||
'Profit and Loss Statement', 'Cash Flow Statement', 'Accounts Payable', 'Accounts Receivable']) {
|
||||
treeview.page.add_inner_button(__(report), function() {
|
||||
frappe.set_route('query-report', report, {company: get_company()});
|
||||
}, __('Financial Statements'));
|
||||
}
|
||||
|
||||
},
|
||||
post_render: function(treeview) {
|
||||
frappe.treeview_settings['Account'].treeview["tree"] = treeview.tree;
|
||||
treeview.page.set_primary_action(__("New"), function() {
|
||||
let root_company = treeview.page.fields_dict.root_company.get_value();
|
||||
|
||||
if(root_company) {
|
||||
frappe.throw(__("Please add the account to root level Company - ") + root_company);
|
||||
} else {
|
||||
treeview.new_node();
|
||||
}
|
||||
}, "add");
|
||||
},
|
||||
toolbar: [
|
||||
{
|
||||
label:__("Add Child"),
|
||||
condition: function(node) {
|
||||
return frappe.boot.user.can_create.indexOf("Account") !== -1
|
||||
&& (!frappe.treeview_settings['Account'].treeview.page.fields_dict.root_company.get_value()
|
||||
|| frappe.flags.ignore_root_company_validation)
|
||||
&& node.expandable && !node.hide_add;
|
||||
},
|
||||
click: function() {
|
||||
var me = frappe.treeview_settings['Account'].treeview;
|
||||
me.new_node();
|
||||
},
|
||||
btnClass: "hidden-xs"
|
||||
},
|
||||
{
|
||||
condition: function(node) {
|
||||
return !node.root && frappe.boot.user.can_read.indexOf("GL Entry") !== -1
|
||||
},
|
||||
label: __("View Ledger"),
|
||||
click: function(node, btn) {
|
||||
frappe.route_options = {
|
||||
"account": node.label,
|
||||
"from_date": frappe.sys_defaults.year_start_date,
|
||||
"to_date": frappe.sys_defaults.year_end_date,
|
||||
"company": frappe.treeview_settings['Account'].treeview.page.fields_dict.company.get_value()
|
||||
};
|
||||
frappe.set_route("query-report", "General Ledger");
|
||||
},
|
||||
btnClass: "hidden-xs"
|
||||
}
|
||||
],
|
||||
extend_toolbar: true
|
||||
}
|
||||
@@ -1,243 +0,0 @@
|
||||
# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
|
||||
# License: GNU General Public License v3. See license.txt
|
||||
from __future__ import unicode_literals
|
||||
|
||||
import json
|
||||
import os
|
||||
|
||||
import frappe
|
||||
from frappe.utils import cstr
|
||||
from frappe.utils.nestedset import rebuild_tree
|
||||
from six import iteritems
|
||||
from unidecode import unidecode
|
||||
|
||||
|
||||
def create_charts(company, chart_template=None, existing_company=None, custom_chart=None, from_coa_importer=None):
|
||||
chart = custom_chart or get_chart(chart_template, existing_company)
|
||||
if chart:
|
||||
accounts = []
|
||||
|
||||
def _import_accounts(children, parent, root_type, root_account=False):
|
||||
for account_name, child in iteritems(children):
|
||||
if root_account:
|
||||
root_type = child.get("root_type")
|
||||
|
||||
if account_name not in ["account_name", "account_number", "account_type",
|
||||
"root_type", "is_group", "tax_rate"]:
|
||||
|
||||
account_number = cstr(child.get("account_number")).strip()
|
||||
account_name, account_name_in_db = add_suffix_if_duplicate(account_name,
|
||||
account_number, accounts)
|
||||
|
||||
is_group = identify_is_group(child)
|
||||
report_type = "Balance Sheet" if root_type in ["Asset", "Liability", "Equity"] \
|
||||
else "Profit and Loss"
|
||||
|
||||
account = frappe.get_doc({
|
||||
"doctype": "Account",
|
||||
"account_name": child.get('account_name') if from_coa_importer else account_name,
|
||||
"company": company,
|
||||
"parent_account": parent,
|
||||
"is_group": is_group,
|
||||
"root_type": root_type,
|
||||
"report_type": report_type,
|
||||
"account_number": account_number,
|
||||
"account_type": child.get("account_type"),
|
||||
"account_currency": child.get('account_currency') or frappe.db.get_value('Company', company, "default_currency"),
|
||||
"tax_rate": child.get("tax_rate")
|
||||
})
|
||||
|
||||
if root_account or frappe.local.flags.allow_unverified_charts:
|
||||
account.flags.ignore_mandatory = True
|
||||
|
||||
account.flags.ignore_permissions = True
|
||||
|
||||
account.insert()
|
||||
|
||||
accounts.append(account_name_in_db)
|
||||
|
||||
_import_accounts(child, account.name, root_type)
|
||||
|
||||
# Rebuild NestedSet HSM tree for Account Doctype
|
||||
# after all accounts are already inserted.
|
||||
frappe.local.flags.ignore_update_nsm = True
|
||||
_import_accounts(chart, None, None, root_account=True)
|
||||
rebuild_tree("Account", "parent_account")
|
||||
frappe.local.flags.ignore_update_nsm = False
|
||||
|
||||
def add_suffix_if_duplicate(account_name, account_number, accounts):
|
||||
if account_number:
|
||||
account_name_in_db = unidecode(" - ".join([account_number,
|
||||
account_name.strip().lower()]))
|
||||
else:
|
||||
account_name_in_db = unidecode(account_name.strip().lower())
|
||||
|
||||
if account_name_in_db in accounts:
|
||||
count = accounts.count(account_name_in_db)
|
||||
account_name = account_name + " " + cstr(count)
|
||||
|
||||
return account_name, account_name_in_db
|
||||
|
||||
def identify_is_group(child):
|
||||
if child.get("is_group"):
|
||||
is_group = child.get("is_group")
|
||||
elif len(set(child.keys()) - set(["account_type", "root_type", "is_group", "tax_rate", "account_number"])):
|
||||
is_group = 1
|
||||
else:
|
||||
is_group = 0
|
||||
|
||||
return is_group
|
||||
|
||||
def get_chart(chart_template, existing_company=None):
|
||||
chart = {}
|
||||
if existing_company:
|
||||
return get_account_tree_from_existing_company(existing_company)
|
||||
|
||||
elif chart_template == "Standard":
|
||||
from erpnext.accounts.doctype.account.chart_of_accounts.verified import (
|
||||
standard_chart_of_accounts,
|
||||
)
|
||||
return standard_chart_of_accounts.get()
|
||||
elif chart_template == "Standard with Numbers":
|
||||
from erpnext.accounts.doctype.account.chart_of_accounts.verified import (
|
||||
standard_chart_of_accounts_with_account_number,
|
||||
)
|
||||
return standard_chart_of_accounts_with_account_number.get()
|
||||
else:
|
||||
folders = ("verified",)
|
||||
if frappe.local.flags.allow_unverified_charts:
|
||||
folders = ("verified", "unverified")
|
||||
for folder in folders:
|
||||
path = os.path.join(os.path.dirname(__file__), folder)
|
||||
for fname in os.listdir(path):
|
||||
fname = frappe.as_unicode(fname)
|
||||
if fname.endswith(".json"):
|
||||
with open(os.path.join(path, fname), "r") as f:
|
||||
chart = f.read()
|
||||
if chart and json.loads(chart).get("name") == chart_template:
|
||||
return json.loads(chart).get("tree")
|
||||
|
||||
@frappe.whitelist()
|
||||
def get_charts_for_country(country, with_standard=False):
|
||||
charts = []
|
||||
|
||||
def _get_chart_name(content):
|
||||
if content:
|
||||
content = json.loads(content)
|
||||
if (content and content.get("disabled", "No") == "No") \
|
||||
or frappe.local.flags.allow_unverified_charts:
|
||||
charts.append(content["name"])
|
||||
|
||||
country_code = frappe.db.get_value("Country", country, "code")
|
||||
if country_code:
|
||||
folders = ("verified",)
|
||||
if frappe.local.flags.allow_unverified_charts:
|
||||
folders = ("verified", "unverified")
|
||||
|
||||
for folder in folders:
|
||||
path = os.path.join(os.path.dirname(__file__), folder)
|
||||
if not os.path.exists(path):
|
||||
continue
|
||||
|
||||
for fname in os.listdir(path):
|
||||
fname = frappe.as_unicode(fname)
|
||||
if (fname.startswith(country_code) or fname.startswith(country)) and fname.endswith(".json"):
|
||||
with open(os.path.join(path, fname), "r") as f:
|
||||
_get_chart_name(f.read())
|
||||
|
||||
# if more than one charts, returned then add the standard
|
||||
if len(charts) != 1 or with_standard:
|
||||
charts += ["Standard", "Standard with Numbers"]
|
||||
|
||||
return charts
|
||||
|
||||
|
||||
def get_account_tree_from_existing_company(existing_company):
|
||||
all_accounts = frappe.get_all('Account',
|
||||
filters={'company': existing_company},
|
||||
fields = ["name", "account_name", "parent_account", "account_type",
|
||||
"is_group", "root_type", "tax_rate", "account_number"],
|
||||
order_by="lft, rgt")
|
||||
|
||||
account_tree = {}
|
||||
|
||||
# fill in tree starting with root accounts (those with no parent)
|
||||
if all_accounts:
|
||||
build_account_tree(account_tree, None, all_accounts)
|
||||
return account_tree
|
||||
|
||||
def build_account_tree(tree, parent, all_accounts):
|
||||
# find children
|
||||
parent_account = parent.name if parent else ""
|
||||
children = [acc for acc in all_accounts if cstr(acc.parent_account) == parent_account]
|
||||
|
||||
# if no children, but a group account
|
||||
if not children and parent.is_group:
|
||||
tree["is_group"] = 1
|
||||
tree["account_number"] = parent.account_number
|
||||
|
||||
# build a subtree for each child
|
||||
for child in children:
|
||||
# start new subtree
|
||||
tree[child.account_name] = {}
|
||||
|
||||
# assign account_type and root_type
|
||||
if child.account_number:
|
||||
tree[child.account_name]["account_number"] = child.account_number
|
||||
if child.account_type:
|
||||
tree[child.account_name]["account_type"] = child.account_type
|
||||
if child.tax_rate:
|
||||
tree[child.account_name]["tax_rate"] = child.tax_rate
|
||||
if not parent:
|
||||
tree[child.account_name]["root_type"] = child.root_type
|
||||
|
||||
# call recursively to build a subtree for current account
|
||||
build_account_tree(tree[child.account_name], child, all_accounts)
|
||||
|
||||
@frappe.whitelist()
|
||||
def validate_bank_account(coa, bank_account):
|
||||
accounts = []
|
||||
chart = get_chart(coa)
|
||||
|
||||
if chart:
|
||||
def _get_account_names(account_master):
|
||||
for account_name, child in iteritems(account_master):
|
||||
if account_name not in ["account_number", "account_type",
|
||||
"root_type", "is_group", "tax_rate"]:
|
||||
accounts.append(account_name)
|
||||
|
||||
_get_account_names(child)
|
||||
|
||||
_get_account_names(chart)
|
||||
|
||||
return (bank_account in accounts)
|
||||
|
||||
@frappe.whitelist()
|
||||
def build_tree_from_json(chart_template, chart_data=None, from_coa_importer=False):
|
||||
''' get chart template from its folder and parse the json to be rendered as tree '''
|
||||
chart = chart_data or get_chart(chart_template)
|
||||
|
||||
# if no template selected, return as it is
|
||||
if not chart:
|
||||
return
|
||||
|
||||
accounts = []
|
||||
def _import_accounts(children, parent):
|
||||
''' recursively called to form a parent-child based list of dict from chart template '''
|
||||
for account_name, child in iteritems(children):
|
||||
account = {}
|
||||
if account_name in ["account_name", "account_number", "account_type",\
|
||||
"root_type", "is_group", "tax_rate"]: continue
|
||||
|
||||
if from_coa_importer:
|
||||
account_name = child['account_name']
|
||||
|
||||
account['parent_account'] = parent
|
||||
account['expandable'] = True if identify_is_group(child) else False
|
||||
account['value'] = (cstr(child.get('account_number')).strip() + ' - ' + account_name) \
|
||||
if child.get('account_number') else account_name
|
||||
accounts.append(account)
|
||||
_import_accounts(child, account['value'])
|
||||
|
||||
_import_accounts(chart, None)
|
||||
return accounts
|
||||
@@ -1,398 +0,0 @@
|
||||
{
|
||||
"country_code": "at",
|
||||
"name": "Austria - Chart of Accounts",
|
||||
"tree": {
|
||||
"Summe Abschreibungen und Aufwendungen": {
|
||||
"7010 bis 7080 Abschreibungen auf das Anlageverm\u00f6gen (ausgenommen Finanzanlagen)": {},
|
||||
"7100 bis 7190 Sonstige Steuern": {
|
||||
"account_type": "Tax"
|
||||
},
|
||||
"7200 bis 7290 Instandhaltung u. Reinigung durh Dritte, Entsorgung, Beleuchtung": {},
|
||||
"7300 bis 7310 Transporte durch Dritte": {},
|
||||
"7320 bis 7330 Kfz - Aufwand": {},
|
||||
"7340 bis 7350 Reise- und Fahraufwand": {},
|
||||
"7360 bis 7370 Tag- und N\u00e4chtigungsgelder": {},
|
||||
"7380 bis 7390 Nachrichtenaufwand": {},
|
||||
"7400 bis 7430 Miet- und Pachtaufwand": {},
|
||||
"7440 bis 7470 Leasingaufwand": {},
|
||||
"7480 bis 7490 Lizenzaufwand": {},
|
||||
"7500 bis 7530 Aufwand f\u00fcr beigestelltes Personal": {},
|
||||
"7540 bis 7570 Provisionen an Dritte": {},
|
||||
"7580 bis 7590 Aufsichtsratsverg\u00fctungen": {},
|
||||
"7610 bis 7620 Druckerzeugnisse und Vervielf\u00e4ltigungen": {},
|
||||
"7650 bis 7680 Werbung und Repr\u00e4sentationen": {},
|
||||
"7700 bis 7740 Versicherungen": {},
|
||||
"7750 bis 7760 Beratungs- und Pr\u00fcfungsaufwand": {},
|
||||
"7800 bis 7810 Schadensf\u00e4lle": {},
|
||||
"7840 bis 7880 Verschiedene betriebliche Aufwendungen": {},
|
||||
"7910 bis 7950 Aufwandsstellenrechung der Hersteller": {},
|
||||
"Abschreibungen auf aktivierte Aufwendungen f\u00fcr das Ingangs. u. Erweitern des Betriebes": {},
|
||||
"Abschreibungen vom Umlaufverm\u00f6gen, soweit diese die im Unternehmen \u00fcblichen Abschreibungen \u00fcbersteigen": {},
|
||||
"Aufwandsstellenrechnung": {},
|
||||
"Aus- und Fortbildung": {},
|
||||
"Buchwert abgegangener Anlagen, ausgenommen Finanzanlagen": {},
|
||||
"B\u00fcromaterial und Drucksorten": {},
|
||||
"Fachliteratur und Zeitungen ": {},
|
||||
"Herstellungskosten der zur Erzielung der Umsatzerl\u00f6se erbrachten Leistungen": {},
|
||||
"Mitgliedsbeitr\u00e4ge": {},
|
||||
"Skontoertr\u00e4ge auf sonstige betriebliche Aufwendungen": {},
|
||||
"Sonstige betrieblichen Aufwendungen": {},
|
||||
"Spenden und Trinkgelder": {},
|
||||
"Spesen des Geldverkehrs": {},
|
||||
"Verluste aus dem Abgang vom Anlageverm\u00f6gen, ausgenommen Finanzanlagen": {},
|
||||
"Vertriebskosten": {},
|
||||
"Verwaltungskosten": {},
|
||||
"root_type": "Expense"
|
||||
},
|
||||
"Summe Betriebliche Ertr\u00e4ge": {
|
||||
"4400 bis 4490 Erl\u00f6sschm\u00e4lerungen": {},
|
||||
"4500 bis 4570 Ver\u00e4nderungen des Bestandes an fertigen und unfertigen Erzeugn. sowie an noch nicht abrechenbaren Leistungen": {},
|
||||
"4580 bis 4590 andere aktivierte Eigenleistungen": {},
|
||||
"4600 bis 4620 Erl\u00f6se aus dem Abgang vom Anlageverm\u00f6gen, ausgen. Finanzanlagen": {},
|
||||
"4630 bis 4650 Ertr\u00e4ge aus dem Abgang vom Anlageverm\u00f6gen, ausgen. Finanzanlagen": {},
|
||||
"4660 bis 4670 Ertr\u00e4ge aus der Zuschreibung zum Anlageverm\u00f6gen, ausgen. Finanzanlagen": {},
|
||||
"4700 bis 4790 Ertr\u00e4ge aus der Aufl\u00f6sung von R\u00fcckstellungen": {},
|
||||
"4800 bis 4990 \u00dcbrige betriebliche Ertr\u00e4ge": {},
|
||||
"Erl\u00f6se 0 % Ausfuhrlieferungen/Drittl\u00e4nder": {},
|
||||
"Erl\u00f6se 10 %": {},
|
||||
"Erl\u00f6se 20 %": {},
|
||||
"Erl\u00f6se aus im Inland stpfl. EG Lieferungen 10 % USt": {},
|
||||
"Erl\u00f6se aus im Inland stpfl. EG Lieferungen 20 % USt": {},
|
||||
"Erl\u00f6se i.g. Lieferungen (stfr)": {},
|
||||
"root_type": "Income"
|
||||
},
|
||||
"Summe Eigenkapital R\u00fccklagen Abschlusskonten": {
|
||||
"9000 bis 9180 Gezeichnetes bzw. gewidmetes Kapital": {
|
||||
"account_type": "Equity"
|
||||
},
|
||||
"9200 bis 9290 Kapitalr\u00fccklagen": {
|
||||
"account_type": "Equity"
|
||||
},
|
||||
"9300 bis 9380 Gewinnr\u00fccklagen": {
|
||||
"account_type": "Equity"
|
||||
},
|
||||
"9400 bis 9590 Bewertungsreserven uns sonst. unversteuerte R\u00fccklagen": {
|
||||
"account_type": "Equity"
|
||||
},
|
||||
"9600 bis 9690 Privat und Verrechnungskonten bei Einzelunternehmen und Personengesellschaften": {},
|
||||
"9700 bis 9790 Einlagen stiller Gesellschafter ": {},
|
||||
"9900 bis 9999 Evidenzkonten": {},
|
||||
"Bilanzgewinn (-verlust )": {
|
||||
"account_type": "Equity"
|
||||
},
|
||||
"Er\u00f6ffnungsbilanz": {},
|
||||
"Gewinn- und Verlustrechnung": {},
|
||||
"Schlussbilanz": {},
|
||||
"nicht eingeforderte ausstehende Einlagen": {
|
||||
"account_type": "Equity"
|
||||
},
|
||||
"root_type": "Equity"
|
||||
},
|
||||
"Summe Finanzertr\u00e4ge und Aufwendungen": {
|
||||
"8000 bis 8040 Ertr\u00e4ge aus Beteiligungen": {},
|
||||
"8050 bis 8090 Ertr\u00e4ge aus anderen Wertpapieren und Ausleihungen des Finanzanlageverm\u00f6gens": {},
|
||||
"8100 bis 8130 Sonstige Zinsen und \u00e4hnliche Ertr\u00e4ge": {},
|
||||
"8220 bis 8250 Aufwendungen aus Beteiligungen": {},
|
||||
"8260 bis 8270 Aufwendungen aus sonst. Fiananzanlagen und aus Wertpapieren des Umlaufverm\u00f6gens": {},
|
||||
"8280 bis 8340 Zinsen und \u00e4hnliche Aufwendungem": {},
|
||||
"8400 bis 8440 Au\u00dferordentliche Ertr\u00e4ge": {},
|
||||
"8450 bis 8490 Au\u00dferordentliche Aufwendungen": {},
|
||||
"8500 bis 8590 Steuern vom Einkommen und vom Ertrag": {
|
||||
"account_type": "Tax"
|
||||
},
|
||||
"8600 bis 8690 Aufl\u00f6sung unversteuerten R\u00fccklagen": {},
|
||||
"8700 bis 8740 Aufl\u00f6sung von Kapitalr\u00fccklagen": {},
|
||||
"8750 bis 8790 Aufl\u00f6sung von Gewinnr\u00fccklagen": {},
|
||||
"8800 bis 8890 Zuweisung von unversteuerten R\u00fccklagen": {},
|
||||
"Buchwert abgegangener Beteiligungen": {},
|
||||
"Buchwert abgegangener Wertpapiere des Umlaufverm\u00f6gens": {},
|
||||
"Buchwert abgegangener sonstiger Finanzanlagen": {},
|
||||
"Erl\u00f6se aus dem Abgang von Beteiligungen": {},
|
||||
"Erl\u00f6se aus dem Abgang von Wertpapieren des Umlaufverm\u00f6gens": {},
|
||||
"Erl\u00f6se aus dem Abgang von sonstigen Finanzanlagen": {},
|
||||
"Ertr\u00e4ge aus dem Abgang von und der Zuschreibung zu Finanzanlagen": {},
|
||||
"Ertr\u00e4ge aus dem Abgang von und der Zuschreibung zu Wertpapieren des Umlaufverm\u00f6gens": {},
|
||||
"Gewinabfuhr bzw. Verlust\u00fcberrechnung aus Ergebnisabf\u00fchrungsvertr\u00e4gen": {},
|
||||
"nicht ausgenutzte Lieferantenskonti": {},
|
||||
"root_type": "Income"
|
||||
},
|
||||
"Summe Fremdkapital": {
|
||||
"3020 bis 3030 Steuerr\u00fcckstellungen": {},
|
||||
"3040 bis 3090 Sonstige R\u00fcckstellungen": {},
|
||||
"3110 bis 3170 Verbindlichkeiten gegen\u00fcber Kredidinstituten": {},
|
||||
"3180 bis 3190 Verbindlichkeiten gegen\u00fcber Finanzinstituten": {},
|
||||
"3380 bis 3390 Verbindlichkeiten aus der Annahme gezogener Wechsel u. d. Ausstellungen eigener Wechsel": {
|
||||
"account_type": "Payable"
|
||||
},
|
||||
"3400 bis 3470 Verbindlichkeiten gegen\u00fc. verb. Untern., Verbindl. gegen\u00fc. Untern., mit denen eine Beteiligungsverh\u00e4lnis besteht": {},
|
||||
"3600 bis 3690 Verbindlichkeiten im Rahmen der sozialen Sicherheit": {},
|
||||
"3700 bis 3890 \u00dcbrige sonstige Verbindlichkeiten": {},
|
||||
"3900 bis 3990 Passive Rechnungsabgrenzungsposten": {},
|
||||
"Anleihen (einschlie\u00dflich konvertibler)": {},
|
||||
"Erhaltene Anzahlungenauf Bestellungen": {},
|
||||
"R\u00fcckstellungen f\u00fcr Abfertigung": {},
|
||||
"R\u00fcckstellungen f\u00fcr Pensionen": {},
|
||||
"USt. \u00a719 /art (reverse charge)": {
|
||||
"account_type": "Tax"
|
||||
},
|
||||
"Umsatzsteuer": {},
|
||||
"Umsatzsteuer Zahllast": {
|
||||
"account_type": "Tax"
|
||||
},
|
||||
"Umsatzsteuer aus i.g. Erwerb 10%": {
|
||||
"account_type": "Tax"
|
||||
},
|
||||
"Umsatzsteuer aus i.g. Erwerb 20%": {
|
||||
"account_type": "Tax"
|
||||
},
|
||||
"Umsatzsteuer aus i.g. Lieferungen 10%": {
|
||||
"account_type": "Tax"
|
||||
},
|
||||
"Umsatzsteuer aus i.g. Lieferungen 20%": {
|
||||
"account_type": "Tax"
|
||||
},
|
||||
"Umsatzsteuer-Evidenzkonto f\u00fcr erhaltene Anzahlungen auf Bestellungen": {},
|
||||
"Verbindlichkeiten aus Lieferungen u. Leistungen EU": {
|
||||
"account_type": "Payable"
|
||||
},
|
||||
"Verbindlichkeiten aus Lieferungen u. Leistungen Inland": {
|
||||
"account_type": "Payable"
|
||||
},
|
||||
"Verbindlichkeiten aus Lieferungen u. Leistungen sonst. Ausland": {
|
||||
"account_type": "Payable"
|
||||
},
|
||||
"Verbindlichkeiten gegen\u00fcber Gesellschaften": {},
|
||||
"Verrechnung Finanzamt": {
|
||||
"account_type": "Tax"
|
||||
},
|
||||
"root_type": "Liability"
|
||||
},
|
||||
"Summe Kontoklasse 0 Anlageverm\u00f6gen": {
|
||||
"44 bis 49 Sonstige Maschinen und maschinelle Anlagen": {},
|
||||
"920 bis 930 Festverzinsliche Wertpapiere des Anlageverm\u00f6gens": {},
|
||||
"940 bis 970 Sonstige Finanzanlagen, Wertrechte": {},
|
||||
"Allgemeine Werkzeuge und Handwerkzeuge": {},
|
||||
"Andere Bef\u00f6rderungsmittel": {},
|
||||
"Andere Betriebs- und Gesch\u00e4ftsausstattung": {},
|
||||
"Andere Erzeugungshilfsmittel": {},
|
||||
"Anlagen im Bau": {},
|
||||
"Anteile an Investmentfonds": {},
|
||||
"Anteile an Kapitalgesellschaften ohne Beteiligungscharakter": {},
|
||||
"Anteile an Personengesellschaften ohne Beteiligungscharakter": {},
|
||||
"Anteile an verbundenen Unternehmen": {},
|
||||
"Antriebsmaschinen": {},
|
||||
"Aufwendungen f\u00fcs das Ingangssetzen u. Erweitern eines Betriebes": {},
|
||||
"Ausleihungen an verbundene Unternehmen": {},
|
||||
"Ausleihungen an verbundene Unternehmen, mit denen ein Beteiligungsverh\u00e4lnis besteht": {},
|
||||
"Bauliche Investitionen in fremden (gepachteten) Betriebs- und Gesch\u00e4ftsgeb\u00e4uden": {},
|
||||
"Bauliche Investitionen in fremden (gepachteten) Wohn- und Sozialgeb\u00e4uden": {},
|
||||
"Bebaute Grundst\u00fccke (Grundwert)": {},
|
||||
"Beheizungs- und Beleuchtungsanlagen": {},
|
||||
"Beteiligungen an Gemeinschaftunternehmen": {},
|
||||
"Beteiligungen an angeschlossenen (assoziierten) Unternehmen": {},
|
||||
"Betriebs- und Gesch\u00e4ftsgeb\u00e4ude auf eigenem Grund": {},
|
||||
"Betriebs- und Gesch\u00e4ftsgeb\u00e4ude auf fremdem Grund": {},
|
||||
"B\u00fcromaschinen, EDV - Anlagen": {},
|
||||
"Datenverarbeitungsprogramme": {},
|
||||
"Energieversorgungsanlagen": {},
|
||||
"Fertigungsmaschinen": {},
|
||||
"Gebinde": {},
|
||||
"Geleistete Anzahlungen": {},
|
||||
"Genossenschaften ohne Beteiligungscharakter": {},
|
||||
"Geringwertige Verm\u00f6gensgegenst\u00e4nde, soweit im Erzeugerprozess verwendet": {},
|
||||
"Geringwertige Verm\u00f6gensgegenst\u00e4nde, soweit nicht im Erzeugungsprozess verwendet": {},
|
||||
"Gesch\u00e4fts(Firmen)wert": {},
|
||||
"Grundst\u00fcckseinrichtunten auf eigenem Grund": {},
|
||||
"Grundst\u00fcckseinrichtunten auf fremdem Grund": {},
|
||||
"Grundst\u00fccksgleiche Rechte": {},
|
||||
"Hebezeuge und Montageanlagen": {},
|
||||
"Konzessionen": {},
|
||||
"Kumulierte Abschreibungen": {},
|
||||
"LKW": {},
|
||||
"Marken, Warenzeichen und Musterschutzrechte": {},
|
||||
"Maschinenwerkzeuge": {},
|
||||
"Nachrichten- und Kontrollanlagen": {},
|
||||
"PKW": {},
|
||||
"Pacht- und Mietrechte": {},
|
||||
"Patentrechte und Lizenzen": {},
|
||||
"Sonstige Ausleihungen": {},
|
||||
"Sonstige Beteiligungen": {},
|
||||
"Transportanlagen": {},
|
||||
"Unbebaute Grundst\u00fccke": {},
|
||||
"Vorrichtungen, Formen und Modelle": {},
|
||||
"Wohn- und Sozialgeb\u00e4ude auf eigenem Grund": {},
|
||||
"Wohn- und Sozialgeb\u00e4ude auf fremdem Grund": {},
|
||||
"root_type": "Asset"
|
||||
},
|
||||
"Summe Personalaufwand": {
|
||||
"6000 bis 6190 L\u00f6hne": {},
|
||||
"6200 bis 6390 Geh\u00e4lter": {},
|
||||
"6400 bis 6440 Aufwendungen f\u00fcr Abfertigungen": {},
|
||||
"6450 bis 6490 Aufwendungen f\u00fcr Altersversorgung": {},
|
||||
"6500 bis 6550 Gesetzlicher Sozialaufwand Arbeiter": {},
|
||||
"6560 bis 6590 Gesetzlicher Sozialaufwand Angestellte": {},
|
||||
"6600 bis 6650 Lohnabh\u00e4ngige Abgaben und Pflichtbeitr\u00e4gte": {},
|
||||
"6660 bis 6690 Gehaltsabh\u00e4ngige Abgaben und Pflichtbeitr\u00e4gte": {},
|
||||
"6700 bis 6890 Sonstige Sozialaufwendungen": {},
|
||||
"Aufwandsstellenrechnung": {},
|
||||
"root_type": "Expense"
|
||||
},
|
||||
"Summe Umlaufverm\u00f6gen": {
|
||||
"2000 bis 2007 Forderungen aus Lief. und Leist. Inland": {
|
||||
"account_type": "Receivable"
|
||||
},
|
||||
"2100 bis 2120 Forderungen aus Lief. und Leist. EU": {
|
||||
"account_type": "Receivable"
|
||||
},
|
||||
"2150 bis 2170 Forderungen aus Lief. und Leist. Ausland": {
|
||||
"account_type": "Receivable"
|
||||
},
|
||||
"2200 bis 2220 Forderungen gegen\u00fcber verbundenen Unternehmen": {
|
||||
"account_type": "Receivable"
|
||||
},
|
||||
"2250 bis 2270 Forderungen gegen\u00fcber Unternehmen, mit denen ein Beteiligungsverh\u00e4ltnis besteht": {
|
||||
"account_type": "Receivable"
|
||||
},
|
||||
"2300 bis 2460 Sonstige Forderungen und Verm\u00f6gensgegenst\u00e4nde": {
|
||||
"account_type": "Receivable"
|
||||
},
|
||||
"2630 bis 2670 Sonstige Wertpapiere": {
|
||||
"account_type": "Receivable"
|
||||
},
|
||||
"2750 bis 2770 Kassenbest\u00e4nde in Fremdw\u00e4hrung": {
|
||||
"account_type": "Receivable"
|
||||
},
|
||||
"Aktive Rechnungsabrenzungsposten": {
|
||||
"account_type": "Receivable"
|
||||
},
|
||||
"Anteile an verbundenen Unternehmen": {
|
||||
"account_type": "Receivable"
|
||||
},
|
||||
"Bank / Guthaben bei Kreditinstituten": {
|
||||
"account_type": "Receivable"
|
||||
},
|
||||
"Besitzwechsel ...": {
|
||||
"account_type": "Receivable"
|
||||
},
|
||||
"Disagio": {
|
||||
"account_type": "Receivable"
|
||||
},
|
||||
"Eigene Anteile (Wertpapiere)": {
|
||||
"account_type": "Receivable"
|
||||
},
|
||||
"Einfuhrumsatzsteuer (bezahlt)": {},
|
||||
"Eingeforderte aber noch nicht eingezahlte Einlagen": {
|
||||
"account_type": "Receivable"
|
||||
},
|
||||
"Einzelwertberichtigungen zu Forderungen aus Lief. und Leist. Ausland": {
|
||||
"account_type": "Receivable"
|
||||
},
|
||||
"Einzelwertberichtigungen zu Forderungen aus Lief. und Leist. EU": {
|
||||
"account_type": "Receivable"
|
||||
},
|
||||
"Einzelwertberichtigungen zu Forderungen aus Lief. und Leist. Inland ": {
|
||||
"account_type": "Receivable"
|
||||
},
|
||||
"Einzelwertberichtigungen zu Forderungen gegen\u00fcber Unternehmen mit denen ein Beteiligungsverh\u00e4ltnis besteht": {
|
||||
"account_type": "Receivable"
|
||||
},
|
||||
"Einzelwertberichtigungen zu Forderungen gegen\u00fcber verbundenen Unternehmen": {
|
||||
"account_type": "Receivable"
|
||||
},
|
||||
"Einzelwertberichtigungen zu sonstigen Forderungen und Verm\u00f6gensgegenst\u00e4nden": {
|
||||
"account_type": "Receivable"
|
||||
},
|
||||
"Kassenbestand": {
|
||||
"account_type": "Receivable"
|
||||
},
|
||||
"Pauschalwertberichtigungen zu Forderungen aus Lief. und Leist. Ausland": {
|
||||
"account_type": "Receivable"
|
||||
},
|
||||
"Pauschalwertberichtigungen zu Forderungen aus Lief. und Leist. EU": {
|
||||
"account_type": "Receivable"
|
||||
},
|
||||
"Pauschalwertberichtigungen zu Forderungen aus Lief. und Leist. Inland ": {
|
||||
"account_type": "Receivable"
|
||||
},
|
||||
"Pauschalwertberichtigungen zu Forderungen gegen\u00fcber Unternehmen mit denen ein Beteiligungsverh\u00e4ltnis besteht": {
|
||||
"account_type": "Receivable"
|
||||
},
|
||||
"Pauschalwertberichtigungen zu Forderungen gegen\u00fcber verbundenen Unternehmen": {
|
||||
"account_type": "Receivable"
|
||||
},
|
||||
"Pauschalwertberichtigungen zu sonstigen Forderungen und Verm\u00f6gensgegenst\u00e4nden": {
|
||||
"account_type": "Receivable"
|
||||
},
|
||||
"Postwertzeichen": {
|
||||
"account_type": "Receivable"
|
||||
},
|
||||
"Schecks in Inlandsw\u00e4hrung": {
|
||||
"account_type": "Receivable"
|
||||
},
|
||||
"Sonstige Anteile": {
|
||||
"account_type": "Receivable"
|
||||
},
|
||||
"Stempelmarken": {
|
||||
"account_type": "Receivable"
|
||||
},
|
||||
"Steuerabgrenzung": {
|
||||
"account_type": "Receivable"
|
||||
},
|
||||
"Unterschiedsbetrag gem. Abschnitt XII Pensionskassengesetz": {
|
||||
"account_type": "Receivable"
|
||||
},
|
||||
"Unterschiedsbetrag zur gebotenen Pensionsr\u00fcckstellung": {
|
||||
"account_type": "Receivable"
|
||||
},
|
||||
"Vorsteuer": {
|
||||
"account_type": "Receivable"
|
||||
},
|
||||
"Vorsteuer aus ig. Erwerb 10%": {
|
||||
"account_type": "Tax"
|
||||
},
|
||||
"Vorsteuer aus ig. Erwerb 20%": {
|
||||
"account_type": "Tax"
|
||||
},
|
||||
"Vorsteuer \u00a719/Art 19 ( reverse charge ) ": {
|
||||
"account_type": "Tax"
|
||||
},
|
||||
"Wertberichtigungen": {
|
||||
"account_type": "Receivable"
|
||||
},
|
||||
"root_type": "Asset"
|
||||
},
|
||||
"Summe Vorr\u00e4te": {
|
||||
"1000 bis 1090 Bezugsverrechnung": {},
|
||||
"1100 bis 1190 Rohstoffe": {},
|
||||
"1200 bis 1290 Bezogene Teile": {},
|
||||
"1300 bis 1340 Hilfsstoffe": {},
|
||||
"1350 bis 1390 Betriebsstoffe": {},
|
||||
"1400 bis 1490 Unfertige Erzeugniss": {},
|
||||
"1500 bis 1590 Fertige Erzeugniss": {},
|
||||
"1600 bis 1690 Waren": {},
|
||||
"1700 bis 1790 Noch nicht abgerechenbare Leistungen": {},
|
||||
"1900 bis 1990 Wertberichtigungen": {},
|
||||
"geleistete Anzahlungen": {},
|
||||
"root_type": "Asset"
|
||||
},
|
||||
"Summe Wareneinsatz": {
|
||||
"5100 bis 5190 Verbrauch an Rohstoffen": {},
|
||||
"5200 bis 5290 Verbrauch von bezogenen Fertig- und Einzelteilen": {},
|
||||
"5300 bis 5390 Verbrauch von Hilfsstoffen": {},
|
||||
"5400 bis 5490 Verbrauch von Betriebsstoffen": {},
|
||||
"5500 bis 5590 Verbrauch von Werkzeugen und anderen Erzeugungshilfsmittel": {},
|
||||
"5600 bis 5690 Verbrauch von Brenn- und Treibstoffen, Energie und Wasser": {},
|
||||
"5700 bis 5790 Sonstige bezogene Herstellungsleistungen": {},
|
||||
"Aufwandsstellenrechnung": {},
|
||||
"Skontoertr\u00e4ge auf Materialaufwand": {},
|
||||
"Skontoertr\u00e4ge auf sonstige bezogene Herstellungsleistungen": {},
|
||||
"Wareneinkauf 10 %": {},
|
||||
"Wareneinkauf 20 %": {},
|
||||
"Wareneinkauf igErwerb 10 % VSt/10 % USt": {},
|
||||
"Wareneinkauf igErwerb 20 % VSt/20 % USt": {},
|
||||
"Wareneinkauf igErwerb ohne Vorsteuerabzug und 10 % USt": {},
|
||||
"Wareneinkauf igErwerb ohne Vorsteuerabzug und 20 % USt": {},
|
||||
"root_type": "Expense"
|
||||
}
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,205 +0,0 @@
|
||||
{
|
||||
"country_code": "cl",
|
||||
"name": "Chile - Plan de Cuentas",
|
||||
"tree": {
|
||||
"Cuentas de Movimiento": {
|
||||
"Compras": {
|
||||
"Compras - Categoria de productos 01": {}
|
||||
},
|
||||
"Costos de Producci\u00f3n": {},
|
||||
"Gastos de Administraci\u00f3n": {},
|
||||
"Gastos de Comercializaci\u00f3n": {},
|
||||
"root_type": ""
|
||||
},
|
||||
"Cuentas de Orden": {
|
||||
"CUENTAS DE ORDEN ACREEDORAS": {
|
||||
"Acreedor por Documentos Descontados": {},
|
||||
"Acreedor por Garant\u00edas Otorgadas": {},
|
||||
"Comitente por Mercaderias Recibidas en Consignaci\u00f3n": {}
|
||||
},
|
||||
"CUENTAS DE ORDEN DEUDORAS": {
|
||||
"Dep\u00f3sito de Valores Recibos en Garant\u00eda": {},
|
||||
"Documentos Descontados": {},
|
||||
"Documentos Endosados": {},
|
||||
"Garantias Otorgadas": {},
|
||||
"Mercaderias Recibidas en Consignaci\u00f3n": {}
|
||||
},
|
||||
"root_type": ""
|
||||
},
|
||||
"Cuentas de Resultado": {
|
||||
"RESULTADO GANANCIA": {
|
||||
"Ingresos Fuera de Explotaci\u00f3n": {
|
||||
"Donaciones obtenidas, ganandas, percibidas": {},
|
||||
"Ganancia Venta Inversiones Permanentes": {},
|
||||
"Ganancia Venta de Activo Fijo": {},
|
||||
"Recupero de Deudores Incobrables": {},
|
||||
"Recupero de Rezagos": {}
|
||||
},
|
||||
"Ingresos de Explotaci\u00f3n": {
|
||||
"Alquileres gananados, obtenidos, percibidos": {},
|
||||
"Comisiones gananados, obtenidos, percibidos": {},
|
||||
"Descuentos gananados, obtenidos, percibidos": {},
|
||||
"Ganancia Venta de Acciones": {},
|
||||
"Honorarios gananados, obtenidos, percibidos": {},
|
||||
"Interese sobre Inversiones": {},
|
||||
"Intereses gananados, obtenidos, percibidos": {},
|
||||
"Ventas": {
|
||||
"Ventas - Categoria de productos 01": {}
|
||||
}
|
||||
}
|
||||
},
|
||||
"RESULTADO P\u00c9RDIDA": {
|
||||
"Egresos Fuera de Explotaci\u00f3n": {
|
||||
"Donaciones Cedidas, Otorgadas": {},
|
||||
"Gastos en Siniestros": {},
|
||||
"P\u00e9rdida Venta Activo Fijo": {}
|
||||
},
|
||||
"Egresos de Explotaci\u00f3n": {
|
||||
"Costo de Mercader\u00edas Vendidas": {
|
||||
"Costo de Mercader\u00edas Vendidas - Categoria de productos 01": {}
|
||||
},
|
||||
"Gastos Bancarios": {},
|
||||
"Gastos de Publicidad y Propaganda": {},
|
||||
"Gastos en Amortizaci\u00f3n": {},
|
||||
"Gastos en Cargas Sociales": {},
|
||||
"Gastos en Depreciaci\u00f3n de Activo Fijo": {},
|
||||
"Gastos en Impuestos": {},
|
||||
"Gastos en Servicios P\u00fablicos": {},
|
||||
"Gastos en Sueldos y Jornales": {}
|
||||
}
|
||||
},
|
||||
"root_type": ""
|
||||
},
|
||||
"inventario del Balance General": {
|
||||
"ACTIVOS": {
|
||||
"Activo Circulante": {
|
||||
"Activo Circulante - Bancos": {
|
||||
"Activo Circulante.../ BCO. CTA CTE CLP": {}
|
||||
},
|
||||
"Activo Circulante - Caja": {
|
||||
"Activo Circulante - Caja / efectivo CLP": {}
|
||||
},
|
||||
"Activo Circulante - Fondos fijos": {
|
||||
"Activo Circulante - Fondos fijos / caja chica 01 CLP": {}
|
||||
},
|
||||
"Activo Circulante - Moneda Extranjera": {
|
||||
"Activo Circulante - Caja / efectivo USD": {}
|
||||
},
|
||||
"Activo Circulante - Recaudaciones a Depositar ": {},
|
||||
"Activo Circulante - Valores a Depositar ": {}
|
||||
},
|
||||
"Activo Fijo": {
|
||||
"Activo Fijo / (-) Depreciaci\u00f3n Acumulada": {},
|
||||
"Activo Fijo / Equipos": {},
|
||||
"Activo Fijo / Inmuebles": {},
|
||||
"Activo Fijo / Maquinaria": {},
|
||||
"Activo Fijo / Material Rodante Motorizado": {}
|
||||
},
|
||||
"Activo Intangible": {
|
||||
"Activo Intangible / (-) Amortizaci\u00f3n Acumulada": {},
|
||||
"Activo Intangible / Concesiones y Franquicias": {},
|
||||
"Activo Intangible / Derecho de Llaves": {},
|
||||
"Activo Intangible / Marcas y Patentes de Invenci\u00f3n": {}
|
||||
},
|
||||
"Existencias": {
|
||||
"(-) Previsi\u00f3n para Desvalorizaci\u00f3n de Existencias": {},
|
||||
"Existencias - Mercader\u00edas": {
|
||||
"Existencias - Mercader\u00edas / Categoria de productos 01": {}
|
||||
},
|
||||
"Existencias - Mercader\u00edas en Tr\u00e1nsito": {},
|
||||
"Materiales Varios ": {},
|
||||
"Materias primas": {},
|
||||
"Productos Elaborados": {},
|
||||
"Productos en Curso de Elaboraci\u00f3n": {}
|
||||
},
|
||||
"Inversiones Financieras": {
|
||||
"Inversiones / (-) Previsi\u00f3n para Devalorizaci\u00f3n de Acciones": {},
|
||||
"Inversiones / Acciones Permanentes": {},
|
||||
"Inversiones / Acciones Transitorias": {},
|
||||
"Inversiones / T\u00edtulos P\u00fablicos": {}
|
||||
}
|
||||
},
|
||||
"Cuentas por Cobrar": {
|
||||
"Cuentas por Cobrar / (-) Intereses (+) a Devengar": {},
|
||||
"Cuentas por Cobrar / (-) Previsi\u00f3n para Descuentos": {},
|
||||
"Cuentas por Cobrar / Accionistas": {},
|
||||
"Cuentas por Cobrar / Alquileres Pagados por Adelantado": {},
|
||||
"Cuentas por Cobrar / Anticipo al Personal": {},
|
||||
"Cuentas por Cobrar / Anticipo de Impuestos": {},
|
||||
"Cuentas por Cobrar / Anticipos a Proveedores": {},
|
||||
"Cuentas por Cobrar / Intereses Pagados por Adelantado": {},
|
||||
"Cuentas por Cobrar / Pr\u00e9stamos otorgados": {}
|
||||
},
|
||||
"Documentos por Cobrar": {
|
||||
"Documentos por Cobrar / (-) Previsi\u00f3n para Incobrables": {},
|
||||
"Documentos por Cobrar / Deudores Morosos": {},
|
||||
"Documentos por Cobrar / Deudores Varios": {},
|
||||
"Documentos por Cobrar / Deudores en Gesti\u00f3n Judicial": {},
|
||||
"Documentos por Cobrar / Deudores por Ventas": {}
|
||||
},
|
||||
"PASIVOS": {
|
||||
"Cuentas por Pagar": {
|
||||
"Cuentas por Pagar / (-) Intereses a Devengar por Compras al Cr\u00e9dito": {},
|
||||
"Cuentas por Pagar / Anticipos de Clientes": {},
|
||||
"Cuentas por Pagar / Proveedores": {}
|
||||
},
|
||||
"Impuestos por Pagar": {
|
||||
"Impuestos por Pagar / IVA a Pagar": {},
|
||||
"Impuestos por Pagar / Impuesto a la Renta a Pagar": {}
|
||||
},
|
||||
"Otras Cuentas por Pagar": {
|
||||
"Otras Cuentas por Pagar / Acreedores Varios": {},
|
||||
"Otras Cuentas por Pagar / Cobros por Adelantado": {},
|
||||
"Otras Cuentas por Pagar / Dividendos a Pagar": {},
|
||||
"Otras Cuentas por Pagar / Honorarios Directores y S\u00edndicos a Pagar": {}
|
||||
},
|
||||
"Pasivo Circulante": {
|
||||
"Pasivo Circulante / Adelantos en Cuenta Corriente": {},
|
||||
"Pasivo Circulante / Debentures Emitidos": {},
|
||||
"Pasivo Circulante / Intereses a Pagar": {},
|
||||
"Pasivo Circulante / Obligaciones a Pagar": {},
|
||||
"Pasivo Circulante / Prestamos": {}
|
||||
},
|
||||
"Provisiones": {
|
||||
"Provisiones / Previsi\u00f3n Indemnizaci\u00f3n por Despidos": {},
|
||||
"Provisiones / Previsi\u00f3n para Garant\u00edas por Service": {},
|
||||
"Provisiones / Previsi\u00f3n para juicios Pendientes": {}
|
||||
},
|
||||
"Remuneraciones por Pagar": {
|
||||
"Remuneraciones por Pagar / Cargas Sociales a Pagar": {},
|
||||
"Remuneraciones por Pagar / Provisi\u00f3n para Sueldo Anual Complementario": {},
|
||||
"Remuneraciones por Pagar / Retenciones a Depositar": {},
|
||||
"Remuneraciones por Pagar / Sueldos a Pagar": {}
|
||||
}
|
||||
},
|
||||
"PATRIMONIO": {
|
||||
"Ajustes al Patrimonio": {
|
||||
"Ajustes al Patrimonio / Revaluo T\u00e9cnico de Activo Fijo": {}
|
||||
},
|
||||
"Aportes No Capitalizados": {
|
||||
"Aportes No Capitalizados / Aportes Irrevocables Futura Suscripci\u00f3n de Acciones": {},
|
||||
"Aportes No Capitalizados / Primas de Emsi\u00f3n": {}
|
||||
},
|
||||
"Capital": {
|
||||
"Capital / (-) Descuento de Emisi\u00f3n de Acciones": {},
|
||||
"Capital / Acciones en Circulaci\u00f3n": {},
|
||||
"Capital / Capital Propio": {},
|
||||
"Capital / Dividendos a Distribuir en Acciones": {}
|
||||
},
|
||||
"Futuras Eventualidades": {
|
||||
"Reserva Estatutaria": {},
|
||||
"Reserva Facultativa": {},
|
||||
"Reserva Legal": {},
|
||||
"Reserva para Renovaci\u00f3n de Activo Fijo": {}
|
||||
},
|
||||
"Resultados No Asignados": {
|
||||
"Resultado del Ejercicio": {},
|
||||
"Resultados Acumulados": {},
|
||||
"Resultados Acumulados del Ejercicio Anterior": {},
|
||||
"Utilidades y P\u00e9rdidas del Ejercicio": {}
|
||||
}
|
||||
},
|
||||
"root_type": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,274 +0,0 @@
|
||||
{
|
||||
"country_code": "cn",
|
||||
"name": "China - \u4e2d\u56fd\u4f1a\u8ba1\u79d1\u76ee\u8868 \uff08\u8d22\u4f1a[2006]3\u53f7\u300a\u4f01\u4e1a\u4f1a\u8ba1\u51c6\u5219\u300b\uff09",
|
||||
"tree": {
|
||||
"\u4e3b\u8425\u4e1a\u52a1\u6210\u672c": {
|
||||
"root_type": ""
|
||||
},
|
||||
"\u4e3b\u8425\u4e1a\u52a1\u6536\u5165": {
|
||||
"root_type": ""
|
||||
},
|
||||
"\u4ea4\u6613\u6027\u91d1\u878d\u8d1f\u503a": {
|
||||
"root_type": ""
|
||||
},
|
||||
"\u4ea4\u6613\u6027\u91d1\u878d\u8d44\u4ea7": {
|
||||
"root_type": ""
|
||||
},
|
||||
"\u4ee5\u524d\u5e74\u5ea6\u635f\u76ca\u8c03\u6574": {
|
||||
"root_type": ""
|
||||
},
|
||||
"\u516c\u5141\u4ef7\u503c\u53d8\u52a8\u635f\u76ca": {
|
||||
"root_type": ""
|
||||
},
|
||||
"\u5176\u4ed6\u4e1a\u52a1\u652f\u51fa": {
|
||||
"root_type": ""
|
||||
},
|
||||
"\u5176\u4ed6\u4e1a\u52a1\u6536\u5165": {
|
||||
"root_type": ""
|
||||
},
|
||||
"\u5176\u4ed6\u5e94\u4ed8\u6b3e": {
|
||||
"root_type": ""
|
||||
},
|
||||
"\u5176\u4ed6\u5e94\u6536\u6b3e": {
|
||||
"root_type": ""
|
||||
},
|
||||
"\u5176\u4ed6\u8d27\u5e01\u8d44\u91d1": {
|
||||
"root_type": ""
|
||||
},
|
||||
"\u5229\u6da6\u5206\u914d": {
|
||||
"root_type": ""
|
||||
},
|
||||
"\u5236\u9020\u8d39\u7528": {
|
||||
"root_type": ""
|
||||
},
|
||||
"\u52b3\u52a1\u6210\u672c": {
|
||||
"root_type": ""
|
||||
},
|
||||
"\u5305\u88c5\u7269\u53ca\u4f4e\u503c\u6613\u8017\u54c1": {
|
||||
"root_type": ""
|
||||
},
|
||||
"\u539f\u6750\u6599": {
|
||||
"root_type": ""
|
||||
},
|
||||
"\u53d1\u51fa\u5546\u54c1": {
|
||||
"root_type": ""
|
||||
},
|
||||
"\u5546\u54c1\u8fdb\u9500\u5dee\u4ef7": {
|
||||
"root_type": ""
|
||||
},
|
||||
"\u5546\u8a89": {
|
||||
"root_type": ""
|
||||
},
|
||||
"\u56fa\u5b9a\u8d44\u4ea7": {
|
||||
"root_type": ""
|
||||
},
|
||||
"\u56fa\u5b9a\u8d44\u4ea7\u51cf\u503c\u51c6\u5907": {
|
||||
"root_type": ""
|
||||
},
|
||||
"\u56fa\u5b9a\u8d44\u4ea7\u6e05\u7406": {
|
||||
"root_type": ""
|
||||
},
|
||||
"\u5728\u5efa\u5de5\u7a0b": {
|
||||
"root_type": ""
|
||||
},
|
||||
"\u5728\u9014\u7269\u8d44": {
|
||||
"root_type": ""
|
||||
},
|
||||
"\u574f\u8d26\u51c6\u5907": {
|
||||
"root_type": ""
|
||||
},
|
||||
"\u5957\u671f\u5de5\u5177": {
|
||||
"root_type": ""
|
||||
},
|
||||
"\u59d4\u6258\u52a0\u5de5\u7269\u8d44": {
|
||||
"root_type": ""
|
||||
},
|
||||
"\u5b58\u8d27\u8dcc\u4ef7\u51c6\u5907": {
|
||||
"root_type": ""
|
||||
},
|
||||
"\u5b9e\u6536\u8d44\u672c": {
|
||||
"root_type": ""
|
||||
},
|
||||
"\u5de5\u7a0b\u7269\u8d44": {
|
||||
"root_type": ""
|
||||
},
|
||||
"\u5e93\u5b58\u5546\u54c1": {
|
||||
"root_type": ""
|
||||
},
|
||||
"\u5e93\u5b58\u80a1": {
|
||||
"root_type": ""
|
||||
},
|
||||
"\u5e94\u4ea4\u7a0e\u8d39": {
|
||||
"root_type": "",
|
||||
"\u5e94\u4ea4\u4e2a\u4eba\u6240\u5f97\u7a0e": {},
|
||||
"\u5e94\u4ea4\u571f\u5730\u4f7f\u7528\u7a0e": {},
|
||||
"\u5e94\u4ea4\u571f\u5730\u589e\u503c\u7a0e": {},
|
||||
"\u5e94\u4ea4\u57ce\u5e02\u7ef4\u62a4\u5efa\u8bbe\u7a0e": {},
|
||||
"\u5e94\u4ea4\u589e\u503c\u7a0e": {
|
||||
"\u51cf\u514d\u7a0e\u6b3e": {},
|
||||
"\u51fa\u53e3\u62b5\u51cf\u5185\u9500\u4ea7\u54c1\u5e94\u7eb3\u7a0e\u989d": {},
|
||||
"\u51fa\u53e3\u9000\u7a0e": {},
|
||||
"\u5df2\u4ea4\u7a0e\u91d1": {},
|
||||
"\u672a\u4ea4\u589e\u503c\u7a0e": {},
|
||||
"\u8f6c\u51fa\u591a\u4ea4\u589e\u503c\u7a0e": {},
|
||||
"\u8f6c\u51fa\u672a\u4ea4\u589e\u503c\u7a0e": {},
|
||||
"\u8fdb\u9879\u7a0e\u989d": {},
|
||||
"\u8fdb\u9879\u7a0e\u989d\u8f6c\u51fa": {},
|
||||
"\u9500\u9879\u7a0e\u989d": {}
|
||||
},
|
||||
"\u5e94\u4ea4\u623f\u4ea7\u7a0e": {},
|
||||
"\u5e94\u4ea4\u6240\u5f97\u7a0e": {},
|
||||
"\u5e94\u4ea4\u6d88\u8d39\u7a0e": {},
|
||||
"\u5e94\u4ea4\u8425\u4e1a\u7a0e": {},
|
||||
"\u5e94\u4ea4\u8d44\u6e90\u7a0e": {},
|
||||
"\u5e94\u4ea4\u8f66\u8239\u4f7f\u7528\u7a0e": {}
|
||||
},
|
||||
"\u5e94\u4ed8\u5229\u606f": {
|
||||
"root_type": ""
|
||||
},
|
||||
"\u5e94\u4ed8\u7968\u636e": {
|
||||
"root_type": ""
|
||||
},
|
||||
"\u5e94\u4ed8\u804c\u5de5\u85aa\u916c": {
|
||||
"root_type": ""
|
||||
},
|
||||
"\u5e94\u4ed8\u80a1\u5229": {
|
||||
"root_type": ""
|
||||
},
|
||||
"\u5e94\u4ed8\u8d26\u6b3e": {
|
||||
"root_type": ""
|
||||
},
|
||||
"\u5e94\u6536\u5229\u606f": {
|
||||
"root_type": ""
|
||||
},
|
||||
"\u5e94\u6536\u7968\u636e": {
|
||||
"root_type": ""
|
||||
},
|
||||
"\u5e94\u6536\u80a1\u5229": {
|
||||
"root_type": ""
|
||||
},
|
||||
"\u5e94\u6536\u8d26\u6b3e": {
|
||||
"root_type": ""
|
||||
},
|
||||
"\u5f85\u5904\u7406\u8d22\u4ea7\u635f\u6ea2": {
|
||||
"root_type": ""
|
||||
},
|
||||
"\u5f85\u644a\u8d39\u7528": {
|
||||
"root_type": ""
|
||||
},
|
||||
"\u6240\u5f97\u7a0e": {
|
||||
"root_type": ""
|
||||
},
|
||||
"\u6295\u8d44\u6536\u76ca": {
|
||||
"root_type": ""
|
||||
},
|
||||
"\u6301\u6709\u81f3\u5230\u671f\u6295\u8d44": {
|
||||
"root_type": ""
|
||||
},
|
||||
"\u6301\u6709\u81f3\u5230\u671f\u6295\u8d44\u51cf\u503c\u51c6\u5907": {
|
||||
"root_type": ""
|
||||
},
|
||||
"\u65e0\u5f62\u8d44\u4ea7": {
|
||||
"root_type": ""
|
||||
},
|
||||
"\u65e0\u5f62\u8d44\u4ea7\u51cf\u503c\u51c6\u5907": {
|
||||
"root_type": ""
|
||||
},
|
||||
"\u672c\u5e74\u5229\u6da6": {
|
||||
"root_type": ""
|
||||
},
|
||||
"\u6750\u6599\u6210\u672c\u5dee\u5f02": {
|
||||
"root_type": ""
|
||||
},
|
||||
"\u6750\u6599\u91c7\u8d2d": {
|
||||
"root_type": ""
|
||||
},
|
||||
"\u73b0\u91d1": {
|
||||
"root_type": ""
|
||||
},
|
||||
"\u751f\u4ea7\u6210\u672c": {
|
||||
"root_type": ""
|
||||
},
|
||||
"\u76c8\u4f59\u516c\u79ef": {
|
||||
"root_type": ""
|
||||
},
|
||||
"\u77ed\u671f\u501f\u6b3e": {
|
||||
"root_type": ""
|
||||
},
|
||||
"\u7814\u53d1\u652f\u51fa": {
|
||||
"root_type": ""
|
||||
},
|
||||
"\u7ba1\u7406\u8d39\u7528": {
|
||||
"root_type": ""
|
||||
},
|
||||
"\u7d2f\u8ba1\u6298\u65e7": {
|
||||
"root_type": ""
|
||||
},
|
||||
"\u8425\u4e1a\u5916\u652f\u51fa": {
|
||||
"root_type": ""
|
||||
},
|
||||
"\u8425\u4e1a\u5916\u6536\u5165": {
|
||||
"root_type": ""
|
||||
},
|
||||
"\u8425\u4e1a\u7a0e\u91d1\u53ca\u9644\u52a0": {
|
||||
"root_type": ""
|
||||
},
|
||||
"\u884d\u751f\u5de5\u5177": {
|
||||
"root_type": ""
|
||||
},
|
||||
"\u88ab\u5957\u671f\u9879\u76ee": {
|
||||
"root_type": ""
|
||||
},
|
||||
"\u8d22\u52a1\u8d39\u7528": {
|
||||
"root_type": ""
|
||||
},
|
||||
"\u8d44\u4ea7\u51cf\u503c\u635f\u5931": {
|
||||
"root_type": ""
|
||||
},
|
||||
"\u8d44\u672c\u516c\u79ef": {
|
||||
"root_type": ""
|
||||
},
|
||||
"\u9012\u5ef6\u6240\u5f97\u7a0e\u8d1f\u503a": {
|
||||
"root_type": ""
|
||||
},
|
||||
"\u9012\u5ef6\u6240\u5f97\u7a0e\u8d44\u4ea7": {
|
||||
"root_type": ""
|
||||
},
|
||||
"\u94f6\u884c\u5b58\u6b3e": {
|
||||
"root_type": ""
|
||||
},
|
||||
"\u9500\u552e\u8d39\u7528": {
|
||||
"root_type": ""
|
||||
},
|
||||
"\u957f\u671f\u501f\u6b3e": {
|
||||
"root_type": ""
|
||||
},
|
||||
"\u957f\u671f\u503a\u5238": {
|
||||
"root_type": ""
|
||||
},
|
||||
"\u957f\u671f\u5e94\u4ed8\u6b3e": {
|
||||
"root_type": ""
|
||||
},
|
||||
"\u957f\u671f\u5e94\u6536\u6b3e": {
|
||||
"root_type": ""
|
||||
},
|
||||
"\u957f\u671f\u5f85\u644a\u8d39\u7528": {
|
||||
"root_type": ""
|
||||
},
|
||||
"\u957f\u671f\u6295\u8d44\u51cf\u503c\u51c6\u5907": {
|
||||
"root_type": ""
|
||||
},
|
||||
"\u957f\u671f\u80a1\u6743\u6295\u8d44": {
|
||||
"root_type": ""
|
||||
},
|
||||
"\u9884\u4ed8\u8d26\u6b3e": {
|
||||
"root_type": ""
|
||||
},
|
||||
"\u9884\u63d0\u8d39\u7528": {
|
||||
"root_type": ""
|
||||
},
|
||||
"\u9884\u6536\u8d26\u6b3e": {
|
||||
"root_type": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,273 +0,0 @@
|
||||
{
|
||||
"country_code": "cr",
|
||||
"name": "Costa Rica - Chart of Accounts 1",
|
||||
"tree": {
|
||||
"0-Activo": {
|
||||
"0-Activo circulante": {
|
||||
"0-Activo circulante disponible": {
|
||||
"0-Bancos": {
|
||||
"0-Cuentas corrientes CRC": {
|
||||
"0-Cuenta en CRC 1": {}
|
||||
},
|
||||
"0-Cuentas corrientes USD": {
|
||||
"0-Cuenta en USD 1": {}
|
||||
}
|
||||
},
|
||||
"0-Fondos de caja": {
|
||||
"0-Fondos de caja CRC": {
|
||||
"0-Fondo de caja oficinas centrales CRC": {}
|
||||
},
|
||||
"0-Fondos de caja USD": {
|
||||
"0-Fondo de caja oficinas centrales USD": {}
|
||||
}
|
||||
},
|
||||
"0-Fondos en tr\u00e1nsito": {
|
||||
"0-Fondos en tr\u00e1nsito de PayPal a Bancos": {},
|
||||
"0-Fondos en tr\u00e1nsito en bancos": {},
|
||||
"0-Fondos en tr\u00e1nsito en tesorer\u00eda": {}
|
||||
},
|
||||
"0-Inversiones a la vista": {
|
||||
"0-Inversi\u00f3n 1": {}
|
||||
},
|
||||
"0-PayPal": {
|
||||
"0-Cuenta PayPal 1": {}
|
||||
}
|
||||
},
|
||||
"0-Activo circulante exigible": {
|
||||
"0-Cuentas por cobrar a compa\u00f1\u00edas relacionadas": {},
|
||||
"0-Cuentas por cobrar a empleados": {},
|
||||
"0-Cuentas por cobrar comerciales": {},
|
||||
"0-Inversiones de corto plazo": {},
|
||||
"0-Otras cuentas por cobrar": {}
|
||||
},
|
||||
"0-Activo circulante realizable": {
|
||||
"0-Inventarios": {
|
||||
"0-Inventario de consumibles": {},
|
||||
"0-Inventario de producto para la venta": {}
|
||||
}
|
||||
}
|
||||
},
|
||||
"0-Activo fijo": {
|
||||
"0-Activo fijo depreciable": {
|
||||
"0-Activos depreciables m\u00f3viles": {
|
||||
"0-Equipo de c\u00f3mputo": {},
|
||||
"0-Herramientas mayores": {},
|
||||
"0-Maquinaria y equipo de edificios": {},
|
||||
"0-Moibliario y equipo de oficina": {},
|
||||
"0-Veh\u00edculos": {}
|
||||
},
|
||||
"0-Edificios": {
|
||||
"0-Edificios \u2013 Revaluaciones": {
|
||||
"0-Edificio 1": {}
|
||||
},
|
||||
"0-Edificios \u2013 Valores originales": {
|
||||
"0-Edificio 1": {}
|
||||
}
|
||||
},
|
||||
"0-Mejoras a edificios": {
|
||||
"0-Mejoras a edificios \u2013 Revaluaciones": {
|
||||
"0-Edificio 1": {}
|
||||
},
|
||||
"0-Mejoras a edificios \u2013 Valores originales": {
|
||||
"0-Edificio 1": {}
|
||||
}
|
||||
}
|
||||
},
|
||||
"0-Activo fijo no depreciable": {
|
||||
"0-Terrenos": {
|
||||
"0-Revaluaciones": {
|
||||
"0-Terreno 1": {}
|
||||
},
|
||||
"0-Valores originales": {
|
||||
"0-Terreno 1": {}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"0-Depreciaciones acumuladas sobre activo fijo depreciable": {
|
||||
"0-Dep. ac. de activos depreciables m\u00f3viles": {
|
||||
"0-Dep. ac. de equipo de c\u00f3mputo": {},
|
||||
"0-Dep. ac. de herramientas mayores": {},
|
||||
"0-Dep. ac. de maquinaria y equipo de edificios": {},
|
||||
"0-Dep. ac. de mobiliario y equipo de oficina": {},
|
||||
"0-Dep. ac. de veh\u00edculos": {}
|
||||
},
|
||||
"0-Dep. ac. de edificios": {
|
||||
"0-Dep. ac. de edificios \u2013 Revaluaciones": {
|
||||
"0-Edificio 1": {}
|
||||
},
|
||||
"0-Dep. ac. de edificios \u2013 Valores originales": {
|
||||
"0-Edificio 1": {}
|
||||
}
|
||||
},
|
||||
"0-Dep. ac. de mejoras a edificios": {
|
||||
"0-Dep. ac. de mejoras a edificios \u2013 Revaluaciones": {
|
||||
"0-Edificio 1": {}
|
||||
},
|
||||
"0-Dep. ac. de mejoras a edificios \u2013 Valores originales": {
|
||||
"0-Edificio 1": {}
|
||||
}
|
||||
}
|
||||
},
|
||||
"0-Otros activos": {
|
||||
"0-Dep\u00f3sitos de garant\u00eda": {
|
||||
"0-Dep\u00f3sitos sobre conexiones de Internet": {},
|
||||
"0-Dep\u00f3sitos sobre derechos telef\u00f3nicos": {},
|
||||
"0-Dep\u00f3sitos sobre locales en alquiler": {}
|
||||
},
|
||||
"0-Gastos pagados por anticipado": {
|
||||
"0-P\u00f3lizas de seguros prepagadas": {}
|
||||
}
|
||||
},
|
||||
"root_type": "Asset"
|
||||
},
|
||||
"0-Gastos": {
|
||||
"0-Gastos no deducibles": {
|
||||
"0-Diferencial cambiario": {},
|
||||
"0-Donaciones no deducibles": {},
|
||||
"0-Gastos de presidencia": {},
|
||||
"0-Multas": {}
|
||||
},
|
||||
"0-Gastos principales": {
|
||||
"0-Gastos administrativos": {
|
||||
"0-Alquiler": {
|
||||
"0-Oficina 1": {}
|
||||
},
|
||||
"0-Cuota por administraci\u00f3n": {
|
||||
"0-Compa\u00f1\u00eda administradora 1": {}
|
||||
},
|
||||
"0-Equipo de c\u00f3mputo y comunicaci\u00f3n": {
|
||||
"0-Departamento 1": {}
|
||||
},
|
||||
"0-Servicios p\u00fablicos": {
|
||||
"0-Agua": {
|
||||
"0-Medidor 1": {}
|
||||
},
|
||||
"0-Internet": {
|
||||
"0-Contrato 1": {}
|
||||
},
|
||||
"0-Luz": {
|
||||
"0-Medidor 1": {}
|
||||
},
|
||||
"0-Tel\u00e9fono": {
|
||||
"0-Tel\u00e9fono 1": {}
|
||||
}
|
||||
},
|
||||
"0-Suministros de oficina": {
|
||||
"0-Departamento 1": {}
|
||||
}
|
||||
},
|
||||
"0-Gastos operativos": {
|
||||
"0-Costo de venta de producto": {
|
||||
"0-Costo de almacenamiento": {},
|
||||
"0-Costo de distribuci\u00f3n": {},
|
||||
"0-Costo de materia prima": {},
|
||||
"0-Costo de producci\u00f3n": {},
|
||||
"0-Costo de producto": {}
|
||||
},
|
||||
"0-Gastos de mercadeo": {
|
||||
"0-Campa\u00f1as publicitarias": {},
|
||||
"0-Dise\u00f1o de imagen": {}
|
||||
},
|
||||
"0-Gastos de personal": {
|
||||
"0-Salarios y deducciones": {
|
||||
"0-Aguinaldo": {},
|
||||
"0-Bonificaciones": {},
|
||||
"0-Cargas patronales": {},
|
||||
"0-Cesant\u00eda": {},
|
||||
"0-Comisiones": {},
|
||||
"0-Extras": {},
|
||||
"0-Preaviso": {},
|
||||
"0-Salarios": {}
|
||||
},
|
||||
"0-Vi\u00e1ticos": {
|
||||
"0-Alimentaci\u00f3n": {},
|
||||
"0-Hospedaje": {},
|
||||
"0-Transporte": {}
|
||||
}
|
||||
},
|
||||
"0-Servicios profesionales": {
|
||||
"0-Categor\u00eda 1": {}
|
||||
}
|
||||
}
|
||||
},
|
||||
"0-Otros gastos": {
|
||||
"0-Ajustes": {},
|
||||
"0-Depreciaci\u00f3n de activo fijo": {},
|
||||
"0-Donaciones deducibles": {},
|
||||
"0-Gastos Financieros": {},
|
||||
"0-Perdida por robo": {}
|
||||
},
|
||||
"root_type": "Expense"
|
||||
},
|
||||
"0-Ingresos": {
|
||||
"0-Ingresos financieros": {
|
||||
"0-Intereses ganados sobre cuentas corrientes": {}
|
||||
},
|
||||
"0-Ingresos no gravables": {
|
||||
"0-Diferencial cambiario": {}
|
||||
},
|
||||
"0-Ingresos por administraci\u00f3n": {
|
||||
"0-Cuota por administraci\u00f3n": {}
|
||||
},
|
||||
"0-Ingresos por ventas": {},
|
||||
"0-Otros ingresos": {
|
||||
"0-Ajustes": {},
|
||||
"0-Donaciones": {}
|
||||
},
|
||||
"root_type": "Income"
|
||||
},
|
||||
"0-Pasivo": {
|
||||
"0-Pasivo circulante": {
|
||||
"0-Cuentas por pagar": {
|
||||
"0-Cuentas por pagar a compa\u00f1\u00edas relacionadas": {},
|
||||
"0-Cuentas por pagar a empleados": {},
|
||||
"0-Cuentas por pagar a proveedores": {},
|
||||
"0-Cuentas por pagar de provisiones": {}
|
||||
},
|
||||
"0-Impuestos": {
|
||||
"0-Impuesto de renta": {
|
||||
"0-Adelantos de impuesto de renta": {},
|
||||
"0-Impuesto de renta por pagar": {},
|
||||
"0-Retenciones de impuesto de renta": {}
|
||||
},
|
||||
"0-Impuesto de ventas": {
|
||||
"0-Impuesto de ventas pagado": {},
|
||||
"0-Impuesto de ventas por pagar": {}
|
||||
}
|
||||
}
|
||||
},
|
||||
"root_type": "Liability"
|
||||
},
|
||||
"0-Patrimonio": {
|
||||
"0-Aportes de capital": {
|
||||
"0-Socio 1": {}
|
||||
},
|
||||
"0-Balance inicial": {
|
||||
"0-Balance inicial": {}
|
||||
},
|
||||
"0-Capital social": {
|
||||
"0-Socio 1": {}
|
||||
},
|
||||
"0-Cuentas de super\u00e1vit": {
|
||||
"0-Superavit ganado": {},
|
||||
"0-Superavit por revaluaci\u00f3n de activos": {},
|
||||
"0-Super\u00e1vit de capital": {}
|
||||
},
|
||||
"0-Otras reservas": {
|
||||
"0-Reserva para mejoras": {},
|
||||
"0-Reserva para proyectos": {}
|
||||
},
|
||||
"0-Reserva legal": {
|
||||
"0-Reserva legal": {}
|
||||
},
|
||||
"0-Utilidad o p\u00e9rdida acumulada de periodos anteriores": {
|
||||
"0-Periodo 1": {}
|
||||
},
|
||||
"0-Utilidad o p\u00e9rdida del per\u00edodo actual": {
|
||||
"0-Utilidad o p\u00e9rdida del per\u00edodo actual": {}
|
||||
},
|
||||
"root_type": "Asset"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,266 +0,0 @@
|
||||
{
|
||||
"country_code": "cr",
|
||||
"name": "Costa Rica - Chart of Accounts 2",
|
||||
"tree": {
|
||||
"xActivo": {
|
||||
"root_type": "Asset",
|
||||
"xActivo circulante": {
|
||||
"xActivo circulante disponible": {
|
||||
"xBancos": {},
|
||||
"xFondos de caja": {
|
||||
"xFondos de caja CRC": {
|
||||
"xFondo de caja oficinas centrales CRC": {}
|
||||
},
|
||||
"xFondos de caja USD": {
|
||||
"xFondo de caja oficinas centrales USD": {}
|
||||
}
|
||||
},
|
||||
"xFondos en tr\u00e1nsito": {
|
||||
"xFondos en tr\u00e1nsito de PayPal a Bancos": {},
|
||||
"xFondos en tr\u00e1nsito en bancos": {},
|
||||
"xFondos en tr\u00e1nsito en tesorer\u00eda": {}
|
||||
},
|
||||
"xInversiones a la vista": {
|
||||
"xInversi\u00f3n 1": {}
|
||||
},
|
||||
"xPayPal": {
|
||||
"xCuenta PayPal 1": {}
|
||||
}
|
||||
},
|
||||
"xActivo circulante exigible": {
|
||||
"xCuentas por cobrar a compa\u00f1\u00edas relacionadas": {},
|
||||
"xCuentas por cobrar a empleados": {},
|
||||
"xCuentas por cobrar comerciales": {},
|
||||
"xInversiones de corto plazo": {},
|
||||
"xOtras cuentas por cobrar": {}
|
||||
},
|
||||
"xActivo circulante realizable": {
|
||||
"xInventarios": {
|
||||
"xInventario de consumibles": {},
|
||||
"xInventario de producto para la venta": {}
|
||||
}
|
||||
}
|
||||
},
|
||||
"xActivo fijo": {
|
||||
"xActivo fijo depreciable": {
|
||||
"xActivos depreciables m\u00f3viles": {
|
||||
"xEquipo de c\u00f3mputo": {},
|
||||
"xHerramientas mayores": {},
|
||||
"xMaquinaria y equipo de edificios": {},
|
||||
"xMoibliario y equipo de oficina": {},
|
||||
"xVeh\u00edculos": {}
|
||||
},
|
||||
"xEdificios": {
|
||||
"xEdificios \u2013 Revaluaciones": {
|
||||
"xEdificio 1": {}
|
||||
},
|
||||
"xEdificios \u2013 Valores originales": {
|
||||
"xEdificio 1": {}
|
||||
}
|
||||
},
|
||||
"xMejoras a edificios": {
|
||||
"xMejoras a edificios \u2013 Revaluaciones": {
|
||||
"xEdificio 1": {}
|
||||
},
|
||||
"xMejoras a edificios \u2013 Valores originales": {
|
||||
"xEdificio 1": {}
|
||||
}
|
||||
}
|
||||
},
|
||||
"xActivo fijo no depreciable": {
|
||||
"xTerrenos": {
|
||||
"xRevaluaciones": {
|
||||
"xTerreno 1": {}
|
||||
},
|
||||
"xValores originales": {
|
||||
"xTerreno 1": {}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"xDepreciaciones acumuladas sobre activo fijo depreciable": {
|
||||
"xDep. ac. de activos depreciables m\u00f3viles": {
|
||||
"xDep. ac. de equipo de c\u00f3mputo": {},
|
||||
"xDep. ac. de herramientas mayores": {},
|
||||
"xDep. ac. de maquinaria y equipo de edificios": {},
|
||||
"xDep. ac. de mobiliario y equipo de oficina": {},
|
||||
"xDep. ac. de veh\u00edculos": {}
|
||||
},
|
||||
"xDep. ac. de edificios": {
|
||||
"xDep. ac. de edificios \u2013 Revaluaciones": {
|
||||
"xEdificio 1": {}
|
||||
},
|
||||
"xDep. ac. de edificios \u2013 Valores originales": {
|
||||
"xEdificio 1": {}
|
||||
}
|
||||
},
|
||||
"xDep. ac. de mejoras a edificios": {
|
||||
"xDep. ac. de mejoras a edificios \u2013 Revaluaciones": {
|
||||
"xEdificio 1": {}
|
||||
},
|
||||
"xDep. ac. de mejoras a edificios \u2013 Valores originales": {
|
||||
"xEdificio 1": {}
|
||||
}
|
||||
}
|
||||
},
|
||||
"xOtros activos": {
|
||||
"xDep\u00f3sitos de garant\u00eda": {
|
||||
"xDep\u00f3sitos sobre conexiones de Internet": {},
|
||||
"xDep\u00f3sitos sobre derechos telef\u00f3nicos": {},
|
||||
"xDep\u00f3sitos sobre locales en alquiler": {}
|
||||
},
|
||||
"xGastos pagados por anticipado": {
|
||||
"xP\u00f3lizas de seguros prepagadas": {}
|
||||
}
|
||||
}
|
||||
},
|
||||
"xGastos": {
|
||||
"root_type": "Expense",
|
||||
"xGastos no deducibles": {
|
||||
"xDiferencial cambiario": {},
|
||||
"xDonaciones no deducibles": {},
|
||||
"xGastos de presidencia": {},
|
||||
"xMultas": {}
|
||||
},
|
||||
"xGastos principales": {
|
||||
"xGastos administrativos": {
|
||||
"xAlquiler": {
|
||||
"xOficina 1": {}
|
||||
},
|
||||
"xCuota por administraci\u00f3n": {
|
||||
"xCompa\u00f1\u00eda administradora 1": {}
|
||||
},
|
||||
"xEquipo de c\u00f3mputo y comunicaci\u00f3n": {
|
||||
"xDepartamento 1": {}
|
||||
},
|
||||
"xServicios p\u00fablicos": {
|
||||
"xAgua": {
|
||||
"xMedidor 1": {}
|
||||
},
|
||||
"xInternet": {
|
||||
"xContrato 1": {}
|
||||
},
|
||||
"xLuz": {
|
||||
"xMedidor 1": {}
|
||||
},
|
||||
"xTel\u00e9fono": {
|
||||
"xTel\u00e9fono 1": {}
|
||||
}
|
||||
},
|
||||
"xSuministros de oficina": {
|
||||
"xDepartamento 1": {}
|
||||
}
|
||||
},
|
||||
"xGastos operativos": {
|
||||
"xCosto de venta de producto": {
|
||||
"xCosto de almacenamiento": {},
|
||||
"xCosto de distribuci\u00f3n": {},
|
||||
"xCosto de materia prima": {},
|
||||
"xCosto de producci\u00f3n": {},
|
||||
"xCosto de producto": {}
|
||||
},
|
||||
"xGastos de mercadeo": {
|
||||
"xCampa\u00f1as publicitarias": {},
|
||||
"xDise\u00f1o de imagen": {}
|
||||
},
|
||||
"xGastos de personal": {
|
||||
"xSalarios y deducciones": {
|
||||
"xAguinaldo": {},
|
||||
"xBonificaciones": {},
|
||||
"xCargas patronales": {},
|
||||
"xCesant\u00eda": {},
|
||||
"xComisiones": {},
|
||||
"xExtras": {},
|
||||
"xPreaviso": {},
|
||||
"xSalarios": {}
|
||||
},
|
||||
"xVi\u00e1ticos": {
|
||||
"xAlimentaci\u00f3n": {},
|
||||
"xHospedaje": {},
|
||||
"xTransporte": {}
|
||||
}
|
||||
},
|
||||
"xServicios profesionales": {
|
||||
"xCategor\u00eda 1": {}
|
||||
}
|
||||
}
|
||||
},
|
||||
"xOtros gastos": {
|
||||
"xAjustes": {},
|
||||
"xDepreciaci\u00f3n de activo fijo": {},
|
||||
"xDonaciones deducibles": {},
|
||||
"xGastos Financieros": {},
|
||||
"xPerdida por robo": {}
|
||||
}
|
||||
},
|
||||
"xIngresos": {
|
||||
"root_type": "Income",
|
||||
"xIngresos financieros": {
|
||||
"xIntereses ganados sobre cuentas corrientes": {}
|
||||
},
|
||||
"xIngresos no gravables": {
|
||||
"xDiferencial cambiario": {}
|
||||
},
|
||||
"xIngresos por administraci\u00f3n": {
|
||||
"xCuota por administraci\u00f3n": {}
|
||||
},
|
||||
"xIngresos por ventas": {},
|
||||
"xOtros ingresos": {
|
||||
"xAjustes": {},
|
||||
"xDonaciones": {}
|
||||
}
|
||||
},
|
||||
"xPasivo": {
|
||||
"root_type": "Liability",
|
||||
"xPasivo circulante": {
|
||||
"xCuentas por pagar": {
|
||||
"xCuentas por pagar a compa\u00f1\u00edas relacionadas": {},
|
||||
"xCuentas por pagar a empleados": {},
|
||||
"xCuentas por pagar a proveedores": {},
|
||||
"xCuentas por pagar de provisiones": {}
|
||||
},
|
||||
"xImpuestos": {
|
||||
"xImpuesto de renta": {
|
||||
"xAdelantos de impuesto de renta": {},
|
||||
"xImpuesto de renta por pagar": {},
|
||||
"xRetenciones de impuesto de renta": {}
|
||||
},
|
||||
"xImpuesto de ventas": {
|
||||
"xImpuesto de ventas pagado": {},
|
||||
"xImpuesto de ventas por pagar": {}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"xPatrimonio": {
|
||||
"root_type": "Asset",
|
||||
"xAportes de capital": {
|
||||
"xSocio 1": {}
|
||||
},
|
||||
"xBalance inicial": {
|
||||
"xBalance inicial": {}
|
||||
},
|
||||
"xCapital social": {
|
||||
"xSocio 1": {}
|
||||
},
|
||||
"xCuentas de super\u00e1vit": {
|
||||
"xSuperavit ganado": {},
|
||||
"xSuperavit por revaluaci\u00f3n de activos": {},
|
||||
"xSuper\u00e1vit de capital": {}
|
||||
},
|
||||
"xOtras reservas": {
|
||||
"xReserva para mejoras": {},
|
||||
"xReserva para proyectos": {}
|
||||
},
|
||||
"xReserva legal": {
|
||||
"xReserva legal": {}
|
||||
},
|
||||
"xUtilidad o p\u00e9rdida acumulada de periodos anteriores": {
|
||||
"xPeriodo 1": {}
|
||||
},
|
||||
"xUtilidad o p\u00e9rdida del per\u00edodo actual": {
|
||||
"xUtilidad o p\u00e9rdida del per\u00edodo actual": {}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,653 +0,0 @@
|
||||
{
|
||||
"country_code": "ec",
|
||||
"name": "Ecuador - Chart of Accounts",
|
||||
"tree": {
|
||||
"ACTIVO CORRIENTE ": {
|
||||
"ACTIVO DISPONIBLE": {
|
||||
"Banco Central del Ecuador": {
|
||||
"Cta. Cte. Moneda de curso legal": {},
|
||||
"Cta. Cte. Otras monedas": {}
|
||||
},
|
||||
"Caja": {
|
||||
"Fondos rotativos": {},
|
||||
"Moneda de curso legal": {},
|
||||
"Otras monedas": {}
|
||||
},
|
||||
"Instituciones financieras": {},
|
||||
"Otras Instituciones Financieras": {
|
||||
"Cta Ahorros En el exterior": {},
|
||||
"Cta. Ahorros Moneda de curso legal": {},
|
||||
"Cta. Cte. En el exterior": {},
|
||||
"Cta. Cte. Moneda de curso legal": {}
|
||||
}
|
||||
},
|
||||
"root_type": ""
|
||||
},
|
||||
"ACTIVOS BIOLOGICOS": {
|
||||
"Animales vivos": {
|
||||
"En desarrollo": {},
|
||||
"En producci\u00f3n": {}
|
||||
},
|
||||
"PROVISI\u00d3N POR DETERIORO DE ACTIVOS BIOL\u00d3GICOS": {},
|
||||
"Plantas en crecimiento": {
|
||||
"En desarrollo": {},
|
||||
"En producci\u00f3n": {}
|
||||
},
|
||||
"root_type": ""
|
||||
},
|
||||
"ACTIVOS FINANCIEROS": {
|
||||
"A VALOR RAZONABLE CON CAMBIOS EN RESULTADOS": {
|
||||
"Derivados": {
|
||||
"Forward": {},
|
||||
"Futuros": {},
|
||||
"Inversiones en el exterior": {},
|
||||
"Opciones": {},
|
||||
"Otros": {}
|
||||
},
|
||||
"Renta Fija": {
|
||||
"Avales": {},
|
||||
"Bonos de Prenda": {},
|
||||
"Bonos del Estado": {},
|
||||
"Certificados Financieros": {},
|
||||
"Certificados de Dep\u00f3sito": {},
|
||||
"Certificados de Inversi\u00f3n": {},
|
||||
"Certificados de Tesorer\u00eda": {},
|
||||
"Cupones": {},
|
||||
"C\u00e9dulas Hipotecarias": {},
|
||||
"Dep\u00f3sitos a Plazo": {},
|
||||
"Facturas Comerciales Negociables": {},
|
||||
"Letras de Cambio": {},
|
||||
"Notas de Cr\u00e9dito": {},
|
||||
"Obligaciones": {},
|
||||
"Obligaciones Convertibles en acciones": {},
|
||||
"Otros": {},
|
||||
"Overnights": {},
|
||||
"Pagar\u00e9s": {},
|
||||
"Papel Comercial": {},
|
||||
"P\u00f3lizas de Acumulaci\u00f3n": {},
|
||||
"T\u00edtulos del Banco Central ": {},
|
||||
"Valores de Titularizaci\u00f3n": {}
|
||||
},
|
||||
"Renta variable": {
|
||||
"Acciones y participaciones": {},
|
||||
"Cuotas de fondos colectivos": {},
|
||||
"Otros ": {},
|
||||
"Valores de titularizaci\u00f3n de participaci\u00f3n": {}
|
||||
}
|
||||
},
|
||||
"DISPONIBLES PARA LA VENTA": {
|
||||
"Renta Fija": {
|
||||
"Avales": {},
|
||||
"Bonos de Prenda": {},
|
||||
"Bonos del Estado": {},
|
||||
"Certificados Financieros": {},
|
||||
"Certificados de Dep\u00f3sito": {},
|
||||
"Certificados de Inversi\u00f3n": {},
|
||||
"Certificados de Tesorer\u00eda": {},
|
||||
"Cupones": {},
|
||||
"C\u00e9dulas Hipotecarias": {},
|
||||
"Dep\u00f3sitos a Plazo": {},
|
||||
"Facturas Comerciales Negociables": {},
|
||||
"Inversiones en el exterior": {},
|
||||
"Letras de Cambio": {},
|
||||
"Notas de Cr\u00e9dito": {},
|
||||
"Obligaciones": {},
|
||||
"Obligaciones Convertibles en acciones": {},
|
||||
"Otros": {},
|
||||
"Overnights": {},
|
||||
"Pagar\u00e9s": {},
|
||||
"Papel Comercial": {},
|
||||
"P\u00f3lizas de Acumulaci\u00f3n": {},
|
||||
"T\u00edtulos del Banco Central ": {},
|
||||
"Valores de Titularizaci\u00f3n": {}
|
||||
},
|
||||
"Renta variable": {
|
||||
"Acciones y participaciones": {},
|
||||
"Cuotas de fondos colectivos": {},
|
||||
"Inversiones en el exterior": {},
|
||||
"Otros ": {},
|
||||
"Unidades de participaci\u00f3n": {},
|
||||
"Valores de titularizaci\u00f3n de participaci\u00f3n": {}
|
||||
}
|
||||
},
|
||||
"INVERSIONES MANTENIDAS HASTA EL VENCIMIENTO ": {
|
||||
"Acciones y participaciones": {
|
||||
"Acciones y participaciones": {}
|
||||
},
|
||||
"Otros": {
|
||||
"Inversiones en el exterior": {}
|
||||
},
|
||||
"Renta Fija": {
|
||||
"Avales": {},
|
||||
"Bonos de Prenda": {},
|
||||
"Bonos del Estado": {},
|
||||
"Certificados Financieros": {},
|
||||
"Certificados de Dep\u00f3sito": {},
|
||||
"Certificados de Inversi\u00f3n": {},
|
||||
"Certificados de Tesorer\u00eda": {},
|
||||
"Cupones": {},
|
||||
"C\u00e9dulas Hipotecarias": {},
|
||||
"Dep\u00f3sitos a Plazo": {},
|
||||
"Facturas Comerciales Negociables": {},
|
||||
"Letras de Cambio": {},
|
||||
"Notas de Cr\u00e9dito": {},
|
||||
"Obligaciones": {},
|
||||
"Obligaciones Convertibles en acciones": {},
|
||||
"Overnights": {},
|
||||
"Pagar\u00e9s": {},
|
||||
"Papel Comercial": {},
|
||||
"P\u00f3lizas de Acumulaci\u00f3n": {},
|
||||
"T\u00edtulos del Banco Central ": {},
|
||||
"Valores de Titularizaci\u00f3n": {}
|
||||
}
|
||||
},
|
||||
"PRESTAMOS Y PARTIDAS A COBRAR ": {
|
||||
"Cuentas y Documentos a cobrar a terceros": {
|
||||
"Cuentas por cobrar a terceros": {},
|
||||
"Cuentas por cobrar accionistas": {},
|
||||
"Cuentas por cobrar al originador": {},
|
||||
"Otros": {}
|
||||
}
|
||||
},
|
||||
"PROVISI\u00d3N POR DETERIORO DE ACTIVOS FINANCIEROS": {
|
||||
"Inversiones mantenidas hasta el vencimiento ": {},
|
||||
"Pr\u00e9stamos y partidas a cobrar": {}
|
||||
},
|
||||
"root_type": ""
|
||||
},
|
||||
"ACTIVOS NO CORRIENTES": {
|
||||
"ACTIVOS ADQUIRIDOS EN ARRENDAMIENTO FINANCIERO": {},
|
||||
"CONSTRUCCIONES EN CURSO ": {},
|
||||
"INTANGIBLES": {
|
||||
"Concesiones": {},
|
||||
"Costos de exploraci\u00f3n y desarrollo": {},
|
||||
"Licencias": {},
|
||||
"Patentes y propiedad industrial": {},
|
||||
"Programas de computaci\u00f3n": {},
|
||||
"Reservas de recursos extra\u00edbles": {}
|
||||
},
|
||||
"PLUSVAL\u00cdA MERCANTIL (Goodwill)": {},
|
||||
"PROPIEDADES": {
|
||||
"Edificios": {},
|
||||
"Equipo de Computaci\u00f3n ": {},
|
||||
"Maquinaria y Equipo": {},
|
||||
"Muebles y enseres ": {},
|
||||
"Terrenos": {},
|
||||
"Veh\u00edculos": {}
|
||||
},
|
||||
"PROPIEDADES DE INVERSI\u00d3N": {},
|
||||
"PROVISI\u00d3N POR DETERIORO DE ACTIVOS NO CORRIENTES": {
|
||||
"Intangibles": {},
|
||||
"Plusval\u00eda mercantil (Goodwill) ": {},
|
||||
"Propiedades": {},
|
||||
"Propiedades de inversi\u00f3n ": {}
|
||||
},
|
||||
"root_type": ""
|
||||
},
|
||||
"CUENTAS CONTINGENTES": {
|
||||
"ACREEDORAS": {
|
||||
"Garant\u00edas": {},
|
||||
"Garant\u00edas en titularizaci\u00f3n": {}
|
||||
},
|
||||
"DEUDORAS": {
|
||||
"Garant\u00edas ": {},
|
||||
"Garant\u00edas en titularizaci\u00f3n": {}
|
||||
},
|
||||
"root_type": ""
|
||||
},
|
||||
"CUENTAS DE ORDEN": {
|
||||
"ACREEDORAS": {
|
||||
"ADMINISTRACION DE RECURSOS DE TERCEROS": {
|
||||
"Administraci\u00f3n de portafolio ": {
|
||||
"Intereses": {},
|
||||
"Principal": {}
|
||||
},
|
||||
"Intermediaci\u00f3n de valores": {},
|
||||
"Patrimonio de Fondos de Inversi\u00f3n": {
|
||||
"Fondos Administrados": {
|
||||
"Intereses": {},
|
||||
"Principal": {}
|
||||
},
|
||||
"Fondos Colectivos": {
|
||||
"Intereses": {},
|
||||
"Principal": {}
|
||||
}
|
||||
},
|
||||
"Patrimonio de Negocios Fiduciarios": {
|
||||
"Encargos fiduciarios inscritos": {
|
||||
"Administraci\u00f3n": {},
|
||||
"Garant\u00eda": {},
|
||||
"Inmobiliario": {},
|
||||
"Inversi\u00f3n": {}
|
||||
},
|
||||
"Encargos fiduciarios no inscritos": {
|
||||
"Administraci\u00f3n": {},
|
||||
"Garant\u00eda": {},
|
||||
"Inmobiliario": {},
|
||||
"Inversi\u00f3n": {}
|
||||
},
|
||||
"Fideicomisos mercantiles inscritos": {
|
||||
"Administraci\u00f3n": {},
|
||||
"Garant\u00eda": {},
|
||||
"Inmobiliario": {},
|
||||
"Inversi\u00f3n": {},
|
||||
"Titularizaci\u00f3n": {}
|
||||
},
|
||||
"Fideicomisos mercantiles no inscritos": {
|
||||
"Administraci\u00f3n": {},
|
||||
"Garant\u00eda": {},
|
||||
"Inmobiliario": {},
|
||||
"Inversi\u00f3n": {}
|
||||
}
|
||||
}
|
||||
},
|
||||
"VALORES Y BIENES RECIBIDOS DE TERCEROS": {
|
||||
"En Custodia": {
|
||||
"Depositos en efectivo": {},
|
||||
"T\u00edtulos de Renta Fija": {},
|
||||
"T\u00edtulos de Renta Variable": {}
|
||||
},
|
||||
"En Garant\u00eda": {
|
||||
"Depositos en efectivo": {},
|
||||
"T\u00edtulos de Renta Fija": {},
|
||||
"T\u00edtulos de Renta Variable": {}
|
||||
}
|
||||
}
|
||||
},
|
||||
"ACREEDORES POR CONTRA": {
|
||||
"Acreedores por contra": {}
|
||||
},
|
||||
"DEUDORAS": {
|
||||
"COLATERALES DE LAS OPERACIONES DE REPORTO BURSATIL": {
|
||||
"Colaterales de las operaciones de reporto burs\u00e1til": {}
|
||||
},
|
||||
"EMISIONES NO COLOCADAS": {
|
||||
"Emisiones no colocadas ": {}
|
||||
},
|
||||
"OTRAS CUENTAS DE ORDEN DEUDORAS": {
|
||||
"Derechos sobre instrumentos financieros derivados": {}
|
||||
},
|
||||
"VALORES Y BIENES PROPIOS EN PODER DE TERCEROS": {
|
||||
"Bienes en garant\u00eda": {},
|
||||
"Valores en garant\u00eda": {}
|
||||
}
|
||||
},
|
||||
"DEUDORES POR CONTRA": {},
|
||||
"root_type": ""
|
||||
},
|
||||
"CUENTAS DE RESULTADOS ACREEDORAS": {
|
||||
"COMISIONES GANADAS": {
|
||||
"CUSTODIA REGISTRO\n COMPENSACI\u00d3N Y LIQUIDACI\u00d3N": {
|
||||
"Compensaci\u00f3n y liquidaci\u00f3n de valores": {},
|
||||
"Otros": {},
|
||||
"Valores desmaterializados": {},
|
||||
"Valores materializados": {}
|
||||
},
|
||||
"INTERMEDIACI\u00d3N DE VALORES": {
|
||||
"Operaciones Burs\u00e1tiles": {},
|
||||
"Operaciones Extraburs\u00e1tiles": {},
|
||||
"Por Contratos de Underwriting": {}
|
||||
},
|
||||
"OTRAS COMISIONES GANADAS": {},
|
||||
"POR PRESTACI\u00d3N DE SERVICIOS DE ADMINISTRACI\u00d3N Y MANEJO": {
|
||||
"Encargos Fiduciarios": {},
|
||||
"Fideicomisos mercantiles": {},
|
||||
"Fondos administrados": {},
|
||||
"Fondos colectivos": {},
|
||||
"Por representaci\u00f3n de obligacionistas": {},
|
||||
"Portafolio de terceros": {},
|
||||
"Titularizaci\u00f3n": {}
|
||||
},
|
||||
"SERVICIOS BURS\u00c1TILES": {
|
||||
"Comisiones en operaciones ": {},
|
||||
"Inscripciones": {},
|
||||
"Mantenimiento de Inscripci\u00f3n": {}
|
||||
}
|
||||
},
|
||||
"INGRESOS DE ACTIVOS POR IMPUESTOS DIFERIDOS": {
|
||||
"INGRESOS DE ACTIVOS POR IMPUESTOS DIFERIDOS": {}
|
||||
},
|
||||
"INGRESOS FINANCIEROS": {
|
||||
"DIVIDENDOS": {},
|
||||
"INTERESES Y RENDIMIENTOS": {},
|
||||
"UTILIDAD EN CAMBIO": {},
|
||||
"UTILIDAD POR VALUACI\u00d3N DE ACTIVOS FINANCIEROS A VALOR RAZONABLE": {}
|
||||
},
|
||||
"INGRESOS POR ASESOR\u00cdA Y ESTRUCTURACI\u00d3N": {
|
||||
"INGRESOS POR ASESORIA": {},
|
||||
"INGRESOS POR ESTRUCTURACI\u00d3N": {
|
||||
"Negocios Fiduciarios": {},
|
||||
"Oferta p\u00fablica de Valores": {},
|
||||
"Otros": {}
|
||||
}
|
||||
},
|
||||
"UTILIDAD POR ACTIVOS NO FINANCIEROS AL VALOR RAZONABLE": {
|
||||
"ACTIVOS BIOL\u00d3GICOS": {},
|
||||
"ACTIVOS NO CORRIENTES": {},
|
||||
"CUENTAS POR COBRAR": {},
|
||||
"OBLIGACIONES FINANCIERAS": {},
|
||||
"PROPIEDADES DE INVERSI\u00d3N": {}
|
||||
},
|
||||
"UTILIDADES EN VENTAS": {
|
||||
"OTRAS UTILIDADES EN VENTAS": {},
|
||||
"UTILIDAD EN VENTA DE PROPIEDAD": {},
|
||||
"UTILIDAD EN VENTA DE VALORES": {},
|
||||
"UTILIDAD POR OPERACIONES DESCONTINUADAS": {}
|
||||
},
|
||||
"root_type": ""
|
||||
},
|
||||
"CUENTAS DE RESULTADOS DEUDORAS": {
|
||||
"GASTOS ADMINISTRATIVOS": {
|
||||
"GASTOS DE PERSONAL": {
|
||||
"Beneficios sociales de los trabajadores": {},
|
||||
"Provisi\u00f3n para jubilaci\u00f3n patronal": {},
|
||||
"Remuneraciones": {}
|
||||
},
|
||||
"HONORARIOS": {
|
||||
"Honorarios": {}
|
||||
},
|
||||
"SERVICIOS DE TERCEROS ": {
|
||||
"Servicios de terceros": {}
|
||||
}
|
||||
},
|
||||
"GASTOS FINANCIEROS": {
|
||||
"ARRENDAMIENTO OPERATIVO": {
|
||||
"Arrendamiento operativo": {}
|
||||
},
|
||||
"COMISIONES PAGADAS": {
|
||||
"Intermediaci\u00f3n de Valores": {},
|
||||
"Operaciones Burs\u00e1tiles": {},
|
||||
"Operaciones Extraburs\u00e1tlies": {},
|
||||
"Por Contratos de Underwriting": {}
|
||||
},
|
||||
"CUSTODIA REGISTRO COMPENSACI\u00d3N Y LIQUIDACI\u00d3N \n ": {
|
||||
"Compensaci\u00f3n y Liquidaci\u00f3n de Valores": {},
|
||||
"Valores Desmaterializados": {},
|
||||
"Valores Materializados": {}
|
||||
},
|
||||
"DETERIORO DE ACTIVOS FINANCIEROS": {
|
||||
"Deterioro de activos financieros": {}
|
||||
},
|
||||
"GASTOS POR ESTRUCTURACI\u00d3N": {
|
||||
"Negocios Fiduciarios": {},
|
||||
"Oferta P\u00fablica de Valores": {},
|
||||
"Otros": {}
|
||||
},
|
||||
"INTERESES CAUSADOS": {
|
||||
"Intereses por cr\u00e9ditos de bancos y otras Instituciones financieras": {},
|
||||
"Intereses por otros pasivos no financieros": {}
|
||||
},
|
||||
"OTRAS COMISIONES PAGADAS ": {
|
||||
"Otras Comisiones Pagadas": {}
|
||||
},
|
||||
"POR SERVICIOS DE ADMINISTRACI\u00d3N Y MANEJO": {
|
||||
"Administraci\u00f3n de portafolio": {},
|
||||
"Encargos fiduciarios": {},
|
||||
"Fideicomisos mercantiles": {},
|
||||
"Fondos administrados": {},
|
||||
"Fondos colectivos": {},
|
||||
"Otros": {},
|
||||
"Titularizaci\u00f3n": {}
|
||||
},
|
||||
"P\u00c9RDIDA EN CAMBIO": {
|
||||
"P\u00e9rdida en cambio": {}
|
||||
},
|
||||
"P\u00c9RDIDA EN VALUACI\u00d3N DE ACTIVOS FINANCIEROS": {
|
||||
"P\u00e9rdida en Valuaci\u00f3n de activos financieros": {}
|
||||
},
|
||||
"P\u00c9RDIDAS EN VENTA": {
|
||||
"P\u00e9rdida en venta activos biol\u00f2gicos": {},
|
||||
"P\u00e9rdida en venta de Propiedad ": {},
|
||||
"P\u00e9rdida en venta de Valores": {},
|
||||
"P\u00e9rdida por operaciones descontinuadas": {}
|
||||
}
|
||||
},
|
||||
"GASTOS GENERALES": {
|
||||
"AMORTIZACIONES": {},
|
||||
"ARRENDAMIENTOS": {},
|
||||
"DEPRECIACI\u00d3N": {},
|
||||
"MATERIALES Y SUMINISTROS": {},
|
||||
"OTROS": {},
|
||||
"POR PUBLICIDAD": {},
|
||||
"PROVISIONES": {},
|
||||
"SEGUROS": {},
|
||||
"SERVICIOS Y MANTENIMIENTO": {}
|
||||
},
|
||||
"GASTOS POR DETERIORO": {
|
||||
"ACTIVOS BIOL\u00d3GICOS": {},
|
||||
"ACTIVOS DE EXPLORACI\u00d3N Y EVALUACI\u00d3N MINERA": {},
|
||||
"CUENTAS Y DOCUMENTOS POR COBRAR": {},
|
||||
"EXISTENCIAS": {},
|
||||
"PLUSVAL\u00cdA MERCANTIL (GOODWILL)": {},
|
||||
"PROPIEDADES PLANTA Y EQUIPO": {},
|
||||
"PROPIEDADES DE INVERSI\u00d3N": {}
|
||||
},
|
||||
"IMPUESTOS TASAS Y CONTRIBUCIONES": {},
|
||||
"P\u00c9RDIDA POR MEDICI\u00d3N DE ACTIVOS NO FINANCIEROS AL VALOR RAZONABLE": {
|
||||
"ACTIVOS BIOL\u00d3GICOS": {},
|
||||
"ACTIVOS NO CORRIENTES ": {},
|
||||
"COSTO ": {},
|
||||
"COSTO DE PRODUCCI\u00d3N ": {},
|
||||
"COSTO DE VENTAS": {},
|
||||
"CUENTAS POR COBRAR": {},
|
||||
"FISCALES": {},
|
||||
"MUNICIPALES": {},
|
||||
"OBLIGACIONES FINANCIERAS": {},
|
||||
"ORGANISMOS DE CONTROL": {},
|
||||
"OTROS": {},
|
||||
"OTROS GASTOS": {},
|
||||
"PRIMA POR OPERACIONES DE REPORTO": {},
|
||||
"PROPIEDADES DE INVERSI\u00d3N": {}
|
||||
},
|
||||
"root_type": ""
|
||||
},
|
||||
"CUENTAS Y DOCUMENTOS POR COBRAR": {
|
||||
"ANTICIPO A CONSTRUCTOR POR AVANCE DE OBRA": {},
|
||||
"ANTICIPO COMITENTES": {},
|
||||
"COMISIONES POR COBRAR": {
|
||||
"Asesor\u00eda": {},
|
||||
"Intermediaci\u00f3n de valores": {
|
||||
"Contrato de Underwriting": {},
|
||||
"Operaciones Burs\u00e1tiles": {},
|
||||
"Operaciones Extraburs\u00e1tiles": {}
|
||||
},
|
||||
"Otras comisiones": {},
|
||||
"Por administraci\u00f3n y manejo": {
|
||||
"Por Manejo de Fideicomisos": {},
|
||||
"Por Contratos de Administraci\u00f3n Portafolio de Terceros": {},
|
||||
"Por Manejo de Encargos Fiduciarios": {},
|
||||
"Por Manejo de Fondos Administrados": {},
|
||||
"Por comisiones de administraci\u00f3n": {}
|
||||
},
|
||||
"Por Custodia y Conservaci\u00f3n de Valores": {
|
||||
"Por Manejo de Libro de Acciones y Accionistas": {},
|
||||
"Valores Desmaterializados": {},
|
||||
"Valores Materializados": {}
|
||||
},
|
||||
"Por servicios burs\u00e1tiles": {
|
||||
"Operaciones": {},
|
||||
"Puestos inactivos": {}
|
||||
}
|
||||
},
|
||||
"CUENTAS POR COBRAR": {
|
||||
"A Terceros": {},
|
||||
"Al Originador": {}
|
||||
},
|
||||
"DERECHOS POR COMPROMISO DE RECOMPRA": {},
|
||||
"DOCUMENTOS POR COBRAR": {
|
||||
"A Personal": {},
|
||||
"A Terceros": {},
|
||||
"Otros": {}
|
||||
},
|
||||
"OTROS": {},
|
||||
"PROVISIONES PARA CUENTAS POR COBRAR": {},
|
||||
"PROVISI\u00d3N POR DETERIORO DE CUENTAS POR COBRAR": {
|
||||
"Comisiones por cobrar ": {},
|
||||
"Cuentas por cobrar a terceros ": {}
|
||||
},
|
||||
"RENDIMIENTOS POR COBRAR": {
|
||||
"Dividendos": {},
|
||||
"Intereses ": {}
|
||||
},
|
||||
"root_type": ""
|
||||
},
|
||||
"DEUDORES POR INTERMEDIACION": {
|
||||
"root_type": ""
|
||||
},
|
||||
"EXISTENCIAS": {
|
||||
"MATERIA PRIMA": {},
|
||||
"MATERIALES Y SUMINISTROS": {},
|
||||
"PRODUCTOS EN PROCESO": {},
|
||||
"PRODUCTOS TERMINADOS": {},
|
||||
"PROVISI\u00d3N POR DETERIORO DE EXISTENCIAS": {},
|
||||
"root_type": ""
|
||||
},
|
||||
"OTROS ACTIVOS CORRIENTES": {
|
||||
"ACTIVO NO CORRIENTE DISPONIBLE PARA LA VENTA": {},
|
||||
"ACTIVO POR IMPUESTO CORRIENTE": {},
|
||||
"OTROS": {},
|
||||
"UNIDADES DE PARTICIPACION": {},
|
||||
"root_type": ""
|
||||
},
|
||||
"OTROS ACTIVOS NO CORRIENTES": {
|
||||
"ACTIVO POR IMPUESTO DIFERIDO": {
|
||||
"Activo por impuesto diferido ": {}
|
||||
},
|
||||
"ACTIVOS DE EXPLORACION Y EVALUACION MINERA": {},
|
||||
"AMORTIZACION ACUMULADA": {
|
||||
"Concesiones": {},
|
||||
"Licencias": {},
|
||||
"Otros": {}
|
||||
},
|
||||
"DEPRECIACION ACUMULADA": {
|
||||
"Activos adquiridos en arrendamiento financiero": {},
|
||||
"Activos de exploraci\u00f3n y evaluaci\u00f3n minera": {},
|
||||
"Edificios": {},
|
||||
"Equipo de Computaci\u00f3n ": {},
|
||||
"Maquinaria y Equipo": {},
|
||||
"Muebles y enseres ": {},
|
||||
"Propiedades de inversi\u00f3n": {},
|
||||
"Veh\u00edculos": {}
|
||||
},
|
||||
"DERECHOS FIDUCIARIOS": {},
|
||||
"OTROS ACTIVOS": {
|
||||
"Cuota patrimonial bolsa de valores": {
|
||||
"Acciones Dep\u00f3sito Centralizado de Valores": {},
|
||||
"Cuota patrimonial bolsa de valores": {}
|
||||
},
|
||||
"Dep\u00f3sitos en Garant\u00eda": {
|
||||
"Dep\u00f3sitos en Garant\u00eda por operaciones burs\u00e1tiles": {},
|
||||
"Dep\u00f3sitos en Garant\u00eda por reporto": {}
|
||||
}
|
||||
},
|
||||
"root_type": ""
|
||||
},
|
||||
"PASIVO": {
|
||||
"OTROS": {},
|
||||
"PASIVO CORRIENTE": {
|
||||
"ACREEDORES POR INTERMEDIACION ": {},
|
||||
"OBLIGACIONES PATRONALES": {
|
||||
"Aportes y descuentos al IESS": {},
|
||||
"Beneficios a empleados": {},
|
||||
"Fondo reserva del IESS": {},
|
||||
"Participaciones de los trabajadores en utilidades": {},
|
||||
"Provisi\u00f3n para jubilaci\u00f3n patronal": {},
|
||||
"Remuneraciones ": {}
|
||||
},
|
||||
"OBLIGACIONES TRIBUTARIAS": {
|
||||
"Contribuciones": {},
|
||||
"Impuestos": {},
|
||||
"Otros": {},
|
||||
"Retenciones": {}
|
||||
},
|
||||
"OTROS PASIVOS CORRIENTES": {},
|
||||
"PASIVO NO FINANCIERO": {
|
||||
"Deuda Sector No Financiero": {
|
||||
"Acreedores Varios": {},
|
||||
"Comisiones por pagar ": {},
|
||||
"Dividendos por pagar": {},
|
||||
"Intereses por pagar": {},
|
||||
"Otras comisiones": {},
|
||||
"Por Operaciones Burs\u00e1tiles": {},
|
||||
"Por administraci\u00f3n": {},
|
||||
"Por custodia": {},
|
||||
"Proveedores": {}
|
||||
}
|
||||
},
|
||||
"PASIVOS FINANCIEROS": {
|
||||
"A valor razonable con cambios en resultados": {
|
||||
"Obligaciones": {},
|
||||
"Obligaciones por Arrendamiento Financiero ": {},
|
||||
"Otras En el exterior": {},
|
||||
"Papel Comercial": {},
|
||||
"Valores": {},
|
||||
"Valores de Titularizaci\u00f3n": {}
|
||||
},
|
||||
"Cuentas y documentos por pagar": {
|
||||
"Anticipos recibidos": {},
|
||||
"Otras cuentas y documentos por pagar": {},
|
||||
"Pr\u00e9stamos": {}
|
||||
},
|
||||
"Obligaciones financieras": {
|
||||
"Intereses por pagar": {},
|
||||
"Obligaciones por contratos de underwriting": {},
|
||||
"Porci\u00f3n corriente de deuda a largo plazo": {},
|
||||
"Pr\u00e9stamos": {},
|
||||
"Sobregiros bancarios": {}
|
||||
},
|
||||
"Otros pasivos financieros": {},
|
||||
"Pasivos por compra de activos no corrientes": {},
|
||||
"Relacionadas": {
|
||||
"Accionistas": {},
|
||||
"Administradores": {},
|
||||
"Compa\u00f1\u00edas relacionadas / vinculadas": {}
|
||||
}
|
||||
},
|
||||
"SANCIONES Y MULTAS": {
|
||||
"Indemnizaciones": {},
|
||||
"Litigios": {},
|
||||
"Obligaciones Judiciales": {},
|
||||
"Otros": {}
|
||||
}
|
||||
},
|
||||
"PASIVO LARGO PLAZO": {
|
||||
"DEUDA SECTOR FINANCIERO": {}
|
||||
},
|
||||
"PASIVOS NO CORRIENTES": {
|
||||
"PASIVOS DIFERIDOS": {
|
||||
"Intereses diferidos": {},
|
||||
"Pasivos por impuestos diferidos": {}
|
||||
}
|
||||
},
|
||||
"root_type": ""
|
||||
},
|
||||
"PATRIMONIO NETO": {
|
||||
"APORTES PARA FUTURAS CAPITALIZACIONES": {},
|
||||
"CAPITAL": {
|
||||
"ACCIONES EN TESORER\u00cdA": {},
|
||||
"FONDO PATRIMONIAL": {},
|
||||
"PAGADO": {},
|
||||
"PATRIMONIO DE LOS FONDOS DE INVERSI\u00d3N": {
|
||||
"Patrimonio del fondo administrado": {},
|
||||
"Patrimonio del fondo colectivo": {}
|
||||
},
|
||||
"PATRIMONIO DE LOS NEGOCIOS FIDUCIARIOS": {}
|
||||
},
|
||||
"RESERVAS ": {
|
||||
"OTRAS RESERVAS": {},
|
||||
"RESERVA FACULTATIVA": {},
|
||||
"RESERVA LEGAL": {},
|
||||
"RESERVA POR VALUACI\u00d3N": {
|
||||
"Reserva por Valuaci\u00f3n Activos Financieros Disponibles para la Venta": {},
|
||||
"Reserva por valuaci\u00f3n Propiedades": {}
|
||||
}
|
||||
},
|
||||
"RESULTADOS": {
|
||||
"ACUMULADOS": {},
|
||||
"RESULTADOS ACUMULADOS POR APLICACI\u00d3N DE LAS NIIF POR PRIMERA VEZ": {},
|
||||
"UTILIDAD (PERDIDA) DEL EJERCICIO": {}
|
||||
},
|
||||
"root_type": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,184 +0,0 @@
|
||||
{
|
||||
"country_code": "et",
|
||||
"name": "Ethiopia - Chart of Accounts",
|
||||
"tree": {
|
||||
"ASSETS": {
|
||||
"Cash and Cash Equivalents": {
|
||||
"Cash at bank in foreigh currency": {},
|
||||
"Cash on hand and at bank": {},
|
||||
"Investments current assets": {},
|
||||
"Letter of Credit restricted account": {}
|
||||
},
|
||||
"Fixed Assets": {
|
||||
"Construction in Progress": {
|
||||
"Construction of buildings": {},
|
||||
"Construction of infrastructure": {}
|
||||
},
|
||||
"Property and Equipment": {
|
||||
"Aircraft, boats, etc": {},
|
||||
"Buildings": {},
|
||||
"Furnishings and fixtures": {},
|
||||
"Infrastructure": {},
|
||||
"Livestock and tansport animals": {},
|
||||
"Plant machinery and equipment": {},
|
||||
"Vehicles and other vehicular transport": {}
|
||||
}
|
||||
},
|
||||
"Goods in Transit": {},
|
||||
"Investments": {},
|
||||
"Long Term Loans": {},
|
||||
"Production Stock": {
|
||||
"Finished Goods": {},
|
||||
"Work in Progress": {}
|
||||
},
|
||||
"Receivables": {
|
||||
"Accounts Receivable": {
|
||||
"Advance to staff": {},
|
||||
"Cash Registers": {},
|
||||
"Cash shortage": {},
|
||||
"Suspense": {},
|
||||
"Trade Debtors": {},
|
||||
"VAT Receivable on Purchases": {},
|
||||
"VAT Withholding Receivable on Sales": {},
|
||||
"Withholding Receivable on Sales": {}
|
||||
},
|
||||
"Other Debtors": {},
|
||||
"Prepayments": {
|
||||
"Advance to consultant": {},
|
||||
"Advance to contractors": {},
|
||||
"Advance to supplier": {}
|
||||
}
|
||||
},
|
||||
"Stock": {},
|
||||
"root_type": "Asset"
|
||||
},
|
||||
"COST OF GOODS SOLD": {
|
||||
"Cost of Goods and Services": {},
|
||||
"Inventory Adjustments": {},
|
||||
"Other": {},
|
||||
"Purchase Returns and Allowances": {},
|
||||
"root_type": "Expense"
|
||||
},
|
||||
"EXPENSES": {
|
||||
"FIXED ASSETS AND CONSTRUCTION": {
|
||||
"Construction": {
|
||||
"Construction of buildings": {},
|
||||
"Construction of infrastructure": {},
|
||||
"Pre-construction activities": {}
|
||||
},
|
||||
"Fixed Assets": {
|
||||
"Depreciation of buildings, furnishings and fixtures": {},
|
||||
"Depreciation of livestock and transport animals": {},
|
||||
"Depreciation of plant, machinery and equipment": {},
|
||||
"Depreciation of vehicles and other vehicular transport": {}
|
||||
}
|
||||
},
|
||||
"GOODS AND SERVICES": {
|
||||
"Contracted Services": {
|
||||
"Advertising": {},
|
||||
"Contracted professional services": {},
|
||||
"Electricity charges": {},
|
||||
"Fees and charges": {},
|
||||
"Freight": {},
|
||||
"Insurance": {},
|
||||
"Rent": {},
|
||||
"Telecommunication charges": {},
|
||||
"Water and other utilities": {}
|
||||
},
|
||||
"Goods and Supplies": {
|
||||
"Agriculture, forestry and marine inputs": {},
|
||||
"Educational supplies": {},
|
||||
"Food": {},
|
||||
"Fuel and lubricants": {},
|
||||
"Medical supplies": {},
|
||||
"Miscellaneous equipment": {},
|
||||
"Office supplies": {},
|
||||
"Other material and supplies": {},
|
||||
"Printing": {},
|
||||
"Research and development supplies": {},
|
||||
"Uniforms, clothing, bedding": {},
|
||||
"Veterinary supplies and drugs": {}
|
||||
},
|
||||
"Maintenance and Repair Services": {
|
||||
"Maintenance and repair of buildings, furnishings and fixtures": {},
|
||||
"Maintenance and repair of infrastructure": {},
|
||||
"Maintenance and repair of plant, machinery, and equipment": {},
|
||||
"Maintenance and repair of vehicles and other transport": {}
|
||||
},
|
||||
"Training Services": {
|
||||
"External training": {},
|
||||
"Local training": {}
|
||||
},
|
||||
"Travelling and Official Entertainment Services": {
|
||||
"Official entertainment": {},
|
||||
"Per diem": {},
|
||||
"Transport fees": {}
|
||||
}
|
||||
},
|
||||
"OTHER PAYMENTS": {
|
||||
"Debt Payments": {
|
||||
"Payments of interest and bank charges on foreign debt": {},
|
||||
"Payments of interest and bank charges on local debt": {},
|
||||
"Payments on the principal of foreign debt": {},
|
||||
"Payments on the principal of local debt": {}
|
||||
}
|
||||
},
|
||||
"PERSONNEL SERVICES": {
|
||||
"Allowances/benefits": {
|
||||
"Allowances to contract staff": {},
|
||||
"Allowances to external contract staff": {},
|
||||
"Allowances to permanent staff": {}
|
||||
},
|
||||
"Compensation": {
|
||||
"Miscellaneous payments to staff": {},
|
||||
"Salaries to permanent staff": {},
|
||||
"Wages to casual staff": {},
|
||||
"Wages to contract staff": {},
|
||||
"Wages to external contract staff": {}
|
||||
},
|
||||
"Pension Contributions": {
|
||||
"Contribution to permanent staff pensions": {}
|
||||
}
|
||||
},
|
||||
"root_type": "Expense"
|
||||
},
|
||||
"LIABILITIES": {
|
||||
"Long-Term Debt": {
|
||||
"Foreign Loans": {
|
||||
"Commercial Loan": {}
|
||||
},
|
||||
"Local Loans": {
|
||||
"Commercial Loan": {}
|
||||
}
|
||||
},
|
||||
"Payables": {
|
||||
"Accounts Payable": {
|
||||
"Federal Income Tax": {},
|
||||
"Grace period payables": {},
|
||||
"Pension contribution payable": {},
|
||||
"Salary payable": {},
|
||||
"Trade Creditors": {},
|
||||
"VAT Payable": {},
|
||||
"Witholding Payable": {}
|
||||
},
|
||||
"Deposits": {
|
||||
"Other deposits": {}
|
||||
},
|
||||
"Retentions": {
|
||||
"Retention on contract": {}
|
||||
}
|
||||
},
|
||||
"root_type": "Liability"
|
||||
},
|
||||
"NET ASSETS/EQUITY": {
|
||||
"Profit and loss account": {},
|
||||
"Reserves": {},
|
||||
"Share capital / equity": {},
|
||||
"root_type": "Equity"
|
||||
},
|
||||
"REVENUE": {
|
||||
"Sales of Goods and Services": {},
|
||||
"root_type": "Income"
|
||||
}
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,133 +0,0 @@
|
||||
{
|
||||
"country_code": "hn",
|
||||
"name": "Honduras - Plantilla de cuentas de",
|
||||
"tree": {
|
||||
"Activo": {
|
||||
"Activo Corriente": {
|
||||
"Caja y Bancos": {
|
||||
"Caja Chica": {}
|
||||
},
|
||||
"Cuentas y Documentos por Cobrar": {
|
||||
"Cuentas por Cobrar Empresas Afilidas": {},
|
||||
"Cuentas por Cobrar Generales": {},
|
||||
"Otras Cuentas por Cobrar": {},
|
||||
"Prestamos al Personal": {}
|
||||
},
|
||||
"ISV por Cobrar": {
|
||||
"ISV por Cobrar": {},
|
||||
"Retenciones de ISV recibidas": {}
|
||||
},
|
||||
"Inventario": {}
|
||||
},
|
||||
"Diferido": {
|
||||
"Gastos Anticipados": {
|
||||
"Gastos Anticipados": {}
|
||||
},
|
||||
"Gastos de Organizaci\u00f3n": {
|
||||
"Gastos de Organizaci\u00f3n": {}
|
||||
},
|
||||
"Gastos por Amortizar": {
|
||||
"Gastos por Amortizar": {}
|
||||
},
|
||||
"Otros Activos": {
|
||||
"Otros Activos": {}
|
||||
}
|
||||
},
|
||||
"No Corriente": {
|
||||
"Depreciaciones Acumuladas": {
|
||||
"Depreciaciones Acumuladas": {}
|
||||
},
|
||||
"Propiedad, Planta y Equipo": {
|
||||
"Propiedad, Planta y Equipo": {}
|
||||
}
|
||||
},
|
||||
"root_type": "Asset"
|
||||
},
|
||||
"Pasivo": {
|
||||
"Cr\u00e9ditos Diferidos": {
|
||||
"Cr\u00e9ditos Diferidos": {
|
||||
"Anticipos": {}
|
||||
}
|
||||
},
|
||||
"Pasivo Corto Plazo": {
|
||||
"Cuentas y Documentos por Pagar": {
|
||||
"Cuentas y Documentos por Pagar": {}
|
||||
},
|
||||
"ISV por Pagar": {
|
||||
"ISV por Pagar": {}
|
||||
},
|
||||
"Impuestos": {
|
||||
"Impuestos": {}
|
||||
}
|
||||
},
|
||||
"Pasivo a Largo Plazo": {
|
||||
"Provisi\u00f3n para Indemnizaciones": {
|
||||
"Provisi\u00f3n para Indemnizaciones": {}
|
||||
}
|
||||
},
|
||||
"root_type": "Liability"
|
||||
},
|
||||
"Patrimonio": {
|
||||
"Patrimonio de los Accionistas": {
|
||||
"Patrimonio de los Accionistas": {
|
||||
"Capital Autorizado, Suscr\u00edto y Pagado": {},
|
||||
"Perdidas y Ganancias": {},
|
||||
"Reservas": {}
|
||||
}
|
||||
},
|
||||
"root_type": "Asset"
|
||||
},
|
||||
"Egresos": {
|
||||
"Costos": {
|
||||
"Costos de Ventas": {
|
||||
"Costos de Ventas": {}
|
||||
}
|
||||
},
|
||||
"root_type": "Expense"
|
||||
},
|
||||
"Gastos": {
|
||||
"Gastos de Operaci\u00f3n": {
|
||||
"Gastos de Administraci\u00f3n": {
|
||||
"Gastos de Administraci\u00f3n": {}
|
||||
},
|
||||
"Otros Gastos de Operaci\u00f3n": {
|
||||
"Otros Gastos de Operaci\u00f3n": {}
|
||||
}
|
||||
},
|
||||
"Gastos de Ventas": {
|
||||
"Gastos de Ventas": {
|
||||
"Gastos de Ventas": {}
|
||||
}
|
||||
},
|
||||
"Gastos no Deducibles": {
|
||||
"Gastos no Deducibles": {
|
||||
"Gastos no Deducibles": {}
|
||||
}
|
||||
},
|
||||
"root_type": "Expense"
|
||||
},
|
||||
"Ingresos": {
|
||||
"Otros Ingresos": {
|
||||
"Otros Ingresos": {
|
||||
"Otros Ingresos": {}
|
||||
}
|
||||
},
|
||||
"Ventas": {
|
||||
"Ventas Netas": {
|
||||
"Descuentos Sobre Ventas": {},
|
||||
"Ventas": {}
|
||||
}
|
||||
},
|
||||
"root_type": "Income"
|
||||
},
|
||||
"Otros Gastos y Productos Financieros": {
|
||||
"Otros Gastos y Productos Financieros": {
|
||||
"Otros Gastos y Productos Financieros": {
|
||||
"Intereses": {},
|
||||
"Otros Gastos Financieros": {}
|
||||
}
|
||||
},
|
||||
"root_type": "Expense"
|
||||
}
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,313 +0,0 @@
|
||||
{
|
||||
"country_code": "it",
|
||||
"name": "Italy - Generic Chart of Accounts",
|
||||
"tree": {
|
||||
"ATTIVO": {
|
||||
"CREDITI COMMERCIALI": {
|
||||
"cambiali all'incasso": {},
|
||||
"cambiali allo sconto": {},
|
||||
"cambiali attive": {},
|
||||
"cambiali insolute": {},
|
||||
"clienti c/spese anticipate": {
|
||||
"account_type": "Receivable"
|
||||
},
|
||||
"crediti commerciali diversi": {},
|
||||
"crediti da liquidare": {},
|
||||
"crediti insoluti": {},
|
||||
"crediti v/clienti": {
|
||||
"account_type": "Receivable"
|
||||
},
|
||||
"fatture da emettere": {},
|
||||
"fondo rischi su crediti": {},
|
||||
"fondo svalutazione crediti": {}
|
||||
},
|
||||
"CREDITI DIVERSI": {
|
||||
"IVA c/acconto": {},
|
||||
"IVA n/credito": {},
|
||||
"crediti per IVA": {},
|
||||
"crediti per cauzioni": {},
|
||||
"crediti per imposte": {},
|
||||
"crediti per ritenute subite": {},
|
||||
"crediti v/istituti previdenziali": {},
|
||||
"debitori diversi": {
|
||||
"account_type": "Receivable"
|
||||
},
|
||||
"imposte c/acconto": {},
|
||||
"personale c/acconti": {}
|
||||
},
|
||||
"DISPONIBILIT\u00c0 LIQUIDE": {
|
||||
"assegni": {
|
||||
"account_type": "Cash"
|
||||
},
|
||||
"banche c/c": {
|
||||
"account_type": "Bank"
|
||||
},
|
||||
"c/c postali": {
|
||||
"account_type": "Bank"
|
||||
},
|
||||
"denaro in cassa": {
|
||||
"account_type": "Cash"
|
||||
},
|
||||
"valori bollati": {
|
||||
"account_type": "Cash"
|
||||
}
|
||||
},
|
||||
"IMMOBILIZZAZIONI FINANZIARIE": {
|
||||
"mutui attivi": {}
|
||||
},
|
||||
"IMMOBILIZZAZIONI IMMATERIALI": {
|
||||
"avviamento": {},
|
||||
"costi di impianto": {},
|
||||
"fondo ammortamento avviamento": {},
|
||||
"fondo ammortamento costi di impianto": {},
|
||||
"fondo ammortamento software": {},
|
||||
"software": {}
|
||||
},
|
||||
"IMMOBILIZZAZIONI MATERIALI": {
|
||||
"arredamento": {},
|
||||
"attrezzature commerciali": {},
|
||||
"automezzi": {},
|
||||
"fabbricati": {},
|
||||
"fondo ammortamento arredamento": {},
|
||||
"fondo ammortamento attrezzature commerciali": {},
|
||||
"fondo ammortamento automezzi": {},
|
||||
"fondo ammortamento fabbricati": {},
|
||||
"fondo ammortamento imballaggi durevoli": {},
|
||||
"fondo ammortamento impianti e macchinari": {},
|
||||
"fondo ammortamento macchine d'ufficio": {},
|
||||
"fornitori immobilizzazioni c/acconti": {},
|
||||
"imballaggi durevoli": {},
|
||||
"impianti e macchinari": {},
|
||||
"macchine d'ufficio": {}
|
||||
},
|
||||
"RATEI E RISCONTI ATTIVI": {
|
||||
"ratei attivi": {},
|
||||
"risconti attivi": {}
|
||||
},
|
||||
"RIMANENZE": {
|
||||
"fornitori c/acconti": {},
|
||||
"materie di consumo": {},
|
||||
"merci": {}
|
||||
},
|
||||
"root_type": ""
|
||||
},
|
||||
"CONTI DI RISULTATO": {
|
||||
"conto di risultato economico": {},
|
||||
"root_type": "",
|
||||
"stato patrimoniale": {}
|
||||
},
|
||||
"COSTI DELLA PRODUZIONE": {
|
||||
"ACCANTONAMENTI": {
|
||||
"ACCANTONAMENTI PER RISCHI": {
|
||||
"accantonamento per responsabilit\u00e0 civile": {}
|
||||
},
|
||||
"ALTRI ACCANTONAMENTI": {
|
||||
"accantonamento per manutenzioni programmate": {},
|
||||
"accantonamento per spese future": {}
|
||||
}
|
||||
},
|
||||
"AMMORTAMENTI IMMOBILIZZAZIONI IMMATERIALI": {
|
||||
"ammortamento avviamento": {},
|
||||
"ammortamento costi di impianto": {},
|
||||
"ammortamento software": {}
|
||||
},
|
||||
"AMMORTAMENTI IMMOBILIZZAZIONI MATERIALI": {
|
||||
"ammortamento arredamento": {},
|
||||
"ammortamento attrezzature commerciali": {},
|
||||
"ammortamento automezzi": {},
|
||||
"ammortamento fabbricati": {},
|
||||
"ammortamento imballaggi durevoli": {},
|
||||
"ammortamento impianti e macchinari": {},
|
||||
"ammortamento macchine d'ufficio": {}
|
||||
},
|
||||
"COSTI PER GODIMENTO BENI DI TERZI": {
|
||||
"canoni di leasing": {},
|
||||
"fitti passivi": {}
|
||||
},
|
||||
"COSTI PER IL PERSONALE": {
|
||||
"TFRL": {},
|
||||
"altri costi per il personale": {},
|
||||
"oneri sociali": {},
|
||||
"salari e stipendi": {}
|
||||
},
|
||||
"COSTI PER SERVIZI": {
|
||||
"costi di assicurazione": {},
|
||||
"costi di consulenze": {},
|
||||
"costi di esercizio automezzi": {},
|
||||
"costi di manutenzione e riparazione": {},
|
||||
"costi di pubblicit\u00e0": {},
|
||||
"costi di trasporto": {},
|
||||
"costi di vigilanza": {},
|
||||
"costi per energia": {},
|
||||
"costi per i locali": {},
|
||||
"costi postali": {},
|
||||
"costi telefonici": {},
|
||||
"provvigioni passive": {},
|
||||
"spese di incasso": {}
|
||||
},
|
||||
"COSTO DEL VENDUTO": {
|
||||
"materie di consumo c/acquisti": {},
|
||||
"materie di consumo c/esistenze iniziali": {},
|
||||
"materie di consumo c/rimanenze finali": {},
|
||||
"merci c/acquisti": {},
|
||||
"merci c/apporti": {},
|
||||
"merci c/esistenze iniziali": {},
|
||||
"merci c/rimanenze finali": {},
|
||||
"premi su acquisti": {},
|
||||
"resi su acquisti": {},
|
||||
"ribassi e abbuoni attivi": {}
|
||||
},
|
||||
"ONERI DIVERSI": {
|
||||
"arrotondamenti passivi": {},
|
||||
"insussistenze passive ordinarie diverse": {},
|
||||
"minusvalenze ordinarie diverse": {},
|
||||
"oneri fiscali diversi": {},
|
||||
"oneri vari": {},
|
||||
"perdite su crediti": {},
|
||||
"sopravvenienze passive ordinarie diverse": {}
|
||||
},
|
||||
"SVALUTAZIONI": {
|
||||
"svalutazione crediti": {},
|
||||
"svalutazioni immobilizzazioni immateriali": {},
|
||||
"svalutazioni immobilizzazioni materiali": {}
|
||||
},
|
||||
"root_type": ""
|
||||
},
|
||||
"IMPOSTE DELL'ESERCIZIO": {
|
||||
"imposte dell'esercizio": {},
|
||||
"root_type": ""
|
||||
},
|
||||
"PASSIVO": {
|
||||
"CONTI DEI SISTEMI SUPPLEMENTARI": {
|
||||
"banche c/effetti scontati": {},
|
||||
"beni di terzi": {},
|
||||
"clienti c/impegni": {},
|
||||
"creditori c/leasing": {},
|
||||
"creditori per avalli": {},
|
||||
"creditori per fideiussioni": {},
|
||||
"depositanti beni": {},
|
||||
"fornitori c/impegni": {},
|
||||
"impegni per beni in leasing": {},
|
||||
"merci da consegnare": {},
|
||||
"merci da ricevere": {},
|
||||
"rischi per avalli": {},
|
||||
"rischi per effetti scontati": {},
|
||||
"rischi per fideiussioni": {}
|
||||
},
|
||||
"CONTI TRANSITORI E DIVERSI": {
|
||||
"IVA c/liquidazioni": {},
|
||||
"banca ... c/c": {},
|
||||
"bilancio di apertura": {},
|
||||
"bilancio di chiusura": {},
|
||||
"istituti previdenziali": {}
|
||||
},
|
||||
"DEBITI COMMERCIALI": {
|
||||
"cambiali passive": {},
|
||||
"clienti c/acconti": {
|
||||
"account_type": "Payable"
|
||||
},
|
||||
"debiti da liquidare": {},
|
||||
"debiti v/fornitori": {
|
||||
"account_type": "Payable"
|
||||
},
|
||||
"fatture da ricevere": {}
|
||||
},
|
||||
"DEBITI DIVERSI": {
|
||||
"IVA n/debito": {},
|
||||
"clienti c/cessione": {},
|
||||
"creditori diversi": {
|
||||
"account_type": "Payable"
|
||||
},
|
||||
"debiti per cauzioni": {},
|
||||
"debiti per imposte": {},
|
||||
"debiti per ritenute da versare": {
|
||||
"account_type": "Payable"
|
||||
},
|
||||
"debiti v/istituti previdenziali": {},
|
||||
"erario c/IVA": {
|
||||
"account_type": "Payable"
|
||||
},
|
||||
"personale c/liquidazioni": {},
|
||||
"personale c/retribuzioni": {}
|
||||
},
|
||||
"DEBITI FINANZIARI": {
|
||||
"banche c/RIBA all'incasso": {},
|
||||
"banche c/anticipi su fatture": {},
|
||||
"banche c/c passivi": {},
|
||||
"banche c/cambiali all'incasso": {},
|
||||
"banche c/sovvenzioni": {},
|
||||
"debiti v/altri finanziatori": {},
|
||||
"mutui passivi": {}
|
||||
},
|
||||
"FONDI PER RISCHI E ONERI": {
|
||||
"fondo manutenzioni programmate": {},
|
||||
"fondo per imposte": {},
|
||||
"fondo responsabilit\u00e0 civile": {},
|
||||
"fondo spese future": {}
|
||||
},
|
||||
"PATRIMONIO NETTO": {
|
||||
"patrimonio netto": {},
|
||||
"perdita d'esercizio": {},
|
||||
"prelevamenti extra gestione": {},
|
||||
"titolare c/ritenute subite": {},
|
||||
"utile d'esercizio": {}
|
||||
},
|
||||
"RATEI E RISCONTI PASSIVI": {
|
||||
"ratei passivi": {},
|
||||
"risconti passivi": {}
|
||||
},
|
||||
"TRATTAMENTO FINE RAPPORTO DI LAVORO": {
|
||||
"debiti per TFRL": {}
|
||||
},
|
||||
"root_type": ""
|
||||
},
|
||||
"PROVENTI E ONERI FINANZIARI": {
|
||||
"ONERI FINANZIARI": {
|
||||
"interessi passivi bancari": {},
|
||||
"interessi passivi su mutui": {},
|
||||
"interessi passivi v/fornitori": {},
|
||||
"oneri finanziari diversi": {},
|
||||
"sconti passivi bancari": {}
|
||||
},
|
||||
"PROVENTI FINANZIARI": {
|
||||
"interessi attivi bancari": {},
|
||||
"interessi attivi postali": {},
|
||||
"interessi attivi v/clienti": {},
|
||||
"proventi finanziari diversi": {}
|
||||
},
|
||||
"root_type": ""
|
||||
},
|
||||
"PROVENTI E ONERI STRAORDINARI": {
|
||||
"ONERI STRAORDINARI": {
|
||||
"imposte esercizi precedenti": {},
|
||||
"insussistenze passive straordinarie": {},
|
||||
"minusvalenze straordinarie": {},
|
||||
"sopravvenienze passive straordinarie": {}
|
||||
},
|
||||
"PROVENTI STRAORDINARI": {
|
||||
"insussistenze attive straordinarie": {},
|
||||
"plusvalenze straordinarie": {},
|
||||
"sopravvenienze attive straordinarie": {}
|
||||
},
|
||||
"root_type": ""
|
||||
},
|
||||
"VALORE DELLA PRODUZIONE": {
|
||||
"RICAVI E PROVENTI DIVERSI": {
|
||||
"arrotondamenti attivi": {},
|
||||
"fitti attivi": {},
|
||||
"insussistenze attive ordinarie diverse": {},
|
||||
"plusvalenze ordinarie diverse": {},
|
||||
"proventi vari": {},
|
||||
"sopravvenienze attive ordinarie diverse": {}
|
||||
},
|
||||
"VENDITE E PRESTAZIONI": {
|
||||
"merci c/vendite": {},
|
||||
"premi su vendite": {},
|
||||
"resi su vendite": {},
|
||||
"ribassi e abbuoni passivi": {},
|
||||
"rimborsi spese di vendita": {}
|
||||
},
|
||||
"root_type": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,231 +0,0 @@
|
||||
{
|
||||
"country_code": "pa",
|
||||
"name": "Panama - Plan de Cuentas",
|
||||
"tree": {
|
||||
"ACTIVOS": {
|
||||
"Activo Fijo": {
|
||||
"Activo Fijo / (-) Depreciaci\u00f3n Acumulada": {},
|
||||
"Activo Fijo / Equipos": {},
|
||||
"Activo Fijo / Inmuebles": {},
|
||||
"Activo Fijo / Maquinaria": {},
|
||||
"Activo Fijo / Material Rodante Motorizado": {}
|
||||
},
|
||||
"Activo Intangible": {
|
||||
"Activo Intangible / (-) Amortizaci\u00f3n Acumulada": {},
|
||||
"Activo Intangible / Concesiones y Franquicias": {},
|
||||
"Activo Intangible / Derecho de Llaves": {},
|
||||
"Activo Intangible / Marcas y Patentes de Invenci\u00f3n": {}
|
||||
},
|
||||
"Caja y Bancos": {
|
||||
"Caja y Bancos - Bancos": {
|
||||
"Caja y Bancos.../ BCO. CTA CTE PAB": {
|
||||
"account_type": "Bank"
|
||||
}
|
||||
},
|
||||
"Caja y Bancos - Caja": {
|
||||
"Caja y Bancos - Caja / efectivo PAB": {
|
||||
"account_type": "Cash"
|
||||
}
|
||||
},
|
||||
"Caja y Bancos - Fondos fijos": {
|
||||
"Caja y Bancos - Fondos fijos / caja menuda 01 PAB": {
|
||||
"account_type": "Cash"
|
||||
}
|
||||
},
|
||||
"Caja y Bancos - Moneda Extranjera": {
|
||||
"Caja y Bancos - Caja / efectivo USD": {
|
||||
"account_type": "Cash"
|
||||
}
|
||||
},
|
||||
"Caja y Bancos - Recaudaciones a Depositar ": {
|
||||
"account_type": "Bank"
|
||||
},
|
||||
"Caja y Bancos - Valores a Depositar ": {
|
||||
"account_type": "Bank"
|
||||
}
|
||||
},
|
||||
"Cuentas por Cobrar": {
|
||||
"Cuentas por Cobrar / (-) Previsi\u00f3n para Incobrables": {
|
||||
"account_type": "Receivable"
|
||||
},
|
||||
"Cuentas por Cobrar / Deudores Morosos": {
|
||||
"account_type": "Receivable"
|
||||
},
|
||||
"Cuentas por Cobrar / Deudores Varios": {
|
||||
"account_type": "Receivable"
|
||||
},
|
||||
"Cuentas por Cobrar / Deudores en Gesti\u00f3n Judicial": {
|
||||
"account_type": "Receivable"
|
||||
},
|
||||
"Cuentas por Cobrar / Deudores por Ventas": {
|
||||
"account_type": "Receivable"
|
||||
}
|
||||
},
|
||||
"Inventarios": {
|
||||
"(-) Previsi\u00f3n para Desvalorizaci\u00f3n de Inventarios": {},
|
||||
"Inventarios - Mercancias": {
|
||||
"Inventarios - Mercancias / Categoria de productos 01": {}
|
||||
},
|
||||
"Inventarios - Mercancias en Tr\u00e1nsito": {},
|
||||
"Materiales Varios ": {},
|
||||
"Materias primas": {},
|
||||
"Productos Elaborados": {},
|
||||
"Productos en Curso de Elaboraci\u00f3n": {}
|
||||
},
|
||||
"Inversiones Financieras": {
|
||||
"Inversiones / (-) Previsi\u00f3n para Devalorizaci\u00f3n de Acciones": {},
|
||||
"Inversiones / Acciones Permanentes": {},
|
||||
"Inversiones / Acciones Transitorias": {},
|
||||
"Inversiones / T\u00edtulos P\u00fablicos": {}
|
||||
},
|
||||
"Otras Cuentas por Cobrar": {
|
||||
"Otras Cuentas por Cobrar / (-) Intereses (+) a Devengar": {},
|
||||
"Otras Cuentas por Cobrar / (-) Previsi\u00f3n para Descuentos": {},
|
||||
"Otras Cuentas por Cobrar / Accionistas": {},
|
||||
"Otras Cuentas por Cobrar / Alquileres Pagados por Adelantado": {},
|
||||
"Otras Cuentas por Cobrar / Anticipo al Personal": {},
|
||||
"Otras Cuentas por Cobrar / Anticipo de Impuestos": {},
|
||||
"Otras Cuentas por Cobrar / Anticipos a Proveedores": {},
|
||||
"Otras Cuentas por Cobrar / Intereses Pagados por Adelantado": {},
|
||||
"Otras Cuentas por Cobrar / Pr\u00e9stamos otorgados": {}
|
||||
},
|
||||
"root_type": "Asset"
|
||||
},
|
||||
"PASIVOS": {
|
||||
"Cuentas por Pagar": {
|
||||
"Cuentas por Pagar / (-) Intereses a Devengar por Compras al Cr\u00e9dito": {
|
||||
"account_type": "Payable"
|
||||
},
|
||||
"Cuentas por Pagar / Anticipos de Clientes": {
|
||||
"account_type": "Payable"
|
||||
},
|
||||
"Cuentas por Pagar / Proveedores": {
|
||||
"account_type": "Payable"
|
||||
}
|
||||
},
|
||||
"Impuestos por Pagar": {
|
||||
"Impuestos por Pagar / ITBMS a Pagar": {},
|
||||
"Impuestos por Pagar / Impuesto sobre la Renta a Pagar": {}
|
||||
},
|
||||
"Otras Cuentas por Pagar": {
|
||||
"Otras Cuentas por Pagar / Acreedores Varios": {},
|
||||
"Otras Cuentas por Pagar / Cobros por Adelantado": {},
|
||||
"Otras Cuentas por Pagar / Dividendos a Pagar": {},
|
||||
"Otras Cuentas por Pagar / Honorarios Directores y S\u00edndicos a Pagar": {}
|
||||
},
|
||||
"Pasivo Circulante": {
|
||||
"Pasivo Circulante / Adelantos en Cuenta Corriente": {},
|
||||
"Pasivo Circulante / Debentures Emitidos": {},
|
||||
"Pasivo Circulante / Intereses a Pagar": {},
|
||||
"Pasivo Circulante / Obligaciones a Pagar": {},
|
||||
"Pasivo Circulante / Prestamos": {}
|
||||
},
|
||||
"Provisiones": {
|
||||
"Provisiones / Previsi\u00f3n Indemnizaci\u00f3n por Despidos": {},
|
||||
"Provisiones / Previsi\u00f3n para Garant\u00edas por Service": {},
|
||||
"Provisiones / Previsi\u00f3n para juicios Pendientes": {}
|
||||
},
|
||||
"Salarios por Pagar": {
|
||||
"Salarios por Pagar / Cargas Sociales a Pagar": {},
|
||||
"Salarios por Pagar / Provisi\u00f3n para Sueldo Anual Complementario": {},
|
||||
"Salarios por Pagar / Retenciones a Depositar": {},
|
||||
"Salarios por Pagar / Sueldos a Pagar": {}
|
||||
},
|
||||
"root_type": "Liability"
|
||||
},
|
||||
"PATRIMONIO": {
|
||||
"Ajustes al Patrimonio": {
|
||||
"Ajustes al Patrimonio / Revaluo T\u00e9cnico de Activo Fijo": {}
|
||||
},
|
||||
"Aportes No Capitalizados": {
|
||||
"Aportes No Capitalizados / Aportes Irrevocables Futura Suscripci\u00f3n de Acciones": {},
|
||||
"Aportes No Capitalizados / Primas de Emsi\u00f3n": {}
|
||||
},
|
||||
"Capital": {
|
||||
"Capital / (-) Descuento de Emisi\u00f3n de Acciones": {},
|
||||
"Capital / Acciones en Circulaci\u00f3n": {},
|
||||
"Capital / Capital Propio": {},
|
||||
"Capital / Dividendos a Distribuir en Acciones": {}
|
||||
},
|
||||
"Futuras Eventualidades": {
|
||||
"Reserva Estatutaria": {},
|
||||
"Reserva Facultativa": {},
|
||||
"Reserva Legal": {},
|
||||
"Reserva para Renovaci\u00f3n de Activo Fijo": {}
|
||||
},
|
||||
"Resultados No Asignados": {
|
||||
"Resultado del Ejercicio": {},
|
||||
"Resultados Acumulados": {},
|
||||
"Resultados Acumulados del Ejercicio Anterior": {},
|
||||
"Utilidades y P\u00e9rdidas del Ejercicio": {}
|
||||
},
|
||||
"root_type": "Asset"
|
||||
},
|
||||
"CUENTAS DE ORDEN ACREEDORAS": {
|
||||
"Acreedor por Documentos Descontados": {},
|
||||
"Acreedor por Garant\u00edas Otorgadas": {},
|
||||
"Comitente por Mercaderias Recibidas en Consignaci\u00f3n": {},
|
||||
"root_type": "Liability"
|
||||
},
|
||||
"CUENTAS DE ORDEN DEUDORAS": {
|
||||
"Dep\u00f3sito de Valores Recibos en Garant\u00eda": {},
|
||||
"Documentos Descontados": {},
|
||||
"Documentos Endosados": {},
|
||||
"Garantias Otorgadas": {},
|
||||
"Mercaderias Recibidas en Consignaci\u00f3n": {},
|
||||
"root_type": "Asset"
|
||||
},
|
||||
"COSTOS": {
|
||||
"Compras": {
|
||||
"Compras - Categoria de productos 01": {}
|
||||
},
|
||||
"Costo de Venta": {
|
||||
"Costo de Venta - Categoria de productos 01": {}
|
||||
},
|
||||
"Costos de Producci\u00f3n": {},
|
||||
"Gastos de Administraci\u00f3n": {},
|
||||
"Gastos de Comercializaci\u00f3n": {},
|
||||
"root_type": "Expense"
|
||||
},
|
||||
"GASTOS": {
|
||||
"Gastos No Operativos": {
|
||||
"Donaciones Cedidas, Otorgadas": {},
|
||||
"Gastos en Siniestros": {},
|
||||
"P\u00e9rdida Venta Activo Fijo": {}
|
||||
},
|
||||
"Gastos Operativos": {
|
||||
"Gastos Bancarios": {},
|
||||
"Gastos de Publicidad y Propaganda": {},
|
||||
"Gastos en Amortizaci\u00f3n": {},
|
||||
"Gastos en Cargas Sociales": {},
|
||||
"Gastos en Depreciaci\u00f3n de Activo Fijo": {},
|
||||
"Gastos en Impuestos": {},
|
||||
"Gastos en Salarios": {},
|
||||
"Gastos en Servicios P\u00fablicos": {}
|
||||
},
|
||||
"root_type": "Expense"
|
||||
},
|
||||
"INGRESOS": {
|
||||
"Ingresos No Operativos": {
|
||||
"Donaciones obtenidas, ganandas, percibidas": {},
|
||||
"Ganancia Venta Inversiones Permanentes": {},
|
||||
"Ganancia Venta de Activo Fijo": {},
|
||||
"Recupero de Deudores Incobrables": {},
|
||||
"Recupero de Rezagos": {}
|
||||
},
|
||||
"Ingresos Operativos": {
|
||||
"Alquileres gananados, obtenidos, percibidos": {},
|
||||
"Comisiones gananados, obtenidos, percibidos": {},
|
||||
"Descuentos gananados, obtenidos, percibidos": {},
|
||||
"Ganancia Venta de Acciones": {},
|
||||
"Honorarios gananados, obtenidos, percibidos": {},
|
||||
"Interese sobre Inversiones": {},
|
||||
"Intereses gananados, obtenidos, percibidos": {},
|
||||
"Ventas": {
|
||||
"Ventas - Categoria de productos 01": {}
|
||||
}
|
||||
},
|
||||
"root_type": "Income"
|
||||
}
|
||||
}
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user