django-ledger 0.5.6.4__py3-none-any.whl → 0.5.6.5__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
@@ -9,7 +9,7 @@ Contributions to this module:
9
9
  default_app_config = 'django_ledger.apps.DjangoLedgerConfig'
10
10
 
11
11
  """Django Ledger"""
12
- __version__ = '0.5.6.4'
12
+ __version__ = '0.5.6.5'
13
13
  __license__ = 'GPLv3 License'
14
14
 
15
15
  __author__ = 'Miguel Sanda'
@@ -53,11 +53,13 @@ class EntityModelAdmin(ModelAdmin):
53
53
  list_display = [
54
54
  'slug',
55
55
  'name',
56
+ 'admin',
56
57
  'accrual_method',
57
58
  'last_closing_date',
58
59
  'hidden',
59
60
  'get_coa_count',
60
61
  'add_ledger_link',
62
+ 'dashboard_link',
61
63
  'balance_sheet_link',
62
64
  'income_statement_link',
63
65
  'cash_flow_statement_link'
@@ -166,6 +168,18 @@ class EntityModelAdmin(ModelAdmin):
166
168
 
167
169
  cash_flow_statement_link.short_description = 'Cash Flow'
168
170
 
171
+ def dashboard_link(self, obj: EntityModel):
172
+ add_ledger_url = reverse(
173
+ viewname='django_ledger:entity-dashboard',
174
+ kwargs={
175
+ 'entity_slug': obj.slug
176
+ })
177
+ return format_html('<a class="viewlink" href="{url}">View</a>',
178
+ url=add_ledger_url,
179
+ slug=obj.slug)
180
+
181
+ dashboard_link.short_description = 'Dashboard'
182
+
169
183
  def add_code_of_accounts(self, request, queryset):
170
184
  lt = get_localtime().isoformat()
171
185
  for entity_model in queryset:
@@ -31,8 +31,9 @@ class AccountModelCreateForm(ModelForm):
31
31
  balance_type: Need to be selected from drop down as "Debit" or Credit"
32
32
  """
33
33
 
34
- def __init__(self, entity_slug, user_model, *args, **kwargs):
35
- self.ENTITY_SLUG = entity_slug
34
+ def __init__(self, entity_model, coa_model, user_model, *args, **kwargs):
35
+ self.ENTITY = entity_model
36
+ self.COA_MODEL = coa_model
36
37
  self.USER_MODEL = user_model
37
38
  super().__init__(*args, **kwargs)
38
39
  self.fields['role'].choices = ACCOUNT_CHOICES_NO_ROOT
@@ -44,6 +45,13 @@ class AccountModelCreateForm(ModelForm):
44
45
  return None
45
46
  return role_default
46
47
 
48
+ def clean_code(self):
49
+ code = self.cleaned_data['code']
50
+ is_code_valid = not self.COA_MODEL.accountmodel_set.filter(code=code).exists()
51
+ if not is_code_valid:
52
+ raise ValidationError(message=_('Code {} already exists for CoA {}').format(code, self.COA_MODEL.slug))
53
+ return code
54
+
47
55
  class Meta:
48
56
  model = AccountModel
49
57
  fields = [
@@ -92,8 +100,9 @@ class AccountModelUpdateForm(MoveNodeForm):
92
100
  'class': DJANGO_LEDGER_FORM_INPUT_CLASSES
93
101
  }))
94
102
 
95
- def __init__(self, entity_slug, user_model, *args, **kwargs):
96
- self.ENTITY_SLUG = entity_slug
103
+ def __init__(self, entity_model, coa_model, user_model, *args, **kwargs):
104
+ self.ENTITY = entity_model
105
+ self.COA_MODEL = coa_model
97
106
  self.USER_MODEL = user_model
98
107
  super().__init__(*args, **kwargs)
99
108
  # self.fields['_ref_node_id'].choices = self.mk_dropdown_tree_choices()
@@ -51,7 +51,9 @@ class ChartOfAccountsModelValidationError(ValidationError):
51
51
 
52
52
 
53
53
  class ChartOfAccountModelQuerySet(models.QuerySet):
54
- pass
54
+
55
+ def active(self):
56
+ return self.filter(active=True)
55
57
 
56
58
 
57
59
  class ChartOfAccountModelManager(models.Manager):
@@ -116,22 +118,10 @@ class ChartOfAccountModelManager(models.Manager):
116
118
  ChartOfAccountQuerySet
117
119
  Returns a ChartOfAccountQuerySet with applied filters.
118
120
  """
119
- qs = self.get_queryset()
121
+ qs = self.for_user(user_model)
120
122
  if isinstance(entity_slug, lazy_loader.get_entity_model()):
121
- return qs.filter(
122
- Q(entity=entity_slug) &
123
- (
124
- Q(entity__admin=user_model) |
125
- Q(entity__managers__in=[user_model])
126
- )
127
- )
128
- return qs.filter(
129
- Q(entity__slug__iexact=entity_slug) &
130
- (
131
- Q(entity__admin=user_model) |
132
- Q(entity__managers__in=[user_model])
133
- )
134
- ).select_related('entity')
123
+ return qs.filter(entity=entity_slug).select_related('entity')
124
+ return qs.filter(entity__slug__iexact=entity_slug).select_related('entity')
135
125
 
136
126
 
137
127
  class ChartOfAccountModelAbstract(SlugNameMixIn, CreateUpdateMixIn):
@@ -284,6 +274,10 @@ class ChartOfAccountModelAbstract(SlugNameMixIn, CreateUpdateMixIn):
284
274
  ))
285
275
 
286
276
  def is_default(self) -> bool:
277
+ if not self.entity_id:
278
+ return False
279
+ if not self.entity.default_coa_id:
280
+ return False
287
281
  return self.entity.default_coa_id == self.uuid
288
282
 
289
283
  def is_active(self) -> bool:
@@ -517,6 +511,14 @@ class ChartOfAccountModelAbstract(SlugNameMixIn, CreateUpdateMixIn):
517
511
  }
518
512
  )
519
513
 
514
+ def get_coa_list_url(self):
515
+ return reverse(
516
+ viewname='django_ledger:coa-list',
517
+ kwargs={
518
+ 'entity_slug': self.entity.slug
519
+ }
520
+ )
521
+
520
522
  def get_absolute_url(self) -> str:
521
523
  return reverse(
522
524
  viewname='django_ledger:coa-detail',
@@ -15,9 +15,9 @@
15
15
  {% accounts_table accounts %}
16
16
  </div>
17
17
  <div class="column is-12 has-text-centered">
18
- <a href="{% url 'django_ledger:account-create' entity_slug=view.kwargs.entity_slug %}"
18
+ <a href="{{ coa_model.get_create_coa_account_url }}"
19
19
  class="button is-success">{% trans 'Create Account' %}</a>
20
- <a href="{% url 'django_ledger:coa-list' entity_slug=view.kwargs.entity_slug %}"
20
+ <a href="{{ coa_model.get_coa_list_url }}"
21
21
  class="button is-dark">{% trans 'Back to CoA List' %}</a>
22
22
  </div>
23
23
  </div>
@@ -4,22 +4,24 @@
4
4
  {% load django_ledger %}
5
5
 
6
6
  {% block view_content %}
7
- <div class="columns is-centered">
8
- <div class="column is-8-tablet is-6-desktop">
9
- <div class="box">
10
- <form action="{{ account.get_update_url }}" method="post">
11
- {% csrf_token %}
12
- {{ form.as_p }}
13
- <button class="button is-fullwidth is-primary my-3">{% trans 'Submit' %}</button>
14
- <a class="button is-fullwidth is-dark is-small my-3"
15
- href="{% url 'django_ledger:account-list' entity_slug=view.kwargs.entity_slug %}">
16
- {% trans 'Back' %}
17
- </a>
18
- </form>
7
+ <div class="box">
8
+ <div class="columns is-centered is-multiline">
9
+ <div class="column is-12 has-text-centered">
10
+ <h2 class="is-size-3 has-text-info">{{ coa_model.name }}</h2>
11
+ <p class="is-size-4 has-text-danger is-italic">({{ coa_model.slug }})</p>
12
+ <h1 class="is-size-2">{{ account }}</h1>
13
+ </div>
14
+ <div class="column is-8-tablet is-6-desktop">
15
+ <div class="box">
16
+ <form method="post">
17
+ {% csrf_token %}
18
+ {{ form.as_p }}
19
+ <button type="submit" class="button is-primary is-fullwidth djetler_my_1">Submit</button>
20
+ <a class="button is-dark is-small is-fullwidth"
21
+ href="{% url 'django_ledger:account-list' entity_slug=view.kwargs.entity_slug %}">Back</a>
22
+ </form>
23
+ </div>
19
24
  </div>
20
25
  </div>
21
26
  </div>
22
- {% endblock %}
23
-
24
-
25
-
27
+ {% endblock %}
@@ -4,13 +4,13 @@ from django_ledger import views
4
4
 
5
5
  urlpatterns = [
6
6
  path('<slug:entity_slug>/list/',
7
- views.ChartOfAccountsListView.as_view(),
7
+ views.ChartOfAccountModelListView.as_view(),
8
8
  name='coa-list'),
9
9
  path('<slug:entity_slug>/detail/<slug:coa_slug>/',
10
- views.ChartOfAccountsListView.as_view(),
10
+ views.ChartOfAccountModelListView.as_view(),
11
11
  name='coa-detail'),
12
12
  path('<slug:entity_slug>/update/<slug:coa_slug>/',
13
- views.ChartOfAccountsUpdateView.as_view(),
13
+ views.ChartOfAccountModelUpdateView.as_view(),
14
14
  name='coa-update'),
15
15
 
16
16
  # ACTIONS....
@@ -17,7 +17,7 @@ from django.views.generic.detail import SingleObjectMixin
17
17
 
18
18
  from django_ledger.forms.account import AccountModelUpdateForm, AccountModelCreateForm
19
19
  from django_ledger.io.io_core import get_localdate
20
- from django_ledger.models import lazy_loader
20
+ from django_ledger.models import ChartOfAccountModel
21
21
  from django_ledger.models.accounts import AccountModel
22
22
  from django_ledger.views.mixins import (
23
23
  YearlyReportMixIn, MonthlyReportMixIn, QuarterlyReportMixIn, DjangoLedgerSecurityMixIn,
@@ -27,6 +27,18 @@ from django_ledger.views.mixins import (
27
27
 
28
28
  class BaseAccountModelViewQuerySetMixIn:
29
29
  queryset = None
30
+ coa_model = None
31
+
32
+ def get_coa_model(self) -> ChartOfAccountModel:
33
+ if self.coa_model is None:
34
+ coa_slug = self.kwargs.get('coa_slug')
35
+ if coa_slug:
36
+ coa_model_qs = self.AUTHORIZED_ENTITY_MODEL.chartofaccountmodel_set.all().active()
37
+ coa_model = get_object_or_404(coa_model_qs, slug__exact=coa_slug)
38
+ else:
39
+ coa_model = self.AUTHORIZED_ENTITY_MODEL.default_coa
40
+ self.coa_model = coa_model
41
+ return self.coa_model
30
42
 
31
43
  def get_queryset(self):
32
44
  if self.queryset is None:
@@ -39,8 +51,15 @@ class BaseAccountModelViewQuerySetMixIn:
39
51
  ).order_by(
40
52
  'coa_model', 'role', 'code').not_coa_root()
41
53
 
42
- if self.kwargs.get('coa_slug'):
43
- qs = qs.filter(coa_model__slug__exact=self.kwargs.get('coa_slug'))
54
+ coa_slug = self.kwargs.get('coa_slug')
55
+ account_pk = self.kwargs.get('account_pk')
56
+
57
+ if coa_slug:
58
+ qs = qs.filter(coa_model__slug__exact=coa_slug)
59
+ elif account_pk:
60
+ qs = qs.filter(uuid__exact=account_pk)
61
+ else:
62
+ qs = qs.filter(coa_model__slug__exact=self.AUTHORIZED_ENTITY_MODEL.default_coa.slug)
44
63
 
45
64
  self.queryset = qs
46
65
  return super().get_queryset()
@@ -93,7 +112,8 @@ class AccountModelUpdateView(DjangoLedgerSecurityMixIn, BaseAccountModelViewQuer
93
112
  # Set here because user_model is needed to instantiate an instance of MoveNodeForm (AccountModelUpdateForm)
94
113
  account_model.USER_MODEL = self.request.user
95
114
  return AccountModelUpdateForm(
96
- entity_slug=self.kwargs['entity_slug'],
115
+ entity_model=self.AUTHORIZED_ENTITY_MODEL,
116
+ coa_model=self.get_coa_model(),
97
117
  user_model=self.request.user,
98
118
  **self.get_form_kwargs()
99
119
  )
@@ -119,7 +139,8 @@ class AccountModelCreateView(DjangoLedgerSecurityMixIn, BaseAccountModelViewQuer
119
139
  def get_form(self, form_class=None):
120
140
  return AccountModelCreateForm(
121
141
  user_model=self.request.user,
122
- entity_slug=self.kwargs['entity_slug'],
142
+ entity_model=self.AUTHORIZED_ENTITY_MODEL,
143
+ coa_model=self.get_coa_model(),
123
144
  **self.get_form_kwargs()
124
145
  )
125
146
 
@@ -129,20 +150,25 @@ class AccountModelCreateView(DjangoLedgerSecurityMixIn, BaseAccountModelViewQuer
129
150
  return context
130
151
 
131
152
  def form_valid(self, form):
132
- EntityModel = lazy_loader.get_entity_model()
133
- entity_model_qs = EntityModel.objects.for_user(user_model=self.request.user).select_related('default_coa')
134
- entity_model: EntityModel = get_object_or_404(entity_model_qs, slug__exact=self.kwargs['entity_slug'])
153
+ entity_model = self.AUTHORIZED_ENTITY_MODEL
135
154
  account_model: AccountModel = form.save(commit=False)
136
155
 
137
156
  if not entity_model.has_default_coa():
138
157
  entity_model.create_chart_of_accounts(assign_as_default=True, commit=True)
139
158
 
140
- coa_model = entity_model.default_coa
159
+ coa_model = self.get_coa_model()
141
160
  coa_model.allocate_account(account_model=account_model)
142
161
  return HttpResponseRedirect(self.get_success_url())
143
162
 
144
163
  def get_success_url(self):
145
164
  entity_slug = self.kwargs.get('entity_slug')
165
+ coa_slug = self.kwargs.get('coa_slug')
166
+ if coa_slug:
167
+ return reverse('django_ledger:account-list-coa',
168
+ kwargs={
169
+ 'entity_slug': entity_slug,
170
+ 'coa_slug': coa_slug
171
+ })
146
172
  return reverse('django_ledger:account-list',
147
173
  kwargs={
148
174
  'entity_slug': entity_slug,
@@ -18,21 +18,21 @@ from django_ledger.models.coa import ChartOfAccountModel
18
18
  from django_ledger.views.mixins import DjangoLedgerSecurityMixIn
19
19
 
20
20
 
21
- class ChartOfAccountsModelModelViewQuerySetMixIn:
21
+ class ChartOfAccountModelModelBaseViewMixIn(DjangoLedgerSecurityMixIn):
22
22
  queryset = None
23
23
 
24
24
  def get_queryset(self):
25
25
  if self.queryset is None:
26
- self.queryset = ChartOfAccountModel.objects.for_entity(
27
- entity_slug=self.kwargs['entity_slug'],
28
- user_model=self.request.user,
29
- ).select_related('entity').order_by('-updated')
26
+ entity_model = self.get_authorized_entity_instance()
27
+ self.queryset = entity_model.chartofaccountmodel_set.all().select_related(
28
+ 'entity').order_by('-updated')
30
29
  return super().get_queryset()
31
30
 
32
31
 
33
- class ChartOfAccountsListView(DjangoLedgerSecurityMixIn, ChartOfAccountsModelModelViewQuerySetMixIn, ListView):
32
+ class ChartOfAccountModelListView(ChartOfAccountModelModelBaseViewMixIn, ListView):
34
33
  template_name = 'django_ledger/chart_of_accounts/coa_list.html'
35
34
  extra_context = {
35
+ 'page_title': _('Chart of Account List'),
36
36
  'header_title': _('Chart of Account List'),
37
37
  }
38
38
  context_object_name = 'coa_list'
@@ -65,7 +65,7 @@ class ChartOfAccountsListView(DjangoLedgerSecurityMixIn, ChartOfAccountsModelMod
65
65
  )
66
66
 
67
67
 
68
- class ChartOfAccountsUpdateView(DjangoLedgerSecurityMixIn, ChartOfAccountsModelModelViewQuerySetMixIn, UpdateView):
68
+ class ChartOfAccountModelUpdateView(ChartOfAccountModelModelBaseViewMixIn, UpdateView):
69
69
  context_object_name = 'coa'
70
70
  slug_url_kwarg = 'coa_slug'
71
71
  template_name = 'django_ledger/chart_of_accounts/coa_update.html'
@@ -86,9 +86,8 @@ class ChartOfAccountsUpdateView(DjangoLedgerSecurityMixIn, ChartOfAccountsModelM
86
86
 
87
87
 
88
88
  # todo: centralize this functionality into a separate class for ALL Action views...
89
- class CharOfAccountModelActionView(DjangoLedgerSecurityMixIn,
89
+ class CharOfAccountModelActionView(ChartOfAccountModelModelBaseViewMixIn,
90
90
  RedirectView,
91
- ChartOfAccountsModelModelViewQuerySetMixIn,
92
91
  SingleObjectMixin):
93
92
  http_method_names = ['get']
94
93
  slug_url_kwarg = 'coa_slug'
@@ -299,14 +299,6 @@ class DjangoLedgerSecurityMixIn(PermissionRequiredMixin):
299
299
  def get_login_url(self):
300
300
  return reverse('django_ledger:login')
301
301
 
302
- def get_authorized_entity_queryset(self):
303
- return EntityModel.objects.for_user(
304
- user_model=self.request.user).only(
305
- 'uuid', 'slug', 'name', 'default_coa', 'admin')
306
-
307
- def get_authorized_entity_instance(self) -> Optional[EntityModel]:
308
- return self.AUTHORIZED_ENTITY_MODEL
309
-
310
302
  def has_permission(self):
311
303
  if self.request.user.is_superuser:
312
304
  if 'entity_slug' in self.kwargs:
@@ -329,6 +321,16 @@ class DjangoLedgerSecurityMixIn(PermissionRequiredMixin):
329
321
  return True
330
322
  return False
331
323
 
324
+ def get_authorized_entity_queryset(self):
325
+ return EntityModel.objects.for_user(
326
+ user_model=self.request.user).only(
327
+ 'uuid', 'slug', 'name', 'default_coa', 'admin')
328
+
329
+ def get_authorized_entity_instance(self) -> Optional[EntityModel]:
330
+ if self.AUTHORIZED_ENTITY_MODEL is None:
331
+ raise Http404()
332
+ return self.AUTHORIZED_ENTITY_MODEL
333
+
332
334
 
333
335
  class EntityUnitMixIn:
334
336
  UNIT_SLUG_KWARG = 'unit_slug'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: django-ledger
3
- Version: 0.5.6.4
3
+ Version: 0.5.6.5
4
4
  Summary: Bookkeeping & Financial analysis backend for Django. Balance Sheet, Income Statements, Chart of Accounts, Entities
5
5
  Author-email: Miguel Sanda <msanda@arrobalytics.com>
6
6
  Maintainer-email: Miguel Sanda <msanda@arrobalytics.com>
@@ -48,14 +48,14 @@ assets/node_modules/node-gyp/gyp/tools/pretty_gyp.py,sha256=2ZCRPW-MZfK7gdnCIaqh
48
48
  assets/node_modules/node-gyp/gyp/tools/pretty_sln.py,sha256=b_Fxm-SXUCPL3Tix4EyNwZNmQ-zkeRIFFmuL0R5wFhw,5482
49
49
  assets/node_modules/node-gyp/gyp/tools/pretty_vcproj.py,sha256=AwQrxK1F-jhjsbbT35XQjrvWNbc3IBFaKXoJogqMh_o,10633
50
50
  assets/node_modules/node-gyp/test/fixtures/test-charmap.py,sha256=5raXzaQnO2eJnrlFtlDtWftryhZX7Fj0amFW3hdSnhE,547
51
- django_ledger/__init__.py,sha256=lgYvWX2ILX9Xn-HrVfrYM0NTDF43wtg7NYkYvNlVuWs,458
51
+ django_ledger/__init__.py,sha256=baak5-S_PQQ_AyoLijK86tI74pLFMsMbReoTxhab9ug,458
52
52
  django_ledger/apps.py,sha256=H-zEWUjKGakgSDSZmLIoXChZ2h6e0dth0ZO5SpoT-8U,163
53
53
  django_ledger/exceptions.py,sha256=rML8sQQ0Hq-DYMLZ76dfw2RYSAsXWUoyHuyC_yP9o1o,491
54
54
  django_ledger/settings.py,sha256=KLujLYwEC3fxfj5u9HnVDsr1rBjE5OAI--bu0MYi4JE,6221
55
55
  django_ledger/utils.py,sha256=l8xq-uSvUdJNpyDjC_0UrsSfjeEpwf7B-tavbnt40a8,4305
56
56
  django_ledger/admin/__init__.py,sha256=MipzxmBhXswpx63uf3Ai2amyBMAP5fZL7mKXKxjNRIY,458
57
57
  django_ledger/admin/coa.py,sha256=BcBsvNs4Z1hOyZy4YqCtIfk1aw8DejrI1bAEH93Tkjc,3542
58
- django_ledger/admin/entity.py,sha256=Iw7nIjCqqSZZNVyl24fDvCSWjy1YGS7P77r6hfaRNSU,5817
58
+ django_ledger/admin/entity.py,sha256=DhH-6o3kjUdkhVPHzwOSF3crtvf5MCzcc1vPCk9O2Bk,6287
59
59
  django_ledger/admin/ledger.py,sha256=ecwmnuW4119StZDR_1QaK9jdZXw2dEvza-dnx1bHWDM,7876
60
60
  django_ledger/contrib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
61
61
  django_ledger/contrib/django_ledger_graphene/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -93,7 +93,7 @@ django_ledger/contrib/django_ledger_graphene/unit/schema.py,sha256=orR4tn1ORTfzL
93
93
  django_ledger/contrib/django_ledger_graphene/vendor/mutations.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
94
94
  django_ledger/contrib/django_ledger_graphene/vendor/schema.py,sha256=Y20FR0gut0yNsROL_f1LSHdzn7wM4_voKQv--evVGG4,1453
95
95
  django_ledger/forms/__init__.py,sha256=N7iaeMO5xTU-q7RXTVYUy-fu8nMZbiIJ9QEtDCjsTdI,205
96
- django_ledger/forms/account.py,sha256=n5ZaxRJZqfFmwFtq4sjIzm9_qvWNiwhaQmd0i6pdmSg,5023
96
+ django_ledger/forms/account.py,sha256=-U6OneNfH2bIlMzqXPZk8KmLn-csMhZ4PKzzq-4LdUs,5430
97
97
  django_ledger/forms/app_filters.py,sha256=fHmftiuR1Ei28LhGuu7LoxS4Q5pVjj1wiT0fF4GUcUI,2293
98
98
  django_ledger/forms/auth.py,sha256=HaJDEIRFoAHEAv-s_ZfTe0rZbhzIQ7GkKnaBX1qiAW4,736
99
99
  django_ledger/forms/bank_account.py,sha256=dmmx1BzGq9IeD0jpYOmE83Gat6D3IUeTc0z0jJ7roR4,4513
@@ -147,7 +147,7 @@ django_ledger/models/accounts.py,sha256=Ie5LTiT4zbmJndq1AJC6kZplgaklkXFusgl4LnIk
147
147
  django_ledger/models/bank_account.py,sha256=0-eTBxxRyvUKOVVNcGqWV1kiOKcXA2KPQIdiVHDUDCY,7678
148
148
  django_ledger/models/bill.py,sha256=vaXdTEfow9SPzactNs6mZdm4tJc8uamKufT9tQGFpJg,63541
149
149
  django_ledger/models/closing_entry.py,sha256=52BLvK4Jr8aXrB4kgFqrqHozkw13gwu0hm9RXWnLYE8,17732
150
- django_ledger/models/coa.py,sha256=IBoBDbZqWFpRZwrIllivjvXn_7r1Bd3CDSy52AEGqT8,20247
150
+ django_ledger/models/coa.py,sha256=yxkZK6R8-j58i_KE8X1bB0CwnaF-Vhn0Z4qLK5ZycrY,20305
151
151
  django_ledger/models/coa_default.py,sha256=4Zj8OMhgBiYuREjM82cFfyGWd8uCAeqggVkeNhg4SLU,27338
152
152
  django_ledger/models/customer.py,sha256=JQOktcYKUlENJv4frek9rAW6sRerrQ0xXHlC5KPmhWk,11807
153
153
  django_ledger/models/data_import.py,sha256=2H-4oTVLa7qXq03m9fd7T5zSQLkZKOAn2OAeOQBzMPA,19477
@@ -199,8 +199,8 @@ django_ledger/static/django_ledger/logo/favicon.png,sha256=7QIRzizQUig3PHi9zyV1t
199
199
  django_ledger/templates/django_ledger/account/account_create.html,sha256=3-5LgVrvOm6YhryVGgtYltyHMA98dSNt7_vOvsxSRvU,1166
200
200
  django_ledger/templates/django_ledger/account/account_create_child.html,sha256=i1tBc-N44D2mKnm61nrI11pXxo2STF1ezV9fVckB_qY,1089
201
201
  django_ledger/templates/django_ledger/account/account_detail.html,sha256=m-UTWD9YqoM9JWKug4alY4DIql13jYFrJG2BmdYSZ7s,934
202
- django_ledger/templates/django_ledger/account/account_list.html,sha256=MGOcUREvq2fAif-f6lLQDRsc7o8Al6cchVkDt975G50,1091
203
- django_ledger/templates/django_ledger/account/account_update.html,sha256=HmFhp7Xi_taIeNsjijrFVkxmmrDNHoAOZK0qGRtsqUI,851
202
+ django_ledger/templates/django_ledger/account/account_list.html,sha256=0kDNrzcMgMewiBQGqjkPCUHErmOiVz6uy1FnwzclMjc,1019
203
+ django_ledger/templates/django_ledger/account/account_update.html,sha256=QR4kT3cv2d00Hlh0j6UUbhtAxJ6J_mQVzGDYCVDnaWE,1151
204
204
  django_ledger/templates/django_ledger/account/tags/account_txs_table.html,sha256=ywGyB-LdCLAfT5vbFyTjPD7tNGwdQEZwrHq0Dtp6zoA,3373
205
205
  django_ledger/templates/django_ledger/account/tags/accounts_table.html,sha256=33rqgVfnfi43l6u3JGOyydF0xH6QXNM2-QQqNK9Cnkg,7476
206
206
  django_ledger/templates/django_ledger/auth/login.html,sha256=UYV2rxjEn9cXBbG6Ww93k6yMPJtOo5vpX6sod61ewKs,1849
@@ -372,7 +372,7 @@ django_ledger/urls/account.py,sha256=9G6m2mkki8sNtC_mlNIHcn2SCSoG7ienbQ5qg2kHWg0
372
372
  django_ledger/urls/auth.py,sha256=8dY2h6PQkMayUL81guu9JCxm--Tj0rglvvxg9Qh03aY,230
373
373
  django_ledger/urls/bank_account.py,sha256=-dJsrnwej8H96Gc8xltLf3NwUxKk_xG0Mq4mxhe8Cqs,887
374
374
  django_ledger/urls/bill.py,sha256=wvdRqSgnHp1CLdX6Sudu1IiIx4M1Pe8OupanA-9a-nI,2890
375
- django_ledger/urls/chart_of_accounts.py,sha256=pbOWG18j1MwyOcddrzfiYmw0ZmajNg1BVLa0GXK8JOQ,1085
375
+ django_ledger/urls/chart_of_accounts.py,sha256=c9b32U-GY8Ddhy2W7zW8IMnNtQzZHF1bs1SGJ4Ylr3U,1097
376
376
  django_ledger/urls/closing_entry.py,sha256=3W0fCuAWGB3h8cWg0cxOb9EClVrydeIdHEX0q9rge60,1765
377
377
  django_ledger/urls/customer.py,sha256=I3tWSb5Gmdr-boBSlCst_5cvCHz6JhpGxuwglqJeaG0,426
378
378
  django_ledger/urls/data_import.py,sha256=bOi6U8gN2adxQUjOeNCJGuDRB--hwWeUIQOYTMbFarw,780
@@ -392,12 +392,12 @@ django_ledger/urls/transactions.py,sha256=e_x_z5qbkR6i7o8OWWdXshDiY_WVmu9WVhR9A9
392
392
  django_ledger/urls/unit.py,sha256=EaBd1EcSeQYbOH1rTQZdyDEEtLVi7-QfC_wpRPwTpuE,1499
393
393
  django_ledger/urls/vendor.py,sha256=ODHpAwe5lomluj8ZCqbMtugTeeRsv0Yo9SqkZEmfYaw,393
394
394
  django_ledger/views/__init__.py,sha256=l5Pm2_oAW6Q_jJbXf-BiHA3ilCbiGb6gkXCm73K5DGY,1158
395
- django_ledger/views/account.py,sha256=qdfyKpcjj_yDQJ_2KK2fmIbnhIGM_R9XdvOIldiTU9w,9554
395
+ django_ledger/views/account.py,sha256=cT-YVWQCDj9IAaG8LVrk_jiH5gfGRrdzeZb63tR3atg,10525
396
396
  django_ledger/views/auth.py,sha256=-zTjMlLpyxHGPlY9EXFQyeVHMmyeJ2H9RptcW7PDeDg,771
397
397
  django_ledger/views/bank_account.py,sha256=bMgqrDydz6WuXina4L27uV-cmQicW0_JoPaXxlO7uN4,5176
398
398
  django_ledger/views/bill.py,sha256=-WWAPF6PKqfaApAJBFwNMmIveDajXD-5a12d-LbcqFA,23087
399
399
  django_ledger/views/closing_entry.py,sha256=y78azZesVgdUoQmaSEYiP7MBaPRE45qAAHPDlcThlUs,8103
400
- django_ledger/views/coa.py,sha256=EtLA2kVx_GTemxeBYML3cloiqBRZvaWLXzDW6b2OW2A,5016
400
+ django_ledger/views/coa.py,sha256=WnWQVz-4Ik9v28KHzD_WiKcgix7l6bBj1A60p4k-eos,4934
401
401
  django_ledger/views/customer.py,sha256=RoBsXBxZC9b79DSNNHaoSZtQ2AoXf7DJAGmZEO3xdxs,3672
402
402
  django_ledger/views/data_import.py,sha256=_H8gjGRIE2Jm97ivvEQn0uEWrM3VvKkYQeXQ1GbKn3g,11950
403
403
  django_ledger/views/djl_api.py,sha256=6ADX9fBK8DroTeg8UIeCf2x4wt6-AF5xLlDQnqXBfsM,4411
@@ -411,14 +411,14 @@ django_ledger/views/invoice.py,sha256=iUzTG-EbdYqNX-eYwHBnQRUD_1wTOGutw0BfDMKcI6
411
411
  django_ledger/views/item.py,sha256=FY53vk_giTRgvJ47FRqChQ8vyDYPDp4DGTvVhGAb36E,21347
412
412
  django_ledger/views/journal_entry.py,sha256=21kuiRBlhlkgv8xZKM4mj9djv0Fu0BhB80QOEOHCa-w,12135
413
413
  django_ledger/views/ledger.py,sha256=k3cK9zgGNnPwMPx0uqj_pRMFbM71lbYi7bi-l6B2M5s,12681
414
- django_ledger/views/mixins.py,sha256=1siJsvSJNpcxzOo2s9vj_Da4wSNIorU1DhanR4wh5Hg,21206
414
+ django_ledger/views/mixins.py,sha256=Zgx85WJ87IQ0yTRdVgVQp70puWaRloUObLgqeCoQLTM,21283
415
415
  django_ledger/views/purchase_order.py,sha256=1J3u4QnCkM7z1Y6DePijVdM67x4CQgfmQJcs3Y4kclU,21082
416
416
  django_ledger/views/transactions.py,sha256=5taQRGLSMkM_N8paQJ07HMspI_Nl7PawF8OohCiRmao,206
417
417
  django_ledger/views/unit.py,sha256=_RgPJO9mR6v5ohBXlnL3T8nTWgS1lwlCvERQcHk0wHE,10232
418
418
  django_ledger/views/vendor.py,sha256=gUdBPTFLeSwlNfdHSA1KFdE_y3QpwpkFhEB0r3-UYdI,3461
419
- django_ledger-0.5.6.4.dist-info/AUTHORS.md,sha256=SRM2cynD89ZfEsL09zrbUVeO17r9zE2ZM7y6ReMqVRo,713
420
- django_ledger-0.5.6.4.dist-info/LICENSE,sha256=ixuiBLtpoK3iv89l7ylKkg9rs2GzF9ukPH7ynZYzK5s,35148
421
- django_ledger-0.5.6.4.dist-info/METADATA,sha256=Tbu1lJGU5YdfamLcoC2neaAlJsRNhfC8SaFSnuYvTcc,12619
422
- django_ledger-0.5.6.4.dist-info/WHEEL,sha256=yQN5g4mg4AybRjkgi-9yy4iQEFibGQmlz78Pik5Or-A,92
423
- django_ledger-0.5.6.4.dist-info/top_level.txt,sha256=fmHWehb2HfoDncQ3eQtYzeYc-gJMywf6q_ZpKBjwzoQ,38
424
- django_ledger-0.5.6.4.dist-info/RECORD,,
419
+ django_ledger-0.5.6.5.dist-info/AUTHORS.md,sha256=SRM2cynD89ZfEsL09zrbUVeO17r9zE2ZM7y6ReMqVRo,713
420
+ django_ledger-0.5.6.5.dist-info/LICENSE,sha256=ixuiBLtpoK3iv89l7ylKkg9rs2GzF9ukPH7ynZYzK5s,35148
421
+ django_ledger-0.5.6.5.dist-info/METADATA,sha256=1MQ9knc-wMCbM6T3EhgetV2sYIyQCzEeqfNOXntPqpM,12619
422
+ django_ledger-0.5.6.5.dist-info/WHEEL,sha256=yQN5g4mg4AybRjkgi-9yy4iQEFibGQmlz78Pik5Or-A,92
423
+ django_ledger-0.5.6.5.dist-info/top_level.txt,sha256=fmHWehb2HfoDncQ3eQtYzeYc-gJMywf6q_ZpKBjwzoQ,38
424
+ django_ledger-0.5.6.5.dist-info/RECORD,,