django-ledger 0.5.6.5__py3-none-any.whl → 0.6.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of django-ledger might be problematic. Click here for more details.

@@ -6,152 +6,165 @@ Contributions to this module:
6
6
  * Miguel Sanda <msanda@arrobalytics.com>
7
7
  """
8
8
 
9
+ from django.apps import apps
10
+
9
11
 
10
12
  class LazyLoader:
11
13
  """
12
- This class eliminates the circle dependency between models.
14
+ A class that provides lazy-loading functionality for various models in the django_ledger app.
15
+
16
+ Attributes:
17
+ app_config (AppConfig): The AppConfig object for the django_ledger app.
18
+
19
+ ENTITY_MODEL (str): The name of the entity model.
20
+ LEDGER_MODEL (str): The name of the ledger model.
21
+ JE_MODEL (str): The name of the journal entry model.
22
+ TRANSACTION_MODEL (str): The name of the transaction model.
23
+ ACCOUNT_MODEL (str): The name of the account model.
24
+ COA_MODEL (str): The name of the chart of account model.
25
+
26
+ ENTITY_STATE_MODEL (str): The name of the entity state model.
27
+ ENTITY_UNIT_MODEL (str): The name of the entity unit model.
28
+ CLOSING_ENTRY_MODEL (str): The name of the closing entry model.
29
+ CLOSING_ENTRY_TRANSACTION_MODEL (str): The name of the closing entry transaction model.
30
+
31
+ BANK_ACCOUNT_MODEL (str): The name of the bank account model.
32
+ PURCHASE_ORDER_MODEL (str): The name of the purchase order model.
33
+
34
+ CUSTOMER_MODEL (str): The name of the customer model.
35
+ INVOICE_MODEL (str): The name of the invoice model.
36
+ BILL_MODEL (str): The name of the bill model.
37
+ UOM_MODEL (str): The name of the unit of measure model.
38
+ VENDOR_MODEL (str): The name of the vendor model.
39
+ ESTIMATE_MODEL (str): The name of the estimate model.
40
+ ITEM_MODEL (str): The name of the item model.
41
+ ITEM_TRANSACTION_MODEL (str): The name of the item transaction model.
42
+
43
+ ENTITY_DATA_GENERATOR (EntityDataGenerator): The EntityDataGenerator class used for generating entity data.
44
+ BALANCE_SHEET_REPORT_CLASS (BalanceSheetReport): The BalanceSheetReport class used for generating balance sheet reports.
45
+ INCOME_STATEMENT_REPORT_CLASS (IncomeStatementReport): The IncomeStatementReport class used for generating income statement reports.
46
+ CASH_FLOW_STATEMENT_REPORT_CLASS (CashFlowStatementReport): The CashFlowStatementReport class used for generating cash flow statement reports.
47
+
48
+ Methods:
49
+ get_entity_model() -> Model: Returns the entity model.
50
+ get_entity_unit_model() -> Model: Returns the entity unit model.
51
+ get_entity_state_model() -> Model: Returns the entity state model.
52
+ get_bank_account_model() -> Model: Returns the bank account model.
53
+ get_account_model() -> Model: Returns the account model.
54
+ get_coa_model() -> Model: Returns the chart of account model.
55
+ get_txs_model() -> Model: Returns the transaction model.
56
+ get_purchase_order_model() -> Model: Returns the purchase order model.
57
+ get_ledger_model() -> Model: Returns the ledger model.
58
+ get_journal_entry_model() -> Model: Returns the journal entry model.
59
+ get_item_model() -> Model: Returns the item model.
60
+ get_item_transaction_model() -> Model: Returns the item transaction model.
61
+ get_customer_model() -> Model: Returns the customer model.
62
+ get_bill_model() -> Model: Returns the bill model.
63
+ get_invoice_model() -> Model: Returns the invoice model.
64
+ get_uom_model() -> Model: Returns the unit of measure model.
65
+ get_vendor_model() -> Model: Returns the vendor model.
66
+ get_estimate_model() -> Model: Returns the estimate model.
67
+ get_closing_entry_model() -> Model: Returns the closing entry model.
68
+ get_closing_entry_transaction_model() -> Model: Returns the closing entry transaction model.
69
+ get_entity_data_generator() -> EntityDataGenerator: Returns the EntityDataGenerator class.
70
+ get_balance_sheet_report_class() -> BalanceSheetReport: Returns the BalanceSheetReport class.
71
+ get_income_statement_report_class() -> IncomeStatementReport: Returns the IncomeStatementReport class.
72
+ get_cash_flow_statement_report_class() -> CashFlowStatementReport: Returns the CashFlowStatementReport class.
13
73
  """
14
- ENTITY_MODEL = None
15
- ENTITY_STATE_MODEL = None
16
- UNIT_MODEL = None
17
- ACCOUNT_MODEL = None
18
- BANK_ACCOUNT_MODEL = None
19
- LEDGER_MODEL = None
20
- TXS_MODEL = None
21
- JE_MODEL = None
22
- ITEM_MODEL = None
23
- ITEM_TRANSACTION_MODEL = None
24
- CUSTOMER_MODEL = None
25
- INVOICE_MODEL = None
26
- BILL_MODEL = None
27
- UOM_MODEL = None
28
- VENDOR_MODEL = None
29
- TRANSACTION_MODEL = None
30
- ENTITY_UNIT_MODEL = None
31
- PURCHASE_ORDER_MODEL = None
32
- ESTIMATE_MODEL = None
33
- CLOSING_ENTRY_MODEL = None
34
- CLOSING_ENTRY_TRANSACTION_MODEL = None
35
74
 
36
- ENTITY_DATA_GENERATOR = None
75
+ app_config = apps.get_app_config(app_label='django_ledger')
76
+
77
+ ENTITY_MODEL = 'entitymodel'
78
+ LEDGER_MODEL = 'ledgermodel'
79
+ JE_MODEL = 'journalentrymodel'
80
+ TRANSACTION_MODEL = 'transactionmodel'
81
+ ACCOUNT_MODEL = 'accountmodel'
82
+ COA_MODEL = 'chartofaccountmodel'
83
+
84
+ ENTITY_STATE_MODEL = 'entitystatemodel'
85
+ ENTITY_UNIT_MODEL = 'entityunitmodel'
86
+ CLOSING_ENTRY_MODEL = 'closingentrymodel'
87
+ CLOSING_ENTRY_TRANSACTION_MODEL = 'closingentrytransactionmodel'
88
+
89
+ BANK_ACCOUNT_MODEL = 'bankaccountmodel'
90
+ PURCHASE_ORDER_MODEL = 'purchaseordermodel'
91
+
92
+ CUSTOMER_MODEL = 'customermodel'
93
+ INVOICE_MODEL = 'invoicemodel'
94
+ BILL_MODEL = 'billmodel'
95
+ UOM_MODEL = 'unitofmeasuremodel'
96
+ VENDOR_MODEL = 'vendormodel'
97
+ ESTIMATE_MODEL = 'estimatemodel'
98
+ ITEM_MODEL = 'itemmodel'
99
+ ITEM_TRANSACTION_MODEL = 'itemtransactionmodel'
37
100
 
101
+ ENTITY_DATA_GENERATOR = None
38
102
  BALANCE_SHEET_REPORT_CLASS = None
39
103
  INCOME_STATEMENT_REPORT_CLASS = None
40
104
  CASH_FLOW_STATEMENT_REPORT_CLASS = None
41
105
 
106
+
107
+
42
108
  def get_entity_model(self):
43
- if not self.ENTITY_MODEL:
44
- from django_ledger.models import EntityModel
45
- self.ENTITY_MODEL = EntityModel
46
- return self.ENTITY_MODEL
109
+ return self.app_config.get_model(self.ENTITY_MODEL)
110
+
111
+ def get_entity_unit_model(self):
112
+ return self.app_config.get_model(self.ENTITY_UNIT_MODEL)
47
113
 
48
114
  def get_entity_state_model(self):
49
- if not self.ENTITY_STATE_MODEL:
50
- from django_ledger.models import EntityStateModel
51
- self.ENTITY_STATE_MODEL = EntityStateModel
52
- return self.ENTITY_STATE_MODEL
115
+ return self.app_config.get_model(self.ENTITY_STATE_MODEL)
53
116
 
54
117
  def get_bank_account_model(self):
55
- if not self.BANK_ACCOUNT_MODEL:
56
- from django_ledger.models import BankAccountModel
57
- self.BANK_ACCOUNT_MODEL = BankAccountModel
58
- return self.BANK_ACCOUNT_MODEL
118
+ return self.app_config.get_model(self.BANK_ACCOUNT_MODEL)
59
119
 
60
120
  def get_account_model(self):
61
- if not self.ACCOUNT_MODEL:
62
- from django_ledger.models import AccountModel
63
- self.ACCOUNT_MODEL = AccountModel
64
- return self.ACCOUNT_MODEL
121
+ return self.app_config.get_model(self.ACCOUNT_MODEL)
122
+
123
+ def get_coa_model(self):
124
+ return self.app_config.get_model(self.COA_MODEL)
65
125
 
66
126
  def get_txs_model(self):
67
- if not self.TXS_MODEL:
68
- from django_ledger.models import TransactionModel
69
- self.TXS_MODEL = TransactionModel
70
- return self.TXS_MODEL
127
+ return self.app_config.get_model(self.TRANSACTION_MODEL)
71
128
 
72
129
  def get_purchase_order_model(self):
73
- if not self.PURCHASE_ORDER_MODEL:
74
- from django_ledger.models import PurchaseOrderModel
75
- self.PURCHASE_ORDER_MODEL = PurchaseOrderModel
76
- return self.PURCHASE_ORDER_MODEL
130
+ return self.app_config.get_model(self.PURCHASE_ORDER_MODEL)
77
131
 
78
132
  def get_ledger_model(self):
79
- if not self.LEDGER_MODEL:
80
- from django_ledger.models import LedgerModel
81
- self.LEDGER_MODEL = LedgerModel
82
- return self.LEDGER_MODEL
83
-
84
- def get_unit_model(self):
85
- if not self.UNIT_MODEL:
86
- from django_ledger.models import EntityUnitModel
87
- self.UNIT_MODEL = EntityUnitModel
88
- return self.UNIT_MODEL
133
+ self.get_entity_unit_model()
134
+ return self.app_config.get_model(self.LEDGER_MODEL)
89
135
 
90
136
  def get_journal_entry_model(self):
91
- if not self.JE_MODEL:
92
- from django_ledger.models import JournalEntryModel
93
- self.JE_MODEL = JournalEntryModel
94
- return self.JE_MODEL
137
+ return self.app_config.get_model(self.JE_MODEL)
95
138
 
96
139
  def get_item_model(self):
97
- if not self.ITEM_MODEL:
98
- from django_ledger.models import ItemModel
99
- self.ITEM_MODEL = ItemModel
100
- return self.ITEM_MODEL
140
+ return self.app_config.get_model(self.ITEM_MODEL)
101
141
 
102
142
  def get_item_transaction_model(self):
103
- if not self.ITEM_TRANSACTION_MODEL:
104
- from django_ledger.models import ItemTransactionModel
105
- self.ITEM_TRANSACTION_MODEL = ItemTransactionModel
106
- return self.ITEM_TRANSACTION_MODEL
143
+ return self.app_config.get_model(self.ITEM_TRANSACTION_MODEL)
107
144
 
108
145
  def get_customer_model(self):
109
- if not self.CUSTOMER_MODEL:
110
- from django_ledger.models import CustomerModel
111
- self.CUSTOMER_MODEL = CustomerModel
112
- return self.CUSTOMER_MODEL
146
+ return self.app_config.get_model(self.CUSTOMER_MODEL)
113
147
 
114
148
  def get_bill_model(self):
115
- if not self.BILL_MODEL:
116
- from django_ledger.models import BillModel
117
- self.BILL_MODEL = BillModel
118
- return self.BILL_MODEL
149
+ return self.app_config.get_model(self.BILL_MODEL)
119
150
 
120
151
  def get_invoice_model(self):
121
- if not self.INVOICE_MODEL:
122
- from django_ledger.models import InvoiceModel
123
- self.INVOICE_MODEL = InvoiceModel
124
- return self.INVOICE_MODEL
152
+ return self.app_config.get_model(self.INVOICE_MODEL)
125
153
 
126
154
  def get_uom_model(self):
127
- if not self.UOM_MODEL:
128
- from django_ledger.models import UnitOfMeasureModel
129
- self.UOM_MODEL = UnitOfMeasureModel
130
- return self.UOM_MODEL
155
+ return self.app_config.get_model(self.UOM_MODEL)
131
156
 
132
157
  def get_vendor_model(self):
133
- if not self.VENDOR_MODEL:
134
- from django_ledger.models import VendorModel
135
- self.VENDOR_MODEL = VendorModel
136
- return self.VENDOR_MODEL
158
+ return self.app_config.get_model(self.VENDOR_MODEL)
137
159
 
138
- def get_transaction_model(self):
139
- if not self.TRANSACTION_MODEL:
140
- from django_ledger.models import TransactionModel
141
- self.TRANSACTION_MODEL = TransactionModel
142
- return self.TRANSACTION_MODEL
160
+ def get_estimate_model(self):
161
+ return self.app_config.get_model(self.ESTIMATE_MODEL)
143
162
 
144
- def get_entity_unit_model(self):
145
- if not self.ENTITY_UNIT_MODEL:
146
- from django_ledger.models import EntityUnitModel
147
- self.ENTITY_UNIT_MODEL = EntityUnitModel
148
- return self.ENTITY_UNIT_MODEL
163
+ def get_closing_entry_model(self):
164
+ return self.app_config.get_model(self.CLOSING_ENTRY_MODEL)
149
165
 
150
- def get_estimate_model(self):
151
- if not self.ESTIMATE_MODEL:
152
- from django_ledger.models import EstimateModel
153
- self.ESTIMATE_MODEL = EstimateModel
154
- return self.ESTIMATE_MODEL
166
+ def get_closing_entry_transaction_model(self):
167
+ return self.app_config.get_model(self.CLOSING_ENTRY_TRANSACTION_MODEL)
155
168
 
156
169
  def get_entity_data_generator(self):
157
170
  if not self.ENTITY_DATA_GENERATOR:
@@ -159,18 +172,6 @@ class LazyLoader:
159
172
  self.ENTITY_DATA_GENERATOR = EntityDataGenerator
160
173
  return self.ENTITY_DATA_GENERATOR
161
174
 
162
- def get_closing_entry_model(self):
163
- if not self.CLOSING_ENTRY_MODEL:
164
- from django_ledger.models import ClosingEntryModel
165
- self.CLOSING_ENTRY_MODEL = ClosingEntryModel
166
- return self.CLOSING_ENTRY_MODEL
167
-
168
- def get_closing_entry_transaction_model(self):
169
- if not self.CLOSING_ENTRY_TRANSACTION_MODEL:
170
- from django_ledger.models import ClosingEntryTransactionModel
171
- self.CLOSING_ENTRY_TRANSACTION_MODEL = ClosingEntryTransactionModel
172
- return self.CLOSING_ENTRY_TRANSACTION_MODEL
173
-
174
175
  def get_balance_sheet_report_class(self):
175
176
  if not self.BALANCE_SHEET_REPORT_CLASS:
176
177
  from django_ledger.report.balance_sheet import BalanceSheetReport
@@ -157,7 +157,7 @@ class AccountModelCreateView(DjangoLedgerSecurityMixIn, BaseAccountModelViewQuer
157
157
  entity_model.create_chart_of_accounts(assign_as_default=True, commit=True)
158
158
 
159
159
  coa_model = self.get_coa_model()
160
- coa_model.allocate_account(account_model=account_model)
160
+ coa_model.insert_account(account_model=account_model)
161
161
  return HttpResponseRedirect(self.get_success_url())
162
162
 
163
163
  def get_success_url(self):
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: django-ledger
3
- Version: 0.5.6.5
4
- Summary: Bookkeeping & Financial analysis backend for Django. Balance Sheet, Income Statements, Chart of Accounts, Entities
3
+ Version: 0.6.0
4
+ Summary: Double entry accounting system built on the Django Web Framework.
5
5
  Author-email: Miguel Sanda <msanda@arrobalytics.com>
6
6
  Maintainer-email: Miguel Sanda <msanda@arrobalytics.com>
7
7
  License: GPLv3 License
@@ -17,22 +17,20 @@ Classifier: Framework :: Django :: 4.0
17
17
  Classifier: Intended Audience :: Financial and Insurance Industry
18
18
  Classifier: Intended Audience :: End Users/Desktop
19
19
  Classifier: License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)
20
- Requires-Python: >=3.7
20
+ Requires-Python: >=3.10
21
21
  Description-Content-Type: text/markdown
22
22
  License-File: LICENSE
23
23
  License-File: AUTHORS.md
24
- Requires-Dist: django >=2.2
25
- Requires-Dist: django-treebeard >=4.5.1
26
- Requires-Dist: faker >=15.3.3
27
- Requires-Dist: markdown >=3.4.1
28
- Requires-Dist: ofxtools >=0.9.5
29
- Requires-Dist: pillow >=9.3.0
30
- Requires-Dist: text-unidecode >=1.3
31
- Requires-Dist: python-dateutil >=2.8.2 ; python_version >= "2.7" and python_version not in "3.0, 3.1, 3.2, 3.3"
32
- Requires-Dist: six >=1.16.0 ; python_version >= "2.7" and python_version not in "3.0, 3.1, 3.2, 3.3"
33
- Requires-Dist: sqlparse >=0.4.3 ; python_version >= "3.5"
34
- Requires-Dist: asgiref >=3.5.2 ; python_version >= "3.7"
35
- Requires-Dist: tzdata >=2022.2 ; sys_platform == "win32"
24
+ Requires-Dist: python-dateutil ==2.9.0.post0 ; python_version >= "2.7" and python_version not in "3.0, 3.1, 3.2, 3.3"
25
+ Requires-Dist: six ==1.16.0 ; python_version >= "2.7" and python_version not in "3.0, 3.1, 3.2, 3.3"
26
+ Requires-Dist: django >=2.2 ; python_version >= "3.10"
27
+ Requires-Dist: asgiref ==3.8.1 ; python_version >= "3.8"
28
+ Requires-Dist: django-treebeard >=4.7.1 ; python_version >= "3.8"
29
+ Requires-Dist: faker >=24.11.0 ; python_version >= "3.8"
30
+ Requires-Dist: markdown >=3.6 ; python_version >= "3.8"
31
+ Requires-Dist: ofxtools ==0.9.5 ; python_version >= "3.8"
32
+ Requires-Dist: pillow >=10.3.0 ; python_version >= "3.8"
33
+ Requires-Dist: sqlparse >=0.5.0 ; python_version >= "3.8"
36
34
  Provides-Extra: dev
37
35
  Requires-Dist: sphinx ~=4.5.0 ; extra == 'dev'
38
36
  Requires-Dist: behave ~=1.2.6 ; extra == 'dev'
@@ -44,29 +42,13 @@ Requires-Dist: furo ; extra == 'dev'
44
42
 
45
43
  ### An Accounting, Bookkeeping & Financial Analysis Engine for the Django Framework.
46
44
 
47
- __Django Ledger__ is a double entry accounting system based on
48
- the [Django Web Framework](https://www.djangoproject.com),
49
- which aims to power financially driven applications by removing the complexity of the accounting domain into a simple,
50
- high-level API. _Prior experience with Django is required to more effectively use this software_.
45
+ Introducing __Django Ledger__, a powerful double entry accounting system designed for financially driven applications
46
+ using the [Django Web Framework](https://www.djangoproject.com). Developed by lead developer Miguel Sanda, this system
47
+ offers a simplified, high-level API, making it easier for users to navigate the complexities of accounting. If you have
48
+ prior experience with Django, you'll find this software even more effective. And, for those interested in contributing,
49
+ consider joining our new discord channel for further collaboration and discussions.
51
50
 
52
- __Django Ledger__ was created and is currently maintained and developed by lead developer Miguel Sanda.
53
- If you want to contribute please consider joining our new discord channel here.
54
-
55
- ### Join our Discord Channel [Here](https://discord.gg/c7PZcbYgrc)
56
-
57
- The software is still in early stages of development. For more information, please check the
58
- [Roadmap](https://github.com/arrobalytics/django-ledger/blob/develop/ROADMAP.md).
59
-
60
- ### How long until all features are implemented?
61
-
62
- Finance and Accounting is a complicated subject. Django Ledger is different from other Django projects
63
- as it aims to provide a developer-friendly accounting engine while providing a reliable and extensible API to
64
- power financially driven applications. This project in particular, not only requires Python AND Django programming
65
- experience, but also finance and accounting experience. So, that's the long way of saying, we need your help!
66
- Join our Discord Channel [here](https://discord.gg/J7KDFgCCsw) to learn more.
67
-
68
- __This project can greatly benefit from contributions towards Documentation and Unit Tests.__
69
- __This is the best way to get started with this project if you are not familiar with the models.__
51
+ ### Questions? Join our Discord Channel [Here](https://discord.gg/c7PZcbYgrc)
70
52
 
71
53
  ### Documentation
72
54
 
@@ -74,117 +56,49 @@ Access the latest documentation and QuickStart guide [here](https://django-ledge
74
56
  Also, you may download the QuickStart Jupyter Notebook
75
57
  [here](https://github.com/arrobalytics/django-ledger/blob/develop/notebooks/QuickStart%20Notebook.ipynb).
76
58
 
77
- Django Ledger supports:
59
+ # Main Features
78
60
 
79
- - Double entry accounting.
80
- - Hierarchical Chart of Accounts.
61
+ - High Level API.
62
+ - Double entry accounting system.
63
+ - Multiple Hierarchical Chart of Accounts.
81
64
  - Financial Statements (Income Statement, Balance Sheet & Cash Flow Statement).
82
65
  - Purchase Orders, Sales Orders (Estimates), Bills and Invoices.
83
66
  - Automatic financial ratio & insight calculations.
84
- - High Level Entity API.
85
67
  - Multi tenancy (multiple companies/users/clients).
86
68
  - Self-contained Ledgers, Journal Entries & Transactions.
87
69
  - Basic OFX & QFX file import.
88
- - Bills & Invoices with optional cash/accrual functionality.
89
- - Basic navigational templates.
90
- - Entity administration & entity manager support.
70
+ - Closing Entries.
91
71
  - Items, lists & inventory management.
92
72
  - Unit of Measures.
93
- - Bank Accounts.
94
-
95
- # Roadmap to Version 1.0.
96
-
97
- ### ~~Version 0.4~~ *completed*
98
-
99
- * __0.4.0__: Items, resources and & lists for bills & invoices itemization:
100
- * __0.4.0__: Enhance and optimize Django Ledger the random data generation functionality to properly populate relevant
101
- random data for testing.
102
- * __0.4.1__: Entity internal organizations, department, branches, etc.
103
- * __0.4.2__: Custom Accounting Periods.
104
- * __0.4.3__: Purchase Order Model implementation.
105
- * Bugfixes & UI/UX Enhancements.
106
-
107
- ### Version 0.5
108
-
109
- More details available in the [Django Ledger v0.5 Page](https://www.arrobalytics.com/blog/2021/12/07/django-ledger-v05/)
110
- .
111
-
112
- * __0.5__: Testing framework implementation that will include:
113
- * Unit tests using the [Built-in Django](https://docs.djangoproject.com/en/3.1/topics/testing/) unit test modules.
114
- * Behavioral Driven Testing using [behave](https://behave.readthedocs.io/en/latest/) library.
115
- * __Need help!!!! If you want to contribute PLEASE ADD UNIT TESTS!!!__
116
- * Start creating basic package documentation via [Sphinx](https://www.sphinx-doc.org/en/master/)
117
- * Document code and functions within code base.
118
- * Generate HTML documentation.
119
- * Work with Accountants, Subject Experts and Developers to define an initial list of Unit Tests to validate output _
120
- _(
121
- help needed!)__.
122
- * Update package and code documentation.
123
- * Bugfixes & UI/UX Enhancements.
124
- * ~~__0.5.0__~~: Inventory tracking.
125
- * Average Cost.
126
- * ~~__0.5.1__~~: Customer estimates & contract tracking.
127
- * Link Estimate/PO/Bill/Invoice workflow.
128
- * Journal Entry activity determination & validation (for cash flow).
129
- * ~~__0.5.2__~~: Cash flow statement.
130
- * Human Readable Journal Entry document numbers.
131
- * Hierarchical Account Model Management.
132
- * Generate all Django Ledger Model documentation.
133
- * ~~__0.5.3__~~: High Level EntityModel API.
134
- * ~~__0.5.4__~~: Balance Sheet Statement, Income Statement & Cash Flow Statement API & PDF report export.
135
- * ~~__0.5.5__~~: Closing Entries.
136
- * ~~0.5.5.1~~: Open Financial Exchange Imports (OFX) Bugfixes and Optimizations.
137
- * ~~0.5.5.2~~: BugFixes and Optimizations..
138
- * ~~0.5.5.3~~: Closing Entries will be used if requested date is present. Documentation Update.
139
- * __0.5.6__: Transaction Library & Blueprints.
140
- * __0.5.7__: Chart of Accounts Import.
141
- * __0.5.8__: Trial Balance Import.
142
-
143
- ### Version 0.6
144
-
145
- * Credit Line Models.
146
- * Time tracking.
147
- * Transaction tagging.
148
- * Update package and code documentation.
149
- * Bugfixes & UI/UX Enhancements.
150
-
151
- ### Version 0.7
152
-
153
- * Currency Models implementation as a way to define EntityModel default currency.
154
- * Produce financial statements in different currencies.
155
- * Update package and code documentation.
156
- * Bugfixes & UI/UX Enhancements.
157
-
158
- ### Version 0.8
159
-
160
- * User roles and permissions on views to support read/write permissions for assigned managers to entities.
161
- * User preferences and settings & account creation views.
162
- * Update package and code documentation.
163
-
164
- ### Version 0.9
165
-
166
- * Enable Hierarchical Entity Structures.
167
- * Consolidated financial statements.
168
- * InterCompany transactions.
169
- * Update package and code documentation.
170
-
171
- ### Version 1.0
172
-
173
- * Complete Internationalization of all user-related fields.
174
-
175
- *** Roadmap subject to change based on user feedback and backlog priorities.
73
+ - Bank Accounts Information.
74
+ - Django Admin Classes.
75
+ - Built In Entity Management UI.
76
+
77
+ ## Need a new feature or report a bug?
78
+ Feel free to initiate an Issue describing your new feature request.
176
79
 
177
80
  # Want to contribute?
178
81
 
179
- __This project is actively looking for contributors. Any financial and/or accounting experience is a big plus.__
180
- If you have prior accounting experience and want to contribute, don't hesitate to contact me.
82
+ Finance and Accounting is a complicated subject. Django Ledger stands out from other Django projects due to its focus
83
+ on providing a developer-friendly accounting engine and a reliable, extensible API for financially driven applications.
84
+ The project requires expertise in Python, Django programming, finance, and accounting. In essence, the project is
85
+ seeking assistance from individuals with the specific skill set needed to contribute effectively. So, it's clear that
86
+ they are in need of support from individuals with the right expertise.
87
+
88
+ The project is actively seeking contributors with financial and/or accounting experience. Prior accounting experience
89
+ is a big plus for potential contributors. If you have the relevant experience and want to contribute, feel free to
90
+ reach out to me. You can find the contribution guidelines at the specified link. The project welcomes anyone interested
91
+ in making a contribution.
92
+
181
93
  See __[contribution guidelines](https://github.com/arrobalytics/django-ledger/blob/develop/Contribute.md)__.
182
94
 
183
95
  # Installation
96
+
184
97
  Django Ledger is a [Django](https://www.djangoproject.com/) application. If you haven't, you need working knowledge of
185
- Django and a working Django project before you can use Django Ledger. A good place to start
98
+ Django and a working Django project before you can use Django Ledger. A good place to start
186
99
  is [here](https://docs.djangoproject.com/en/4.2/intro/tutorial01/#creating-a-project).
187
- Make sure you refer to the django version you are using.
100
+
101
+ Make sure you refer to the django version you are using.
188
102
 
189
103
  The easiest way to start is to use the zero-config Django Ledger starter template. See
190
104
  details [here](https://github.com/arrobalytics/django-ledger-starter). Otherwise, you may create your
@@ -329,6 +243,42 @@ python manage.py createsuperuser
329
243
  python manage.py runserver
330
244
  ```
331
245
 
246
+ # How To Set Up Django Ledger for Development using Docker
247
+
248
+ 1. Navigate to your projects directory.
249
+
250
+ 2. Give executable permissions to entrypoint.sh
251
+
252
+ ```shell
253
+ sudo chmod +x entrypoint.sh
254
+ ```
255
+
256
+ 3. Add host '0.0.0.0' into ALLOWED_HOSTS in settings.py.
257
+
258
+ 4. Build the image and run the container.
259
+
260
+ ```shell
261
+ docker compose up --build
262
+ ```
263
+
264
+ 5. Add Django Superuser by running command in seprate terminal
265
+
266
+ ```shell
267
+ docker ps
268
+ ```
269
+
270
+ Select container id of running container and execute following command
271
+
272
+ ```shell
273
+ docker exec -it containerId /bin/sh
274
+ ```
275
+
276
+ ```shell
277
+ python manage.py createsuperuser
278
+ ```
279
+
280
+ 6. Navigate to http://0.0.0.0:8000/ on browser.
281
+
332
282
  # Run Test Suite
333
283
 
334
284
  After setting up your development environment you may run tests.
@@ -48,7 +48,7 @@ assets/node_modules/node-gyp/gyp/tools/pretty_gyp.py,sha256=2ZCRPW-MZfK7gdnCIaqh
48
48
  assets/node_modules/node-gyp/gyp/tools/pretty_sln.py,sha256=b_Fxm-SXUCPL3Tix4EyNwZNmQ-zkeRIFFmuL0R5wFhw,5482
49
49
  assets/node_modules/node-gyp/gyp/tools/pretty_vcproj.py,sha256=AwQrxK1F-jhjsbbT35XQjrvWNbc3IBFaKXoJogqMh_o,10633
50
50
  assets/node_modules/node-gyp/test/fixtures/test-charmap.py,sha256=5raXzaQnO2eJnrlFtlDtWftryhZX7Fj0amFW3hdSnhE,547
51
- django_ledger/__init__.py,sha256=baak5-S_PQQ_AyoLijK86tI74pLFMsMbReoTxhab9ug,458
51
+ django_ledger/__init__.py,sha256=xREl-STKi-FZ0E1x38tl7fMrbx8yZ-tcDqEY2wIWMow,456
52
52
  django_ledger/apps.py,sha256=H-zEWUjKGakgSDSZmLIoXChZ2h6e0dth0ZO5SpoT-8U,163
53
53
  django_ledger/exceptions.py,sha256=rML8sQQ0Hq-DYMLZ76dfw2RYSAsXWUoyHuyC_yP9o1o,491
54
54
  django_ledger/settings.py,sha256=KLujLYwEC3fxfj5u9HnVDsr1rBjE5OAI--bu0MYi4JE,6221
@@ -115,11 +115,11 @@ django_ledger/forms/unit.py,sha256=rXUefjpuAmUU0vPOqu1ObO4k-bN-_Q6kOqHJ4kp_Vlg,1
115
115
  django_ledger/forms/utils.py,sha256=sgkwBZs15_rZ5NT7h-8Z7wi3-ItM1E1sqoVDo3NQ5Jc,513
116
116
  django_ledger/forms/vendor.py,sha256=Nuh8MmSpz4ycMZwiVe--U9Ec6ezIsfACHDkhA2SyiZ4,2215
117
117
  django_ledger/io/__init__.py,sha256=Y9R-mY4peg8EpxmlXKaBER1IHMU-Nos8_dII41Kj0Ho,445
118
- django_ledger/io/io_core.py,sha256=zVTBxQE-RZS6UlDogJyPXih4KCdx1BCwvw2aqHvXQmU,46379
119
- django_ledger/io/io_digest.py,sha256=aQxDVbEt8WsQ6S1b9LYn-5YRtqAeHVMBrd4TY3gcXCg,4273
118
+ django_ledger/io/io_core.py,sha256=fvMZYLlutL7Pn6F_p7U3whRA4ZeS7IDangm1v6Hcjvw,46479
119
+ django_ledger/io/io_digest.py,sha256=W_bCH6JxGw6eASDb1k43JuGAejvOVfyA7WkCS7AEqDQ,4280
120
120
  django_ledger/io/io_generator.py,sha256=JF4plsABUkCIrtI2X-YD7o5eNghRIgLUseNcBIGOj3U,34613
121
121
  django_ledger/io/io_library.py,sha256=kZt61TV6McxH2Ly1INYRmb-T1hNuEKe4WI0YB_YHeKk,20564
122
- django_ledger/io/io_middleware.py,sha256=3bMTjmBiwoXxyEo5ER-jZxWxT_xbcrtv4F__vJLsVXs,20096
122
+ django_ledger/io/io_middleware.py,sha256=c-vwpcjg2HbYbb4O36fdf6011dFOnoNsDHOAQXmJgB8,20052
123
123
  django_ledger/io/ofx.py,sha256=JnmDjhIpLySoixK1WVe6DivRuu02rYsBjqI8yi5Opzs,1488
124
124
  django_ledger/io/ratios.py,sha256=dsuCv9-r73SMLv3OrxeoT5JebfRmrDsRKG_YzHggWFw,3542
125
125
  django_ledger/io/roles.py,sha256=RrErn0-cDOr90UrMBGl-PM_PxG2o_KYbGYeK4Dpwsek,20690
@@ -143,25 +143,25 @@ django_ledger/migrations/0014_ledgermodel_ledger_xid_and_more.py,sha256=UHuEQrnF
143
143
  django_ledger/migrations/0015_remove_chartofaccountmodel_locked_and_more.py,sha256=GZDKJDjpqo52pY7sXusHpyvXsUwsuvoZqTQNda9Eo1I,560
144
144
  django_ledger/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
145
145
  django_ledger/models/__init__.py,sha256=8mn-OGhAVgLs8YASEBwo8dpX6tHyGtMxRHVPGDGECVU,793
146
- django_ledger/models/accounts.py,sha256=Ie5LTiT4zbmJndq1AJC6kZplgaklkXFusgl4LnIkIbQ,28687
146
+ django_ledger/models/accounts.py,sha256=GQoVBCN_UeXnA2zj4bejXthr2mmL9a_8iS-gDPKI5KY,28937
147
147
  django_ledger/models/bank_account.py,sha256=0-eTBxxRyvUKOVVNcGqWV1kiOKcXA2KPQIdiVHDUDCY,7678
148
148
  django_ledger/models/bill.py,sha256=vaXdTEfow9SPzactNs6mZdm4tJc8uamKufT9tQGFpJg,63541
149
- django_ledger/models/closing_entry.py,sha256=52BLvK4Jr8aXrB4kgFqrqHozkw13gwu0hm9RXWnLYE8,17732
150
- django_ledger/models/coa.py,sha256=yxkZK6R8-j58i_KE8X1bB0CwnaF-Vhn0Z4qLK5ZycrY,20305
149
+ django_ledger/models/closing_entry.py,sha256=557vVKhrRZOdzqmmvtVlU48VbzJk8tTV018b0dTfpek,17746
150
+ django_ledger/models/coa.py,sha256=Eue4XTRjM9irR-2z2P-Ynrw0ZrfAMub1m69mBdqok7s,27097
151
151
  django_ledger/models/coa_default.py,sha256=4Zj8OMhgBiYuREjM82cFfyGWd8uCAeqggVkeNhg4SLU,27338
152
152
  django_ledger/models/customer.py,sha256=JQOktcYKUlENJv4frek9rAW6sRerrQ0xXHlC5KPmhWk,11807
153
153
  django_ledger/models/data_import.py,sha256=2H-4oTVLa7qXq03m9fd7T5zSQLkZKOAn2OAeOQBzMPA,19477
154
- django_ledger/models/entity.py,sha256=zw8vJ-sjmFAPLcXWDwi60FaSa12QB6aEoCk0VzAo910,121191
154
+ django_ledger/models/entity.py,sha256=1btxPOJxKmSpT1T12bisVE_QVZmQoniyfpya1JURBt4,121692
155
155
  django_ledger/models/estimate.py,sha256=-qB5t2cEdyYpFUq7tOUQnFqvE6EDUiVdTtzjEbESwEQ,55829
156
156
  django_ledger/models/invoice.py,sha256=FZ7ZxAjyrM2NUwiR3wIX0PnbPXV27F63u8sESb4qM20,61389
157
157
  django_ledger/models/items.py,sha256=JLPFGPQvTKiq3r09wgG2cxBB4ZmcEXK6LyqMUhzWj3k,54938
158
158
  django_ledger/models/journal_entry.py,sha256=VfXXvm3tUFuy2Z6j3PLlDk9ndHqsZgn_PuhrxTNqaiY,50918
159
159
  django_ledger/models/ledger.py,sha256=qjORKpXHn7d393OLS62F2joyyfZyh7tCg7wc67nAu50,23042
160
- django_ledger/models/mixins.py,sha256=8hxkYDG1MMrCo5uXCeoojYiEkJz-YvAV8Ly8NXKDqFU,51911
160
+ django_ledger/models/mixins.py,sha256=SBcSMfFuFzLqFQv298aDOfAJrF5kT91oXyo384auKqc,51903
161
161
  django_ledger/models/purchase_order.py,sha256=CDibi90e7Yhpv_UiyP32mMcsQ0EUElXJ2r8pLzuS7yE,42729
162
- django_ledger/models/transactions.py,sha256=SqPDJtPx3AJCMCIAKOkR9EVoe2v8mi4WlVjBuuUzVbI,20969
162
+ django_ledger/models/transactions.py,sha256=lCwJ68vPy2ePX8dTzDsEwHPk87VN-vYGdxfwSNF60Po,24229
163
163
  django_ledger/models/unit.py,sha256=x5FFJXgOi1OdajQejIakW6wGY4DjrJhL3S0Pm5OimMk,8074
164
- django_ledger/models/utils.py,sha256=0Vbmkkidjc5ATBjE1JtdXZRcnBlCNHyWvvLoqONK1LM,6857
164
+ django_ledger/models/utils.py,sha256=3gkdCrfJp9qwN3Sf8R96AliilzwcKBm31UEao4WJO9o,8436
165
165
  django_ledger/models/vendor.py,sha256=akJCO86GIwjlZ_jPUZCDXlMeuJe-8zKTm-52aJXGFpg,11320
166
166
  django_ledger/models/schemas/__init__.py,sha256=8Tvw33tVJtCvxoXje2lrs9C1bsP_iuGcVi1JqzdPUao,157
167
167
  django_ledger/models/schemas/digest.py,sha256=ME_dJ4g2p3dQ97Skh_RTZMwuNLmwTi19BdLM1G6tyAo,1077
@@ -174,7 +174,6 @@ django_ledger/report/cash_flow_statement.py,sha256=GosnBzMZWlqNGitOlxvDiHxkT4JrN
174
174
  django_ledger/report/core.py,sha256=tpVdAOXTx4DGEcTeG-SWRO9af7ZTXdmW0-vhwJDY8hQ,7435
175
175
  django_ledger/report/income_statement.py,sha256=m4pG0Yjpl7SELx3-yYKT4dCluKt6nT2bkD9gay9tNKI,11156
176
176
  django_ledger/static/django_ledger/bundle/djetler.bundle.js,sha256=1UzHryjoKN43wUa5b6N2ia2yoE-TCrtfNMnuPIf9Im8,547613
177
- django_ledger/static/django_ledger/bundle/djetler.bundle.js.LICENSE.txt,sha256=YMfGVlI2rGhmdUNumICn7hTQB2SpYAvQ07nJ_F-tAgE,513
178
177
  django_ledger/static/django_ledger/bundle/styles.bundle.js,sha256=myDLVMYHwKTxypheUretM6MZ4HhK8Yn0BqB_OGUW3KU,506543
179
178
  django_ledger/static/django_ledger/img/daniel-weiss-aj2Os9mYgJU-unsplash.jpg,sha256=zYNOMM56QE4AdRkvdGRNifDqj4OJcUA49oebJqsRjuQ,276317
180
179
  django_ledger/static/django_ledger/img/made-with-bulma.png,sha256=eHFH1XGGq3Wn9sN35Jok2jxaCQu7nIravVVHNTAr7n0,19456
@@ -392,7 +391,7 @@ django_ledger/urls/transactions.py,sha256=e_x_z5qbkR6i7o8OWWdXshDiY_WVmu9WVhR9A9
392
391
  django_ledger/urls/unit.py,sha256=EaBd1EcSeQYbOH1rTQZdyDEEtLVi7-QfC_wpRPwTpuE,1499
393
392
  django_ledger/urls/vendor.py,sha256=ODHpAwe5lomluj8ZCqbMtugTeeRsv0Yo9SqkZEmfYaw,393
394
393
  django_ledger/views/__init__.py,sha256=l5Pm2_oAW6Q_jJbXf-BiHA3ilCbiGb6gkXCm73K5DGY,1158
395
- django_ledger/views/account.py,sha256=cT-YVWQCDj9IAaG8LVrk_jiH5gfGRrdzeZb63tR3atg,10525
394
+ django_ledger/views/account.py,sha256=d2pzYXKPOF74hCD4ehsQ_WNFsgqyGXXekCh22gDawAM,10523
396
395
  django_ledger/views/auth.py,sha256=-zTjMlLpyxHGPlY9EXFQyeVHMmyeJ2H9RptcW7PDeDg,771
397
396
  django_ledger/views/bank_account.py,sha256=bMgqrDydz6WuXina4L27uV-cmQicW0_JoPaXxlO7uN4,5176
398
397
  django_ledger/views/bill.py,sha256=-WWAPF6PKqfaApAJBFwNMmIveDajXD-5a12d-LbcqFA,23087
@@ -416,9 +415,9 @@ django_ledger/views/purchase_order.py,sha256=1J3u4QnCkM7z1Y6DePijVdM67x4CQgfmQJc
416
415
  django_ledger/views/transactions.py,sha256=5taQRGLSMkM_N8paQJ07HMspI_Nl7PawF8OohCiRmao,206
417
416
  django_ledger/views/unit.py,sha256=_RgPJO9mR6v5ohBXlnL3T8nTWgS1lwlCvERQcHk0wHE,10232
418
417
  django_ledger/views/vendor.py,sha256=gUdBPTFLeSwlNfdHSA1KFdE_y3QpwpkFhEB0r3-UYdI,3461
419
- django_ledger-0.5.6.5.dist-info/AUTHORS.md,sha256=SRM2cynD89ZfEsL09zrbUVeO17r9zE2ZM7y6ReMqVRo,713
420
- django_ledger-0.5.6.5.dist-info/LICENSE,sha256=ixuiBLtpoK3iv89l7ylKkg9rs2GzF9ukPH7ynZYzK5s,35148
421
- django_ledger-0.5.6.5.dist-info/METADATA,sha256=1MQ9knc-wMCbM6T3EhgetV2sYIyQCzEeqfNOXntPqpM,12619
422
- django_ledger-0.5.6.5.dist-info/WHEEL,sha256=yQN5g4mg4AybRjkgi-9yy4iQEFibGQmlz78Pik5Or-A,92
423
- django_ledger-0.5.6.5.dist-info/top_level.txt,sha256=fmHWehb2HfoDncQ3eQtYzeYc-gJMywf6q_ZpKBjwzoQ,38
424
- django_ledger-0.5.6.5.dist-info/RECORD,,
418
+ django_ledger-0.6.0.dist-info/AUTHORS.md,sha256=SRM2cynD89ZfEsL09zrbUVeO17r9zE2ZM7y6ReMqVRo,713
419
+ django_ledger-0.6.0.dist-info/LICENSE,sha256=ixuiBLtpoK3iv89l7ylKkg9rs2GzF9ukPH7ynZYzK5s,35148
420
+ django_ledger-0.6.0.dist-info/METADATA,sha256=Mz1rbJmCYv-ekyLhXqfYmlF8VNjrArigooAHmYSGrE4,9861
421
+ django_ledger-0.6.0.dist-info/WHEEL,sha256=yQN5g4mg4AybRjkgi-9yy4iQEFibGQmlz78Pik5Or-A,92
422
+ django_ledger-0.6.0.dist-info/top_level.txt,sha256=fmHWehb2HfoDncQ3eQtYzeYc-gJMywf6q_ZpKBjwzoQ,38
423
+ django_ledger-0.6.0.dist-info/RECORD,,