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 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.10'
9
+ __version__ = '0.7.11'
10
10
  __license__ = 'GPLv3 License'
11
11
 
12
12
  __author__ = 'Miguel Sanda'
@@ -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
- txs_candidates = list(tx for tx in tx_data if tx['tx_type'] == tx_type_choice)
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
- tx = choice(list(tx for tx in tx_data if tx['tx_type'] == tx_type_choice))
230
- if any([diff > 0 and tx_type_choice == DEBIT,
231
- diff < 0 and tx_type_choice == CREDIT]):
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([diff < 0 and tx_type_choice == DEBIT,
238
- diff > 0 and tx_type_choice == CREDIT]):
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
+ ]
@@ -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)
@@ -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, queryset: Optional[ItemTransactionModelQuerySet] = None) -> ItemTransactionModelQuerySet:
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, itemtxs_qs: Optional[ItemTransactionModelQuerySet] = None) -> ItemTransactionModelQuerySet:
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)
@@ -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 ui, tx in txs_list]
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
- 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
1079
+ self.set_due_date()
1076
1080
 
1077
1081
 
1078
1082
  class MarkdownNotesMixIn(models.Model):
@@ -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.10
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=bksv4wk1MvnTQqK9RYkcCU0yc4Jj9bcKBGfkvwbafKI,381
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=EmW0zu4P38OubxncBbnDdyAfM8X_epoxEc7iK-pApKA,87335
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=LCuYvyOtkZ6H-tcV4AYN1GFe_C6s__QxEbR0IcfTak8,65000
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=l1yI-kpePNNSp0MfwGeccdPLAmTmvVV4CquNIxMrmc4,63222
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=Y0uRYZAWUExpHdLZy30XQrmr2t05gMvOuDRKjkoauKk,54213
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=5tNb3pyh8GQM4hjV0FXqCXrEQF2LwpEWLkOkpknEdjA,22239
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.10.dist-info/AUTHORS.md,sha256=ShPwf-qniJkbjRzX5_lqhmgoLMEYMSHSwKPXHZtWmyk,824
414
- django_ledger-0.7.10.dist-info/LICENSE,sha256=ixuiBLtpoK3iv89l7ylKkg9rs2GzF9ukPH7ynZYzK5s,35148
415
- django_ledger-0.7.10.dist-info/METADATA,sha256=A6AQDNglh19hFQNUm_skK8dBkpycpKZjv_uO1FB9Tac,9090
416
- django_ledger-0.7.10.dist-info/WHEEL,sha256=nn6H5-ilmfVryoAQl3ZQ2l8SH5imPWFpm1A5FgEuFV4,91
417
- django_ledger-0.7.10.dist-info/top_level.txt,sha256=fmHWehb2HfoDncQ3eQtYzeYc-gJMywf6q_ZpKBjwzoQ,38
418
- django_ledger-0.7.10.dist-info/RECORD,,
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,,