django-ledger 0.7.11__py3-none-any.whl → 0.8.1__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.
- django_ledger/__init__.py +1 -1
- django_ledger/context.py +12 -0
- django_ledger/forms/account.py +45 -46
- django_ledger/forms/bill.py +0 -4
- django_ledger/forms/closing_entry.py +13 -1
- django_ledger/forms/data_import.py +182 -63
- django_ledger/forms/estimate.py +3 -6
- django_ledger/forms/invoice.py +3 -7
- django_ledger/forms/item.py +10 -18
- django_ledger/forms/purchase_order.py +2 -4
- django_ledger/io/io_core.py +515 -400
- django_ledger/io/io_generator.py +7 -6
- django_ledger/io/io_library.py +1 -2
- django_ledger/migrations/0025_alter_billmodel_cash_account_and_more.py +70 -0
- django_ledger/migrations/0026_stagedtransactionmodel_customer_model_and_more.py +56 -0
- django_ledger/models/__init__.py +2 -1
- django_ledger/models/accounts.py +109 -69
- django_ledger/models/bank_account.py +40 -23
- django_ledger/models/bill.py +386 -333
- django_ledger/models/chart_of_accounts.py +173 -105
- django_ledger/models/closing_entry.py +99 -48
- django_ledger/models/customer.py +100 -66
- django_ledger/models/data_import.py +818 -323
- django_ledger/models/deprecations.py +61 -0
- django_ledger/models/entity.py +891 -644
- django_ledger/models/estimate.py +57 -28
- django_ledger/models/invoice.py +46 -26
- django_ledger/models/items.py +503 -142
- django_ledger/models/journal_entry.py +61 -47
- django_ledger/models/ledger.py +106 -42
- django_ledger/models/mixins.py +424 -281
- django_ledger/models/purchase_order.py +39 -17
- django_ledger/models/receipt.py +1083 -0
- django_ledger/models/transactions.py +242 -139
- django_ledger/models/unit.py +93 -54
- django_ledger/models/utils.py +12 -2
- django_ledger/models/vendor.py +121 -70
- django_ledger/report/core.py +2 -14
- django_ledger/settings.py +57 -71
- django_ledger/static/django_ledger/bundle/djetler.bundle.js +1 -1
- django_ledger/static/django_ledger/bundle/djetler.bundle.js.LICENSE.txt +25 -0
- django_ledger/static/django_ledger/bundle/styles.bundle.js +1 -1
- django_ledger/static/django_ledger/css/djl_styles.css +273 -0
- django_ledger/templates/django_ledger/bills/includes/card_bill.html +2 -2
- django_ledger/templates/django_ledger/components/menu.html +41 -26
- django_ledger/templates/django_ledger/components/period_navigator.html +5 -3
- django_ledger/templates/django_ledger/customer/customer_detail.html +87 -0
- django_ledger/templates/django_ledger/customer/customer_list.html +0 -1
- django_ledger/templates/django_ledger/customer/tags/customer_table.html +8 -6
- django_ledger/templates/django_ledger/data_import/tags/data_import_job_txs_imported.html +24 -3
- django_ledger/templates/django_ledger/data_import/tags/data_import_job_txs_table.html +26 -10
- django_ledger/templates/django_ledger/entity/entity_dashboard.html +2 -2
- django_ledger/templates/django_ledger/entity/includes/card_entity.html +12 -6
- django_ledger/templates/django_ledger/financial_statements/balance_sheet.html +1 -1
- django_ledger/templates/django_ledger/financial_statements/cash_flow.html +4 -1
- django_ledger/templates/django_ledger/financial_statements/income_statement.html +4 -1
- django_ledger/templates/django_ledger/financial_statements/tags/balance_sheet_statement.html +27 -3
- django_ledger/templates/django_ledger/financial_statements/tags/cash_flow_statement.html +16 -4
- django_ledger/templates/django_ledger/financial_statements/tags/income_statement.html +73 -18
- django_ledger/templates/django_ledger/includes/widget_ratios.html +18 -24
- django_ledger/templates/django_ledger/invoice/includes/card_invoice.html +3 -3
- django_ledger/templates/django_ledger/layouts/base.html +7 -2
- django_ledger/templates/django_ledger/layouts/content_layout_1.html +1 -1
- django_ledger/templates/django_ledger/receipt/customer_receipt_report.html +115 -0
- django_ledger/templates/django_ledger/receipt/receipt_delete.html +30 -0
- django_ledger/templates/django_ledger/receipt/receipt_detail.html +89 -0
- django_ledger/templates/django_ledger/receipt/receipt_list.html +134 -0
- django_ledger/templates/django_ledger/receipt/vendor_receipt_report.html +115 -0
- django_ledger/templates/django_ledger/vendor/tags/vendor_table.html +12 -7
- django_ledger/templates/django_ledger/vendor/vendor_detail.html +86 -0
- django_ledger/templatetags/django_ledger.py +338 -191
- django_ledger/tests/test_accounts.py +1 -2
- django_ledger/tests/test_io.py +17 -0
- django_ledger/tests/test_purchase_order.py +3 -3
- django_ledger/tests/test_transactions.py +1 -2
- django_ledger/urls/__init__.py +1 -4
- django_ledger/urls/customer.py +3 -0
- django_ledger/urls/data_import.py +3 -0
- django_ledger/urls/receipt.py +102 -0
- django_ledger/urls/vendor.py +1 -0
- django_ledger/views/__init__.py +1 -0
- django_ledger/views/bill.py +8 -11
- django_ledger/views/chart_of_accounts.py +6 -4
- django_ledger/views/closing_entry.py +11 -7
- django_ledger/views/customer.py +68 -30
- django_ledger/views/data_import.py +120 -66
- django_ledger/views/djl_api.py +3 -5
- django_ledger/views/entity.py +2 -4
- django_ledger/views/estimate.py +3 -7
- django_ledger/views/inventory.py +3 -5
- django_ledger/views/invoice.py +4 -6
- django_ledger/views/item.py +7 -11
- django_ledger/views/journal_entry.py +1 -2
- django_ledger/views/mixins.py +125 -93
- django_ledger/views/purchase_order.py +24 -35
- django_ledger/views/receipt.py +294 -0
- django_ledger/views/unit.py +1 -2
- django_ledger/views/vendor.py +54 -16
- {django_ledger-0.7.11.dist-info → django_ledger-0.8.1.dist-info}/METADATA +43 -75
- {django_ledger-0.7.11.dist-info → django_ledger-0.8.1.dist-info}/RECORD +104 -122
- {django_ledger-0.7.11.dist-info → django_ledger-0.8.1.dist-info}/WHEEL +1 -1
- django_ledger-0.8.1.dist-info/top_level.txt +1 -0
- django_ledger/contrib/django_ledger_graphene/__init__.py +0 -0
- django_ledger/contrib/django_ledger_graphene/accounts/schema.py +0 -33
- django_ledger/contrib/django_ledger_graphene/api.py +0 -42
- django_ledger/contrib/django_ledger_graphene/apps.py +0 -6
- django_ledger/contrib/django_ledger_graphene/auth/mutations.py +0 -49
- django_ledger/contrib/django_ledger_graphene/auth/schema.py +0 -6
- django_ledger/contrib/django_ledger_graphene/bank_account/mutations.py +0 -61
- django_ledger/contrib/django_ledger_graphene/bank_account/schema.py +0 -34
- django_ledger/contrib/django_ledger_graphene/bill/mutations.py +0 -0
- django_ledger/contrib/django_ledger_graphene/bill/schema.py +0 -34
- django_ledger/contrib/django_ledger_graphene/coa/mutations.py +0 -0
- django_ledger/contrib/django_ledger_graphene/coa/schema.py +0 -30
- django_ledger/contrib/django_ledger_graphene/customers/__init__.py +0 -0
- django_ledger/contrib/django_ledger_graphene/customers/mutations.py +0 -71
- django_ledger/contrib/django_ledger_graphene/customers/schema.py +0 -43
- django_ledger/contrib/django_ledger_graphene/data_import/mutations.py +0 -0
- django_ledger/contrib/django_ledger_graphene/data_import/schema.py +0 -0
- django_ledger/contrib/django_ledger_graphene/entity/mutations.py +0 -0
- django_ledger/contrib/django_ledger_graphene/entity/schema.py +0 -94
- django_ledger/contrib/django_ledger_graphene/item/mutations.py +0 -0
- django_ledger/contrib/django_ledger_graphene/item/schema.py +0 -31
- django_ledger/contrib/django_ledger_graphene/journal_entry/mutations.py +0 -0
- django_ledger/contrib/django_ledger_graphene/journal_entry/schema.py +0 -35
- django_ledger/contrib/django_ledger_graphene/ledger/mutations.py +0 -0
- django_ledger/contrib/django_ledger_graphene/ledger/schema.py +0 -32
- django_ledger/contrib/django_ledger_graphene/purchase_order/mutations.py +0 -0
- django_ledger/contrib/django_ledger_graphene/purchase_order/schema.py +0 -31
- django_ledger/contrib/django_ledger_graphene/transaction/mutations.py +0 -0
- django_ledger/contrib/django_ledger_graphene/transaction/schema.py +0 -36
- django_ledger/contrib/django_ledger_graphene/unit/mutations.py +0 -0
- django_ledger/contrib/django_ledger_graphene/unit/schema.py +0 -27
- django_ledger/contrib/django_ledger_graphene/vendor/mutations.py +0 -0
- django_ledger/contrib/django_ledger_graphene/vendor/schema.py +0 -37
- django_ledger/contrib/django_ledger_graphene/views.py +0 -12
- django_ledger-0.7.11.dist-info/top_level.txt +0 -4
- {django_ledger-0.7.11.dist-info → django_ledger-0.8.1.dist-info/licenses}/AUTHORS.md +0 -0
- {django_ledger-0.7.11.dist-info → django_ledger-0.8.1.dist-info/licenses}/LICENSE +0 -0
|
@@ -5,17 +5,25 @@ Copyright© EDMA Group Inc licensed under the GPLv3 Agreement.
|
|
|
5
5
|
Contributions to this module:
|
|
6
6
|
* Miguel Sanda <msanda@arrobalytics.com>
|
|
7
7
|
"""
|
|
8
|
+
|
|
8
9
|
from datetime import datetime, time
|
|
10
|
+
from typing import Optional
|
|
9
11
|
|
|
10
12
|
from django.contrib import messages
|
|
13
|
+
from django.shortcuts import get_object_or_404, redirect
|
|
11
14
|
from django.urls import reverse
|
|
12
15
|
from django.utils.timezone import make_aware
|
|
13
16
|
from django.utils.translation import gettext_lazy as _
|
|
14
|
-
from django.views
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
from django_ledger.forms.data_import import
|
|
17
|
+
from django.views import View
|
|
18
|
+
from django.views.generic import DeleteView, DetailView, FormView, ListView, UpdateView
|
|
19
|
+
|
|
20
|
+
from django_ledger.forms.data_import import (
|
|
21
|
+
ImportJobModelCreateForm,
|
|
22
|
+
ImportJobModelUpdateForm,
|
|
23
|
+
StagedTransactionModelFormSet,
|
|
24
|
+
)
|
|
18
25
|
from django_ledger.io.ofx import OFXFileManager
|
|
26
|
+
from django_ledger.models import StagedTransactionModelValidationError
|
|
19
27
|
from django_ledger.models.data_import import ImportJobModel, StagedTransactionModel
|
|
20
28
|
from django_ledger.views.mixins import DjangoLedgerSecurityMixIn
|
|
21
29
|
|
|
@@ -25,36 +33,37 @@ class ImportJobModelViewBaseView(DjangoLedgerSecurityMixIn):
|
|
|
25
33
|
|
|
26
34
|
def get_queryset(self):
|
|
27
35
|
if self.queryset is None:
|
|
28
|
-
self.queryset =
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
36
|
+
self.queryset = (
|
|
37
|
+
ImportJobModel.objects.for_entity(
|
|
38
|
+
entity_model=self.AUTHORIZED_ENTITY_MODEL,
|
|
39
|
+
)
|
|
40
|
+
.order_by('-created')
|
|
41
|
+
.select_related(
|
|
42
|
+
'bank_account_model',
|
|
43
|
+
'bank_account_model__entity_model',
|
|
44
|
+
'bank_account_model__account_model',
|
|
45
|
+
'bank_account_model__account_model__coa_model',
|
|
46
|
+
)
|
|
47
|
+
)
|
|
35
48
|
return self.queryset
|
|
36
49
|
|
|
37
50
|
|
|
38
51
|
class ImportJobModelCreateView(ImportJobModelViewBaseView, FormView):
|
|
39
52
|
template_name = 'django_ledger/data_import/import_job_create.html'
|
|
40
53
|
PAGE_TITLE = _('Create Import Job')
|
|
41
|
-
extra_context = {
|
|
42
|
-
'page_title': PAGE_TITLE,
|
|
43
|
-
'header_title': PAGE_TITLE
|
|
44
|
-
}
|
|
54
|
+
extra_context = {'page_title': PAGE_TITLE, 'header_title': PAGE_TITLE}
|
|
45
55
|
form_class = ImportJobModelCreateForm
|
|
46
56
|
|
|
47
57
|
def get_form(self, form_class=None, **kwargs):
|
|
48
58
|
return self.form_class(
|
|
49
|
-
entity_model=self.get_authorized_entity_instance(),
|
|
50
|
-
**self.get_form_kwargs()
|
|
59
|
+
entity_model=self.get_authorized_entity_instance(), **self.get_form_kwargs()
|
|
51
60
|
)
|
|
52
61
|
|
|
53
62
|
def get_success_url(self):
|
|
54
|
-
return reverse(
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
63
|
+
return reverse(
|
|
64
|
+
'django_ledger:data-import-jobs-list',
|
|
65
|
+
kwargs={'entity_slug': self.kwargs['entity_slug']},
|
|
66
|
+
)
|
|
58
67
|
|
|
59
68
|
def form_valid(self, form):
|
|
60
69
|
ofx_manager = OFXFileManager(ofx_file_or_path=form.files['ofx_file'])
|
|
@@ -65,13 +74,16 @@ class ImportJobModelCreateView(ImportJobModelViewBaseView, FormView):
|
|
|
65
74
|
txs_to_stage = ofx_manager.get_account_txs()
|
|
66
75
|
staged_txs_model_list = [
|
|
67
76
|
StagedTransactionModel(
|
|
68
|
-
date_posted=make_aware(
|
|
77
|
+
date_posted=make_aware(
|
|
78
|
+
value=datetime.combine(date=tx.dtposted.date(), time=time.min)
|
|
79
|
+
),
|
|
69
80
|
fit_id=tx.fitid,
|
|
70
81
|
amount=tx.trnamt,
|
|
71
82
|
import_job=import_job,
|
|
72
83
|
name=tx.name,
|
|
73
|
-
memo=tx.memo
|
|
74
|
-
)
|
|
84
|
+
memo=tx.memo,
|
|
85
|
+
)
|
|
86
|
+
for tx in txs_to_stage
|
|
75
87
|
]
|
|
76
88
|
for tx in staged_txs_model_list:
|
|
77
89
|
tx.clean()
|
|
@@ -82,10 +94,7 @@ class ImportJobModelCreateView(ImportJobModelViewBaseView, FormView):
|
|
|
82
94
|
|
|
83
95
|
class ImportJobModelListView(ImportJobModelViewBaseView, ListView):
|
|
84
96
|
PAGE_TITLE = _('Data Import Jobs')
|
|
85
|
-
extra_context = {
|
|
86
|
-
'page_title': PAGE_TITLE,
|
|
87
|
-
'header_title': PAGE_TITLE
|
|
88
|
-
}
|
|
97
|
+
extra_context = {'page_title': PAGE_TITLE, 'header_title': PAGE_TITLE}
|
|
89
98
|
context_object_name = 'import_jobs'
|
|
90
99
|
template_name = 'django_ledger/data_import/data_import_job_list.html'
|
|
91
100
|
|
|
@@ -98,9 +107,10 @@ class ImportJobModelUpdateView(ImportJobModelViewBaseView, UpdateView):
|
|
|
98
107
|
|
|
99
108
|
def get_context_data(self, **kwargs):
|
|
100
109
|
ctx = super().get_context_data(**kwargs)
|
|
110
|
+
import_job_model: ImportJobModel = self.object
|
|
101
111
|
ctx['page_title'] = 'Import Job Update'
|
|
102
112
|
ctx['header_title'] = 'Import Job Update'
|
|
103
|
-
ctx['header_subtitle'] =
|
|
113
|
+
ctx['header_subtitle'] = import_job_model.description
|
|
104
114
|
ctx['header_subtitle_icon'] = 'solar:import-bold'
|
|
105
115
|
return ctx
|
|
106
116
|
|
|
@@ -108,9 +118,7 @@ class ImportJobModelUpdateView(ImportJobModelViewBaseView, UpdateView):
|
|
|
108
118
|
entity_model = self.get_authorized_entity_instance()
|
|
109
119
|
return reverse(
|
|
110
120
|
viewname='django_ledger:data-import-jobs-list',
|
|
111
|
-
kwargs={
|
|
112
|
-
'entity_slug': entity_model.slug
|
|
113
|
-
}
|
|
121
|
+
kwargs={'entity_slug': entity_model.slug},
|
|
114
122
|
)
|
|
115
123
|
|
|
116
124
|
def form_valid(self, form):
|
|
@@ -118,7 +126,7 @@ class ImportJobModelUpdateView(ImportJobModelViewBaseView, UpdateView):
|
|
|
118
126
|
self.request,
|
|
119
127
|
level=messages.SUCCESS,
|
|
120
128
|
message=_(f'Successfully updated Import Job {self.object.description}'),
|
|
121
|
-
extra_tags='is-success'
|
|
129
|
+
extra_tags='is-success',
|
|
122
130
|
)
|
|
123
131
|
return super().form_valid(form=form)
|
|
124
132
|
|
|
@@ -139,9 +147,7 @@ class ImportJobModelDeleteView(ImportJobModelViewBaseView, DeleteView):
|
|
|
139
147
|
def get_success_url(self):
|
|
140
148
|
return reverse(
|
|
141
149
|
viewname='django_ledger:data-import-jobs-list',
|
|
142
|
-
kwargs={
|
|
143
|
-
'entity_slug': self.AUTHORIZED_ENTITY_MODEL.slug
|
|
144
|
-
}
|
|
150
|
+
kwargs={'entity_slug': self.AUTHORIZED_ENTITY_MODEL.slug},
|
|
145
151
|
)
|
|
146
152
|
|
|
147
153
|
|
|
@@ -160,10 +166,10 @@ class DataImportJobDetailView(ImportJobModelViewBaseView, DetailView):
|
|
|
160
166
|
'import_job_model': self.get_object(),
|
|
161
167
|
}
|
|
162
168
|
|
|
163
|
-
def get_context_data(
|
|
169
|
+
def get_context_data(
|
|
170
|
+
self, txs_formset: Optional[StagedTransactionModelFormSet] = None, **kwargs
|
|
171
|
+
):
|
|
164
172
|
context = super().get_context_data(**kwargs)
|
|
165
|
-
|
|
166
|
-
# job_model: ImportJobModel = getattr(self, 'object', self.get_object())
|
|
167
173
|
job_model: ImportJobModel = self.object
|
|
168
174
|
|
|
169
175
|
context['page_title'] = job_model.description
|
|
@@ -171,9 +177,13 @@ class DataImportJobDetailView(ImportJobModelViewBaseView, DetailView):
|
|
|
171
177
|
context['header_subtitle'] = job_model.description
|
|
172
178
|
context['header_subtitle_icon'] = 'tabler:table-import'
|
|
173
179
|
|
|
174
|
-
staged_txs_formset =
|
|
175
|
-
|
|
176
|
-
|
|
180
|
+
staged_txs_formset = (
|
|
181
|
+
StagedTransactionModelFormSet(
|
|
182
|
+
entity_model=self.get_authorized_entity_instance(),
|
|
183
|
+
import_job_model=job_model,
|
|
184
|
+
)
|
|
185
|
+
if not txs_formset
|
|
186
|
+
else txs_formset
|
|
177
187
|
)
|
|
178
188
|
|
|
179
189
|
context['staged_txs_formset'] = staged_txs_formset
|
|
@@ -182,35 +192,79 @@ class DataImportJobDetailView(ImportJobModelViewBaseView, DetailView):
|
|
|
182
192
|
|
|
183
193
|
def post(self, request, **kwargs):
|
|
184
194
|
self.object = self.get_object()
|
|
195
|
+
import_job_model: ImportJobModel = self.object
|
|
185
196
|
|
|
186
197
|
txs_formset = StagedTransactionModelFormSet(
|
|
187
198
|
entity_model=self.get_authorized_entity_instance(),
|
|
188
|
-
import_job_model=
|
|
189
|
-
data=request.POST
|
|
199
|
+
import_job_model=import_job_model,
|
|
200
|
+
data=request.POST,
|
|
190
201
|
)
|
|
191
202
|
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
203
|
+
if txs_formset.has_changed():
|
|
204
|
+
if txs_formset.is_valid():
|
|
205
|
+
txs_formset.save()
|
|
206
|
+
for tx_form in txs_formset:
|
|
207
|
+
if tx_form.has_changed():
|
|
208
|
+
staged_transaction_model: StagedTransactionModel = (
|
|
209
|
+
tx_form.instance
|
|
210
|
+
)
|
|
211
|
+
is_split = tx_form.cleaned_data['tx_split'] is True
|
|
212
|
+
if is_split:
|
|
213
|
+
staged_transaction_model.add_split()
|
|
214
|
+
# import entry was selected for import...
|
|
215
|
+
is_import = tx_form.cleaned_data['tx_import']
|
|
216
|
+
if is_import:
|
|
217
|
+
# all entries in split will be going so the same journal entry... (same unit...)
|
|
218
|
+
is_bundled = tx_form.cleaned_data['bundle_split']
|
|
219
|
+
if staged_transaction_model.can_migrate_receipt():
|
|
220
|
+
staged_transaction_model.migrate_receipt(
|
|
221
|
+
receipt_date=staged_transaction_model.date_posted
|
|
222
|
+
)
|
|
223
|
+
else:
|
|
224
|
+
staged_transaction_model.migrate_transactions(
|
|
225
|
+
split_txs=not is_bundled
|
|
226
|
+
)
|
|
227
|
+
else:
|
|
228
|
+
context = self.get_context_data(txs_formset=txs_formset, **kwargs)
|
|
229
|
+
return self.render_to_response(context)
|
|
230
|
+
|
|
231
|
+
messages.add_message(
|
|
232
|
+
request,
|
|
233
|
+
messages.SUCCESS,
|
|
234
|
+
'Successfully saved transactions.',
|
|
235
|
+
extra_tags='is-success',
|
|
236
|
+
)
|
|
214
237
|
|
|
215
238
|
context = self.get_context_data(**kwargs)
|
|
216
239
|
return self.render_to_response(context)
|
|
240
|
+
|
|
241
|
+
|
|
242
|
+
class StagedTransactionUndoView(ImportJobModelViewBaseView, View):
|
|
243
|
+
http_method_names = ['post']
|
|
244
|
+
|
|
245
|
+
def post(self, request, entity_slug, job_pk, staged_tx_pk, *args, **kwargs):
|
|
246
|
+
import_job_model = get_object_or_404(self.get_queryset(), uuid__exact=job_pk)
|
|
247
|
+
staged_txs_qs = import_job_model.stagedtransactionmodel_set.all()
|
|
248
|
+
staged_tx = get_object_or_404(staged_txs_qs, uuid__exact=staged_tx_pk)
|
|
249
|
+
try:
|
|
250
|
+
staged_tx.undo_import()
|
|
251
|
+
messages.add_message(
|
|
252
|
+
request,
|
|
253
|
+
messages.SUCCESS,
|
|
254
|
+
_('Successfully undone import for transaction %(name)s.')
|
|
255
|
+
% {'name': staged_tx.name or staged_tx.fit_id},
|
|
256
|
+
extra_tags='is-success',
|
|
257
|
+
)
|
|
258
|
+
except StagedTransactionModelValidationError as e:
|
|
259
|
+
messages.add_message(
|
|
260
|
+
request,
|
|
261
|
+
messages.ERROR,
|
|
262
|
+
e.message,
|
|
263
|
+
extra_tags='is-danger',
|
|
264
|
+
)
|
|
265
|
+
return redirect(
|
|
266
|
+
reverse(
|
|
267
|
+
'django_ledger:data-import-job-txs',
|
|
268
|
+
kwargs={'entity_slug': entity_slug, 'job_pk': job_pk},
|
|
269
|
+
)
|
|
270
|
+
)
|
django_ledger/views/djl_api.py
CHANGED
|
@@ -73,8 +73,7 @@ class PayableNetAPIView(DjangoLedgerSecurityMixIn, EntityUnitMixIn, View):
|
|
|
73
73
|
def get(self, request, *args, **kwargs):
|
|
74
74
|
if request.user.is_authenticated:
|
|
75
75
|
bill_qs = BillModel.objects.for_entity(
|
|
76
|
-
|
|
77
|
-
user_model=request.user,
|
|
76
|
+
entity_model=self.AUTHORIZED_ENTITY_MODEL
|
|
78
77
|
).unpaid()
|
|
79
78
|
|
|
80
79
|
# todo: implement this...
|
|
@@ -105,9 +104,8 @@ class ReceivableNetAPIView(DjangoLedgerSecurityMixIn, EntityUnitMixIn, View):
|
|
|
105
104
|
def get(self, request, *args, **kwargs):
|
|
106
105
|
if request.user.is_authenticated:
|
|
107
106
|
invoice_qs = InvoiceModel.objects.for_entity(
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
).unpaid()
|
|
107
|
+
entity_model=self.kwargs['entity_slug']
|
|
108
|
+
).for_user(self.request.user).unpaid()
|
|
111
109
|
|
|
112
110
|
# todo: implement this...
|
|
113
111
|
# unit_slug = self.get_unit_slug()
|
django_ledger/views/entity.py
CHANGED
|
@@ -146,13 +146,11 @@ class EntityDeleteView(DjangoLedgerSecurityMixIn, EntityModelModelViewQuerySetMi
|
|
|
146
146
|
entity_model.save(update_fields=['default_coa'])
|
|
147
147
|
|
|
148
148
|
ItemTransactionModel.objects.for_entity(
|
|
149
|
-
|
|
150
|
-
entity_slug=self.kwargs['entity_slug']
|
|
149
|
+
entity_model=self.AUTHORIZED_ENTITY_MODEL
|
|
151
150
|
).delete()
|
|
152
151
|
|
|
153
152
|
TransactionModel.objects.for_entity(
|
|
154
|
-
|
|
155
|
-
entity_slug=self.kwargs['entity_slug']
|
|
153
|
+
entity_model=self.kwargs['entity_slug']
|
|
156
154
|
).delete()
|
|
157
155
|
|
|
158
156
|
return super().form_valid(form=form)
|
django_ledger/views/estimate.py
CHANGED
|
@@ -6,7 +6,6 @@ Contributions to this module:
|
|
|
6
6
|
* Miguel Sanda <msanda@arrobalytics.com>
|
|
7
7
|
"""
|
|
8
8
|
|
|
9
|
-
|
|
10
9
|
from django.contrib import messages
|
|
11
10
|
from django.core.exceptions import ValidationError, ImproperlyConfigured
|
|
12
11
|
from django.http import HttpResponseRedirect, HttpResponseForbidden
|
|
@@ -102,20 +101,17 @@ class EstimateModelDetailView(DjangoLedgerSecurityMixIn, EstimateModelModelViewQ
|
|
|
102
101
|
|
|
103
102
|
# PO Model Queryset...
|
|
104
103
|
po_qs = ce_model.purchaseordermodel_set.for_entity(
|
|
105
|
-
|
|
106
|
-
entity_slug=self.kwargs['entity_slug']
|
|
104
|
+
entity_model=self.kwargs['entity_slug']
|
|
107
105
|
) if ce_model.is_approved() else ce_model.purchaseordermodel_set.none()
|
|
108
106
|
context['estimate_po_model_queryset'] = po_qs
|
|
109
107
|
|
|
110
108
|
invoice_qs = ce_model.invoicemodel_set.for_entity(
|
|
111
|
-
|
|
112
|
-
entity_slug=self.kwargs['entity_slug']
|
|
109
|
+
entity_model=self.kwargs['entity_slug']
|
|
113
110
|
) if ce_model.is_approved() else ce_model.invoicemodel_set.none()
|
|
114
111
|
context['estimate_invoice_model_queryset'] = invoice_qs
|
|
115
112
|
|
|
116
113
|
bill_qs = ce_model.billmodel_set.for_entity(
|
|
117
|
-
|
|
118
|
-
entity_slug=self.kwargs['entity_slug']
|
|
114
|
+
entity_model=self.kwargs['entity_slug']
|
|
119
115
|
) if ce_model.is_approved() else ce_model.billmodel_set.none()
|
|
120
116
|
context['estimate_bill_model_queryset'] = bill_qs
|
|
121
117
|
|
django_ledger/views/inventory.py
CHANGED
|
@@ -51,7 +51,7 @@ class InventoryListView(DjangoLedgerSecurityMixIn, ListView):
|
|
|
51
51
|
def get_queryset(self):
|
|
52
52
|
if self.queryset is None:
|
|
53
53
|
self.queryset = ItemTransactionModel.objects.inventory_pipeline_aggregate(
|
|
54
|
-
|
|
54
|
+
entity_model=self.AUTHORIZED_ENTITY_MODEL
|
|
55
55
|
)
|
|
56
56
|
return super().get_queryset()
|
|
57
57
|
|
|
@@ -69,12 +69,10 @@ class InventoryRecountView(DjangoLedgerSecurityMixIn, DetailView):
|
|
|
69
69
|
return super().get_queryset()
|
|
70
70
|
|
|
71
71
|
def counted_inventory(self):
|
|
72
|
-
|
|
73
|
-
return ItemTransactionModel.objects.inventory_count(entity_slug=entity_slug)
|
|
72
|
+
return ItemTransactionModel.objects.inventory_count(entity_model=self.AUTHORIZED_ENTITY_MODEL)
|
|
74
73
|
|
|
75
74
|
def recorded_inventory(self, queryset=None, as_values=True):
|
|
76
|
-
entity_model: EntityModel = self.
|
|
77
|
-
user_model = self.request.user
|
|
75
|
+
entity_model: EntityModel = self.AUTHORIZED_ENTITY_MODEL
|
|
78
76
|
recorded_qs = entity_model.recorded_inventory(item_qs=queryset)
|
|
79
77
|
return recorded_qs
|
|
80
78
|
|
django_ledger/views/invoice.py
CHANGED
|
@@ -33,8 +33,7 @@ class InvoiceModelModelViewQuerySetMixIn:
|
|
|
33
33
|
def get_queryset(self):
|
|
34
34
|
if self.queryset is None:
|
|
35
35
|
self.queryset = InvoiceModel.objects.for_entity(
|
|
36
|
-
|
|
37
|
-
user_model=self.request.user
|
|
36
|
+
entity_model=self.kwargs['entity_slug']
|
|
38
37
|
).select_related('customer', 'ledger').order_by('-created')
|
|
39
38
|
return super().get_queryset()
|
|
40
39
|
|
|
@@ -97,8 +96,7 @@ class InvoiceModelCreateView(DjangoLedgerSecurityMixIn, InvoiceModelModelViewQue
|
|
|
97
96
|
'ce_pk': self.kwargs['ce_pk']
|
|
98
97
|
})
|
|
99
98
|
estimate_qs = EstimateModel.objects.for_entity(
|
|
100
|
-
|
|
101
|
-
user_model=self.request.user
|
|
99
|
+
entity_model=self.AUTHORIZED_ENTITY_MODEL,
|
|
102
100
|
).select_related('customer')
|
|
103
101
|
estimate_model = get_object_or_404(estimate_qs, uuid__exact=self.kwargs['ce_pk'])
|
|
104
102
|
context['estimate_model'] = estimate_model
|
|
@@ -138,8 +136,8 @@ class InvoiceModelCreateView(DjangoLedgerSecurityMixIn, InvoiceModelModelViewQue
|
|
|
138
136
|
if self.for_estimate:
|
|
139
137
|
ce_pk = self.kwargs['ce_pk']
|
|
140
138
|
estimate_model_qs = EstimateModel.objects.for_entity(
|
|
141
|
-
|
|
142
|
-
|
|
139
|
+
entity_model=self.AUTHORIZED_ENTITY_MODEL,
|
|
140
|
+
)
|
|
143
141
|
|
|
144
142
|
estimate_model = get_object_or_404(estimate_model_qs, uuid__exact=ce_pk)
|
|
145
143
|
invoice_model.bind_estimate(estimate_model=estimate_model, commit=False)
|
django_ledger/views/item.py
CHANGED
|
@@ -21,21 +21,21 @@ from django_ledger.forms.item import (
|
|
|
21
21
|
ExpenseItemCreateForm, ExpenseItemUpdateForm, InventoryItemCreateForm, InventoryItemUpdateForm,
|
|
22
22
|
ServiceCreateForm, ServiceUpdateForm
|
|
23
23
|
)
|
|
24
|
-
from django_ledger.models import ItemModel, UnitOfMeasureModel, EntityModel
|
|
24
|
+
from django_ledger.models import ItemModel, UnitOfMeasureModel, EntityModel, UnitOfMeasureModelQuerySet
|
|
25
25
|
from django_ledger.views.mixins import DjangoLedgerSecurityMixIn
|
|
26
26
|
|
|
27
27
|
|
|
28
28
|
# todo: Create delete views...
|
|
29
29
|
|
|
30
|
-
# UNIT OF MEASURE VIEWS
|
|
30
|
+
# UNIT OF MEASURE VIEWS...
|
|
31
31
|
class UnitOfMeasureModelModelBaseView(DjangoLedgerSecurityMixIn):
|
|
32
|
-
queryset = None
|
|
32
|
+
queryset: UnitOfMeasureModelQuerySet = None
|
|
33
33
|
|
|
34
34
|
def get_queryset(self):
|
|
35
35
|
if self.queryset is None:
|
|
36
36
|
entity_model: EntityModel = self.get_authorized_entity_instance()
|
|
37
37
|
self.queryset = entity_model.unitofmeasuremodel_set.all()
|
|
38
|
-
return
|
|
38
|
+
return self.queryset
|
|
39
39
|
|
|
40
40
|
|
|
41
41
|
class UnitOfMeasureModelListView(UnitOfMeasureModelModelBaseView, ListView):
|
|
@@ -75,9 +75,7 @@ class UnitOfMeasureModelCreateView(UnitOfMeasureModelModelBaseView, CreateView):
|
|
|
75
75
|
instance: UnitOfMeasureModel = form.save(commit=False)
|
|
76
76
|
entity_slug = self.kwargs['entity_slug']
|
|
77
77
|
try:
|
|
78
|
-
entity_model: EntityModel =
|
|
79
|
-
user_model=self.request.user
|
|
80
|
-
).get(slug__iexact=entity_slug)
|
|
78
|
+
entity_model: EntityModel = self.AUTHORIZED_ENTITY_MODEL
|
|
81
79
|
instance.entity = entity_model
|
|
82
80
|
except ObjectDoesNotExist:
|
|
83
81
|
add_message(self.request,
|
|
@@ -227,8 +225,7 @@ class ProductUpdateView(ProductItemModelModelBaseView, UpdateView):
|
|
|
227
225
|
|
|
228
226
|
def get_queryset(self):
|
|
229
227
|
return ItemModel.objects.for_entity(
|
|
230
|
-
|
|
231
|
-
user_model=self.request.user
|
|
228
|
+
entity_model=self.AUTHORIZED_ENTITY_MODEL
|
|
232
229
|
).products()
|
|
233
230
|
|
|
234
231
|
def get_form(self, form_class=None):
|
|
@@ -348,8 +345,7 @@ class ServiceUpdateView(ServiceItemModelModelBaseView, UpdateView):
|
|
|
348
345
|
|
|
349
346
|
def get_queryset(self):
|
|
350
347
|
return ItemModel.objects.for_entity(
|
|
351
|
-
|
|
352
|
-
user_model=self.request.user
|
|
348
|
+
entity_model=self.kwargs['entity_slug']
|
|
353
349
|
).services()
|
|
354
350
|
|
|
355
351
|
def get_form(self, form_class=None):
|
|
@@ -259,8 +259,7 @@ class BaseJournalEntryActionView(
|
|
|
259
259
|
|
|
260
260
|
def get_queryset(self):
|
|
261
261
|
return JournalEntryModel.objects.for_entity(
|
|
262
|
-
|
|
263
|
-
user_model=self.request.user
|
|
262
|
+
entity_model=self.AUTHORIZED_ENTITY_MODEL
|
|
264
263
|
).for_ledger(ledger_pk=self.kwargs['ledger_pk'])
|
|
265
264
|
|
|
266
265
|
def get_redirect_url(self, *args, **kwargs):
|