django-ledger 0.7.6.1__py3-none-any.whl → 0.7.8__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 (25) hide show
  1. django_ledger/__init__.py +1 -1
  2. django_ledger/io/io_core.py +4 -0
  3. django_ledger/io/ofx.py +25 -0
  4. django_ledger/migrations/0022_bankaccountmodel_financial_institution_and_more.py +52 -0
  5. django_ledger/models/accounts.py +5 -1
  6. django_ledger/models/bank_account.py +13 -4
  7. django_ledger/models/entity.py +1 -1
  8. django_ledger/models/mixins.py +58 -8
  9. django_ledger/templates/django_ledger/account/account_list.html +1 -1
  10. django_ledger/templates/django_ledger/account/tags/account_txs_table.html +4 -4
  11. django_ledger/templates/django_ledger/account/tags/accounts_table.html +7 -11
  12. django_ledger/templates/django_ledger/bills/bill_update.html +6 -6
  13. django_ledger/templates/django_ledger/data_import/tags/data_import_job_txs_imported.html +2 -1
  14. django_ledger/templates/django_ledger/invoice/invoice_update.html +6 -6
  15. django_ledger/templates/django_ledger/invoice/tags/invoice_table.html +2 -2
  16. django_ledger/templates/django_ledger/journal_entry/tags/je_txs_table.html +4 -4
  17. django_ledger/templates/django_ledger/transactions/tags/txs_table.html +4 -4
  18. django_ledger/views/account.py +9 -0
  19. django_ledger/views/data_import.py +1 -1
  20. {django_ledger-0.7.6.1.dist-info → django_ledger-0.7.8.dist-info}/METADATA +4 -1
  21. {django_ledger-0.7.6.1.dist-info → django_ledger-0.7.8.dist-info}/RECORD +25 -24
  22. {django_ledger-0.7.6.1.dist-info → django_ledger-0.7.8.dist-info}/AUTHORS.md +0 -0
  23. {django_ledger-0.7.6.1.dist-info → django_ledger-0.7.8.dist-info}/LICENSE +0 -0
  24. {django_ledger-0.7.6.1.dist-info → django_ledger-0.7.8.dist-info}/WHEEL +0 -0
  25. {django_ledger-0.7.6.1.dist-info → django_ledger-0.7.8.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.6.1'
9
+ __version__ = '0.7.8'
10
10
  __license__ = 'GPLv3 License'
11
11
 
12
12
  __author__ = 'Miguel Sanda'
@@ -1442,6 +1442,10 @@ class IODatabaseMixIn:
1442
1442
  ]
1443
1443
 
1444
1444
  for tx, txm_kwargs in txs_models:
1445
+ if not getattr(tx, 'ledger_id', None):
1446
+ tx.ledger_id = je_model.ledger_id
1447
+ if not getattr(tx, 'timestamp', None):
1448
+ tx.timestamp = je_model.timestamp
1445
1449
  staged_tx_model = txm_kwargs.get('staged_tx_model')
1446
1450
  if staged_tx_model:
1447
1451
  staged_tx_model.transaction_model = tx
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.
@@ -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
 
@@ -2048,7 +2048,7 @@ class EntityModelAbstract(MP_Node,
2048
2048
  account_model_qs = self.get_coa_accounts(coa_model=coa_model, active=True)
2049
2049
  account_model_qs = account_model_qs.with_roles(
2050
2050
  roles=[
2051
- BankAccountModel.ACCOUNT_TYPE_ROLE_MAPPING[account_type]
2051
+ BankAccountModel.ACCOUNT_TYPE_DEFAULT_ROLE_MAPPING[account_type]
2052
2052
  ]
2053
2053
  ).is_role_default()
2054
2054
 
@@ -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,
@@ -7,7 +7,7 @@
7
7
  <div class="box">
8
8
  <div class="columns is-multiline">
9
9
  <div class="column is-12 has-text-centered">
10
- <h1 class="is-size-3">{% trans 'Accounts List' %}</h1>
10
+ <h1 class="is-size-3">{% trans 'CoA Account List' %}</h1>
11
11
  <h2 class="is-size-1 has-text-info">{{ coa_model.name }}</h2>
12
12
  <p class="is-italic has-text-danger">({{ coa_model.slug }})</p>
13
13
  </div>
@@ -16,8 +16,8 @@
16
16
  <tr class="has-text-centered">
17
17
  <td>{{ tx.journal_entry.je_number }}</td>
18
18
  <td>{{ tx.journal_entry.timestamp }}</td>
19
- <td>{% if tx.tx_type == 'credit' %}${{ tx.amount | currency_format }}{% endif %}</td>
20
- <td>{% if tx.tx_type == 'debit' %}${{ tx.amount | currency_format }}{% endif %}</td>
19
+ <td>{% if tx.tx_type == 'credit' %}{% currency_symbol %}{{ tx.amount | currency_format }}{% endif %}</td>
20
+ <td>{% if tx.tx_type == 'debit' %}{% currency_symbol %}{{ tx.amount | currency_format }}{% endif %}</td>
21
21
  <td>{{ tx.description }}</td>
22
22
  <td>{{ tx.journal_entry.entity_unit.name }}</td>
23
23
  <td>
@@ -51,8 +51,8 @@
51
51
  <tr class="has-text-weight-bold">
52
52
  <td></td>
53
53
  <td class="has-text-right">Total</td>
54
- <td class="has-text-centered">${{ total_credits | currency_format }}</td>
55
- <td class="has-text-centered">${{ total_debits | currency_format }}</td>
54
+ <td class="has-text-centered">{% currency_symbol %}{{ total_credits | currency_format }}</td>
55
+ <td class="has-text-centered">{% currency_symbol %}{{ total_debits | currency_format }}</td>
56
56
  <td></td>
57
57
  <td></td>
58
58
  <td></td>
@@ -51,11 +51,11 @@
51
51
  <td>{{ account.get_balance_type_display }}</td>
52
52
  <td class="has-text-centered">
53
53
  {% if account.is_active %}
54
- <span class="icon has-text-success-dark">
54
+ <span class="icon has-text-success">
55
55
  {% icon 'ant-design:check-circle-filled' 24 %}
56
56
  </span>
57
57
  {% else %}
58
- <span class="icon has-text-danger-dark">
58
+ <span class="icon has-text-danger">
59
59
  {% icon 'mdi:dangerous' 24 %}
60
60
  </span>
61
61
  {% endif %}
@@ -63,11 +63,11 @@
63
63
 
64
64
  <td class="has-text-centered">
65
65
  {% if account.is_locked %}
66
- <span class="icon has-text-success-dark">
66
+ <span class="icon has-text-success">
67
67
  {% icon 'ooui:lock' 24 %}
68
68
  </span>
69
69
  {% else %}
70
- <span class="icon has-text-danger-dark">
70
+ <span class="icon has-text-danger">
71
71
  {% icon 'ooui:un-lock' 24 %}
72
72
  </span>
73
73
  {% endif %}
@@ -75,13 +75,9 @@
75
75
 
76
76
  <td class="has-text-centered">
77
77
  {% if account.role_default %}
78
- <span class="icon has-text-success-dark">
79
- {% icon 'ant-design:check-circle-filled' 24 %}
80
- </span>
81
- {% elif not account.role_default %}
82
- <span class="icon has-text-danger-dark">
83
- {% icon 'mdi:dangerous' 24 %}
84
- </span>
78
+ <span class="icon has-text-success">
79
+ {% icon 'ant-design:check-circle-filled' 24 %}
80
+ </span>
85
81
  {% endif %}
86
82
  </td>
87
83
  <td>
@@ -43,20 +43,20 @@
43
43
  <div class="column is-12">
44
44
  <h3 class="is-size-3">{% trans 'Bill State' %}</h3>
45
45
  <p>{{ bill_model.cash_account }}:
46
- ${{ bill_model.get_amount_cash | currency_format }}</p>
46
+ {% currency_symbol %}{{ bill_model.get_amount_cash | currency_format }}</p>
47
47
  <p>{{ bill_model.prepaid_account }}:
48
- ${{ bill_model.get_amount_prepaid | currency_format }}</p>
48
+ {% currency_symbol %}{{ bill_model.get_amount_prepaid | currency_format }}</p>
49
49
  <p>{{ bill_model.unearned_account }}:
50
- ${{ bill_model.get_amount_unearned | currency_format }}</p>
50
+ {% currency_symbol %}{{ bill_model.get_amount_unearned | currency_format }}</p>
51
51
  </div>
52
52
  <div class="column is-12">
53
53
  <h3 class="is-size-3">{% trans 'Ledger State' %}</h3>
54
54
  <p>{{ bill_model.cash_account }}:
55
- ${{ bill_model.amount_paid | currency_format }}</p>
55
+ {% currency_symbol %}{{ bill_model.amount_paid | currency_format }}</p>
56
56
  <p>{{ bill_model.prepaid_account }}:
57
- ${{ bill_model.amount_receivable | currency_format }}</p>
57
+ {% currency_symbol %}{{ bill_model.amount_receivable | currency_format }}</p>
58
58
  <p>{{ bill_model.unearned_account }}:
59
- ${{ bill_model.amount_unearned | currency_format }}</p>
59
+ {% currency_symbol %}{{ bill_model.amount_unearned | currency_format }}</p>
60
60
  </div>
61
61
  {% now "Y" as current_year %}
62
62
  {% now "m" as current_month %}
@@ -1,4 +1,5 @@
1
1
  {% load i18n %}
2
+ {% load django_ledger %}
2
3
 
3
4
  <div class="table-container">
4
5
  <table class="table is-narrow is-fullwidth is-bordered django-ledger-table-bottom-margin-75">
@@ -20,7 +21,7 @@
20
21
  <td>{{ imported_tx.date_posted }}</td>
21
22
  <td>{{ imported_tx.name }}</td>
22
23
  <td class="{% if imported_tx.get_amount < 0.00 %}has-text-danger{% endif %} has-text-centered">
23
- ${{ imported_tx.get_amount }}</td>
24
+ {% currency_symbol %}{{ imported_tx.get_amount }}</td>
24
25
  <td>{% if imported_tx.activity %}
25
26
  {{ imported_tx.get_activity_display }}
26
27
  {% endif %}</td>
@@ -42,20 +42,20 @@
42
42
  <div class="column is-12">
43
43
  <h3 class="is-size-3">{% trans 'Invoice State' %}</h3>
44
44
  <p>{{ invoice.cash_account }}:
45
- ${{ invoice.get_amount_cash | currency_format }}</p>
45
+ {% currency_symbol %}{{ invoice.get_amount_cash | currency_format }}</p>
46
46
  <p>{{ invoice.prepaid_account }}:
47
- ${{ invoice.get_amount_prepaid | currency_format }}</p>
47
+ {% currency_symbol %}{{ invoice.get_amount_prepaid | currency_format }}</p>
48
48
  <p>{{ invoice.unearned_account }}:
49
- ${{ invoice.get_amount_unearned | currency_format }}</p>
49
+ {% currency_symbol %}{{ invoice.get_amount_unearned | currency_format }}</p>
50
50
  </div>
51
51
  <div class="column is-12">
52
52
  <h3 class="is-size-3">{% trans 'Ledger State' %}</h3>
53
53
  <p>{{ invoice.cash_account }}:
54
- ${{ invoice.amount_paid | currency_format }}</p>
54
+ {% currency_symbol %}{{ invoice.amount_paid | currency_format }}</p>
55
55
  <p>{{ invoice.prepaid_account }}:
56
- ${{ invoice.amount_receivable | currency_format }}</p>
56
+ {% currency_symbol %}{{ invoice.amount_receivable | currency_format }}</p>
57
57
  <p>{{ invoice.unearned_account }}:
58
- ${{ invoice.amount_unearned | currency_format }}</p>
58
+ {% currency_symbol %}{{ invoice.amount_unearned | currency_format }}</p>
59
59
  </div>
60
60
  {% now "Y" as current_year %}
61
61
  {% now "m" as current_month %}
@@ -22,8 +22,8 @@
22
22
  <td>{{ invoice.get_status_action_date }}</td>
23
23
  <td>{{ invoice.get_invoice_status_display }}</td>
24
24
  <td>{{ invoice.customer.customer_name }}</td>
25
- <td>${{ invoice.amount_due | currency_format }}</td>
26
- <td>${{ invoice.amount_paid | currency_format }}</td>
25
+ <td>{% currency_symbol %}{{ invoice.amount_due | currency_format }}</td>
26
+ <td>{% currency_symbol %}{{ invoice.amount_paid | currency_format }}</td>
27
27
  <td>
28
28
  {% if invoice.is_past_due %}
29
29
  <span class="icon is-small has-text-danger">{% icon 'bi:check-circle-fill' 24 %}</span>
@@ -20,9 +20,9 @@
20
20
  <td>{{ transaction_model.account_name }}</td>
21
21
  <td>{% if transaction_model.entity_unit_name %}
22
22
  {{ transaction_model.entity_unit_name }}{% endif %}</td>
23
- <td>{% if transaction_model.is_credit %}$
23
+ <td>{% if transaction_model.is_credit %}{% currency_symbol %}
24
24
  {{ transaction_model.amount | currency_format }}{% endif %}</td>
25
- <td>{% if transaction_model.is_debit %}$
25
+ <td>{% if transaction_model.is_debit %}{% currency_symbol %}
26
26
  {{ transaction_model.amount | currency_format }}{% endif %}</td>
27
27
  <td>{% if transaction_model.description %}{{ transaction_model.description }}{% endif %}</td>
28
28
  </tr>
@@ -52,8 +52,8 @@
52
52
  <tr>
53
53
  <td>{{ transaction_model.account_code }}</td>
54
54
  <td>{{ transaction_model.account_name }}</td>
55
- <td>{% if transaction_model.is_credit %}${{ transaction_model.amount | currency_format }}{% endif %}</td>
56
- <td>{% if transaction_model.is_debit %}${{ transaction_model.amount | currency_format }}{% endif %}</td>
55
+ <td>{% if transaction_model.is_credit %}{% currency_symbol %}{{ transaction_model.amount | currency_format }}{% endif %}</td>
56
+ <td>{% if transaction_model.is_debit %}{% currency_symbol %}{{ transaction_model.amount | currency_format }}{% endif %}</td>
57
57
  <td>{% if transaction_model.description %}{{ transaction_model.description }}{% endif %}</td>
58
58
  </tr>
59
59
  {% endfor %}
@@ -20,9 +20,9 @@
20
20
  <td>{{ transaction_model.account_name }}</td>
21
21
  <td>{% if transaction_model.entity_unit_name %}
22
22
  {{ transaction_model.entity_unit_name }}{% endif %}</td>
23
- <td>{% if transaction_model.is_credit %}$
23
+ <td>{% if transaction_model.is_credit %}{% currency_symbol %}
24
24
  {{ transaction_model.amount | currency_format }}{% endif %}</td>
25
- <td>{% if transaction_model.is_debit %}$
25
+ <td>{% if transaction_model.is_debit %}{% currency_symbol %}
26
26
  {{ transaction_model.amount | currency_format }}{% endif %}</td>
27
27
  <td>{% if transaction_model.description %}{{ transaction_model.description }}{% endif %}</td>
28
28
  </tr>
@@ -52,8 +52,8 @@
52
52
  <tr>
53
53
  <td>{{ transaction_model.account_code }}</td>
54
54
  <td>{{ transaction_model.account_name }}</td>
55
- <td>{% if transaction_model.is_credit %}${{ transaction_model.amount | currency_format }}{% endif %}</td>
56
- <td>{% if transaction_model.is_debit %}${{ transaction_model.amount | currency_format }}{% endif %}</td>
55
+ <td>{% if transaction_model.is_credit %}{% currency_symbol %}{{ transaction_model.amount | currency_format }}{% endif %}</td>
56
+ <td>{% if transaction_model.is_debit %}{% currency_symbol %}{{ transaction_model.amount | currency_format }}{% endif %}</td>
57
57
  <td>{% if transaction_model.description %}{{ transaction_model.description }}{% endif %}</td>
58
58
  </tr>
59
59
  {% endfor %}
@@ -76,6 +76,15 @@ class AccountModelListView(BaseAccountModelBaseView, ListView):
76
76
  }
77
77
  active_only = False
78
78
 
79
+ def get_context_data(self, **kwargs):
80
+ context = super().get_context_data(**kwargs)
81
+ coa_model: ChartOfAccountModel = self.get_coa_model()
82
+ context['page_title'] = f'{coa_model.name} Accounts'
83
+ context['header_title'] = f'{coa_model.name} Accounts'
84
+ context['header_subtitle'] = self.get_authorized_entity_instance_name()
85
+ context['header_subtitle_icon'] = 'ic:twotone-account-tree'
86
+ return context
87
+
79
88
  def get_queryset(self):
80
89
  qs = super().get_queryset()
81
90
  if self.active_only:
@@ -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.6.1
3
+ Version: 0.7.8
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>
@@ -72,6 +72,9 @@ Created and developed by [Miguel Sanda](https://www.miguelsanda.com).
72
72
 
73
73
  ## Getting Involved
74
74
 
75
+ All pull requests are welcome, as long as they address bugfixes, enhancements, new ideas, or add value to the project in any shape or form.
76
+ Please refrain from submitting pull requests that focus solely on code linting, refactoring, or similar cosmetic changes.
77
+
75
78
  - **Feature Requests/Bug Reports**: Open an issue in the repository
76
79
  - **For software customization, advanced features and consulting services**:
77
80
  [Contact us](https://www.miguelsanda.com/work-with-me/) or email msanda@arrobalytics.com
@@ -1,4 +1,4 @@
1
- django_ledger/__init__.py,sha256=MUwO2Divbce4snfcTQcqtZJZf6TMKSgX18eqO5JDspA,382
1
+ django_ledger/__init__.py,sha256=_0nLBqiSX__10m2Qlwh2CoT5GsoaxA7in0KLao_dNss,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
@@ -66,11 +66,11 @@ django_ledger/forms/utils.py,sha256=sgkwBZs15_rZ5NT7h-8Z7wi3-ItM1E1sqoVDo3NQ5Jc,
66
66
  django_ledger/forms/vendor.py,sha256=Nuh8MmSpz4ycMZwiVe--U9Ec6ezIsfACHDkhA2SyiZ4,2215
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=qG6ZDbdJw5OzADNR37zeLbhG7wAKWLpRBDfSkm0hv6k,87133
69
+ django_ledger/io/io_core.py,sha256=EmW0zu4P38OubxncBbnDdyAfM8X_epoxEc7iK-pApKA,87335
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,23 +97,24 @@ 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=7WzWcCmoTG49-UJl6dCWXNr1wZYYL-AZ2Jr5clnoAPw,36714
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
110
  django_ledger/models/data_import.py,sha256=uD2rdmguH6L8gTSltImFRZZ3vrBrmCEG-EWWdSJB0k8,47574
110
- django_ledger/models/entity.py,sha256=mC7SprHV9zJkMYbvU_rC9NcER_6xFQF-g-j8svz1Lwg,124708
111
+ django_ledger/models/entity.py,sha256=xAqQpmBxpdTPqxav2WBR0ZRJO6SXHDYMiu1gHDkoUT8,124716
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
@@ -187,10 +188,10 @@ django_ledger/static/django_ledger/logo_2/djl-txt-horiz@3x.png,sha256=5YgNwxCiCB
187
188
  django_ledger/templates/django_ledger/account/account_create.html,sha256=EeU4mxRw9YVE_ugXGF_cPfJvJ1CJsmIRGr1mXfxfwFI,1152
188
189
  django_ledger/templates/django_ledger/account/account_create_child.html,sha256=i1tBc-N44D2mKnm61nrI11pXxo2STF1ezV9fVckB_qY,1089
189
190
  django_ledger/templates/django_ledger/account/account_detail.html,sha256=m-UTWD9YqoM9JWKug4alY4DIql13jYFrJG2BmdYSZ7s,934
190
- django_ledger/templates/django_ledger/account/account_list.html,sha256=0kDNrzcMgMewiBQGqjkPCUHErmOiVz6uy1FnwzclMjc,1019
191
+ django_ledger/templates/django_ledger/account/account_list.html,sha256=gVWwvmSUtIaiDN2CpfCDuyre17UZgMPfNyxEnKb1D5I,1022
191
192
  django_ledger/templates/django_ledger/account/account_update.html,sha256=FzNFcARbhZUUTTi6Sv-PQJi7XzjLsOfrUnR7lIvIlhc,1113
192
- django_ledger/templates/django_ledger/account/tags/account_txs_table.html,sha256=CNl3i5jp_7UPNV2bm60MN5w2SRGph-w_3PgzBzZpUxI,3483
193
- django_ledger/templates/django_ledger/account/tags/accounts_table.html,sha256=zJEUvMBre-wK563ThpoOpxSfgzhV1qn_3khLLWeiWrM,7520
193
+ django_ledger/templates/django_ledger/account/tags/account_txs_table.html,sha256=dbqMmFP7xzwsPGjva9APoU9wuZKs_TXIRYZaz7DP7DA,3563
194
+ django_ledger/templates/django_ledger/account/tags/accounts_table.html,sha256=58GiazOeJuG-z26-K-FmFoIkewx115_91ok7YLpK6t8,7236
194
195
  django_ledger/templates/django_ledger/auth/login.html,sha256=UYV2rxjEn9cXBbG6Ww93k6yMPJtOo5vpX6sod61ewKs,1849
195
196
  django_ledger/templates/django_ledger/bank_account/bank_account_create.html,sha256=zoCvV-_2aBAXCnCfHTFI18Pn7hbEcOkgtcgYOQ2IJIg,1258
196
197
  django_ledger/templates/django_ledger/bank_account/bank_account_list.html,sha256=FuwnbPZ8J6paQw02ddSYEpKUy97SKP-00mFDPMghgJI,701
@@ -200,7 +201,7 @@ django_ledger/templates/django_ledger/bills/bill_create.html,sha256=fUskaN-ORsj_
200
201
  django_ledger/templates/django_ledger/bills/bill_delete.html,sha256=IHqXETgrbmMWnrymJv7iAAcDcBvRV9tFgoqHWAUKlQE,1606
201
202
  django_ledger/templates/django_ledger/bills/bill_detail.html,sha256=FvssQo6Y_3jQXxieCFaXySSGch4IbUDo5ONUjFB8HFw,11760
202
203
  django_ledger/templates/django_ledger/bills/bill_list.html,sha256=-KAmz0bghVZ81DMzFbqaeu_93XmuuMEI6REtYc_P0PE,6336
203
- django_ledger/templates/django_ledger/bills/bill_update.html,sha256=Sluzm-Dgcr1S9QgT_ermkT-P6UyQ1AR7meL33kSa3RM,8638
204
+ django_ledger/templates/django_ledger/bills/bill_update.html,sha256=mghbdN_8UWfp_5Mf86e8TpYfrEcLd8I2V1biZSaZlXo,8758
204
205
  django_ledger/templates/django_ledger/bills/bill_void.html,sha256=iQt9Nq1DL-LovkrMrvUwI87LO8jXZ3R0dL7YKPoZKDM,1354
205
206
  django_ledger/templates/django_ledger/bills/includes/card_bill.html,sha256=7bUT7Sx7oFHAs9ko1x3wBBhrOZnTAmrGR55S1vksm8g,14029
206
207
  django_ledger/templates/django_ledger/bills/tags/bill_item_formset.html,sha256=tmBNZoaHhk6EsCtcdqAQdHJ0XyDFaFRYqxdCf2Xi5KU,4082
@@ -240,7 +241,7 @@ django_ledger/templates/django_ledger/data_import/import_job_create.html,sha256=
240
241
  django_ledger/templates/django_ledger/data_import/import_job_delete.html,sha256=qgobtrI-WNYFqhn8de05mcD-FQ0UGSLT6ZoaBlblXAU,944
241
242
  django_ledger/templates/django_ledger/data_import/import_job_update.html,sha256=ZDy391RSOXUq3keUs48QrVrI_ZicdNvDeLT_JacH17M,887
242
243
  django_ledger/templates/django_ledger/data_import/tags/data_import_job_list_table.html,sha256=y_U1xixMC9YPR4aq6F_cNpyb-dZ5qcVh9D6HSN9Xpps,2919
243
- django_ledger/templates/django_ledger/data_import/tags/data_import_job_txs_imported.html,sha256=84jIGQG5s_mC8vEYfHu3I1fCkd_wslJ2ScwDO20FENM,1641
244
+ django_ledger/templates/django_ledger/data_import/tags/data_import_job_txs_imported.html,sha256=LzrDDF_SIsVCH3VwU2c0bu_-YclFIap9F_6rtTVdW-s,1686
244
245
  django_ledger/templates/django_ledger/data_import/tags/data_import_job_txs_table.html,sha256=z0wTLneFb9BqYohhD2W6loRc9VpAmuFO93Gy2sFMyPo,3916
245
246
  django_ledger/templates/django_ledger/entity/entitiy_list.html,sha256=onM9uaWTm2oQ00OPIH5ki2FEfgjx7_EIOT8akuAhQM4,1507
246
247
  django_ledger/templates/django_ledger/entity/entity_create.html,sha256=TDayIv2qno7cT3xTCapKV6EZKcTTNfIMxXJFQmHHyz0,1387
@@ -287,10 +288,10 @@ django_ledger/templates/django_ledger/invoice/invoice_create.html,sha256=p6I2SF-
287
288
  django_ledger/templates/django_ledger/invoice/invoice_delete.html,sha256=qkhsW6lPiA4BxbWzHgncN8A6p8EU7MjjFyXZnQa1tF0,1482
288
289
  django_ledger/templates/django_ledger/invoice/invoice_detail.html,sha256=Z2iNxBY5hEJ6qz7pkqxakPFoYlCchv_h4N7cBjWv8sU,10690
289
290
  django_ledger/templates/django_ledger/invoice/invoice_list.html,sha256=b5ysuDP-avrls4OSarSusySAKDFT1sM-jkQgWPPxpNw,5888
290
- django_ledger/templates/django_ledger/invoice/invoice_update.html,sha256=cVuth_WbELKi3RWDrIKLcfDAe0RH3OV8N5AireHK298,8640
291
+ django_ledger/templates/django_ledger/invoice/invoice_update.html,sha256=ygyFOpz5o3Q0j5CHEFI0t_7xBR6AG7990ne9QM3C7aQ,8760
291
292
  django_ledger/templates/django_ledger/invoice/includes/card_invoice.html,sha256=MwHTCGqTWTyzIICuyfR173tIu9k8I0IdYHtGsKtZAs8,12749
292
293
  django_ledger/templates/django_ledger/invoice/tags/invoice_item_formset.html,sha256=ba4J_WINrpYmCaHAyKWDKwZ6ETQXI3NkQ_AV6Y5-2uM,3413
293
- django_ledger/templates/django_ledger/invoice/tags/invoice_table.html,sha256=fO1EKOAg26LxIztnfbT41I8N_wyIga-tGsCQ9tBoS5A,2596
294
+ django_ledger/templates/django_ledger/invoice/tags/invoice_table.html,sha256=6FZYwBmL3BDKBQ2dk4M3LaQLUWM4nWMJlpfDs344aiI,2636
294
295
  django_ledger/templates/django_ledger/journal_entry/je_create.html,sha256=VHMBnJ_ovi9ovuUyBqJr5-wfFRP9-sHnnzN6t1Cue1w,930
295
296
  django_ledger/templates/django_ledger/journal_entry/je_delete.html,sha256=WcVhR16oCsL8eOEyL3g3NPLgkvl2CdBpOkHo5-N5zz4,949
296
297
  django_ledger/templates/django_ledger/journal_entry/je_detail.html,sha256=Lr9IdchYJ5rtJhJSXKzeUX3WQrR6yQPj1ao8KTkT6t0,1999
@@ -299,7 +300,7 @@ django_ledger/templates/django_ledger/journal_entry/je_list.html,sha256=blJNSwcr
299
300
  django_ledger/templates/django_ledger/journal_entry/je_update.html,sha256=XXxhA31Ltivxkqqa40z9IWh1JeLjWk9NNrp32t7Ee7U,712
300
301
  django_ledger/templates/django_ledger/journal_entry/includes/card_journal_entry.html,sha256=PU-tOMBuQcwxP73uXyNePaCF8aY0KutWuuAdYUWJofw,2547
301
302
  django_ledger/templates/django_ledger/journal_entry/tags/je_table.html,sha256=IQyHXHA3goBjdGM0Hzih46Z82JVhMGPpCRgMVCNGmaA,5747
302
- django_ledger/templates/django_ledger/journal_entry/tags/je_txs_table.html,sha256=6gqASIlyKmeTgV-0Lp_DVB7SGLcL1y_U8cpR4sJFLyU,3366
303
+ django_ledger/templates/django_ledger/journal_entry/tags/je_txs_table.html,sha256=VN217o-bGEjQ2DHDMhzWOcFMe4EGAu0p3qhc3Dv9X-Y,3446
303
304
  django_ledger/templates/django_ledger/layouts/base.html,sha256=_M49Ivw6TKU4dFjESTBd7vcc1kqXLWbDgcBnHUy_5Z4,1910
304
305
  django_ledger/templates/django_ledger/layouts/content_layout_1.html,sha256=U-32AnGwhIOGHtSTlSst580OwrUBIoDIt93_xZRtOTw,936
305
306
  django_ledger/templates/django_ledger/layouts/content_layout_2.html,sha256=gqXgaGj3ByTI7EziEw0Wo-XBPZEB82selzrXDuCNz_Y,355
@@ -327,7 +328,7 @@ django_ledger/templates/django_ledger/service/service_delete.html,sha256=9h8fR5c
327
328
  django_ledger/templates/django_ledger/service/service_list.html,sha256=NO6f4zmOnAmjrHd-lsYDksKJtVuoeXYC6s2g1MUibOs,854
328
329
  django_ledger/templates/django_ledger/service/service_update.html,sha256=IceH87Na-xxg1p-V5VdR93aHO0_VaBDXkx1U5ev8qcs,1440
329
330
  django_ledger/templates/django_ledger/service/tags/services_table.html,sha256=pP4K0KvFfmZ9BESrMcNnTv-faFovCHYBhhn_PcXAurM,2434
330
- django_ledger/templates/django_ledger/transactions/tags/txs_table.html,sha256=6gqASIlyKmeTgV-0Lp_DVB7SGLcL1y_U8cpR4sJFLyU,3366
331
+ django_ledger/templates/django_ledger/transactions/tags/txs_table.html,sha256=VN217o-bGEjQ2DHDMhzWOcFMe4EGAu0p3qhc3Dv9X-Y,3446
331
332
  django_ledger/templates/django_ledger/unit/unit_create.html,sha256=7dmsu0TUxsexJyxKCz3cICddN0DGGjQOTM89ddQm9r8,1194
332
333
  django_ledger/templates/django_ledger/unit/unit_detail.html,sha256=wttq1WzsNxa5ZIrblpPmw5zl2xuyOjSCyxtqGHJimUA,1709
333
334
  django_ledger/templates/django_ledger/unit/unit_list.html,sha256=n_XWrs2zvSafGzJnFzgwMTaMFfMsY-MRld8JtxIJ1Ug,1973
@@ -384,14 +385,14 @@ django_ledger/urls/transactions.py,sha256=e_x_z5qbkR6i7o8OWWdXshDiY_WVmu9WVhR9A9
384
385
  django_ledger/urls/unit.py,sha256=QEVKrgcw2dqMaaXsUHfqYecTa5-iaPlS9smrYJ1QsgM,1506
385
386
  django_ledger/urls/vendor.py,sha256=ODHpAwe5lomluj8ZCqbMtugTeeRsv0Yo9SqkZEmfYaw,393
386
387
  django_ledger/views/__init__.py,sha256=fY9eBoPkx50p-kSalskd4QW1tHm3e64WpwOFuJzn4Xo,1178
387
- django_ledger/views/account.py,sha256=mxFmBu9RsFfd_lQK1JJevmAVHMEW4SBeAJ0prZNK57E,9083
388
+ django_ledger/views/account.py,sha256=fC0PX889DxyKheTF3SIA_aDxermQu8hPhrw5JBwpwS0,9536
388
389
  django_ledger/views/auth.py,sha256=I8Mv_aAfW-8Z5VYPOX7P3IUO4Fp5jJPkSuu1ZSVpWtI,777
389
390
  django_ledger/views/bank_account.py,sha256=MbiVurJTNK-UsDPn17-ai4G8sE3qIMrdmXaWPX-J8n8,5025
390
391
  django_ledger/views/bill.py,sha256=5tNb3pyh8GQM4hjV0FXqCXrEQF2LwpEWLkOkpknEdjA,22239
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.6.1.dist-info/AUTHORS.md,sha256=ShPwf-qniJkbjRzX5_lqhmgoLMEYMSHSwKPXHZtWmyk,824
412
- django_ledger-0.7.6.1.dist-info/LICENSE,sha256=ixuiBLtpoK3iv89l7ylKkg9rs2GzF9ukPH7ynZYzK5s,35148
413
- django_ledger-0.7.6.1.dist-info/METADATA,sha256=GiA6lMs26nLY1WXdJZUtOn6W12O7NnTuoF8i4fZzFy4,8828
414
- django_ledger-0.7.6.1.dist-info/WHEEL,sha256=nn6H5-ilmfVryoAQl3ZQ2l8SH5imPWFpm1A5FgEuFV4,91
415
- django_ledger-0.7.6.1.dist-info/top_level.txt,sha256=fmHWehb2HfoDncQ3eQtYzeYc-gJMywf6q_ZpKBjwzoQ,38
416
- django_ledger-0.7.6.1.dist-info/RECORD,,
412
+ django_ledger-0.7.8.dist-info/AUTHORS.md,sha256=ShPwf-qniJkbjRzX5_lqhmgoLMEYMSHSwKPXHZtWmyk,824
413
+ django_ledger-0.7.8.dist-info/LICENSE,sha256=ixuiBLtpoK3iv89l7ylKkg9rs2GzF9ukPH7ynZYzK5s,35148
414
+ django_ledger-0.7.8.dist-info/METADATA,sha256=usMkzL01GHVX7RKT9LpSncsp5VqLAlByuM4woCG-Wr4,9089
415
+ django_ledger-0.7.8.dist-info/WHEEL,sha256=nn6H5-ilmfVryoAQl3ZQ2l8SH5imPWFpm1A5FgEuFV4,91
416
+ django_ledger-0.7.8.dist-info/top_level.txt,sha256=fmHWehb2HfoDncQ3eQtYzeYc-gJMywf6q_ZpKBjwzoQ,38
417
+ django_ledger-0.7.8.dist-info/RECORD,,