django-ledger 0.7.7__py3-none-any.whl → 0.7.9__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.7'
9
+ __version__ = '0.7.9'
10
10
  __license__ = 'GPLv3 License'
11
11
 
12
12
  __author__ = 'Miguel Sanda'
django_ledger/io/ofx.py CHANGED
@@ -7,6 +7,7 @@ Miguel Sanda <msanda@arrobalytics.com>
7
7
  """
8
8
 
9
9
  from typing import List, Optional, Dict
10
+ from django_ledger.models.bank_account import BankAccountModel
10
11
 
11
12
  from django.core.exceptions import ValidationError
12
13
  from ofxtools import OFXTree
@@ -64,6 +65,30 @@ class OFXFileManager:
64
65
  def get_account_number(self):
65
66
  return self.get_account_data()['account'].acctid
66
67
 
68
+ def get_routing_number(self):
69
+ return self.get_account_data()['account'].bankid
70
+
71
+ def get_ofx_account_type(self):
72
+ """
73
+ Gets the account type as defined in the OFX (Open Financial Exchange) specification.
74
+
75
+ Returns:
76
+ str: One of the following standardized account types:
77
+ - 'CHECKING' - Standard checking account
78
+ - 'SAVINGS' - Savings account
79
+ - 'MONEYMRKT' - Money Market account
80
+ - 'CREDITLINE' - Credit line account
81
+ - 'CD' - Certificate of Deposit
82
+ """
83
+ acc_type = self.get_account_data()['account'].accttype
84
+
85
+ if acc_type not in ['CHECKING', 'SAVINGS', 'MONEYMRKT', 'CREDITLINE', 'CD']:
86
+ raise OFXImportValidationError(f'Account type "{acc_type}" is not supported.')
87
+ return acc_type
88
+
89
+ def get_account_type(self):
90
+ return BankAccountModel.ACCOUNT_TYPE_OFX_MAPPING[self.get_ofx_account_type()]
91
+
67
92
  def get_account_txs(self):
68
93
  acc_statement = next(iter(
69
94
  st for st in self.ofx_data.statements if st.account.acctid == self.get_account_number()
@@ -0,0 +1,52 @@
1
+ # Generated by Django 5.2.1 on 2025-06-24 21:54
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ('django_ledger', '0021_alter_bankaccountmodel_account_model_and_more'),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AddField(
14
+ model_name='bankaccountmodel',
15
+ name='financial_institution',
16
+ field=models.CharField(blank=True, help_text='Name of the financial institution (i.e. Bank Name).', max_length=100, null=True, verbose_name='Financial Institution'),
17
+ ),
18
+ migrations.AddField(
19
+ model_name='vendormodel',
20
+ name='financial_institution',
21
+ field=models.CharField(blank=True, help_text='Name of the financial institution (i.e. Bank Name).', max_length=100, null=True, verbose_name='Financial Institution'),
22
+ ),
23
+ migrations.AlterField(
24
+ model_name='bankaccountmodel',
25
+ name='account_type',
26
+ field=models.CharField(choices=[('checking', 'Checking'), ('savings', 'Savings'), ('money_market', 'Money Market'), ('cert_deposit', 'Certificate of Deposit'), ('credit_card', 'Credit Card'), ('st_loan', 'Short Term Loan'), ('lt_loan', 'Long Term Loan'), ('mortgage', 'Mortgage'), ('other', 'Other')], default='checking', max_length=20, verbose_name='Account Type'),
27
+ ),
28
+ migrations.AlterField(
29
+ model_name='billmodel',
30
+ name='bill_items',
31
+ field=models.ManyToManyField(through='django_ledger.ItemTransactionModel', through_fields=('bill_model', 'item_model'), to='django_ledger.itemmodel', verbose_name='Bill Items'),
32
+ ),
33
+ migrations.AlterField(
34
+ model_name='invoicemodel',
35
+ name='invoice_items',
36
+ field=models.ManyToManyField(through='django_ledger.ItemTransactionModel', through_fields=('invoice_model', 'item_model'), to='django_ledger.itemmodel', verbose_name='Invoice Items'),
37
+ ),
38
+ migrations.AlterField(
39
+ model_name='purchaseordermodel',
40
+ name='po_items',
41
+ field=models.ManyToManyField(through='django_ledger.ItemTransactionModel', through_fields=('po_model', 'item_model'), to='django_ledger.itemmodel', verbose_name='Purchase Order Items'),
42
+ ),
43
+ migrations.AlterField(
44
+ model_name='vendormodel',
45
+ name='account_type',
46
+ field=models.CharField(choices=[('checking', 'Checking'), ('savings', 'Savings'), ('money_market', 'Money Market'), ('cert_deposit', 'Certificate of Deposit'), ('credit_card', 'Credit Card'), ('st_loan', 'Short Term Loan'), ('lt_loan', 'Long Term Loan'), ('mortgage', 'Mortgage'), ('other', 'Other')], default='checking', max_length=20, verbose_name='Account Type'),
47
+ ),
48
+ migrations.AddIndex(
49
+ model_name='bankaccountmodel',
50
+ index=models.Index(fields=['entity_model'], name='django_ledg_entity__6ad006_idx'),
51
+ ),
52
+ ]
@@ -65,7 +65,7 @@ from django_ledger.io.roles import (
65
65
  GROUP_ASSETS, GROUP_LIABILITIES, GROUP_CAPITAL, GROUP_INCOME, GROUP_EXPENSES, GROUP_COGS,
66
66
  ROOT_GROUP, BS_BUCKETS, ROOT_ASSETS, ROOT_LIABILITIES,
67
67
  ROOT_CAPITAL, ROOT_INCOME, ROOT_EXPENSES, ROOT_COA, VALID_PARENTS,
68
- ROLES_ORDER_ALL
68
+ ROLES_ORDER_ALL, ASSET_CA_CASH
69
69
  )
70
70
  from django_ledger.models.mixins import CreateUpdateMixIn
71
71
  from django_ledger.models.utils import lazy_loader
@@ -161,6 +161,10 @@ class AccountModelQuerySet(MP_NodeQuerySet):
161
161
  codes = [codes]
162
162
  return self.filter(code__in=codes)
163
163
 
164
+ def cash(self):
165
+ """Retrieve accounts that are of type ASSET_CA_CASH."""
166
+ return self.filter(role__exact=ASSET_CA_CASH)
167
+
164
168
  def expenses(self):
165
169
  """
166
170
  Retrieve a queryset containing expenses filtered by specified roles.
@@ -435,7 +439,6 @@ class AccountModelAbstract(MP_Node, CreateUpdateMixIn):
435
439
  on_delete=models.CASCADE,
436
440
  verbose_name=_('Chart of Accounts'))
437
441
  objects = AccountModelManager()
438
- node_order_by = ['uuid']
439
442
 
440
443
  class Meta:
441
444
  abstract = True
@@ -12,7 +12,7 @@ from uuid import uuid4
12
12
  from django.contrib.auth import get_user_model
13
13
  from django.core.exceptions import ValidationError
14
14
  from django.db import models
15
- from django.db.models import Q, QuerySet
15
+ from django.db.models import Q, QuerySet, Manager
16
16
  from django.shortcuts import get_object_or_404
17
17
  from django.utils.translation import gettext_lazy as _
18
18
 
@@ -55,7 +55,7 @@ class BankAccountModelQuerySet(QuerySet):
55
55
  return self.filter(hidden=True)
56
56
 
57
57
 
58
- class BankAccountModelManager(models.Manager):
58
+ class BankAccountModelManager(Manager):
59
59
  """
60
60
  Custom defined Model Manager for the BankAccountModel.
61
61
  """
@@ -126,10 +126,12 @@ class BankAccountModelAbstract(FinancialAccountInfoMixin, CreateUpdateMixIn):
126
126
  entity_model = models.ForeignKey('django_ledger.EntityModel',
127
127
  on_delete=models.CASCADE,
128
128
  verbose_name=_('Entity Model'))
129
+
129
130
  account_model = models.ForeignKey('django_ledger.AccountModel',
130
131
  on_delete=models.RESTRICT,
131
132
  help_text=_(
132
- 'Account model be used to map transactions from financial institution'),
133
+ 'Account model be used to map transactions from financial institution'
134
+ ),
133
135
  verbose_name=_('Associated Account Model'))
134
136
  active = models.BooleanField(default=False)
135
137
  hidden = models.BooleanField(default=False)
@@ -168,7 +170,8 @@ class BankAccountModelAbstract(FinancialAccountInfoMixin, CreateUpdateMixIn):
168
170
  verbose_name = _('Bank Account')
169
171
  indexes = [
170
172
  models.Index(fields=['account_type']),
171
- models.Index(fields=['account_model'])
173
+ models.Index(fields=['account_model']),
174
+ models.Index(fields=['entity_model'])
172
175
  ]
173
176
  unique_together = [
174
177
  ('entity_model', 'account_number'),
@@ -178,6 +181,12 @@ class BankAccountModelAbstract(FinancialAccountInfoMixin, CreateUpdateMixIn):
178
181
  def __str__(self):
179
182
  return f'{self.get_account_type_display()} Bank Account: {self.name}'
180
183
 
184
+ def can_hide(self) -> bool:
185
+ return self.hidden is False
186
+
187
+ def can_unhide(self) -> bool:
188
+ return self.hidden is True
189
+
181
190
  def can_activate(self) -> bool:
182
191
  return self.active is False
183
192
 
@@ -12,7 +12,7 @@ or further processing.
12
12
  """
13
13
 
14
14
  from decimal import Decimal
15
- from typing import Optional, Set, Dict, List
15
+ from typing import Optional, Set, Dict, List, Union
16
16
  from uuid import uuid4, UUID
17
17
 
18
18
  from django.core.exceptions import ValidationError
@@ -24,6 +24,7 @@ from django.utils.translation import gettext_lazy as _
24
24
 
25
25
  from django_ledger.io import ASSET_CA_CASH, CREDIT, DEBIT
26
26
  from django_ledger.models import JournalEntryModel
27
+ from django_ledger.models.entity import EntityModel
27
28
  from django_ledger.models.mixins import CreateUpdateMixIn
28
29
  from django_ledger.models.utils import lazy_loader
29
30
 
@@ -128,8 +129,12 @@ class ImportJobModelManager(Manager):
128
129
 
129
130
  )
130
131
 
131
- def for_entity(self, entity_slug: str, user_model):
132
+ def for_entity(self, entity_slug: Union[EntityModel, str], user_model):
132
133
  qs = self.for_user(user_model)
134
+ if isinstance(entity_slug, EntityModel):
135
+ return qs.filter(
136
+ Q(bank_account_model__entity_model=entity_slug)
137
+ )
133
138
  return qs.filter(
134
139
  Q(bank_account_model__entity_model__slug__exact=entity_slug)
135
140
  )
@@ -787,7 +787,6 @@ class EntityModelAbstract(MP_Node,
787
787
  meta = models.JSONField(default=dict, null=True, blank=True)
788
788
  objects = EntityModelManager.from_queryset(queryset_class=EntityModelQuerySet)()
789
789
 
790
- node_order_by = ['uuid']
791
790
 
792
791
  class Meta:
793
792
  abstract = True
@@ -2048,7 +2047,7 @@ class EntityModelAbstract(MP_Node,
2048
2047
  account_model_qs = self.get_coa_accounts(coa_model=coa_model, active=True)
2049
2048
  account_model_qs = account_model_qs.with_roles(
2050
2049
  roles=[
2051
- BankAccountModel.ACCOUNT_TYPE_ROLE_MAPPING[account_type]
2050
+ BankAccountModel.ACCOUNT_TYPE_DEFAULT_ROLE_MAPPING[account_type]
2052
2051
  ]
2053
2052
  ).is_role_default()
2054
2053
 
@@ -23,7 +23,10 @@ from django.utils.encoding import force_str
23
23
  from django.utils.translation import gettext_lazy as _
24
24
  from markdown import markdown
25
25
 
26
- from django_ledger.io import ASSET_CA_CASH, LIABILITY_CL_ST_NOTES_PAYABLE, LIABILITY_LTL_MORTGAGE_PAYABLE
26
+ from django_ledger.io import (
27
+ ASSET_CA_CASH, LIABILITY_CL_ST_NOTES_PAYABLE, LIABILITY_LTL_MORTGAGE_PAYABLE,
28
+ LIABILITY_CL_ACC_PAYABLE, LIABILITY_CL_OTHER, LIABILITY_LTL_NOTES_PAYABLE
29
+ )
27
30
  from django_ledger.io.io_core import validate_io_timestamp, check_tx_balance, get_localtime, get_localdate
28
31
  from django_ledger.models.utils import lazy_loader
29
32
 
@@ -1123,25 +1126,55 @@ class FinancialAccountInfoMixin(models.Model):
1123
1126
 
1124
1127
  ACCOUNT_CHECKING = 'checking'
1125
1128
  ACCOUNT_SAVINGS = 'savings'
1129
+ ACCOUNT_MONEY_MKT = 'money_market'
1130
+ ACCOUNT_CERT_DEPOSIT = 'cert_deposit'
1126
1131
  ACCOUNT_CREDIT_CARD = 'credit_card'
1132
+ ACCOUNT_ST_LOAN = 'st_loan'
1133
+ ACCOUNT_LT_LOAN = 'lt_loan'
1127
1134
  ACCOUNT_MORTGAGE = 'mortgage'
1135
+ ACCOUNT_OTHER = 'other'
1128
1136
 
1129
- ACCOUNT_TYPE_ROLE_MAPPING = {
1137
+ ACCOUNT_TYPE_DEFAULT_ROLE_MAPPING = {
1130
1138
  ACCOUNT_CHECKING: ASSET_CA_CASH,
1131
1139
  ACCOUNT_SAVINGS: ASSET_CA_CASH,
1132
- ACCOUNT_CREDIT_CARD: LIABILITY_CL_ST_NOTES_PAYABLE,
1133
- ACCOUNT_MORTGAGE: LIABILITY_LTL_MORTGAGE_PAYABLE
1140
+ ACCOUNT_MONEY_MKT: ASSET_CA_CASH,
1141
+ ACCOUNT_CERT_DEPOSIT: ASSET_CA_CASH,
1142
+ ACCOUNT_CREDIT_CARD: LIABILITY_CL_ACC_PAYABLE,
1143
+ ACCOUNT_ST_LOAN: LIABILITY_CL_ST_NOTES_PAYABLE,
1144
+ ACCOUNT_LT_LOAN: LIABILITY_LTL_NOTES_PAYABLE,
1145
+ ACCOUNT_MORTGAGE: LIABILITY_LTL_MORTGAGE_PAYABLE,
1146
+ ACCOUNT_OTHER: LIABILITY_CL_OTHER
1134
1147
  }
1135
1148
 
1136
1149
  ACCOUNT_TYPE_CHOICES = [
1137
1150
  (ACCOUNT_CHECKING, _('Checking')),
1138
1151
  (ACCOUNT_SAVINGS, _('Savings')),
1152
+ (ACCOUNT_MONEY_MKT, _('Money Market')),
1153
+ (ACCOUNT_CERT_DEPOSIT, _('Certificate of Deposit')),
1139
1154
  (ACCOUNT_CREDIT_CARD, _('Credit Card')),
1155
+ (ACCOUNT_ST_LOAN, _('Short Term Loan')),
1156
+ (ACCOUNT_LT_LOAN, _('Long Term Loan')),
1140
1157
  (ACCOUNT_MORTGAGE, _('Mortgage')),
1158
+ (ACCOUNT_OTHER, _('Other')),
1141
1159
  ]
1142
1160
 
1161
+ ACCOUNT_TYPE_OFX_MAPPING = {
1162
+ 'CHECKING': ACCOUNT_CHECKING,
1163
+ 'SAVINGS': ACCOUNT_SAVINGS,
1164
+ 'MONEYMRKT': ACCOUNT_MONEY_MKT,
1165
+ 'CREDITLINE': ACCOUNT_CREDIT_CARD,
1166
+ 'CD': ACCOUNT_CERT_DEPOSIT
1167
+ }
1168
+
1143
1169
  VALID_ACCOUNT_TYPES = tuple(atc[0] for atc in ACCOUNT_TYPE_CHOICES)
1144
1170
 
1171
+ financial_institution = models.CharField(
1172
+ max_length=100,
1173
+ blank=True,
1174
+ null=True,
1175
+ verbose_name=_('Financial Institution'),
1176
+ help_text=_('Name of the financial institution (i.e. Bank Name).')
1177
+ )
1145
1178
  account_number = models.CharField(max_length=30, null=True, blank=True,
1146
1179
  validators=[
1147
1180
  int_list_validator(sep='', message=_('Only digits allowed'))
@@ -1152,14 +1185,31 @@ class FinancialAccountInfoMixin(models.Model):
1152
1185
  ], verbose_name=_('Routing Number'))
1153
1186
  aba_number = models.CharField(max_length=30, null=True, blank=True, verbose_name=_('ABA Number'))
1154
1187
  swift_number = models.CharField(max_length=30, null=True, blank=True, verbose_name=_('SWIFT Number'))
1155
- account_type = models.CharField(choices=ACCOUNT_TYPE_CHOICES,
1156
- max_length=20,
1157
- default=ACCOUNT_CHECKING,
1158
- verbose_name=_('Account Type'))
1188
+ account_type = models.CharField(
1189
+ choices=ACCOUNT_TYPE_CHOICES,
1190
+ max_length=20,
1191
+ default=ACCOUNT_CHECKING,
1192
+ verbose_name=_('Account Type')
1193
+ )
1159
1194
 
1160
1195
  class Meta:
1161
1196
  abstract = True
1162
1197
 
1198
+ def get_account_last_digits(self, n=4) -> str:
1199
+ if not self.account_number:
1200
+ return 'Not Available'
1201
+ return f'*{self.account_number[-n:]}'
1202
+
1203
+ def get_routing_last_digits(self, n=4) -> str:
1204
+ if not self.routing_number:
1205
+ return 'Not Available'
1206
+ return f'*{self.routing_number[-n:]}'
1207
+
1208
+ def get_account_type_from_ofx(self, ofx_type):
1209
+ return self.ACCOUNT_TYPE_OFX_MAPPING.get(
1210
+ ofx_type, self.ACCOUNT_OTHER
1211
+ )
1212
+
1163
1213
 
1164
1214
  class TaxInfoMixIn(models.Model):
1165
1215
  tax_id_number = models.CharField(max_length=30,
@@ -136,7 +136,6 @@ class EntityUnitModelAbstract(MP_Node,
136
136
  hidden = models.BooleanField(default=False, verbose_name=_('Is Hidden'))
137
137
 
138
138
  objects = EntityUnitModelManager.from_queryset(queryset_class=EntityUnitModelQuerySet)()
139
- node_order_by = ['uuid']
140
139
 
141
140
  class Meta:
142
141
  abstract = True
@@ -32,7 +32,7 @@ class ImportJobModelViewBaseView(DjangoLedgerSecurityMixIn):
32
32
  'bank_account_model__entity_model',
33
33
  'bank_account_model__account_model',
34
34
  'bank_account_model__account_model__coa_model')
35
- return super().get_queryset()
35
+ return self.queryset
36
36
 
37
37
 
38
38
  class ImportJobModelCreateView(ImportJobModelViewBaseView, FormView):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: django-ledger
3
- Version: 0.7.7
3
+ Version: 0.7.9
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=sxYvIiNYS4E4veCLOanmxYxrLvKH2YzbJK3CrAtr06M,380
1
+ django_ledger/__init__.py,sha256=ihK8afW7Z89n0NPbEPgekMNY6Qt6R9NRQIXgrtHZ1SE,380
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
@@ -70,7 +70,7 @@ django_ledger/io/io_core.py,sha256=EmW0zu4P38OubxncBbnDdyAfM8X_epoxEc7iK-pApKA,8
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
73
- django_ledger/io/ofx.py,sha256=7QiceYFxekqvqWDlioeYKNCMACMXhFPl6au7yNQ7Kc8,2368
73
+ django_ledger/io/ofx.py,sha256=jx8xUuBK0O6Yj8uJdR7-Rgc1wsQ4bbkb8z9yi-n-nus,3415
74
74
  django_ledger/io/ratios.py,sha256=dsuCv9-r73SMLv3OrxeoT5JebfRmrDsRKG_YzHggWFw,3542
75
75
  django_ledger/io/roles.py,sha256=Rht4MiZ3SS1_uqNTQGt48dLHJxHYdyvw-HEaniUTXz4,20436
76
76
  django_ledger/management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -97,27 +97,28 @@ django_ledger/migrations/0018_transactionmodel_cleared_transactionmodel_reconcil
97
97
  django_ledger/migrations/0019_alter_transactionmodel_amount_and_more.py,sha256=FFfEOrsqbL_MLYbWgwCtZNcvCepTxN2x8vS5D7NpcLQ,1367
98
98
  django_ledger/migrations/0020_remove_bankaccountmodel_django_ledg_cash_ac_59a8af_idx_and_more.py,sha256=KFQExX3UVpeI9WlmRl2AZ9Q7k-24YBNf9ij4VU7tq_o,1741
99
99
  django_ledger/migrations/0021_alter_bankaccountmodel_account_model_and_more.py,sha256=b3eJA_QzNzvx7BPSaj2RCPIbsrCkZrpkvk_qN7v-4OA,1101
100
+ django_ledger/migrations/0022_bankaccountmodel_financial_institution_and_more.py,sha256=MR_E-DYIEsxSfhO5O4iBsShe-tyM3wYZQ4C4_6h1Prw,2959
100
101
  django_ledger/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
101
102
  django_ledger/models/__init__.py,sha256=OesBx4My9GnqU1xB5WXuuGLOnmzgxEJxI-WWxRxi658,807
102
- django_ledger/models/accounts.py,sha256=O4BYLGiTduA1fnKFVCo6_URVeQiXmTu2fAngchxBd6Y,36560
103
- django_ledger/models/bank_account.py,sha256=S0bhQ4MIakdraFTvxy_7Y8mmd9GN2Trg43UsfInhcQs,7777
103
+ django_ledger/models/accounts.py,sha256=LDbDLUiTkxy0k2Qyrq4N6FvpaffXW4vAuM53v5xveg0,36685
104
+ django_ledger/models/bank_account.py,sha256=dar6-iOqCBkeqyxwuV8tc2czFZVX9nGRSPvOLxp4m64,8009
104
105
  django_ledger/models/bill.py,sha256=LCuYvyOtkZ6H-tcV4AYN1GFe_C6s__QxEbR0IcfTak8,65000
105
106
  django_ledger/models/chart_of_accounts.py,sha256=cMHAc0TQdYD1iMan9qbrq2FX3NlmPYI_g1qwXPa4sSU,30308
106
107
  django_ledger/models/closing_entry.py,sha256=ILFNwxvCNvlEKuK2AL8z49izEBtfco-IT_oXcCMcbP8,18294
107
108
  django_ledger/models/coa_default.py,sha256=CK4vOZ73QePciZUL93wigDXpxKamdXAKBaQR7r-G7tk,27482
108
109
  django_ledger/models/customer.py,sha256=2v6E1Ri9v3yBPMS8wpnqbEdDeLD897DEfR6vSDf2lVY,11336
109
- django_ledger/models/data_import.py,sha256=uD2rdmguH6L8gTSltImFRZZ3vrBrmCEG-EWWdSJB0k8,47574
110
- django_ledger/models/entity.py,sha256=mC7SprHV9zJkMYbvU_rC9NcER_6xFQF-g-j8svz1Lwg,124708
110
+ django_ledger/models/data_import.py,sha256=nffhWbb-EQN3zmFtJ512ix5ExnlJDSNHieOxR4W6OSE,47802
111
+ django_ledger/models/entity.py,sha256=kiY-VX_ot727sF0VRlfxA7bOVE5aP-hFmDg6TX78msM,124687
111
112
  django_ledger/models/estimate.py,sha256=t3ZSBHZUUOdWP6eMCyQwNgvNSY4myKbkdfaFd9zlpH0,58056
112
113
  django_ledger/models/invoice.py,sha256=l1yI-kpePNNSp0MfwGeccdPLAmTmvVV4CquNIxMrmc4,63222
113
114
  django_ledger/models/items.py,sha256=cGv681aocJJxXSbsz9NlLhPp7kJ-gQrtxl7EcsiwULg,55087
114
115
  django_ledger/models/journal_entry.py,sha256=Hqfz7oNUBXt1Vprd5W1adrFmZzCebemc2cvQZTlKVrk,66993
115
116
  django_ledger/models/ledger.py,sha256=ltWmPIzauwxODO-FSupphIOkJYPDGT47-xKOst5DEvQ,26266
116
- django_ledger/models/mixins.py,sha256=NKBbtARYi9Z3sWuZajYNQB7Tsx4VEAN5cL-VaVZgoAU,52575
117
+ django_ledger/models/mixins.py,sha256=Y0uRYZAWUExpHdLZy30XQrmr2t05gMvOuDRKjkoauKk,54213
117
118
  django_ledger/models/purchase_order.py,sha256=A0fKA1lU12CYePb43T--wSNqf_d6Vwap1deyNXUoFEg,44140
118
119
  django_ledger/models/signals.py,sha256=3cm_8--Jz-Jb0fPgrVmm5xx_jKFARV6_A29VDjqHeIw,1563
119
120
  django_ledger/models/transactions.py,sha256=b_ChD6FG-ru7FgT7c9D_1ku1YyhCz840wSrnyVQN6AU,24045
120
- django_ledger/models/unit.py,sha256=cHybPxSI3PUr6aSRQZSFUEyj8e-rAdhyafekNOkYoew,8375
121
+ django_ledger/models/unit.py,sha256=2bH-Tg3OOz7bEcVdB66_CTUhxTY9YP78thwJL5HKC0k,8346
121
122
  django_ledger/models/utils.py,sha256=Weta2Cwsn4wRqvxMecIuD7aHYiiXBwUeMqpUDK4CokE,8360
122
123
  django_ledger/models/vendor.py,sha256=ha_sTc9BHY7RKk70n50eZ-EvqbKHbDObyf0_khhLWN8,11322
123
124
  django_ledger/models/schemas/__init__.py,sha256=8Tvw33tVJtCvxoXje2lrs9C1bsP_iuGcVi1JqzdPUao,157
@@ -391,7 +392,7 @@ django_ledger/views/bill.py,sha256=5tNb3pyh8GQM4hjV0FXqCXrEQF2LwpEWLkOkpknEdjA,2
391
392
  django_ledger/views/chart_of_accounts.py,sha256=wMdnXRNWzdPgxl1YeHbdAQXbCBU2VkmxVxxtUuk9NAQ,5485
392
393
  django_ledger/views/closing_entry.py,sha256=SbJMyBVG8KTfZ6oo4Gdzx03utKY5CoC7qioU_dm9n5I,8157
393
394
  django_ledger/views/customer.py,sha256=FYnwhRx6JXE4bsjXQqFp8b9H8a4m7zv6ohoSj1OkZD8,3678
394
- django_ledger/views/data_import.py,sha256=bRCCxfFJCzmthMkDcELDI_JfkgGjchTATrNnojv9p6c,8179
395
+ django_ledger/views/data_import.py,sha256=6xx7vIBk03a_KdxSn9s8gg61aYSP4VRbQCs5cqhLQb0,8170
395
396
  django_ledger/views/djl_api.py,sha256=6ADX9fBK8DroTeg8UIeCf2x4wt6-AF5xLlDQnqXBfsM,4411
396
397
  django_ledger/views/entity.py,sha256=1K_PswTQKuTwPIMJ-l0m3EM3u6Q1rvTnYUbSuku4UO4,9474
397
398
  django_ledger/views/estimate.py,sha256=NjcgiaBuwC_duCwvrAJkthZvPqSQoonH32T-f3DZlDM,12772
@@ -408,9 +409,9 @@ django_ledger/views/purchase_order.py,sha256=CyftKrQWV1SBz7W0CvZOfZ81OPEiBHPD7b9
408
409
  django_ledger/views/transactions.py,sha256=3ijtJzdLPFkqG7OYpe-7N4QVjCyR2yl5ht_9RyfquBA,212
409
410
  django_ledger/views/unit.py,sha256=CarmOKzXANssVD3qMS1oXvJw614Y3rS0QHhSGJC0jBE,10069
410
411
  django_ledger/views/vendor.py,sha256=7gtVK_bgnXxbVwNAHYtI_eNEJPefCz807LgE1vqOov8,3532
411
- django_ledger-0.7.7.dist-info/AUTHORS.md,sha256=ShPwf-qniJkbjRzX5_lqhmgoLMEYMSHSwKPXHZtWmyk,824
412
- django_ledger-0.7.7.dist-info/LICENSE,sha256=ixuiBLtpoK3iv89l7ylKkg9rs2GzF9ukPH7ynZYzK5s,35148
413
- django_ledger-0.7.7.dist-info/METADATA,sha256=HUOt5ZtIVCZvGiv1XeLcl9McPh8JJFMHKfO-x8tRnn4,9089
414
- django_ledger-0.7.7.dist-info/WHEEL,sha256=nn6H5-ilmfVryoAQl3ZQ2l8SH5imPWFpm1A5FgEuFV4,91
415
- django_ledger-0.7.7.dist-info/top_level.txt,sha256=fmHWehb2HfoDncQ3eQtYzeYc-gJMywf6q_ZpKBjwzoQ,38
416
- django_ledger-0.7.7.dist-info/RECORD,,
412
+ django_ledger-0.7.9.dist-info/AUTHORS.md,sha256=ShPwf-qniJkbjRzX5_lqhmgoLMEYMSHSwKPXHZtWmyk,824
413
+ django_ledger-0.7.9.dist-info/LICENSE,sha256=ixuiBLtpoK3iv89l7ylKkg9rs2GzF9ukPH7ynZYzK5s,35148
414
+ django_ledger-0.7.9.dist-info/METADATA,sha256=Jm46VjpBOjXbwS4omyYP6DCXLXfphxas_poWHhpqLKk,9089
415
+ django_ledger-0.7.9.dist-info/WHEEL,sha256=nn6H5-ilmfVryoAQl3ZQ2l8SH5imPWFpm1A5FgEuFV4,91
416
+ django_ledger-0.7.9.dist-info/top_level.txt,sha256=fmHWehb2HfoDncQ3eQtYzeYc-gJMywf6q_ZpKBjwzoQ,38
417
+ django_ledger-0.7.9.dist-info/RECORD,,