diff --git a/apply_initial_migrations.sh b/apply_initial_migrations.sh index 386ff6af..e6e88a0f 100755 --- a/apply_initial_migrations.sh +++ b/apply_initial_migrations.sh @@ -1,17 +1,21 @@ #!/bin/sh echo "Delete Old Migrations" -find ./inventory -type f -iname "000*.py" -delete +find ./inventory -type f -iname "00*.py" -delete echo "Delete Old Cache" find ./car_inventory -type d -iname "__pycache__"|xargs rm -rf find ./inventory -type d -iname "__pycache__"|xargs rm -rf + echo "Apply Base Migrate" python3 manage.py migrate -echo "Apply Make Migratinos" + python3 manage.py makemigrations +echo "Apply Appointment Migratinos" +python3 manage.py makemigrations appointment + echo "Apply Final Migrate" python3 manage.py migrate diff --git a/inventory/migrations/0001_initial.py b/inventory/migrations/0001_initial.py index 6d5005e2..17edcafb 100644 --- a/inventory/migrations/0001_initial.py +++ b/inventory/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 5.1.7 on 2025-05-05 16:32 +# Generated by Django 5.1.7 on 2025-05-18 11:18 import datetime import django.core.validators @@ -25,6 +25,24 @@ class Migration(migrations.Migration): ] operations = [ + migrations.CreateModel( + name='Car', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('vin', models.CharField(max_length=17, unique=True, verbose_name='VIN')), + ('year', models.IntegerField(verbose_name='Year')), + ('status', models.CharField(choices=[('available', 'Available'), ('sold', 'Sold'), ('hold', 'Hold'), ('damaged', 'Damaged'), ('reserved', 'Reserved'), ('transfer', 'Transfer')], default='available', max_length=10, verbose_name='Status')), + ('stock_type', models.CharField(choices=[('new', 'New'), ('used', 'Used')], default='new', max_length=10, verbose_name='Stock Type')), + ('remarks', models.TextField(blank=True, null=True, verbose_name='Remarks')), + ('mileage', models.IntegerField(blank=True, null=True, verbose_name='Mileage')), + ('receiving_date', models.DateTimeField(verbose_name='Receiving Date')), + ('hash', models.CharField(blank=True, max_length=64, null=True, verbose_name='Hash')), + ], + options={ + 'verbose_name': 'Car', + 'verbose_name_plural': 'Cars', + }, + ), migrations.CreateModel( name='CarEquipment', fields=[ @@ -122,26 +140,6 @@ class Migration(migrations.Migration): }, bases=(models.Model, inventory.mixins.LocalizedNameMixin), ), - migrations.CreateModel( - name='Car', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('vin', models.CharField(max_length=17, unique=True, verbose_name='VIN')), - ('year', models.IntegerField(verbose_name='Year')), - ('status', models.CharField(choices=[('available', 'Available'), ('sold', 'Sold'), ('hold', 'Hold'), ('damaged', 'Damaged'), ('reserved', 'Reserved'), ('transfer', 'Transfer')], default='available', max_length=10, verbose_name='Status')), - ('stock_type', models.CharField(choices=[('new', 'New'), ('used', 'Used')], default='new', max_length=10, verbose_name='Stock Type')), - ('remarks', models.TextField(blank=True, null=True, verbose_name='Remarks')), - ('mileage', models.IntegerField(blank=True, null=True, verbose_name='Mileage')), - ('receiving_date', models.DateTimeField(verbose_name='Receiving Date')), - ('hash', models.CharField(blank=True, max_length=64, null=True, verbose_name='Hash')), - ('vendor', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, related_name='cars', to='django_ledger.vendormodel', verbose_name='Vendor')), - ('id_car_make', models.ForeignKey(blank=True, db_column='id_car_make', null=True, on_delete=django.db.models.deletion.DO_NOTHING, to='inventory.carmake', verbose_name='Make')), - ], - options={ - 'verbose_name': 'Car', - 'verbose_name_plural': 'Cars', - }, - ), migrations.CreateModel( name='CarFinance', fields=[ @@ -157,6 +155,11 @@ class Migration(migrations.Migration): 'verbose_name_plural': 'Car Financial Details', }, ), + migrations.AddField( + model_name='car', + name='id_car_make', + field=models.ForeignKey(blank=True, db_column='id_car_make', null=True, on_delete=django.db.models.deletion.DO_NOTHING, to='inventory.carmake', verbose_name='Make'), + ), migrations.CreateModel( name='CarModel', fields=[ @@ -343,16 +346,18 @@ class Migration(migrations.Migration): ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('title', models.CharField(choices=[('mr', 'Mr'), ('mrs', 'Mrs'), ('ms', 'Ms'), ('miss', 'Miss'), ('dr', 'Dr'), ('prof', 'Prof'), ('prince', 'Prince'), ('princess', 'Princess'), ('company', 'Company'), ('na', 'N/A')], default='na', max_length=10, verbose_name='Title')), ('first_name', models.CharField(max_length=50, verbose_name='First Name')), - ('middle_name', models.CharField(blank=True, max_length=50, null=True, verbose_name='Middle Name')), ('last_name', models.CharField(max_length=50, verbose_name='Last Name')), ('gender', models.CharField(choices=[('m', 'Male'), ('f', 'Female')], max_length=1, verbose_name='Gender')), - ('dob', models.DateField(verbose_name='Date of Birth')), + ('dob', models.DateField(blank=True, null=True, verbose_name='Date of Birth')), ('email', models.EmailField(max_length=254, unique=True, verbose_name='Email')), - ('national_id', models.CharField(max_length=10, unique=True, verbose_name='National ID')), + ('national_id', models.CharField(blank=True, max_length=10, null=True, unique=True, verbose_name='National ID')), ('phone_number', phonenumber_field.modelfields.PhoneNumberField(max_length=128, region='SA', unique=True, verbose_name='Phone Number')), ('address', models.CharField(blank=True, max_length=200, null=True, verbose_name='Address')), + ('active', models.BooleanField(default=True, verbose_name='Active')), + ('image', models.ImageField(blank=True, null=True, upload_to='customers/', verbose_name='Image')), ('created', models.DateTimeField(auto_now_add=True, verbose_name='Created')), ('updated', models.DateTimeField(auto_now=True, verbose_name='Updated')), + ('customer_model', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='django_ledger.customermodel')), ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='customer_profile', to=settings.AUTH_USER_MODEL)), ('dealer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='customers', to='inventory.dealer')), ], @@ -413,7 +418,7 @@ class Migration(migrations.Migration): fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('object_id', models.PositiveIntegerField()), - ('activity_type', models.CharField(choices=[('call', 'Call'), ('sms', 'SMS'), ('email', 'Email'), ('whatsapp', 'WhatsApp'), ('visit', 'Visit'), ('add_car', 'Add Car'), ('sale_car', 'Sale Car'), ('reserve_car', 'Reserve Car'), ('transfer_car', 'Transfer Car'), ('remove_car', 'Remove Car'), ('create_quotation', 'Create Quotation'), ('cancel_quotation', 'Cancel Quotation'), ('create_order', 'Create Order'), ('cancel_order', 'Cancel Order'), ('create_invoice', 'Create Invoice'), ('cancel_invoice', 'Cancel Invoice')], max_length=50, verbose_name='Activity Type')), + ('activity_type', models.CharField(choices=[('call', 'Call'), ('sms', 'SMS'), ('email', 'Email'), ('whatsapp', 'WhatsApp'), ('visit', 'Visit'), ('negotiation', 'Negotiation'), ('follow_up', 'Follow Up'), ('won', 'Won'), ('lost', 'Lost'), ('closed', 'Closed'), ('converted', 'Converted'), ('transfer', 'Transfer'), ('add_car', 'Add Car'), ('sale_car', 'Sale Car'), ('reserve_car', 'Reserve Car'), ('transfer_car', 'Transfer Car'), ('remove_car', 'Remove Car'), ('create_quotation', 'Create Quotation'), ('cancel_quotation', 'Cancel Quotation'), ('create_order', 'Create Order'), ('cancel_order', 'Cancel Order'), ('create_invoice', 'Create Invoice'), ('cancel_invoice', 'Cancel Invoice')], max_length=50, verbose_name='Activity Type')), ('notes', models.TextField(blank=True, null=True, verbose_name='Notes')), ('created', models.DateTimeField(auto_now_add=True, verbose_name='Created')), ('updated', models.DateTimeField(auto_now=True, verbose_name='Updated')), @@ -460,35 +465,6 @@ class Migration(migrations.Migration): 'verbose_name_plural': 'Emails', }, ), - migrations.CreateModel( - name='Lead', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('first_name', models.CharField(max_length=50, verbose_name='First Name')), - ('last_name', models.CharField(max_length=50, verbose_name='Last Name')), - ('email', models.EmailField(max_length=254, verbose_name='Email')), - ('phone_number', phonenumber_field.modelfields.PhoneNumberField(max_length=128, region='SA', verbose_name='Phone Number')), - ('lead_type', models.CharField(choices=[('customer', 'Customer'), ('organization', 'Organization')], default='customer', max_length=50, verbose_name='Lead Type')), - ('year', models.PositiveSmallIntegerField(blank=True, null=True, verbose_name='Year')), - ('source', models.CharField(choices=[('referrals', 'Referrals'), ('whatsapp', 'WhatsApp'), ('showroom', 'Showroom'), ('tiktok', 'TikTok'), ('instagram', 'Instagram'), ('x', 'X'), ('facebook', 'Facebook'), ('motory', 'Motory'), ('influencers', 'Influencers'), ('youtube', 'Youtube'), ('campaign', 'Campaign')], max_length=50, verbose_name='Source')), - ('channel', models.CharField(choices=[('walk_in', 'Walk In'), ('toll_free', 'Toll Free'), ('website', 'Website'), ('email', 'Email'), ('form', 'Form')], max_length=50, verbose_name='Channel')), - ('crn', models.CharField(blank=True, max_length=10, null=True, unique=True, verbose_name='Commercial Registration Number')), - ('vrn', models.CharField(blank=True, max_length=15, null=True, unique=True, verbose_name='VAT Registration Number')), - ('address', models.CharField(max_length=50, verbose_name='address')), - ('priority', models.CharField(choices=[('low', 'Low'), ('medium', 'Medium'), ('high', 'High')], default='medium', max_length=10, verbose_name='Priority')), - ('status', models.CharField(choices=[('new', 'New'), ('pending', 'Pending'), ('in_progress', 'In Progress'), ('qualified', 'Qualified'), ('contacted', 'Contacted'), ('converted', 'Converted'), ('canceled', 'Canceled')], db_index=True, default='new', max_length=50, verbose_name='Status')), - ('created', models.DateTimeField(auto_now_add=True, db_index=True, verbose_name='Created')), - ('updated', models.DateTimeField(auto_now=True, verbose_name='Updated')), - ('customer', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='leads', to='django_ledger.customermodel')), - ('dealer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='leads', to='inventory.dealer')), - ('id_car_make', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.DO_NOTHING, to='inventory.carmake', verbose_name='Make')), - ('id_car_model', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.DO_NOTHING, to='inventory.carmodel', verbose_name='Model')), - ], - options={ - 'verbose_name': 'Lead', - 'verbose_name_plural': 'Leads', - }, - ), migrations.CreateModel( name='Notes', fields=[ @@ -528,12 +504,16 @@ class Migration(migrations.Migration): ('arabic_name', models.CharField(max_length=255, verbose_name='Arabic Name')), ('crn', models.CharField(max_length=15, verbose_name='Commercial Registration Number')), ('vrn', models.CharField(max_length=15, verbose_name='VAT Registration Number')), + ('email', models.EmailField(max_length=254, verbose_name='Email')), ('phone_number', phonenumber_field.modelfields.PhoneNumberField(max_length=128, region='SA', verbose_name='Phone Number')), ('address', models.CharField(blank=True, max_length=200, null=True, verbose_name='Address')), ('logo', models.ImageField(blank=True, null=True, upload_to='logos', verbose_name='Logo')), + ('active', models.BooleanField(default=True, verbose_name='Active')), ('created', models.DateTimeField(auto_now_add=True, verbose_name='Created')), ('updated', models.DateTimeField(auto_now=True, verbose_name='Updated')), + ('customer_model', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='django_ledger.customermodel')), ('dealer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='organizations', to='inventory.dealer')), + ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='organization_profile', to=settings.AUTH_USER_MODEL)), ], options={ 'verbose_name': 'Organization', @@ -541,6 +521,40 @@ class Migration(migrations.Migration): }, bases=(models.Model, inventory.mixins.LocalizedNameMixin), ), + migrations.CreateModel( + name='Lead', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('first_name', models.CharField(max_length=50, verbose_name='First Name')), + ('last_name', models.CharField(max_length=50, verbose_name='Last Name')), + ('email', models.EmailField(max_length=254, verbose_name='Email')), + ('phone_number', phonenumber_field.modelfields.PhoneNumberField(max_length=128, region='SA', verbose_name='Phone Number')), + ('lead_type', models.CharField(choices=[('customer', 'Customer'), ('organization', 'Organization')], default='customer', max_length=50, verbose_name='Lead Type')), + ('year', models.PositiveSmallIntegerField(blank=True, null=True, verbose_name='Year')), + ('source', models.CharField(choices=[('referrals', 'Referrals'), ('whatsapp', 'WhatsApp'), ('showroom', 'Showroom'), ('tiktok', 'TikTok'), ('instagram', 'Instagram'), ('x', 'X'), ('facebook', 'Facebook'), ('motory', 'Motory'), ('influencers', 'Influencers'), ('youtube', 'Youtube'), ('campaign', 'Campaign')], max_length=50, verbose_name='Source')), + ('channel', models.CharField(choices=[('walk_in', 'Walk In'), ('toll_free', 'Toll Free'), ('website', 'Website'), ('email', 'Email'), ('form', 'Form')], max_length=50, verbose_name='Channel')), + ('crn', models.CharField(blank=True, max_length=10, null=True, unique=True, verbose_name='Commercial Registration Number')), + ('vrn', models.CharField(blank=True, max_length=15, null=True, unique=True, verbose_name='VAT Registration Number')), + ('address', models.CharField(max_length=50, verbose_name='address')), + ('priority', models.CharField(choices=[('low', 'Low'), ('medium', 'Medium'), ('high', 'High')], default='medium', max_length=10, verbose_name='Priority')), + ('status', models.CharField(choices=[('new', 'New'), ('follow_up', 'Follow-up'), ('negotiation', 'Negotiation'), ('won', 'Won'), ('lost', 'Lost'), ('closed', 'Closed')], db_index=True, default='new', max_length=50, verbose_name='Status')), + ('next_action', models.CharField(blank=True, max_length=255, null=True, verbose_name='Next Action')), + ('next_action_date', models.DateTimeField(blank=True, null=True, verbose_name='Next Action Date')), + ('is_converted', models.BooleanField(default=False)), + ('converted_at', models.DateTimeField(blank=True, null=True)), + ('created', models.DateTimeField(auto_now_add=True, db_index=True, verbose_name='Created')), + ('updated', models.DateTimeField(auto_now=True, verbose_name='Updated')), + ('customer', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='customer_leads', to='inventory.customer')), + ('dealer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='leads', to='inventory.dealer')), + ('id_car_make', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.DO_NOTHING, to='inventory.carmake', verbose_name='Make')), + ('id_car_model', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.DO_NOTHING, to='inventory.carmodel', verbose_name='Model')), + ('organization', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='organization_leads', to='inventory.organization')), + ], + options={ + 'verbose_name': 'Lead', + 'verbose_name_plural': 'Leads', + }, + ), migrations.CreateModel( name='Refund', fields=[ @@ -636,15 +650,14 @@ class Migration(migrations.Migration): name='Opportunity', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('stage', models.CharField(choices=[('prospect', 'Prospect'), ('proposal', 'Proposal'), ('negotiation', 'Negotiation'), ('closed_won', 'Closed Won'), ('closed_lost', 'Closed Lost')], max_length=20, verbose_name='Stage')), - ('status', models.CharField(choices=[('new', 'New'), ('pending', 'Pending'), ('in_progress', 'In Progress'), ('qualified', 'Qualified'), ('contacted', 'Contacted'), ('converted', 'Converted'), ('canceled', 'Canceled')], default='new', max_length=20, verbose_name='Status')), + ('stage', models.CharField(choices=[('discovery', 'Discovery'), ('proposal', 'Proposal'), ('negotiation', 'Negotiation'), ('closed_won', 'Closed Won'), ('closed_lost', 'Closed Lost')], max_length=20, verbose_name='Stage')), ('probability', models.PositiveIntegerField(validators=[inventory.models.validate_probability])), + ('expected_revenue', models.DecimalField(decimal_places=2, max_digits=10, verbose_name='Expected Revenue')), ('closing_date', models.DateField(blank=True, null=True, verbose_name='Closing Date')), ('created', models.DateTimeField(auto_now_add=True, verbose_name='Created')), ('updated', models.DateTimeField(auto_now=True, verbose_name='Updated')), - ('closed', models.BooleanField(default=False, verbose_name='Closed')), ('car', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='inventory.car', verbose_name='Car')), - ('customer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='opportunities', to='django_ledger.customermodel')), + ('customer', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='opportunities', to='django_ledger.customermodel')), ('dealer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='opportunities', to='inventory.dealer')), ('estimate', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='opportunity', to='django_ledger.estimatemodel')), ('lead', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='opportunity', to='inventory.lead')), @@ -659,8 +672,8 @@ class Migration(migrations.Migration): name='LeadStatusHistory', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('old_status', models.CharField(choices=[('new', 'New'), ('pending', 'Pending'), ('in_progress', 'In Progress'), ('qualified', 'Qualified'), ('contacted', 'Contacted'), ('converted', 'Converted'), ('canceled', 'Canceled')], max_length=50, verbose_name='Old Status')), - ('new_status', models.CharField(choices=[('new', 'New'), ('pending', 'Pending'), ('in_progress', 'In Progress'), ('qualified', 'Qualified'), ('contacted', 'Contacted'), ('converted', 'Converted'), ('canceled', 'Canceled')], max_length=50, verbose_name='New Status')), + ('old_status', models.CharField(choices=[('new', 'New'), ('follow_up', 'Follow-up'), ('negotiation', 'Negotiation'), ('won', 'Won'), ('lost', 'Lost'), ('closed', 'Closed')], max_length=50, verbose_name='Old Status')), + ('new_status', models.CharField(choices=[('new', 'New'), ('follow_up', 'Follow-up'), ('negotiation', 'Negotiation'), ('won', 'Won'), ('lost', 'Lost'), ('closed', 'Closed')], max_length=50, verbose_name='New Status')), ('changed_at', models.DateTimeField(auto_now_add=True, verbose_name='Changed At')), ('lead', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='status_history', to='inventory.lead')), ('changed_by', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, related_name='status_changes', to='inventory.staff')), @@ -675,6 +688,27 @@ class Migration(migrations.Migration): name='staff', field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='assigned', to='inventory.staff', verbose_name='Assigned'), ), + migrations.CreateModel( + name='Tasks', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('object_id', models.UUIDField()), + ('title', models.CharField(max_length=255, verbose_name='Title')), + ('description', models.TextField(blank=True, null=True, verbose_name='Description')), + ('due_date', models.DateField(verbose_name='Due Date')), + ('completed', models.BooleanField(default=False, verbose_name='Completed')), + ('created', models.DateTimeField(auto_now_add=True, verbose_name='Created')), + ('updated', models.DateTimeField(auto_now=True, verbose_name='Updated')), + ('assigned_to', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='tasks_assigned', to=settings.AUTH_USER_MODEL)), + ('content_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='contenttypes.contenttype')), + ('created_by', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, related_name='tasks_created', to=settings.AUTH_USER_MODEL)), + ('dealer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='tasks', to='inventory.dealer')), + ], + options={ + 'verbose_name': 'Task', + 'verbose_name_plural': 'Tasks', + }, + ), migrations.CreateModel( name='UserActivityLog', fields=[ @@ -704,7 +738,7 @@ class Migration(migrations.Migration): ('logo', models.ImageField(blank=True, null=True, upload_to='logos/vendors', verbose_name='Logo')), ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Created At')), ('dealer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='vendors', to='inventory.dealer')), - ('vendor_model', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='django_ledger.vendormodel', verbose_name='Vendor Model')), + ('vendor_model', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.DO_NOTHING, to='django_ledger.vendormodel', verbose_name='Vendor Model')), ], options={ 'verbose_name': 'Vendor', @@ -712,6 +746,11 @@ class Migration(migrations.Migration): }, bases=(models.Model, inventory.mixins.LocalizedNameMixin), ), + migrations.AddField( + model_name='car', + name='vendor', + field=models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, related_name='cars', to='inventory.vendor', verbose_name='Vendor'), + ), migrations.CreateModel( name='CarReservation', fields=[ diff --git a/inventory/migrations/0002_alter_vendor_vendor_model.py b/inventory/migrations/0002_alter_vendor_vendor_model.py deleted file mode 100644 index 01ce0129..00000000 --- a/inventory/migrations/0002_alter_vendor_vendor_model.py +++ /dev/null @@ -1,20 +0,0 @@ -# Generated by Django 5.1.7 on 2025-05-06 12:57 - -import django.db.models.deletion -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('django_ledger', '0021_alter_bankaccountmodel_account_model_and_more'), - ('inventory', '0001_initial'), - ] - - operations = [ - migrations.AlterField( - model_name='vendor', - name='vendor_model', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.DO_NOTHING, to='django_ledger.vendormodel', verbose_name='Vendor Model'), - ), - ] diff --git a/inventory/migrations/0003_alter_car_vendor.py b/inventory/migrations/0003_alter_car_vendor.py deleted file mode 100644 index 35ce3d2c..00000000 --- a/inventory/migrations/0003_alter_car_vendor.py +++ /dev/null @@ -1,19 +0,0 @@ -# Generated by Django 5.1.7 on 2025-05-06 14:31 - -import django.db.models.deletion -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('inventory', '0002_alter_vendor_vendor_model'), - ] - - operations = [ - migrations.AlterField( - model_name='car', - name='vendor', - field=models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, related_name='cars', to='inventory.vendor', verbose_name='Vendor'), - ), - ] diff --git a/inventory/migrations/0004_customer_image.py b/inventory/migrations/0004_customer_image.py deleted file mode 100644 index 1edce473..00000000 --- a/inventory/migrations/0004_customer_image.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 5.1.7 on 2025-05-06 14:49 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('inventory', '0003_alter_car_vendor'), - ] - - operations = [ - migrations.AddField( - model_name='customer', - name='image', - field=models.ImageField(blank=True, null=True, upload_to='customers/', verbose_name='Image'), - ), - ] diff --git a/inventory/migrations/0005_customer_customer_model.py b/inventory/migrations/0005_customer_customer_model.py deleted file mode 100644 index 5eb7c725..00000000 --- a/inventory/migrations/0005_customer_customer_model.py +++ /dev/null @@ -1,20 +0,0 @@ -# Generated by Django 5.1.7 on 2025-05-06 14:54 - -import django.db.models.deletion -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('django_ledger', '0021_alter_bankaccountmodel_account_model_and_more'), - ('inventory', '0004_customer_image'), - ] - - operations = [ - migrations.AddField( - model_name='customer', - name='customer_model', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='django_ledger.customermodel'), - ), - ] diff --git a/inventory/migrations/0006_remove_customer_middle_name_customer_active.py b/inventory/migrations/0006_remove_customer_middle_name_customer_active.py deleted file mode 100644 index 67754c52..00000000 --- a/inventory/migrations/0006_remove_customer_middle_name_customer_active.py +++ /dev/null @@ -1,22 +0,0 @@ -# Generated by Django 5.1.7 on 2025-05-06 15:38 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('inventory', '0005_customer_customer_model'), - ] - - operations = [ - migrations.RemoveField( - model_name='customer', - name='middle_name', - ), - migrations.AddField( - model_name='customer', - name='active', - field=models.BooleanField(default=True, verbose_name='Active'), - ), - ] diff --git a/inventory/migrations/0007_customer_customer_type.py b/inventory/migrations/0007_customer_customer_type.py deleted file mode 100644 index 9cfd37f3..00000000 --- a/inventory/migrations/0007_customer_customer_type.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 5.1.7 on 2025-05-06 16:35 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('inventory', '0006_remove_customer_middle_name_customer_active'), - ] - - operations = [ - migrations.AddField( - model_name='customer', - name='customer_type', - field=models.CharField(blank=True, choices=[('customer', 'Customer'), ('organization', 'Organization')], default='customer', max_length=15, null=True, verbose_name='Customer Type'), - ), - ] diff --git a/inventory/migrations/0008_remove_customer_customer_type_and_more.py b/inventory/migrations/0008_remove_customer_customer_type_and_more.py deleted file mode 100644 index 7014d7f2..00000000 --- a/inventory/migrations/0008_remove_customer_customer_type_and_more.py +++ /dev/null @@ -1,32 +0,0 @@ -# Generated by Django 5.1.7 on 2025-05-07 09:33 - -import django.db.models.deletion -from django.conf import settings -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('django_ledger', '0021_alter_bankaccountmodel_account_model_and_more'), - ('inventory', '0007_customer_customer_type'), - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ] - - operations = [ - migrations.RemoveField( - model_name='customer', - name='customer_type', - ), - migrations.AddField( - model_name='organization', - name='customer_model', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='django_ledger.customermodel'), - ), - migrations.AddField( - model_name='organization', - name='user', - field=models.OneToOneField(default=1, on_delete=django.db.models.deletion.CASCADE, related_name='organization_profile', to=settings.AUTH_USER_MODEL), - preserve_default=False, - ), - ] diff --git a/inventory/migrations/0009_organization_email.py b/inventory/migrations/0009_organization_email.py deleted file mode 100644 index 9a2d93b6..00000000 --- a/inventory/migrations/0009_organization_email.py +++ /dev/null @@ -1,19 +0,0 @@ -# Generated by Django 5.1.7 on 2025-05-07 09:44 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('inventory', '0008_remove_customer_customer_type_and_more'), - ] - - operations = [ - migrations.AddField( - model_name='organization', - name='email', - field=models.EmailField(default='t@tenhal.sa', max_length=254, verbose_name='Email'), - preserve_default=False, - ), - ] diff --git a/inventory/migrations/0010_organization_active.py b/inventory/migrations/0010_organization_active.py deleted file mode 100644 index ceeb249f..00000000 --- a/inventory/migrations/0010_organization_active.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 5.1.7 on 2025-05-07 09:46 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('inventory', '0009_organization_email'), - ] - - operations = [ - migrations.AddField( - model_name='organization', - name='active', - field=models.BooleanField(default=True, verbose_name='Active'), - ), - ] diff --git a/inventory/migrations/0011_lead_organization_alter_lead_customer.py b/inventory/migrations/0011_lead_organization_alter_lead_customer.py deleted file mode 100644 index 7432315a..00000000 --- a/inventory/migrations/0011_lead_organization_alter_lead_customer.py +++ /dev/null @@ -1,24 +0,0 @@ -# Generated by Django 5.1.7 on 2025-05-07 14:32 - -import django.db.models.deletion -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('inventory', '0010_organization_active'), - ] - - operations = [ - migrations.AddField( - model_name='lead', - name='organization', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='organization_leads', to='inventory.organization'), - ), - migrations.AlterField( - model_name='lead', - name='customer', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='customer_leads', to='inventory.customer'), - ), - ] diff --git a/inventory/migrations/0012_alter_customer_dob_alter_customer_national_id.py b/inventory/migrations/0012_alter_customer_dob_alter_customer_national_id.py deleted file mode 100644 index 82f162e2..00000000 --- a/inventory/migrations/0012_alter_customer_dob_alter_customer_national_id.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 5.1.7 on 2025-05-08 10:09 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('inventory', '0011_lead_organization_alter_lead_customer'), - ] - - operations = [ - migrations.AlterField( - model_name='customer', - name='dob', - field=models.DateField(blank=True, null=True, verbose_name='Date of Birth'), - ), - migrations.AlterField( - model_name='customer', - name='national_id', - field=models.CharField(blank=True, max_length=10, null=True, unique=True, verbose_name='National ID'), - ), - ] diff --git a/inventory/migrations/0013_lead_converted_at.py b/inventory/migrations/0013_lead_converted_at.py deleted file mode 100644 index 07376e8d..00000000 --- a/inventory/migrations/0013_lead_converted_at.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 5.1.7 on 2025-05-11 14:12 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('inventory', '0012_alter_customer_dob_alter_customer_national_id'), - ] - - operations = [ - migrations.AddField( - model_name='lead', - name='converted_at', - field=models.DateTimeField(blank=True, null=True), - ), - ] diff --git a/inventory/migrations/0014_lead_is_converted_alter_lead_status_and_more.py b/inventory/migrations/0014_lead_is_converted_alter_lead_status_and_more.py deleted file mode 100644 index c74834a2..00000000 --- a/inventory/migrations/0014_lead_is_converted_alter_lead_status_and_more.py +++ /dev/null @@ -1,50 +0,0 @@ -# Generated by Django 5.1.7 on 2025-05-11 14:26 - -import django.db.models.deletion -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('inventory', '0013_lead_converted_at'), - ] - - operations = [ - migrations.AddField( - model_name='lead', - name='is_converted', - field=models.BooleanField(default=False), - ), - migrations.AlterField( - model_name='lead', - name='status', - field=models.CharField(choices=[('new', 'New'), ('follow_up', 'Needs Follow-up'), ('negotiation', 'Under Negotiation'), ('won', 'Converted'), ('lost', 'Lost'), ('closed', 'Closed')], db_index=True, default='new', max_length=50, verbose_name='Status'), - ), - migrations.AlterField( - model_name='leadstatushistory', - name='new_status', - field=models.CharField(choices=[('new', 'New'), ('follow_up', 'Needs Follow-up'), ('negotiation', 'Under Negotiation'), ('won', 'Converted'), ('lost', 'Lost'), ('closed', 'Closed')], max_length=50, verbose_name='New Status'), - ), - migrations.AlterField( - model_name='leadstatushistory', - name='old_status', - field=models.CharField(choices=[('new', 'New'), ('follow_up', 'Needs Follow-up'), ('negotiation', 'Under Negotiation'), ('won', 'Converted'), ('lost', 'Lost'), ('closed', 'Closed')], max_length=50, verbose_name='Old Status'), - ), - migrations.AlterField( - model_name='opportunity', - name='status', - field=models.CharField(choices=[('new', 'New'), ('follow_up', 'Needs Follow-up'), ('negotiation', 'Under Negotiation'), ('won', 'Converted'), ('lost', 'Lost'), ('closed', 'Closed')], default='new', max_length=20, verbose_name='Status'), - ), - migrations.CreateModel( - name='LeadActivity', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('action', models.CharField(max_length=255)), - ('notes', models.TextField(blank=True)), - ('timestamp', models.DateTimeField(auto_now_add=True)), - ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='inventory.staff')), - ('lead', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='activities', to='inventory.lead')), - ], - ), - ] diff --git a/inventory/migrations/0015_lead_next_action_lead_next_action_date.py b/inventory/migrations/0015_lead_next_action_lead_next_action_date.py deleted file mode 100644 index e16fac75..00000000 --- a/inventory/migrations/0015_lead_next_action_lead_next_action_date.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 5.1.7 on 2025-05-11 14:32 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('inventory', '0014_lead_is_converted_alter_lead_status_and_more'), - ] - - operations = [ - migrations.AddField( - model_name='lead', - name='next_action', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='Next Action'), - ), - migrations.AddField( - model_name='lead', - name='next_action_date', - field=models.DateTimeField(blank=True, null=True, verbose_name='Next Action Date'), - ), - ] diff --git a/inventory/migrations/0016_alter_activity_activity_type_delete_leadactivity.py b/inventory/migrations/0016_alter_activity_activity_type_delete_leadactivity.py deleted file mode 100644 index 8375c340..00000000 --- a/inventory/migrations/0016_alter_activity_activity_type_delete_leadactivity.py +++ /dev/null @@ -1,21 +0,0 @@ -# Generated by Django 5.1.7 on 2025-05-11 15:17 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('inventory', '0015_lead_next_action_lead_next_action_date'), - ] - - operations = [ - migrations.AlterField( - model_name='activity', - name='activity_type', - field=models.CharField(choices=[('call', 'Call'), ('sms', 'SMS'), ('email', 'Email'), ('whatsapp', 'WhatsApp'), ('visit', 'Visit'), ('negotiation', 'Negotiation'), ('won', 'Won'), ('lost', 'Lost'), ('closed', 'Closed'), ('converted', 'Converted'), ('transfer', 'Transfer'), ('add_car', 'Add Car'), ('sale_car', 'Sale Car'), ('reserve_car', 'Reserve Car'), ('transfer_car', 'Transfer Car'), ('remove_car', 'Remove Car'), ('create_quotation', 'Create Quotation'), ('cancel_quotation', 'Cancel Quotation'), ('create_order', 'Create Order'), ('cancel_order', 'Cancel Order'), ('create_invoice', 'Create Invoice'), ('cancel_invoice', 'Cancel Invoice')], max_length=50, verbose_name='Activity Type'), - ), - migrations.DeleteModel( - name='LeadActivity', - ), - ] diff --git a/inventory/migrations/0017_alter_activity_activity_type.py b/inventory/migrations/0017_alter_activity_activity_type.py deleted file mode 100644 index cfda3309..00000000 --- a/inventory/migrations/0017_alter_activity_activity_type.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 5.1.7 on 2025-05-11 15:19 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('inventory', '0016_alter_activity_activity_type_delete_leadactivity'), - ] - - operations = [ - migrations.AlterField( - model_name='activity', - name='activity_type', - field=models.CharField(choices=[('call', 'Call'), ('sms', 'SMS'), ('email', 'Email'), ('whatsapp', 'WhatsApp'), ('visit', 'Visit'), ('negotiation', 'Negotiation'), ('follow_up', 'Follow Up'), ('won', 'Won'), ('lost', 'Lost'), ('closed', 'Closed'), ('converted', 'Converted'), ('transfer', 'Transfer'), ('add_car', 'Add Car'), ('sale_car', 'Sale Car'), ('reserve_car', 'Reserve Car'), ('transfer_car', 'Transfer Car'), ('remove_car', 'Remove Car'), ('create_quotation', 'Create Quotation'), ('cancel_quotation', 'Cancel Quotation'), ('create_order', 'Create Order'), ('cancel_order', 'Cancel Order'), ('create_invoice', 'Create Invoice'), ('cancel_invoice', 'Cancel Invoice')], max_length=50, verbose_name='Activity Type'), - ), - ] diff --git a/inventory/migrations/0018_remove_opportunity_closed_remove_opportunity_status_and_more.py b/inventory/migrations/0018_remove_opportunity_closed_remove_opportunity_status_and_more.py deleted file mode 100644 index d0914faa..00000000 --- a/inventory/migrations/0018_remove_opportunity_closed_remove_opportunity_status_and_more.py +++ /dev/null @@ -1,44 +0,0 @@ -# Generated by Django 5.1.7 on 2025-05-13 15:19 - -import django.db.models.deletion -from django.conf import settings -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('contenttypes', '0002_remove_content_type_name'), - ('inventory', '0017_alter_activity_activity_type'), - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ] - - operations = [ - migrations.RemoveField( - model_name='opportunity', - name='closed', - ), - migrations.RemoveField( - model_name='opportunity', - name='status', - ), - migrations.CreateModel( - name='Tasks', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('object_id', models.UUIDField()), - ('title', models.CharField(max_length=255, verbose_name='Title')), - ('description', models.TextField(blank=True, null=True, verbose_name='Description')), - ('due_date', models.DateField(verbose_name='Due Date')), - ('created', models.DateTimeField(auto_now_add=True, verbose_name='Created')), - ('updated', models.DateTimeField(auto_now=True, verbose_name='Updated')), - ('assigned_to', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='tasks_assigned', to=settings.AUTH_USER_MODEL)), - ('content_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='contenttypes.contenttype')), - ('created_by', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, related_name='tasks_created', to=settings.AUTH_USER_MODEL)), - ], - options={ - 'verbose_name': 'Task', - 'verbose_name_plural': 'Tasks', - }, - ), - ] diff --git a/inventory/migrations/0019_tasks_dealer.py b/inventory/migrations/0019_tasks_dealer.py deleted file mode 100644 index 3216f502..00000000 --- a/inventory/migrations/0019_tasks_dealer.py +++ /dev/null @@ -1,20 +0,0 @@ -# Generated by Django 5.1.7 on 2025-05-13 16:22 - -import django.db.models.deletion -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('inventory', '0018_remove_opportunity_closed_remove_opportunity_status_and_more'), - ] - - operations = [ - migrations.AddField( - model_name='tasks', - name='dealer', - field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, related_name='tasks', to='inventory.dealer'), - preserve_default=False, - ), - ] diff --git a/inventory/migrations/0020_tasks_completed.py b/inventory/migrations/0020_tasks_completed.py deleted file mode 100644 index 430f05ae..00000000 --- a/inventory/migrations/0020_tasks_completed.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 5.1.7 on 2025-05-13 16:57 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('inventory', '0019_tasks_dealer'), - ] - - operations = [ - migrations.AddField( - model_name='tasks', - name='completed', - field=models.BooleanField(default=False, verbose_name='Completed'), - ), - ] diff --git a/inventory/migrations/0021_alter_lead_status_alter_leadstatushistory_new_status_and_more.py b/inventory/migrations/0021_alter_lead_status_alter_leadstatushistory_new_status_and_more.py deleted file mode 100644 index dd4ce570..00000000 --- a/inventory/migrations/0021_alter_lead_status_alter_leadstatushistory_new_status_and_more.py +++ /dev/null @@ -1,28 +0,0 @@ -# Generated by Django 5.1.7 on 2025-05-14 10:29 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('inventory', '0020_tasks_completed'), - ] - - operations = [ - migrations.AlterField( - model_name='lead', - name='status', - field=models.CharField(choices=[('new', 'New'), ('follow_up', 'Follow-up'), ('negotiation', 'Negotiation'), ('won', 'Won'), ('lost', 'Lost'), ('closed', 'Closed')], db_index=True, default='new', max_length=50, verbose_name='Status'), - ), - migrations.AlterField( - model_name='leadstatushistory', - name='new_status', - field=models.CharField(choices=[('new', 'New'), ('follow_up', 'Follow-up'), ('negotiation', 'Negotiation'), ('won', 'Won'), ('lost', 'Lost'), ('closed', 'Closed')], max_length=50, verbose_name='New Status'), - ), - migrations.AlterField( - model_name='leadstatushistory', - name='old_status', - field=models.CharField(choices=[('new', 'New'), ('follow_up', 'Follow-up'), ('negotiation', 'Negotiation'), ('won', 'Won'), ('lost', 'Lost'), ('closed', 'Closed')], max_length=50, verbose_name='Old Status'), - ), - ] diff --git a/inventory/migrations/0022_opportunity_expected_revenue.py b/inventory/migrations/0022_opportunity_expected_revenue.py deleted file mode 100644 index 28364144..00000000 --- a/inventory/migrations/0022_opportunity_expected_revenue.py +++ /dev/null @@ -1,19 +0,0 @@ -# Generated by Django 5.1.7 on 2025-05-14 10:41 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('inventory', '0021_alter_lead_status_alter_leadstatushistory_new_status_and_more'), - ] - - operations = [ - migrations.AddField( - model_name='opportunity', - name='expected_revenue', - field=models.DecimalField(decimal_places=2, default=0, max_digits=10, verbose_name='Expected Revenue'), - preserve_default=False, - ), - ] diff --git a/inventory/migrations/0023_alter_opportunity_stage.py b/inventory/migrations/0023_alter_opportunity_stage.py deleted file mode 100644 index 7e64e011..00000000 --- a/inventory/migrations/0023_alter_opportunity_stage.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 5.1.7 on 2025-05-14 10:58 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('inventory', '0022_opportunity_expected_revenue'), - ] - - operations = [ - migrations.AlterField( - model_name='opportunity', - name='stage', - field=models.CharField(choices=[('discovery', 'Discovery'), ('proposal', 'Proposal'), ('negotiation', 'Negotiation'), ('closed_won', 'Closed Won'), ('closed_lost', 'Closed Lost')], max_length=20, verbose_name='Stage'), - ), - ] diff --git a/inventory/migrations/0024_alter_opportunity_customer.py b/inventory/migrations/0024_alter_opportunity_customer.py deleted file mode 100644 index 69c45cfb..00000000 --- a/inventory/migrations/0024_alter_opportunity_customer.py +++ /dev/null @@ -1,20 +0,0 @@ -# Generated by Django 5.1.7 on 2025-05-14 10:59 - -import django.db.models.deletion -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('django_ledger', '0021_alter_bankaccountmodel_account_model_and_more'), - ('inventory', '0023_alter_opportunity_stage'), - ] - - operations = [ - migrations.AlterField( - model_name='opportunity', - name='customer', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='opportunities', to='django_ledger.customermodel'), - ), - ] diff --git a/staticfiles/images/customers/image.png b/staticfiles/images/customers/image.png new file mode 100644 index 00000000..fb612b2b Binary files /dev/null and b/staticfiles/images/customers/image.png differ diff --git a/staticfiles/images/logos/vendors/image.png b/staticfiles/images/logos/vendors/image.png new file mode 100644 index 00000000..fb612b2b Binary files /dev/null and b/staticfiles/images/logos/vendors/image.png differ diff --git a/staticfiles/images/logos/vendors/logo-for-the-word-daju-48a980.jpg b/staticfiles/images/logos/vendors/logo-for-the-word-daju-48a980.jpg new file mode 100644 index 00000000..f2cfb1d9 Binary files /dev/null and b/staticfiles/images/logos/vendors/logo-for-the-word-daju-48a980.jpg differ diff --git a/templates/crm/leads/lead_form.html b/templates/crm/leads/lead_form.html index 9cbf14b9..db8da5da 100644 --- a/templates/crm/leads/lead_form.html +++ b/templates/crm/leads/lead_form.html @@ -9,14 +9,16 @@
{% csrf_token %} {{ form|crispy }} - - - {{ _("Cancel") }} - +
+ + {% trans "Cancel" %} +
+ {% endblock %} \ No newline at end of file diff --git a/templates/crm/opportunities/opportunity_form.html b/templates/crm/opportunities/opportunity_form.html index 882a0494..f4cd3815 100644 --- a/templates/crm/opportunities/opportunity_form.html +++ b/templates/crm/opportunities/opportunity_form.html @@ -135,13 +135,13 @@
diff --git a/templates/customers/customer_form.html b/templates/customers/customer_form.html index 93cdb37c..3ecab573 100644 --- a/templates/customers/customer_form.html +++ b/templates/customers/customer_form.html @@ -26,12 +26,11 @@ {% csrf_token %} {{ form|crispy }}
- - - {{ _("Cancel") }} - + {% trans "Cancel" %}
diff --git a/templates/inventory/add_colors.html b/templates/inventory/add_colors.html index f3eabfcc..c66cfc03 100644 --- a/templates/inventory/add_colors.html +++ b/templates/inventory/add_colors.html @@ -51,12 +51,30 @@ -
+ {% comment %}
- - {% trans "Cancel" %} + + {% trans "Cancel" %}
+
{% endcomment %} + + + + {% comment %}
+
+
+ + {% trans "Cancel" %} +
+
+
{% endcomment %} + +
+ + {% trans "Cancel" %}
+ +
diff --git a/templates/inventory/car_finance_form.html b/templates/inventory/car_finance_form.html index ffc0957d..0492b80e 100644 --- a/templates/inventory/car_finance_form.html +++ b/templates/inventory/car_finance_form.html @@ -35,13 +35,30 @@ {{ form|crispy }} -
+ {% comment %}
- - {% trans "Cancel" %} + + {% trans "Cancel" %}
+
{% endcomment %} + +
+ + + + {% trans "Cancel" %}
+ + + + + + +
diff --git a/templates/inventory/color_palette.html b/templates/inventory/color_palette.html index 8ee35566..1a94db52 100644 --- a/templates/inventory/color_palette.html +++ b/templates/inventory/color_palette.html @@ -103,9 +103,10 @@
- - {% trans "Cancel" %} + + {% trans "Cancel" %}
+ diff --git a/templates/items/expenses/expense_create.html b/templates/items/expenses/expense_create.html index ab481975..d01b4b45 100644 --- a/templates/items/expenses/expense_create.html +++ b/templates/items/expenses/expense_create.html @@ -13,7 +13,14 @@
{% csrf_token %} {{ form|crispy }} - + + {% comment %} {% endcomment %} + +
+ + {% trans "Cancel" %} +
+
diff --git a/templates/items/expenses/expenses_list.html b/templates/items/expenses/expenses_list.html index 1641921b..ef969958 100644 --- a/templates/items/expenses/expenses_list.html +++ b/templates/items/expenses/expenses_list.html @@ -8,7 +8,8 @@

{% trans "Expenses" %}

- {% trans "Add Expense" %} + {% trans "Add Expense" %} +
diff --git a/templates/items/service/service_create.html b/templates/items/service/service_create.html index a33fa82e..371417c9 100644 --- a/templates/items/service/service_create.html +++ b/templates/items/service/service_create.html @@ -19,7 +19,11 @@
{% csrf_token %} {{ form|crispy }} - +
+ + {% trans "Cancel" %} +
+
diff --git a/templates/items/service/service_list.html b/templates/items/service/service_list.html index 6c671ef5..ad0390b0 100644 --- a/templates/items/service/service_list.html +++ b/templates/items/service/service_list.html @@ -8,7 +8,8 @@

{% trans "Services" %}

- {% trans "Add Service" %} + {% trans "Add Service" %} +
diff --git a/templates/ledger/bank_accounts/bank_account_form.html b/templates/ledger/bank_accounts/bank_account_form.html index f4ee8077..584cd6b0 100644 --- a/templates/ledger/bank_accounts/bank_account_form.html +++ b/templates/ledger/bank_accounts/bank_account_form.html @@ -26,12 +26,12 @@ {% for error in form.errors %}
{{ error }}
{% endfor %} -
- - {% trans "Cancel" %} + {% trans "Cancel" %}
diff --git a/templates/ledger/bank_accounts/bank_account_list.html b/templates/ledger/bank_accounts/bank_account_list.html index 3bc1ee50..e66a0ed1 100644 --- a/templates/ledger/bank_accounts/bank_account_list.html +++ b/templates/ledger/bank_accounts/bank_account_list.html @@ -8,7 +8,7 @@

{% trans "Bank Accounts" %}

- {% trans "Add Bank Account" %} + {% trans "Add Bank Account" %}
diff --git a/templates/ledger/bills/bill_form.html b/templates/ledger/bills/bill_form.html index 1bcf200a..96f540cf 100644 --- a/templates/ledger/bills/bill_form.html +++ b/templates/ledger/bills/bill_form.html @@ -37,10 +37,12 @@
-
- - {% trans "Cancel" %} + +
+ + {% trans "Cancel" %}
+
{% endblock content %} diff --git a/templates/ledger/bills/bill_list.html b/templates/ledger/bills/bill_list.html index b202f2b9..6299e12f 100644 --- a/templates/ledger/bills/bill_list.html +++ b/templates/ledger/bills/bill_list.html @@ -13,7 +13,7 @@
- + {% trans 'New Bill' %}
diff --git a/templates/ledger/coa_accounts/account_form.html b/templates/ledger/coa_accounts/account_form.html index bc091284..91dbb86f 100644 --- a/templates/ledger/coa_accounts/account_form.html +++ b/templates/ledger/coa_accounts/account_form.html @@ -26,11 +26,15 @@
{{ error }}
{% endfor %}
- - {% trans "Cancel"|capfirst %} + + {% trans "Cancel" %}
+
diff --git a/templates/ledger/coa_accounts/account_list.html b/templates/ledger/coa_accounts/account_list.html index 1a26535e..59f4ab28 100644 --- a/templates/ledger/coa_accounts/account_list.html +++ b/templates/ledger/coa_accounts/account_list.html @@ -13,7 +13,7 @@
- + {% trans 'New Account' %}

diff --git a/templates/ledger/journal_entry/journal_entry_form.html b/templates/ledger/journal_entry/journal_entry_form.html index 69cb8e7d..cc9eeb62 100644 --- a/templates/ledger/journal_entry/journal_entry_form.html +++ b/templates/ledger/journal_entry/journal_entry_form.html @@ -13,8 +13,8 @@ {{ form|crispy }}

- - {% trans "Cancel" %} + + {% trans "Cancel" %}
diff --git a/templates/ledger/ledger/ledger_form.html b/templates/ledger/ledger/ledger_form.html index b059f3f3..0b99fc7b 100644 --- a/templates/ledger/ledger/ledger_form.html +++ b/templates/ledger/ledger/ledger_form.html @@ -12,10 +12,17 @@
{{ form|crispy }}
-
+ {% comment %}
- {% trans "Cancel" %} -
+ {% trans "Cancel" %} +
{% endcomment %} + +
+ + {% trans "Cancel" %} +
+ + {% endblock content %} \ No newline at end of file diff --git a/templates/ledger/ledger/ledger_list.html b/templates/ledger/ledger/ledger_list.html index 46088f18..ff29a128 100644 --- a/templates/ledger/ledger/ledger_list.html +++ b/templates/ledger/ledger/ledger_list.html @@ -10,7 +10,7 @@
- + {% trans 'Create Ledger' %}
diff --git a/templates/organizations/organization_form.html b/templates/organizations/organization_form.html index 5b9b0b17..18735536 100644 --- a/templates/organizations/organization_form.html +++ b/templates/organizations/organization_form.html @@ -12,13 +12,8 @@ {% csrf_token %} {{ redirect_field }} {{ form|crispy }} - - - {% trans "Cancel" %} - + + {% trans "Cancel" %}
diff --git a/templates/sales/estimates/estimate_form.html b/templates/sales/estimates/estimate_form.html index d69e8706..c5b8d197 100644 --- a/templates/sales/estimates/estimate_form.html +++ b/templates/sales/estimates/estimate_form.html @@ -50,21 +50,34 @@
- +
- +
+ -
- - {% trans "Cancel" %} -
+ {% comment %}
+ + {% trans "Cancel" %} +
{% endcomment %} +
+ + + + {% trans "Cancel" %} +
+ + + {% endblock content %} diff --git a/templates/sales/estimates/estimate_list.html b/templates/sales/estimates/estimate_list.html index d9d9e172..43a7670a 100644 --- a/templates/sales/estimates/estimate_list.html +++ b/templates/sales/estimates/estimate_list.html @@ -46,7 +46,7 @@ - + {% trans "view"|capfirst %} diff --git a/templates/sales/invoices/invoice_list.html b/templates/sales/invoices/invoice_list.html index eb88c962..62ed321e 100644 --- a/templates/sales/invoices/invoice_list.html +++ b/templates/sales/invoices/invoice_list.html @@ -54,13 +54,14 @@ {% endif %} {{ invoice.created }} - - + - + {% trans "View" %} + {% empty %} diff --git a/templates/sales/payments/payment_list.html b/templates/sales/payments/payment_list.html index e4c1c592..2c2c268b 100644 --- a/templates/sales/payments/payment_list.html +++ b/templates/sales/payments/payment_list.html @@ -41,8 +41,8 @@ {% endif %} {{ journal.timestamp }} {{ journal.description }} - - {% trans "View Tranactions" %} + + {% trans "View Tranactions"|capfirst %} {% empty %} diff --git a/templates/vendors/vendor_form.html b/templates/vendors/vendor_form.html index 243681b0..1d5ccf90 100644 --- a/templates/vendors/vendor_form.html +++ b/templates/vendors/vendor_form.html @@ -34,13 +34,14 @@ {% for error in form.errors %}
{{ error }}
{% endfor %} -
- {% trans "Cancel"|capfirst %} - + {{ _("Save") }} + + {% trans "Cancel" %}
+ diff --git a/templates/vendors/vendors_list.html b/templates/vendors/vendors_list.html index 5ceaac80..a8955a39 100644 --- a/templates/vendors/vendors_list.html +++ b/templates/vendors/vendors_list.html @@ -15,7 +15,7 @@
- {{ _("Add Vendor") }} + {{ _("Add Vendor") }}