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.

Files changed (139) hide show
  1. django_ledger/__init__.py +1 -1
  2. django_ledger/context.py +12 -0
  3. django_ledger/forms/account.py +45 -46
  4. django_ledger/forms/bill.py +0 -4
  5. django_ledger/forms/closing_entry.py +13 -1
  6. django_ledger/forms/data_import.py +182 -63
  7. django_ledger/forms/estimate.py +3 -6
  8. django_ledger/forms/invoice.py +3 -7
  9. django_ledger/forms/item.py +10 -18
  10. django_ledger/forms/purchase_order.py +2 -4
  11. django_ledger/io/io_core.py +515 -400
  12. django_ledger/io/io_generator.py +7 -6
  13. django_ledger/io/io_library.py +1 -2
  14. django_ledger/migrations/0025_alter_billmodel_cash_account_and_more.py +70 -0
  15. django_ledger/migrations/0026_stagedtransactionmodel_customer_model_and_more.py +56 -0
  16. django_ledger/models/__init__.py +2 -1
  17. django_ledger/models/accounts.py +109 -69
  18. django_ledger/models/bank_account.py +40 -23
  19. django_ledger/models/bill.py +386 -333
  20. django_ledger/models/chart_of_accounts.py +173 -105
  21. django_ledger/models/closing_entry.py +99 -48
  22. django_ledger/models/customer.py +100 -66
  23. django_ledger/models/data_import.py +818 -323
  24. django_ledger/models/deprecations.py +61 -0
  25. django_ledger/models/entity.py +891 -644
  26. django_ledger/models/estimate.py +57 -28
  27. django_ledger/models/invoice.py +46 -26
  28. django_ledger/models/items.py +503 -142
  29. django_ledger/models/journal_entry.py +61 -47
  30. django_ledger/models/ledger.py +106 -42
  31. django_ledger/models/mixins.py +424 -281
  32. django_ledger/models/purchase_order.py +39 -17
  33. django_ledger/models/receipt.py +1083 -0
  34. django_ledger/models/transactions.py +242 -139
  35. django_ledger/models/unit.py +93 -54
  36. django_ledger/models/utils.py +12 -2
  37. django_ledger/models/vendor.py +121 -70
  38. django_ledger/report/core.py +2 -14
  39. django_ledger/settings.py +57 -71
  40. django_ledger/static/django_ledger/bundle/djetler.bundle.js +1 -1
  41. django_ledger/static/django_ledger/bundle/djetler.bundle.js.LICENSE.txt +25 -0
  42. django_ledger/static/django_ledger/bundle/styles.bundle.js +1 -1
  43. django_ledger/static/django_ledger/css/djl_styles.css +273 -0
  44. django_ledger/templates/django_ledger/bills/includes/card_bill.html +2 -2
  45. django_ledger/templates/django_ledger/components/menu.html +41 -26
  46. django_ledger/templates/django_ledger/components/period_navigator.html +5 -3
  47. django_ledger/templates/django_ledger/customer/customer_detail.html +87 -0
  48. django_ledger/templates/django_ledger/customer/customer_list.html +0 -1
  49. django_ledger/templates/django_ledger/customer/tags/customer_table.html +8 -6
  50. django_ledger/templates/django_ledger/data_import/tags/data_import_job_txs_imported.html +24 -3
  51. django_ledger/templates/django_ledger/data_import/tags/data_import_job_txs_table.html +26 -10
  52. django_ledger/templates/django_ledger/entity/entity_dashboard.html +2 -2
  53. django_ledger/templates/django_ledger/entity/includes/card_entity.html +12 -6
  54. django_ledger/templates/django_ledger/financial_statements/balance_sheet.html +1 -1
  55. django_ledger/templates/django_ledger/financial_statements/cash_flow.html +4 -1
  56. django_ledger/templates/django_ledger/financial_statements/income_statement.html +4 -1
  57. django_ledger/templates/django_ledger/financial_statements/tags/balance_sheet_statement.html +27 -3
  58. django_ledger/templates/django_ledger/financial_statements/tags/cash_flow_statement.html +16 -4
  59. django_ledger/templates/django_ledger/financial_statements/tags/income_statement.html +73 -18
  60. django_ledger/templates/django_ledger/includes/widget_ratios.html +18 -24
  61. django_ledger/templates/django_ledger/invoice/includes/card_invoice.html +3 -3
  62. django_ledger/templates/django_ledger/layouts/base.html +7 -2
  63. django_ledger/templates/django_ledger/layouts/content_layout_1.html +1 -1
  64. django_ledger/templates/django_ledger/receipt/customer_receipt_report.html +115 -0
  65. django_ledger/templates/django_ledger/receipt/receipt_delete.html +30 -0
  66. django_ledger/templates/django_ledger/receipt/receipt_detail.html +89 -0
  67. django_ledger/templates/django_ledger/receipt/receipt_list.html +134 -0
  68. django_ledger/templates/django_ledger/receipt/vendor_receipt_report.html +115 -0
  69. django_ledger/templates/django_ledger/vendor/tags/vendor_table.html +12 -7
  70. django_ledger/templates/django_ledger/vendor/vendor_detail.html +86 -0
  71. django_ledger/templatetags/django_ledger.py +338 -191
  72. django_ledger/tests/test_accounts.py +1 -2
  73. django_ledger/tests/test_io.py +17 -0
  74. django_ledger/tests/test_purchase_order.py +3 -3
  75. django_ledger/tests/test_transactions.py +1 -2
  76. django_ledger/urls/__init__.py +1 -4
  77. django_ledger/urls/customer.py +3 -0
  78. django_ledger/urls/data_import.py +3 -0
  79. django_ledger/urls/receipt.py +102 -0
  80. django_ledger/urls/vendor.py +1 -0
  81. django_ledger/views/__init__.py +1 -0
  82. django_ledger/views/bill.py +8 -11
  83. django_ledger/views/chart_of_accounts.py +6 -4
  84. django_ledger/views/closing_entry.py +11 -7
  85. django_ledger/views/customer.py +68 -30
  86. django_ledger/views/data_import.py +120 -66
  87. django_ledger/views/djl_api.py +3 -5
  88. django_ledger/views/entity.py +2 -4
  89. django_ledger/views/estimate.py +3 -7
  90. django_ledger/views/inventory.py +3 -5
  91. django_ledger/views/invoice.py +4 -6
  92. django_ledger/views/item.py +7 -11
  93. django_ledger/views/journal_entry.py +1 -2
  94. django_ledger/views/mixins.py +125 -93
  95. django_ledger/views/purchase_order.py +24 -35
  96. django_ledger/views/receipt.py +294 -0
  97. django_ledger/views/unit.py +1 -2
  98. django_ledger/views/vendor.py +54 -16
  99. {django_ledger-0.7.11.dist-info → django_ledger-0.8.1.dist-info}/METADATA +43 -75
  100. {django_ledger-0.7.11.dist-info → django_ledger-0.8.1.dist-info}/RECORD +104 -122
  101. {django_ledger-0.7.11.dist-info → django_ledger-0.8.1.dist-info}/WHEEL +1 -1
  102. django_ledger-0.8.1.dist-info/top_level.txt +1 -0
  103. django_ledger/contrib/django_ledger_graphene/__init__.py +0 -0
  104. django_ledger/contrib/django_ledger_graphene/accounts/schema.py +0 -33
  105. django_ledger/contrib/django_ledger_graphene/api.py +0 -42
  106. django_ledger/contrib/django_ledger_graphene/apps.py +0 -6
  107. django_ledger/contrib/django_ledger_graphene/auth/mutations.py +0 -49
  108. django_ledger/contrib/django_ledger_graphene/auth/schema.py +0 -6
  109. django_ledger/contrib/django_ledger_graphene/bank_account/mutations.py +0 -61
  110. django_ledger/contrib/django_ledger_graphene/bank_account/schema.py +0 -34
  111. django_ledger/contrib/django_ledger_graphene/bill/mutations.py +0 -0
  112. django_ledger/contrib/django_ledger_graphene/bill/schema.py +0 -34
  113. django_ledger/contrib/django_ledger_graphene/coa/mutations.py +0 -0
  114. django_ledger/contrib/django_ledger_graphene/coa/schema.py +0 -30
  115. django_ledger/contrib/django_ledger_graphene/customers/__init__.py +0 -0
  116. django_ledger/contrib/django_ledger_graphene/customers/mutations.py +0 -71
  117. django_ledger/contrib/django_ledger_graphene/customers/schema.py +0 -43
  118. django_ledger/contrib/django_ledger_graphene/data_import/mutations.py +0 -0
  119. django_ledger/contrib/django_ledger_graphene/data_import/schema.py +0 -0
  120. django_ledger/contrib/django_ledger_graphene/entity/mutations.py +0 -0
  121. django_ledger/contrib/django_ledger_graphene/entity/schema.py +0 -94
  122. django_ledger/contrib/django_ledger_graphene/item/mutations.py +0 -0
  123. django_ledger/contrib/django_ledger_graphene/item/schema.py +0 -31
  124. django_ledger/contrib/django_ledger_graphene/journal_entry/mutations.py +0 -0
  125. django_ledger/contrib/django_ledger_graphene/journal_entry/schema.py +0 -35
  126. django_ledger/contrib/django_ledger_graphene/ledger/mutations.py +0 -0
  127. django_ledger/contrib/django_ledger_graphene/ledger/schema.py +0 -32
  128. django_ledger/contrib/django_ledger_graphene/purchase_order/mutations.py +0 -0
  129. django_ledger/contrib/django_ledger_graphene/purchase_order/schema.py +0 -31
  130. django_ledger/contrib/django_ledger_graphene/transaction/mutations.py +0 -0
  131. django_ledger/contrib/django_ledger_graphene/transaction/schema.py +0 -36
  132. django_ledger/contrib/django_ledger_graphene/unit/mutations.py +0 -0
  133. django_ledger/contrib/django_ledger_graphene/unit/schema.py +0 -27
  134. django_ledger/contrib/django_ledger_graphene/vendor/mutations.py +0 -0
  135. django_ledger/contrib/django_ledger_graphene/vendor/schema.py +0 -37
  136. django_ledger/contrib/django_ledger_graphene/views.py +0 -12
  137. django_ledger-0.7.11.dist-info/top_level.txt +0 -4
  138. {django_ledger-0.7.11.dist-info → django_ledger-0.8.1.dist-info/licenses}/AUTHORS.md +0 -0
  139. {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.generic import ListView, FormView, DetailView, UpdateView, DeleteView
15
-
16
- from django_ledger.forms.data_import import ImportJobModelCreateForm, ImportJobModelUpdateForm
17
- from django_ledger.forms.data_import import StagedTransactionModelFormSet
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 = ImportJobModel.objects.for_entity(
29
- entity_slug=self.kwargs['entity_slug'],
30
- user_model=self.request.user
31
- ).order_by('-created').select_related('bank_account_model',
32
- 'bank_account_model__entity_model',
33
- 'bank_account_model__account_model',
34
- 'bank_account_model__account_model__coa_model')
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('django_ledger:data-import-jobs-list',
55
- kwargs={
56
- 'entity_slug': self.kwargs['entity_slug']
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(value=datetime.combine(date=tx.dtposted.date(), time=time.min)),
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
- ) for tx in txs_to_stage
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'] = self.object.description
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(self, **kwargs):
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 = StagedTransactionModelFormSet(
175
- entity_model=self.get_authorized_entity_instance(),
176
- import_job_model=job_model
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=self.object,
189
- data=request.POST
199
+ import_job_model=import_job_model,
200
+ data=request.POST,
190
201
  )
191
202
 
192
- # if txs_formset.is_valid():
193
- for tx_form in txs_formset:
194
- if tx_form.has_changed():
195
- # perform work only if form has changed...
196
- if tx_form.is_valid():
197
- tx_form.save()
198
- # import entry was selected to be split....
199
- is_split = tx_form.cleaned_data['tx_split'] is True
200
- if is_split:
201
- tx_form.instance.add_split()
202
-
203
- # import entry was selected for import...
204
- is_import = tx_form.cleaned_data['tx_import']
205
- if is_import:
206
- # all entries in split will be going so the same journal entry... (same unit...)
207
- is_bundled = tx_form.cleaned_data['bundle_split']
208
- tx_form.instance.migrate() if is_bundled else tx_form.instance.migrate(split_txs=True)
209
-
210
- messages.add_message(request,
211
- messages.SUCCESS,
212
- 'Successfully saved transactions.',
213
- extra_tags='is-success')
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
+ )
@@ -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
- entity_slug=self.kwargs['entity_slug'],
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
- entity_slug=self.kwargs['entity_slug'],
109
- user_model=request.user,
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()
@@ -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
- user_model=self.request.user,
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
- user_model=self.request.user,
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)
@@ -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
- user_model=self.request.user,
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
- user_model=self.request.user,
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
- user_model=self.request.user,
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
 
@@ -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
- entity_slug=self.kwargs['entity_slug'],
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
- entity_slug = self.kwargs['entity_slug']
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.get_object()
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
 
@@ -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
- entity_slug=self.kwargs['entity_slug'],
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
- entity_slug=self.kwargs['entity_slug'],
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
- entity_slug=self.kwargs['entity_slug'],
142
- user_model=self.request.user)
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)
@@ -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 super().get_queryset()
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 = EntityModel.objects.for_user(
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
- entity_slug=self.AUTHORIZED_ENTITY_MODEL,
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
- entity_slug=self.kwargs['entity_slug'],
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
- entity_slug=self.get_authorized_entity_instance(),
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):