django-ledger 0.7.10__py3-none-any.whl → 0.8.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.
- django_ledger/__init__.py +1 -1
- django_ledger/context.py +12 -0
- django_ledger/forms/bill.py +0 -4
- django_ledger/forms/closing_entry.py +13 -1
- django_ledger/forms/data_import.py +1 -1
- 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 +25 -32
- django_ledger/io/io_generator.py +7 -6
- django_ledger/io/io_library.py +1 -2
- django_ledger/migrations/0024_billmodel_entity_model_invoicemodel_entity_model.py +24 -0
- django_ledger/migrations/0025_alter_billmodel_cash_account_and_more.py +70 -0
- django_ledger/models/accounts.py +109 -69
- django_ledger/models/bank_account.py +40 -23
- django_ledger/models/bill.py +89 -63
- django_ledger/models/chart_of_accounts.py +173 -105
- django_ledger/models/closing_entry.py +99 -48
- django_ledger/models/customer.py +60 -39
- django_ledger/models/data_import.py +55 -41
- django_ledger/models/deprecations.py +61 -0
- django_ledger/models/entity.py +18 -16
- django_ledger/models/estimate.py +57 -28
- django_ledger/models/invoice.py +58 -28
- 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 +16 -10
- django_ledger/models/purchase_order.py +39 -17
- django_ledger/models/transactions.py +152 -113
- django_ledger/models/unit.py +57 -30
- django_ledger/models/vendor.py +75 -43
- django_ledger/report/core.py +2 -14
- django_ledger/settings.py +56 -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/customer/tags/customer_table.html +5 -5
- 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 +6 -1
- django_ledger/templates/django_ledger/vendor/tags/vendor_table.html +9 -5
- 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 +0 -4
- django_ledger/views/bill.py +8 -13
- django_ledger/views/chart_of_accounts.py +6 -4
- django_ledger/views/closing_entry.py +11 -7
- django_ledger/views/customer.py +13 -17
- django_ledger/views/data_import.py +7 -6
- 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 +25 -19
- django_ledger/views/purchase_order.py +24 -35
- django_ledger/views/unit.py +1 -2
- django_ledger/views/vendor.py +1 -2
- {django_ledger-0.7.10.dist-info → django_ledger-0.8.0.dist-info}/METADATA +43 -75
- {django_ledger-0.7.10.dist-info → django_ledger-0.8.0.dist-info}/RECORD +80 -108
- {django_ledger-0.7.10.dist-info → django_ledger-0.8.0.dist-info}/WHEEL +1 -1
- django_ledger-0.8.0.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.10.dist-info/top_level.txt +0 -4
- {django_ledger-0.7.10.dist-info → django_ledger-0.8.0.dist-info/licenses}/AUTHORS.md +0 -0
- {django_ledger-0.7.10.dist-info → django_ledger-0.8.0.dist-info/licenses}/LICENSE +0 -0
django_ledger/models/estimate.py
CHANGED
|
@@ -10,6 +10,7 @@ Once approved, the user may initiate purchase orders, bills and invoices that wi
|
|
|
10
10
|
for tracking purposes. It is however not required to always have an EstimateModel, but recommended in order to be able
|
|
11
11
|
to produce more specific financial reports associated with a specific scope of work.
|
|
12
12
|
"""
|
|
13
|
+
import warnings
|
|
13
14
|
from datetime import date
|
|
14
15
|
from decimal import Decimal
|
|
15
16
|
from string import ascii_uppercase, digits
|
|
@@ -27,7 +28,7 @@ from django.urls import reverse
|
|
|
27
28
|
from django.utils.translation import gettext_lazy as _
|
|
28
29
|
|
|
29
30
|
from django_ledger.io.io_core import get_localdate
|
|
30
|
-
from django_ledger.models import BillModelQuerySet, InvoiceModelQuerySet
|
|
31
|
+
from django_ledger.models import BillModelQuerySet, InvoiceModelQuerySet, lazy_loader, deprecated_entity_slug_behavior
|
|
31
32
|
from django_ledger.models.customer import CustomerModel
|
|
32
33
|
from django_ledger.models.entity import EntityModel, EntityStateModel
|
|
33
34
|
from django_ledger.models.items import ItemTransactionModelQuerySet, ItemTransactionModel, ItemModelQuerySet, ItemModel
|
|
@@ -41,7 +42,8 @@ from django_ledger.models.signals import (
|
|
|
41
42
|
estimate_status_completed,
|
|
42
43
|
estimate_status_in_review
|
|
43
44
|
)
|
|
44
|
-
from django_ledger.settings import DJANGO_LEDGER_DOCUMENT_NUMBER_PADDING, DJANGO_LEDGER_ESTIMATE_NUMBER_PREFIX
|
|
45
|
+
from django_ledger.settings import DJANGO_LEDGER_DOCUMENT_NUMBER_PADDING, DJANGO_LEDGER_ESTIMATE_NUMBER_PREFIX, \
|
|
46
|
+
DJANGO_LEDGER_USE_DEPRECATED_BEHAVIOR
|
|
45
47
|
|
|
46
48
|
ESTIMATE_NUMBER_CHARS = ascii_uppercase + digits
|
|
47
49
|
|
|
@@ -57,6 +59,14 @@ class EstimateModelQuerySet(models.QuerySet):
|
|
|
57
59
|
A custom-defined LedgerModelManager that implements custom QuerySet methods related to the EstimateModel.
|
|
58
60
|
"""
|
|
59
61
|
|
|
62
|
+
def for_user(self, user_model):
|
|
63
|
+
if user_model.is_superuser:
|
|
64
|
+
return self
|
|
65
|
+
return self.filter(
|
|
66
|
+
Q(entity__admin=user_model) |
|
|
67
|
+
Q(entity__managers__in=[user_model])
|
|
68
|
+
)
|
|
69
|
+
|
|
60
70
|
def approved(self):
|
|
61
71
|
"""
|
|
62
72
|
Approved Estimates or Sales Orders are those that have been approved or completed.
|
|
@@ -113,43 +123,62 @@ class EstimateModelQuerySet(models.QuerySet):
|
|
|
113
123
|
|
|
114
124
|
class EstimateModelManager(models.Manager):
|
|
115
125
|
"""
|
|
116
|
-
A custom
|
|
126
|
+
A custom-defined EstimateModelManager that that implements custom QuerySet methods related to the EstimateModel.
|
|
117
127
|
"""
|
|
118
128
|
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
if user_model.is_superuser:
|
|
122
|
-
return qs
|
|
123
|
-
return qs.filter(
|
|
124
|
-
Q(entity__admin=user_model) |
|
|
125
|
-
Q(entity__managers__in=[user_model])
|
|
126
|
-
)
|
|
127
|
-
|
|
128
|
-
def for_entity(self, entity_slug: Union[EntityModel, str], user_model):
|
|
129
|
+
@deprecated_entity_slug_behavior
|
|
130
|
+
def for_entity(self, entity_model: Union[EntityModel, str, UUID] = None, **kwargs) -> EstimateModelQuerySet:
|
|
129
131
|
"""
|
|
130
|
-
|
|
131
|
-
|
|
132
|
+
Filters the queryset based on the given entity model.
|
|
133
|
+
|
|
134
|
+
This method allows filtering the queryset by an `entity_model` parameter, which can
|
|
135
|
+
be of type `EntityModel`, `str`, or `UUID`. It also handles deprecated behavior if
|
|
136
|
+
`user_model` is passed in the `kwargs`.
|
|
132
137
|
|
|
133
138
|
Parameters
|
|
134
139
|
----------
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
140
|
+
entity_model : EntityModel, str, UUID
|
|
141
|
+
Specifies the entity against which the queryset should be filtered. Accepts an
|
|
142
|
+
`EntityModel` instance, a string (representing the entity slug), or a UUID
|
|
143
|
+
(representing the entity ID).
|
|
144
|
+
**kwargs
|
|
145
|
+
Additional keyword arguments. Supports a deprecated `user_model` argument for
|
|
146
|
+
backward compatibility.
|
|
139
147
|
|
|
140
148
|
Returns
|
|
141
149
|
-------
|
|
142
|
-
|
|
143
|
-
|
|
150
|
+
QuerySet
|
|
151
|
+
A Django QuerySet filtered according to the given entity model.
|
|
152
|
+
|
|
153
|
+
Raises
|
|
154
|
+
------
|
|
155
|
+
EstimateModelValidationError
|
|
156
|
+
If `entity_model` is of an unsupported type.
|
|
144
157
|
"""
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
158
|
+
EntityModel = lazy_loader.get_entity_model()
|
|
159
|
+
|
|
160
|
+
qs = self.get_queryset()
|
|
161
|
+
if 'user_model' in kwargs:
|
|
162
|
+
warnings.warn(
|
|
163
|
+
'user_model parameter is deprecated and will be removed in a future release. '
|
|
164
|
+
'Use for_user(user_model).for_entity(entity_model) instead to keep current behavior.',
|
|
165
|
+
DeprecationWarning,
|
|
166
|
+
stacklevel=2
|
|
149
167
|
)
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
168
|
+
if DJANGO_LEDGER_USE_DEPRECATED_BEHAVIOR:
|
|
169
|
+
qs = qs.for_user(kwargs['user_model'])
|
|
170
|
+
|
|
171
|
+
if isinstance(entity_model, EntityModel):
|
|
172
|
+
qs = qs.filter(entity=entity_model)
|
|
173
|
+
elif isinstance(entity_model, str):
|
|
174
|
+
qs = qs.filter(entity__slug__exact=entity_model)
|
|
175
|
+
elif isinstance(entity_model, UUID):
|
|
176
|
+
qs = qs.filter(entity_id=entity_model)
|
|
177
|
+
else:
|
|
178
|
+
raise EstimateModelValidationError(
|
|
179
|
+
message='entity_model must be either a string, UUID or an EntityModel'
|
|
180
|
+
)
|
|
181
|
+
return qs
|
|
153
182
|
|
|
154
183
|
|
|
155
184
|
class EstimateModelAbstract(CreateUpdateMixIn,
|
django_ledger/models/invoice.py
CHANGED
|
@@ -16,11 +16,11 @@ ________
|
|
|
16
16
|
>>> ledger_model, invoice_model = invoice_model.configure(entity_slug=entity_slug, user_model=user_model)
|
|
17
17
|
>>> invoice_model.save()
|
|
18
18
|
"""
|
|
19
|
-
|
|
19
|
+
import warnings
|
|
20
20
|
from datetime import date, datetime
|
|
21
21
|
from decimal import Decimal
|
|
22
22
|
from typing import Union, Optional, Tuple, Dict
|
|
23
|
-
from uuid import uuid4
|
|
23
|
+
from uuid import uuid4, UUID
|
|
24
24
|
|
|
25
25
|
from django.contrib.auth import get_user_model
|
|
26
26
|
from django.core.exceptions import ValidationError, ObjectDoesNotExist
|
|
@@ -37,6 +37,7 @@ from django_ledger.models import (
|
|
|
37
37
|
lazy_loader, ItemTransactionModelQuerySet,
|
|
38
38
|
ItemModelQuerySet, ItemModel, QuerySet, Manager
|
|
39
39
|
)
|
|
40
|
+
from django_ledger.models.deprecations import deprecated_entity_slug_behavior
|
|
40
41
|
from django_ledger.models.entity import EntityModel
|
|
41
42
|
from django_ledger.models.mixins import (
|
|
42
43
|
CreateUpdateMixIn, AccrualMixIn,
|
|
@@ -51,7 +52,8 @@ from django_ledger.models.signals import (
|
|
|
51
52
|
invoice_status_canceled,
|
|
52
53
|
invoice_status_void
|
|
53
54
|
)
|
|
54
|
-
from django_ledger.settings import DJANGO_LEDGER_DOCUMENT_NUMBER_PADDING, DJANGO_LEDGER_INVOICE_NUMBER_PREFIX
|
|
55
|
+
from django_ledger.settings import DJANGO_LEDGER_DOCUMENT_NUMBER_PADDING, DJANGO_LEDGER_INVOICE_NUMBER_PREFIX, \
|
|
56
|
+
DJANGO_LEDGER_USE_DEPRECATED_BEHAVIOR
|
|
55
57
|
|
|
56
58
|
UserModel = get_user_model()
|
|
57
59
|
|
|
@@ -176,6 +178,14 @@ class InvoiceModelQuerySet(QuerySet):
|
|
|
176
178
|
"""
|
|
177
179
|
return self.filter(invoice_status__exact=InvoiceModel.INVOICE_STATUS_APPROVED)
|
|
178
180
|
|
|
181
|
+
def for_user(self, user_model):
|
|
182
|
+
if user_model.is_superuser:
|
|
183
|
+
return self
|
|
184
|
+
return self.filter(
|
|
185
|
+
Q(ledger__entity__admin=user_model) |
|
|
186
|
+
Q(ledger__entity__managers__in=[user_model])
|
|
187
|
+
)
|
|
188
|
+
|
|
179
189
|
|
|
180
190
|
class InvoiceModelManager(Manager):
|
|
181
191
|
"""
|
|
@@ -183,48 +193,52 @@ class InvoiceModelManager(Manager):
|
|
|
183
193
|
The default "get_queryset" has been overridden to refer the custom defined "InvoiceModelQuerySet"
|
|
184
194
|
"""
|
|
185
195
|
|
|
186
|
-
def get_queryset(self):
|
|
187
|
-
qs =
|
|
196
|
+
def get_queryset(self) -> InvoiceModelQuerySet:
|
|
197
|
+
qs = InvoiceModelQuerySet(self.model, using=self._db)
|
|
188
198
|
return qs.select_related(
|
|
189
199
|
'ledger',
|
|
190
200
|
'ledger__entity'
|
|
191
201
|
)
|
|
192
202
|
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
if user_model.is_superuser:
|
|
196
|
-
return qs
|
|
197
|
-
return qs.filter(
|
|
198
|
-
Q(ledger__entity__admin=user_model) |
|
|
199
|
-
Q(ledger__entity__managers__in=[user_model])
|
|
200
|
-
)
|
|
201
|
-
|
|
202
|
-
def for_entity(self, entity_slug, user_model) -> InvoiceModelQuerySet:
|
|
203
|
+
@deprecated_entity_slug_behavior
|
|
204
|
+
def for_entity(self, entity_model: EntityModel | str | UUID = None, **kwargs) -> InvoiceModelQuerySet:
|
|
203
205
|
"""
|
|
204
206
|
Returns a QuerySet of InvoiceModels associated with a specific EntityModel & UserModel.
|
|
205
207
|
May pass an instance of EntityModel or a String representing the EntityModel slug.
|
|
206
208
|
|
|
207
209
|
Parameters
|
|
208
210
|
----------
|
|
209
|
-
|
|
211
|
+
entity_model: str or EntityModel
|
|
210
212
|
The entity slug or EntityModel used for filtering the QuerySet.
|
|
211
|
-
user_model
|
|
212
|
-
The request UserModel to check for privileges.
|
|
213
213
|
|
|
214
214
|
Returns
|
|
215
215
|
-------
|
|
216
216
|
InvoiceModelQuerySet
|
|
217
217
|
A Filtered InvoiceModelQuerySet.
|
|
218
218
|
"""
|
|
219
|
-
qs = self.
|
|
220
|
-
if isinstance(entity_slug, EntityModel):
|
|
221
|
-
return qs.filter(ledger__entity=entity_slug)
|
|
222
|
-
elif isinstance(entity_slug, str):
|
|
223
|
-
return qs.filter(ledger__entity__slug__exact=entity_slug)
|
|
219
|
+
qs = self.get_queryset()
|
|
224
220
|
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
221
|
+
if 'user_model' in kwargs:
|
|
222
|
+
warnings.warn(
|
|
223
|
+
'user_model parameter is deprecated and will be removed in a future release. '
|
|
224
|
+
'Use for_user(user_model).for_entity(entity_model) instead to keep current behavior.',
|
|
225
|
+
DeprecationWarning,
|
|
226
|
+
stacklevel=2
|
|
227
|
+
)
|
|
228
|
+
if DJANGO_LEDGER_USE_DEPRECATED_BEHAVIOR:
|
|
229
|
+
qs = qs.for_user(kwargs['user_model'])
|
|
230
|
+
|
|
231
|
+
if isinstance(entity_model, EntityModel):
|
|
232
|
+
qs = qs.filter(ledger__entity=entity_model)
|
|
233
|
+
elif isinstance(entity_model, UUID):
|
|
234
|
+
qs = qs.filter(ledger__entity_id=entity_model)
|
|
235
|
+
elif isinstance(entity_model, str):
|
|
236
|
+
qs = qs.filter(ledger__entity__slug__exact=entity_model)
|
|
237
|
+
else:
|
|
238
|
+
raise InvoiceModelValidationError(
|
|
239
|
+
message='Must provide either a string, UUID or an EntityModel',
|
|
240
|
+
)
|
|
241
|
+
return qs
|
|
228
242
|
|
|
229
243
|
|
|
230
244
|
class InvoiceModelAbstract(
|
|
@@ -309,6 +323,11 @@ class InvoiceModelAbstract(
|
|
|
309
323
|
"""
|
|
310
324
|
|
|
311
325
|
uuid = models.UUIDField(default=uuid4, editable=False, primary_key=True)
|
|
326
|
+
entity_model = models.ForeignKey('django_ledger.EntityModel',
|
|
327
|
+
on_delete=models.CASCADE,
|
|
328
|
+
null=True,
|
|
329
|
+
blank=True,
|
|
330
|
+
editable=False)
|
|
312
331
|
invoice_number = models.SlugField(max_length=20,
|
|
313
332
|
editable=False,
|
|
314
333
|
verbose_name=_('Invoice Number'))
|
|
@@ -320,14 +339,20 @@ class InvoiceModelAbstract(
|
|
|
320
339
|
|
|
321
340
|
cash_account = models.ForeignKey('django_ledger.AccountModel',
|
|
322
341
|
on_delete=models.RESTRICT,
|
|
342
|
+
null=True,
|
|
343
|
+
blank=True,
|
|
323
344
|
verbose_name=_('Cash Account'),
|
|
324
345
|
related_name=f'{REL_NAME_PREFIX}_cash_account')
|
|
325
346
|
prepaid_account = models.ForeignKey('django_ledger.AccountModel',
|
|
326
347
|
on_delete=models.RESTRICT,
|
|
348
|
+
null=True,
|
|
349
|
+
blank=True,
|
|
327
350
|
verbose_name=_('Prepaid Account'),
|
|
328
351
|
related_name=f'{REL_NAME_PREFIX}_prepaid_account')
|
|
329
352
|
unearned_account = models.ForeignKey('django_ledger.AccountModel',
|
|
330
353
|
on_delete=models.RESTRICT,
|
|
354
|
+
null=True,
|
|
355
|
+
blank=True,
|
|
331
356
|
verbose_name=_('Unearned Account'),
|
|
332
357
|
related_name=f'{REL_NAME_PREFIX}_unearned_account')
|
|
333
358
|
|
|
@@ -567,7 +592,8 @@ class InvoiceModelAbstract(
|
|
|
567
592
|
"""
|
|
568
593
|
return f'Invoice {self.invoice_number} account adjustment.'
|
|
569
594
|
|
|
570
|
-
def get_migration_data(self,
|
|
595
|
+
def get_migration_data(self,
|
|
596
|
+
queryset: Optional[ItemTransactionModelQuerySet] = None) -> ItemTransactionModelQuerySet:
|
|
571
597
|
|
|
572
598
|
"""
|
|
573
599
|
Fetches necessary item transaction data to perform a migration into the LedgerModel.
|
|
@@ -600,7 +626,8 @@ class InvoiceModelAbstract(
|
|
|
600
626
|
'total_amount').annotate(
|
|
601
627
|
account_unit_total=Sum('total_amount'))
|
|
602
628
|
|
|
603
|
-
def update_amount_due(self,
|
|
629
|
+
def update_amount_due(self,
|
|
630
|
+
itemtxs_qs: Optional[ItemTransactionModelQuerySet] = None) -> ItemTransactionModelQuerySet:
|
|
604
631
|
"""
|
|
605
632
|
Updates the InvoiceModel amount due.
|
|
606
633
|
|
|
@@ -1835,5 +1862,8 @@ def invoicemodel_presave(instance: InvoiceModel, **kwargs):
|
|
|
1835
1862
|
if instance.can_generate_invoice_number():
|
|
1836
1863
|
instance.generate_invoice_number(commit=False)
|
|
1837
1864
|
|
|
1865
|
+
if not instance.entity_model_id:
|
|
1866
|
+
instance.entity_model = instance.ledger.entity
|
|
1867
|
+
|
|
1838
1868
|
|
|
1839
1869
|
pre_save.connect(receiver=invoicemodel_presave, sender=InvoiceModel)
|