axios-accounting 0.1__tar.gz

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.
Files changed (41) hide show
  1. axios_accounting-0.1/PKG-INFO +4 -0
  2. axios_accounting-0.1/README.txt +29 -0
  3. axios_accounting-0.1/axios_accounting/__init__.py +0 -0
  4. axios_accounting-0.1/axios_accounting/admin.py +28 -0
  5. axios_accounting-0.1/axios_accounting/apps.py +10 -0
  6. axios_accounting-0.1/axios_accounting/fields.py +194 -0
  7. axios_accounting-0.1/axios_accounting/migrations/0001_initial.py +169 -0
  8. axios_accounting-0.1/axios_accounting/migrations/0002_alter_invoice_discount_percent_and_more.py +43 -0
  9. axios_accounting-0.1/axios_accounting/migrations/0003_rename_accounts_payable_fund_ap_and_more.py +28 -0
  10. axios_accounting-0.1/axios_accounting/migrations/0004_alter_invoiceline_tax_1_rate_and_more.py +33 -0
  11. axios_accounting-0.1/axios_accounting/migrations/0005_invoicepayment.py +24 -0
  12. axios_accounting-0.1/axios_accounting/migrations/0006_paymentmethods.py +23 -0
  13. axios_accounting-0.1/axios_accounting/migrations/0007_rename_paymentmethods_paymentmethod.py +17 -0
  14. axios_accounting-0.1/axios_accounting/migrations/0008_invoicepayment_method.py +19 -0
  15. axios_accounting-0.1/axios_accounting/migrations/0009_alter_fund_ap_alter_fund_ar_alter_fund_bank_and_more.py +44 -0
  16. axios_accounting-0.1/axios_accounting/migrations/0010_invoice_bad_debt_journal_entry_invoice_journal_entry.py +24 -0
  17. axios_accounting-0.1/axios_accounting/migrations/0011_invoice_fund.py +19 -0
  18. axios_accounting-0.1/axios_accounting/migrations/0012_fund_expense_taxes_paid_fund_sales_taxes_collected.py +24 -0
  19. axios_accounting-0.1/axios_accounting/migrations/0013_rename_sales_taxes_collected_fund_tax_collected_and_more.py +23 -0
  20. axios_accounting-0.1/axios_accounting/migrations/0014_client_vendor.py +35 -0
  21. axios_accounting-0.1/axios_accounting/migrations/0015_invoice_issued_to.py +19 -0
  22. axios_accounting-0.1/axios_accounting/migrations/0016_journalentryline_client_journalentryline_invoice_and_more.py +29 -0
  23. axios_accounting-0.1/axios_accounting/migrations/0017_invoicepayment_journal_entry.py +19 -0
  24. axios_accounting-0.1/axios_accounting/migrations/0018_paymentmethod_auto_deposit.py +18 -0
  25. axios_accounting-0.1/axios_accounting/migrations/__init__.py +0 -0
  26. axios_accounting-0.1/axios_accounting/models.py +361 -0
  27. axios_accounting-0.1/axios_accounting/signals.py +33 -0
  28. axios_accounting-0.1/axios_accounting/tests/test_basics.py +70 -0
  29. axios_accounting-0.1/axios_accounting/tests/test_invoices.py +114 -0
  30. axios_accounting-0.1/axios_accounting/tests/utils.py +12 -0
  31. axios_accounting-0.1/axios_accounting/urls.py +7 -0
  32. axios_accounting-0.1/axios_accounting/utils/accounts.py +21 -0
  33. axios_accounting-0.1/axios_accounting/utils/misc.py +104 -0
  34. axios_accounting-0.1/axios_accounting/utils/receivables.py +149 -0
  35. axios_accounting-0.1/axios_accounting/views.py +3 -0
  36. axios_accounting-0.1/axios_accounting.egg-info/PKG-INFO +4 -0
  37. axios_accounting-0.1/axios_accounting.egg-info/SOURCES.txt +39 -0
  38. axios_accounting-0.1/axios_accounting.egg-info/dependency_links.txt +1 -0
  39. axios_accounting-0.1/axios_accounting.egg-info/top_level.txt +1 -0
  40. axios_accounting-0.1/pyproject.toml +8 -0
  41. axios_accounting-0.1/setup.cfg +4 -0
@@ -0,0 +1,4 @@
1
+ Metadata-Version: 2.4
2
+ Name: axios-accounting
3
+ Version: 0.1
4
+ Requires-Python: >=3.12
@@ -0,0 +1,29 @@
1
+ Here is how to update the project:
2
+
3
+ - Copy the axios_accounting APP folder into axios_accounting/ (overwriting the old folder) so that axios_accounting now has all the files from the "axios_accounting" app (not the whole project, just that app's files/folders)
4
+
5
+ - In the top axios-accounting level, run the command:
6
+
7
+ python3 -m build
8
+
9
+ This will create a new tarball in the /dist folder
10
+
11
+
12
+ - Copy that tarball into the Docker container with this command:
13
+
14
+ docker cp local/path/to/tarball CONTAINER_NAME:/tarball
15
+
16
+ Note that the CONTAINER_NAME is the Django container (not the Postgres container) -- make sure its running!
17
+ Do NOT put the tarball in the code folder
18
+ Also, this will copy the tarball into the directory ABOVE the codebase. So you will have to cd.. up a level to see the tarball
19
+ The name of the tarball on the Docker side doesn't matter, so long as it has the right tar.gz extension
20
+
21
+
22
+ - Install the app from within Docker with this command:
23
+
24
+ python -m pip install tarball_name
25
+
26
+
27
+ - Ensure that the app is in the INSTALLED_APPS listing, like so: 'axios_accounting'
28
+
29
+ After doing all of the above, the Docker log SHOULD show that you have migrations to commit. Do that and you're good to go
File without changes
@@ -0,0 +1,28 @@
1
+ from django.contrib import admin
2
+
3
+ from axios_accounting.models import *
4
+
5
+ class FundAdmin(admin.ModelAdmin):
6
+ list_display = ('pk', 'name')
7
+
8
+ class AccountAdmin(admin.ModelAdmin):
9
+ list_display = ('pk', 'fund', 'number', 'name')
10
+
11
+ class AccountTypeAdmin(admin.ModelAdmin):
12
+ list_display = ('pk', 'category', 'name')
13
+
14
+ admin.site.register(TaxRate)
15
+ admin.site.register(PaymentMethod)
16
+ admin.site.register(Fund, FundAdmin)
17
+ admin.site.register(AccountingSettings)
18
+ admin.site.register(Account, AccountAdmin)
19
+ admin.site.register(AccountType, AccountTypeAdmin)
20
+ admin.site.register(JournalEntry)
21
+ admin.site.register(JournalEntryLine)
22
+ admin.site.register(Invoice)
23
+ admin.site.register(InvoiceLine)
24
+ admin.site.register(InvoicePayment)
25
+ admin.site.register(Chargeable)
26
+ admin.site.register(Client)
27
+ admin.site.register(Vendor)
28
+ admin.site.register(ChargeableTax)
@@ -0,0 +1,10 @@
1
+ from django.apps import AppConfig
2
+
3
+
4
+ class AxiosAccountingConfig(AppConfig):
5
+ default_auto_field = 'django.db.models.BigAutoField'
6
+ name = 'axios_accounting'
7
+ label = 'axios_accounting'
8
+
9
+ def ready(self):
10
+ import axios_accounting.signals
@@ -0,0 +1,194 @@
1
+ from decimal import Decimal
2
+ from django.db import models
3
+ from django.core.exceptions import ValidationError
4
+ import sys
5
+
6
+
7
+ # class FinancialNumber:
8
+ # """A class to store a financial number, maintaining four decimal places of precision"""
9
+ # num = 0
10
+
11
+ # def __init__(self, value):
12
+ # """The value coming in might be a string, or in -- eitherway, cast it as INT"""
13
+ # self.num = int(value)
14
+ # return super().__init__()
15
+
16
+ # def __str__(self):
17
+ # return str(self.as_decimal())
18
+
19
+ # def as_decimal(self):
20
+ # return Decimal(str(self.num / 10000)).quantize(Decimal('0.0000'))
21
+
22
+ # def raw(self):
23
+ # """The underlying integer"""
24
+ # return self.num
25
+
26
+ # def us_curr(self):
27
+ # """ Passing string to Decimal avoids it being considered a "Float", which causes decimal problems. """
28
+ # return '$ ' + str(Decimal(str(self.num / 1000)).quantize(Decimal('0.00')))
29
+
30
+
31
+ # # Convert inputted value into Financial Number object
32
+ # def parse_financial_number(num):
33
+ # # Ensures that we are always storing good data -- never None or strings
34
+ # print('PARSE FIN NUM')
35
+ # print(type(num))
36
+ # # if isinstance(num, int):
37
+ # # return num
38
+ # if not isinstance(num, int) and not isinstance(num, float) and not isinstance(num, str):
39
+ # raise ValidationError("Invalid input for Financial Data instance")
40
+ # return FinancialNumber(num)
41
+
42
+
43
+ # # Convert Database INT value into Financial Number object
44
+ # def create_financial_number(num):
45
+ # # Ensures that we are always storing good data -- never None or strings
46
+ # print('CREATE FIN NUM from DB')
47
+ # print(type(num))
48
+ # if isinstance(num, int):
49
+ # print('DB value is an INT')
50
+ # num = Decimal(str(num))
51
+ # print('Now its a decimal, converted from STR first')
52
+ # print(num)
53
+ # print(type(num))
54
+ # num = num / 1000
55
+ # print('now divided by 10000')
56
+ # print(num)
57
+ # print(type(num))
58
+ # return num
59
+ # if not isinstance(num, int) and not isinstance(num, float) and not isinstance(num, str):
60
+ # raise ValidationError("Invalid input for Financial Data instance")
61
+ # return FinancialNumber(num)
62
+
63
+
64
+ class FinancialNumberField(models.DecimalField):
65
+ description = "Financial number (such as currency) with six decimal places of accuracy"
66
+
67
+ def __init__(self, *args, **kwargs):
68
+ print('__init__ ----- ')
69
+ kwargs['max_digits'] = 21
70
+ kwargs['decimal_places'] = 6
71
+ super().__init__(*args, **kwargs)
72
+
73
+
74
+ def from_db_value(self, value, expression, connection):
75
+ # Prepares the value in the database for use in software
76
+ print('from_db_value ----- ')
77
+ print(value)
78
+ print(type(value))
79
+
80
+ if value is None or value == '':
81
+ return Decimal('0')
82
+
83
+ return Decimal(str(value)).quantize(Decimal('0.000000'))
84
+
85
+
86
+ def get_db_prep_save(self, value, connection):
87
+ # Prepares the value for storage in the DB
88
+ print('get_db_prep_save ----- ')
89
+ print(value)
90
+ print(type(value))
91
+
92
+ if value is None or value == '':
93
+ return Decimal('0')
94
+
95
+ return Decimal(str(value)).quantize(Decimal('0.000000'))
96
+
97
+
98
+ # def to_python(self, val):
99
+ # # Prepares
100
+ # print('to_python ----- ')
101
+
102
+
103
+ # # Stores a financial number, with four decimal place precision, but stores it as a BigInt.
104
+ # class FinancialNumberField(models.Field):
105
+ # # class FinancialNumberField(models.BigIntegerField):
106
+ # description = "Financial number (such as currency) with four decimal places of accuracy"
107
+
108
+ # # def __init_(self, *args, **kwargs):
109
+ # # print('---- inside main INIT...')
110
+ # # super().__init__(*args, **kwargs)
111
+ # # # Representing a decimal number with four decimal places, as a large integer
112
+ # # self.val = Decimal(val).quantize('0.0000') * 1000
113
+ # # tmp
114
+ # # _internal_type = 'BigIntegerField'
115
+
116
+
117
+
118
+ # def db_type(self, connection):
119
+ # return "bigint"
120
+
121
+ # def from_db_value(self, value, expression, connection):
122
+ # # Converts the DB value into the custom Python object
123
+ # print('---from DB value')
124
+ # print(type(value))
125
+ # print(value)
126
+ # # return value
127
+
128
+ # if value is None or value == "":
129
+ # return 0
130
+ # if isinstance(value, int):
131
+ # return parse_financial_number(value)
132
+ # raise ValidationError('Cannot convert database value to Financial Number')
133
+
134
+ # def get_db_prep_save(self, value, connection):
135
+ # # Prepares the custom object for storage in the DB
136
+ # print('-------- GET DB PREP VALUE')
137
+ # print(type(value))
138
+ # if value is None or value == "":
139
+ # return value
140
+ # if isinstance(value, int) or isinstance(value, str) or isinstance(value, Decimal) or isinstance(value, float):
141
+ # return create_financial_number(value)
142
+ # raise ValidationError('Cannot prepare for database')
143
+
144
+ # def to_python(self, val):
145
+ # # Take user input from form, translate it into BIGINT, then create FinancialNumber object
146
+ # print('----- TO PYTHON')
147
+ # print(val)
148
+ # print(type(val))
149
+
150
+
151
+
152
+
153
+
154
+
155
+ # if isinstance(val, FinancialNumber):
156
+ # return val
157
+
158
+ # if val is None or val == "":
159
+ # return 0
160
+
161
+ # print('--- skipped ifs, parsing into fin num')
162
+ # val = Decimal(str(val)) * 10000
163
+ # print('--- check again, after conversion to decimal and decimal place shift')
164
+ # print(val)
165
+ # print(type(val))
166
+
167
+ # # Reduce the number of decimals two 1 place
168
+ # val = val.quantize(Decimal('0.0'))
169
+
170
+ # # Convert to a decimal with 5 decimal places - one higher than our requirement
171
+ # # to avoice rounding issues
172
+ # # val = Decimal(val).quantize(Decimal('0.00000'))
173
+
174
+ # # Convert to a string to lock in the values, drop the last digit (which was rounded at quantize step)
175
+ # # remove the decimal character, and convert it to an int type
176
+ # val = str(val)
177
+ # print('-- now as a string')
178
+ # print(val)
179
+
180
+ # # Drop the last two characters, which are the decimal and digit.
181
+ # val = val[:-2]
182
+ # val = int(val)
183
+ # print('--- stored as an int')
184
+
185
+ # # # Shift the decimal place to the right 4 digits
186
+ # # val = val * 10000
187
+ # # # Remove all decimals
188
+ # # val = val.quantize(Decimal('0'))
189
+ # # # Convert to an integer
190
+ # # self.num = int(val)
191
+ # print('--- done massaging user input, should be an int now, and store THAT in DB:')
192
+ # print(type(val))
193
+ # print(val)
194
+ # return val
@@ -0,0 +1,169 @@
1
+ # Generated by Django 5.2.9 on 2026-01-07 05:59
2
+
3
+ import django.db.models.deletion
4
+ import django.utils.timezone
5
+ from django.db import migrations, models
6
+
7
+
8
+ class Migration(migrations.Migration):
9
+
10
+ initial = True
11
+
12
+ dependencies = [
13
+ ]
14
+
15
+ operations = [
16
+ migrations.CreateModel(
17
+ name='AccountingSettings',
18
+ fields=[
19
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
20
+ ('next_je', models.IntegerField(default=1)),
21
+ ('next_chq', models.IntegerField(default=1)),
22
+ ('next_inv', models.IntegerField(default=1)),
23
+ ],
24
+ ),
25
+ migrations.CreateModel(
26
+ name='AccountType',
27
+ fields=[
28
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
29
+ ('name', models.CharField(max_length=300)),
30
+ ('description', models.TextField(blank=True)),
31
+ ('prefix', models.CharField(blank=True, max_length=300)),
32
+ ('category', models.CharField(choices=[('A', 'Asset'), ('L', 'Liability'), ('E', 'Equity'), ('R', 'Revenue'), ('X', 'Expense')], max_length=30)),
33
+ ('required', models.BooleanField(default=False)),
34
+ ('order', models.IntegerField(default=0)),
35
+ ('debit_positive', models.BooleanField(default=True)),
36
+ ],
37
+ options={
38
+ 'ordering': ('order', 'name'),
39
+ },
40
+ ),
41
+ migrations.CreateModel(
42
+ name='Invoice',
43
+ fields=[
44
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
45
+ ('number', models.CharField(max_length=300)),
46
+ ('archived', models.BooleanField(default=False)),
47
+ ('date_created', models.DateField(auto_now_add=True)),
48
+ ('date', models.DateField(default=django.utils.timezone.now)),
49
+ ('date_paid', models.DateField(blank=True, null=True)),
50
+ ('taxes', models.DecimalField(blank=True, decimal_places=6, default=0, max_digits=21, null=True)),
51
+ ('discount_percent', models.DecimalField(blank=True, decimal_places=6, default=0, max_digits=12, null=True)),
52
+ ('discount_amount', models.DecimalField(blank=True, decimal_places=6, default=0, max_digits=21, null=True)),
53
+ ('on_hold', models.BooleanField(default=False)),
54
+ ('original_amount', models.DecimalField(decimal_places=6, default=0, max_digits=21)),
55
+ ],
56
+ ),
57
+ migrations.CreateModel(
58
+ name='JournalEntry',
59
+ fields=[
60
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
61
+ ('date', models.DateField(default=django.utils.timezone.now)),
62
+ ('number', models.IntegerField()),
63
+ ('description', models.TextField(blank=True)),
64
+ ],
65
+ ),
66
+ migrations.CreateModel(
67
+ name='TaxRate',
68
+ fields=[
69
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
70
+ ('name', models.CharField(default='Default', max_length=300)),
71
+ ('rate', models.DecimalField(blank=True, decimal_places=6, max_digits=12, null=True)),
72
+ ],
73
+ ),
74
+ migrations.CreateModel(
75
+ name='Account',
76
+ fields=[
77
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
78
+ ('number', models.CharField(max_length=300)),
79
+ ('date_created', models.DateField(auto_now_add=True)),
80
+ ('date_archived', models.DateField(blank=True, null=True)),
81
+ ('name', models.CharField(max_length=300)),
82
+ ('description', models.TextField(blank=True)),
83
+ ('required', models.BooleanField(default=False)),
84
+ ('archived', models.BooleanField(default=False)),
85
+ ('reconciliation_required', models.BooleanField(default=False)),
86
+ ('order', models.IntegerField(default=0)),
87
+ ('account_type', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='account_type_accounts', to='axios_accounting.accounttype')),
88
+ ],
89
+ options={
90
+ 'ordering': ('order', 'number'),
91
+ },
92
+ ),
93
+ migrations.CreateModel(
94
+ name='Chargeable',
95
+ fields=[
96
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
97
+ ('name', models.CharField(max_length=300)),
98
+ ('description', models.TextField(blank=True)),
99
+ ('rate', models.DecimalField(blank=True, decimal_places=6, max_digits=21, null=True)),
100
+ ('default', models.BooleanField(default=False)),
101
+ ('archived', models.BooleanField(default=False)),
102
+ ('default_account', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='axios_accounting.account')),
103
+ ],
104
+ ),
105
+ migrations.CreateModel(
106
+ name='Fund',
107
+ fields=[
108
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
109
+ ('name', models.CharField(default='Default', max_length=300)),
110
+ ('date_created', models.DateField(auto_now_add=True)),
111
+ ('date_archived', models.DateField(blank=True, null=True)),
112
+ ('description', models.TextField(blank=True)),
113
+ ('default', models.BooleanField(default=False)),
114
+ ('archived', models.BooleanField(default=False)),
115
+ ('required', models.BooleanField(default=False)),
116
+ ('accounts_payable', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='fund_ap', to='axios_accounting.account')),
117
+ ('accounts_receivable', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='fund_ar', to='axios_accounting.account')),
118
+ ('bank', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='fund_bank', to='axios_accounting.account')),
119
+ ('bank_fees', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='fund_bank_fees', to='axios_accounting.account')),
120
+ ('bank_interest', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='fund_bank_interest', to='axios_accounting.account')),
121
+ ('deposits_in_transit', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='fund_dit', to='axios_accounting.account')),
122
+ ],
123
+ ),
124
+ migrations.AddField(
125
+ model_name='account',
126
+ name='fund',
127
+ field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='fund_accounts', to='axios_accounting.fund'),
128
+ ),
129
+ migrations.CreateModel(
130
+ name='InvoiceLine',
131
+ fields=[
132
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
133
+ ('description', models.TextField(blank=True)),
134
+ ('quantity', models.DecimalField(decimal_places=6, default=1, max_digits=21)),
135
+ ('rate', models.DecimalField(decimal_places=6, default=1, max_digits=21)),
136
+ ('taxes', models.DecimalField(blank=True, decimal_places=6, default=0, max_digits=21, null=True)),
137
+ ('tax_1_rate', models.DecimalField(blank=True, decimal_places=6, default=0, max_digits=12, null=True)),
138
+ ('tax_2_rate', models.DecimalField(blank=True, decimal_places=6, default=0, max_digits=12, null=True)),
139
+ ('tax_3_rate', models.DecimalField(blank=True, decimal_places=6, default=0, max_digits=12, null=True)),
140
+ ('tax_4_rate', models.DecimalField(blank=True, decimal_places=6, default=0, max_digits=12, null=True)),
141
+ ('tax_1_description', models.CharField(blank=True, max_length=300)),
142
+ ('tax_2_description', models.CharField(blank=True, max_length=300)),
143
+ ('tax_3_description', models.CharField(blank=True, max_length=300)),
144
+ ('tax_4_description', models.CharField(blank=True, max_length=300)),
145
+ ('taxes_added', models.TextField(blank=True)),
146
+ ('account', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='axios_accounting.account')),
147
+ ('invoice', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='connected_invoice', to='axios_accounting.invoice')),
148
+ ],
149
+ ),
150
+ migrations.CreateModel(
151
+ name='JournalEntryLine',
152
+ fields=[
153
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
154
+ ('description', models.TextField(blank=True)),
155
+ ('debit', models.DecimalField(blank=True, decimal_places=6, default=0, max_digits=21, null=True)),
156
+ ('credit', models.DecimalField(blank=True, decimal_places=6, default=0, max_digits=21, null=True)),
157
+ ('account', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='account', to='axios_accounting.account')),
158
+ ('journal_entry', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='journal_entry', to='axios_accounting.journalentry')),
159
+ ],
160
+ ),
161
+ migrations.CreateModel(
162
+ name='ChargeableTax',
163
+ fields=[
164
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
165
+ ('chargeable', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='axios_accounting.chargeable')),
166
+ ('tax_rate', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='connected_invoice_lines', to='axios_accounting.taxrate')),
167
+ ],
168
+ ),
169
+ ]
@@ -0,0 +1,43 @@
1
+ # Generated by Django 5.2.9 on 2026-01-07 06:03
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ('axios_accounting', '0001_initial'),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AlterField(
14
+ model_name='invoice',
15
+ name='discount_percent',
16
+ field=models.DecimalField(blank=True, decimal_places=6, default=0, max_digits=21, null=True),
17
+ ),
18
+ migrations.AlterField(
19
+ model_name='invoiceline',
20
+ name='tax_1_rate',
21
+ field=models.DecimalField(blank=True, decimal_places=6, default=0, max_digits=21, null=True),
22
+ ),
23
+ migrations.AlterField(
24
+ model_name='invoiceline',
25
+ name='tax_2_rate',
26
+ field=models.DecimalField(blank=True, decimal_places=6, default=0, max_digits=21, null=True),
27
+ ),
28
+ migrations.AlterField(
29
+ model_name='invoiceline',
30
+ name='tax_3_rate',
31
+ field=models.DecimalField(blank=True, decimal_places=6, default=0, max_digits=21, null=True),
32
+ ),
33
+ migrations.AlterField(
34
+ model_name='invoiceline',
35
+ name='tax_4_rate',
36
+ field=models.DecimalField(blank=True, decimal_places=6, default=0, max_digits=21, null=True),
37
+ ),
38
+ migrations.AlterField(
39
+ model_name='taxrate',
40
+ name='rate',
41
+ field=models.DecimalField(blank=True, decimal_places=6, max_digits=21, null=True),
42
+ ),
43
+ ]
@@ -0,0 +1,28 @@
1
+ # Generated by Django 5.2.9 on 2026-01-07 14:14
2
+
3
+ from django.db import migrations
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ('axios_accounting', '0002_alter_invoice_discount_percent_and_more'),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.RenameField(
14
+ model_name='fund',
15
+ old_name='accounts_payable',
16
+ new_name='ap',
17
+ ),
18
+ migrations.RenameField(
19
+ model_name='fund',
20
+ old_name='accounts_receivable',
21
+ new_name='ar',
22
+ ),
23
+ migrations.RenameField(
24
+ model_name='fund',
25
+ old_name='deposits_in_transit',
26
+ new_name='dit',
27
+ ),
28
+ ]
@@ -0,0 +1,33 @@
1
+ # Generated by Django 5.2.9 on 2026-01-07 14:25
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ('axios_accounting', '0003_rename_accounts_payable_fund_ap_and_more'),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AlterField(
14
+ model_name='invoiceline',
15
+ name='tax_1_rate',
16
+ field=models.DecimalField(blank=True, decimal_places=6, default=0, max_digits=21),
17
+ ),
18
+ migrations.AlterField(
19
+ model_name='invoiceline',
20
+ name='tax_2_rate',
21
+ field=models.DecimalField(blank=True, decimal_places=6, default=0, max_digits=21),
22
+ ),
23
+ migrations.AlterField(
24
+ model_name='invoiceline',
25
+ name='tax_3_rate',
26
+ field=models.DecimalField(blank=True, decimal_places=6, default=0, max_digits=21),
27
+ ),
28
+ migrations.AlterField(
29
+ model_name='invoiceline',
30
+ name='tax_4_rate',
31
+ field=models.DecimalField(blank=True, decimal_places=6, default=0, max_digits=21),
32
+ ),
33
+ ]
@@ -0,0 +1,24 @@
1
+ # Generated by Django 5.2.9 on 2026-01-07 14:48
2
+
3
+ import django.db.models.deletion
4
+ from django.db import migrations, models
5
+
6
+
7
+ class Migration(migrations.Migration):
8
+
9
+ dependencies = [
10
+ ('axios_accounting', '0004_alter_invoiceline_tax_1_rate_and_more'),
11
+ ]
12
+
13
+ operations = [
14
+ migrations.CreateModel(
15
+ name='InvoicePayment',
16
+ fields=[
17
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
18
+ ('date', models.DateField(blank=True)),
19
+ ('amount', models.DecimalField(decimal_places=6, default=0, max_digits=21)),
20
+ ('reference', models.CharField(blank=True, max_length=200)),
21
+ ('invoice', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='invoice_payments', to='axios_accounting.invoice')),
22
+ ],
23
+ ),
24
+ ]
@@ -0,0 +1,23 @@
1
+ # Generated by Django 5.2.9 on 2026-01-07 14:51
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ('axios_accounting', '0005_invoicepayment'),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.CreateModel(
14
+ name='PaymentMethods',
15
+ fields=[
16
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
17
+ ('name', models.CharField(max_length=300)),
18
+ ('code', models.CharField(blank=True, max_length=300)),
19
+ ('required', models.BooleanField(default=False)),
20
+ ('default', models.BooleanField(default=False)),
21
+ ],
22
+ ),
23
+ ]
@@ -0,0 +1,17 @@
1
+ # Generated by Django 5.2.9 on 2026-01-07 14:51
2
+
3
+ from django.db import migrations
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ('axios_accounting', '0006_paymentmethods'),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.RenameModel(
14
+ old_name='PaymentMethods',
15
+ new_name='PaymentMethod',
16
+ ),
17
+ ]
@@ -0,0 +1,19 @@
1
+ # Generated by Django 5.2.9 on 2026-01-07 14:52
2
+
3
+ import django.db.models.deletion
4
+ from django.db import migrations, models
5
+
6
+
7
+ class Migration(migrations.Migration):
8
+
9
+ dependencies = [
10
+ ('axios_accounting', '0007_rename_paymentmethods_paymentmethod'),
11
+ ]
12
+
13
+ operations = [
14
+ migrations.AddField(
15
+ model_name='invoicepayment',
16
+ name='method',
17
+ field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='axios_accounting.paymentmethod'),
18
+ ),
19
+ ]