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.
- axios_accounting-0.1/PKG-INFO +4 -0
- axios_accounting-0.1/README.txt +29 -0
- axios_accounting-0.1/axios_accounting/__init__.py +0 -0
- axios_accounting-0.1/axios_accounting/admin.py +28 -0
- axios_accounting-0.1/axios_accounting/apps.py +10 -0
- axios_accounting-0.1/axios_accounting/fields.py +194 -0
- axios_accounting-0.1/axios_accounting/migrations/0001_initial.py +169 -0
- axios_accounting-0.1/axios_accounting/migrations/0002_alter_invoice_discount_percent_and_more.py +43 -0
- axios_accounting-0.1/axios_accounting/migrations/0003_rename_accounts_payable_fund_ap_and_more.py +28 -0
- axios_accounting-0.1/axios_accounting/migrations/0004_alter_invoiceline_tax_1_rate_and_more.py +33 -0
- axios_accounting-0.1/axios_accounting/migrations/0005_invoicepayment.py +24 -0
- axios_accounting-0.1/axios_accounting/migrations/0006_paymentmethods.py +23 -0
- axios_accounting-0.1/axios_accounting/migrations/0007_rename_paymentmethods_paymentmethod.py +17 -0
- axios_accounting-0.1/axios_accounting/migrations/0008_invoicepayment_method.py +19 -0
- axios_accounting-0.1/axios_accounting/migrations/0009_alter_fund_ap_alter_fund_ar_alter_fund_bank_and_more.py +44 -0
- axios_accounting-0.1/axios_accounting/migrations/0010_invoice_bad_debt_journal_entry_invoice_journal_entry.py +24 -0
- axios_accounting-0.1/axios_accounting/migrations/0011_invoice_fund.py +19 -0
- axios_accounting-0.1/axios_accounting/migrations/0012_fund_expense_taxes_paid_fund_sales_taxes_collected.py +24 -0
- axios_accounting-0.1/axios_accounting/migrations/0013_rename_sales_taxes_collected_fund_tax_collected_and_more.py +23 -0
- axios_accounting-0.1/axios_accounting/migrations/0014_client_vendor.py +35 -0
- axios_accounting-0.1/axios_accounting/migrations/0015_invoice_issued_to.py +19 -0
- axios_accounting-0.1/axios_accounting/migrations/0016_journalentryline_client_journalentryline_invoice_and_more.py +29 -0
- axios_accounting-0.1/axios_accounting/migrations/0017_invoicepayment_journal_entry.py +19 -0
- axios_accounting-0.1/axios_accounting/migrations/0018_paymentmethod_auto_deposit.py +18 -0
- axios_accounting-0.1/axios_accounting/migrations/__init__.py +0 -0
- axios_accounting-0.1/axios_accounting/models.py +361 -0
- axios_accounting-0.1/axios_accounting/signals.py +33 -0
- axios_accounting-0.1/axios_accounting/tests/test_basics.py +70 -0
- axios_accounting-0.1/axios_accounting/tests/test_invoices.py +114 -0
- axios_accounting-0.1/axios_accounting/tests/utils.py +12 -0
- axios_accounting-0.1/axios_accounting/urls.py +7 -0
- axios_accounting-0.1/axios_accounting/utils/accounts.py +21 -0
- axios_accounting-0.1/axios_accounting/utils/misc.py +104 -0
- axios_accounting-0.1/axios_accounting/utils/receivables.py +149 -0
- axios_accounting-0.1/axios_accounting/views.py +3 -0
- axios_accounting-0.1/axios_accounting.egg-info/PKG-INFO +4 -0
- axios_accounting-0.1/axios_accounting.egg-info/SOURCES.txt +39 -0
- axios_accounting-0.1/axios_accounting.egg-info/dependency_links.txt +1 -0
- axios_accounting-0.1/axios_accounting.egg-info/top_level.txt +1 -0
- axios_accounting-0.1/pyproject.toml +8 -0
- axios_accounting-0.1/setup.cfg +4 -0
|
@@ -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,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
|
+
]
|
axios_accounting-0.1/axios_accounting/migrations/0002_alter_invoice_discount_percent_and_more.py
ADDED
|
@@ -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
|
+
]
|
axios_accounting-0.1/axios_accounting/migrations/0003_rename_accounts_payable_fund_ap_and_more.py
ADDED
|
@@ -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
|
+
]
|
axios_accounting-0.1/axios_accounting/migrations/0004_alter_invoiceline_tax_1_rate_and_more.py
ADDED
|
@@ -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
|
+
]
|