django-ledger 0.7.10__py3-none-any.whl → 0.7.11__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/io/io_core.py +17 -6
- django_ledger/migrations/0024_billmodel_entity_model_invoicemodel_entity_model.py +24 -0
- django_ledger/models/bill.py +10 -0
- django_ledger/models/invoice.py +12 -2
- django_ledger/models/mixins.py +11 -7
- django_ledger/views/bill.py +0 -2
- {django_ledger-0.7.10.dist-info → django_ledger-0.7.11.dist-info}/METADATA +1 -1
- {django_ledger-0.7.10.dist-info → django_ledger-0.7.11.dist-info}/RECORD +13 -12
- {django_ledger-0.7.10.dist-info → django_ledger-0.7.11.dist-info}/AUTHORS.md +0 -0
- {django_ledger-0.7.10.dist-info → django_ledger-0.7.11.dist-info}/LICENSE +0 -0
- {django_ledger-0.7.10.dist-info → django_ledger-0.7.11.dist-info}/WHEEL +0 -0
- {django_ledger-0.7.10.dist-info → django_ledger-0.7.11.dist-info}/top_level.txt +0 -0
django_ledger/__init__.py
CHANGED
|
@@ -6,7 +6,7 @@ Copyright© EDMA Group Inc licensed under the GPLv3 Agreement.
|
|
|
6
6
|
default_app_config = 'django_ledger.apps.DjangoLedgerConfig'
|
|
7
7
|
|
|
8
8
|
"""Django Ledger"""
|
|
9
|
-
__version__ = '0.7.
|
|
9
|
+
__version__ = '0.7.11'
|
|
10
10
|
__license__ = 'GPLv3 License'
|
|
11
11
|
|
|
12
12
|
__author__ = 'Miguel Sanda'
|
django_ledger/io/io_core.py
CHANGED
|
@@ -224,18 +224,29 @@ def check_tx_balance(tx_data: list, perform_correction: bool = False) -> bool:
|
|
|
224
224
|
|
|
225
225
|
while not is_valid:
|
|
226
226
|
tx_type_choice = choice([DEBIT, CREDIT])
|
|
227
|
-
|
|
227
|
+
|
|
228
|
+
if IS_TX_MODEL:
|
|
229
|
+
txs_candidates = list(tx for tx in tx_data if tx.tx_type == tx_type_choice)
|
|
230
|
+
else:
|
|
231
|
+
txs_candidates = list(tx for tx in tx_data if tx['tx_type'] == tx_type_choice)
|
|
232
|
+
|
|
228
233
|
if len(txs_candidates) > 0:
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
234
|
+
|
|
235
|
+
tx = choice(txs_candidates)
|
|
236
|
+
|
|
237
|
+
if any([
|
|
238
|
+
diff > 0 and tx_type_choice == DEBIT,
|
|
239
|
+
diff < 0 and tx_type_choice == CREDIT
|
|
240
|
+
]):
|
|
232
241
|
if IS_TX_MODEL:
|
|
233
242
|
tx.amount += settings.DJANGO_LEDGER_TRANSACTION_CORRECTION
|
|
234
243
|
else:
|
|
235
244
|
tx['amount'] += settings.DJANGO_LEDGER_TRANSACTION_CORRECTION
|
|
236
245
|
|
|
237
|
-
elif any([
|
|
238
|
-
|
|
246
|
+
elif any([
|
|
247
|
+
diff < 0 and tx_type_choice == DEBIT,
|
|
248
|
+
diff > 0 and tx_type_choice == CREDIT
|
|
249
|
+
]):
|
|
239
250
|
if IS_TX_MODEL:
|
|
240
251
|
tx.amount -= settings.DJANGO_LEDGER_TRANSACTION_CORRECTION
|
|
241
252
|
else:
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# Generated by Django 5.2.1 on 2025-08-26 12:40
|
|
2
|
+
|
|
3
|
+
import django.db.models.deletion
|
|
4
|
+
from django.db import migrations, models
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class Migration(migrations.Migration):
|
|
8
|
+
|
|
9
|
+
dependencies = [
|
|
10
|
+
('django_ledger', '0023_customermodel_customer_code_customermodel_picture_and_more'),
|
|
11
|
+
]
|
|
12
|
+
|
|
13
|
+
operations = [
|
|
14
|
+
migrations.AddField(
|
|
15
|
+
model_name='billmodel',
|
|
16
|
+
name='entity_model',
|
|
17
|
+
field=models.ForeignKey(blank=True, editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, to='django_ledger.entitymodel'),
|
|
18
|
+
),
|
|
19
|
+
migrations.AddField(
|
|
20
|
+
model_name='invoicemodel',
|
|
21
|
+
name='entity_model',
|
|
22
|
+
field=models.ForeignKey(blank=True, editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, to='django_ledger.entitymodel'),
|
|
23
|
+
),
|
|
24
|
+
]
|
django_ledger/models/bill.py
CHANGED
|
@@ -353,6 +353,13 @@ class BillModelAbstract(
|
|
|
353
353
|
|
|
354
354
|
# todo: implement Void Bill (& Invoice)....
|
|
355
355
|
uuid = models.UUIDField(default=uuid4, editable=False, primary_key=True)
|
|
356
|
+
entity_model = models.ForeignKey(
|
|
357
|
+
'django_ledger.EntityModel',
|
|
358
|
+
on_delete=models.CASCADE,
|
|
359
|
+
null=True,
|
|
360
|
+
blank=True,
|
|
361
|
+
editable=False
|
|
362
|
+
)
|
|
356
363
|
bill_number = models.SlugField(max_length=20, verbose_name=_('Bill Number'), editable=False)
|
|
357
364
|
bill_status = models.CharField(max_length=10,
|
|
358
365
|
choices=BILL_STATUS,
|
|
@@ -1927,5 +1934,8 @@ def billmodel_presave(instance: BillModel, **kwargs):
|
|
|
1927
1934
|
if instance.can_generate_bill_number():
|
|
1928
1935
|
instance.generate_bill_number(commit=False)
|
|
1929
1936
|
|
|
1937
|
+
if not instance.entity_model_id:
|
|
1938
|
+
instance.entity_model = instance.ledger.entity
|
|
1939
|
+
|
|
1930
1940
|
|
|
1931
1941
|
pre_save.connect(receiver=billmodel_presave, sender=BillModel)
|
django_ledger/models/invoice.py
CHANGED
|
@@ -309,6 +309,11 @@ class InvoiceModelAbstract(
|
|
|
309
309
|
"""
|
|
310
310
|
|
|
311
311
|
uuid = models.UUIDField(default=uuid4, editable=False, primary_key=True)
|
|
312
|
+
entity_model = models.ForeignKey('django_ledger.EntityModel',
|
|
313
|
+
on_delete=models.CASCADE,
|
|
314
|
+
null=True,
|
|
315
|
+
blank=True,
|
|
316
|
+
editable=False)
|
|
312
317
|
invoice_number = models.SlugField(max_length=20,
|
|
313
318
|
editable=False,
|
|
314
319
|
verbose_name=_('Invoice Number'))
|
|
@@ -567,7 +572,8 @@ class InvoiceModelAbstract(
|
|
|
567
572
|
"""
|
|
568
573
|
return f'Invoice {self.invoice_number} account adjustment.'
|
|
569
574
|
|
|
570
|
-
def get_migration_data(self,
|
|
575
|
+
def get_migration_data(self,
|
|
576
|
+
queryset: Optional[ItemTransactionModelQuerySet] = None) -> ItemTransactionModelQuerySet:
|
|
571
577
|
|
|
572
578
|
"""
|
|
573
579
|
Fetches necessary item transaction data to perform a migration into the LedgerModel.
|
|
@@ -600,7 +606,8 @@ class InvoiceModelAbstract(
|
|
|
600
606
|
'total_amount').annotate(
|
|
601
607
|
account_unit_total=Sum('total_amount'))
|
|
602
608
|
|
|
603
|
-
def update_amount_due(self,
|
|
609
|
+
def update_amount_due(self,
|
|
610
|
+
itemtxs_qs: Optional[ItemTransactionModelQuerySet] = None) -> ItemTransactionModelQuerySet:
|
|
604
611
|
"""
|
|
605
612
|
Updates the InvoiceModel amount due.
|
|
606
613
|
|
|
@@ -1835,5 +1842,8 @@ def invoicemodel_presave(instance: InvoiceModel, **kwargs):
|
|
|
1835
1842
|
if instance.can_generate_invoice_number():
|
|
1836
1843
|
instance.generate_invoice_number(commit=False)
|
|
1837
1844
|
|
|
1845
|
+
if not instance.entity_model_id:
|
|
1846
|
+
instance.entity_model = instance.ledger.entity
|
|
1847
|
+
|
|
1838
1848
|
|
|
1839
1849
|
pre_save.connect(receiver=invoicemodel_presave, sender=InvoiceModel)
|
django_ledger/models/mixins.py
CHANGED
|
@@ -787,7 +787,7 @@ class AccrualMixIn(models.Model):
|
|
|
787
787
|
check_tx_balance(tx_data=[tx for ui, tx in txs_list if uid == ui], perform_correction=True)
|
|
788
788
|
|
|
789
789
|
# validates all txs as a whole (for safety)...
|
|
790
|
-
txs = [tx for
|
|
790
|
+
txs = [tx for _, tx in txs_list]
|
|
791
791
|
check_tx_balance(tx_data=txs, perform_correction=True)
|
|
792
792
|
TransactionModel.objects.bulk_create(txs)
|
|
793
793
|
|
|
@@ -1065,14 +1065,18 @@ class PaymentTermsMixIn(models.Model):
|
|
|
1065
1065
|
return self.TERMS_NET_90
|
|
1066
1066
|
return self.TERMS_NET_90_PLUS
|
|
1067
1067
|
|
|
1068
|
+
def set_due_date(self, force_update: bool = False):
|
|
1069
|
+
if self.date_due is None or force_update:
|
|
1070
|
+
terms_start_date = self.get_terms_start_date()
|
|
1071
|
+
if terms_start_date:
|
|
1072
|
+
if self.terms != self.TERMS_ON_RECEIPT:
|
|
1073
|
+
self.date_due = terms_start_date + self.get_terms_timedelta()
|
|
1074
|
+
else:
|
|
1075
|
+
self.date_due = terms_start_date
|
|
1076
|
+
|
|
1068
1077
|
def clean(self):
|
|
1069
1078
|
super().clean()
|
|
1070
|
-
|
|
1071
|
-
if terms_start_date:
|
|
1072
|
-
if self.terms != self.TERMS_ON_RECEIPT:
|
|
1073
|
-
self.date_due = terms_start_date + self.get_terms_timedelta()
|
|
1074
|
-
else:
|
|
1075
|
-
self.date_due = terms_start_date
|
|
1079
|
+
self.set_due_date()
|
|
1076
1080
|
|
|
1077
1081
|
|
|
1078
1082
|
class MarkdownNotesMixIn(models.Model):
|
django_ledger/views/bill.py
CHANGED
|
@@ -253,8 +253,6 @@ class BillModelDetailView(BillModelModelBaseView, DetailView):
|
|
|
253
253
|
title = f'Bill {bill_model.bill_number}'
|
|
254
254
|
context['page_title'] = title
|
|
255
255
|
context['header_title'] = title
|
|
256
|
-
|
|
257
|
-
bill_model: BillModel = self.object
|
|
258
256
|
bill_items_qs, item_data = bill_model.get_itemtxs_data()
|
|
259
257
|
context['itemtxs_qs'] = bill_items_qs
|
|
260
258
|
context['total_amount__sum'] = item_data['total_amount__sum']
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.2
|
|
2
2
|
Name: django-ledger
|
|
3
|
-
Version: 0.7.
|
|
3
|
+
Version: 0.7.11
|
|
4
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>
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
django_ledger/__init__.py,sha256=
|
|
1
|
+
django_ledger/__init__.py,sha256=uLgks5A6z1Ujc8_0OaliPLnQX7YQoyMbzdWZ0I1Zxy4,381
|
|
2
2
|
django_ledger/apps.py,sha256=H-zEWUjKGakgSDSZmLIoXChZ2h6e0dth0ZO5SpoT-8U,163
|
|
3
3
|
django_ledger/exceptions.py,sha256=rML8sQQ0Hq-DYMLZ76dfw2RYSAsXWUoyHuyC_yP9o1o,491
|
|
4
4
|
django_ledger/settings.py,sha256=QOMK8mhT8MLrMxVDEzNRJ9W01Pm-Po26y7KaBPLVeNk,8952
|
|
@@ -66,7 +66,7 @@ django_ledger/forms/utils.py,sha256=sgkwBZs15_rZ5NT7h-8Z7wi3-ItM1E1sqoVDo3NQ5Jc,
|
|
|
66
66
|
django_ledger/forms/vendor.py,sha256=eLCZiWZLVigTyltQZfBfcE35_9Re4hdXisyWOadMS-s,2417
|
|
67
67
|
django_ledger/io/__init__.py,sha256=8m5AoBRiG2ymrX0Y4LVjq0275i7I5Sk7YRa1BTzVofI,369
|
|
68
68
|
django_ledger/io/io_context.py,sha256=2AiQyJSTkYUCu09Ig0ZPgYj8PtlvUKNS30KvRp9e7zA,4753
|
|
69
|
-
django_ledger/io/io_core.py,sha256=
|
|
69
|
+
django_ledger/io/io_core.py,sha256=Sok4OmD_8Wqma7gP2OPLRqfZOgNqb-4ZretC8MGRpJ0,87500
|
|
70
70
|
django_ledger/io/io_generator.py,sha256=IN_ZuMlPHXgoEffxA7PMN2fyTvWPJktzVR6yIaocsRs,34725
|
|
71
71
|
django_ledger/io/io_library.py,sha256=CGZABR4P80VfIube4QEryNOi01llrPq0Gh-8vVbtZDY,22496
|
|
72
72
|
django_ledger/io/io_middleware.py,sha256=vbWIBYA4V9nwoiEtB0W9pq19QIwPmaAyVJlo_1Gg2BY,20284
|
|
@@ -99,11 +99,12 @@ django_ledger/migrations/0020_remove_bankaccountmodel_django_ledg_cash_ac_59a8af
|
|
|
99
99
|
django_ledger/migrations/0021_alter_bankaccountmodel_account_model_and_more.py,sha256=b3eJA_QzNzvx7BPSaj2RCPIbsrCkZrpkvk_qN7v-4OA,1101
|
|
100
100
|
django_ledger/migrations/0022_bankaccountmodel_financial_institution_and_more.py,sha256=MR_E-DYIEsxSfhO5O4iBsShe-tyM3wYZQ4C4_6h1Prw,2959
|
|
101
101
|
django_ledger/migrations/0023_customermodel_customer_code_customermodel_picture_and_more.py,sha256=M2p8Km55aNE-aKX_XWYZKQeh03MPbyoSQ15sOj-B86E,2095
|
|
102
|
+
django_ledger/migrations/0024_billmodel_entity_model_invoicemodel_entity_model.py,sha256=Fq2HiDJGpK7_dXq94INOs63psxf_q29vYZRVOr3qFRs,839
|
|
102
103
|
django_ledger/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
103
104
|
django_ledger/models/__init__.py,sha256=OesBx4My9GnqU1xB5WXuuGLOnmzgxEJxI-WWxRxi658,807
|
|
104
105
|
django_ledger/models/accounts.py,sha256=LDbDLUiTkxy0k2Qyrq4N6FvpaffXW4vAuM53v5xveg0,36685
|
|
105
106
|
django_ledger/models/bank_account.py,sha256=dar6-iOqCBkeqyxwuV8tc2czFZVX9nGRSPvOLxp4m64,8009
|
|
106
|
-
django_ledger/models/bill.py,sha256=
|
|
107
|
+
django_ledger/models/bill.py,sha256=LEJJymFBh-U6YcKZC56CnAPSC_2bPuUDptu7QKX131U,65270
|
|
107
108
|
django_ledger/models/chart_of_accounts.py,sha256=cMHAc0TQdYD1iMan9qbrq2FX3NlmPYI_g1qwXPa4sSU,30308
|
|
108
109
|
django_ledger/models/closing_entry.py,sha256=ILFNwxvCNvlEKuK2AL8z49izEBtfco-IT_oXcCMcbP8,18294
|
|
109
110
|
django_ledger/models/coa_default.py,sha256=CK4vOZ73QePciZUL93wigDXpxKamdXAKBaQR7r-G7tk,27482
|
|
@@ -111,11 +112,11 @@ django_ledger/models/customer.py,sha256=UUGXXGMilZ4XYdK1Ytu-3IlYhHw-t3_cgh32Gbad
|
|
|
111
112
|
django_ledger/models/data_import.py,sha256=nffhWbb-EQN3zmFtJ512ix5ExnlJDSNHieOxR4W6OSE,47802
|
|
112
113
|
django_ledger/models/entity.py,sha256=kiY-VX_ot727sF0VRlfxA7bOVE5aP-hFmDg6TX78msM,124687
|
|
113
114
|
django_ledger/models/estimate.py,sha256=t3ZSBHZUUOdWP6eMCyQwNgvNSY4myKbkdfaFd9zlpH0,58056
|
|
114
|
-
django_ledger/models/invoice.py,sha256=
|
|
115
|
+
django_ledger/models/invoice.py,sha256=1HdVjm5pmdiDFSonUwEzR-U4aY0OLK3PCKxuk-xaxww,63647
|
|
115
116
|
django_ledger/models/items.py,sha256=cGv681aocJJxXSbsz9NlLhPp7kJ-gQrtxl7EcsiwULg,55087
|
|
116
117
|
django_ledger/models/journal_entry.py,sha256=Hqfz7oNUBXt1Vprd5W1adrFmZzCebemc2cvQZTlKVrk,66993
|
|
117
118
|
django_ledger/models/ledger.py,sha256=ltWmPIzauwxODO-FSupphIOkJYPDGT47-xKOst5DEvQ,26266
|
|
118
|
-
django_ledger/models/mixins.py,sha256=
|
|
119
|
+
django_ledger/models/mixins.py,sha256=jwHepBVjM30iQVuHSg0TMYBvchEWCgpG59B_fKBGyt4,54371
|
|
119
120
|
django_ledger/models/purchase_order.py,sha256=A0fKA1lU12CYePb43T--wSNqf_d6Vwap1deyNXUoFEg,44140
|
|
120
121
|
django_ledger/models/signals.py,sha256=3cm_8--Jz-Jb0fPgrVmm5xx_jKFARV6_A29VDjqHeIw,1563
|
|
121
122
|
django_ledger/models/transactions.py,sha256=b_ChD6FG-ru7FgT7c9D_1ku1YyhCz840wSrnyVQN6AU,24045
|
|
@@ -389,7 +390,7 @@ django_ledger/views/__init__.py,sha256=fY9eBoPkx50p-kSalskd4QW1tHm3e64WpwOFuJzn4
|
|
|
389
390
|
django_ledger/views/account.py,sha256=fC0PX889DxyKheTF3SIA_aDxermQu8hPhrw5JBwpwS0,9536
|
|
390
391
|
django_ledger/views/auth.py,sha256=I8Mv_aAfW-8Z5VYPOX7P3IUO4Fp5jJPkSuu1ZSVpWtI,777
|
|
391
392
|
django_ledger/views/bank_account.py,sha256=MbiVurJTNK-UsDPn17-ai4G8sE3qIMrdmXaWPX-J8n8,5025
|
|
392
|
-
django_ledger/views/bill.py,sha256=
|
|
393
|
+
django_ledger/views/bill.py,sha256=eMVthGDkbOrRpVo4qF1jFOXq268YPjcz72P-LMM98U4,22194
|
|
393
394
|
django_ledger/views/chart_of_accounts.py,sha256=wMdnXRNWzdPgxl1YeHbdAQXbCBU2VkmxVxxtUuk9NAQ,5485
|
|
394
395
|
django_ledger/views/closing_entry.py,sha256=SbJMyBVG8KTfZ6oo4Gdzx03utKY5CoC7qioU_dm9n5I,8157
|
|
395
396
|
django_ledger/views/customer.py,sha256=FYnwhRx6JXE4bsjXQqFp8b9H8a4m7zv6ohoSj1OkZD8,3678
|
|
@@ -410,9 +411,9 @@ django_ledger/views/purchase_order.py,sha256=CyftKrQWV1SBz7W0CvZOfZ81OPEiBHPD7b9
|
|
|
410
411
|
django_ledger/views/transactions.py,sha256=3ijtJzdLPFkqG7OYpe-7N4QVjCyR2yl5ht_9RyfquBA,212
|
|
411
412
|
django_ledger/views/unit.py,sha256=CarmOKzXANssVD3qMS1oXvJw614Y3rS0QHhSGJC0jBE,10069
|
|
412
413
|
django_ledger/views/vendor.py,sha256=7gtVK_bgnXxbVwNAHYtI_eNEJPefCz807LgE1vqOov8,3532
|
|
413
|
-
django_ledger-0.7.
|
|
414
|
-
django_ledger-0.7.
|
|
415
|
-
django_ledger-0.7.
|
|
416
|
-
django_ledger-0.7.
|
|
417
|
-
django_ledger-0.7.
|
|
418
|
-
django_ledger-0.7.
|
|
414
|
+
django_ledger-0.7.11.dist-info/AUTHORS.md,sha256=ShPwf-qniJkbjRzX5_lqhmgoLMEYMSHSwKPXHZtWmyk,824
|
|
415
|
+
django_ledger-0.7.11.dist-info/LICENSE,sha256=ixuiBLtpoK3iv89l7ylKkg9rs2GzF9ukPH7ynZYzK5s,35148
|
|
416
|
+
django_ledger-0.7.11.dist-info/METADATA,sha256=BGpP8dA2hd3bB1flaeDQrpii0eVK353z9PEGdFnxS_o,9090
|
|
417
|
+
django_ledger-0.7.11.dist-info/WHEEL,sha256=nn6H5-ilmfVryoAQl3ZQ2l8SH5imPWFpm1A5FgEuFV4,91
|
|
418
|
+
django_ledger-0.7.11.dist-info/top_level.txt,sha256=fmHWehb2HfoDncQ3eQtYzeYc-gJMywf6q_ZpKBjwzoQ,38
|
|
419
|
+
django_ledger-0.7.11.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|