Compare commits
7 Commits
mariadb_li
...
v4.x.x
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
10e1452450 | ||
|
|
8320f758be | ||
|
|
093a3ecb43 | ||
|
|
8e261d2da7 | ||
|
|
f0aa1cfad3 | ||
|
|
8570f785c7 | ||
|
|
e3e7309cbf |
@@ -1,21 +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,*.vue,*.css,*.scss,*.html}]
|
|
||||||
indent_style = tab
|
|
||||||
indent_size = 4
|
|
||||||
max_line_length = 110
|
|
||||||
|
|
||||||
# JSON files - mostly doctype schema files
|
|
||||||
[{*.json}]
|
|
||||||
insert_final_newline = false
|
|
||||||
indent_style = space
|
|
||||||
indent_size = 1
|
|
||||||
130
.eslintrc
130
.eslintrc
@@ -1,130 +0,0 @@
|
|||||||
{
|
|
||||||
"env": {
|
|
||||||
"browser": true,
|
|
||||||
"node": true,
|
|
||||||
"es2022": true
|
|
||||||
},
|
|
||||||
"parserOptions": {
|
|
||||||
"sourceType": "module"
|
|
||||||
},
|
|
||||||
"extends": "eslint:recommended",
|
|
||||||
"rules": {
|
|
||||||
"indent": "off",
|
|
||||||
"brace-style": "off",
|
|
||||||
"no-mixed-spaces-and-tabs": "off",
|
|
||||||
"no-useless-escape": "off",
|
|
||||||
"space-unary-ops": ["error", { "words": true }],
|
|
||||||
"linebreak-style": "off",
|
|
||||||
"quotes": ["off"],
|
|
||||||
"semi": "off",
|
|
||||||
"camelcase": "off",
|
|
||||||
"no-unused-vars": "off",
|
|
||||||
"no-console": ["warn"],
|
|
||||||
"no-extra-boolean-cast": ["off"],
|
|
||||||
"no-control-regex": ["off"]
|
|
||||||
},
|
|
||||||
"root": true,
|
|
||||||
"globals": {
|
|
||||||
"frappe": true,
|
|
||||||
"Vue": true,
|
|
||||||
"SetVueGlobals": 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,
|
|
||||||
"posthog": true,
|
|
||||||
"has_words": true,
|
|
||||||
"validate_email": true,
|
|
||||||
"open_web_template_values_editor": 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,
|
|
||||||
"extend_cscript": true,
|
|
||||||
"localforage": true,
|
|
||||||
"Plaid": true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
37
.flake8
37
.flake8
@@ -1,37 +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,
|
|
||||||
E124, # closing bracket, irritating while writing QB code
|
|
||||||
E131, # continuation line unaligned for hanging indent
|
|
||||||
E123, # closing bracket does not match indentation of opening bracket's line
|
|
||||||
E101, # ensured by use of black
|
|
||||||
|
|
||||||
max-line-length = 200
|
|
||||||
exclude=.github/helper/semgrep_rules
|
|
||||||
@@ -1,47 +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
|
|
||||||
|
|
||||||
# Replace use of Class.extend with native JS class
|
|
||||||
1fe891b287a1b3f225d29ee3d07e7b1824aba9e7
|
|
||||||
|
|
||||||
# This commit just changes spaces to tabs for indentation in some files
|
|
||||||
5f473611bd6ed57703716244a054d3fb5ba9cd23
|
|
||||||
|
|
||||||
# Whitespace fix throughout codebase
|
|
||||||
4551d7d6029b6f587f6c99d4f8df5519241c6a86
|
|
||||||
b147b85e6ac19a9220cd1e2958a6ebd99373283a
|
|
||||||
|
|
||||||
# sort and cleanup imports
|
|
||||||
915b34391c2066dfc83e60a5813c5a877cebe7ac
|
|
||||||
|
|
||||||
# removing six compatibility layer
|
|
||||||
8fe5feb6a4372bf5f2dfaf65fca41bbcc25c8ce7
|
|
||||||
|
|
||||||
# bulk format python code with black
|
|
||||||
494bd9ef78313436f0424b918f200dab8fc7c20b
|
|
||||||
|
|
||||||
# bulk format python code with black
|
|
||||||
baec607ff5905b1c67531096a9cf50ec7ff00a5d
|
|
||||||
|
|
||||||
# bulk refactor with sourcery
|
|
||||||
eb9ee3f79b94e594fc6dfa4f6514580e125eee8c
|
|
||||||
|
|
||||||
# js formatting
|
|
||||||
ec74a5e56617bbd76ac402451468fd4668af543d
|
|
||||||
|
|
||||||
# ruff formatting
|
|
||||||
a308792ee7fda18a681e9181f4fd00b36385bc23
|
|
||||||
|
|
||||||
# noisy typing refactoring of get_item_details
|
|
||||||
7b7211ac79c248a79ba8a999ff34e734d874c0ae
|
|
||||||
d827ed21adc7b36047e247cbb0dc6388d048a7f9
|
|
||||||
|
|
||||||
# `frappe.flags.in_test` => `frappe.in_test`
|
|
||||||
7a482a69985c952de0e8193c9d4e086aee65ee6d
|
|
||||||
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 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!
|
|
||||||
89
.github/ISSUE_TEMPLATE/bug_report.yaml
vendored
89
.github/ISSUE_TEMPLATE/bug_report.yaml
vendored
@@ -1,89 +0,0 @@
|
|||||||
name: Bug Report
|
|
||||||
description: Report a bug encountered while using ERPNext
|
|
||||||
labels: ["bug"]
|
|
||||||
|
|
||||||
body:
|
|
||||||
- type: markdown
|
|
||||||
attributes:
|
|
||||||
value: |
|
|
||||||
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 [user manual](https://docs.erpnext.com/) or use [forum](https://discuss.erpnext.com)
|
|
||||||
- For documentation issues, propose edit on [documentation site](https://docs.erpnext.com/) directly.
|
|
||||||
2. 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.
|
|
||||||
3. If you think you know what the reason for the bug is, share it with us. Maybe put in a PR 😉
|
|
||||||
|
|
||||||
- type: textarea
|
|
||||||
id: bug-info
|
|
||||||
attributes:
|
|
||||||
label: Information about bug
|
|
||||||
description: Also tell us, what did you expect to happen?
|
|
||||||
placeholder: Please provide as much information as possible.
|
|
||||||
validations:
|
|
||||||
required: true
|
|
||||||
|
|
||||||
- type: dropdown
|
|
||||||
id: module
|
|
||||||
attributes:
|
|
||||||
label: Module
|
|
||||||
description: Select affected module of ERPNext.
|
|
||||||
multiple: true
|
|
||||||
options:
|
|
||||||
- accounts
|
|
||||||
- stock
|
|
||||||
- buying
|
|
||||||
- selling
|
|
||||||
- ecommerce
|
|
||||||
- manufacturing
|
|
||||||
- HR
|
|
||||||
- projects
|
|
||||||
- support
|
|
||||||
- CRM
|
|
||||||
- assets
|
|
||||||
- integrations
|
|
||||||
- quality
|
|
||||||
- regional
|
|
||||||
- portal
|
|
||||||
- agriculture
|
|
||||||
- education
|
|
||||||
- non-profit
|
|
||||||
- other
|
|
||||||
validations:
|
|
||||||
required: true
|
|
||||||
|
|
||||||
- type: textarea
|
|
||||||
id: exact-version
|
|
||||||
attributes:
|
|
||||||
label: Version
|
|
||||||
description: Share exact version number of Frappe and ERPNext you are using.
|
|
||||||
placeholder: |
|
|
||||||
Frappe version -
|
|
||||||
ERPNext Verion -
|
|
||||||
validations:
|
|
||||||
required: true
|
|
||||||
|
|
||||||
- type: dropdown
|
|
||||||
id: install-method
|
|
||||||
attributes:
|
|
||||||
label: Installation method
|
|
||||||
options:
|
|
||||||
- docker
|
|
||||||
- easy-install
|
|
||||||
- manual install
|
|
||||||
- FrappeCloud
|
|
||||||
validations:
|
|
||||||
required: false
|
|
||||||
|
|
||||||
- type: textarea
|
|
||||||
id: logs
|
|
||||||
attributes:
|
|
||||||
label: Relevant log output / Stack trace / Full Error Message.
|
|
||||||
description: Please copy and paste any relevant log output. This will be automatically formatted.
|
|
||||||
render: shell
|
|
||||||
|
|
||||||
- type: markdown
|
|
||||||
attributes:
|
|
||||||
value: |
|
|
||||||
By submitting this issue, you agree to follow our [Code of Conduct](https://github.com/frappe/erpnext/blob/develop/CODE_OF_CONDUCT.md)
|
|
||||||
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.
|
|
||||||
39
.github/ISSUE_TEMPLATE/feature_request.md
vendored
39
.github/ISSUE_TEMPLATE/feature_request.md
vendored
@@ -1,39 +0,0 @@
|
|||||||
---
|
|
||||||
name: Feature request
|
|
||||||
about: Suggest an idea to improve ERPNext
|
|
||||||
title: ''
|
|
||||||
labels: feature-request
|
|
||||||
assignees: ''
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
<!--
|
|
||||||
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
|
|
||||||
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.
|
|
||||||
|
|
||||||
|
|
||||||
Please keep in mind that we get many many requests and we can't possibly work on all of them, we prioritize development based on the goals of the product and organization. Feature requests are still welcome as it helps us in research when we do decide to work on the requested feature.
|
|
||||||
|
|
||||||
If you're in urgent need to a feature, please try the following channels to get paid developments done quickly:
|
|
||||||
1. Certified ERPNext partners: https://erpnext.com/partners
|
|
||||||
2. Developer community on ERPNext forums: https://discuss.erpnext.com/c/developers/5
|
|
||||||
3. Telegram group for ERPNext/Frappe development work: https://t.me/erpnext_opps
|
|
||||||
|
|
||||||
-->
|
|
||||||
|
|
||||||
**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.
|
|
||||||
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 -->
|
|
||||||
74
.github/helper/.flake8_strict
vendored
74
.github/helper/.flake8_strict
vendored
@@ -1,74 +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,
|
|
||||||
B023,
|
|
||||||
B028
|
|
||||||
|
|
||||||
|
|
||||||
max-line-length = 200
|
|
||||||
exclude=.github/helper/semgrep_rules,test_*.py
|
|
||||||
65
.github/helper/documentation.py
vendored
65
.github/helper/documentation.py
vendored
@@ -1,65 +0,0 @@
|
|||||||
import sys
|
|
||||||
from urllib.parse import urlparse
|
|
||||||
|
|
||||||
import requests
|
|
||||||
|
|
||||||
WEBSITE_REPOS = [
|
|
||||||
"erpnext_com",
|
|
||||||
"frappe_io",
|
|
||||||
]
|
|
||||||
|
|
||||||
DOCUMENTATION_DOMAINS = [
|
|
||||||
"docs.erpnext.com",
|
|
||||||
"docs.frappe.io",
|
|
||||||
"frappeframework.com",
|
|
||||||
]
|
|
||||||
|
|
||||||
|
|
||||||
def is_valid_url(url: str) -> bool:
|
|
||||||
parts = urlparse(url)
|
|
||||||
return all((parts.scheme, parts.netloc, parts.path))
|
|
||||||
|
|
||||||
|
|
||||||
def is_documentation_link(word: str) -> bool:
|
|
||||||
if not word.startswith("http") or not is_valid_url(word):
|
|
||||||
return False
|
|
||||||
|
|
||||||
parsed_url = urlparse(word)
|
|
||||||
if parsed_url.netloc in DOCUMENTATION_DOMAINS:
|
|
||||||
return True
|
|
||||||
|
|
||||||
if parsed_url.netloc == "github.com":
|
|
||||||
parts = parsed_url.path.split("/")
|
|
||||||
if len(parts) == 5 and parts[1] == "frappe" and parts[2] in WEBSITE_REPOS:
|
|
||||||
return True
|
|
||||||
|
|
||||||
return False
|
|
||||||
|
|
||||||
|
|
||||||
def contains_documentation_link(body: str) -> bool:
|
|
||||||
return any(is_documentation_link(word) for line in body.splitlines() for word in line.split())
|
|
||||||
|
|
||||||
|
|
||||||
def check_pull_request(number: str) -> "tuple[int, str]":
|
|
||||||
response = requests.get(f"https://api.github.com/repos/frappe/erpnext/pulls/{number}")
|
|
||||||
if not response.ok:
|
|
||||||
return 1, "Pull Request Not Found! ⚠️"
|
|
||||||
|
|
||||||
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 not title.startswith("feat") or not head_sha or "no-docs" in body or "backport" in body:
|
|
||||||
return 0, "Skipping documentation checks... 🏃"
|
|
||||||
|
|
||||||
if contains_documentation_link(body):
|
|
||||||
return 0, "Documentation Link Found. You're Awesome! 🎉"
|
|
||||||
|
|
||||||
return 1, "Documentation Link Not Found! ⚠️"
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
exit_code, message = check_pull_request(sys.argv[1])
|
|
||||||
print(message)
|
|
||||||
sys.exit(exit_code)
|
|
||||||
82
.github/helper/install.sh
vendored
82
.github/helper/install.sh
vendored
@@ -1,82 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
cd ~ || exit
|
|
||||||
|
|
||||||
|
|
||||||
curl -LsS https://r.mariadb.com/downloads/mariadb_repo_setup | sudo bash
|
|
||||||
sudo apt update
|
|
||||||
sudo apt remove mysql-server mysql-client
|
|
||||||
sudo apt install libcups2-dev redis-server mariadb-client libmariadb-dev
|
|
||||||
|
|
||||||
pip cache remove mysqlclient
|
|
||||||
|
|
||||||
pip install frappe-bench
|
|
||||||
|
|
||||||
githubbranch=${GITHUB_BASE_REF:-${GITHUB_REF##*/}}
|
|
||||||
frappeuser=${FRAPPE_USER:-"frappe"}
|
|
||||||
frappecommitish=${FRAPPE_BRANCH:-$githubbranch}
|
|
||||||
|
|
||||||
mkdir frappe
|
|
||||||
pushd frappe
|
|
||||||
git init
|
|
||||||
git remote add origin "https://github.com/${frappeuser}/frappe"
|
|
||||||
git fetch origin "${frappecommitish}" --depth 1
|
|
||||||
git checkout FETCH_HEAD
|
|
||||||
popd
|
|
||||||
|
|
||||||
bench init --skip-assets --frappe-path ~/frappe --python "$(which python)" frappe-bench
|
|
||||||
|
|
||||||
mkdir ~/frappe-bench/sites/test_site
|
|
||||||
|
|
||||||
if [ "$DB" == "mariadb" ];then
|
|
||||||
cp -r "${GITHUB_WORKSPACE}/.github/helper/site_config_mariadb.json" ~/frappe-bench/sites/test_site/site_config.json
|
|
||||||
else
|
|
||||||
cp -r "${GITHUB_WORKSPACE}/.github/helper/site_config_postgres.json" ~/frappe-bench/sites/test_site/site_config.json
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
if [ "$DB" == "mariadb" ];then
|
|
||||||
mariadb --host 127.0.0.1 --port 3306 -u root -proot -e "SET GLOBAL character_set_server = 'utf8mb4'"
|
|
||||||
mariadb --host 127.0.0.1 --port 3306 -u root -proot -e "SET GLOBAL collation_server = 'utf8mb4_unicode_ci'"
|
|
||||||
|
|
||||||
mariadb --host 127.0.0.1 --port 3306 -u root -proot -e "CREATE USER 'test_frappe'@'localhost' IDENTIFIED BY 'test_frappe'"
|
|
||||||
mariadb --host 127.0.0.1 --port 3306 -u root -proot -e "CREATE DATABASE test_frappe"
|
|
||||||
mariadb --host 127.0.0.1 --port 3306 -u root -proot -e "GRANT ALL PRIVILEGES ON \`test_frappe\`.* TO 'test_frappe'@'localhost'"
|
|
||||||
|
|
||||||
mariadb --host 127.0.0.1 --port 3306 -u root -proot -e "FLUSH PRIVILEGES"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$DB" == "postgres" ];then
|
|
||||||
echo "travis" | psql -h 127.0.0.1 -p 5432 -c "CREATE DATABASE test_frappe" -U postgres;
|
|
||||||
echo "travis" | psql -h 127.0.0.1 -p 5432 -c "CREATE USER test_frappe WITH PASSWORD 'test_frappe'" -U postgres;
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
install_whktml() {
|
|
||||||
wget -O /tmp/wkhtmltox.deb https://github.com/wkhtmltopdf/packaging/releases/download/0.12.6.1-2/wkhtmltox_0.12.6.1-2.jammy_amd64.deb
|
|
||||||
sudo apt install /tmp/wkhtmltox.deb
|
|
||||||
|
|
||||||
}
|
|
||||||
install_whktml &
|
|
||||||
wkpid=$!
|
|
||||||
|
|
||||||
|
|
||||||
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 payments --branch develop
|
|
||||||
bench get-app erpnext "${GITHUB_WORKSPACE}"
|
|
||||||
|
|
||||||
if [ "$TYPE" == "server" ]; then bench setup requirements --dev; fi
|
|
||||||
|
|
||||||
wait $wkpid
|
|
||||||
|
|
||||||
bench start &>> ~/frappe-bench/bench_start.log &
|
|
||||||
CI=Yes bench build --app frappe &
|
|
||||||
bench --site test_site reinstall --yes
|
|
||||||
17
.github/helper/site_config_mariadb.json
vendored
17
.github/helper/site_config_mariadb.json
vendored
@@ -1,17 +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",
|
|
||||||
"use_mysqlclient": 1,
|
|
||||||
"root_login": "root",
|
|
||||||
"root_password": "root",
|
|
||||||
"host_name": "http://test_site:8000",
|
|
||||||
"install_apps": ["payments", "erpnext"],
|
|
||||||
"throttle_user_limit": 100
|
|
||||||
}
|
|
||||||
18
.github/helper/site_config_postgres.json
vendored
18
.github/helper/site_config_postgres.json
vendored
@@ -1,18 +0,0 @@
|
|||||||
{
|
|
||||||
"db_host": "127.0.0.1",
|
|
||||||
"db_port": 5432,
|
|
||||||
"db_name": "test_frappe",
|
|
||||||
"db_password": "test_frappe",
|
|
||||||
"db_type": "postgres",
|
|
||||||
"allow_tests": true,
|
|
||||||
"auto_email_id": "test@example.com",
|
|
||||||
"mail_server": "smtp.example.com",
|
|
||||||
"mail_login": "test@example.com",
|
|
||||||
"mail_password": "test",
|
|
||||||
"admin_password": "admin",
|
|
||||||
"root_login": "postgres",
|
|
||||||
"root_password": "travis",
|
|
||||||
"host_name": "http://test_site:8000",
|
|
||||||
"install_apps": ["erpnext"],
|
|
||||||
"throttle_user_limit": 100
|
|
||||||
}
|
|
||||||
68
.github/helper/translation.py
vendored
68
.github/helper/translation.py
vendored
@@ -1,68 +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) 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!")
|
|
||||||
40
.github/helper/update_pot_file.sh
vendored
40
.github/helper/update_pot_file.sh
vendored
@@ -1,40 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
set -e
|
|
||||||
cd ~ || exit
|
|
||||||
|
|
||||||
echo "Setting Up Bench..."
|
|
||||||
|
|
||||||
pip install frappe-bench
|
|
||||||
bench -v init frappe-bench --skip-assets --skip-redis-config-generation --python "$(which python)"
|
|
||||||
cd ./frappe-bench || exit
|
|
||||||
|
|
||||||
echo "Get ERPNext..."
|
|
||||||
bench get-app --skip-assets erpnext "${GITHUB_WORKSPACE}"
|
|
||||||
|
|
||||||
echo "Generating POT file..."
|
|
||||||
bench generate-pot-file --app erpnext
|
|
||||||
|
|
||||||
cd ./apps/erpnext || exit
|
|
||||||
|
|
||||||
echo "Configuring git user..."
|
|
||||||
git config user.email "developers@erpnext.com"
|
|
||||||
git config user.name "frappe-pr-bot"
|
|
||||||
|
|
||||||
echo "Setting the correct git remote..."
|
|
||||||
# Here, the git remote is a local file path by default. Let's change it to the upstream repo.
|
|
||||||
git remote set-url upstream https://github.com/frappe/erpnext.git
|
|
||||||
|
|
||||||
echo "Creating a new branch..."
|
|
||||||
isodate=$(date -u +"%Y-%m-%d")
|
|
||||||
branch_name="pot_${BASE_BRANCH}_${isodate}"
|
|
||||||
git checkout -b "${branch_name}"
|
|
||||||
|
|
||||||
echo "Commiting changes..."
|
|
||||||
git add erpnext/locale/main.pot
|
|
||||||
git commit -m "chore: update POT file"
|
|
||||||
|
|
||||||
gh auth setup-git
|
|
||||||
git push -u upstream "${branch_name}"
|
|
||||||
|
|
||||||
echo "Creating a PR..."
|
|
||||||
gh pr create --fill --base "${BASE_BRANCH}" --head "${branch_name}" --reviewer ${PR_REVIEWER} -R frappe/erpnext
|
|
||||||
55
.github/labeler.yml
vendored
55
.github/labeler.yml
vendored
@@ -1,55 +0,0 @@
|
|||||||
accounts:
|
|
||||||
- erpnext/accounts/*
|
|
||||||
- erpnext/controllers/accounts_controller.py
|
|
||||||
- erpnext/controllers/taxes_and_totals.py
|
|
||||||
|
|
||||||
stock:
|
|
||||||
- erpnext/stock/*
|
|
||||||
- erpnext/controllers/stock_controller.py
|
|
||||||
- erpnext/controllers/item_variant.py
|
|
||||||
|
|
||||||
assets:
|
|
||||||
- erpnext/assets/*
|
|
||||||
|
|
||||||
regional:
|
|
||||||
- erpnext/regional/*
|
|
||||||
|
|
||||||
selling:
|
|
||||||
- erpnext/selling/*
|
|
||||||
- erpnext/controllers/selling_controller.py
|
|
||||||
|
|
||||||
buying:
|
|
||||||
- erpnext/buying/*
|
|
||||||
- erpnext/controllers/buying_controller.py
|
|
||||||
|
|
||||||
support:
|
|
||||||
- erpnext/support/*
|
|
||||||
|
|
||||||
POS:
|
|
||||||
- pos*
|
|
||||||
|
|
||||||
ecommerce:
|
|
||||||
- erpnext/e_commerce/*
|
|
||||||
|
|
||||||
maintenance:
|
|
||||||
- erpnext/maintenance/*
|
|
||||||
|
|
||||||
manufacturing:
|
|
||||||
- erpnext/manufacturing/*
|
|
||||||
|
|
||||||
crm:
|
|
||||||
- erpnext/crm/*
|
|
||||||
|
|
||||||
HR:
|
|
||||||
- erpnext/hr/*
|
|
||||||
|
|
||||||
payroll:
|
|
||||||
- erpnext/payroll*
|
|
||||||
|
|
||||||
projects:
|
|
||||||
- erpnext/projects/*
|
|
||||||
|
|
||||||
# Any python files modifed but no test files modified
|
|
||||||
needs-tests:
|
|
||||||
- any: ['erpnext/**/*.py']
|
|
||||||
all: ['!erpnext/**/test*.py']
|
|
||||||
4
.github/release.yml
vendored
4
.github/release.yml
vendored
@@ -1,4 +0,0 @@
|
|||||||
changelog:
|
|
||||||
exclude:
|
|
||||||
labels:
|
|
||||||
- skip-release-notes
|
|
||||||
35
.github/stale.yml
vendored
35
.github/stale.yml
vendored
@@ -1,35 +0,0 @@
|
|||||||
# Configuration for probot-stale - https://github.com/probot/stale
|
|
||||||
|
|
||||||
# Label to use when marking as stale
|
|
||||||
staleLabel: inactive
|
|
||||||
|
|
||||||
# Limit the number of actions per hour, from 1-30. Default is 30
|
|
||||||
limitPerRun: 10
|
|
||||||
|
|
||||||
# Set to true to ignore issues in a project (defaults to false)
|
|
||||||
exemptProjects: true
|
|
||||||
|
|
||||||
# Set to true to ignore issues in a milestone (defaults to false)
|
|
||||||
exemptMilestones: true
|
|
||||||
|
|
||||||
# Skip the stale action for draft PRs
|
|
||||||
exemptDraftPr: true
|
|
||||||
|
|
||||||
# Issues or Pull Requests with these labels will never be considered stale. Set to `[]` to disable
|
|
||||||
exemptLabels:
|
|
||||||
- hotfix
|
|
||||||
- no-stale
|
|
||||||
|
|
||||||
pulls:
|
|
||||||
daysUntilStale: 15
|
|
||||||
daysUntilClose: 3
|
|
||||||
exemptLabels:
|
|
||||||
- hotfix
|
|
||||||
markComment: >
|
|
||||||
This pull request has been automatically marked as inactive because it has
|
|
||||||
not had recent activity. It will be closed within 3 days 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.
|
|
||||||
|
|
||||||
only: pulls
|
|
||||||
32
.github/try-on-f-cloud-button.svg
vendored
32
.github/try-on-f-cloud-button.svg
vendored
@@ -1,32 +0,0 @@
|
|||||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="4 2 193 52">
|
|
||||||
<g filter="url(#filter0_dd)">
|
|
||||||
<rect x="4" y="2" width="193" height="52" rx="6" fill="#2490EF"/>
|
|
||||||
<path d="M28 22.2891H32.8786V35.5H36.2088V22.2891H41.0874V19.5H28V22.2891Z" fill="white"/>
|
|
||||||
<path d="M41.6982 35.5H45.0129V28.7109C45.0129 27.2344 46.0866 26.2188 47.5494 26.2188C48.0085 26.2188 48.6388 26.2969 48.95 26.3984V23.4453C48.6543 23.375 48.2419 23.3281 47.9074 23.3281C46.5691 23.3281 45.472 24.1094 45.0362 25.5938H44.9117V23.5H41.6982V35.5Z" fill="white"/>
|
|
||||||
<path d="M52.8331 40C55.2996 40 56.6068 38.7344 57.2837 36.7969L61.9289 23.5156L58.4197 23.5L55.9221 32.3125H55.7976L53.3233 23.5H49.8374L54.1247 35.8437L53.9302 36.3516C53.4944 37.4766 52.6619 37.5312 51.4947 37.1719L50.7478 39.6562C51.2224 39.8594 51.9927 40 52.8331 40Z" fill="white"/>
|
|
||||||
<path d="M73.6142 35.7344C77.2401 35.7344 79.4966 33.2422 79.4966 29.5469C79.4966 25.8281 77.2401 23.3438 73.6142 23.3438C69.9883 23.3438 67.7319 25.8281 67.7319 29.5469C67.7319 33.2422 69.9883 35.7344 73.6142 35.7344ZM73.6298 33.1562C71.9569 33.1562 71.101 31.6171 71.101 29.5233C71.101 27.4296 71.9569 25.8827 73.6298 25.8827C75.2715 25.8827 76.1274 27.4296 76.1274 29.5233C76.1274 31.6171 75.2715 33.1562 73.6298 33.1562Z" fill="white"/>
|
|
||||||
<path d="M84.7253 28.5625C84.7331 27.0156 85.6512 26.1094 86.9895 26.1094C88.3201 26.1094 89.1215 26.9844 89.1137 28.4531V35.5H92.4284V27.8594C92.4284 25.0625 90.7945 23.3438 88.3046 23.3438C86.5306 23.3438 85.2466 24.2187 84.7097 25.6172H84.5697V23.5H81.4106V35.5H84.7253V28.5625Z" fill="white"/>
|
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M102.429 19.5H113.429V22.3141H102.429V19.5ZM102.429 35.5V26.6794H112.699V29.4982H105.94V35.5H102.429Z" fill="white"/>
|
|
||||||
<path d="M131.584 24.9625C131.09 21.5057 128.345 19.5 124.785 19.5C120.589 19.5 117.429 22.463 117.429 27.4924C117.429 32.5142 120.55 35.4848 124.785 35.4848C128.604 35.4848 131.137 33.0916 131.584 30.1211L128.651 30.1059C128.282 31.9293 126.745 32.9549 124.824 32.9549C122.22 32.9549 120.354 31.0632 120.354 27.4924C120.354 23.9824 122.204 22.0299 124.832 22.0299C126.784 22.0299 128.314 23.1011 128.651 24.9625H131.584Z" fill="white"/>
|
|
||||||
<path d="M136.409 19.7124H133.571V35.2718H136.409V19.7124Z" fill="white"/>
|
|
||||||
<path d="M144.031 35.5001C147.56 35.5001 149.803 33.0917 149.803 29.483C149.803 25.8667 147.56 23.4507 144.031 23.4507C140.502 23.4507 138.259 25.8667 138.259 29.483C138.259 33.0917 140.502 35.5001 144.031 35.5001ZM144.047 33.2969C142.094 33.2969 141.137 31.6103 141.137 29.4754C141.137 27.3406 142.094 25.6312 144.047 25.6312C145.968 25.6312 146.925 27.3406 146.925 29.4754C146.925 31.6103 145.968 33.2969 144.047 33.2969Z" fill="white"/>
|
|
||||||
<path d="M159.338 30.3641C159.338 32.1419 158.028 33.0232 156.773 33.0232C155.409 33.0232 154.499 32.0887 154.499 30.6072V23.6025H151.66V31.0327C151.66 33.8361 153.307 35.4239 155.675 35.4239C157.479 35.4239 158.749 34.5046 159.298 33.1979H159.424V35.272H162.176V23.6025H159.338V30.3641Z" fill="white"/>
|
|
||||||
<path d="M169.014 35.4769C171.084 35.4769 172.017 34.2841 172.464 33.4332H172.637V35.2718H175.429V19.7124H172.582V25.532H172.464C172.033 24.6887 171.147 23.4503 169.022 23.4503C166.238 23.4503 164.05 25.5624 164.05 29.4522C164.05 33.2965 166.175 35.4769 169.014 35.4769ZM169.806 33.2205C167.931 33.2205 166.943 31.6251 166.943 29.437C166.943 27.2642 167.916 25.7067 169.806 25.7067C171.633 25.7067 172.637 27.173 172.637 29.437C172.637 31.701 171.617 33.2205 169.806 33.2205Z" fill="white"/>
|
|
||||||
</g>
|
|
||||||
<defs>
|
|
||||||
<filter id="filter0_dd" x="0" y="0" width="201" height="60" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
|
||||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
|
||||||
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
|
|
||||||
<feOffset/>
|
|
||||||
<feGaussianBlur stdDeviation="0.25"/>
|
|
||||||
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.5 0"/>
|
|
||||||
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow"/>
|
|
||||||
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
|
|
||||||
<feOffset dy="2"/>
|
|
||||||
<feGaussianBlur stdDeviation="2"/>
|
|
||||||
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.13 0"/>
|
|
||||||
<feBlend mode="normal" in2="effect1_dropShadow" result="effect2_dropShadow"/>
|
|
||||||
<feBlend mode="normal" in="SourceGraphic" in2="effect2_dropShadow" result="shape"/>
|
|
||||||
</filter>
|
|
||||||
</defs>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 4.3 KiB |
29
.github/workflows/backport.yml
vendored
29
.github/workflows/backport.yml
vendored
@@ -1,29 +0,0 @@
|
|||||||
name: Backport
|
|
||||||
on:
|
|
||||||
pull_request_target:
|
|
||||||
types:
|
|
||||||
- closed
|
|
||||||
- labeled
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
main:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
timeout-minutes: 60
|
|
||||||
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.RELEASE_TOKEN}}
|
|
||||||
labelsToAdd: "backport"
|
|
||||||
title: "{{originalTitle}}"
|
|
||||||
18
.github/workflows/docker-release.yml
vendored
18
.github/workflows/docker-release.yml
vendored
@@ -1,18 +0,0 @@
|
|||||||
name: Trigger Docker build on release
|
|
||||||
on:
|
|
||||||
release:
|
|
||||||
types: [released]
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
curl:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
container:
|
|
||||||
image: alpine:latest
|
|
||||||
steps:
|
|
||||||
- name: curl
|
|
||||||
run: |
|
|
||||||
apk add curl bash
|
|
||||||
curl -X POST -H "Accept: application/vnd.github.v3+json" -H "Authorization: Bearer ${{ secrets.CI_PAT }}" https://api.github.com/repos/frappe/frappe_docker/actions/workflows/build_stable.yml/dispatches -d '{"ref":"main"}'
|
|
||||||
28
.github/workflows/docs-checker.yml
vendored
28
.github/workflows/docs-checker.yml
vendored
@@ -1,28 +0,0 @@
|
|||||||
name: 'Documentation Required'
|
|
||||||
on:
|
|
||||||
pull_request:
|
|
||||||
types: [ opened, synchronize, reopened, edited ]
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
timeout-minutes: 10
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: 'Setup Environment'
|
|
||||||
uses: actions/setup-python@v2
|
|
||||||
with:
|
|
||||||
python-version: '3.10'
|
|
||||||
|
|
||||||
- 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
|
|
||||||
39
.github/workflows/generate-pot-file.yml
vendored
39
.github/workflows/generate-pot-file.yml
vendored
@@ -1,39 +0,0 @@
|
|||||||
# This workflow is agnostic to branches. Only maintain on develop branch.
|
|
||||||
# To add/remove branches just modify the matrix.
|
|
||||||
|
|
||||||
name: Regenerate POT file (translatable strings)
|
|
||||||
on:
|
|
||||||
schedule:
|
|
||||||
# 9:30 UTC => 3 PM IST Sunday
|
|
||||||
- cron: "30 9 * * 0"
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
regenerate-pot-file:
|
|
||||||
name: Regenerate POT file
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
branch: ["develop"]
|
|
||||||
permissions:
|
|
||||||
contents: write
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
with:
|
|
||||||
ref: ${{ matrix.branch }}
|
|
||||||
|
|
||||||
- name: Setup Python
|
|
||||||
uses: actions/setup-python@v5
|
|
||||||
with:
|
|
||||||
python-version: "3.12"
|
|
||||||
|
|
||||||
- name: Run script to update POT file
|
|
||||||
run: |
|
|
||||||
bash ${GITHUB_WORKSPACE}/.github/helper/update_pot_file.sh
|
|
||||||
env:
|
|
||||||
GH_TOKEN: ${{ secrets.RELEASE_TOKEN }}
|
|
||||||
BASE_BRANCH: ${{ matrix.branch }}
|
|
||||||
PR_REVIEWER: barredterra # change to your GitHub username if you copied this file
|
|
||||||
36
.github/workflows/initiate_release.yml
vendored
36
.github/workflows/initiate_release.yml
vendored
@@ -1,36 +0,0 @@
|
|||||||
# This workflow is agnostic to branches. Only maintain on develop branch.
|
|
||||||
# To add/remove versions just modify the matrix.
|
|
||||||
|
|
||||||
name: Create weekly release pull requests
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
|
|
||||||
on:
|
|
||||||
schedule:
|
|
||||||
# 9:30 UTC => 3 PM IST Tuesday
|
|
||||||
- cron: "30 9 * * 2"
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
stable-release:
|
|
||||||
name: Release
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
version: ["14", "15"]
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- uses: octokit/request-action@v2.x
|
|
||||||
with:
|
|
||||||
route: POST /repos/{owner}/{repo}/pulls
|
|
||||||
owner: frappe
|
|
||||||
repo: erpnext
|
|
||||||
title: |-
|
|
||||||
"chore: release v${{ matrix.version }}"
|
|
||||||
body: "Automated weekly release."
|
|
||||||
base: version-${{ matrix.version }}
|
|
||||||
head: version-${{ matrix.version }}-hotfix
|
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: ${{ secrets.RELEASE_TOKEN }}
|
|
||||||
30
.github/workflows/label-base-on-title.yml
vendored
30
.github/workflows/label-base-on-title.yml
vendored
@@ -1,30 +0,0 @@
|
|||||||
name: "Auto-label PRs based on title"
|
|
||||||
|
|
||||||
on:
|
|
||||||
pull_request_target:
|
|
||||||
types: [opened, reopened]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
add-label-if-prefix-matches:
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
pull-requests: write
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Check PR title and add label if it matches prefixes
|
|
||||||
uses: actions/github-script@v7
|
|
||||||
continue-on-error: true
|
|
||||||
with:
|
|
||||||
script: |
|
|
||||||
const title = context.payload.pull_request.title.toLowerCase();
|
|
||||||
const prefixes = ['chore', 'ci', 'style', 'test', 'refactor'];
|
|
||||||
|
|
||||||
// Check if the PR title starts with any of the prefixes
|
|
||||||
if (prefixes.some(prefix => title.startsWith(prefix))) {
|
|
||||||
await github.rest.issues.addLabels({
|
|
||||||
owner: context.repo.owner,
|
|
||||||
repo: context.repo.repo,
|
|
||||||
issue_number: context.payload.pull_request.number,
|
|
||||||
labels: ['skip-release-notes']
|
|
||||||
});
|
|
||||||
}
|
|
||||||
16
.github/workflows/labeller.yml
vendored
16
.github/workflows/labeller.yml
vendored
@@ -1,16 +0,0 @@
|
|||||||
name: "Pull Request Labeler"
|
|
||||||
on:
|
|
||||||
pull_request_target:
|
|
||||||
types: [opened, reopened]
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
issues: write
|
|
||||||
pull-requests: write
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
triage:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/labeler@v3
|
|
||||||
with:
|
|
||||||
repo-token: "${{ secrets.GITHUB_TOKEN }}"
|
|
||||||
45
.github/workflows/linters.yml
vendored
45
.github/workflows/linters.yml
vendored
@@ -1,45 +0,0 @@
|
|||||||
name: Linters
|
|
||||||
|
|
||||||
on:
|
|
||||||
pull_request: { }
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
|
|
||||||
linters:
|
|
||||||
name: linters
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
|
|
||||||
- name: Set up Python 3.10
|
|
||||||
uses: actions/setup-python@v4
|
|
||||||
with:
|
|
||||||
python-version: '3.10'
|
|
||||||
cache: pip
|
|
||||||
|
|
||||||
- name: Install and Run Pre-commit
|
|
||||||
uses: pre-commit/action@v3.0.0
|
|
||||||
|
|
||||||
semgrep:
|
|
||||||
name: semgrep
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
|
|
||||||
- name: Set up Python 3.10
|
|
||||||
uses: actions/setup-python@v4
|
|
||||||
with:
|
|
||||||
python-version: '3.10'
|
|
||||||
cache: pip
|
|
||||||
|
|
||||||
- name: Download Semgrep rules
|
|
||||||
run: git clone --depth 1 https://github.com/frappe/semgrep-rules.git frappe-semgrep-rules
|
|
||||||
|
|
||||||
- name: Download semgrep
|
|
||||||
run: pip install semgrep
|
|
||||||
|
|
||||||
- name: Run Semgrep rules
|
|
||||||
run: semgrep ci --config ./frappe-semgrep-rules/rules --config r/python.lang.correctness
|
|
||||||
21
.github/workflows/lock.yml
vendored
21
.github/workflows/lock.yml
vendored
@@ -1,21 +0,0 @@
|
|||||||
name: 'Lock threads'
|
|
||||||
|
|
||||||
on:
|
|
||||||
schedule:
|
|
||||||
- cron: '0 0 * * *'
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
issues: write
|
|
||||||
pull-requests: write
|
|
||||||
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
lock:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: dessant/lock-threads@v5
|
|
||||||
with:
|
|
||||||
github-token: ${{ github.token }}
|
|
||||||
issue-inactive-days: 14
|
|
||||||
pr-inactive-days: 14
|
|
||||||
164
.github/workflows/patch.yml
vendored
164
.github/workflows/patch.yml
vendored
@@ -1,164 +0,0 @@
|
|||||||
name: Patch
|
|
||||||
|
|
||||||
on:
|
|
||||||
pull_request:
|
|
||||||
paths-ignore:
|
|
||||||
- '**.js'
|
|
||||||
- '**.css'
|
|
||||||
- '**.md'
|
|
||||||
- '**.html'
|
|
||||||
- '**.csv'
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
|
|
||||||
concurrency:
|
|
||||||
group: patch-develop-${{ github.event_name }}-${{ github.event.number || github.event_name == 'workflow_dispatch' && github.run_id || '' }}
|
|
||||||
cancel-in-progress: true
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
test:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
timeout-minutes: 60
|
|
||||||
|
|
||||||
name: Patch Test
|
|
||||||
|
|
||||||
services:
|
|
||||||
mysql:
|
|
||||||
image: mariadb:10.6
|
|
||||||
env:
|
|
||||||
MARIADB_ROOT_PASSWORD: 'root'
|
|
||||||
ports:
|
|
||||||
- 3306:3306
|
|
||||||
options: --health-cmd="mariadb-admin ping" --health-interval=5s --health-timeout=2s --health-retries=3
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Clone
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Check for valid Python & Merge Conflicts
|
|
||||||
run: |
|
|
||||||
python -m compileall -fq "${GITHUB_WORKSPACE}"
|
|
||||||
if grep -lr --exclude-dir=node_modules "^<<<<<<< " "${GITHUB_WORKSPACE}"
|
|
||||||
then echo "Found merge conflicts"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: Setup Python
|
|
||||||
uses: actions/setup-python@v5
|
|
||||||
with:
|
|
||||||
python-version: '3.11'
|
|
||||||
|
|
||||||
- name: Setup Node
|
|
||||||
uses: actions/setup-node@v4
|
|
||||||
with:
|
|
||||||
node-version: 18
|
|
||||||
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@v4
|
|
||||||
with:
|
|
||||||
path: ~/.cache/pip
|
|
||||||
key: ${{ runner.os }}-pip-${{ hashFiles('**/*requirements.txt', '**/pyproject.toml') }}
|
|
||||||
restore-keys: |
|
|
||||||
${{ runner.os }}-pip-
|
|
||||||
${{ runner.os }}-
|
|
||||||
|
|
||||||
- name: Cache node modules
|
|
||||||
uses: actions/cache@v4
|
|
||||||
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@v4
|
|
||||||
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: |
|
|
||||||
pip install frappe-bench
|
|
||||||
bash ${GITHUB_WORKSPACE}/.github/helper/install.sh
|
|
||||||
env:
|
|
||||||
DB: mariadb
|
|
||||||
TYPE: server
|
|
||||||
|
|
||||||
- name: Run Patch Tests
|
|
||||||
run: |
|
|
||||||
cd ~/frappe-bench/
|
|
||||||
bench remove-app payments --force
|
|
||||||
jq 'del(.install_apps)' ~/frappe-bench/sites/test_site/site_config.json > tmp.json
|
|
||||||
mv tmp.json ~/frappe-bench/sites/test_site/site_config.json
|
|
||||||
|
|
||||||
wget https://erpnext.com/files/v13-erpnext.sql.gz
|
|
||||||
bench --site test_site --force restore ~/frappe-bench/v13-erpnext.sql.gz
|
|
||||||
|
|
||||||
git -C "apps/frappe" remote set-url upstream https://github.com/frappe/frappe.git
|
|
||||||
git -C "apps/erpnext" remote set-url upstream https://github.com/frappe/erpnext.git
|
|
||||||
|
|
||||||
|
|
||||||
function update_to_version() {
|
|
||||||
version=$1
|
|
||||||
|
|
||||||
branch_name="version-$version-hotfix"
|
|
||||||
echo "Updating to v$version"
|
|
||||||
|
|
||||||
# Fetch and checkout branches
|
|
||||||
git -C "apps/frappe" fetch --depth 1 upstream $branch_name:$branch_name
|
|
||||||
git -C "apps/erpnext" fetch --depth 1 upstream $branch_name:$branch_name
|
|
||||||
git -C "apps/frappe" checkout -q -f $branch_name
|
|
||||||
git -C "apps/erpnext" checkout -q -f $branch_name
|
|
||||||
|
|
||||||
# Resetup env and install apps
|
|
||||||
pgrep honcho | xargs kill
|
|
||||||
rm -rf ~/frappe-bench/env
|
|
||||||
bench -v setup env
|
|
||||||
bench pip install -e ./apps/erpnext
|
|
||||||
bench start &>> ~/frappe-bench/bench_start.log &
|
|
||||||
|
|
||||||
bench --site test_site migrate
|
|
||||||
}
|
|
||||||
|
|
||||||
update_to_version 14
|
|
||||||
update_to_version 15
|
|
||||||
|
|
||||||
echo "Updating to latest version"
|
|
||||||
git -C "apps/frappe" fetch --depth 1 upstream "${GITHUB_BASE_REF:-${GITHUB_REF##*/}}"
|
|
||||||
git -C "apps/frappe" checkout -q -f FETCH_HEAD
|
|
||||||
git -C "apps/erpnext" checkout -q -f "$GITHUB_SHA"
|
|
||||||
|
|
||||||
pgrep honcho | xargs kill
|
|
||||||
rm -rf ~/frappe-bench/env
|
|
||||||
bench -v setup env
|
|
||||||
bench pip install -e ./apps/erpnext
|
|
||||||
bench start &>> ~/frappe-bench/bench_start.log &
|
|
||||||
|
|
||||||
bench --site test_site migrate
|
|
||||||
|
|
||||||
- name: Show bench output
|
|
||||||
if: ${{ always() }}
|
|
||||||
run: |
|
|
||||||
cd ~/frappe-bench
|
|
||||||
cat bench_start.log || true
|
|
||||||
cd logs
|
|
||||||
for f in ./*.log*; do
|
|
||||||
echo "Printing log: $f";
|
|
||||||
cat $f
|
|
||||||
done
|
|
||||||
25
.github/workflows/patch_faux.yml
vendored
25
.github/workflows/patch_faux.yml
vendored
@@ -1,25 +0,0 @@
|
|||||||
# Tests are skipped for these files but github doesn't allow "passing" hence this is required.
|
|
||||||
|
|
||||||
name: Skipped Patch Test
|
|
||||||
|
|
||||||
on:
|
|
||||||
pull_request:
|
|
||||||
paths:
|
|
||||||
- "**.js"
|
|
||||||
- "**.css"
|
|
||||||
- "**.md"
|
|
||||||
- "**.html"
|
|
||||||
- "**.csv"
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
test:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
name: Patch Test
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Pass skipped tests unconditionally
|
|
||||||
run: "echo Skipped"
|
|
||||||
35
.github/workflows/release.yml
vendored
35
.github/workflows/release.yml
vendored
@@ -1,35 +0,0 @@
|
|||||||
name: Generate Semantic Release
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- version-13
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
release:
|
|
||||||
name: Release
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Checkout Entire Repository
|
|
||||||
uses: actions/checkout@v2
|
|
||||||
with:
|
|
||||||
fetch-depth: 0
|
|
||||||
persist-credentials: false
|
|
||||||
- name: Setup Node.js
|
|
||||||
uses: actions/setup-node@v2
|
|
||||||
with:
|
|
||||||
node-version: 20
|
|
||||||
- name: Setup dependencies
|
|
||||||
run: |
|
|
||||||
npm install @semantic-release/git @semantic-release/exec --no-save
|
|
||||||
- name: Create Release
|
|
||||||
env:
|
|
||||||
GH_TOKEN: ${{ secrets.RELEASE_TOKEN }}
|
|
||||||
GITHUB_TOKEN: ${{ secrets.RELEASE_TOKEN }}
|
|
||||||
GIT_AUTHOR_NAME: "Frappe PR Bot"
|
|
||||||
GIT_AUTHOR_EMAIL: "developers@frappe.io"
|
|
||||||
GIT_COMMITTER_NAME: "Frappe PR Bot"
|
|
||||||
GIT_COMMITTER_EMAIL: "developers@frappe.io"
|
|
||||||
run: npx semantic-release
|
|
||||||
42
.github/workflows/release_notes.yml
vendored
42
.github/workflows/release_notes.yml
vendored
@@ -1,42 +0,0 @@
|
|||||||
# This action:
|
|
||||||
#
|
|
||||||
# 1. Generates release notes using github API.
|
|
||||||
# 2. Strips unnecessary info like chore/style etc from notes.
|
|
||||||
# 3. Updates release info.
|
|
||||||
|
|
||||||
# This action needs to be maintained on all branches that do releases.
|
|
||||||
|
|
||||||
name: 'Release Notes'
|
|
||||||
|
|
||||||
on:
|
|
||||||
workflow_dispatch:
|
|
||||||
inputs:
|
|
||||||
tag_name:
|
|
||||||
description: 'Tag of release like v13.0.0'
|
|
||||||
required: true
|
|
||||||
type: string
|
|
||||||
release:
|
|
||||||
types: [released]
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
regen-notes:
|
|
||||||
name: 'Regenerate release notes'
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Update notes
|
|
||||||
run: |
|
|
||||||
NEW_NOTES=$(gh api --method POST -H "Accept: application/vnd.github+json" /repos/frappe/erpnext/releases/generate-notes -f tag_name=$RELEASE_TAG \
|
|
||||||
| jq -r '.body' \
|
|
||||||
| sed -E '/^\* (chore|ci|test|docs|style)/d' \
|
|
||||||
| sed -E 's/by @mergify //'
|
|
||||||
)
|
|
||||||
RELEASE_ID=$(gh api -H "Accept: application/vnd.github+json" /repos/frappe/erpnext/releases/tags/$RELEASE_TAG | jq -r '.id')
|
|
||||||
gh api --method PATCH -H "Accept: application/vnd.github+json" /repos/frappe/erpnext/releases/$RELEASE_ID -f body="$NEW_NOTES"
|
|
||||||
|
|
||||||
env:
|
|
||||||
GH_TOKEN: ${{ secrets.RELEASE_TOKEN }}
|
|
||||||
RELEASE_TAG: ${{ github.event.inputs.tag_name || github.event.release.tag_name }}
|
|
||||||
133
.github/workflows/run-indinvidual-tests.yml
vendored
133
.github/workflows/run-indinvidual-tests.yml
vendored
@@ -1,133 +0,0 @@
|
|||||||
name: Individual
|
|
||||||
|
|
||||||
on:
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
concurrency:
|
|
||||||
group: server-individual-tests-develop-${{ github.event_name }}-${{ github.event.number || github.event_name == 'workflow_dispatch' && github.run_id || '' }}
|
|
||||||
cancel-in-progress: false
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
discover:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
outputs:
|
|
||||||
matrix: ${{ steps.set-matrix.outputs.matrix }}
|
|
||||||
steps:
|
|
||||||
- name: Clone
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
- id: set-matrix
|
|
||||||
run: |
|
|
||||||
# Use grep and find to get the list of test files
|
|
||||||
matrix=$(find . -path '*/doctype/*/test_*.py' | xargs grep -l 'def test_' | awk '{
|
|
||||||
# Remove ./ prefix, file extension, and replace / with .
|
|
||||||
gsub(/^\.\//, "", $0)
|
|
||||||
gsub(/\.py$/, "", $0)
|
|
||||||
gsub(/\//, ".", $0)
|
|
||||||
# Add to array
|
|
||||||
tests[NR] = $0
|
|
||||||
}
|
|
||||||
END {
|
|
||||||
# Start JSON array
|
|
||||||
printf "{\n \"include\": [\n"
|
|
||||||
# Loop through array and create JSON objects
|
|
||||||
for (i=1; i<=NR; i++) {
|
|
||||||
printf " {\"test\": \"%s\"}", tests[i]
|
|
||||||
if (i < NR) printf ","
|
|
||||||
printf "\n"
|
|
||||||
}
|
|
||||||
# Close JSON array
|
|
||||||
printf " ]\n}"
|
|
||||||
}')
|
|
||||||
|
|
||||||
# Output the matrix
|
|
||||||
echo "matrix=$(echo "$matrix" | jq -c)" >> $GITHUB_OUTPUT
|
|
||||||
|
|
||||||
# For debugging (optional)
|
|
||||||
echo "Generated matrix:"
|
|
||||||
echo "$matrix"
|
|
||||||
test:
|
|
||||||
needs: discover
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
timeout-minutes: 60
|
|
||||||
env:
|
|
||||||
NODE_ENV: "production"
|
|
||||||
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix: ${{fromJson(needs.discover.outputs.matrix)}}
|
|
||||||
|
|
||||||
name: Test
|
|
||||||
|
|
||||||
services:
|
|
||||||
mysql:
|
|
||||||
image: mariadb:10.6
|
|
||||||
env:
|
|
||||||
MARIADB_ROOT_PASSWORD: 'root'
|
|
||||||
ports:
|
|
||||||
- 3306:3306
|
|
||||||
options: --health-cmd="mariadb-admin ping" --health-interval=5s --health-timeout=2s --health-retries=3
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Clone
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Setup Python
|
|
||||||
uses: actions/setup-python@v5
|
|
||||||
with:
|
|
||||||
python-version: '3.12'
|
|
||||||
|
|
||||||
- name: Setup Node
|
|
||||||
uses: actions/setup-node@v4
|
|
||||||
with:
|
|
||||||
node-version: 18
|
|
||||||
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@v4
|
|
||||||
with:
|
|
||||||
path: ~/.cache/pip
|
|
||||||
key: ${{ runner.os }}-pip-${{ hashFiles('**/*requirements.txt', '**/pyproject.toml') }}
|
|
||||||
restore-keys: |
|
|
||||||
${{ runner.os }}-pip-
|
|
||||||
${{ runner.os }}-
|
|
||||||
|
|
||||||
- name: Cache node modules
|
|
||||||
uses: actions/cache@v4
|
|
||||||
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@v4
|
|
||||||
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
|
|
||||||
env:
|
|
||||||
DB: mariadb
|
|
||||||
TYPE: server
|
|
||||||
FRAPPE_USER: ${{ github.event.inputs.user }}
|
|
||||||
FRAPPE_BRANCH: ${{ github.event.inputs.branch }}
|
|
||||||
|
|
||||||
- name: Run Tests
|
|
||||||
run: 'cd ~/frappe-bench/ && bench --site test_site run-tests --app erpnext --module ${{ matrix.test }}'
|
|
||||||
30
.github/workflows/semantic-commits.yml
vendored
30
.github/workflows/semantic-commits.yml
vendored
@@ -1,30 +0,0 @@
|
|||||||
name: Semantic Commits
|
|
||||||
|
|
||||||
on:
|
|
||||||
pull_request: {}
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
|
|
||||||
concurrency:
|
|
||||||
group: commitcheck-erpnext-${{ github.event.number }}
|
|
||||||
cancel-in-progress: true
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
commitlint:
|
|
||||||
name: Check Commit Titles
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
with:
|
|
||||||
fetch-depth: 200
|
|
||||||
|
|
||||||
- uses: actions/setup-node@v3
|
|
||||||
with:
|
|
||||||
node-version: 18
|
|
||||||
check-latest: true
|
|
||||||
|
|
||||||
- name: Check commit titles
|
|
||||||
run: |
|
|
||||||
npm install @commitlint/cli @commitlint/config-conventional
|
|
||||||
npx commitlint --verbose --from ${{ github.event.pull_request.base.sha }} --to ${{ github.event.pull_request.head.sha }}
|
|
||||||
27
.github/workflows/server-tests-mariadb-faux.yml
vendored
27
.github/workflows/server-tests-mariadb-faux.yml
vendored
@@ -1,27 +0,0 @@
|
|||||||
# Tests are skipped for these files but github doesn't allow "passing" hence this is required.
|
|
||||||
|
|
||||||
name: Skipped Tests
|
|
||||||
|
|
||||||
on:
|
|
||||||
pull_request:
|
|
||||||
paths:
|
|
||||||
- "**.js"
|
|
||||||
- "**.css"
|
|
||||||
- "**.md"
|
|
||||||
- "**.html"
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
test:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
container: [1, 2, 3, 4]
|
|
||||||
|
|
||||||
name: Python Unit Tests
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Pass skipped tests unconditionally
|
|
||||||
run: "echo Skipped"
|
|
||||||
163
.github/workflows/server-tests-mariadb.yml
vendored
163
.github/workflows/server-tests-mariadb.yml
vendored
@@ -1,163 +0,0 @@
|
|||||||
name: Server (Mariadb)
|
|
||||||
|
|
||||||
on:
|
|
||||||
repository_dispatch:
|
|
||||||
types: [frappe-framework-change]
|
|
||||||
pull_request:
|
|
||||||
paths-ignore:
|
|
||||||
- '**.js'
|
|
||||||
- '**.css'
|
|
||||||
- '**.md'
|
|
||||||
- '**.html'
|
|
||||||
schedule:
|
|
||||||
# Run everday at midnight UTC / 5:30 IST
|
|
||||||
- cron: "0 0 * * *"
|
|
||||||
workflow_dispatch:
|
|
||||||
inputs:
|
|
||||||
user:
|
|
||||||
description: 'Frappe Framework repository user (add your username for forks)'
|
|
||||||
required: true
|
|
||||||
default: 'frappe'
|
|
||||||
type: string
|
|
||||||
branch:
|
|
||||||
description: 'Frappe Framework branch'
|
|
||||||
default: 'develop'
|
|
||||||
required: false
|
|
||||||
type: string
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
|
|
||||||
concurrency:
|
|
||||||
group: server-mariadb-develop-${{ github.event_name }}-${{ github.event.number || github.event_name == 'workflow_dispatch' && github.run_id || '' }}
|
|
||||||
cancel-in-progress: true
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
test:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
timeout-minutes: 60
|
|
||||||
env:
|
|
||||||
NODE_ENV: "production"
|
|
||||||
WITH_COVERAGE: ${{ github.event_name != 'pull_request' }}
|
|
||||||
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
|
|
||||||
matrix:
|
|
||||||
container: [1, 2, 3, 4]
|
|
||||||
|
|
||||||
name: Python Unit Tests
|
|
||||||
|
|
||||||
services:
|
|
||||||
mysql:
|
|
||||||
image: mariadb:10.6
|
|
||||||
env:
|
|
||||||
MARIADB_ROOT_PASSWORD: 'root'
|
|
||||||
ports:
|
|
||||||
- 3306:3306
|
|
||||||
options: --health-cmd="mariadb-admin ping" --health-interval=5s --health-timeout=2s --health-retries=3
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Clone
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Setup Python
|
|
||||||
uses: actions/setup-python@v5
|
|
||||||
with:
|
|
||||||
python-version: '3.12'
|
|
||||||
|
|
||||||
- name: Check for valid Python & Merge Conflicts
|
|
||||||
run: |
|
|
||||||
python -m compileall -fq "${GITHUB_WORKSPACE}"
|
|
||||||
if grep -lr --exclude-dir=node_modules "^<<<<<<< " "${GITHUB_WORKSPACE}"
|
|
||||||
then echo "Found merge conflicts"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: Setup Node
|
|
||||||
uses: actions/setup-node@v4
|
|
||||||
with:
|
|
||||||
node-version: 18
|
|
||||||
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@v4
|
|
||||||
with:
|
|
||||||
path: ~/.cache/pip
|
|
||||||
key: ${{ runner.os }}-pip-${{ hashFiles('**/*requirements.txt', '**/pyproject.toml') }}
|
|
||||||
restore-keys: |
|
|
||||||
${{ runner.os }}-pip-
|
|
||||||
${{ runner.os }}-
|
|
||||||
|
|
||||||
- name: Cache node modules
|
|
||||||
uses: actions/cache@v4
|
|
||||||
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@v4
|
|
||||||
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
|
|
||||||
env:
|
|
||||||
DB: mariadb
|
|
||||||
TYPE: server
|
|
||||||
FRAPPE_USER: ${{ github.event.inputs.user }}
|
|
||||||
FRAPPE_BRANCH: ${{ github.event.client_payload.sha || github.event.inputs.branch }}
|
|
||||||
|
|
||||||
- name: Run Tests
|
|
||||||
run: 'cd ~/frappe-bench/ && bench --site test_site run-parallel-tests --app erpnext --total-builds ${{ strategy.job-total }} --build-number ${{ matrix.container }}'
|
|
||||||
env:
|
|
||||||
TYPE: server
|
|
||||||
CAPTURE_COVERAGE: ${{ github.event_name != 'pull_request' }}
|
|
||||||
|
|
||||||
|
|
||||||
- name: Show bench output
|
|
||||||
if: ${{ always() }}
|
|
||||||
run: cat ~/frappe-bench/bench_start.log || true
|
|
||||||
|
|
||||||
- name: Upload coverage data
|
|
||||||
uses: actions/upload-artifact@v4
|
|
||||||
if: github.event_name != 'pull_request'
|
|
||||||
with:
|
|
||||||
name: coverage-${{ matrix.container }}
|
|
||||||
path: /home/runner/frappe-bench/sites/coverage.xml
|
|
||||||
|
|
||||||
coverage:
|
|
||||||
name: Coverage Wrap Up
|
|
||||||
needs: test
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
if: ${{ github.event_name != 'pull_request' }}
|
|
||||||
steps:
|
|
||||||
- name: Clone
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Download artifacts
|
|
||||||
uses: actions/download-artifact@v4
|
|
||||||
|
|
||||||
- name: Upload coverage data
|
|
||||||
uses: codecov/codecov-action@v4
|
|
||||||
with:
|
|
||||||
name: MariaDB
|
|
||||||
token: ${{ secrets.CODECOV_TOKEN }}
|
|
||||||
fail_ci_if_error: true
|
|
||||||
verbose: true
|
|
||||||
115
.github/workflows/server-tests-postgres.yml
vendored
115
.github/workflows/server-tests-postgres.yml
vendored
@@ -1,115 +0,0 @@
|
|||||||
name: Server (Postgres)
|
|
||||||
|
|
||||||
on:
|
|
||||||
pull_request:
|
|
||||||
paths-ignore:
|
|
||||||
- '**.js'
|
|
||||||
- '**.md'
|
|
||||||
- '**.html'
|
|
||||||
types: [opened, labelled, synchronize, reopened]
|
|
||||||
|
|
||||||
concurrency:
|
|
||||||
group: server-postgres-develop-${{ github.event_name }}-${{ github.event.number || github.event_name == 'workflow_dispatch' && github.run_id || '' }}
|
|
||||||
cancel-in-progress: true
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
test:
|
|
||||||
if: ${{ contains(github.event.pull_request.labels.*.name, 'postgres') }}
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
timeout-minutes: 60
|
|
||||||
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
container: [1]
|
|
||||||
|
|
||||||
name: Python Unit Tests
|
|
||||||
|
|
||||||
services:
|
|
||||||
postgres:
|
|
||||||
image: postgres:13.3
|
|
||||||
env:
|
|
||||||
POSTGRES_PASSWORD: travis
|
|
||||||
options: >-
|
|
||||||
--health-cmd pg_isready
|
|
||||||
--health-interval 10s
|
|
||||||
--health-timeout 5s
|
|
||||||
--health-retries 5
|
|
||||||
ports:
|
|
||||||
- 5432:5432
|
|
||||||
|
|
||||||
steps:
|
|
||||||
|
|
||||||
- name: Clone
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Setup Python
|
|
||||||
uses: actions/setup-python@v5
|
|
||||||
with:
|
|
||||||
python-version: '3.12'
|
|
||||||
|
|
||||||
- name: Check for valid Python & Merge Conflicts
|
|
||||||
run: |
|
|
||||||
python -m compileall -fq "${GITHUB_WORKSPACE}"
|
|
||||||
if grep -lr --exclude-dir=node_modules "^<<<<<<< " "${GITHUB_WORKSPACE}"
|
|
||||||
then echo "Found merge conflicts"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: Setup Node
|
|
||||||
uses: actions/setup-node@v4
|
|
||||||
with:
|
|
||||||
node-version: 18
|
|
||||||
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@v4
|
|
||||||
with:
|
|
||||||
path: ~/.cache/pip
|
|
||||||
key: ${{ runner.os }}-pip-${{ hashFiles('**/*requirements.txt', '**/pyproject.toml') }}
|
|
||||||
restore-keys: |
|
|
||||||
${{ runner.os }}-pip-
|
|
||||||
${{ runner.os }}-
|
|
||||||
|
|
||||||
- name: Cache node modules
|
|
||||||
uses: actions/cache@v4
|
|
||||||
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@v4
|
|
||||||
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
|
|
||||||
env:
|
|
||||||
DB: postgres
|
|
||||||
TYPE: server
|
|
||||||
|
|
||||||
- name: Run Tests
|
|
||||||
run: cd ~/frappe-bench/ && bench --site test_site run-parallel-tests --app erpnext --use-orchestrator
|
|
||||||
env:
|
|
||||||
TYPE: server
|
|
||||||
CI_BUILD_ID: ${{ github.run_id }}
|
|
||||||
ORCHESTRATOR_URL: http://test-orchestrator.frappe.io
|
|
||||||
14
.gitignore
vendored
14
.gitignore
vendored
@@ -2,20 +2,8 @@
|
|||||||
*.py~
|
*.py~
|
||||||
.DS_Store
|
.DS_Store
|
||||||
conf.py
|
conf.py
|
||||||
|
locale
|
||||||
latest_updates.json
|
latest_updates.json
|
||||||
.wnf-lang-status
|
.wnf-lang-status
|
||||||
*.egg-info
|
*.egg-info
|
||||||
dist/
|
dist/
|
||||||
erpnext/public/dist
|
|
||||||
erpnext/docs/current
|
|
||||||
*.swp
|
|
||||||
*.swo
|
|
||||||
__pycache__
|
|
||||||
*~
|
|
||||||
.idea/
|
|
||||||
.vscode/
|
|
||||||
.helix/
|
|
||||||
node_modules/
|
|
||||||
.backportrc.json
|
|
||||||
# Aider AI Chat
|
|
||||||
.aider*
|
|
||||||
|
|||||||
85
.mergify.yml
85
.mergify.yml
@@ -1,85 +0,0 @@
|
|||||||
pull_request_rules:
|
|
||||||
- name: Auto-close PRs on stable branch
|
|
||||||
conditions:
|
|
||||||
- and:
|
|
||||||
- and:
|
|
||||||
- author!=surajshetty3416
|
|
||||||
- author!=gavindsouza
|
|
||||||
- author!=rohitwaghchaure
|
|
||||||
- author!=nabinhait
|
|
||||||
- author!=ankush
|
|
||||||
- author!=deepeshgarg007
|
|
||||||
- author!=frappe-pr-bot
|
|
||||||
- author!=mergify[bot]
|
|
||||||
- or:
|
|
||||||
- base=version-13
|
|
||||||
- base=version-12
|
|
||||||
- base=version-14
|
|
||||||
- base=version-15
|
|
||||||
- base=version-16
|
|
||||||
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 develop
|
|
||||||
conditions:
|
|
||||||
- label="backport develop"
|
|
||||||
actions:
|
|
||||||
backport:
|
|
||||||
branches:
|
|
||||||
- develop
|
|
||||||
assignees:
|
|
||||||
- "{{ author }}"
|
|
||||||
- name: backport to version-14-hotfix
|
|
||||||
conditions:
|
|
||||||
- label="backport version-14-hotfix"
|
|
||||||
actions:
|
|
||||||
backport:
|
|
||||||
branches:
|
|
||||||
- version-14-hotfix
|
|
||||||
assignees:
|
|
||||||
- "{{ author }}"
|
|
||||||
- name: backport to version-15-hotfix
|
|
||||||
conditions:
|
|
||||||
- label="backport version-15-hotfix"
|
|
||||||
actions:
|
|
||||||
backport:
|
|
||||||
branches:
|
|
||||||
- version-15-hotfix
|
|
||||||
assignees:
|
|
||||||
- "{{ author }}"
|
|
||||||
- name: Automatic merge on CI success and review
|
|
||||||
conditions:
|
|
||||||
- status-success=linters
|
|
||||||
- status-success=Sider
|
|
||||||
- status-success=Semantic Pull Request
|
|
||||||
- status-success=Patch Test
|
|
||||||
- status-success=Python Unit Tests (1)
|
|
||||||
- status-success=Python Unit Tests (2)
|
|
||||||
- status-success=Python Unit Tests (3)
|
|
||||||
- label!=dont-merge
|
|
||||||
- label!=squash
|
|
||||||
- "#approved-reviews-by>=1"
|
|
||||||
actions:
|
|
||||||
merge:
|
|
||||||
method: merge
|
|
||||||
- name: Automatic squash on CI success and review
|
|
||||||
conditions:
|
|
||||||
- status-success=linters
|
|
||||||
- status-success=Sider
|
|
||||||
- status-success=Patch Test
|
|
||||||
- status-success=Python Unit Tests (1)
|
|
||||||
- status-success=Python Unit Tests (2)
|
|
||||||
- status-success=Python Unit Tests (3)
|
|
||||||
- label!=dont-merge
|
|
||||||
- label=squash
|
|
||||||
- "#approved-reviews-by>=1"
|
|
||||||
actions:
|
|
||||||
merge:
|
|
||||||
method: squash
|
|
||||||
commit_message_template: |
|
|
||||||
{{ title }} (#{{ number }})
|
|
||||||
|
|
||||||
{{ body }}
|
|
||||||
@@ -1,74 +0,0 @@
|
|||||||
exclude: 'node_modules|.git'
|
|
||||||
default_stages: [pre-commit]
|
|
||||||
fail_fast: false
|
|
||||||
|
|
||||||
|
|
||||||
repos:
|
|
||||||
- repo: https://github.com/pre-commit/pre-commit-hooks
|
|
||||||
rev: v4.3.0
|
|
||||||
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
|
|
||||||
- id: check-json
|
|
||||||
- id: check-toml
|
|
||||||
- id: check-yaml
|
|
||||||
- id: debug-statements
|
|
||||||
|
|
||||||
- repo: https://github.com/pre-commit/mirrors-prettier
|
|
||||||
rev: v2.7.1
|
|
||||||
hooks:
|
|
||||||
- id: prettier
|
|
||||||
types_or: [javascript, vue, scss]
|
|
||||||
# Ignore any files that might contain jinja / bundles
|
|
||||||
exclude: |
|
|
||||||
(?x)^(
|
|
||||||
erpnext/public/dist/.*|
|
|
||||||
cypress/.*|
|
|
||||||
.*node_modules.*|
|
|
||||||
.*boilerplate.*|
|
|
||||||
erpnext/public/js/controllers/.*|
|
|
||||||
erpnext/templates/pages/order.js|
|
|
||||||
erpnext/templates/includes/.*
|
|
||||||
)$
|
|
||||||
|
|
||||||
- repo: https://github.com/pre-commit/mirrors-eslint
|
|
||||||
rev: v8.44.0
|
|
||||||
hooks:
|
|
||||||
- id: eslint
|
|
||||||
types_or: [javascript]
|
|
||||||
args: ['--quiet']
|
|
||||||
# Ignore any files that might contain jinja / bundles
|
|
||||||
exclude: |
|
|
||||||
(?x)^(
|
|
||||||
erpnext/public/dist/.*|
|
|
||||||
cypress/.*|
|
|
||||||
.*node_modules.*|
|
|
||||||
.*boilerplate.*|
|
|
||||||
erpnext/public/js/controllers/.*|
|
|
||||||
erpnext/templates/pages/order.js|
|
|
||||||
erpnext/templates/includes/.*
|
|
||||||
)$
|
|
||||||
|
|
||||||
- repo: https://github.com/astral-sh/ruff-pre-commit
|
|
||||||
rev: v0.2.0
|
|
||||||
hooks:
|
|
||||||
- id: ruff
|
|
||||||
name: "Run ruff import sorter"
|
|
||||||
args: ["--select=I", "--fix"]
|
|
||||||
|
|
||||||
- id: ruff
|
|
||||||
name: "Run ruff linter"
|
|
||||||
|
|
||||||
- id: ruff-format
|
|
||||||
name: "Run ruff formatter"
|
|
||||||
|
|
||||||
ci:
|
|
||||||
autoupdate_schedule: weekly
|
|
||||||
skip: []
|
|
||||||
submodules: false
|
|
||||||
24
.releaserc
24
.releaserc
@@ -1,24 +0,0 @@
|
|||||||
{
|
|
||||||
"branches": ["version-13"],
|
|
||||||
"plugins": [
|
|
||||||
"@semantic-release/commit-analyzer", {
|
|
||||||
"preset": "angular",
|
|
||||||
"releaseRules": [
|
|
||||||
{"breaking": true, "release": false}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"@semantic-release/release-notes-generator",
|
|
||||||
[
|
|
||||||
"@semantic-release/exec", {
|
|
||||||
"prepareCmd": 'sed -ir "s/[0-9]*\.[0-9]*\.[0-9]*/${nextRelease.version}/" erpnext/__init__.py'
|
|
||||||
}
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"@semantic-release/git", {
|
|
||||||
"assets": ["erpnext/__init__.py"],
|
|
||||||
"message": "chore(release): Bumped to Version ${nextRelease.version}\n\n${nextRelease.notes}"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"@semantic-release/github"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
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
|
||||||
24
CODEOWNERS
24
CODEOWNERS
@@ -1,24 +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/ @ruthra-kumar
|
|
||||||
erpnext/assets/ @khushi8112
|
|
||||||
erpnext/regional @ruthra-kumar
|
|
||||||
erpnext/selling @ruthra-kumar
|
|
||||||
erpnext/support/ @ruthra-kumar
|
|
||||||
pos*
|
|
||||||
|
|
||||||
erpnext/buying/ @rohitwaghchaure
|
|
||||||
erpnext/maintenance/ @rohitwaghchaure
|
|
||||||
erpnext/manufacturing/ @rohitwaghchaure
|
|
||||||
erpnext/quality_management/ @rohitwaghchaure
|
|
||||||
erpnext/stock/ @rohitwaghchaure
|
|
||||||
erpnext/subcontracting @rohitwaghchaure
|
|
||||||
|
|
||||||
erpnext/controllers/ @ruthra-kumar @rohitwaghchaure
|
|
||||||
erpnext/patches/ @ruthra-kumar
|
|
||||||
|
|
||||||
.github/ @ruthra-kumar
|
|
||||||
pyproject.toml @akhilnarang
|
|
||||||
@@ -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
|
||||||
183
README.md
183
README.md
@@ -1,161 +1,76 @@
|
|||||||
<div align="center">
|
# ERPNext - Open source ERP for small and medium-size business [](https://travis-ci.org/frappe/erpnext)
|
||||||
<a href="https://frappe.io/erpnext">
|
|
||||||
<img src="./erpnext/public/images/v16/erpnext.svg" alt="ERPNext Logo" height="80px" width="80xp"/>
|
|
||||||
</a>
|
|
||||||
<h2>ERPNext</h2>
|
|
||||||
<p align="center">
|
|
||||||
<p>Powerful, Intuitive and Open-Source ERP</p>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
[](https://frappe.school)<br><br>
|
[](https://gitter.im/frappe/erpnext?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
||||||
[](https://github.com/frappe/erpnext/actions/workflows/server-tests-mariadb.yml)
|
|
||||||
[](https://hub.docker.com/r/frappe/erpnext-worker)
|
|
||||||
|
|
||||||
</div>
|
[https://erpnext.com](https://erpnext.com)
|
||||||
|
|
||||||
<div align="center">
|
Includes: Accounting, Inventory, CRM, Sales, Purchase, Projects, HRMS. Requires MariaDB.
|
||||||
<img src="./erpnext/public/images/v16/hero_image.png"/>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div align="center">
|
ERPNext is built on the [Frappe](https://github.com/frappe/frappe) Framework, a full-stack web app framework in Python & Javascript.
|
||||||
<a href="https://erpnext-demo.frappe.cloud/api/method/erpnext_demo.erpnext_demo.auth.login_demo">Live Demo</a>
|
|
||||||
-
|
|
||||||
<a href="https://frappe.io/erpnext">Website</a>
|
|
||||||
-
|
|
||||||
<a href="https://docs.frappe.io/erpnext/">Documentation</a>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
## ERPNext
|
- [User Guide](https://erpnext.com/user-guide)
|
||||||
|
- [Getting Help](http://erpnext.org/getting-help.html)
|
||||||
|
- [Discussion Forum](https://discuss.frappe.io/)
|
||||||
|
|
||||||
100% Open-Source ERP system to help you run your business.
|
---
|
||||||
|
|
||||||
### Motivation
|
### Full Install
|
||||||
|
|
||||||
Running a business is a complex task - handling invoices, tracking stock, managing personnel and even more ad-hoc activities. In a market where software is sold separately to manage each of these tasks, ERPNext does all of the above and more, for free.
|
The Easy Way install script for bench will install all dependencies (e.g. MariaDB). See https://github.com/frappe/bench
|
||||||
|
|
||||||
### Key Features
|
|
||||||
|
|
||||||
- **Accounting**: All the tools you need to manage cash flow in one place, right from recording transactions to summarizing and analyzing financial reports.
|
|
||||||
- **Order Management**: Track inventory levels, replenish stock, and manage sales orders, customers, suppliers, shipments, deliverables, and order fulfillment.
|
|
||||||
- **Manufacturing**: Simplifies the production cycle, helps track material consumption, exhibits capacity planning, handles subcontracting, and more!
|
|
||||||
- **Asset Management**: From purchase to perishment, IT infrastructure to equipment. Cover every branch of your organization, all in one centralized system.
|
|
||||||
- **Projects**: Delivery both internal and external Projects on time, budget and Profitability. Track tasks, timesheets, and issues by project.
|
|
||||||
|
|
||||||
<details open>
|
|
||||||
|
|
||||||
<summary>More</summary>
|
|
||||||
<img src="https://erpnext.com/files/v16_bom.png"/>
|
|
||||||
<img src="https://erpnext.com/files/v16_stock_summary.png"/>
|
|
||||||
<img src="https://erpnext.com/files/v16_job_card.png"/>
|
|
||||||
<img src="https://erpnext.com/files/v16_tasks.png"/>
|
|
||||||
</details>
|
|
||||||
|
|
||||||
### Under the Hood
|
|
||||||
|
|
||||||
- [**Frappe Framework**](https://github.com/frappe/frappe): A full-stack web application framework written in Python and Javascript. The framework provides a robust foundation for building web applications, including a database abstraction layer, user authentication, and a REST API.
|
|
||||||
|
|
||||||
- [**Frappe UI**](https://github.com/frappe/frappe-ui): A Vue-based UI library, to provide a modern user interface. The Frappe UI library provides a variety of components that can be used to build single-page applications on top of the Frappe Framework.
|
|
||||||
|
|
||||||
## Production Setup
|
|
||||||
|
|
||||||
### Managed Hosting
|
|
||||||
|
|
||||||
You can try [Frappe Cloud](https://frappecloud.com), a simple, user-friendly and sophisticated [open-source](https://github.com/frappe/press) platform to host Frappe applications with peace of mind.
|
|
||||||
|
|
||||||
It takes care of installation, setup, upgrades, monitoring, maintenance and support of your Frappe deployments. It is a fully featured developer platform with an ability to manage and control multiple Frappe deployments.
|
|
||||||
|
|
||||||
<div>
|
|
||||||
<a href="https://erpnext-demo.frappe.cloud/app/home" target="_blank">
|
|
||||||
<picture>
|
|
||||||
<source media="(prefers-color-scheme: dark)" srcset="https://frappe.io/files/try-on-fc-white.png">
|
|
||||||
<img src="https://frappe.io/files/try-on-fc-black.png" alt="Try on Frappe Cloud" height="28" />
|
|
||||||
</picture>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### Self-Hosted
|
|
||||||
#### Docker
|
|
||||||
|
|
||||||
Prerequisites: docker, docker-compose, git. Refer [Docker Documentation](https://docs.docker.com) for more details on Docker setup.
|
|
||||||
|
|
||||||
Run following commands:
|
|
||||||
|
|
||||||
```
|
|
||||||
git clone https://github.com/frappe/frappe_docker
|
|
||||||
cd frappe_docker
|
|
||||||
docker compose -f pwd.yml up -d
|
|
||||||
```
|
|
||||||
|
|
||||||
After a couple of minutes, site should be accessible on your localhost port: 8080. Use below default login credentials to access the site.
|
|
||||||
- Username: Administrator
|
|
||||||
- Password: admin
|
|
||||||
|
|
||||||
See [Frappe Docker](https://github.com/frappe/frappe_docker?tab=readme-ov-file#to-run-on-arm64-architecture-follow-this-instructions) for ARM based docker setup.
|
|
||||||
|
|
||||||
|
|
||||||
## Development Setup
|
|
||||||
### Manual 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.
|
|
||||||
|
|
||||||
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).
|
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).
|
||||||
|
|
||||||
|
### Virtual Image
|
||||||
|
|
||||||
### Local
|
You can download a virtual image to run ERPNext in a virtual machine on your local system.
|
||||||
|
|
||||||
To setup the repository locally follow the steps mentioned below:
|
- [ERPNext Download](http://erpnext.com/download)
|
||||||
|
|
||||||
1. Setup bench by following the [Installation Steps](https://frappeframework.com/docs/user/en/installation) and start the server
|
System and user credentials are listed on the download page.
|
||||||
```
|
|
||||||
bench start
|
|
||||||
```
|
|
||||||
|
|
||||||
2. In a separate terminal window, run the following commands:
|
---
|
||||||
```
|
|
||||||
# Create a new site
|
|
||||||
bench new-site erpnext.localhost
|
|
||||||
```
|
|
||||||
|
|
||||||
3. Get the ERPNext app and install it
|
## License
|
||||||
```
|
|
||||||
# Get the ERPNext app
|
|
||||||
bench get-app https://github.com/frappe/erpnext
|
|
||||||
|
|
||||||
# Install the app
|
GNU/General Public License (see LICENSE.txt)
|
||||||
bench --site erpnext.localhost install-app erpnext
|
|
||||||
```
|
|
||||||
|
|
||||||
4. Open the URL `http://erpnext.localhost:8000/app` in your browser, you should see the app running
|
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.
|
||||||
|
|
||||||
## Learning and community
|
---
|
||||||
|
|
||||||
1. [Frappe School](https://school.frappe.io) - Learn Frappe Framework and ERPNext from the various courses by the maintainers or from the community.
|
## Logo and Trademark
|
||||||
2. [Official documentation](https://docs.erpnext.com/) - Extensive documentation for ERPNext.
|
|
||||||
3. [Discussion Forum](https://discuss.erpnext.com/) - Engage with community of ERPNext users and service providers.
|
|
||||||
4. [Telegram Group](https://erpnext_public.t.me) - Get instant help from huge community of users.
|
|
||||||
|
|
||||||
|
The brand name ERPNext and the logo are trademarks of Web Notes Technologies Pvt. Ltd.
|
||||||
|
|
||||||
## Contributing
|
### Introduction
|
||||||
|
|
||||||
1. [Issue Guidelines](https://github.com/frappe/erpnext/wiki/Issue-Guidelines)
|
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:
|
||||||
1. [Report Security Vulnerabilities](https://erpnext.com/security)
|
|
||||||
1. [Pull Request Requirements](https://github.com/frappe/erpnext/wiki/Contribution-Guidelines)
|
|
||||||
2. [Translations](https://crowdin.com/project/frappe)
|
|
||||||
|
|
||||||
|
- 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.
|
||||||
|
|
||||||
## Logo and Trademark Policy
|
### Web Notes Trademark Usage Policy
|
||||||
|
|
||||||
Please read our [Logo and Trademark Policy](TRADEMARK_POLICY.md).
|
Permission from Web Notes is required to use the ERPNext name or logo as part of any project, product, service, domain or company name.
|
||||||
|
|
||||||
<br />
|
We will grant permission to use the ERPNext name and logo for projects that meet the following criteria:
|
||||||
<br />
|
|
||||||
<div align="center" style="padding-top: 0.75rem;">
|
- The primary purpose of your project is to promote the spread and improvement of the ERPNext software.
|
||||||
<a href="https://frappe.io" target="_blank">
|
- Your project is non-commercial in nature (it can make money to cover its costs or contribute to non-profit entities, but it cannot be run as a for-profit project or business).
|
||||||
<picture>
|
Your project neither promotes nor is associated with entities that currently fail to comply with the GPL license under which ERPNext is distributed.
|
||||||
<source media="(prefers-color-scheme: dark)" srcset="https://frappe.io/files/Frappe-white.png">
|
- If your project meets these criteria, you will be permitted to use the ERPNext name and logo to promote your project in any way you see fit with one exception: Please do not use ERPNext as part of a domain name.
|
||||||
<img src="https://frappe.io/files/Frappe-black.png" alt="Frappe Technologies" height="28"/>
|
|
||||||
</picture>
|
Use of the ERPNext name and logo is additionally allowed in the following situations:
|
||||||
</a>
|
|
||||||
</div>
|
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.
|
||||||
|
|
||||||
|
We do not allow the use of the trademark in advertising, including AdSense/AdWords.
|
||||||
|
|
||||||
|
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 the Web Notes Technologies for clarification.
|
||||||
|
|
||||||
|
(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,36 +0,0 @@
|
|||||||
## Logo and Trademark Policy
|
|
||||||
|
|
||||||
The brand name ERPNext and the logo are trademarks of Frappe 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:
|
|
||||||
|
|
||||||
- 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
|
|
||||||
|
|
||||||
Permission from Frappe 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:
|
|
||||||
|
|
||||||
- The primary purpose of your project is to promote the spread and improvement of the ERPNext software.
|
|
||||||
- Your project is non-commercial in nature (it can make money to cover its costs or contribute to non-profit entities, but it cannot be run as a for-profit project or business).
|
|
||||||
Your project neither promotes nor is associated with entities that currently fail to comply with the GPL license under which ERPNext is distributed.
|
|
||||||
- If your project meets these criteria, you will be permitted to use the ERPNext name and logo to promote your project in any way you see fit with one exception: Please do not use ERPNext as part of a domain name.
|
|
||||||
|
|
||||||
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.”
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
We do not allow the use of the trademark in advertising, including AdSense/AdWords.
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
(inspired by WordPress)
|
|
||||||
@@ -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
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
**/setup/setup_wizard/data/uom_data.json,erpnext.gettext.extractors.uom_data.extract
|
|
||||||
**/setup/doctype/incoterm/incoterms.csv,erpnext.gettext.extractors.incoterms.extract
|
|
||||||
**/setup/setup_wizard/data/*.txt,erpnext.gettext.extractors.lines_from_txt_file.extract
|
|
||||||
|
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
|
||||||
|
|
||||||
26
codecov.yml
26
codecov.yml
@@ -1,26 +0,0 @@
|
|||||||
codecov:
|
|
||||||
require_ci_to_pass: yes
|
|
||||||
|
|
||||||
coverage:
|
|
||||||
status:
|
|
||||||
project:
|
|
||||||
default:
|
|
||||||
target: auto
|
|
||||||
threshold: 0.5%
|
|
||||||
|
|
||||||
patch:
|
|
||||||
default:
|
|
||||||
target: 85%
|
|
||||||
threshold: 0%
|
|
||||||
base: auto
|
|
||||||
branches:
|
|
||||||
- develop
|
|
||||||
if_ci_failed: ignore
|
|
||||||
only_pulls: true
|
|
||||||
|
|
||||||
comment:
|
|
||||||
layout: "diff, files"
|
|
||||||
require_changes: true
|
|
||||||
|
|
||||||
ignore:
|
|
||||||
- "erpnext/demo"
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
module.exports = {
|
|
||||||
parserPreset: "conventional-changelog-conventionalcommits",
|
|
||||||
rules: {
|
|
||||||
"subject-empty": [2, "never"],
|
|
||||||
"type-case": [2, "always", "lower-case"],
|
|
||||||
"type-empty": [2, "never"],
|
|
||||||
"type-enum": [
|
|
||||||
2,
|
|
||||||
"always",
|
|
||||||
["build", "chore", "ci", "docs", "feat", "fix", "perf", "refactor", "revert", "style", "test"],
|
|
||||||
],
|
|
||||||
},
|
|
||||||
};
|
|
||||||
14
crowdin.yml
14
crowdin.yml
@@ -1,14 +0,0 @@
|
|||||||
files:
|
|
||||||
- source: /erpnext/locale/main.pot
|
|
||||||
translation: /erpnext/locale/%two_letters_code%.po
|
|
||||||
pull_request_title: "fix: sync translations from crowdin"
|
|
||||||
pull_request_labels:
|
|
||||||
- translation
|
|
||||||
- skip-release-notes
|
|
||||||
pull_request_reviewers:
|
|
||||||
- barredterra # change to your GitHub username if you copied this file
|
|
||||||
commit_message: "fix: %language% translations"
|
|
||||||
append_commit_message: false
|
|
||||||
languages_mapping:
|
|
||||||
two_letters_code:
|
|
||||||
pt-BR: pt_BR
|
|
||||||
@@ -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,195 +1 @@
|
|||||||
import functools
|
from erpnext.__version__ import __version__
|
||||||
import inspect
|
|
||||||
from typing import TypeVar
|
|
||||||
|
|
||||||
import frappe
|
|
||||||
from frappe.model.document import Document
|
|
||||||
from frappe.utils.user import is_website_user
|
|
||||||
|
|
||||||
__version__ = "16.0.0-dev"
|
|
||||||
|
|
||||||
|
|
||||||
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("company", user)
|
|
||||||
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 company not 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 company not 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.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=None, abbr=None):
|
|
||||||
"""Returns name encoded with company abbreviation"""
|
|
||||||
company_abbr = abbr or 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.in_test else get_default_company()
|
|
||||||
|
|
||||||
if not hasattr(frappe.local, "enable_perpetual_inventory"):
|
|
||||||
frappe.local.enable_perpetual_inventory = {}
|
|
||||||
|
|
||||||
if company not 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 company not 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 party_type not 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 not company:
|
|
||||||
company = frappe.local.flags.company
|
|
||||||
|
|
||||||
if company:
|
|
||||||
return frappe.get_cached_value("Company", company, "country")
|
|
||||||
|
|
||||||
return frappe.flags.country or frappe.get_system_settings("country")
|
|
||||||
|
|
||||||
|
|
||||||
def allow_regional(fn):
|
|
||||||
"""Decorator to make a function regionally overridable
|
|
||||||
|
|
||||||
Example:
|
|
||||||
@erpnext.allow_regional
|
|
||||||
def myfunction():
|
|
||||||
pass"""
|
|
||||||
|
|
||||||
@functools.wraps(fn)
|
|
||||||
def caller(*args, **kwargs):
|
|
||||||
overrides = frappe.get_hooks("regional_overrides", {}).get(get_region())
|
|
||||||
function_path = f"{inspect.getmodule(fn).__name__}.{fn.__name__}"
|
|
||||||
|
|
||||||
if not overrides or function_path not in overrides:
|
|
||||||
return fn(*args, **kwargs)
|
|
||||||
|
|
||||||
# Priority given to last installed app
|
|
||||||
return frappe.get_attr(overrides[function_path][-1])(*args, **kwargs)
|
|
||||||
|
|
||||||
return caller
|
|
||||||
|
|
||||||
|
|
||||||
def check_app_permission():
|
|
||||||
if frappe.session.user == "Administrator":
|
|
||||||
return True
|
|
||||||
|
|
||||||
if is_website_user():
|
|
||||||
return False
|
|
||||||
|
|
||||||
return True
|
|
||||||
|
|
||||||
|
|
||||||
T = TypeVar("T")
|
|
||||||
|
|
||||||
|
|
||||||
def normalize_ctx_input(T: type) -> callable:
|
|
||||||
"""
|
|
||||||
Normalizes the first argument (ctx) of the decorated function by:
|
|
||||||
- Converting Document objects to dictionaries
|
|
||||||
- Parsing JSON strings
|
|
||||||
- Casting the result to the specified type T
|
|
||||||
"""
|
|
||||||
|
|
||||||
def decorator(func: callable):
|
|
||||||
# conserve annotations for frappe.utils.typing_validations
|
|
||||||
@functools.wraps(func, assigned=(a for a in functools.WRAPPER_ASSIGNMENTS if a != "__annotations__"))
|
|
||||||
def wrapper(ctx: T | Document | dict | str, *args, **kwargs):
|
|
||||||
if isinstance(ctx, Document):
|
|
||||||
ctx = T(**ctx.as_dict())
|
|
||||||
elif isinstance(ctx, dict):
|
|
||||||
ctx = T(**ctx)
|
|
||||||
else:
|
|
||||||
ctx = T(**frappe.parse_json(ctx))
|
|
||||||
|
|
||||||
return func(ctx, *args, **kwargs)
|
|
||||||
|
|
||||||
# set annotations from function
|
|
||||||
wrapper.__annotations__.update({k: v for k, v in func.__annotations__.items() if k != "ctx"})
|
|
||||||
return wrapper
|
|
||||||
|
|
||||||
return decorator
|
|
||||||
|
|||||||
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,46 +6,8 @@ Accounting heads are called "Accounts" and they can be groups in a tree like
|
|||||||
|
|
||||||
Entries are:
|
Entries are:
|
||||||
|
|
||||||
- Journal Entries
|
- Journal Vouchers
|
||||||
- Sales Invoice (Itemised)
|
- Sales Invoice (Itemised)
|
||||||
- Purchase Invoice (Itemised)
|
- Purchase Invoice (Itemised)
|
||||||
|
|
||||||
All accounting entries are stored in the `General Ledger`
|
All accounting entries are stored in the `General Ledger`
|
||||||
|
|
||||||
## Payment Ledger
|
|
||||||
Transactions on Receivable and Payable Account types will also be stored in `Payment Ledger`. This is so that payment reconciliation process only requires update on this ledger.
|
|
||||||
|
|
||||||
### Key Fields
|
|
||||||
| Field | Description |
|
|
||||||
|----------------------|----------------------------------|
|
|
||||||
| `account_type` | Receivable/Payable |
|
|
||||||
| `account` | Accounting head |
|
|
||||||
| `party` | Party Name |
|
|
||||||
| `voucher_no` | Voucher No |
|
|
||||||
| `against_voucher_no` | Linked voucher(secondary effect) |
|
|
||||||
| `amount` | can be +ve/-ve |
|
|
||||||
|
|
||||||
### Design
|
|
||||||
`debit` and `credit` have been replaced with `account_type` and `amount`. `against_voucher_no` is populated for all entries. So, outstanding amount can be calculated by summing up amount only using `against_voucher_no`.
|
|
||||||
|
|
||||||
Ex:
|
|
||||||
1. Consider an invoice for ₹100 and a partial payment of ₹80 against that invoice. Payment Ledger will have following entries.
|
|
||||||
|
|
||||||
| voucher_no | against_voucher_no | amount |
|
|
||||||
|------------|--------------------|--------|
|
|
||||||
| SINV-01 | SINV-01 | 100 |
|
|
||||||
| PAY-01 | SINV-01 | -80 |
|
|
||||||
|
|
||||||
|
|
||||||
2. Reconcile a Credit Note against an invoice using a Journal Entry
|
|
||||||
|
|
||||||
An invoice for ₹100 partially reconciled against a credit of ₹70 using a Journal Entry. Payment Ledger will have the following entries.
|
|
||||||
|
|
||||||
| voucher_no | against_voucher_no | amount |
|
|
||||||
|------------|--------------------|--------|
|
|
||||||
| SINV-01 | SINV-01 | 100 |
|
|
||||||
| | | |
|
|
||||||
| CR-NOTE-01 | CR-NOTE-01 | -70 |
|
|
||||||
| | | |
|
|
||||||
| JE-01 | CR-NOTE-01 | +70 |
|
|
||||||
| JE-01 | SINV-01 | -70 |
|
|
||||||
|
|||||||
@@ -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,66 +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()
|
|
||||||
self.update_compnay_address()
|
|
||||||
super().validate()
|
|
||||||
|
|
||||||
def link_address(self):
|
|
||||||
"""Link address based on owner"""
|
|
||||||
if self.is_your_company_address:
|
|
||||||
return
|
|
||||||
|
|
||||||
return super().link_address()
|
|
||||||
|
|
||||||
def update_compnay_address(self):
|
|
||||||
for link in self.get("links"):
|
|
||||||
if link.link_doctype == "Company":
|
|
||||||
self.is_your_company_address = 1
|
|
||||||
|
|
||||||
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,24 +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\":\"erpnext.utils.get_fiscal_year()\",\"to_fiscal_year\":\"erpnext.utils.get_fiscal_year()\"}",
|
|
||||||
"filters_json": "{\"period\":\"Monthly\",\"budget_against\":\"Cost Center\",\"show_cumulative\":0}",
|
|
||||||
"idx": 0,
|
|
||||||
"is_public": 1,
|
|
||||||
"is_standard": 1,
|
|
||||||
"modified": "2023-07-19 13:13:13.307073",
|
|
||||||
"modified_by": "Administrator",
|
|
||||||
"module": "Accounts",
|
|
||||||
"name": "Budget Variance",
|
|
||||||
"number_of_groups": 0,
|
|
||||||
"owner": "Administrator",
|
|
||||||
"report_name": "Budget Variance Report",
|
|
||||||
"roles": [],
|
|
||||||
"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,24 +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\":\"erpnext.utils.get_fiscal_year()\",\"to_fiscal_year\":\"erpnext.utils.get_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": "2023-07-19 13:08:56.470390",
|
|
||||||
"modified_by": "Administrator",
|
|
||||||
"module": "Accounts",
|
|
||||||
"name": "Profit and Loss",
|
|
||||||
"number_of_groups": 0,
|
|
||||||
"owner": "Administrator",
|
|
||||||
"report_name": "Profit and Loss Statement",
|
|
||||||
"roles": [],
|
|
||||||
"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,137 +0,0 @@
|
|||||||
# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
|
|
||||||
# License: GNU General Public License v3. See license.txt
|
|
||||||
|
|
||||||
|
|
||||||
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")
|
|
||||||
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.get_cached_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,633 +0,0 @@
|
|||||||
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(f"{doc.doctype} Item", {"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 += f"AND {deferred_account}={frappe.db.escape(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(
|
|
||||||
f"""
|
|
||||||
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
|
|
||||||
{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(
|
|
||||||
f"""
|
|
||||||
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
|
|
||||||
{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, prev_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"
|
|
||||||
)
|
|
||||||
|
|
||||||
if not prev_posting_date:
|
|
||||||
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
|
|
||||||
and is_cancelled = 0
|
|
||||||
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
|
|
||||||
|
|
||||||
else:
|
|
||||||
start_date = getdate(add_days(prev_posting_date, 1))
|
|
||||||
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 get_first_day(start_date) != start_date or 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({}) as total_credit, sum({}) 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
|
|
||||||
and is_cancelled = 0
|
|
||||||
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.{}) as total_credit, sum(c.{}) 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"
|
|
||||||
|
|
||||||
accounts_frozen_upto = frappe.get_single_value("Accounts Settings", "acc_frozen_upto")
|
|
||||||
|
|
||||||
def _book_deferred_revenue_or_expense(
|
|
||||||
item,
|
|
||||||
via_journal_entry,
|
|
||||||
submit_journal_entry,
|
|
||||||
book_deferred_entries_based_on,
|
|
||||||
prev_posting_date=None,
|
|
||||||
):
|
|
||||||
start_date, end_date, last_gl_entry = get_booking_dates(
|
|
||||||
doc, item, posting_date=posting_date, prev_posting_date=prev_posting_date
|
|
||||||
)
|
|
||||||
if not (start_date and end_date):
|
|
||||||
return
|
|
||||||
|
|
||||||
account_currency = get_account_currency(item.expense_account or item.income_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:
|
|
||||||
prev_posting_date = end_date
|
|
||||||
else:
|
|
||||||
gl_posting_date = end_date
|
|
||||||
prev_posting_date = None
|
|
||||||
# check if books nor frozen till endate:
|
|
||||||
if accounts_frozen_upto and getdate(end_date) <= getdate(accounts_frozen_upto):
|
|
||||||
gl_posting_date = get_last_day(add_days(accounts_frozen_upto, 1))
|
|
||||||
prev_posting_date = end_date
|
|
||||||
|
|
||||||
if via_journal_entry:
|
|
||||||
book_revenue_via_journal_entry(
|
|
||||||
doc,
|
|
||||||
credit_account,
|
|
||||||
debit_account,
|
|
||||||
amount,
|
|
||||||
base_amount,
|
|
||||||
gl_posting_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,
|
|
||||||
gl_posting_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,
|
|
||||||
prev_posting_date,
|
|
||||||
)
|
|
||||||
|
|
||||||
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.in_test:
|
|
||||||
doc.log_error(f"Error while processing deferred accounting for Invoice {doc.name}")
|
|
||||||
raise e
|
|
||||||
else:
|
|
||||||
frappe.db.rollback()
|
|
||||||
doc.log_error(f"Error while processing deferred accounting for Invoice {doc.name}")
|
|
||||||
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,
|
|
||||||
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"
|
|
||||||
journal_entry.process_deferred_accounting = deferred_process
|
|
||||||
|
|
||||||
debit_entry = {
|
|
||||||
"account": credit_account,
|
|
||||||
"credit": base_amount,
|
|
||||||
"credit_in_account_currency": amount,
|
|
||||||
"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,
|
|
||||||
"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()
|
|
||||||
|
|
||||||
frappe.db.commit()
|
|
||||||
except Exception:
|
|
||||||
frappe.db.rollback()
|
|
||||||
doc.log_error(f"Error while processing deferred accounting for Invoice {doc.name}")
|
|
||||||
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
|
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
from __future__ import unicode_literals
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
from __future__ import unicode_literals
|
||||||
|
|||||||
@@ -1,208 +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
|
// License: GNU General Public License v3. See license.txt
|
||||||
|
|
||||||
frappe.ui.form.on("Account", {
|
cur_frm.list_route = "Accounts Browser/Account";
|
||||||
setup: function (frm) {
|
|
||||||
frm.add_fetch("parent_account", "report_type", "report_type");
|
cur_frm.cscript.refresh = function(doc, cdt, cdn) {
|
||||||
frm.add_fetch("parent_account", "root_type", "root_type");
|
if(doc.__islocal) {
|
||||||
},
|
msgprint(__("Please create new account from Chart of Accounts."));
|
||||||
onload: function (frm) {
|
throw "cannot create";
|
||||||
frm.set_query("parent_account", function (doc) {
|
}
|
||||||
return {
|
|
||||||
filters: {
|
cur_frm.toggle_display('account_name', doc.__islocal);
|
||||||
is_group: 1,
|
|
||||||
company: doc.company,
|
// 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");
|
||||||
refresh: function (frm) {
|
|
||||||
frm.toggle_display("account_name", frm.is_new());
|
|
||||||
|
|
||||||
// hide fields if group
|
cur_frm.add_custom_button(__('Convert to Group'),
|
||||||
frm.toggle_display(["tax_rate"], cint(frm.doc.is_group) == 0);
|
function() { cur_frm.cscript.convert_to_group(); }, 'icon-retweet', 'btn-default')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
frm.toggle_enable(["is_group", "company", "account_number"], frm.is_new());
|
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();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
if (cint(frm.doc.is_group) == 0) {
|
cur_frm.cscript.convert_to_group = function(doc, cdt, cdn) {
|
||||||
frm.toggle_display("freeze_account", frm.doc.__onload && frm.doc.__onload.can_freeze_account);
|
return $c_obj(cur_frm.doc,'convert_ledger_to_group','',function(r,rt) {
|
||||||
}
|
if(r.message == 1) {
|
||||||
|
cur_frm.refresh();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
// read-only for root accounts
|
cur_frm.fields_dict['master_name'].get_query = function(doc) {
|
||||||
if (!frm.is_new()) {
|
if (doc.master_type || doc.account_type=="Warehouse") {
|
||||||
if (!frm.doc.parent_account) {
|
var dt = doc.master_type || "Warehouse";
|
||||||
frm.set_read_only();
|
return {
|
||||||
frm.set_intro(__("This is a root account and cannot be edited."));
|
doctype: dt,
|
||||||
} else {
|
query: "erpnext.accounts.doctype.account.account.get_master_name",
|
||||||
// credit days and type if customer or supplier
|
filters: {
|
||||||
frm.set_intro(null);
|
"master_type": dt,
|
||||||
frm.trigger("account_type");
|
"company": doc.company
|
||||||
// show / hide convert buttons
|
|
||||||
frm.trigger("add_toolbar_buttons");
|
|
||||||
}
|
|
||||||
if (frm.has_perm("write")) {
|
|
||||||
frm.add_custom_button(
|
|
||||||
__("Merge Account"),
|
|
||||||
function () {
|
|
||||||
frm.trigger("merge_account");
|
|
||||||
},
|
|
||||||
__("Actions")
|
|
||||||
);
|
|
||||||
frm.add_custom_button(
|
|
||||||
__("Update Account Name / Number"),
|
|
||||||
function () {
|
|
||||||
frm.trigger("update_account_number");
|
|
||||||
},
|
|
||||||
__("Actions")
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
account_type: function (frm) {
|
}
|
||||||
if (frm.doc.is_group == 0) {
|
|
||||||
frm.toggle_display(["tax_rate"], frm.doc.account_type == "Tax");
|
cur_frm.fields_dict['parent_account'].get_query = function(doc) {
|
||||||
frm.toggle_display("warehouse", frm.doc.account_type == "Stock");
|
return {
|
||||||
|
filters: {
|
||||||
|
"group_or_ledger": "Group",
|
||||||
|
"company": doc.company
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
add_toolbar_buttons: function (frm) {
|
}
|
||||||
frm.add_custom_button(
|
|
||||||
__("Chart of Accounts"),
|
|
||||||
() => {
|
|
||||||
frappe.set_route("Tree", "Account");
|
|
||||||
},
|
|
||||||
__("View")
|
|
||||||
);
|
|
||||||
|
|
||||||
if (frm.doc.is_group == 1) {
|
|
||||||
frm.add_custom_button(
|
|
||||||
__("Convert to Non-Group"),
|
|
||||||
function () {
|
|
||||||
return frappe.call({
|
|
||||||
doc: frm.doc,
|
|
||||||
method: "convert_group_to_ledger",
|
|
||||||
callback: function () {
|
|
||||||
frm.refresh();
|
|
||||||
},
|
|
||||||
});
|
|
||||||
},
|
|
||||||
__("Actions")
|
|
||||||
);
|
|
||||||
} else if (cint(frm.doc.is_group) == 0 && frappe.boot.user.can_read.indexOf("GL Entry") !== -1) {
|
|
||||||
frm.add_custom_button(
|
|
||||||
__("General Ledger"),
|
|
||||||
function () {
|
|
||||||
frappe.route_options = {
|
|
||||||
account: frm.doc.name,
|
|
||||||
from_date: erpnext.utils.get_fiscal_year(frappe.datetime.get_today(), true)[1],
|
|
||||||
to_date: erpnext.utils.get_fiscal_year(frappe.datetime.get_today(), true)[2],
|
|
||||||
company: frm.doc.company,
|
|
||||||
};
|
|
||||||
frappe.set_route("query-report", "General Ledger");
|
|
||||||
},
|
|
||||||
__("View")
|
|
||||||
);
|
|
||||||
|
|
||||||
frm.add_custom_button(
|
|
||||||
__("Convert to Group"),
|
|
||||||
function () {
|
|
||||||
return frappe.call({
|
|
||||||
doc: frm.doc,
|
|
||||||
method: "convert_ledger_to_group",
|
|
||||||
callback: function () {
|
|
||||||
frm.refresh();
|
|
||||||
},
|
|
||||||
});
|
|
||||||
},
|
|
||||||
__("Actions")
|
|
||||||
);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
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,
|
|
||||||
},
|
|
||||||
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();
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|||||||
@@ -1,119 +1,85 @@
|
|||||||
{
|
{
|
||||||
"actions": [],
|
|
||||||
"allow_copy": 1,
|
"allow_copy": 1,
|
||||||
"allow_import": 1,
|
"allow_import": 1,
|
||||||
|
"allow_rename": 1,
|
||||||
"creation": "2013-01-30 12:49:46",
|
"creation": "2013-01-30 12:49:46",
|
||||||
"default_view": "Tree",
|
|
||||||
"description": "Heads (or groups) against which Accounting Entries are made and balances are maintained.",
|
"description": "Heads (or groups) against which Accounting Entries are made and balances are maintained.",
|
||||||
|
"docstatus": 0,
|
||||||
"doctype": "DocType",
|
"doctype": "DocType",
|
||||||
"document_type": "Setup",
|
"document_type": "Master",
|
||||||
"engine": "InnoDB",
|
|
||||||
"field_order": [
|
|
||||||
"properties",
|
|
||||||
"column_break0",
|
|
||||||
"disabled",
|
|
||||||
"account_name",
|
|
||||||
"account_number",
|
|
||||||
"is_group",
|
|
||||||
"company",
|
|
||||||
"root_type",
|
|
||||||
"report_type",
|
|
||||||
"account_currency",
|
|
||||||
"column_break1",
|
|
||||||
"parent_account",
|
|
||||||
"account_type",
|
|
||||||
"tax_rate",
|
|
||||||
"freeze_account",
|
|
||||||
"balance_must_be",
|
|
||||||
"lft",
|
|
||||||
"rgt",
|
|
||||||
"old_parent",
|
|
||||||
"include_in_gross"
|
|
||||||
],
|
|
||||||
"fields": [
|
"fields": [
|
||||||
{
|
{
|
||||||
"fieldname": "properties",
|
"fieldname": "properties",
|
||||||
"fieldtype": "Section Break",
|
"fieldtype": "Section Break",
|
||||||
"oldfieldtype": "Section Break"
|
"in_list_view": 0,
|
||||||
|
"label": "Account Details",
|
||||||
|
"oldfieldtype": "Section Break",
|
||||||
|
"permlevel": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"fieldname": "column_break0",
|
"fieldname": "column_break0",
|
||||||
"fieldtype": "Column Break",
|
"fieldtype": "Column Break",
|
||||||
|
"in_list_view": 0,
|
||||||
|
"permlevel": 0,
|
||||||
"width": "50%"
|
"width": "50%"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"fieldname": "account_name",
|
"fieldname": "account_name",
|
||||||
"fieldtype": "Data",
|
"fieldtype": "Data",
|
||||||
|
"in_filter": 1,
|
||||||
"in_list_view": 1,
|
"in_list_view": 1,
|
||||||
"label": "Account Name",
|
"label": "Account Name",
|
||||||
"no_copy": 1,
|
"no_copy": 1,
|
||||||
"oldfieldname": "account_name",
|
"oldfieldname": "account_name",
|
||||||
"oldfieldtype": "Data",
|
"oldfieldtype": "Data",
|
||||||
"reqd": 1
|
"permlevel": 0,
|
||||||
|
"read_only": 1,
|
||||||
|
"reqd": 1,
|
||||||
|
"search_index": 1
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"fieldname": "account_number",
|
"default": "Ledger",
|
||||||
"fieldtype": "Data",
|
"fieldname": "group_or_ledger",
|
||||||
|
"fieldtype": "Select",
|
||||||
|
"in_filter": 1,
|
||||||
"in_list_view": 1,
|
"in_list_view": 1,
|
||||||
"in_standard_filter": 1,
|
"label": "Group or Ledger",
|
||||||
"label": "Account Number"
|
"oldfieldname": "group_or_ledger",
|
||||||
|
"oldfieldtype": "Select",
|
||||||
|
"options": "\nLedger\nGroup",
|
||||||
|
"permlevel": 0,
|
||||||
|
"read_only": 1,
|
||||||
|
"reqd": 1,
|
||||||
|
"search_index": 1
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"default": "0",
|
|
||||||
"fieldname": "is_group",
|
|
||||||
"fieldtype": "Check",
|
|
||||||
"label": "Is Group"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"fetch_from": "parent_account.company",
|
|
||||||
"fetch_if_empty": 1,
|
|
||||||
"fieldname": "company",
|
"fieldname": "company",
|
||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
"in_standard_filter": 1,
|
"in_filter": 1,
|
||||||
"label": "Company",
|
"label": "Company",
|
||||||
"oldfieldname": "company",
|
"oldfieldname": "company",
|
||||||
"oldfieldtype": "Link",
|
"oldfieldtype": "Link",
|
||||||
"options": "Company",
|
"options": "Company",
|
||||||
"remember_last_selected_value": 1,
|
"permlevel": 0,
|
||||||
"reqd": 1
|
"read_only": 1,
|
||||||
},
|
"reqd": 1,
|
||||||
{
|
"search_index": 1
|
||||||
"fieldname": "root_type",
|
|
||||||
"fieldtype": "Select",
|
|
||||||
"in_standard_filter": 1,
|
|
||||||
"label": "Root Type",
|
|
||||||
"options": "\nAsset\nLiability\nIncome\nExpense\nEquity",
|
|
||||||
"read_only": 1
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"fieldname": "report_type",
|
|
||||||
"fieldtype": "Select",
|
|
||||||
"in_standard_filter": 1,
|
|
||||||
"label": "Report Type",
|
|
||||||
"options": "\nBalance Sheet\nProfit and Loss",
|
|
||||||
"read_only": 1
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"depends_on": "eval:doc.is_group==0",
|
|
||||||
"fieldname": "account_currency",
|
|
||||||
"fieldtype": "Link",
|
|
||||||
"label": "Currency",
|
|
||||||
"options": "Currency"
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"fieldname": "column_break1",
|
"fieldname": "column_break1",
|
||||||
"fieldtype": "Column Break",
|
"fieldtype": "Column Break",
|
||||||
|
"permlevel": 0,
|
||||||
"width": "50%"
|
"width": "50%"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"fieldname": "parent_account",
|
"fieldname": "parent_account",
|
||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
"ignore_user_permissions": 1,
|
"ignore_user_permissions": 1,
|
||||||
"in_preview": 1,
|
|
||||||
"label": "Parent Account",
|
"label": "Parent Account",
|
||||||
"oldfieldname": "parent_account",
|
"oldfieldname": "parent_account",
|
||||||
"oldfieldtype": "Link",
|
"oldfieldtype": "Link",
|
||||||
"options": "Account",
|
"options": "Account",
|
||||||
|
"permlevel": 0,
|
||||||
"reqd": 1,
|
"reqd": 1,
|
||||||
"search_index": 1
|
"search_index": 1
|
||||||
},
|
},
|
||||||
@@ -121,20 +87,24 @@
|
|||||||
"description": "Setting Account Type helps in selecting this Account in transactions.",
|
"description": "Setting Account Type helps in selecting this Account in transactions.",
|
||||||
"fieldname": "account_type",
|
"fieldname": "account_type",
|
||||||
"fieldtype": "Select",
|
"fieldtype": "Select",
|
||||||
"in_standard_filter": 1,
|
"in_filter": 1,
|
||||||
"label": "Account Type",
|
"label": "Account Type",
|
||||||
"oldfieldname": "account_type",
|
"oldfieldname": "account_type",
|
||||||
"oldfieldtype": "Select",
|
"oldfieldtype": "Select",
|
||||||
"options": "\nAccumulated Depreciation\nAsset Received But Not Billed\nBank\nCash\nChargeable\nCapital Work in Progress\nCost of Goods Sold\nCurrent Asset\nCurrent Liability\nDepreciation\nDirect Expense\nDirect Income\nEquity\nExpense Account\nExpenses Included In Asset Valuation\nExpenses Included In Valuation\nFixed Asset\nIncome Account\nIndirect Expense\nIndirect Income\nLiability\nPayable\nReceivable\nRound Off\nRound Off for Opening\nStock\nStock Adjustment\nStock Received But Not Billed\nService Received But Not Billed\nTax\nTemporary",
|
"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",
|
||||||
"search_index": 1
|
"permlevel": 0,
|
||||||
|
"search_index": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"description": "Rate at which this tax is applied",
|
"description": "Rate at which this tax is applied",
|
||||||
"fieldname": "tax_rate",
|
"fieldname": "tax_rate",
|
||||||
"fieldtype": "Float",
|
"fieldtype": "Float",
|
||||||
"label": "Tax Rate",
|
"hidden": 0,
|
||||||
|
"label": "Rate",
|
||||||
"oldfieldname": "tax_rate",
|
"oldfieldname": "tax_rate",
|
||||||
"oldfieldtype": "Currency"
|
"oldfieldtype": "Currency",
|
||||||
|
"permlevel": 0,
|
||||||
|
"reqd": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"description": "If the account is frozen, entries are allowed to restricted users.",
|
"description": "If the account is frozen, entries are allowed to restricted users.",
|
||||||
@@ -143,118 +113,220 @@
|
|||||||
"label": "Frozen",
|
"label": "Frozen",
|
||||||
"oldfieldname": "freeze_account",
|
"oldfieldname": "freeze_account",
|
||||||
"oldfieldtype": "Select",
|
"oldfieldtype": "Select",
|
||||||
"options": "No\nYes"
|
"options": "No\nYes",
|
||||||
|
"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",
|
"fieldname": "balance_must_be",
|
||||||
"fieldtype": "Select",
|
"fieldtype": "Select",
|
||||||
"label": "Balance must be",
|
"label": "Balance must be",
|
||||||
"options": "\nDebit\nCredit"
|
"options": "\nDebit\nCredit",
|
||||||
|
"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",
|
"fieldname": "lft",
|
||||||
"fieldtype": "Int",
|
"fieldtype": "Int",
|
||||||
"hidden": 1,
|
"hidden": 1,
|
||||||
"label": "Lft",
|
"label": "Lft",
|
||||||
|
"permlevel": 0,
|
||||||
"print_hide": 1,
|
"print_hide": 1,
|
||||||
"read_only": 1,
|
"read_only": 1
|
||||||
"search_index": 1
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"fieldname": "rgt",
|
"fieldname": "rgt",
|
||||||
"fieldtype": "Int",
|
"fieldtype": "Int",
|
||||||
"hidden": 1,
|
"hidden": 1,
|
||||||
"label": "Rgt",
|
"label": "Rgt",
|
||||||
|
"permlevel": 0,
|
||||||
"print_hide": 1,
|
"print_hide": 1,
|
||||||
"read_only": 1,
|
"read_only": 1
|
||||||
"search_index": 1
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"fieldname": "old_parent",
|
"fieldname": "old_parent",
|
||||||
"fieldtype": "Data",
|
"fieldtype": "Data",
|
||||||
"hidden": 1,
|
"hidden": 1,
|
||||||
"label": "Old Parent",
|
"label": "Old Parent",
|
||||||
|
"permlevel": 0,
|
||||||
"print_hide": 1,
|
"print_hide": 1,
|
||||||
"read_only": 1
|
"read_only": 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"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"default": "0",
|
|
||||||
"fieldname": "disabled",
|
|
||||||
"fieldtype": "Check",
|
|
||||||
"label": "Disable"
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"icon": "fa fa-money",
|
"icon": "icon-money",
|
||||||
"idx": 1,
|
"idx": 1,
|
||||||
"is_tree": 1,
|
"in_create": 1,
|
||||||
"links": [],
|
"modified": "2014-06-19 18:27:58.109303",
|
||||||
"modified": "2025-01-22 10:40:35.766017",
|
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Accounts",
|
"module": "Accounts",
|
||||||
"name": "Account",
|
"name": "Account",
|
||||||
"nsm_parent_field": "parent_account",
|
|
||||||
"owner": "Administrator",
|
"owner": "Administrator",
|
||||||
"permissions": [
|
"permissions": [
|
||||||
{
|
{
|
||||||
|
"amend": 0,
|
||||||
|
"apply_user_permissions": 1,
|
||||||
"create": 1,
|
"create": 1,
|
||||||
"delete": 1,
|
"delete": 1,
|
||||||
"email": 1,
|
"email": 1,
|
||||||
"export": 1,
|
"export": 1,
|
||||||
"import": 1,
|
"import": 1,
|
||||||
|
"permlevel": 0,
|
||||||
"print": 1,
|
"print": 1,
|
||||||
"read": 1,
|
"read": 1,
|
||||||
"report": 1,
|
"report": 1,
|
||||||
"role": "Accounts User",
|
"role": "Accounts User",
|
||||||
"share": 1,
|
"submit": 0,
|
||||||
"write": 1
|
"write": 1
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"amend": 0,
|
||||||
|
"apply_user_permissions": 1,
|
||||||
|
"create": 0,
|
||||||
|
"delete": 0,
|
||||||
"email": 1,
|
"email": 1,
|
||||||
|
"permlevel": 0,
|
||||||
"print": 1,
|
"print": 1,
|
||||||
"read": 1,
|
"read": 1,
|
||||||
"report": 1,
|
"report": 1,
|
||||||
"role": "Auditor"
|
"role": "Auditor",
|
||||||
|
"submit": 0,
|
||||||
|
"write": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"amend": 0,
|
||||||
|
"apply_user_permissions": 1,
|
||||||
|
"create": 0,
|
||||||
|
"delete": 0,
|
||||||
"email": 1,
|
"email": 1,
|
||||||
|
"permlevel": 0,
|
||||||
"print": 1,
|
"print": 1,
|
||||||
"read": 1,
|
"read": 1,
|
||||||
"report": 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,
|
"email": 1,
|
||||||
|
"permlevel": 0,
|
||||||
"print": 1,
|
"print": 1,
|
||||||
"read": 1,
|
"read": 1,
|
||||||
"report": 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,
|
"create": 1,
|
||||||
"delete": 1,
|
"delete": 1,
|
||||||
"email": 1,
|
"email": 1,
|
||||||
"export": 1,
|
"export": 1,
|
||||||
"import": 1,
|
"import": 1,
|
||||||
|
"permlevel": 0,
|
||||||
"print": 1,
|
"print": 1,
|
||||||
"read": 1,
|
"read": 1,
|
||||||
"report": 1,
|
"report": 1,
|
||||||
"role": "Accounts Manager",
|
"role": "Accounts Manager",
|
||||||
"share": 1,
|
"set_user_permissions": 1,
|
||||||
|
"submit": 0,
|
||||||
"write": 1
|
"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",
|
"search_fields": "group_or_ledger"
|
||||||
"show_name_in_global_search": 1,
|
|
||||||
"show_preview_popup": 1,
|
|
||||||
"sort_field": "creation",
|
|
||||||
"sort_order": "ASC",
|
|
||||||
"states": [],
|
|
||||||
"track_changes": 1
|
|
||||||
}
|
}
|
||||||
@@ -1,408 +1,105 @@
|
|||||||
# 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
|
# License: GNU General Public License v3. See license.txt
|
||||||
|
|
||||||
|
from __future__ import unicode_literals
|
||||||
import frappe
|
import frappe
|
||||||
from frappe import _, throw
|
from frappe.utils import flt, cstr, cint, getdate
|
||||||
from frappe.utils import add_to_date, cint, cstr, pretty_date
|
from frappe import msgprint, throw, _
|
||||||
from frappe.utils.nestedset import NestedSet, get_ancestors_of, get_descendants_of
|
from frappe.model.document import Document
|
||||||
|
|
||||||
import erpnext
|
class Account(Document):
|
||||||
|
nsm_parent_field = 'parent_account'
|
||||||
|
|
||||||
class RootNotEditable(frappe.ValidationError):
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
class BalanceMismatchError(frappe.ValidationError):
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
class InvalidAccountMergeError(frappe.ValidationError):
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
class Account(NestedSet):
|
|
||||||
# begin: auto-generated types
|
|
||||||
# This code is auto-generated. Do not modify anything in this block.
|
|
||||||
|
|
||||||
from typing import TYPE_CHECKING
|
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
|
||||||
from frappe.types import DF
|
|
||||||
|
|
||||||
account_currency: DF.Link | None
|
|
||||||
account_name: DF.Data
|
|
||||||
account_number: DF.Data | None
|
|
||||||
account_type: DF.Literal[
|
|
||||||
"",
|
|
||||||
"Accumulated Depreciation",
|
|
||||||
"Asset Received But Not Billed",
|
|
||||||
"Bank",
|
|
||||||
"Cash",
|
|
||||||
"Chargeable",
|
|
||||||
"Capital Work in Progress",
|
|
||||||
"Cost of Goods Sold",
|
|
||||||
"Current Asset",
|
|
||||||
"Current Liability",
|
|
||||||
"Depreciation",
|
|
||||||
"Direct Expense",
|
|
||||||
"Direct Income",
|
|
||||||
"Equity",
|
|
||||||
"Expense Account",
|
|
||||||
"Expenses Included In Asset Valuation",
|
|
||||||
"Expenses Included In Valuation",
|
|
||||||
"Fixed Asset",
|
|
||||||
"Income Account",
|
|
||||||
"Indirect Expense",
|
|
||||||
"Indirect Income",
|
|
||||||
"Liability",
|
|
||||||
"Payable",
|
|
||||||
"Receivable",
|
|
||||||
"Round Off",
|
|
||||||
"Round Off for Opening",
|
|
||||||
"Stock",
|
|
||||||
"Stock Adjustment",
|
|
||||||
"Stock Received But Not Billed",
|
|
||||||
"Service Received But Not Billed",
|
|
||||||
"Tax",
|
|
||||||
"Temporary",
|
|
||||||
]
|
|
||||||
balance_must_be: DF.Literal["", "Debit", "Credit"]
|
|
||||||
company: DF.Link
|
|
||||||
disabled: DF.Check
|
|
||||||
freeze_account: DF.Literal["No", "Yes"]
|
|
||||||
include_in_gross: DF.Check
|
|
||||||
is_group: DF.Check
|
|
||||||
lft: DF.Int
|
|
||||||
old_parent: DF.Data | None
|
|
||||||
parent_account: DF.Link
|
|
||||||
report_type: DF.Literal["", "Balance Sheet", "Profit and Loss"]
|
|
||||||
rgt: DF.Int
|
|
||||||
root_type: DF.Literal["", "Asset", "Liability", "Income", "Expense", "Equity"]
|
|
||||||
tax_rate: DF.Float
|
|
||||||
# end: auto-generated types
|
|
||||||
|
|
||||||
nsm_parent_field = "parent_account"
|
|
||||||
|
|
||||||
def on_update(self):
|
|
||||||
if frappe.local.flags.ignore_update_nsm:
|
|
||||||
return
|
|
||||||
else:
|
|
||||||
super().on_update()
|
|
||||||
|
|
||||||
def onload(self):
|
def onload(self):
|
||||||
frozen_accounts_modifier = frappe.get_single_value("Accounts Settings", "frozen_accounts_modifier")
|
frozen_accounts_modifier = frappe.db.get_value("Accounts Settings", "Accounts Settings",
|
||||||
if not frozen_accounts_modifier or frozen_accounts_modifier in frappe.get_roles():
|
"frozen_accounts_modifier")
|
||||||
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):
|
def autoname(self):
|
||||||
from erpnext.accounts.utils import get_autoname_with_number
|
self.name = self.account_name.strip() + ' - ' + \
|
||||||
|
frappe.db.get_value("Company", self.company, "abbr")
|
||||||
|
|
||||||
self.name = get_autoname_with_number(self.account_number, self.account_name, self.company)
|
def get_address(self):
|
||||||
|
return {'address': frappe.db.get_value(self.master_type, self.master_name, "address")}
|
||||||
|
|
||||||
def validate(self):
|
def validate(self):
|
||||||
if frappe.local.flags.allow_unverified_charts:
|
self.validate_master_name()
|
||||||
return
|
|
||||||
self.validate_parent()
|
self.validate_parent()
|
||||||
self.validate_parent_child_account_type()
|
|
||||||
self.validate_root_details()
|
self.validate_root_details()
|
||||||
self.validate_account_number()
|
|
||||||
self.validate_group_or_ledger()
|
|
||||||
self.set_root_and_report_type()
|
|
||||||
self.validate_mandatory()
|
self.validate_mandatory()
|
||||||
|
self.validate_warehouse_account()
|
||||||
self.validate_frozen_accounts_modifier()
|
self.validate_frozen_accounts_modifier()
|
||||||
self.validate_balance_must_be_debit_or_credit()
|
self.validate_balance_must_be_debit_or_credit()
|
||||||
self.validate_account_currency()
|
|
||||||
self.validate_root_company_and_sync_account_to_children()
|
|
||||||
self.validate_receivable_payable_account_type()
|
|
||||||
|
|
||||||
def validate_parent_child_account_type(self):
|
def validate_master_name(self):
|
||||||
if self.parent_account:
|
if self.master_type in ('Customer', 'Supplier') or self.account_type == "Warehouse":
|
||||||
if self.account_type in [
|
if not self.master_name:
|
||||||
"Direct Income",
|
msgprint(_("Please enter Master Name once the account is created."))
|
||||||
"Indirect Income",
|
elif not frappe.db.exists(self.master_type or self.account_type, self.master_name):
|
||||||
"Current Asset",
|
throw(_("Invalid Master Name"))
|
||||||
"Current Liability",
|
|
||||||
"Direct Expense",
|
|
||||||
"Indirect Expense",
|
|
||||||
]:
|
|
||||||
parent_account_type = frappe.db.get_value("Account", self.parent_account, ["account_type"])
|
|
||||||
if parent_account_type == self.account_type:
|
|
||||||
throw(_("Only Parent can be of type {0}").format(self.account_type))
|
|
||||||
|
|
||||||
def validate_parent(self):
|
def validate_parent(self):
|
||||||
"""Fetch Parent Details and validate parent account"""
|
"""Fetch Parent Details and validate parent account"""
|
||||||
if self.parent_account:
|
if self.parent_account:
|
||||||
par = frappe.get_cached_value(
|
par = frappe.db.get_value("Account", self.parent_account,
|
||||||
"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:
|
if not par:
|
||||||
throw(
|
throw(_("Account {0}: Parent account {1} does not exist").format(self.name, self.parent_account))
|
||||||
_("Account {0}: Parent account {1} does not exist").format(self.name, self.parent_account)
|
|
||||||
)
|
|
||||||
elif par.name == self.name:
|
elif par.name == self.name:
|
||||||
throw(_("Account {0}: You can not assign itself as parent account").format(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(
|
throw(_("Account {0}: Parent account {1} can not be a ledger").format(self.name, self.parent_account))
|
||||||
_("Account {0}: Parent account {1} can not be a ledger").format(
|
|
||||||
self.name, self.parent_account
|
|
||||||
)
|
|
||||||
)
|
|
||||||
elif par.company != self.company:
|
elif par.company != self.company:
|
||||||
throw(
|
throw(_("Account {0}: Parent account {1} does not belong to company: {2}")
|
||||||
_("Account {0}: Parent account {1} does not belong to company: {2}").format(
|
.format(self.name, self.parent_account, self.company))
|
||||||
self.name, self.parent_account, self.company
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
def set_root_and_report_type(self):
|
|
||||||
if self.parent_account:
|
|
||||||
par = frappe.get_cached_value(
|
|
||||||
"Account", self.parent_account, ["report_type", "root_type"], as_dict=1
|
|
||||||
)
|
|
||||||
|
|
||||||
if par.report_type:
|
if par.report_type:
|
||||||
self.report_type = par.report_type
|
self.report_type = par.report_type
|
||||||
if par.root_type:
|
if par.root_type:
|
||||||
self.root_type = par.root_type
|
self.root_type = par.root_type
|
||||||
|
|
||||||
if self.is_group:
|
|
||||||
db_value = self.get_doc_before_save()
|
|
||||||
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_receivable_payable_account_type(self):
|
|
||||||
doc_before_save = self.get_doc_before_save()
|
|
||||||
receivable_payable_types = ["Receivable", "Payable"]
|
|
||||||
if (
|
|
||||||
doc_before_save
|
|
||||||
and doc_before_save.account_type in receivable_payable_types
|
|
||||||
and doc_before_save.account_type != self.account_type
|
|
||||||
):
|
|
||||||
# check for ledger entries
|
|
||||||
if frappe.db.get_all("GL Entry", filters={"account": self.name, "is_cancelled": 0}, limit=1):
|
|
||||||
msg = _(
|
|
||||||
"There are ledger entries against this account. Changing {0} to non-{1} in live system will cause incorrect output in 'Accounts {2}' report"
|
|
||||||
).format(
|
|
||||||
frappe.bold(_("Account Type")), doc_before_save.account_type, doc_before_save.account_type
|
|
||||||
)
|
|
||||||
frappe.msgprint(msg)
|
|
||||||
self.add_comment("Comment", msg)
|
|
||||||
|
|
||||||
def validate_root_details(self):
|
def validate_root_details(self):
|
||||||
doc_before_save = self.get_doc_before_save()
|
#does not exists parent
|
||||||
|
if frappe.db.exists("Account", self.name):
|
||||||
if doc_before_save and not doc_before_save.parent_account:
|
if not frappe.db.get_value("Account", self.name, "parent_account"):
|
||||||
throw(_("Root cannot be edited."), RootNotEditable)
|
throw(_("Root cannot be edited."))
|
||||||
|
|
||||||
if not self.parent_account and not self.is_group:
|
|
||||||
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_cached_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.get_cached_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):
|
|
||||||
doc_before_save = self.get_doc_before_save()
|
|
||||||
if not doc_before_save or cint(doc_before_save.is_group) == cint(self.is_group):
|
|
||||||
return
|
|
||||||
|
|
||||||
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"))
|
|
||||||
|
|
||||||
def validate_frozen_accounts_modifier(self):
|
def validate_frozen_accounts_modifier(self):
|
||||||
doc_before_save = self.get_doc_before_save()
|
old_value = frappe.db.get_value("Account", self.name, "freeze_account")
|
||||||
if not doc_before_save or doc_before_save.freeze_account == self.freeze_account:
|
if old_value and old_value != self.freeze_account:
|
||||||
return
|
frozen_accounts_modifier = frappe.db.get_value('Accounts Settings', None, 'frozen_accounts_modifier')
|
||||||
|
if not frozen_accounts_modifier or \
|
||||||
frozen_accounts_modifier = frappe.get_cached_value(
|
frozen_accounts_modifier not in frappe.user.get_roles():
|
||||||
"Accounts Settings", "Accounts Settings", "frozen_accounts_modifier"
|
throw(_("You are not authorized to set Frozen value"))
|
||||||
)
|
|
||||||
if not frozen_accounts_modifier or frozen_accounts_modifier not in frappe.get_roles():
|
|
||||||
throw(_("You are not authorized to set Frozen value"))
|
|
||||||
|
|
||||||
def validate_balance_must_be_debit_or_credit(self):
|
def validate_balance_must_be_debit_or_credit(self):
|
||||||
from erpnext.accounts.utils import get_balance_on
|
from erpnext.accounts.utils import get_balance_on
|
||||||
|
|
||||||
if not self.get("__islocal") and self.balance_must_be:
|
if not self.get("__islocal") and self.balance_must_be:
|
||||||
account_balance = get_balance_on(self.name)
|
account_balance = get_balance_on(self.name)
|
||||||
|
|
||||||
if account_balance > 0 and self.balance_must_be == "Credit":
|
if account_balance > 0 and self.balance_must_be == "Credit":
|
||||||
frappe.throw(
|
frappe.throw(_("Account balance already in Debit, you are not allowed to set 'Balance Must Be' as 'Credit'"))
|
||||||
_(
|
|
||||||
"Account balance already in Debit, you are not allowed to set 'Balance Must Be' as 'Credit'"
|
|
||||||
)
|
|
||||||
)
|
|
||||||
elif account_balance < 0 and self.balance_must_be == "Debit":
|
elif account_balance < 0 and self.balance_must_be == "Debit":
|
||||||
frappe.throw(
|
frappe.throw(_("Account balance already in Credit, you are not allowed to set 'Balance Must Be' as 'Debit'"))
|
||||||
_(
|
|
||||||
"Account balance already in Credit, you are not allowed to set 'Balance Must Be' as 'Debit'"
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
def validate_account_currency(self):
|
|
||||||
self.currency_explicitly_specified = True
|
|
||||||
|
|
||||||
if not self.account_currency:
|
|
||||||
self.account_currency = frappe.get_cached_value("Company", self.company, "default_currency")
|
|
||||||
self.currency_explicitly_specified = False
|
|
||||||
|
|
||||||
gl_currency = frappe.db.get_value("GL Entry", {"account": self.name}, "account_currency")
|
|
||||||
|
|
||||||
if gl_currency and self.account_currency != gl_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 validate_account_number(self, account_number=None):
|
|
||||||
if not account_number:
|
|
||||||
account_number = self.account_number
|
|
||||||
|
|
||||||
if account_number:
|
|
||||||
account_with_same_number = frappe.db.get_value(
|
|
||||||
"Account",
|
|
||||||
{"account_number": account_number, "company": self.company, "name": ["!=", self.name]},
|
|
||||||
)
|
|
||||||
if account_with_same_number:
|
|
||||||
frappe.throw(
|
|
||||||
_("Account Number {0} already used in account {1}").format(
|
|
||||||
account_number, account_with_same_number
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
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.get_cached_value(
|
|
||||||
"Account", self.parent_account, "is_group"
|
|
||||||
) and not frappe.get_cached_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 currency explicitly specified by user, child will inherit. else, default currency will be used.
|
|
||||||
"account_currency": self.account_currency
|
|
||||||
if self.currency_explicitly_specified
|
|
||||||
else 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):
|
def convert_group_to_ledger(self):
|
||||||
if self.check_if_child_exists():
|
if self.check_if_child_exists():
|
||||||
throw(_("Account with child nodes cannot be converted to ledger"))
|
throw(_("Account with child nodes cannot be converted to ledger"))
|
||||||
elif self.check_gle_exists():
|
elif self.check_gle_exists():
|
||||||
throw(_("Account with existing transaction cannot be converted to ledger"))
|
throw(_("Account with existing transaction cannot be converted to ledger"))
|
||||||
else:
|
else:
|
||||||
self.is_group = 0
|
self.group_or_ledger = 'Ledger'
|
||||||
self.save()
|
self.save()
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
@frappe.whitelist()
|
|
||||||
def convert_ledger_to_group(self):
|
def convert_ledger_to_group(self):
|
||||||
if self.check_gle_exists():
|
if self.check_gle_exists():
|
||||||
throw(_("Account with existing transaction can not be converted to group."))
|
throw(_("Account with existing transaction can not be converted to group."))
|
||||||
elif self.account_type and not self.flags.exclude_account_type_check:
|
elif self.master_type or self.account_type:
|
||||||
throw(_("Cannot convert to Group because Account Type is selected."))
|
throw(_("Cannot covert to Group because Master Type or Account Type is selected."))
|
||||||
else:
|
else:
|
||||||
self.is_group = 1
|
self.group_or_ledger = 'Group'
|
||||||
self.save()
|
self.save()
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
@@ -411,215 +108,127 @@ class Account(NestedSet):
|
|||||||
return frappe.db.get_value("GL Entry", {"account": self.name})
|
return frappe.db.get_value("GL Entry", {"account": self.name})
|
||||||
|
|
||||||
def check_if_child_exists(self):
|
def check_if_child_exists(self):
|
||||||
return frappe.db.sql(
|
return frappe.db.sql("""select name from `tabAccount` where parent_account = %s
|
||||||
"""select name from `tabAccount` where parent_account = %s
|
and docstatus != 2""", self.name)
|
||||||
and docstatus != 2""",
|
|
||||||
self.name,
|
|
||||||
)
|
|
||||||
|
|
||||||
def validate_mandatory(self):
|
def validate_mandatory(self):
|
||||||
if not self.root_type:
|
|
||||||
throw(_("Root Type is mandatory"))
|
|
||||||
|
|
||||||
if not self.report_type:
|
if not self.report_type:
|
||||||
throw(_("Report Type is mandatory"))
|
throw(_("Report Type is mandatory"))
|
||||||
|
|
||||||
def on_trash(self):
|
if not self.root_type:
|
||||||
# checks gl entries and if child exists
|
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():
|
if self.check_gle_exists():
|
||||||
throw(_("Account with existing transaction can not be deleted"))
|
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().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):
|
def get_parent_account(doctype, txt, searchfield, start, page_len, filters):
|
||||||
return frappe.db.sql(
|
return frappe.db.sql("""select name from tabAccount
|
||||||
"""select name from tabAccount
|
where group_or_ledger = 'Group' and docstatus != 2 and company = %s
|
||||||
where is_group = 1 and docstatus != 2 and company = {}
|
and %s like %s order by name limit %s, %s""" %
|
||||||
and {} like {} order by name limit {} offset {}""".format("%s", searchfield, "%s", "%s", "%s"),
|
("%s", searchfield, "%s", "%s", "%s"),
|
||||||
(filters["company"], "%%%s%%" % txt, page_len, start),
|
(filters["company"], "%%%s%%" % txt, start, page_len), as_list=1)
|
||||||
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)
|
|
||||||
|
|
||||||
|
|
||||||
@frappe.whitelist()
|
|
||||||
def update_account_number(name, account_name, account_number=None, from_descendant=False):
|
|
||||||
_ensure_idle_system()
|
|
||||||
account = frappe.get_cached_doc("Account", name)
|
|
||||||
if not account:
|
|
||||||
return
|
|
||||||
|
|
||||||
old_acc_name, old_acc_number = account.account_name, account.account_number
|
|
||||||
|
|
||||||
# check if account exists in parent company
|
|
||||||
ancestors = get_ancestors_of("Company", account.company)
|
|
||||||
allow_independent_account_creation = frappe.get_cached_value(
|
|
||||||
"Company", account.company, "allow_account_creation_against_child_company"
|
|
||||||
)
|
|
||||||
|
|
||||||
if ancestors and not allow_independent_account_creation:
|
|
||||||
for ancestor in ancestors:
|
|
||||||
old_name = frappe.db.get_value(
|
|
||||||
"Account",
|
|
||||||
{"account_number": old_acc_number, "account_name": old_acc_name, "company": ancestor},
|
|
||||||
"name",
|
|
||||||
)
|
|
||||||
|
|
||||||
if old_name and not from_descendant:
|
|
||||||
# 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"))
|
|
||||||
|
|
||||||
account.validate_account_number(account_number)
|
|
||||||
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):
|
|
||||||
_ensure_idle_system()
|
|
||||||
# Validate properties before merging
|
|
||||||
new_account = frappe.get_cached_doc("Account", new)
|
|
||||||
old_account = frappe.get_cached_doc("Account", old)
|
|
||||||
|
|
||||||
if not new_account:
|
|
||||||
throw(_("Account {0} does not exist").format(new))
|
|
||||||
|
|
||||||
if (
|
|
||||||
cint(new_account.is_group),
|
|
||||||
new_account.root_type,
|
|
||||||
new_account.company,
|
|
||||||
cstr(new_account.account_currency),
|
|
||||||
) != (
|
|
||||||
cint(old_account.is_group),
|
|
||||||
old_account.root_type,
|
|
||||||
old_account.company,
|
|
||||||
cstr(old_account.account_currency),
|
|
||||||
):
|
|
||||||
throw(
|
|
||||||
msg=_(
|
|
||||||
"""Merging is only possible if following properties are same in both records. Is Group, Root Type, Company and Account Currency"""
|
|
||||||
),
|
|
||||||
title=("Invalid Accounts"),
|
|
||||||
exc=InvalidAccountMergeError,
|
|
||||||
)
|
|
||||||
|
|
||||||
if old_account.is_group and new_account.parent_account == old:
|
|
||||||
new_account.db_set("parent_account", frappe.get_cached_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)
|
|
||||||
|
|
||||||
|
|
||||||
def _ensure_idle_system():
|
|
||||||
# Don't allow renaming if accounting entries are actively being updated, there are two main reasons:
|
|
||||||
# 1. Correctness: It's next to impossible to ensure that renamed account is not being used *right now*.
|
|
||||||
# 2. Performance: Renaming requires locking out many tables entirely and severely degrades performance.
|
|
||||||
|
|
||||||
if frappe.in_test:
|
|
||||||
return
|
|
||||||
|
|
||||||
last_gl_update = None
|
|
||||||
try:
|
|
||||||
# We also lock inserts to GL entry table with for_update here.
|
|
||||||
last_gl_update = frappe.db.get_value("GL Entry", {}, "modified", for_update=True, wait=False)
|
|
||||||
except frappe.QueryTimeoutError:
|
|
||||||
# wait=False fails immediately if there's an active transaction.
|
|
||||||
last_gl_update = add_to_date(None, seconds=-1)
|
|
||||||
|
|
||||||
if not last_gl_update:
|
|
||||||
return
|
|
||||||
|
|
||||||
if last_gl_update > add_to_date(None, minutes=-5):
|
|
||||||
frappe.throw(
|
|
||||||
_(
|
|
||||||
"Last GL Entry update was done {}. This operation is not allowed while system is actively being used. Please wait for 5 minutes before retrying."
|
|
||||||
).format(pretty_date(last_gl_update)),
|
|
||||||
title=_("System In Use"),
|
|
||||||
)
|
|
||||||
|
|||||||
@@ -1,285 +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"),
|
|
||||||
render_on_toolbar: true,
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
frappe.db.get_single_value("Accounts Settings", "show_balance_in_coa").then((value) => {
|
|
||||||
if (value) {
|
|
||||||
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) {
|
|
||||||
node.parent && node.parent.find(".balance-area").remove();
|
|
||||||
$(
|
|
||||||
'<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"
|
|
||||||
),
|
|
||||||
onchange: function () {
|
|
||||||
if (!this.value) {
|
|
||||||
this.layout.set_value("root_type", "");
|
|
||||||
}
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
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"),
|
|
||||||
"default",
|
|
||||||
true
|
|
||||||
);
|
|
||||||
|
|
||||||
treeview.page.add_inner_button(
|
|
||||||
__("Opening Invoice Creation Tool"),
|
|
||||||
function () {
|
|
||||||
frappe.set_route("Form", "Opening Invoice Creation Tool", { company: get_company() });
|
|
||||||
},
|
|
||||||
__("View"),
|
|
||||||
"default",
|
|
||||||
true
|
|
||||||
);
|
|
||||||
|
|
||||||
treeview.page.add_divider_to_button_group(__("View"));
|
|
||||||
|
|
||||||
// financial statements
|
|
||||||
for (let report of [
|
|
||||||
"Trial Balance",
|
|
||||||
"General Ledger",
|
|
||||||
"Balance Sheet",
|
|
||||||
"Profit and Loss Statement",
|
|
||||||
"Cash Flow",
|
|
||||||
"Accounts Payable",
|
|
||||||
"Accounts Receivable",
|
|
||||||
]) {
|
|
||||||
treeview.page.add_inner_button(
|
|
||||||
__(report),
|
|
||||||
function () {
|
|
||||||
frappe.set_route("query-report", report, { company: get_company() });
|
|
||||||
},
|
|
||||||
__("View")
|
|
||||||
);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
post_render: function (treeview) {
|
|
||||||
frappe.treeview_settings["Account"].treeview["tree"] = treeview.tree;
|
|
||||||
if (treeview.can_create) {
|
|
||||||
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 - {0}"), [
|
|
||||||
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.views.trees["Account"];
|
|
||||||
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: erpnext.utils.get_fiscal_year(frappe.datetime.get_today(), true)[1],
|
|
||||||
to_date: erpnext.utils.get_fiscal_year(frappe.datetime.get_today(), true)[2],
|
|
||||||
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,310 +0,0 @@
|
|||||||
# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
|
|
||||||
# License: GNU General Public License v3. See license.txt
|
|
||||||
|
|
||||||
import json
|
|
||||||
import os
|
|
||||||
|
|
||||||
import frappe
|
|
||||||
from frappe.utils import cstr
|
|
||||||
from frappe.utils.nestedset import rebuild_tree
|
|
||||||
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 children.items():
|
|
||||||
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_currency",
|
|
||||||
]:
|
|
||||||
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.get_cached_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")
|
|
||||||
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_name",
|
|
||||||
"account_type",
|
|
||||||
"root_type",
|
|
||||||
"is_group",
|
|
||||||
"tax_rate",
|
|
||||||
"account_number",
|
|
||||||
"account_currency",
|
|
||||||
]
|
|
||||||
)
|
|
||||||
):
|
|
||||||
is_group = 1
|
|
||||||
else:
|
|
||||||
is_group = 0
|
|
||||||
|
|
||||||
return is_group
|
|
||||||
|
|
||||||
|
|
||||||
@frappe.whitelist()
|
|
||||||
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)) 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.get_cached_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)) 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",
|
|
||||||
"account_currency",
|
|
||||||
],
|
|
||||||
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 child.account_currency:
|
|
||||||
tree[child.account_name]["account_currency"] = child.account_currency
|
|
||||||
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 account_master.items():
|
|
||||||
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 children.items():
|
|
||||||
account = {}
|
|
||||||
if account_name in [
|
|
||||||
"account_name",
|
|
||||||
"account_number",
|
|
||||||
"account_type",
|
|
||||||
"root_type",
|
|
||||||
"is_group",
|
|
||||||
"tax_rate",
|
|
||||||
"account_currency",
|
|
||||||
]:
|
|
||||||
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,438 +0,0 @@
|
|||||||
{
|
|
||||||
"country_code": "at",
|
|
||||||
"name": "Austria - Chart of Accounts",
|
|
||||||
"tree": {
|
|
||||||
"Klasse 0 Aktiva: Anlageverm\u00f6gen": {
|
|
||||||
"0100 Konzessionen ": {"account_type": "Fixed Asset"},
|
|
||||||
"0110 Patentrechte und Lizenzen ": {"account_type": "Fixed Asset"},
|
|
||||||
"0120 Datenverarbeitungsprogramme ": {"account_type": "Fixed Asset"},
|
|
||||||
"0130 Marken, Warenzeichen und Musterschutzrechte, sonstige Urheberrechte ": {"account_type": "Fixed Asset"},
|
|
||||||
"0140 Pacht- und Mietrechte ": {"account_type": "Fixed Asset"},
|
|
||||||
"0150 Bezugs- und ähnliche Rechte ": {"account_type": "Fixed Asset"},
|
|
||||||
"0160 Geschäfts-/Firmenwert ": {"account_type": "Fixed Asset"},
|
|
||||||
"0170 Umgründungsmehrwert ": {"account_type": "Fixed Asset"},
|
|
||||||
"0180 Geleistete Anzahlungen auf immaterielle Vermögensgegenstände": {"account_type": "Fixed Asset"},
|
|
||||||
"0190 Kumulierte Abschreibungen zu immateriellen Vermögensgegenständen ": {"account_type": "Fixed Asset"},
|
|
||||||
"0200 Unbebaute Grundstücke, soweit nicht landwirtschaftlich genutzt ": {"account_type": "Fixed Asset"},
|
|
||||||
"0210 Bebaute Grundstücke (Grundwert) ": {"account_type": "Fixed Asset"},
|
|
||||||
"0220 Landwirtschaftlich genutzte Grundstücke ": {"account_type": "Fixed Asset"},
|
|
||||||
"0230 Grundstücksgleiche Rechte ": {"account_type": "Fixed Asset"},
|
|
||||||
"0300 Betriebs- und Geschäftsgebäude auf eigenem Grund ": {"account_type": "Fixed Asset"},
|
|
||||||
"0310 Wohn- und Sozialgebäude auf eigenem Grund ": {"account_type": "Fixed Asset"},
|
|
||||||
"0320 Betriebs- und Geschäftsgebäude auf fremdem Grund ": {"account_type": "Fixed Asset"},
|
|
||||||
"0330 Wohn- und Sozialgebäude auf fremdem Grund ": {"account_type": "Fixed Asset"},
|
|
||||||
"0340 Grundstückseinrichtungen auf eigenem Grund ": {"account_type": "Fixed Asset"},
|
|
||||||
"0350 Grundstückseinrichtungen auf fremdem Grund ": {"account_type": "Fixed Asset"},
|
|
||||||
"0360 Bauliche Investitionen in fremden (gepachteten) Betriebs- und Geschäftsgebäuden": {"account_type": "Fixed Asset"},
|
|
||||||
"0370 Bauliche Investitionen in fremden (gepachteten) Wohn- und Sozialgebäuden": {"account_type": "Fixed Asset"},
|
|
||||||
"0390 Kumulierte Abschreibungen zu Grundstücken ": {"account_type": "Fixed Asset"},
|
|
||||||
"0400 Maschinen und Geräte ": {"account_type": "Fixed Asset"},
|
|
||||||
"0500 Maschinenwerkzeuge ": {"account_type": "Fixed Asset"},
|
|
||||||
"0510 Allgemeine Werkzeuge und Handwerkzeuge ": {"account_type": "Fixed Asset"},
|
|
||||||
"0520 Prototypen, Formen, Modelle ": {"account_type": "Fixed Asset"},
|
|
||||||
"0530 Andere Erzeugungshilfsmittel (auch Softwarewerkzeuge)": {"account_type": "Fixed Asset"},
|
|
||||||
"0540 Hebezeuge und Montageanlagen ": {"account_type": "Fixed Asset"},
|
|
||||||
"0550 Geringwertige Vermögensgegenstände, soweit im Erzeugungsprozess ": {"account_type": "Fixed Asset"},
|
|
||||||
"0560 Festwerte technische Anlagen und Maschinen ": {"account_type": "Fixed Asset"},
|
|
||||||
"0590 Kumulierte Abschreibungen zu technischen Anlagen und Maschinen ": {"account_type": "Fixed Asset"},
|
|
||||||
"0600 Betriebs- und Geschäftsausstattung, soweit nicht gesondert angeführt ": {"account_type": "Fixed Asset"},
|
|
||||||
"0610 Andere Anlagen, soweit nicht gesondert angeführt ": {"account_type": "Fixed Asset"},
|
|
||||||
"0620 Büromaschinen, EDV-Anlagen ": {"account_type": "Fixed Asset"},
|
|
||||||
"0630 PKW und Kombis ": {"account_type": "Fixed Asset"},
|
|
||||||
"0640 LKW ": {"account_type": "Fixed Asset"},
|
|
||||||
"0650 Andere Beförderungsmittel ": {"account_type": "Fixed Asset"},
|
|
||||||
"0660 Gebinde ": {"account_type": "Fixed Asset"},
|
|
||||||
"0670 Geringwertige Vermögensgegenstände, soweit nicht im Erzeugungssprozess verwendet": {"account_type": "Fixed Asset"},
|
|
||||||
"0680 Festwerte außer technische Anlagen und Maschinen ": {"account_type": "Fixed Asset"},
|
|
||||||
"0690 Kumulierte Abschreibungen zu anderen Anlagen, Betriebs- und Geschäftsausstattung": {"account_type": "Fixed Asset"},
|
|
||||||
"0700 Geleistete Anzahlungen auf Sachanlagen ": {"account_type": "Fixed Asset"},
|
|
||||||
"0710 Anlagen in Bau ": {"account_type": "Fixed Asset"},
|
|
||||||
"0790 Kumulierte Abschreibungen zu geleisteten Anzahlungen auf Sachanlagen ": {"account_type": "Fixed Asset"},
|
|
||||||
"0800 Anteile an verbundenen Unternehmen ": {"account_type": "Fixed Asset"},
|
|
||||||
"0810 Beteiligungen an Gemeinschaftsunternehmen ": {"account_type": "Fixed Asset"},
|
|
||||||
"0820 Beteiligungen an angeschlossenen (assoziierten) Unternehmen ": {"account_type": "Fixed Asset"},
|
|
||||||
"0830 Eigene Anteile, Anteile an herrschenden oder mit Mehrheit beteiligten ": {"account_type": "Fixed Asset"},
|
|
||||||
"0840 Sonstige Beteiligungen ": {"account_type": "Fixed Asset"},
|
|
||||||
"0850 Ausleihungen an verbundene Unternehmen ": {"account_type": "Fixed Asset"},
|
|
||||||
"0860 Ausleihungen an Unternehmen mit Beteiligungsverhältnis": {"account_type": "Fixed Asset"},
|
|
||||||
"0870 Ausleihungen an Gesellschafter ": {"account_type": "Fixed Asset"},
|
|
||||||
"0880 Sonstige Ausleihungen ": {"account_type": "Fixed Asset"},
|
|
||||||
"0890 Anteile an Kapitalgesellschaften ohne Beteiligungscharakter ": {"account_type": "Fixed Asset"},
|
|
||||||
"0900 Anteile an Personengesellschaften ohne Beteiligungscharakter ": {"account_type": "Fixed Asset"},
|
|
||||||
"0910 Genossenschaftsanteile ohne Beteiligungscharakter ": {"account_type": "Fixed Asset"},
|
|
||||||
"0920 Anteile an Investmentfonds ": {"account_type": "Fixed Asset"},
|
|
||||||
"0930 Festverzinsliche Wertpapiere des Anlagevermögens ": {"account_type": "Fixed Asset"},
|
|
||||||
"0980 Geleistete Anzahlungen auf Finanzanlagen ": {"account_type": "Fixed Asset"},
|
|
||||||
"0990 Kumulierte Abschreibungen zu Finanzanlagen ": {"account_type": "Fixed Asset"},
|
|
||||||
"root_type": "Asset"
|
|
||||||
},
|
|
||||||
"Klasse 1 Aktiva: Vorr\u00e4te": {
|
|
||||||
"1000 Bezugsverrechnung": {"account_type": "Stock"},
|
|
||||||
"1100 Rohstoffe": {"account_type": "Stock"},
|
|
||||||
"1200 Bezogene Teile": {"account_type": "Stock"},
|
|
||||||
"1300 Hilfsstoffe": {"account_type": "Stock"},
|
|
||||||
"1350 Betriebsstoffe": {"account_type": "Stock"},
|
|
||||||
"1360 Vorrat Energietraeger": {"account_type": "Stock"},
|
|
||||||
"1400 Unfertige Erzeugnisse": {"account_type": "Stock"},
|
|
||||||
"1500 Fertige Erzeugnisse": {"account_type": "Stock"},
|
|
||||||
"1600 Handelswarenvorrat": {"account_type": "Stock Received But Not Billed"},
|
|
||||||
"1700 Noch nicht abrechenbare Leistungen": {"account_type": "Stock"},
|
|
||||||
"1800 Geleistete Anzahlungen": {"account_type": "Stock"},
|
|
||||||
"1900 Wertberichtigungen": {"account_type": "Stock"},
|
|
||||||
"root_type": "Asset"
|
|
||||||
},
|
|
||||||
"Klasse 3 Passiva: Verbindlichkeiten": {
|
|
||||||
"3000 Allgemeine Verbindlichkeiten (Schuld)": {"account_type": "Payable"},
|
|
||||||
"3010 R\u00fcckstellungen f\u00fcr Pensionen": {"account_type": "Payable"},
|
|
||||||
"3020 Steuerr\u00fcckstellungen": {"account_type": "Tax"},
|
|
||||||
"3041 Sonstige R\u00fcckstellungen": {"account_type": "Payable"},
|
|
||||||
"3110 Verbindlichkeiten gegen\u00fcber Bank": {"account_type": "Payable"},
|
|
||||||
"3150 Verbindlichkeiten Darlehen": {"account_type": "Payable"},
|
|
||||||
"3185 Verbindlichkeiten Kreditkarte": {"account_type": "Payable"},
|
|
||||||
"3380 Verbindlichkeiten aus der Annahme gezogener Wechsel u. d. Ausstellungen eigener Wechsel": {
|
|
||||||
"account_type": "Payable"
|
|
||||||
},
|
|
||||||
"3400 Verbindlichkeiten gegen\u00fc. verb. Untern., Verbindl. gegen\u00fc. Untern., mit denen eine Beteiligungsverh\u00e4lnis besteht": {},
|
|
||||||
"3460 Verbindlichkeiten gegenueber Gesellschaftern": {"account_type": "Payable"},
|
|
||||||
"3470 Einlagen stiller Gesellschafter": {"account_type": "Payable"},
|
|
||||||
"3585 Verbindlichkeiten Lohnsteuer": {"account_type": "Tax"},
|
|
||||||
"3590 Verbindlichkeiten Kommunalabgaben": {"account_type": "Tax"},
|
|
||||||
"3595 Verbindlichkeiten Dienstgeberbeitrag": {"account_type": "Tax"},
|
|
||||||
"3600 Verbindlichkeiten Sozialversicherung": {"account_type": "Payable"},
|
|
||||||
"3640 Verbindlichkeiten Loehne und Gehaelter": {"account_type": "Payable"},
|
|
||||||
"3700 Sonstige Verbindlichkeiten": {"account_type": "Payable"},
|
|
||||||
"3900 Passive Rechnungsabgrenzungsposten": {"account_type": "Payable"},
|
|
||||||
"3100 Anleihen (einschlie\u00dflich konvertibler)": {"account_type": "Payable"},
|
|
||||||
"3200 Erhaltene Anzahlungen auf Bestellungen": {"account_type": "Payable"},
|
|
||||||
"3040 R\u00fcckstellungen f\u00fcr Abfertigung": {"account_type": "Payable"},
|
|
||||||
|
|
||||||
"3530 USt. \u00a719 (reverse charge)": {
|
|
||||||
"account_type": "Tax"
|
|
||||||
},
|
|
||||||
"3500 Verbindlichkeiten aus Umsatzsteuer": {"account_type": "Tax"},
|
|
||||||
"3580 Umsatzsteuer Zahllast": {
|
|
||||||
"account_type": "Tax"
|
|
||||||
},
|
|
||||||
"3510 Umsatzsteuer Inland 20%": {
|
|
||||||
"account_type": "Tax"
|
|
||||||
},
|
|
||||||
"3515 Umsatzsteuer Inland 10%": {
|
|
||||||
"account_type": "Tax"
|
|
||||||
},
|
|
||||||
"3520 Umsatzsteuer aus i.g. Erwerb 20%": {
|
|
||||||
"account_type": "Tax"
|
|
||||||
},
|
|
||||||
"3525 Umsatzsteuer aus i.g. Erwerb 10%": {
|
|
||||||
"account_type": "Tax"
|
|
||||||
},
|
|
||||||
"3560 Umsatzsteuer-Evidenzkonto f\u00fcr erhaltene Anzahlungen auf Bestellungen": {},
|
|
||||||
"3360 Verbindlichkeiten aus Lieferungen u. Leistungen EU": {
|
|
||||||
"account_type": "Payable"
|
|
||||||
},
|
|
||||||
"3000 Verbindlichkeiten aus Lieferungen u. Leistungen Inland": {
|
|
||||||
"account_type": "Payable"
|
|
||||||
},
|
|
||||||
"3370 Verbindlichkeiten aus Lieferungen u. Leistungen sonst. Ausland": {
|
|
||||||
"account_type": "Payable"
|
|
||||||
},
|
|
||||||
"3400 Verbindlichkeiten gegen\u00fcber verbundenen Unternehmen": {},
|
|
||||||
"3570 Verrechnung Finanzamt": {
|
|
||||||
"account_type": "Tax"
|
|
||||||
},
|
|
||||||
"root_type": "Liability"
|
|
||||||
},
|
|
||||||
"Klasse 2 Aktiva: Umlaufverm\u00f6gen, Rechnungsabgrenzungen": {
|
|
||||||
"2030 Forderungen aus Lieferungen und Leistungen Inland (0% USt, umsatzsteuerfrei)": {
|
|
||||||
"account_type": "Receivable"
|
|
||||||
},
|
|
||||||
"2010 Forderungen aus Lieferungen und Leistungen Inland (10% USt, umsatzsteuerfrei)": {
|
|
||||||
"account_type": "Receivable"
|
|
||||||
},
|
|
||||||
"2000 Forderungen aus Lieferungen und Leistungen Inland (20% USt, umsatzsteuerfrei)": {
|
|
||||||
"account_type": "Receivable"
|
|
||||||
},
|
|
||||||
"2040 Forderungen aus Lieferungen und Leistungen Inland (sonstiger USt-Satz)": {
|
|
||||||
"account_type": "Receivable"
|
|
||||||
},
|
|
||||||
"2100 Forderungen aus Lieferungen und Leistungen EU": {
|
|
||||||
"account_type": "Receivable"
|
|
||||||
},
|
|
||||||
"2150 Forderungen aus Lieferungen und Leistungen Ausland (Nicht-EU)": {
|
|
||||||
"account_type": "Receivable"
|
|
||||||
},
|
|
||||||
"2200 Forderungen gegen\u00fcber verbundenen Unternehmen": {
|
|
||||||
"account_type": "Receivable"
|
|
||||||
},
|
|
||||||
"2250 Forderungen gegen\u00fcber Unternehmen, mit denen ein Beteiligungsverh\u00e4ltnis besteht": {
|
|
||||||
"account_type": "Receivable"
|
|
||||||
},
|
|
||||||
"2300 Sonstige Forderungen und Verm\u00f6gensgegenst\u00e4nde": {
|
|
||||||
"account_type": "Receivable"
|
|
||||||
},
|
|
||||||
"2630 Sonstige Wertpapiere": {
|
|
||||||
"account_type": "Stock"
|
|
||||||
},
|
|
||||||
"2750 Kassenbest\u00e4nde in Fremdw\u00e4hrung": {
|
|
||||||
"account_type": "Cash"
|
|
||||||
},
|
|
||||||
"2900 Aktive Rechnungsabrenzungsposten": {
|
|
||||||
"account_type": "Receivable"
|
|
||||||
},
|
|
||||||
"2600 Anteile an verbundenen Unternehmen": {
|
|
||||||
"account_type": "Equity"
|
|
||||||
},
|
|
||||||
"2680 Besitzwechsel ohne Forderungen": {
|
|
||||||
"account_type": "Receivable"
|
|
||||||
},
|
|
||||||
"2950 Aktiviertes Disagio": {
|
|
||||||
"account_type": "Receivable"
|
|
||||||
},
|
|
||||||
"2610 Eigene Anteile und Wertpapiere an mit Mehrheit beteiligten Unternehmen": {
|
|
||||||
"account_type": "Receivable"
|
|
||||||
},
|
|
||||||
"2570 Einfuhrumsatzsteuer (bezahlt)": {"account_type": "Tax"},
|
|
||||||
|
|
||||||
"2460 Eingeforderte aber noch nicht eingezahlte Einlagen": {
|
|
||||||
"account_type": "Receivable"
|
|
||||||
},
|
|
||||||
"2180 Einzelwertberichtigungen zu Forderungen aus Lief. und Leist. Ausland": {
|
|
||||||
"account_type": "Receivable"
|
|
||||||
},
|
|
||||||
"2130 Einzelwertberichtigungen zu Forderungen aus Lief. und Leist. EU": {
|
|
||||||
"account_type": "Receivable"
|
|
||||||
},
|
|
||||||
"2080 Einzelwertberichtigungen zu Forderungen aus Lief. und Leist. Inland ": {
|
|
||||||
"account_type": "Receivable"
|
|
||||||
},
|
|
||||||
"2270 Einzelwertberichtigungen zu Forderungen gegen\u00fcber Unternehmen mit denen ein Beteiligungsverh\u00e4ltnis besteht": {
|
|
||||||
"account_type": "Receivable"
|
|
||||||
},
|
|
||||||
"2230 Einzelwertberichtigungen zu Forderungen gegen\u00fcber verbundenen Unternehmen": {
|
|
||||||
"account_type": "Receivable"
|
|
||||||
},
|
|
||||||
"2470 Einzelwertberichtigungen zu sonstigen Forderungen und Verm\u00f6gensgegenst\u00e4nden": {
|
|
||||||
"account_type": "Receivable"
|
|
||||||
},
|
|
||||||
"2700 Kassenbestand": {
|
|
||||||
"account_type": "Cash"
|
|
||||||
},
|
|
||||||
"2190 Pauschalwertberichtigungen zu Forderungen aus Lief. und Leist. sonstiges Ausland": {
|
|
||||||
"account_type": "Receivable"
|
|
||||||
},
|
|
||||||
"2130 Pauschalwertberichtigungen zu Forderungen aus Lief. und Leist. EU": {
|
|
||||||
"account_type": "Receivable"
|
|
||||||
},
|
|
||||||
"2100 Pauschalwertberichtigungen zu Forderungen aus Lief. und Leist. Inland ": {
|
|
||||||
"account_type": "Receivable"
|
|
||||||
},
|
|
||||||
"2280 Pauschalwertberichtigungen zu Forderungen gegen\u00fcber Unternehmen mit denen ein Beteiligungsverh\u00e4ltnis besteht": {
|
|
||||||
"account_type": "Receivable"
|
|
||||||
},
|
|
||||||
"2240 Pauschalwertberichtigungen zu Forderungen gegen\u00fcber verbundenen Unternehmen": {
|
|
||||||
"account_type": "Receivable"
|
|
||||||
},
|
|
||||||
"2480 Pauschalwertberichtigungen zu sonstigen Forderungen und Verm\u00f6gensgegenst\u00e4nden": {
|
|
||||||
"account_type": "Receivable"
|
|
||||||
},
|
|
||||||
"2740 Postwertzeichen": {
|
|
||||||
"account_type": "Cash"
|
|
||||||
},
|
|
||||||
"2780 Schecks in Euro": {
|
|
||||||
"account_type": "Cash"
|
|
||||||
},
|
|
||||||
"2800 Guthaben bei Bank": {
|
|
||||||
"account_type": "Bank"
|
|
||||||
},
|
|
||||||
"2801 Guthaben bei Bank - Sparkonto": {
|
|
||||||
"account_type": "Bank"
|
|
||||||
},
|
|
||||||
"2810 Guthaben bei Paypal": {
|
|
||||||
"account_type": "Bank"
|
|
||||||
},
|
|
||||||
"2930 Mietvorauszahlungen": {
|
|
||||||
"account_type": "Receivable"
|
|
||||||
},
|
|
||||||
"2980 Abgrenzung latenter Steuern": {
|
|
||||||
"account_type": "Receivable"
|
|
||||||
},
|
|
||||||
"2500 Vorsteuer": {
|
|
||||||
"account_type": "Receivable"
|
|
||||||
},
|
|
||||||
"2510 Vorsteuer Inland 10%": {
|
|
||||||
"account_type": "Tax"
|
|
||||||
},
|
|
||||||
"2895 Schwebende Geldbewegugen": {
|
|
||||||
"account_type": "Bank"
|
|
||||||
},
|
|
||||||
"2513 Vorsteuer Inland 5%": {
|
|
||||||
"account_type": "Tax"
|
|
||||||
},
|
|
||||||
"2515 Vorsteuer Inland 20%": {
|
|
||||||
"account_type": "Tax"
|
|
||||||
},
|
|
||||||
"2520 Vorsteuer aus innergemeinschaftlichem Erwerb 10%": {
|
|
||||||
"account_type": "Tax"
|
|
||||||
},
|
|
||||||
"2525 Vorsteuer aus innergemeinschaftlichem Erwerb 20%": {
|
|
||||||
"account_type": "Tax"
|
|
||||||
},
|
|
||||||
"2530 Vorsteuer \u00a719/Art 19 ( reverse charge ) ": {
|
|
||||||
"account_type": "Tax"
|
|
||||||
},
|
|
||||||
"2690 Wertberichtigungen zu Wertpapieren und Anteilen": {
|
|
||||||
"account_type": "Receivable"
|
|
||||||
},
|
|
||||||
"root_type": "Asset"
|
|
||||||
},
|
|
||||||
"Klasse 4: Betriebliche Erträge": {
|
|
||||||
"4000 Erlöse 20 %": {"account_type": "Income Account"},
|
|
||||||
"4020 Erl\u00f6se 0 % steuerbefreit": {"account_type": "Income Account"},
|
|
||||||
"4010 Erl\u00f6se 10 %": {"account_type": "Income Account"},
|
|
||||||
"4030 Erl\u00f6se 13 %": {"account_type": "Income Account"},
|
|
||||||
"4040 Erl\u00f6se 0 % innergemeinschaftliche Lieferungen": {"account_type": "Income Account"},
|
|
||||||
"4400 Erl\u00f6sreduktion 0 % steuerbefreit": {"account_type": "Expense Account"},
|
|
||||||
"4410 Erl\u00f6sreduktion 10 %": {"account_type": "Expense Account"},
|
|
||||||
"4420 Erl\u00f6sreduktion 20 %": {"account_type": "Expense Account"},
|
|
||||||
"4430 Erl\u00f6sreduktion 13 %": {"account_type": "Expense Account"},
|
|
||||||
"4440 Erl\u00f6sreduktion 0 % innergemeinschaftliche Lieferungen": {"account_type": "Expense Account"},
|
|
||||||
"4500 Ver\u00e4nderungen des Bestandes an fertigen und unfertigen Erzeugn. sowie an noch nicht abrechenbaren Leistungen": {"account_type": "Income Account"},
|
|
||||||
"4580 Aktivierte Eigenleistungen": {"account_type": "Income Account"},
|
|
||||||
"4600 Erl\u00f6se aus dem Abgang vom Anlageverm\u00f6gen, ausgen. Finanzanlagen": {"account_type": "Income Account"},
|
|
||||||
"4630 Ertr\u00e4ge aus dem Abgang vom Anlageverm\u00f6gen, ausgen. Finanzanlagen": {"account_type": "Income Account"},
|
|
||||||
"4660 Ertr\u00e4ge aus der Zuschreibung zum Anlageverm\u00f6gen, ausgen. Finanzanlagen": {"account_type": "Income Account"},
|
|
||||||
"4700 Ertr\u00e4ge aus der Aufl\u00f6sung von R\u00fcckstellungen": {"account_type": "Income Account"},
|
|
||||||
"4800 \u00dcbrige betriebliche Ertr\u00e4ge": {"account_type": "Income Account"},
|
|
||||||
"root_type": "Income"
|
|
||||||
},
|
|
||||||
"Klasse 5: Aufwand f\u00fcr Material und Leistungen": {
|
|
||||||
"5000 Einkauf Partnerleistungen": {"account_type": "Cost of Goods Sold"},
|
|
||||||
"5100 Verbrauch an Rohstoffen": {"account_type": "Cost of Goods Sold"},
|
|
||||||
"5200 Verbrauch von bezogenen Fertig- und Einzelteilen": {"account_type": "Cost of Goods Sold"},
|
|
||||||
"5300 Verbrauch von Hilfsstoffen": {"account_type": "Cost of Goods Sold"},
|
|
||||||
"5340 Verbrauch Verpackungsmaterial": {"account_type": "Cost of Goods Sold"},
|
|
||||||
"5470 Verbrauch von Kleinmaterial": {"account_type": "Cost of Goods Sold"},
|
|
||||||
"5450 Verbrauch von Reinigungsmaterial": {"account_type": "Cost of Goods Sold"},
|
|
||||||
"5400 Verbrauch von Betriebsstoffen": {"account_type": "Cost of Goods Sold"},
|
|
||||||
"5500 Verbrauch von Werkzeugen und anderen Erzeugungshilfsmittel": {"account_type": "Cost of Goods Sold"},
|
|
||||||
"5600 Verbrauch von Brenn- und Treibstoffen, Energie und Wasser": {"account_type": "Cost of Goods Sold"},
|
|
||||||
"5700 Bearbeitung durch Dritte": {"account_type": "Cost of Goods Sold"},
|
|
||||||
"5900 Aufwandsstellenrechnung Material": {"account_type": "Cost of Goods Sold"},
|
|
||||||
"5820 Skontoertr\u00e4ge (20% USt.)": {"account_type": "Income Account"},
|
|
||||||
"5810 Skontoertr\u00e4ge (10% USt.)": {"account_type": "Income Account"},
|
|
||||||
"5010 Handelswareneinkauf 10 %": {"account_type": "Cost of Goods Sold"},
|
|
||||||
"5020 Handelswareneinkauf 20 %": {"account_type": "Cost of Goods Sold"},
|
|
||||||
"5040 Handelswareneinkauf innergemeinschaftlicher Erwerb 10 % VSt/10 % USt": {"account_type": "Cost of Goods Sold"},
|
|
||||||
"5050 Handelswareneinkauf innergemeinschaftlicher Erwerb 20 % VSt/20 % USt": {"account_type": "Cost of Goods Sold"},
|
|
||||||
"5070 Handelswareneinkauf innergemeinschaftlicher Erwerb ohne Vorsteuerabzug und 10 % USt": {"account_type": "Cost of Goods Sold"},
|
|
||||||
"5080 Handelswareneinkauf innergemeinschaftlicher Erwerb ohne Vorsteuerabzug und 20 % USt": {"account_type": "Cost of Goods Sold"},
|
|
||||||
"root_type": "Expense"
|
|
||||||
},
|
|
||||||
"Klasse 6: Personalaufwand": {
|
|
||||||
"6000 L\u00f6hne": {"account_type": "Payable"},
|
|
||||||
"6200 Geh\u00e4lter": {"account_type": "Payable"},
|
|
||||||
"6400 Aufwendungen f\u00fcr Abfertigungen": {"account_type": "Payable"},
|
|
||||||
"6450 Aufwendungen f\u00fcr Altersversorgung": {"account_type": "Payable"},
|
|
||||||
"6500 Gesetzlicher Sozialaufwand Arbeiter": {"account_type": "Payable"},
|
|
||||||
"6560 Gesetzlicher Sozialaufwand Angestellte": {"account_type": "Payable"},
|
|
||||||
"6600 Lohnabh\u00e4ngige Abgaben und Pflichtbeitr\u00e4gte": {"account_type": "Payable"},
|
|
||||||
"6660 Gehaltsabh\u00e4ngige Abgaben und Pflichtbeitr\u00e4gte": {"account_type": "Payable"},
|
|
||||||
"6700 Sonstige Sozialaufwendungen": {"account_type": "Payable"},
|
|
||||||
"6900 Aufwandsstellenrechnung Personal": {"account_type": "Payable"},
|
|
||||||
"root_type": "Expense"
|
|
||||||
},
|
|
||||||
"Klasse 7: Abschreibungen und sonstige betriebliche Aufwendungen": {
|
|
||||||
"7010 Abschreibungen auf das Anlageverm\u00f6gen (ausgenommen Finanzanlagen)": {"account_type": "Depreciation"},
|
|
||||||
"7100 Sonstige Steuern und Geb\u00fchren": {"account_type": "Tax"},
|
|
||||||
"7200 Instandhaltung u. Reinigung durch Dritte, Entsorgung, Energie": {"account_type": "Expense Account"},
|
|
||||||
"7300 Transporte durch Dritte": {"account_type": "Expense Account"},
|
|
||||||
"7310 Fahrrad - Aufwand": {"account_type": "Expense Account"},
|
|
||||||
"7320 Kfz - Aufwand": {"account_type": "Expense Account"},
|
|
||||||
"7330 LKW - Aufwand": {"account_type": "Expense Account"},
|
|
||||||
"7340 Lastenrad - Aufwand": {"account_type": "Expense Account"},
|
|
||||||
"7350 Reise- und Fahraufwand": {"account_type": "Expense Account"},
|
|
||||||
"7360 Tag- und N\u00e4chtigungsgelder": {"account_type": "Expense Account"},
|
|
||||||
"7380 Nachrichtenaufwand": {"account_type": "Expense Account"},
|
|
||||||
"7400 Miet- und Pachtaufwand": {"account_type": "Expense Account"},
|
|
||||||
"7440 Leasingaufwand": {"account_type": "Expense Account"},
|
|
||||||
"7480 Lizenzaufwand": {"account_type": "Expense Account"},
|
|
||||||
"7500 Aufwand f\u00fcr beigestelltes Personal": {"account_type": "Expense Account"},
|
|
||||||
"7540 Provisionen an Dritte": {"account_type": "Expense Account"},
|
|
||||||
"7580 Aufsichtsratsverg\u00fctungen": {"account_type": "Expense Account"},
|
|
||||||
"7610 Druckerzeugnisse und Vervielf\u00e4ltigungen": {"account_type": "Expense Account"},
|
|
||||||
"7650 Werbung und Repr\u00e4sentationen": {"account_type": "Expense Account"},
|
|
||||||
"7700 Versicherungen": {"account_type": "Expense Account"},
|
|
||||||
"7750 Beratungs- und Pr\u00fcfungsaufwand": {"account_type": "Expense Account"},
|
|
||||||
"7800 Forderungsverluste und Schadensf\u00e4lle": {"account_type": "Expense Account"},
|
|
||||||
"7840 Verschiedene betriebliche Aufwendungen": {"account_type": "Expense Account"},
|
|
||||||
"7910 Aufwandsstellenrechung der Hersteller": {"account_type": "Expense Account"},
|
|
||||||
"7060 Sofortabschreibungen geringwertig": {"account_type": "Expense Account"},
|
|
||||||
"7070 Abschreibungen vom Umlaufverm\u00f6gen, soweit diese die im Unternehmen \u00fcblichen Abschreibungen \u00fcbersteigen": {"account_type": "Depreciation"},
|
|
||||||
"7900 Aufwandsstellenrechnung": {"account_type": "Expense Account"},
|
|
||||||
"7770 Aus- und Fortbildung": {"account_type": "Expense Account"},
|
|
||||||
"7820 Buchwert abgegangener Anlagen, ausgenommen Finanzanlagen": {"account_type": "Expense Account"},
|
|
||||||
"7600 B\u00fcromaterial und Drucksorten": {"account_type": "Expense Account"},
|
|
||||||
"7630 Fachliteratur und Zeitungen ": {"account_type": "Expense Account"},
|
|
||||||
"7960 Herstellungskosten der zur Erzielung der Umsatzerl\u00f6se erbrachten Leistungen": {"account_type": "Expense Account"},
|
|
||||||
"7780 Mitgliedsbeitr\u00e4ge": {"account_type": "Expense Account"},
|
|
||||||
"7880 Skontoertr\u00e4ge auf sonstige betriebliche Aufwendungen": {"account_type": "Expense Account"},
|
|
||||||
"7990 Sonstige betrieblichen Aufwendungen": {"account_type": "Expense Account"},
|
|
||||||
"7680 Spenden und Trinkgelder": {"account_type": "Expense Account"},
|
|
||||||
"7790 Spesen des Geldverkehrs": {"account_type": "Expense Account"},
|
|
||||||
"7830 Verluste aus dem Abgang vom Anlageverm\u00f6gen, ausgenommen Finanzanlagen": {"account_type": "Expense Account"},
|
|
||||||
"7970 Vertriebskosten": {"account_type": "Expense Account"},
|
|
||||||
"7980 Verwaltungskosten": {"account_type": "Expense Account"},
|
|
||||||
"root_type": "Expense"
|
|
||||||
},
|
|
||||||
"Klasse 8: Finanz- und ausserordentliche Ertr\u00e4ge und Aufwendungen": {
|
|
||||||
"8000 Ertr\u00e4ge aus Beteiligungen": {"account_type": "Income Account"},
|
|
||||||
"8050 Ertr\u00e4ge aus anderen Wertpapieren und Ausleihungen des Finanzanlageverm\u00f6gens": {"account_type": "Income Account"},
|
|
||||||
"8100 Zinsen aus Bankguthaben": {"account_type": "Income Account"},
|
|
||||||
"8110 Zinsen aus gewaehrten Darlehen": {"account_type": "Income Account"},
|
|
||||||
"8130 Verzugszinsenertraege": {"account_type": "Income Account"},
|
|
||||||
"8220 Aufwendungen aus Beteiligungen": {"account_type": "Expense Account"},
|
|
||||||
"8260 Aufwendungen aus sonst. Fiananzanlagen und aus Wertpapieren des Umlaufverm\u00f6gens": {},
|
|
||||||
"8280 Zinsen und \u00e4hnliche Aufwendungem": {"account_type": "Expense Account"},
|
|
||||||
"8400 Au\u00dferordentliche Ertr\u00e4ge": {"account_type": "Income Account"},
|
|
||||||
"8450 Au\u00dferordentliche Aufwendungen": {"account_type": "Expense Account"},
|
|
||||||
"8500 Steuern vom Einkommen und vom Ertrag": {
|
|
||||||
"account_type": "Tax"
|
|
||||||
},
|
|
||||||
"8600 Aufl\u00f6sung unversteuerten R\u00fccklagen": {"account_type": "Income Account"},
|
|
||||||
"8700 Aufl\u00f6sung von Kapitalr\u00fccklagen": {"account_type": "Income Account"},
|
|
||||||
"8750 Aufl\u00f6sung von Gewinnr\u00fccklagen": {"account_type": "Income Account"},
|
|
||||||
"8800 Zuweisung zu unversteuerten R\u00fccklagen": {"account_type": "Expense Account"},
|
|
||||||
"8900 Zuweisung zu Gewinnr\u00fccklagen": {"account_type": "Expense Account"},
|
|
||||||
"8100 Buchwert abgegangener Beteiligungen": {"account_type": "Expense Account"},
|
|
||||||
"8130 Buchwert abgegangener Wertpapiere des Umlaufverm\u00f6gens": {"account_type": "Expense Account"},
|
|
||||||
"8120 Buchwert abgegangener sonstiger Finanzanlagen": {"account_type": "Expense Account"},
|
|
||||||
"8990 Gewinnabfuhr bzw. Verlust\u00fcberrechnung aus Ergebnisabf\u00fchrungsvertr\u00e4gen": {"account_type": "Expense Account"},
|
|
||||||
"8350 nicht ausgenutzte Lieferantenskonti": {"account_type": "Expense Account"},
|
|
||||||
"root_type": "Income"
|
|
||||||
},
|
|
||||||
"Klasse 9 Passiva: Eigenkapital, R\u00fccklagen, stille Einlagen, Abschlusskonten": {
|
|
||||||
"9000 Gezeichnetes bzw. gewidmetes Kapital": {
|
|
||||||
"account_type": "Equity"
|
|
||||||
},
|
|
||||||
"9200 Kapitalr\u00fccklagen": {
|
|
||||||
"account_type": "Equity"
|
|
||||||
},
|
|
||||||
"9300 Gewinnr\u00fccklagen": {
|
|
||||||
"account_type": "Equity"
|
|
||||||
},
|
|
||||||
"9400 Bewertungsreserven uns sonst. unversteuerte R\u00fccklagen": {
|
|
||||||
"account_type": "Equity"
|
|
||||||
},
|
|
||||||
"9600 Private Entnahmen": {"account_type": "Equity"},
|
|
||||||
"9610 Privatsteuern": {"account_type": "Equity"},
|
|
||||||
"9700 Einlagen stiller Gesellschafter ": {"account_type": "Equity"},
|
|
||||||
"9900 Evidenzkonto": {"account_type": "Equity"},
|
|
||||||
"9800 Er\u00f6ffnungsbilanzkonto (EBK)": {"account_type": "Equity"},
|
|
||||||
"9880 Jahresergebnis laut Gewinn- und Verlustrechnung (G+V)": {"account_type": "Equity"},
|
|
||||||
"9850 Schlussbilanzkonto (SBK)": {"account_type": "Round Off"},
|
|
||||||
"9190 nicht eingeforderte ausstehende Einlagen und berechtigte Entnahmen von Gesellschaftern": {
|
|
||||||
"account_type": "Equity"
|
|
||||||
},
|
|
||||||
"root_type": "Equity"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
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": ""
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user