django-ledger 0.5.5.4__py3-none-any.whl → 0.5.6.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of django-ledger might be problematic. Click here for more details.
- django_ledger/__init__.py +1 -1
- django_ledger/admin/__init__.py +10 -0
- django_ledger/admin/coa.py +135 -0
- django_ledger/admin/entity.py +199 -0
- django_ledger/admin/ledger.py +283 -0
- django_ledger/forms/entity.py +4 -12
- django_ledger/forms/ledger.py +19 -0
- django_ledger/forms/transactions.py +1 -1
- django_ledger/io/__init__.py +4 -1
- django_ledger/io/{io_mixin.py → io_core.py} +95 -35
- django_ledger/io/io_digest.py +15 -0
- django_ledger/io/{data_generator.py → io_generator.py} +51 -8
- django_ledger/io/io_library.py +317 -0
- django_ledger/io/{io_context.py → io_middleware.py} +16 -9
- django_ledger/migrations/0001_initial.py +413 -132
- django_ledger/migrations/0014_ledgermodel_ledger_xid_and_more.py +22 -0
- django_ledger/models/accounts.py +68 -7
- django_ledger/models/bank_account.py +12 -11
- django_ledger/models/bill.py +5 -9
- django_ledger/models/closing_entry.py +14 -14
- django_ledger/models/coa.py +60 -18
- django_ledger/models/customer.py +5 -11
- django_ledger/models/data_import.py +12 -6
- django_ledger/models/entity.py +90 -12
- django_ledger/models/estimate.py +12 -9
- django_ledger/models/invoice.py +10 -4
- django_ledger/models/items.py +11 -6
- django_ledger/models/journal_entry.py +61 -18
- django_ledger/models/ledger.py +90 -24
- django_ledger/models/mixins.py +2 -3
- django_ledger/models/purchase_order.py +11 -7
- django_ledger/models/transactions.py +3 -1
- django_ledger/models/unit.py +22 -13
- django_ledger/models/vendor.py +12 -11
- django_ledger/report/cash_flow_statement.py +1 -1
- django_ledger/report/core.py +3 -2
- django_ledger/templates/django_ledger/journal_entry/includes/card_journal_entry.html +1 -1
- django_ledger/templates/django_ledger/journal_entry/je_list.html +3 -0
- django_ledger/templatetags/django_ledger.py +1 -1
- django_ledger/tests/base.py +1 -1
- django_ledger/tests/test_entity.py +1 -1
- django_ledger/urls/ledger.py +3 -0
- django_ledger/views/entity.py +9 -3
- django_ledger/views/ledger.py +14 -7
- django_ledger/views/mixins.py +9 -1
- {django_ledger-0.5.5.4.dist-info → django_ledger-0.5.6.0.dist-info}/METADATA +9 -9
- {django_ledger-0.5.5.4.dist-info → django_ledger-0.5.6.0.dist-info}/RECORD +51 -46
- {django_ledger-0.5.5.4.dist-info → django_ledger-0.5.6.0.dist-info}/top_level.txt +0 -1
- django_ledger/admin.py +0 -160
- {django_ledger-0.5.5.4.dist-info → django_ledger-0.5.6.0.dist-info}/AUTHORS.md +0 -0
- {django_ledger-0.5.5.4.dist-info → django_ledger-0.5.6.0.dist-info}/LICENSE +0 -0
- {django_ledger-0.5.5.4.dist-info → django_ledger-0.5.6.0.dist-info}/WHEEL +0 -0
|
@@ -9,13 +9,12 @@ import django.db.models.manager
|
|
|
9
9
|
from django.conf import settings
|
|
10
10
|
from django.db import migrations, models
|
|
11
11
|
|
|
12
|
-
import django_ledger.io.
|
|
12
|
+
import django_ledger.io.io_core
|
|
13
13
|
import django_ledger.models.entity
|
|
14
14
|
import django_ledger.models.mixins
|
|
15
15
|
|
|
16
16
|
|
|
17
17
|
class Migration(migrations.Migration):
|
|
18
|
-
|
|
19
18
|
initial = True
|
|
20
19
|
|
|
21
20
|
dependencies = [
|
|
@@ -34,8 +33,33 @@ class Migration(migrations.Migration):
|
|
|
34
33
|
('uuid', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
|
|
35
34
|
('code', models.CharField(max_length=10, verbose_name='Account Code')),
|
|
36
35
|
('name', models.CharField(max_length=100, verbose_name='Account Name')),
|
|
37
|
-
('role', models.CharField(choices=[('Assets', (
|
|
38
|
-
('
|
|
36
|
+
('role', models.CharField(choices=[('Assets', (
|
|
37
|
+
('asset_ca_cash', 'Current Asset'), ('asset_ca_mkt_sec', 'Marketable Securities'),
|
|
38
|
+
('asset_ca_recv', 'Receivables'), ('asset_ca_inv', 'Inventory'), ('asset_ca_uncoll', 'Uncollectibles'),
|
|
39
|
+
('asset_ca_prepaid', 'Prepaid'), ('asset_ca_other', 'Other Liquid Assets'),
|
|
40
|
+
('asset_lti_notes', 'Notes Receivable'), ('asset_lti_land', 'Land'), ('asset_lti_sec', 'Securities'),
|
|
41
|
+
('asset_ppe_build', 'Buildings'), ('asset_ppe_build_accum_depr', 'Buildings - Accum. Depreciation'),
|
|
42
|
+
('asset_ppe_plant', 'Plant'), ('asset_ppe_plant_depr', 'Plant - Accum. Depreciation'),
|
|
43
|
+
('asset_ppe_equip', 'Equipment'), ('asset_ppe_equip_accum_depr', 'Equipment - Accum. Depreciation'),
|
|
44
|
+
('asset_ia', 'Intangible Assets'), ('asset_ia_accum_amort', 'Intangible Assets - Accum. Amortization'),
|
|
45
|
+
('asset_adjustment', 'Other Assets'))), ('Liabilities', (
|
|
46
|
+
('lia_cl_acc_payable', 'Accounts Payable'), ('lia_cl_wages_payable', 'Wages Payable'),
|
|
47
|
+
('lia_cl_int_payable', 'Interest Payable'), ('lia_cl_taxes_payable', 'Taxes Payable'),
|
|
48
|
+
('lia_cl_st_notes_payable', 'Notes Payable'),
|
|
49
|
+
('lia_cl_ltd_mat', 'Current Maturities of Long Tern Debt'), ('lia_cl_def_rev', 'Deferred Revenue'),
|
|
50
|
+
('lia_cl_other', 'Other Liabilities'), ('lia_ltl_notes', 'Notes Payable'),
|
|
51
|
+
('lia_ltl_bonds', 'Bonds Payable'), ('lia_ltl_mortgage', 'Mortgage Payable'))), ('Equity', (
|
|
52
|
+
('eq_capital', 'Capital'), ('eq_stock_common', 'Common Stock'),
|
|
53
|
+
('eq_stock_preferred', 'Preferred Stock'), ('eq_adjustment', 'Other Equity Adjustments'),
|
|
54
|
+
('eq_dividends', 'Dividends & Distributions to Shareholders'), ('in_operational', 'Operational Income'),
|
|
55
|
+
('in_passive', 'Investing/Passive Income'), ('in_interest', 'Interest Income'),
|
|
56
|
+
('in_gain_loss', 'Capital Gain/Loss Income'), ('in_other', 'Other Income'),
|
|
57
|
+
('ex_cogs', 'Cost of Goods Sold'), ('ex_regular', 'Regular Expense'),
|
|
58
|
+
('ex_interest', 'Interest Expense'), ('ex_taxes', 'Tax Expense'), ('ex_capital', 'Capital Expense'),
|
|
59
|
+
('ex_depreciation', 'Depreciation Expense'), ('ex_amortization', 'Amortization Expense'),
|
|
60
|
+
('ex_other', 'Other Expense')))], max_length=30, verbose_name='Account Role')),
|
|
61
|
+
('balance_type', models.CharField(choices=[('credit', 'Credit'), ('debit', 'Debit')], max_length=6,
|
|
62
|
+
verbose_name='Account Balance Type')),
|
|
39
63
|
('locked', models.BooleanField(default=False, verbose_name='Locked')),
|
|
40
64
|
('active', models.BooleanField(default=False, verbose_name='Active')),
|
|
41
65
|
],
|
|
@@ -51,21 +75,35 @@ class Migration(migrations.Migration):
|
|
|
51
75
|
fields=[
|
|
52
76
|
('created', models.DateTimeField(auto_now_add=True)),
|
|
53
77
|
('updated', models.DateTimeField(auto_now=True, null=True)),
|
|
54
|
-
('amount_due',
|
|
55
|
-
|
|
56
|
-
('
|
|
57
|
-
|
|
58
|
-
('
|
|
78
|
+
('amount_due',
|
|
79
|
+
models.DecimalField(decimal_places=2, default=0, max_digits=20, verbose_name='Amount Due')),
|
|
80
|
+
('amount_paid', models.DecimalField(decimal_places=2, default=0, max_digits=20, validators=[
|
|
81
|
+
django.core.validators.MinValueValidator(limit_value=0)], verbose_name='Amount Paid')),
|
|
82
|
+
('amount_receivable', models.DecimalField(decimal_places=2, default=0, max_digits=20, validators=[
|
|
83
|
+
django.core.validators.MinValueValidator(limit_value=0)], verbose_name='Amount Receivable')),
|
|
84
|
+
('amount_unearned', models.DecimalField(decimal_places=2, default=0, max_digits=20, validators=[
|
|
85
|
+
django.core.validators.MinValueValidator(limit_value=0)], verbose_name='Amount Unearned')),
|
|
86
|
+
('amount_earned', models.DecimalField(decimal_places=2, default=0, max_digits=20, validators=[
|
|
87
|
+
django.core.validators.MinValueValidator(limit_value=0)], verbose_name='Amount Earned')),
|
|
59
88
|
('accrue', models.BooleanField(default=False, verbose_name='Accrue')),
|
|
60
|
-
('progress', models.DecimalField(decimal_places=2, default=0, max_digits=3,
|
|
61
|
-
|
|
89
|
+
('progress', models.DecimalField(decimal_places=2, default=0, max_digits=3,
|
|
90
|
+
validators=[django.core.validators.MinValueValidator(limit_value=0),
|
|
91
|
+
django.core.validators.MaxValueValidator(limit_value=1)],
|
|
92
|
+
verbose_name='Progress Amount')),
|
|
93
|
+
('terms', models.CharField(
|
|
94
|
+
choices=[('on_receipt', 'Due On Receipt'), ('net_30', 'Net 30 Days'), ('net_60', 'Net 60 Days'),
|
|
95
|
+
('net_90', 'Net 90 Days')], default='on_receipt', max_length=10, verbose_name='Terms')),
|
|
62
96
|
('date_due', models.DateField(blank=True, null=True, verbose_name='Due Date')),
|
|
63
97
|
('markdown_notes', models.TextField(blank=True, null=True, verbose_name='Markdown Notes')),
|
|
64
98
|
('uuid', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
|
|
65
99
|
('bill_number', models.SlugField(editable=False, max_length=20, verbose_name='Bill Number')),
|
|
66
|
-
('bill_status', models.CharField(
|
|
100
|
+
('bill_status', models.CharField(
|
|
101
|
+
choices=[('draft', 'Draft'), ('in_review', 'In Review'), ('approved', 'Approved'), ('paid', 'Paid'),
|
|
102
|
+
('canceled', 'Canceled'), ('void', 'Void')], default='draft', max_length=10,
|
|
103
|
+
verbose_name='Bill Status')),
|
|
67
104
|
('xref', models.SlugField(blank=True, null=True, verbose_name='External Reference Number')),
|
|
68
|
-
('additional_info',
|
|
105
|
+
('additional_info',
|
|
106
|
+
models.JSONField(blank=True, default=dict, null=True, verbose_name='Bill Additional Info')),
|
|
69
107
|
('date_draft', models.DateField(blank=True, null=True, verbose_name='Draft Date')),
|
|
70
108
|
('date_in_review', models.DateField(blank=True, null=True, verbose_name='In Review Date')),
|
|
71
109
|
('date_approved', models.DateField(blank=True, null=True, verbose_name='Approved Date')),
|
|
@@ -83,7 +121,9 @@ class Migration(migrations.Migration):
|
|
|
83
121
|
migrations.CreateModel(
|
|
84
122
|
name='ChartOfAccountModel',
|
|
85
123
|
fields=[
|
|
86
|
-
('slug', models.SlugField(editable=False, unique=True, validators=[
|
|
124
|
+
('slug', models.SlugField(editable=False, unique=True, validators=[
|
|
125
|
+
django.core.validators.MinLengthValidator(limit_value=10,
|
|
126
|
+
message='Slug field must contain at least 10 characters.')])),
|
|
87
127
|
('name', models.CharField(blank=True, max_length=150, null=True)),
|
|
88
128
|
('created', models.DateTimeField(auto_now_add=True)),
|
|
89
129
|
('updated', models.DateTimeField(auto_now=True, null=True)),
|
|
@@ -112,7 +152,9 @@ class Migration(migrations.Migration):
|
|
|
112
152
|
('email', models.EmailField(blank=True, max_length=254, null=True, verbose_name='Email')),
|
|
113
153
|
('website', models.URLField(blank=True, null=True, verbose_name='Website')),
|
|
114
154
|
('phone', models.CharField(blank=True, max_length=30, null=True, verbose_name='Phone Number')),
|
|
115
|
-
('sales_tax_rate', models.FloatField(blank=True, default=0.0, null=True, validators=[
|
|
155
|
+
('sales_tax_rate', models.FloatField(blank=True, default=0.0, null=True, validators=[
|
|
156
|
+
django.core.validators.MinValueValidator(limit_value=0.0),
|
|
157
|
+
django.core.validators.MaxValueValidator(limit_value=1.0)], verbose_name='Sales Tax Rate')),
|
|
116
158
|
('uuid', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
|
|
117
159
|
('customer_name', models.CharField(max_length=100)),
|
|
118
160
|
('customer_number', models.CharField(editable=False, max_length=30, verbose_name='Customer Number')),
|
|
@@ -132,7 +174,10 @@ class Migration(migrations.Migration):
|
|
|
132
174
|
('created', models.DateTimeField(auto_now_add=True)),
|
|
133
175
|
('updated', models.DateTimeField(auto_now=True, null=True)),
|
|
134
176
|
('uuid', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
|
|
135
|
-
('permission_level', models.CharField(
|
|
177
|
+
('permission_level', models.CharField(
|
|
178
|
+
choices=[('read', 'Read Permissions'), ('write', 'Read/Write Permissions'),
|
|
179
|
+
('suspended', 'No Permissions')], default='read', max_length=10,
|
|
180
|
+
verbose_name='Permission Level')),
|
|
136
181
|
],
|
|
137
182
|
options={
|
|
138
183
|
'abstract': False,
|
|
@@ -141,7 +186,9 @@ class Migration(migrations.Migration):
|
|
|
141
186
|
migrations.CreateModel(
|
|
142
187
|
name='EntityModel',
|
|
143
188
|
fields=[
|
|
144
|
-
('slug', models.SlugField(editable=False, unique=True, validators=[
|
|
189
|
+
('slug', models.SlugField(editable=False, unique=True, validators=[
|
|
190
|
+
django.core.validators.MinLengthValidator(limit_value=10,
|
|
191
|
+
message='Slug field must contain at least 10 characters.')])),
|
|
145
192
|
('created', models.DateTimeField(auto_now_add=True)),
|
|
146
193
|
('updated', models.DateTimeField(auto_now=True, null=True)),
|
|
147
194
|
('address_1', models.CharField(max_length=70, verbose_name='Address Line 1')),
|
|
@@ -160,11 +207,19 @@ class Migration(migrations.Migration):
|
|
|
160
207
|
('name', models.CharField(max_length=150, verbose_name='Entity Name')),
|
|
161
208
|
('hidden', models.BooleanField(default=False)),
|
|
162
209
|
('accrual_method', models.BooleanField(default=False, verbose_name='Use Accrual Method')),
|
|
163
|
-
('fy_start_month', models.IntegerField(
|
|
210
|
+
('fy_start_month', models.IntegerField(
|
|
211
|
+
choices=[(1, 'January'), (2, 'February'), (3, 'March'), (4, 'April'), (5, 'May'), (6, 'June'),
|
|
212
|
+
(7, 'July'), (8, 'August'), (9, 'September'), (10, 'October'), (11, 'November'),
|
|
213
|
+
(12, 'December')], default=1, verbose_name='Fiscal Year Start')),
|
|
164
214
|
('picture', models.ImageField(blank=True, null=True, upload_to='')),
|
|
165
|
-
('admin', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='admin_of',
|
|
166
|
-
|
|
167
|
-
('
|
|
215
|
+
('admin', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='admin_of',
|
|
216
|
+
to=settings.AUTH_USER_MODEL, verbose_name='Admin')),
|
|
217
|
+
('default_coa', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT,
|
|
218
|
+
to='django_ledger.chartofaccountmodel',
|
|
219
|
+
verbose_name='Default Chart of Accounts')),
|
|
220
|
+
('managers',
|
|
221
|
+
models.ManyToManyField(related_name='managed_by', through='django_ledger.EntityManagementModel',
|
|
222
|
+
to=settings.AUTH_USER_MODEL, verbose_name='Managers')),
|
|
168
223
|
],
|
|
169
224
|
options={
|
|
170
225
|
'verbose_name': 'Entity',
|
|
@@ -172,7 +227,8 @@ class Migration(migrations.Migration):
|
|
|
172
227
|
'ordering': ['-created'],
|
|
173
228
|
'abstract': False,
|
|
174
229
|
},
|
|
175
|
-
bases=(models.Model, django_ledger.io.
|
|
230
|
+
bases=(models.Model, django_ledger.io.io_core.IOMixIn, django_ledger.models.mixins.LoggingMixIn,
|
|
231
|
+
django_ledger.models.entity.EntityModelFiscalPeriodMixIn),
|
|
176
232
|
),
|
|
177
233
|
migrations.CreateModel(
|
|
178
234
|
name='EntityUnitModel',
|
|
@@ -188,14 +244,15 @@ class Migration(migrations.Migration):
|
|
|
188
244
|
('document_prefix', models.CharField(max_length=3)),
|
|
189
245
|
('active', models.BooleanField(default=True, verbose_name='Is Active')),
|
|
190
246
|
('hidden', models.BooleanField(default=False, verbose_name='Is Hidden')),
|
|
191
|
-
('entity', models.ForeignKey(editable=False, on_delete=django.db.models.deletion.CASCADE,
|
|
247
|
+
('entity', models.ForeignKey(editable=False, on_delete=django.db.models.deletion.CASCADE,
|
|
248
|
+
to='django_ledger.entitymodel', verbose_name='Unit Entity')),
|
|
192
249
|
],
|
|
193
250
|
options={
|
|
194
251
|
'verbose_name': 'Entity Unit Model',
|
|
195
252
|
'ordering': ['-created'],
|
|
196
253
|
'abstract': False,
|
|
197
254
|
},
|
|
198
|
-
bases=(django_ledger.io.
|
|
255
|
+
bases=(django_ledger.io.io_core.IOMixIn, models.Model),
|
|
199
256
|
),
|
|
200
257
|
migrations.CreateModel(
|
|
201
258
|
name='EstimateModel',
|
|
@@ -205,22 +262,53 @@ class Migration(migrations.Migration):
|
|
|
205
262
|
('markdown_notes', models.TextField(blank=True, null=True, verbose_name='Markdown Notes')),
|
|
206
263
|
('uuid', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
|
|
207
264
|
('estimate_number', models.SlugField(editable=False, max_length=20, verbose_name='Estimate Number')),
|
|
208
|
-
('terms', models.CharField(
|
|
209
|
-
|
|
210
|
-
|
|
265
|
+
('terms', models.CharField(
|
|
266
|
+
choices=[('fixed', 'Fixed Price'), ('target', 'Target Price'), ('t&m', 'Time & Materials'),
|
|
267
|
+
('other', 'Other')], max_length=10, verbose_name='Contract Terms')),
|
|
268
|
+
('title', models.CharField(max_length=250, validators=[
|
|
269
|
+
django.core.validators.MinLengthValidator(limit_value=5,
|
|
270
|
+
message='PO Title length must be greater than 5')],
|
|
271
|
+
verbose_name='Customer Estimate Title')),
|
|
272
|
+
('status', models.CharField(
|
|
273
|
+
choices=[('draft', 'Draft'), ('in_review', 'In Review'), ('approved', 'Approved'),
|
|
274
|
+
('completed', 'Completed'), ('void', 'Void'), ('canceled', 'Canceled')], default='draft',
|
|
275
|
+
max_length=10, verbose_name='Customer Estimate Status')),
|
|
211
276
|
('date_draft', models.DateField(blank=True, null=True, verbose_name='Date Draft')),
|
|
212
277
|
('date_in_review', models.DateField(blank=True, null=True, verbose_name='Date In Review')),
|
|
213
278
|
('date_approved', models.DateField(blank=True, null=True, verbose_name='Date Approved')),
|
|
214
279
|
('date_completed', models.DateField(blank=True, null=True, verbose_name='Date Completed')),
|
|
215
280
|
('date_canceled', models.DateField(blank=True, null=True, verbose_name='Date Canceled')),
|
|
216
281
|
('date_void', models.DateField(blank=True, null=True, verbose_name='Date Void')),
|
|
217
|
-
('revenue_estimate', models.DecimalField(decimal_places=2, default=Decimal('0.00'),
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
('
|
|
223
|
-
|
|
282
|
+
('revenue_estimate', models.DecimalField(decimal_places=2, default=Decimal('0.00'),
|
|
283
|
+
help_text='Estimated cost to complete the quoted work.',
|
|
284
|
+
max_digits=20,
|
|
285
|
+
validators=[django.core.validators.MinValueValidator(0)],
|
|
286
|
+
verbose_name='Total revenue estimate')),
|
|
287
|
+
('labor_estimate', models.DecimalField(decimal_places=2, default=Decimal('0.00'),
|
|
288
|
+
help_text='Estimated labor cost to complete the quoted work.',
|
|
289
|
+
max_digits=20,
|
|
290
|
+
validators=[django.core.validators.MinValueValidator(0)],
|
|
291
|
+
verbose_name='Labor Cost of labor estimate')),
|
|
292
|
+
('material_estimate', models.DecimalField(decimal_places=2, default=0.0,
|
|
293
|
+
help_text='Estimated material cost to complete the quoted work.',
|
|
294
|
+
max_digits=20,
|
|
295
|
+
validators=[django.core.validators.MinValueValidator(0)],
|
|
296
|
+
verbose_name='Material Cost Estimate')),
|
|
297
|
+
('equipment_estimate', models.DecimalField(decimal_places=2, default=Decimal('0.00'),
|
|
298
|
+
help_text='Estimated equipment cost to complete the quoted work.',
|
|
299
|
+
max_digits=20,
|
|
300
|
+
validators=[django.core.validators.MinValueValidator(0)],
|
|
301
|
+
verbose_name='Equipment Cost Estimate')),
|
|
302
|
+
('other_estimate', models.DecimalField(decimal_places=2, default=Decimal('0.00'),
|
|
303
|
+
help_text='Estimated equipment cost to complete the quoted work.',
|
|
304
|
+
max_digits=20,
|
|
305
|
+
validators=[django.core.validators.MinValueValidator(0)],
|
|
306
|
+
verbose_name='Other Cost Estimate')),
|
|
307
|
+
('customer',
|
|
308
|
+
models.ForeignKey(on_delete=django.db.models.deletion.RESTRICT, to='django_ledger.customermodel',
|
|
309
|
+
verbose_name='Customer')),
|
|
310
|
+
('entity', models.ForeignKey(editable=False, on_delete=django.db.models.deletion.CASCADE,
|
|
311
|
+
to='django_ledger.entitymodel', verbose_name='Entity Model')),
|
|
224
312
|
],
|
|
225
313
|
options={
|
|
226
314
|
'verbose_name': 'Customer Job',
|
|
@@ -248,29 +336,49 @@ class Migration(migrations.Migration):
|
|
|
248
336
|
fields=[
|
|
249
337
|
('created', models.DateTimeField(auto_now_add=True)),
|
|
250
338
|
('updated', models.DateTimeField(auto_now=True, null=True)),
|
|
251
|
-
('amount_due',
|
|
252
|
-
|
|
253
|
-
('
|
|
254
|
-
|
|
255
|
-
('
|
|
339
|
+
('amount_due',
|
|
340
|
+
models.DecimalField(decimal_places=2, default=0, max_digits=20, verbose_name='Amount Due')),
|
|
341
|
+
('amount_paid', models.DecimalField(decimal_places=2, default=0, max_digits=20, validators=[
|
|
342
|
+
django.core.validators.MinValueValidator(limit_value=0)], verbose_name='Amount Paid')),
|
|
343
|
+
('amount_receivable', models.DecimalField(decimal_places=2, default=0, max_digits=20, validators=[
|
|
344
|
+
django.core.validators.MinValueValidator(limit_value=0)], verbose_name='Amount Receivable')),
|
|
345
|
+
('amount_unearned', models.DecimalField(decimal_places=2, default=0, max_digits=20, validators=[
|
|
346
|
+
django.core.validators.MinValueValidator(limit_value=0)], verbose_name='Amount Unearned')),
|
|
347
|
+
('amount_earned', models.DecimalField(decimal_places=2, default=0, max_digits=20, validators=[
|
|
348
|
+
django.core.validators.MinValueValidator(limit_value=0)], verbose_name='Amount Earned')),
|
|
256
349
|
('accrue', models.BooleanField(default=False, verbose_name='Accrue')),
|
|
257
|
-
('progress', models.DecimalField(decimal_places=2, default=0, max_digits=3,
|
|
258
|
-
|
|
350
|
+
('progress', models.DecimalField(decimal_places=2, default=0, max_digits=3,
|
|
351
|
+
validators=[django.core.validators.MinValueValidator(limit_value=0),
|
|
352
|
+
django.core.validators.MaxValueValidator(limit_value=1)],
|
|
353
|
+
verbose_name='Progress Amount')),
|
|
354
|
+
('terms', models.CharField(
|
|
355
|
+
choices=[('on_receipt', 'Due On Receipt'), ('net_30', 'Net 30 Days'), ('net_60', 'Net 60 Days'),
|
|
356
|
+
('net_90', 'Net 90 Days')], default='on_receipt', max_length=10, verbose_name='Terms')),
|
|
259
357
|
('date_due', models.DateField(blank=True, null=True, verbose_name='Due Date')),
|
|
260
358
|
('markdown_notes', models.TextField(blank=True, null=True, verbose_name='Markdown Notes')),
|
|
261
359
|
('uuid', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
|
|
262
360
|
('invoice_number', models.SlugField(editable=False, max_length=20, verbose_name='Invoice Number')),
|
|
263
|
-
('invoice_status', models.CharField(
|
|
264
|
-
|
|
361
|
+
('invoice_status', models.CharField(
|
|
362
|
+
choices=[('draft', 'Draft'), ('in_review', 'In Review'), ('approved', 'Approved'), ('paid', 'Paid'),
|
|
363
|
+
('void', 'Void'), ('canceled', 'Canceled')], default='draft', max_length=10,
|
|
364
|
+
verbose_name='Invoice Status')),
|
|
365
|
+
('additional_info',
|
|
366
|
+
models.JSONField(blank=True, default=dict, null=True, verbose_name='Invoice Additional Info')),
|
|
265
367
|
('date_draft', models.DateField(blank=True, null=True, verbose_name='Draft Date')),
|
|
266
368
|
('date_in_review', models.DateField(blank=True, null=True, verbose_name='In Review Date')),
|
|
267
369
|
('date_approved', models.DateField(blank=True, null=True, verbose_name='Approved Date')),
|
|
268
370
|
('date_paid', models.DateField(blank=True, null=True, verbose_name='Paid Date')),
|
|
269
371
|
('date_void', models.DateField(blank=True, null=True, verbose_name='Void Date')),
|
|
270
372
|
('date_canceled', models.DateField(blank=True, null=True, verbose_name='Canceled Date')),
|
|
271
|
-
('cash_account',
|
|
272
|
-
|
|
273
|
-
|
|
373
|
+
('cash_account',
|
|
374
|
+
models.ForeignKey(on_delete=django.db.models.deletion.RESTRICT, related_name='invoice_cash_account',
|
|
375
|
+
to='django_ledger.accountmodel', verbose_name='Cash Account')),
|
|
376
|
+
('ce_model', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.RESTRICT,
|
|
377
|
+
to='django_ledger.estimatemodel',
|
|
378
|
+
verbose_name='Associated Customer Job/Estimate')),
|
|
379
|
+
('customer',
|
|
380
|
+
models.ForeignKey(on_delete=django.db.models.deletion.RESTRICT, to='django_ledger.customermodel',
|
|
381
|
+
verbose_name='Customer')),
|
|
274
382
|
],
|
|
275
383
|
options={
|
|
276
384
|
'verbose_name': 'Invoice',
|
|
@@ -289,24 +397,51 @@ class Migration(migrations.Migration):
|
|
|
289
397
|
('numchild', models.PositiveIntegerField(default=0)),
|
|
290
398
|
('uuid', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
|
|
291
399
|
('name', models.CharField(max_length=100, verbose_name='Item Name')),
|
|
292
|
-
('item_type', models.CharField(blank=True,
|
|
400
|
+
('item_type', models.CharField(blank=True,
|
|
401
|
+
choices=[('L', 'Labor'), ('M', 'Material'), ('E', 'Equipment'),
|
|
402
|
+
('S', 'Lump Sum'), ('O', 'Other')], max_length=1, null=True)),
|
|
293
403
|
('sku', models.CharField(blank=True, max_length=50, null=True, verbose_name='SKU Code')),
|
|
294
404
|
('upc', models.CharField(blank=True, max_length=50, null=True, verbose_name='UPC Code')),
|
|
295
405
|
('item_id', models.CharField(blank=True, max_length=50, null=True, verbose_name='Internal ID')),
|
|
296
406
|
('item_number', models.CharField(editable=False, max_length=30, verbose_name='Item Number')),
|
|
297
407
|
('is_active', models.BooleanField(default=True, verbose_name='Is Active')),
|
|
298
|
-
('default_amount', models.DecimalField(decimal_places=2, default=0, max_digits=20,
|
|
299
|
-
|
|
300
|
-
|
|
408
|
+
('default_amount', models.DecimalField(decimal_places=2, default=0, max_digits=20,
|
|
409
|
+
validators=[django.core.validators.MinValueValidator(0)],
|
|
410
|
+
verbose_name='Default monetary value per unit of measure')),
|
|
411
|
+
('for_inventory', models.BooleanField(help_text='It is an item you require for your inventory.',
|
|
412
|
+
verbose_name='Is an item for inventory')),
|
|
413
|
+
('is_product_or_service',
|
|
414
|
+
models.BooleanField(help_text='Is a product or service you sell or provide to customers.',
|
|
415
|
+
verbose_name='Is a product or service.')),
|
|
301
416
|
('sold_as_unit', models.BooleanField(default=False)),
|
|
302
|
-
('inventory_received', models.DecimalField(blank=True, decimal_places=3, max_digits=20, null=True,
|
|
303
|
-
|
|
304
|
-
('
|
|
305
|
-
|
|
306
|
-
('
|
|
307
|
-
|
|
308
|
-
('
|
|
309
|
-
|
|
417
|
+
('inventory_received', models.DecimalField(blank=True, decimal_places=3, max_digits=20, null=True,
|
|
418
|
+
verbose_name='Total inventory received.')),
|
|
419
|
+
('inventory_received_value', models.DecimalField(blank=True, decimal_places=2, max_digits=20, null=True,
|
|
420
|
+
verbose_name='Total value of inventory received.')),
|
|
421
|
+
('additional_info',
|
|
422
|
+
models.JSONField(blank=True, default=dict, null=True, verbose_name='Item Additional Info')),
|
|
423
|
+
('cogs_account', models.ForeignKey(blank=True,
|
|
424
|
+
help_text='COGS account where cost will be recognized on Income Statement.',
|
|
425
|
+
null=True, on_delete=django.db.models.deletion.RESTRICT,
|
|
426
|
+
related_name='item_cogs_account', to='django_ledger.accountmodel',
|
|
427
|
+
verbose_name='COGS Account')),
|
|
428
|
+
('earnings_account', models.ForeignKey(blank=True,
|
|
429
|
+
help_text='Earnings account where revenue will be recognized on Income Statement.',
|
|
430
|
+
null=True, on_delete=django.db.models.deletion.RESTRICT,
|
|
431
|
+
related_name='item_earnings_account',
|
|
432
|
+
to='django_ledger.accountmodel',
|
|
433
|
+
verbose_name='Earnings Account')),
|
|
434
|
+
('entity', models.ForeignKey(editable=False, on_delete=django.db.models.deletion.CASCADE,
|
|
435
|
+
to='django_ledger.entitymodel', verbose_name='Item Entity')),
|
|
436
|
+
('expense_account', models.ForeignKey(blank=True,
|
|
437
|
+
help_text='Expense account where cost will be recognized on Income Statement.',
|
|
438
|
+
null=True, on_delete=django.db.models.deletion.RESTRICT,
|
|
439
|
+
related_name='item_expense_account',
|
|
440
|
+
to='django_ledger.accountmodel', verbose_name='Expense Account')),
|
|
441
|
+
('inventory_account',
|
|
442
|
+
models.ForeignKey(blank=True, help_text='Inventory account where cost will be capitalized.', null=True,
|
|
443
|
+
on_delete=django.db.models.deletion.RESTRICT, related_name='item_inventory_account',
|
|
444
|
+
to='django_ledger.accountmodel', verbose_name='Inventory Account')),
|
|
310
445
|
],
|
|
311
446
|
options={
|
|
312
447
|
'abstract': False,
|
|
@@ -318,24 +453,64 @@ class Migration(migrations.Migration):
|
|
|
318
453
|
('created', models.DateTimeField(auto_now_add=True)),
|
|
319
454
|
('updated', models.DateTimeField(auto_now=True, null=True)),
|
|
320
455
|
('uuid', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
|
|
321
|
-
('quantity', models.FloatField(blank=True, null=True,
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
('
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
('
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
('
|
|
332
|
-
|
|
456
|
+
('quantity', models.FloatField(blank=True, null=True,
|
|
457
|
+
validators=[django.core.validators.MinValueValidator(limit_value=0.0)],
|
|
458
|
+
verbose_name='Quantity')),
|
|
459
|
+
('unit_cost', models.FloatField(blank=True, null=True,
|
|
460
|
+
validators=[django.core.validators.MinValueValidator(limit_value=0.0)],
|
|
461
|
+
verbose_name='Cost Per Unit')),
|
|
462
|
+
('total_amount',
|
|
463
|
+
models.DecimalField(blank=True, decimal_places=2, editable=False, max_digits=20, null=True,
|
|
464
|
+
validators=[django.core.validators.MinValueValidator(limit_value=0.0)],
|
|
465
|
+
verbose_name='Total Amount QTY x UnitCost')),
|
|
466
|
+
('po_quantity',
|
|
467
|
+
models.FloatField(blank=True, help_text='Authorized item quantity for purchasing.', null=True,
|
|
468
|
+
validators=[django.core.validators.MinValueValidator(limit_value=0.0)],
|
|
469
|
+
verbose_name='PO Quantity')),
|
|
470
|
+
('po_unit_cost', models.FloatField(blank=True, help_text='Purchase Order unit cost.', null=True,
|
|
471
|
+
validators=[
|
|
472
|
+
django.core.validators.MinValueValidator(limit_value=0.0)],
|
|
473
|
+
verbose_name='PO Unit Cost')),
|
|
474
|
+
('po_total_amount', models.DecimalField(blank=True, decimal_places=2, editable=False,
|
|
475
|
+
help_text='Maximum authorized cost per Purchase Order.',
|
|
476
|
+
max_digits=20, null=True, validators=[
|
|
477
|
+
django.core.validators.MinValueValidator(limit_value=0.0)],
|
|
478
|
+
verbose_name='Authorized maximum item cost per Purchase Order')),
|
|
479
|
+
('po_item_status', models.CharField(blank=True,
|
|
480
|
+
choices=[('not_ordered', 'Not Ordered'), ('ordered', 'Ordered'),
|
|
481
|
+
('in_transit', 'In Transit'), ('received', 'Received'),
|
|
482
|
+
('cancelled', 'Canceled')], max_length=15, null=True,
|
|
483
|
+
verbose_name='PO Item Status')),
|
|
484
|
+
('ce_quantity', models.FloatField(blank=True, null=True, validators=[
|
|
485
|
+
django.core.validators.MinValueValidator(limit_value=0.0)],
|
|
486
|
+
verbose_name='Estimated/Contract Quantity')),
|
|
487
|
+
('ce_unit_cost_estimate', models.FloatField(blank=True, null=True, validators=[
|
|
488
|
+
django.core.validators.MinValueValidator(limit_value=0.0)],
|
|
489
|
+
verbose_name='Estimate/Contract Cost per Unit.')),
|
|
490
|
+
('ce_cost_estimate',
|
|
491
|
+
models.DecimalField(blank=True, decimal_places=2, editable=False, max_digits=20, null=True,
|
|
492
|
+
validators=[django.core.validators.MinValueValidator(limit_value=0.0)],
|
|
493
|
+
verbose_name='Total Estimate/Contract Cost.')),
|
|
494
|
+
('ce_unit_revenue_estimate', models.FloatField(blank=True, null=True, validators=[
|
|
495
|
+
django.core.validators.MinValueValidator(limit_value=0.0)],
|
|
496
|
+
verbose_name='Estimate/Contract Revenue per Unit.')),
|
|
497
|
+
('ce_revenue_estimate',
|
|
498
|
+
models.DecimalField(blank=True, decimal_places=2, editable=False, max_digits=20, null=True,
|
|
499
|
+
validators=[django.core.validators.MinValueValidator(limit_value=0.0)],
|
|
500
|
+
verbose_name='Total Estimate/Contract Revenue.')),
|
|
333
501
|
('item_notes', models.CharField(blank=True, max_length=400, null=True, verbose_name='Description')),
|
|
334
|
-
('bill_model', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.RESTRICT,
|
|
335
|
-
|
|
336
|
-
('
|
|
337
|
-
|
|
338
|
-
('
|
|
502
|
+
('bill_model', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.RESTRICT,
|
|
503
|
+
to='django_ledger.billmodel', verbose_name='Bill Model')),
|
|
504
|
+
('ce_model', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.RESTRICT,
|
|
505
|
+
to='django_ledger.estimatemodel', verbose_name='Customer Estimate')),
|
|
506
|
+
('entity_unit', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.RESTRICT,
|
|
507
|
+
to='django_ledger.entityunitmodel',
|
|
508
|
+
verbose_name='Associated Entity Unit')),
|
|
509
|
+
('invoice_model', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.RESTRICT,
|
|
510
|
+
to='django_ledger.invoicemodel', verbose_name='Invoice Model')),
|
|
511
|
+
('item_model',
|
|
512
|
+
models.ForeignKey(on_delete=django.db.models.deletion.RESTRICT, to='django_ledger.itemmodel',
|
|
513
|
+
verbose_name='Item Model')),
|
|
339
514
|
],
|
|
340
515
|
options={
|
|
341
516
|
'abstract': False,
|
|
@@ -350,11 +525,29 @@ class Migration(migrations.Migration):
|
|
|
350
525
|
('je_number', models.SlugField(editable=False, max_length=20, verbose_name='Journal Entry Number')),
|
|
351
526
|
('timestamp', models.DateTimeField(verbose_name='Date')),
|
|
352
527
|
('description', models.CharField(blank=True, max_length=70, null=True, verbose_name='Description')),
|
|
353
|
-
('activity', models.CharField(blank=True, choices=[('Operating', (('op', 'Operating'),)), ('Investing',
|
|
528
|
+
('activity', models.CharField(blank=True, choices=[('Operating', (('op', 'Operating'),)), ('Investing',
|
|
529
|
+
(('inv_ppe',
|
|
530
|
+
'Purchase/Disposition of PPE'),
|
|
531
|
+
(
|
|
532
|
+
'inv_securities',
|
|
533
|
+
'Purchase/Disposition of Securities'),
|
|
534
|
+
('inv',
|
|
535
|
+
'Investing Activity Other'))),
|
|
536
|
+
('Financing', (
|
|
537
|
+
('fin_std', 'Payoff of Short Term Debt'),
|
|
538
|
+
('fin_ltd', 'Payoff of Long Term Debt'), (
|
|
539
|
+
'fin_equity',
|
|
540
|
+
'Issuance of Common Stock, Preferred Stock or Capital Contribution'),
|
|
541
|
+
('fin_dividends',
|
|
542
|
+
'Dividends or Distributions to Shareholders'),
|
|
543
|
+
('fin', 'Financing Activity Other')))],
|
|
544
|
+
editable=False, max_length=20, null=True, verbose_name='Activity')),
|
|
354
545
|
('origin', models.CharField(blank=True, max_length=30, null=True, verbose_name='Origin')),
|
|
355
546
|
('posted', models.BooleanField(default=False, verbose_name='Posted')),
|
|
356
547
|
('locked', models.BooleanField(default=False, verbose_name='Locked')),
|
|
357
|
-
('entity_unit', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.RESTRICT,
|
|
548
|
+
('entity_unit', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.RESTRICT,
|
|
549
|
+
to='django_ledger.entityunitmodel',
|
|
550
|
+
verbose_name='Associated Entity Unit')),
|
|
358
551
|
],
|
|
359
552
|
options={
|
|
360
553
|
'verbose_name': 'Journal Entry',
|
|
@@ -380,12 +573,21 @@ class Migration(migrations.Migration):
|
|
|
380
573
|
('email', models.EmailField(blank=True, max_length=254, null=True, verbose_name='Email')),
|
|
381
574
|
('website', models.URLField(blank=True, null=True, verbose_name='Website')),
|
|
382
575
|
('phone', models.CharField(blank=True, max_length=30, null=True, verbose_name='Phone Number')),
|
|
383
|
-
('account_number', models.CharField(blank=True, max_length=30, null=True, validators=[
|
|
384
|
-
|
|
576
|
+
('account_number', models.CharField(blank=True, max_length=30, null=True, validators=[
|
|
577
|
+
django.core.validators.RegexValidator(re.compile('^\\d+(?:\\d+)*\\Z'), code='invalid',
|
|
578
|
+
message='Only digits allowed')],
|
|
579
|
+
verbose_name='Account Number')),
|
|
580
|
+
('routing_number', models.CharField(blank=True, max_length=30, null=True, validators=[
|
|
581
|
+
django.core.validators.RegexValidator(re.compile('^\\d+(?:\\d+)*\\Z'), code='invalid',
|
|
582
|
+
message='Only digits allowed')],
|
|
583
|
+
verbose_name='Routing Number')),
|
|
385
584
|
('aba_number', models.CharField(blank=True, max_length=30, null=True, verbose_name='ABA Number')),
|
|
386
585
|
('swift_number', models.CharField(blank=True, max_length=30, null=True, verbose_name='SWIFT Number')),
|
|
387
|
-
('account_type',
|
|
388
|
-
|
|
586
|
+
('account_type',
|
|
587
|
+
models.CharField(choices=[('checking', 'Checking'), ('savings', 'Savings')], default='checking',
|
|
588
|
+
max_length=10, verbose_name='Account Type')),
|
|
589
|
+
('tax_id_number',
|
|
590
|
+
models.CharField(blank=True, max_length=30, null=True, verbose_name='Tax Registration Number')),
|
|
389
591
|
('uuid', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
|
|
390
592
|
('vendor_number', models.CharField(blank=True, max_length=30, null=True)),
|
|
391
593
|
('vendor_name', models.CharField(max_length=100)),
|
|
@@ -393,7 +595,9 @@ class Migration(migrations.Migration):
|
|
|
393
595
|
('active', models.BooleanField(default=True)),
|
|
394
596
|
('hidden', models.BooleanField(default=False)),
|
|
395
597
|
('additional_info', models.JSONField(blank=True, default=dict, null=True)),
|
|
396
|
-
('entity_model',
|
|
598
|
+
('entity_model',
|
|
599
|
+
models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='django_ledger.entitymodel',
|
|
600
|
+
verbose_name='Vendor Entity')),
|
|
397
601
|
],
|
|
398
602
|
options={
|
|
399
603
|
'verbose_name': 'Vendor',
|
|
@@ -409,7 +613,8 @@ class Migration(migrations.Migration):
|
|
|
409
613
|
('name', models.CharField(max_length=50, verbose_name='Unit of Measure Name')),
|
|
410
614
|
('unit_abbr', models.SlugField(max_length=10, verbose_name='UoM Abbreviation')),
|
|
411
615
|
('is_active', models.BooleanField(default=True, verbose_name='Is Active')),
|
|
412
|
-
('entity', models.ForeignKey(editable=False, on_delete=django.db.models.deletion.CASCADE,
|
|
616
|
+
('entity', models.ForeignKey(editable=False, on_delete=django.db.models.deletion.CASCADE,
|
|
617
|
+
to='django_ledger.entitymodel', verbose_name='UoM Entity')),
|
|
413
618
|
],
|
|
414
619
|
options={
|
|
415
620
|
'abstract': False,
|
|
@@ -421,11 +626,23 @@ class Migration(migrations.Migration):
|
|
|
421
626
|
('created', models.DateTimeField(auto_now_add=True)),
|
|
422
627
|
('updated', models.DateTimeField(auto_now=True, null=True)),
|
|
423
628
|
('uuid', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
|
|
424
|
-
('tx_type', models.CharField(choices=[('credit', 'Credit'), ('debit', 'Debit')], max_length=10,
|
|
425
|
-
|
|
426
|
-
('
|
|
427
|
-
|
|
428
|
-
|
|
629
|
+
('tx_type', models.CharField(choices=[('credit', 'Credit'), ('debit', 'Debit')], max_length=10,
|
|
630
|
+
verbose_name='Tx Type')),
|
|
631
|
+
('amount', models.DecimalField(blank=True, decimal_places=2, help_text='Account of the transaction.',
|
|
632
|
+
max_digits=20, null=True,
|
|
633
|
+
validators=[django.core.validators.MinValueValidator(0)],
|
|
634
|
+
verbose_name='Amount')),
|
|
635
|
+
('description',
|
|
636
|
+
models.CharField(blank=True, help_text='A description to be included with this individual transaction',
|
|
637
|
+
max_length=100, null=True, verbose_name='Tx Description')),
|
|
638
|
+
('account',
|
|
639
|
+
models.ForeignKey(help_text='Account from Chart of Accounts to be associated with this transaction.',
|
|
640
|
+
on_delete=django.db.models.deletion.PROTECT, to='django_ledger.accountmodel',
|
|
641
|
+
verbose_name='Account')),
|
|
642
|
+
('journal_entry',
|
|
643
|
+
models.ForeignKey(editable=False, help_text='Journal Entry to be associated with this transaction.',
|
|
644
|
+
on_delete=django.db.models.deletion.PROTECT, to='django_ledger.journalentrymodel',
|
|
645
|
+
verbose_name='Journal Entry')),
|
|
429
646
|
],
|
|
430
647
|
options={
|
|
431
648
|
'verbose_name': 'Transaction',
|
|
@@ -445,9 +662,13 @@ class Migration(migrations.Migration):
|
|
|
445
662
|
('date_posted', models.DateField()),
|
|
446
663
|
('name', models.CharField(blank=True, max_length=200, null=True)),
|
|
447
664
|
('memo', models.CharField(blank=True, max_length=200, null=True)),
|
|
448
|
-
('earnings_account',
|
|
449
|
-
|
|
450
|
-
|
|
665
|
+
('earnings_account',
|
|
666
|
+
models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE,
|
|
667
|
+
to='django_ledger.accountmodel')),
|
|
668
|
+
('import_job',
|
|
669
|
+
models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='django_ledger.importjobmodel')),
|
|
670
|
+
('tx', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL,
|
|
671
|
+
to='django_ledger.transactionmodel')),
|
|
451
672
|
],
|
|
452
673
|
options={
|
|
453
674
|
'verbose_name': 'Staged Transaction Model',
|
|
@@ -462,19 +683,33 @@ class Migration(migrations.Migration):
|
|
|
462
683
|
('markdown_notes', models.TextField(blank=True, null=True, verbose_name='Markdown Notes')),
|
|
463
684
|
('uuid', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
|
|
464
685
|
('po_number', models.SlugField(editable=False, max_length=20, verbose_name='Purchase Order Number')),
|
|
465
|
-
('po_title', models.CharField(max_length=250, validators=[
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
686
|
+
('po_title', models.CharField(max_length=250, validators=[
|
|
687
|
+
django.core.validators.MinLengthValidator(limit_value=5,
|
|
688
|
+
message='PO Title must be greater than 5')],
|
|
689
|
+
verbose_name='Purchase Order Title')),
|
|
690
|
+
('po_status', models.CharField(
|
|
691
|
+
choices=[('draft', 'Draft'), ('in_review', 'In Review'), ('approved', 'Approved'),
|
|
692
|
+
('fulfilled', 'Fulfilled'), ('canceled', 'Canceled'), ('void', 'Void')], default='draft',
|
|
693
|
+
max_length=10)),
|
|
694
|
+
('po_amount',
|
|
695
|
+
models.DecimalField(decimal_places=2, default=0, max_digits=20, verbose_name='Purchase Order Amount')),
|
|
696
|
+
('po_amount_received',
|
|
697
|
+
models.DecimalField(decimal_places=2, default=0, max_digits=20, verbose_name='Received Amount')),
|
|
469
698
|
('date_draft', models.DateField(blank=True, null=True, verbose_name='Draft Date')),
|
|
470
699
|
('date_in_review', models.DateField(blank=True, null=True, verbose_name='In Review Date')),
|
|
471
700
|
('date_approved', models.DateField(blank=True, null=True, verbose_name='Approved Date')),
|
|
472
701
|
('date_void', models.DateField(blank=True, null=True, verbose_name='Void Date')),
|
|
473
702
|
('date_fulfilled', models.DateField(blank=True, null=True, verbose_name='Fulfillment Date')),
|
|
474
703
|
('date_canceled', models.DateField(blank=True, null=True, verbose_name='Canceled Date')),
|
|
475
|
-
('ce_model', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.RESTRICT,
|
|
476
|
-
|
|
477
|
-
|
|
704
|
+
('ce_model', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.RESTRICT,
|
|
705
|
+
to='django_ledger.estimatemodel',
|
|
706
|
+
verbose_name='Associated Customer Job/Estimate')),
|
|
707
|
+
('entity',
|
|
708
|
+
models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='django_ledger.entitymodel',
|
|
709
|
+
verbose_name='Entity')),
|
|
710
|
+
('po_items',
|
|
711
|
+
models.ManyToManyField(through='django_ledger.ItemTransactionModel', to='django_ledger.itemmodel',
|
|
712
|
+
verbose_name='Purchase Order Items')),
|
|
478
713
|
],
|
|
479
714
|
options={
|
|
480
715
|
'abstract': False,
|
|
@@ -490,7 +725,8 @@ class Migration(migrations.Migration):
|
|
|
490
725
|
('posted', models.BooleanField(default=False, verbose_name='Posted Ledger')),
|
|
491
726
|
('locked', models.BooleanField(default=False, verbose_name='Locked Ledger')),
|
|
492
727
|
('hidden', models.BooleanField(default=False, verbose_name='Hidden Ledger')),
|
|
493
|
-
('entity', models.ForeignKey(editable=False, on_delete=django.db.models.deletion.CASCADE,
|
|
728
|
+
('entity', models.ForeignKey(editable=False, on_delete=django.db.models.deletion.CASCADE,
|
|
729
|
+
to='django_ledger.entitymodel', verbose_name='Ledger Entity')),
|
|
494
730
|
],
|
|
495
731
|
options={
|
|
496
732
|
'verbose_name': 'Ledger',
|
|
@@ -498,57 +734,73 @@ class Migration(migrations.Migration):
|
|
|
498
734
|
'ordering': ['-created'],
|
|
499
735
|
'abstract': False,
|
|
500
736
|
},
|
|
501
|
-
bases=(models.Model, django_ledger.io.
|
|
737
|
+
bases=(models.Model, django_ledger.io.io_core.IOMixIn),
|
|
502
738
|
),
|
|
503
739
|
migrations.AddField(
|
|
504
740
|
model_name='journalentrymodel',
|
|
505
741
|
name='ledger',
|
|
506
|
-
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='journal_entries',
|
|
742
|
+
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='journal_entries',
|
|
743
|
+
to='django_ledger.ledgermodel', verbose_name='Ledger'),
|
|
507
744
|
),
|
|
508
745
|
migrations.AddField(
|
|
509
746
|
model_name='itemtransactionmodel',
|
|
510
747
|
name='po_model',
|
|
511
|
-
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.RESTRICT,
|
|
748
|
+
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.RESTRICT,
|
|
749
|
+
to='django_ledger.purchaseordermodel', verbose_name='Purchase Order Model'),
|
|
512
750
|
),
|
|
513
751
|
migrations.AddField(
|
|
514
752
|
model_name='itemmodel',
|
|
515
753
|
name='uom',
|
|
516
|
-
field=models.ForeignKey(on_delete=django.db.models.deletion.RESTRICT, to='django_ledger.unitofmeasuremodel',
|
|
754
|
+
field=models.ForeignKey(on_delete=django.db.models.deletion.RESTRICT, to='django_ledger.unitofmeasuremodel',
|
|
755
|
+
verbose_name='Unit of Measure'),
|
|
517
756
|
),
|
|
518
757
|
migrations.AddField(
|
|
519
758
|
model_name='invoicemodel',
|
|
520
759
|
name='invoice_items',
|
|
521
|
-
field=models.ManyToManyField(through='django_ledger.ItemTransactionModel', to='django_ledger.itemmodel',
|
|
760
|
+
field=models.ManyToManyField(through='django_ledger.ItemTransactionModel', to='django_ledger.itemmodel',
|
|
761
|
+
verbose_name='Invoice Items'),
|
|
522
762
|
),
|
|
523
763
|
migrations.AddField(
|
|
524
764
|
model_name='invoicemodel',
|
|
525
765
|
name='ledger',
|
|
526
|
-
field=models.OneToOneField(editable=False, on_delete=django.db.models.deletion.CASCADE,
|
|
766
|
+
field=models.OneToOneField(editable=False, on_delete=django.db.models.deletion.CASCADE,
|
|
767
|
+
to='django_ledger.ledgermodel', verbose_name='Ledger'),
|
|
527
768
|
),
|
|
528
769
|
migrations.AddField(
|
|
529
770
|
model_name='invoicemodel',
|
|
530
771
|
name='prepaid_account',
|
|
531
|
-
field=models.ForeignKey(on_delete=django.db.models.deletion.RESTRICT,
|
|
772
|
+
field=models.ForeignKey(on_delete=django.db.models.deletion.RESTRICT,
|
|
773
|
+
related_name='invoice_prepaid_account', to='django_ledger.accountmodel',
|
|
774
|
+
verbose_name='Prepaid Account'),
|
|
532
775
|
),
|
|
533
776
|
migrations.AddField(
|
|
534
777
|
model_name='invoicemodel',
|
|
535
778
|
name='unearned_account',
|
|
536
|
-
field=models.ForeignKey(on_delete=django.db.models.deletion.RESTRICT,
|
|
779
|
+
field=models.ForeignKey(on_delete=django.db.models.deletion.RESTRICT,
|
|
780
|
+
related_name='invoice_unearned_account', to='django_ledger.accountmodel',
|
|
781
|
+
verbose_name='Unearned Account'),
|
|
537
782
|
),
|
|
538
783
|
migrations.AddField(
|
|
539
784
|
model_name='importjobmodel',
|
|
540
785
|
name='ledger',
|
|
541
|
-
field=models.ForeignKey(editable=False, on_delete=django.db.models.deletion.CASCADE,
|
|
786
|
+
field=models.ForeignKey(editable=False, on_delete=django.db.models.deletion.CASCADE,
|
|
787
|
+
to='django_ledger.ledgermodel', verbose_name='Ledger'),
|
|
542
788
|
),
|
|
543
789
|
migrations.CreateModel(
|
|
544
790
|
name='EntityStateModel',
|
|
545
791
|
fields=[
|
|
546
792
|
('uuid', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
|
|
547
|
-
('fiscal_year', models.SmallIntegerField(blank=True, null=True, validators=[
|
|
548
|
-
|
|
549
|
-
('
|
|
550
|
-
|
|
551
|
-
('
|
|
793
|
+
('fiscal_year', models.SmallIntegerField(blank=True, null=True, validators=[
|
|
794
|
+
django.core.validators.MinValueValidator(limit_value=1900)], verbose_name='Fiscal Year')),
|
|
795
|
+
('key', models.CharField(choices=[('je', 'Journal Entry'), ('po', 'Purchase Order'), ('bill', 'Bill'),
|
|
796
|
+
('invoice', 'Invoice'), ('estimate', 'Estimate')], max_length=10)),
|
|
797
|
+
('sequence', models.BigIntegerField(default=0, validators=[
|
|
798
|
+
django.core.validators.MinValueValidator(limit_value=0)])),
|
|
799
|
+
('entity_model',
|
|
800
|
+
models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='django_ledger.entitymodel',
|
|
801
|
+
verbose_name='Entity Model')),
|
|
802
|
+
('entity_unit', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.RESTRICT,
|
|
803
|
+
to='django_ledger.entityunitmodel', verbose_name='Entity Unit')),
|
|
552
804
|
],
|
|
553
805
|
options={
|
|
554
806
|
'abstract': False,
|
|
@@ -557,74 +809,100 @@ class Migration(migrations.Migration):
|
|
|
557
809
|
migrations.AddField(
|
|
558
810
|
model_name='entitymanagementmodel',
|
|
559
811
|
name='entity',
|
|
560
|
-
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='entity_permissions',
|
|
812
|
+
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='entity_permissions',
|
|
813
|
+
to='django_ledger.entitymodel', verbose_name='Entity'),
|
|
561
814
|
),
|
|
562
815
|
migrations.AddField(
|
|
563
816
|
model_name='entitymanagementmodel',
|
|
564
817
|
name='user',
|
|
565
|
-
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='entity_permissions',
|
|
818
|
+
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='entity_permissions',
|
|
819
|
+
to=settings.AUTH_USER_MODEL, verbose_name='Manager'),
|
|
566
820
|
),
|
|
567
821
|
migrations.AddField(
|
|
568
822
|
model_name='customermodel',
|
|
569
823
|
name='entity_model',
|
|
570
|
-
field=models.ForeignKey(editable=False, on_delete=django.db.models.deletion.CASCADE,
|
|
824
|
+
field=models.ForeignKey(editable=False, on_delete=django.db.models.deletion.CASCADE,
|
|
825
|
+
to='django_ledger.entitymodel', verbose_name='Customer Entity'),
|
|
571
826
|
),
|
|
572
827
|
migrations.AddField(
|
|
573
828
|
model_name='chartofaccountmodel',
|
|
574
829
|
name='entity',
|
|
575
|
-
field=models.ForeignKey(editable=False, on_delete=django.db.models.deletion.CASCADE,
|
|
830
|
+
field=models.ForeignKey(editable=False, on_delete=django.db.models.deletion.CASCADE,
|
|
831
|
+
to='django_ledger.entitymodel', verbose_name='Entity'),
|
|
576
832
|
),
|
|
577
833
|
migrations.AddField(
|
|
578
834
|
model_name='billmodel',
|
|
579
835
|
name='bill_items',
|
|
580
|
-
field=models.ManyToManyField(through='django_ledger.ItemTransactionModel', to='django_ledger.itemmodel',
|
|
836
|
+
field=models.ManyToManyField(through='django_ledger.ItemTransactionModel', to='django_ledger.itemmodel',
|
|
837
|
+
verbose_name='Bill Items'),
|
|
581
838
|
),
|
|
582
839
|
migrations.AddField(
|
|
583
840
|
model_name='billmodel',
|
|
584
841
|
name='cash_account',
|
|
585
|
-
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.RESTRICT,
|
|
842
|
+
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.RESTRICT,
|
|
843
|
+
related_name='None_cash_account', to='django_ledger.accountmodel',
|
|
844
|
+
verbose_name='Cash Account'),
|
|
586
845
|
),
|
|
587
846
|
migrations.AddField(
|
|
588
847
|
model_name='billmodel',
|
|
589
848
|
name='ce_model',
|
|
590
|
-
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.RESTRICT,
|
|
849
|
+
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.RESTRICT,
|
|
850
|
+
to='django_ledger.estimatemodel', verbose_name='Associated Customer Job/Estimate'),
|
|
591
851
|
),
|
|
592
852
|
migrations.AddField(
|
|
593
853
|
model_name='billmodel',
|
|
594
854
|
name='ledger',
|
|
595
|
-
field=models.OneToOneField(editable=False, on_delete=django.db.models.deletion.CASCADE,
|
|
855
|
+
field=models.OneToOneField(editable=False, on_delete=django.db.models.deletion.CASCADE,
|
|
856
|
+
to='django_ledger.ledgermodel', verbose_name='Ledger'),
|
|
596
857
|
),
|
|
597
858
|
migrations.AddField(
|
|
598
859
|
model_name='billmodel',
|
|
599
860
|
name='prepaid_account',
|
|
600
|
-
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.RESTRICT,
|
|
861
|
+
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.RESTRICT,
|
|
862
|
+
related_name='None_prepaid_account', to='django_ledger.accountmodel',
|
|
863
|
+
verbose_name='Prepaid Account'),
|
|
601
864
|
),
|
|
602
865
|
migrations.AddField(
|
|
603
866
|
model_name='billmodel',
|
|
604
867
|
name='unearned_account',
|
|
605
|
-
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.RESTRICT,
|
|
868
|
+
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.RESTRICT,
|
|
869
|
+
related_name='None_unearned_account', to='django_ledger.accountmodel',
|
|
870
|
+
verbose_name='Unearned Account'),
|
|
606
871
|
),
|
|
607
872
|
migrations.AddField(
|
|
608
873
|
model_name='billmodel',
|
|
609
874
|
name='vendor',
|
|
610
|
-
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='django_ledger.vendormodel',
|
|
875
|
+
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='django_ledger.vendormodel',
|
|
876
|
+
verbose_name='Vendor'),
|
|
611
877
|
),
|
|
612
878
|
migrations.CreateModel(
|
|
613
879
|
name='BankAccountModel',
|
|
614
880
|
fields=[
|
|
615
881
|
('created', models.DateTimeField(auto_now_add=True)),
|
|
616
882
|
('updated', models.DateTimeField(auto_now=True, null=True)),
|
|
617
|
-
('account_number', models.CharField(blank=True, max_length=30, null=True, validators=[
|
|
618
|
-
|
|
883
|
+
('account_number', models.CharField(blank=True, max_length=30, null=True, validators=[
|
|
884
|
+
django.core.validators.RegexValidator(re.compile('^\\d+(?:\\d+)*\\Z'), code='invalid',
|
|
885
|
+
message='Only digits allowed')],
|
|
886
|
+
verbose_name='Account Number')),
|
|
887
|
+
('routing_number', models.CharField(blank=True, max_length=30, null=True, validators=[
|
|
888
|
+
django.core.validators.RegexValidator(re.compile('^\\d+(?:\\d+)*\\Z'), code='invalid',
|
|
889
|
+
message='Only digits allowed')],
|
|
890
|
+
verbose_name='Routing Number')),
|
|
619
891
|
('aba_number', models.CharField(blank=True, max_length=30, null=True, verbose_name='ABA Number')),
|
|
620
892
|
('swift_number', models.CharField(blank=True, max_length=30, null=True, verbose_name='SWIFT Number')),
|
|
621
|
-
('account_type',
|
|
893
|
+
('account_type',
|
|
894
|
+
models.CharField(choices=[('checking', 'Checking'), ('savings', 'Savings')], default='checking',
|
|
895
|
+
max_length=10, verbose_name='Account Type')),
|
|
622
896
|
('uuid', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
|
|
623
897
|
('name', models.CharField(blank=True, max_length=150, null=True)),
|
|
624
898
|
('active', models.BooleanField(default=False)),
|
|
625
899
|
('hidden', models.BooleanField(default=False)),
|
|
626
|
-
('cash_account',
|
|
627
|
-
|
|
900
|
+
('cash_account',
|
|
901
|
+
models.ForeignKey(on_delete=django.db.models.deletion.RESTRICT, related_name='bank_cash_account',
|
|
902
|
+
to='django_ledger.accountmodel', verbose_name='Cash Account')),
|
|
903
|
+
('entity_model',
|
|
904
|
+
models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='django_ledger.entitymodel',
|
|
905
|
+
verbose_name='Entity Model')),
|
|
628
906
|
],
|
|
629
907
|
options={
|
|
630
908
|
'verbose_name': 'Bank Account',
|
|
@@ -634,7 +912,8 @@ class Migration(migrations.Migration):
|
|
|
634
912
|
migrations.AddField(
|
|
635
913
|
model_name='accountmodel',
|
|
636
914
|
name='coa_model',
|
|
637
|
-
field=models.ForeignKey(editable=False, on_delete=django.db.models.deletion.CASCADE,
|
|
915
|
+
field=models.ForeignKey(editable=False, on_delete=django.db.models.deletion.CASCADE,
|
|
916
|
+
to='django_ledger.chartofaccountmodel', verbose_name='Chart of Accounts'),
|
|
638
917
|
),
|
|
639
918
|
migrations.AddIndex(
|
|
640
919
|
model_name='vendormodel',
|
|
@@ -970,7 +1249,8 @@ class Migration(migrations.Migration):
|
|
|
970
1249
|
),
|
|
971
1250
|
migrations.AddIndex(
|
|
972
1251
|
model_name='entitystatemodel',
|
|
973
|
-
index=models.Index(fields=['entity_model', 'fiscal_year', 'entity_unit', 'key'],
|
|
1252
|
+
index=models.Index(fields=['entity_model', 'fiscal_year', 'entity_unit', 'key'],
|
|
1253
|
+
name='django_ledg_entity__eeae49_idx'),
|
|
974
1254
|
),
|
|
975
1255
|
migrations.AlterUniqueTogether(
|
|
976
1256
|
name='entitystatemodel',
|
|
@@ -1082,7 +1362,8 @@ class Migration(migrations.Migration):
|
|
|
1082
1362
|
),
|
|
1083
1363
|
migrations.AlterUniqueTogether(
|
|
1084
1364
|
name='bankaccountmodel',
|
|
1085
|
-
unique_together={('entity_model', 'account_number'),
|
|
1365
|
+
unique_together={('entity_model', 'account_number'),
|
|
1366
|
+
('entity_model', 'cash_account', 'account_number', 'routing_number')},
|
|
1086
1367
|
),
|
|
1087
1368
|
migrations.AddIndex(
|
|
1088
1369
|
model_name='accountmodel',
|