From 38c1c5d44e0bc16c07c9e070aec20eca4214071b Mon Sep 17 00:00:00 2001 From: Marwan Alwali Date: Thu, 26 Dec 2024 13:05:23 +0300 Subject: [PATCH] update --- .gitignore | 2 +- .../__pycache__/settings.cpython-311.pyc | Bin 6326 -> 6326 bytes car_inventory/settings.py | 28 +- inventory/__pycache__/forms.cpython-311.pyc | Bin 17770 -> 18298 bytes inventory/__pycache__/models.cpython-311.pyc | Bin 51514 -> 51827 bytes inventory/__pycache__/urls.cpython-311.pyc | Bin 12175 -> 12175 bytes inventory/__pycache__/views.cpython-311.pyc | Bin 74797 -> 74799 bytes inventory/migrations/0001_initial.py | 332 ----------------- ..._subscription_subscriptionplan_and_more.py | 335 ------------------ ...dditionalservices_display_name_and_more.py | 23 -- ...4_remove_additionalservices_arabic_name.py | 17 - .../0005_additionalservices_arabic_name.py | 19 - ...6_remove_additionalservices_arabic_name.py | 17 - .../0007_additionalservices_arabic_name.py | 19 - .../migrations/0008_salequotation_status.py | 18 - ...09_salequotation_date_approved_and_more.py | 48 --- ...er_salequotation_date_approved_and_more.py | 43 --- .../migrations/0011_salequotation_posted.py | 18 - .../0012_salequotation_payment_id.py | 18 - .../migrations/0013_salequotation_is_paid.py | 18 - inventory/migrations/0014_payment_refund.py | 43 --- .../0015_alter_salequotation_payment_id.py | 18 - inventory/migrations/0016_dealer_joined_at.py | 20 -- inventory/migrations/0017_dealer_email.py | 19 - .../0018_additionalservices_taxable.py | 18 - ...ove_additionalservices_taxable_and_more.py | 21 -- inventory/migrations/0020_dealer_entity.py | 20 -- .../0031_remove_salequotation_entity.py | 17 - ...ove_additionalservices_vatable_and_more.py | 22 -- .../__pycache__/0001_initial.cpython-311.pyc | Bin 18658 -> 0 bytes 30 files changed, 15 insertions(+), 1138 deletions(-) delete mode 100644 inventory/migrations/0001_initial.py delete mode 100644 inventory/migrations/0002_additionalservices_subscription_subscriptionplan_and_more.py delete mode 100644 inventory/migrations/0003_remove_additionalservices_display_name_and_more.py delete mode 100644 inventory/migrations/0004_remove_additionalservices_arabic_name.py delete mode 100644 inventory/migrations/0005_additionalservices_arabic_name.py delete mode 100644 inventory/migrations/0006_remove_additionalservices_arabic_name.py delete mode 100644 inventory/migrations/0007_additionalservices_arabic_name.py delete mode 100644 inventory/migrations/0008_salequotation_status.py delete mode 100644 inventory/migrations/0009_salequotation_date_approved_and_more.py delete mode 100644 inventory/migrations/0010_alter_salequotation_date_approved_and_more.py delete mode 100644 inventory/migrations/0011_salequotation_posted.py delete mode 100644 inventory/migrations/0012_salequotation_payment_id.py delete mode 100644 inventory/migrations/0013_salequotation_is_paid.py delete mode 100644 inventory/migrations/0014_payment_refund.py delete mode 100644 inventory/migrations/0015_alter_salequotation_payment_id.py delete mode 100644 inventory/migrations/0016_dealer_joined_at.py delete mode 100644 inventory/migrations/0017_dealer_email.py delete mode 100644 inventory/migrations/0018_additionalservices_taxable.py delete mode 100644 inventory/migrations/0019_remove_additionalservices_taxable_and_more.py delete mode 100644 inventory/migrations/0020_dealer_entity.py delete mode 100644 inventory/migrations/0031_remove_salequotation_entity.py delete mode 100644 inventory/migrations/0032_remove_additionalservices_vatable_and_more.py delete mode 100644 inventory/migrations/__pycache__/0001_initial.cpython-311.pyc diff --git a/.gitignore b/.gitignore index efee2015..139c47eb 100644 --- a/.gitignore +++ b/.gitignore @@ -6,7 +6,7 @@ __pycache__ **/*__pycache__ db.sqlite3 media -./car_inventory/settings* +car_inventory/settings.py # Backup files # *.bak diff --git a/car_inventory/__pycache__/settings.cpython-311.pyc b/car_inventory/__pycache__/settings.cpython-311.pyc index ea64c42248a00efa3c88385dc95244083abc2b2a..30ea380fd857661a0bb7cb1745d3b9e140a20244 100644 GIT binary patch delta 19 ZcmdmHxXqAjIWI340}z<1Z{%7d0RS=U1b+Yk delta 19 ZcmdmHxXqAjIWI340}#Ab*~qm<0suBF1vCHv diff --git a/car_inventory/settings.py b/car_inventory/settings.py index 13064782..8d0ad84f 100644 --- a/car_inventory/settings.py +++ b/car_inventory/settings.py @@ -104,24 +104,24 @@ WSGI_APPLICATION = 'car_inventory.wsgi.application' # Database # https://docs.djangoproject.com/en/5.0/ref/settings/#databases -# DATABASES = { -# "default": { -# "ENGINE": "django_prometheus.db.backends.postgresql", -# "NAME": "murad_haikal", -# "USER": "f95166", -# "PASSWORD": "Kfsh&rc9788", -# "HOST": "localhost", -# "PORT": 5432, -# } -# } - DATABASES = { - 'default': { - 'ENGINE': 'django.db.backends.sqlite3', - 'NAME': 'db.sqlite3', + "default": { + "ENGINE": "django_prometheus.db.backends.postgresql", + "NAME": "haikal", + "USER": "f95166", + "PASSWORD": "Kfsh&rc9788", + "HOST": "localhost", + "PORT": 5432, } } +# DATABASES = { +# 'default': { +# 'ENGINE': 'django.db.backends.sqlite3', +# 'NAME': 'db.sqlite3', +# } +# } + # Password validation # https://docs.djangoproject.com/en/5.0/ref/settings/#auth-password-validators diff --git a/inventory/__pycache__/forms.cpython-311.pyc b/inventory/__pycache__/forms.cpython-311.pyc index 8dd7b9af8ed4f61a6e4c41394b13e768e6f1150c..454a569f4d1b6d3e540841e5a82e6cacaad2dd6c 100644 GIT binary patch delta 4273 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 F{|9m2r$7Jz delta 3758 zcmaJ^eQZ=*|^oHQm*>NtrVJIxXTX$k>?p#`N~918Sn3wXwU1gFn_;XWs$ znMxwMvQkmBa3)$!Y@+MfhV6z#{pSq{H*^~ta{ps>%+xg24Kv2uDpn_Ky9~ilZp3tk zfw$rbn6(y+2M#*j@C$Pnyk^^B)y(NwN`gjv@2V0l6(rwA;75J+mM$Fnh5fJCYnCn8=N-aa zCvg(A33E5?d2^iwbCZ=1_`8W~HG*b}^R#A~X;vqz(GIi{-7sA?7V zyk75&ZgU*xQ!BQ{_%?;7J`s&3)5%OUx;=NeHpK3uRLPc|0Oc+xIn9~Z8<%7`8qG3( z2&pPV*sNdQnBm8_oee*Ti<(u<#4-~q-%0Gd2?~e9AEN2Q z1dkAWnqY)r4?=|R6&W{;<2^7}pICH4H>@HA6vZG#F>BO}$%Kd^p49Ztc|7-$$HeU9>$aeYAB4+|bIm39+d*=41+)t3P+Xo!NHFKGwH!yvVZ3&MMM1DY z#qBTeIe}|I+kzLGEt$rkr{fY&kv1T0rkE@X_p}O1gJev`3N=B?lLVh75GPFKuqcI~ z$?IW9px>Ls{5$LYP0cA>4_bsZ&8)^IB@Qs#?Dmr`%^Fuysbq#f`w{9+!+di+I||pD zhikt~cb0U_J#0I7uTPM_vlJee- z6x`l1Sm&Q8?FGw7RZ+S8HqKAOyMBMY&@cMXVn?7Q;J1E<#6qGyWNAon3go~MJ#<+S zI%oSS_6&TzePgLnCy5jp{Q=Hjz#8p>JA&>q=PO?%c7m@#I(Uz6;l;w?u+aU!I4&;H z3v47P?0iWC_$N3&2eYA;avK+kmEc=&C6u>ukt$Jcren8h#U)x6NBb0w9)bC;d)ugH z@Fx(mdbQ9jaYa^mNxitUdo6nzp6cp%QbeaLoz#~3Wzyg&XyC8mTDjo#D@f))Cm`XV zbK!>a{?!$ep3De_!^Cwq1jm7tqFx2z(( zm*KrN{Y-(@wf@2HAtP1@QCz-CiggYei3(%E5muNFyVUDAovO)inyaE$#bqg$z67u~ zGa$CUbe|&0rAxvbtq^<{w)H0Mq(e;M4QCzvviCxjsPPn9ehvZNu=T;EJN-WKWGH`^ zR1;%S&i@MMzZQ?6jeRvm;lPIjD1E<8yoKw<6`5C(f-?jhL9->2Y9^V+(_J|Ek2=n} z`zI9apjfyTb#V>O-xZ(ECss)hsV74PllYcY(vn`Vo~ISsT~T3O^2FaH9s-K7I*ag+ z8N-MF-gdOiJ6hhZcEK0d9oF4{ldc=c>!ZH)$h*XKu0e8f2!D_BtDL(#fgv5MIOOTX(_J4ZW~;L&eAR@+)M3 z;2k)&A>Yfd2#0rUlp4Bebv1%!PbQ-2iPS!c=U>k-zp=Koe!7UgD3@p#?~6cmZz>PO zqtkyN{&xtjBB&*oN4VIqQyS-zDy1n;CZ$Dr@^_N_BZ0UCOTJb9M9Ty>Xz*@hC@=^i4F=FCW`aT(iKRD9FmYsUIFr2pFh z7dLklcdClw`gAhf%Jd%fJ{cnTCu|9iID{KC4fa4bd}*4hjaHQyi={`EXePE#med|D zyk12s_8}!9$rKXt)g``##0QG_co6Sb@k|pB2+^fQKNKxX^b}Dy#8nU}AmXH1c9S96 tRhxl}Mj*BoM2jETHl&oqge-01248X|EqDCx>qaxN{vT;PSONe5 diff --git a/inventory/__pycache__/models.cpython-311.pyc b/inventory/__pycache__/models.cpython-311.pyc index 061c2f58ab7e031b23f1db82061ff2c14649682f..17809036c51f29468f80d011fd5e988f32824c97 100644 GIT binary patch delta 12843 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 z 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 delta 768 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 delta 6238 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 Ise-Nk2Nnhz0{{R3 diff --git a/inventory/migrations/0001_initial.py b/inventory/migrations/0001_initial.py deleted file mode 100644 index aa3b2b0b..00000000 --- a/inventory/migrations/0001_initial.py +++ /dev/null @@ -1,332 +0,0 @@ -# Generated by Django 5.1.4 on 2024-12-09 13:58 - -import django.db.models.deletion -import inventory.mixins -import phonenumber_field.modelfields -from decimal import Decimal -from django.conf import settings -from django.db import migrations, models - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ] - - 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')], 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')), - ], - options={ - 'verbose_name': 'Car', - 'verbose_name_plural': 'Cars', - }, - ), - migrations.CreateModel( - name='CarMake', - fields=[ - ('id_car_make', models.AutoField(primary_key=True, serialize=False)), - ('name', models.CharField(max_length=255)), - ('arabic_name', models.CharField(max_length=255)), - ('logo', models.ImageField(blank=True, null=True, upload_to='car_make', verbose_name='logo')), - ('is_sa_import', models.BooleanField(default=False)), - ], - options={ - 'verbose_name': 'Make', - }, - bases=(models.Model, inventory.mixins.LocalizedNameMixin), - ), - migrations.CreateModel( - name='ExteriorColors', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=255, verbose_name='Name')), - ('arabic_name', models.CharField(max_length=255, verbose_name='Arabic Name')), - ('rgb', models.CharField(blank=True, max_length=24, null=True, verbose_name='RGB')), - ], - options={ - 'verbose_name': 'Exterior Colors', - 'verbose_name_plural': 'Exterior Colors', - }, - bases=(models.Model, inventory.mixins.LocalizedNameMixin), - ), - migrations.CreateModel( - name='InteriorColors', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=255, verbose_name='Name')), - ('arabic_name', models.CharField(max_length=255, verbose_name='Arabic Name')), - ('rgb', models.CharField(blank=True, max_length=24, null=True, verbose_name='RGB')), - ], - options={ - 'verbose_name': 'Interior Colors', - 'verbose_name_plural': 'Interior Colors', - }, - bases=(models.Model, inventory.mixins.LocalizedNameMixin), - ), - migrations.CreateModel( - name='CarFinance', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('cost_price', models.DecimalField(decimal_places=2, max_digits=14, verbose_name='Cost Price')), - ('selling_price', models.DecimalField(decimal_places=2, max_digits=14, verbose_name='Selling Price')), - ('profit_margin', models.DecimalField(decimal_places=2, editable=False, max_digits=14, verbose_name='Profit Margin')), - ('discount_amount', models.DecimalField(decimal_places=2, default=Decimal('0.00'), max_digits=14, verbose_name='Discount Amount')), - ('registration_fee', models.DecimalField(decimal_places=2, default=Decimal('0.00'), max_digits=14, verbose_name='Registration Fee')), - ('administration_fee', models.DecimalField(decimal_places=2, default=Decimal('0.00'), max_digits=14, verbose_name='Administration Fee')), - ('transportation_fee', models.DecimalField(decimal_places=2, default=Decimal('0.00'), max_digits=14, verbose_name='Transportation Fee')), - ('custom_card_fee', models.DecimalField(decimal_places=2, default=Decimal('0.00'), max_digits=14, verbose_name='Custom Card Fee')), - ('vat_rate', models.DecimalField(decimal_places=2, default=Decimal('0.15'), max_digits=14, verbose_name='VAT Rate')), - ('administration_vat_amount', models.DecimalField(decimal_places=2, default=Decimal('0.00'), editable=False, max_digits=12, verbose_name='Administration VAT')), - ('transportation_vat_amount', models.DecimalField(decimal_places=2, default=Decimal('0.00'), editable=False, max_digits=12, verbose_name='Transportation VAT')), - ('custom_card_vat_amount', models.DecimalField(decimal_places=2, default=Decimal('0.00'), editable=False, max_digits=12, verbose_name='Custom Card VAT')), - ('selling_vat_amount', models.DecimalField(decimal_places=2, default=Decimal('0.00'), editable=False, max_digits=12, verbose_name='Selling VAT')), - ('total_vat_amount', models.DecimalField(decimal_places=2, default=Decimal('0.00'), editable=False, max_digits=12, verbose_name='Total VAT')), - ('total_before_vat', models.DecimalField(decimal_places=2, default=Decimal('0.00'), editable=False, max_digits=14, verbose_name='Total Before VAT')), - ('total', models.DecimalField(decimal_places=2, default=Decimal('0.00'), editable=False, max_digits=14, verbose_name='Total Amount')), - ('car', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='finances', to='inventory.car')), - ], - ), - 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=[ - ('id_car_model', models.AutoField(primary_key=True, serialize=False)), - ('name', models.CharField(max_length=255)), - ('arabic_name', models.CharField(max_length=255)), - ('id_car_make', models.ForeignKey(db_column='id_car_make', on_delete=django.db.models.deletion.DO_NOTHING, to='inventory.carmake')), - ], - options={ - 'verbose_name': 'Model', - }, - bases=(models.Model, inventory.mixins.LocalizedNameMixin), - ), - migrations.AddField( - model_name='car', - name='id_car_model', - field=models.ForeignKey(blank=True, db_column='id_car_model', null=True, on_delete=django.db.models.deletion.DO_NOTHING, to='inventory.carmodel', verbose_name='Model'), - ), - migrations.CreateModel( - name='CarRegistration', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('plate_number', models.IntegerField(verbose_name='Plate Number')), - ('text1', models.CharField(max_length=1, verbose_name='Text 1')), - ('text2', models.CharField(max_length=1, verbose_name='Text 2')), - ('text3', models.CharField(max_length=1, verbose_name='Text 3')), - ('registration_date', models.DateTimeField(verbose_name='Registration Date')), - ('car', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='registrations', to='inventory.car', verbose_name='Car')), - ], - options={ - 'verbose_name': 'Registration', - 'verbose_name_plural': 'Registrations', - }, - ), - migrations.CreateModel( - name='CarSerie', - fields=[ - ('id_car_serie', models.AutoField(primary_key=True, serialize=False)), - ('name', models.CharField(max_length=255)), - ('arabic_name', models.CharField(max_length=255)), - ('id_car_model', models.ForeignKey(db_column='id_car_model', on_delete=django.db.models.deletion.DO_NOTHING, to='inventory.carmodel')), - ], - options={ - 'verbose_name': 'Series', - }, - bases=(models.Model, inventory.mixins.LocalizedNameMixin), - ), - migrations.AddField( - model_name='car', - name='id_car_serie', - field=models.ForeignKey(blank=True, db_column='id_car_serie', null=True, on_delete=django.db.models.deletion.DO_NOTHING, to='inventory.carserie', verbose_name='Series'), - ), - migrations.CreateModel( - name='CarSpecification', - fields=[ - ('id_car_specification', models.AutoField(primary_key=True, serialize=False)), - ('name', models.CharField(max_length=255)), - ('arabic_name', models.CharField(max_length=255)), - ('id_parent', models.ForeignKey(blank=True, db_column='id_parent', null=True, on_delete=django.db.models.deletion.DO_NOTHING, to='inventory.carspecification')), - ], - options={ - 'verbose_name': 'Specification', - }, - bases=(models.Model, inventory.mixins.LocalizedNameMixin), - ), - migrations.CreateModel( - name='CarTrim', - fields=[ - ('id_car_trim', models.AutoField(primary_key=True, serialize=False)), - ('name', models.CharField(max_length=255)), - ('arabic_name', models.CharField(max_length=255)), - ('start_production_year', models.IntegerField(blank=True, null=True)), - ('end_production_year', models.IntegerField(blank=True, null=True)), - ('id_car_serie', models.ForeignKey(db_column='id_car_serie', on_delete=django.db.models.deletion.DO_NOTHING, to='inventory.carserie')), - ], - options={ - 'verbose_name': 'Trim', - }, - bases=(models.Model, inventory.mixins.LocalizedNameMixin), - ), - migrations.CreateModel( - name='CarSpecificationValue', - fields=[ - ('id_car_specification_value', models.AutoField(primary_key=True, serialize=False)), - ('value', models.CharField(max_length=500)), - ('unit', models.CharField(blank=True, max_length=255, null=True)), - ('id_car_specification', models.ForeignKey(db_column='id_car_specification', on_delete=django.db.models.deletion.DO_NOTHING, to='inventory.carspecification')), - ('id_car_trim', models.ForeignKey(db_column='id_car_trim', on_delete=django.db.models.deletion.DO_NOTHING, to='inventory.cartrim')), - ], - options={ - 'verbose_name': 'Specification Value', - }, - ), - migrations.AddField( - model_name='car', - name='id_car_trim', - field=models.ForeignKey(blank=True, db_column='id_car_trim', null=True, on_delete=django.db.models.deletion.DO_NOTHING, to='inventory.cartrim', verbose_name='Trim'), - ), - migrations.CreateModel( - name='CustomCard', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('custom_number', models.CharField(max_length=255, verbose_name='Custom Number')), - ('custom_date', models.DateField(verbose_name='Custom Date')), - ('car', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='custom_cards', to='inventory.car', verbose_name='Car')), - ], - options={ - 'verbose_name': 'Custom Card', - 'verbose_name_plural': 'Custom Cards', - }, - ), - migrations.CreateModel( - name='Dealer', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('crn', models.CharField(max_length=10, verbose_name='Commercial Registration Number')), - ('vrn', models.CharField(max_length=15, verbose_name='VAT Registration Number')), - ('arabic_name', models.CharField(max_length=255, verbose_name='Arabic Name')), - ('name', models.CharField(max_length=255, verbose_name='English Name')), - ('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/users', verbose_name='Logo')), - ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='dealer', to=settings.AUTH_USER_MODEL)), - ], - options={ - 'verbose_name': 'Dealer', - 'verbose_name_plural': 'Dealers', - }, - bases=(models.Model, inventory.mixins.LocalizedNameMixin), - ), - migrations.CreateModel( - name='Customer', - 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')), - ('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')), - ('email', models.EmailField(max_length=254, unique=True, verbose_name='Email')), - ('national_id', models.CharField(max_length=10, 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')), - ('created', models.DateTimeField(auto_now_add=True, verbose_name='Created')), - ('dealer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='customers', to='inventory.dealer')), - ], - options={ - 'verbose_name': 'Customer', - 'verbose_name_plural': 'Customers', - }, - ), - migrations.AddField( - model_name='car', - name='dealer', - field=models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, related_name='cars', to='inventory.dealer', verbose_name='Dealer'), - ), - migrations.CreateModel( - name='SaleQuotation', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('remarks', models.TextField(blank=True, null=True)), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('customer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='inventory.customer')), - ], - ), - migrations.CreateModel( - name='SaleQuotationCar', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('car', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='inventory.car')), - ('financial_details', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='quotation_finances', to='inventory.carfinance')), - ('quotation', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='quotation_cars', to='inventory.salequotation')), - ], - ), - migrations.CreateModel( - name='Vendor', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('crn', models.CharField(max_length=10, unique=True, verbose_name='Commercial Registration Number')), - ('vrn', models.CharField(max_length=15, unique=True, verbose_name='VAT Registration Number')), - ('arabic_name', models.CharField(max_length=255, verbose_name='Arabic Name')), - ('name', models.CharField(max_length=255, verbose_name='English Name')), - ('contact_person', models.CharField(max_length=100, verbose_name='Contact Person')), - ('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/vendors', verbose_name='Logo')), - ('dealer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='vendors', to='inventory.dealer')), - ], - options={ - 'verbose_name': 'Vendor', - 'verbose_name_plural': 'Vendors', - }, - bases=(models.Model, inventory.mixins.LocalizedNameMixin), - ), - migrations.AddField( - model_name='car', - name='vendor', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='cars', to='inventory.vendor', verbose_name='Vendor'), - ), - migrations.CreateModel( - name='CarReservation', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('reserved_at', models.DateTimeField(auto_now_add=True)), - ('reserved_until', models.DateTimeField()), - ('car', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='reservations', to='inventory.car')), - ('reserved_by', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), - ], - options={ - 'ordering': ['-reserved_at'], - 'unique_together': {('car', 'reserved_until')}, - }, - ), - migrations.CreateModel( - name='CarColors', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('car', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='colors', to='inventory.car')), - ('exterior', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='colors', to='inventory.exteriorcolors')), - ('interior', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='colors', to='inventory.interiorcolors')), - ], - options={ - 'verbose_name': 'Color', - 'verbose_name_plural': 'Colors', - 'unique_together': {('car', 'exterior', 'interior')}, - }, - ), - ] diff --git a/inventory/migrations/0002_additionalservices_subscription_subscriptionplan_and_more.py b/inventory/migrations/0002_additionalservices_subscription_subscriptionplan_and_more.py deleted file mode 100644 index 698a9aad..00000000 --- a/inventory/migrations/0002_additionalservices_subscription_subscriptionplan_and_more.py +++ /dev/null @@ -1,335 +0,0 @@ -# Generated by Django 5.1.4 on 2024-12-22 21:55 - -import django.db.models.deletion -import inventory.mixins -import phonenumber_field.modelfields -from decimal import Decimal -from django.conf import settings -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('django_ledger', '0017_alter_accountmodel_unique_together_and_more'), - ('inventory', '0001_initial'), - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ] - - operations = [ - migrations.CreateModel( - name='AdditionalServices', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=255, verbose_name='Name')), - ('display_name', models.CharField(max_length=255, verbose_name='Display Name')), - ('description', models.TextField(verbose_name='Description')), - ('price', models.DecimalField(decimal_places=2, max_digits=14, verbose_name='Price')), - ], - options={ - 'verbose_name': 'Additional Services', - 'verbose_name_plural': 'Additional Services', - }, - ), - migrations.CreateModel( - name='Subscription', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('plan', models.CharField(max_length=255)), - ('start_date', models.DateField()), - ('end_date', models.DateField()), - ('max_users', models.IntegerField()), - ('is_active', models.BooleanField(default=True)), - ], - ), - migrations.CreateModel( - name='SubscriptionPlan', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=255)), - ('description', models.TextField()), - ('price', models.DecimalField(decimal_places=2, max_digits=10)), - ('max_users', models.IntegerField()), - ], - ), - migrations.AlterModelOptions( - name='carfinance', - options={'verbose_name': 'Car Financial Details', 'verbose_name_plural': 'Car Financial Details'}, - ), - migrations.AlterModelOptions( - name='carreservation', - options={'ordering': ['-reserved_at'], 'verbose_name': 'Car Reservation', 'verbose_name_plural': 'Car Reservations'}, - ), - migrations.AlterModelOptions( - name='dealer', - options={'permissions': [('change_dealer_type', 'Can change dealer type')], 'verbose_name': 'Dealer', 'verbose_name_plural': 'Dealers'}, - ), - migrations.RemoveField( - model_name='carfinance', - name='administration_fee', - ), - migrations.RemoveField( - model_name='carfinance', - name='administration_vat_amount', - ), - migrations.RemoveField( - model_name='carfinance', - name='custom_card_fee', - ), - migrations.RemoveField( - model_name='carfinance', - name='custom_card_vat_amount', - ), - migrations.RemoveField( - model_name='carfinance', - name='profit_margin', - ), - migrations.RemoveField( - model_name='carfinance', - name='registration_fee', - ), - migrations.RemoveField( - model_name='carfinance', - name='selling_vat_amount', - ), - migrations.RemoveField( - model_name='carfinance', - name='total', - ), - migrations.RemoveField( - model_name='carfinance', - name='total_before_vat', - ), - migrations.RemoveField( - model_name='carfinance', - name='total_vat_amount', - ), - migrations.RemoveField( - model_name='carfinance', - name='transportation_fee', - ), - migrations.RemoveField( - model_name='carfinance', - name='transportation_vat_amount', - ), - migrations.RemoveField( - model_name='carfinance', - name='vat_rate', - ), - migrations.RemoveField( - model_name='salequotationcar', - name='financial_details', - ), - migrations.AddField( - model_name='carserie', - name='year_begin', - field=models.IntegerField(blank=True, null=True), - ), - migrations.AddField( - model_name='carserie', - name='year_end', - field=models.IntegerField(blank=True, null=True), - ), - migrations.AddField( - model_name='cartrim', - name='id_car_model', - field=models.ForeignKey(blank=True, db_column='id_car_model', null=True, on_delete=django.db.models.deletion.DO_NOTHING, to='inventory.carmodel'), - ), - migrations.AddField( - model_name='dealer', - name='dealer_type', - field=models.CharField(choices=[('Owner', 'Owner'), ('Inventory', 'Inventory'), ('Accountent', 'Accountent'), ('sales', 'Sales')], default='Owner', max_length=255, verbose_name='Dealer Type'), - ), - migrations.AddField( - model_name='dealer', - name='parent_dealer', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='sub_dealers', to='inventory.dealer', verbose_name='Parent Dealer'), - ), - migrations.AddField( - model_name='salequotation', - name='amount', - field=models.DecimalField(decimal_places=2, default=Decimal('0.00'), max_digits=10, verbose_name='Amount'), - ), - migrations.AddField( - model_name='salequotation', - name='dealer', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='sales', to='inventory.dealer'), - ), - migrations.AddField( - model_name='salequotation', - name='entity', - field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, to='django_ledger.entitymodel'), - preserve_default=False, - ), - migrations.AddField( - model_name='salequotation', - name='is_approved', - field=models.BooleanField(default=False), - ), - migrations.AddField( - model_name='salequotation', - name='quotation_number', - field=models.CharField(default=1, max_length=10, unique=True), - preserve_default=False, - ), - migrations.AddField( - model_name='salequotation', - name='updated_at', - field=models.DateTimeField(auto_now=True, verbose_name='Updated At'), - ), - migrations.AddField( - model_name='salequotationcar', - name='quantity', - field=models.PositiveIntegerField(default=1, verbose_name='Quantity'), - ), - migrations.AlterField( - model_name='car', - name='status', - field=models.CharField(choices=[('available', 'Available'), ('sold', 'Sold'), ('hold', 'Hold'), ('damaged', 'Damaged'), ('reserved', 'Reserved')], default='available', max_length=10, verbose_name='Status'), - ), - migrations.AlterField( - model_name='carfinance', - name='car', - field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='finances', to='inventory.car'), - ), - migrations.AlterField( - model_name='carreservation', - name='car', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='reservations', to='inventory.car', verbose_name='Car'), - ), - migrations.AlterField( - model_name='carreservation', - name='reserved_at', - field=models.DateTimeField(auto_now_add=True, verbose_name='Reserved At'), - ), - migrations.AlterField( - model_name='carreservation', - name='reserved_by', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='reservations', to=settings.AUTH_USER_MODEL, verbose_name='Reserved By'), - ), - migrations.AlterField( - model_name='carreservation', - name='reserved_until', - field=models.DateTimeField(verbose_name='Reserved Until'), - ), - migrations.AlterField( - model_name='customcard', - name='car', - field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='custom_cards', to='inventory.car', verbose_name='Car'), - ), - migrations.AlterField( - model_name='dealer', - name='crn', - field=models.CharField(blank=True, max_length=10, null=True, verbose_name='Commercial Registration Number'), - ), - migrations.AlterField( - model_name='dealer', - name='vrn', - field=models.CharField(blank=True, max_length=15, null=True, verbose_name='VAT Registration Number'), - ), - migrations.AlterField( - model_name='salequotation', - name='created_at', - field=models.DateTimeField(auto_now_add=True, verbose_name='Created At'), - ), - migrations.AlterField( - model_name='salequotation', - name='customer', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='quotations', to='inventory.customer', verbose_name='Customer'), - ), - migrations.AlterField( - model_name='salequotation', - name='remarks', - field=models.TextField(blank=True, null=True, verbose_name='Remarks'), - ), - migrations.AlterField( - model_name='salequotationcar', - name='car', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='inventory.car', verbose_name='Car'), - ), - migrations.AlterField( - model_name='salequotationcar', - name='quotation', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='quotation_cars', to='inventory.salequotation', verbose_name='Quotation'), - ), - migrations.AddField( - model_name='carfinance', - name='additional_services', - field=models.ManyToManyField(blank=True, related_name='additional_finances', to='inventory.additionalservices'), - ), - migrations.CreateModel( - name='CarLocation', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('description', models.TextField(blank=True, help_text='Optional description about the showroom placement.', null=True, verbose_name='Description')), - ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Created At')), - ('updated_at', models.DateTimeField(auto_now=True, verbose_name='Last Updated')), - ('car', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='location', to='inventory.car', verbose_name='Car')), - ('owner', models.ForeignKey(help_text='Dealer who owns the car.', on_delete=django.db.models.deletion.CASCADE, related_name='owned_cars', to='inventory.dealer', verbose_name='Owner')), - ('showroom', models.ForeignKey(help_text='Dealer where the car is displayed (can be the owner).', on_delete=django.db.models.deletion.CASCADE, related_name='showroom_cars', to='inventory.dealer', verbose_name='Showroom')), - ], - options={ - 'verbose_name': 'Car Location', - 'verbose_name_plural': 'Car Locations', - }, - ), - migrations.CreateModel( - name='Organization', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=255, verbose_name='Name')), - ('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')), - ('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')), - ('dealer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='organizations', to='inventory.dealer')), - ], - options={ - 'verbose_name': 'Organization', - 'verbose_name_plural': 'Organizations', - }, - bases=(models.Model, inventory.mixins.LocalizedNameMixin), - ), - migrations.CreateModel( - name='Representative', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=255, verbose_name='Name')), - ('arabic_name', models.CharField(max_length=255, verbose_name='Arabic Name')), - ('id_number', models.CharField(max_length=10, verbose_name='ID Number')), - ('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')), - ('dealer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='representatives', to='inventory.dealer')), - ('organization', models.ManyToManyField(related_name='representatives', to='inventory.organization')), - ], - options={ - 'verbose_name': 'Representative', - 'verbose_name_plural': 'Representatives', - }, - bases=(models.Model, inventory.mixins.LocalizedNameMixin), - ), - migrations.CreateModel( - name='SalesOrder', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Created At')), - ('total_amount', models.DecimalField(decimal_places=2, max_digits=14, verbose_name='Total Amount')), - ('quotation', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='sales_order', to='inventory.salequotation', verbose_name='Quotation')), - ], - ), - migrations.CreateModel( - name='SubscriptionUser', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('subscription', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='inventory.subscription')), - ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), - ], - ), - migrations.AddField( - model_name='subscription', - name='users', - field=models.ManyToManyField(through='inventory.SubscriptionUser', to=settings.AUTH_USER_MODEL), - ), - ] diff --git a/inventory/migrations/0003_remove_additionalservices_display_name_and_more.py b/inventory/migrations/0003_remove_additionalservices_display_name_and_more.py deleted file mode 100644 index 53fe897a..00000000 --- a/inventory/migrations/0003_remove_additionalservices_display_name_and_more.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 5.1.4 on 2024-12-23 08:51 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('inventory', '0002_additionalservices_subscription_subscriptionplan_and_more'), - ] - - operations = [ - migrations.RemoveField( - model_name='additionalservices', - name='display_name', - ), - migrations.AddField( - model_name='additionalservices', - name='arabic_name', - field=models.CharField(default='-', max_length=255, verbose_name='Arabic Name'), - preserve_default=False, - ), - ] diff --git a/inventory/migrations/0004_remove_additionalservices_arabic_name.py b/inventory/migrations/0004_remove_additionalservices_arabic_name.py deleted file mode 100644 index 622ecaca..00000000 --- a/inventory/migrations/0004_remove_additionalservices_arabic_name.py +++ /dev/null @@ -1,17 +0,0 @@ -# Generated by Django 4.2.17 on 2024-12-24 08:07 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('inventory', '0003_remove_additionalservices_display_name_and_more'), - ] - - operations = [ - migrations.RemoveField( - model_name='additionalservices', - name='arabic_name', - ), - ] diff --git a/inventory/migrations/0005_additionalservices_arabic_name.py b/inventory/migrations/0005_additionalservices_arabic_name.py deleted file mode 100644 index b9056578..00000000 --- a/inventory/migrations/0005_additionalservices_arabic_name.py +++ /dev/null @@ -1,19 +0,0 @@ -# Generated by Django 4.2.17 on 2024-12-24 08:09 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('inventory', '0004_remove_additionalservices_arabic_name'), - ] - - operations = [ - migrations.AddField( - model_name='additionalservices', - name='arabic_name', - field=models.CharField(default='-', max_length=255, verbose_name='Arabic Name'), - preserve_default=False, - ), - ] diff --git a/inventory/migrations/0006_remove_additionalservices_arabic_name.py b/inventory/migrations/0006_remove_additionalservices_arabic_name.py deleted file mode 100644 index a2ac801f..00000000 --- a/inventory/migrations/0006_remove_additionalservices_arabic_name.py +++ /dev/null @@ -1,17 +0,0 @@ -# Generated by Django 4.2.17 on 2024-12-24 08:10 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('inventory', '0005_additionalservices_arabic_name'), - ] - - operations = [ - migrations.RemoveField( - model_name='additionalservices', - name='arabic_name', - ), - ] diff --git a/inventory/migrations/0007_additionalservices_arabic_name.py b/inventory/migrations/0007_additionalservices_arabic_name.py deleted file mode 100644 index 013a875e..00000000 --- a/inventory/migrations/0007_additionalservices_arabic_name.py +++ /dev/null @@ -1,19 +0,0 @@ -# Generated by Django 4.2.17 on 2024-12-24 08:11 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('inventory', '0006_remove_additionalservices_arabic_name'), - ] - - operations = [ - migrations.AddField( - model_name='additionalservices', - name='arabic_name', - field=models.CharField(default='-', max_length=255, verbose_name='Arabic Name'), - preserve_default=False, - ), - ] diff --git a/inventory/migrations/0008_salequotation_status.py b/inventory/migrations/0008_salequotation_status.py deleted file mode 100644 index cf5450ac..00000000 --- a/inventory/migrations/0008_salequotation_status.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 4.2.17 on 2024-12-24 08:35 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('inventory', '0007_additionalservices_arabic_name'), - ] - - operations = [ - migrations.AddField( - model_name='salequotation', - name='status', - field=models.CharField(choices=[('DRAFT', 'Draft'), ('CONFIRMED', 'Confirmed'), ('CANCELED', 'Canceled')], default='DRAFT', max_length=10, verbose_name='Status'), - ), - ] diff --git a/inventory/migrations/0009_salequotation_date_approved_and_more.py b/inventory/migrations/0009_salequotation_date_approved_and_more.py deleted file mode 100644 index 8b31c0e9..00000000 --- a/inventory/migrations/0009_salequotation_date_approved_and_more.py +++ /dev/null @@ -1,48 +0,0 @@ -# Generated by Django 4.2.17 on 2024-12-24 09:48 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('inventory', '0008_salequotation_status'), - ] - - operations = [ - migrations.AddField( - model_name='salequotation', - name='date_approved', - field=models.DateField(blank=True, null=True, verbose_name='Approved Date'), - ), - migrations.AddField( - model_name='salequotation', - name='date_canceled', - field=models.DateField(blank=True, null=True, verbose_name='Canceled Date'), - ), - migrations.AddField( - model_name='salequotation', - name='date_draft', - field=models.DateField(blank=True, null=True, verbose_name='Draft Date'), - ), - migrations.AddField( - model_name='salequotation', - name='date_in_review', - field=models.DateField(blank=True, null=True, verbose_name='In Review Date'), - ), - migrations.AddField( - model_name='salequotation', - name='date_paid', - field=models.DateField(blank=True, null=True, verbose_name='Paid Date'), - ), - migrations.AddField( - model_name='salequotation', - name='date_void', - field=models.DateField(blank=True, null=True, verbose_name='Void Date'), - ), - migrations.AlterField( - model_name='salequotation', - name='status', - field=models.CharField(choices=[('Draft', 'Draft'), ('Approved', 'Approved'), ('In Review', 'In Review'), ('Paid', 'Paid')], default='Draft', max_length=10, verbose_name='Status'), - ), - ] diff --git a/inventory/migrations/0010_alter_salequotation_date_approved_and_more.py b/inventory/migrations/0010_alter_salequotation_date_approved_and_more.py deleted file mode 100644 index 6a994ae2..00000000 --- a/inventory/migrations/0010_alter_salequotation_date_approved_and_more.py +++ /dev/null @@ -1,43 +0,0 @@ -# Generated by Django 4.2.17 on 2024-12-24 09:49 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('inventory', '0009_salequotation_date_approved_and_more'), - ] - - operations = [ - migrations.AlterField( - model_name='salequotation', - name='date_approved', - field=models.DateTimeField(blank=True, null=True, verbose_name='Approved Date'), - ), - migrations.AlterField( - model_name='salequotation', - name='date_canceled', - field=models.DateTimeField(blank=True, null=True, verbose_name='Canceled Date'), - ), - migrations.AlterField( - model_name='salequotation', - name='date_draft', - field=models.DateTimeField(blank=True, null=True, verbose_name='Draft Date'), - ), - migrations.AlterField( - model_name='salequotation', - name='date_in_review', - field=models.DateTimeField(blank=True, null=True, verbose_name='In Review Date'), - ), - migrations.AlterField( - model_name='salequotation', - name='date_paid', - field=models.DateTimeField(blank=True, null=True, verbose_name='Paid Date'), - ), - migrations.AlterField( - model_name='salequotation', - name='date_void', - field=models.DateTimeField(blank=True, null=True, verbose_name='Void Date'), - ), - ] diff --git a/inventory/migrations/0011_salequotation_posted.py b/inventory/migrations/0011_salequotation_posted.py deleted file mode 100644 index 450c6708..00000000 --- a/inventory/migrations/0011_salequotation_posted.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 4.2.17 on 2024-12-24 10:47 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('inventory', '0010_alter_salequotation_date_approved_and_more'), - ] - - operations = [ - migrations.AddField( - model_name='salequotation', - name='posted', - field=models.BooleanField(default=False), - ), - ] diff --git a/inventory/migrations/0012_salequotation_payment_id.py b/inventory/migrations/0012_salequotation_payment_id.py deleted file mode 100644 index 24758c73..00000000 --- a/inventory/migrations/0012_salequotation_payment_id.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 4.2.17 on 2024-12-24 13:46 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('inventory', '0011_salequotation_posted'), - ] - - operations = [ - migrations.AddField( - model_name='salequotation', - name='payment_id', - field=models.CharField(blank=True, max_length=10, null=True, verbose_name='Payment ID'), - ), - ] diff --git a/inventory/migrations/0013_salequotation_is_paid.py b/inventory/migrations/0013_salequotation_is_paid.py deleted file mode 100644 index c3f313d5..00000000 --- a/inventory/migrations/0013_salequotation_is_paid.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 4.2.17 on 2024-12-24 13:46 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('inventory', '0012_salequotation_payment_id'), - ] - - operations = [ - migrations.AddField( - model_name='salequotation', - name='is_paid', - field=models.BooleanField(default=False), - ), - ] diff --git a/inventory/migrations/0014_payment_refund.py b/inventory/migrations/0014_payment_refund.py deleted file mode 100644 index 4e5748f9..00000000 --- a/inventory/migrations/0014_payment_refund.py +++ /dev/null @@ -1,43 +0,0 @@ -# Generated by Django 5.1.4 on 2024-12-24 14:43 - -import django.db.models.deletion -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('inventory', '0013_salequotation_is_paid'), - ] - - operations = [ - migrations.CreateModel( - name='Payment', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('amount', models.DecimalField(decimal_places=2, max_digits=10, verbose_name='amount')), - ('payment_method', models.CharField(choices=[('cash', 'cash'), ('credit', 'credit'), ('transfer', 'transfer'), ('debit', 'debit'), ('SADAD', 'SADAD')], max_length=50, verbose_name='method')), - ('reference_number', models.CharField(blank=True, max_length=100, null=True, verbose_name='reference number')), - ('payment_date', models.DateField(auto_now_add=True, verbose_name='date')), - ('quotation', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='payments', to='inventory.salequotation')), - ], - options={ - 'verbose_name': 'payment', - 'verbose_name_plural': 'payments', - }, - ), - migrations.CreateModel( - name='Refund', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('amount', models.DecimalField(decimal_places=2, max_digits=10, verbose_name='amount')), - ('reason', models.TextField(blank=True, verbose_name='reason')), - ('refund_date', models.DateField(auto_now_add=True, verbose_name='refund date')), - ('payment', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='refund', to='inventory.payment')), - ], - options={ - 'verbose_name': 'refund', - 'verbose_name_plural': 'refunds', - }, - ), - ] diff --git a/inventory/migrations/0015_alter_salequotation_payment_id.py b/inventory/migrations/0015_alter_salequotation_payment_id.py deleted file mode 100644 index d863d075..00000000 --- a/inventory/migrations/0015_alter_salequotation_payment_id.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 4.2.17 on 2024-12-24 14:26 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('inventory', '0014_payment_refund'), - ] - - operations = [ - migrations.AlterField( - model_name='salequotation', - name='payment_id', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='Payment ID'), - ), - ] diff --git a/inventory/migrations/0016_dealer_joined_at.py b/inventory/migrations/0016_dealer_joined_at.py deleted file mode 100644 index 501ff4c4..00000000 --- a/inventory/migrations/0016_dealer_joined_at.py +++ /dev/null @@ -1,20 +0,0 @@ -# Generated by Django 5.1.4 on 2024-12-25 10:37 - -import django.utils.timezone -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('inventory', '0015_alter_salequotation_payment_id'), - ] - - operations = [ - migrations.AddField( - model_name='dealer', - name='joined_at', - field=models.DateTimeField(auto_now_add=True, default=django.utils.timezone.now, verbose_name='Joined At'), - preserve_default=False, - ), - ] diff --git a/inventory/migrations/0017_dealer_email.py b/inventory/migrations/0017_dealer_email.py deleted file mode 100644 index 2aa8aa7f..00000000 --- a/inventory/migrations/0017_dealer_email.py +++ /dev/null @@ -1,19 +0,0 @@ -# Generated by Django 5.1.4 on 2024-12-25 10:44 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('inventory', '0016_dealer_joined_at'), - ] - - operations = [ - migrations.AddField( - model_name='dealer', - name='email', - field=models.EmailField(default='email@tenhal.sa', max_length=254, unique=True, verbose_name='Email'), - preserve_default=False, - ), - ] diff --git a/inventory/migrations/0018_additionalservices_taxable.py b/inventory/migrations/0018_additionalservices_taxable.py deleted file mode 100644 index 2f9b8f65..00000000 --- a/inventory/migrations/0018_additionalservices_taxable.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 5.1.4 on 2024-12-25 17:06 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('inventory', '0017_dealer_email'), - ] - - operations = [ - migrations.AddField( - model_name='additionalservices', - name='taxable', - field=models.BooleanField(default=True, verbose_name='Taxable'), - ), - ] diff --git a/inventory/migrations/0019_remove_additionalservices_taxable_and_more.py b/inventory/migrations/0019_remove_additionalservices_taxable_and_more.py deleted file mode 100644 index 728f5f69..00000000 --- a/inventory/migrations/0019_remove_additionalservices_taxable_and_more.py +++ /dev/null @@ -1,21 +0,0 @@ -# Generated by Django 4.2.17 on 2024-12-26 07:13 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('inventory', '0018_additionalservices_taxable'), - ] - - operations = [ - migrations.RemoveField( - model_name='additionalservices', - name='taxable', - ), - migrations.RemoveField( - model_name='salequotation', - name='entity', - ), - ] diff --git a/inventory/migrations/0020_dealer_entity.py b/inventory/migrations/0020_dealer_entity.py deleted file mode 100644 index 123c9d0d..00000000 --- a/inventory/migrations/0020_dealer_entity.py +++ /dev/null @@ -1,20 +0,0 @@ -# Generated by Django 4.2.17 on 2024-12-26 07:22 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('django_ledger', '0017_alter_accountmodel_unique_together_and_more'), - ('inventory', '0019_remove_additionalservices_taxable_and_more'), - ] - - operations = [ - migrations.AddField( - model_name='dealer', - name='entity', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='django_ledger.entitymodel'), - ), - ] diff --git a/inventory/migrations/0031_remove_salequotation_entity.py b/inventory/migrations/0031_remove_salequotation_entity.py deleted file mode 100644 index 715069b0..00000000 --- a/inventory/migrations/0031_remove_salequotation_entity.py +++ /dev/null @@ -1,17 +0,0 @@ -# Generated by Django 4.2.17 on 2024-12-26 07:58 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('inventory', '0030_account'), - ] - - operations = [ - migrations.RemoveField( - model_name='salequotation', - name='entity', - ), - ] diff --git a/inventory/migrations/0032_remove_additionalservices_vatable_and_more.py b/inventory/migrations/0032_remove_additionalservices_vatable_and_more.py deleted file mode 100644 index e97bfde8..00000000 --- a/inventory/migrations/0032_remove_additionalservices_vatable_and_more.py +++ /dev/null @@ -1,22 +0,0 @@ -# Generated by Django 4.2.17 on 2024-12-26 08:02 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('inventory', '0031_remove_salequotation_entity'), - ] - - operations = [ - migrations.RemoveField( - model_name='additionalservices', - name='vatable', - ), - migrations.AddField( - model_name='additionalservices', - name='taxable', - field=models.BooleanField(default=False, verbose_name='taxable'), - ), - ] diff --git a/inventory/migrations/__pycache__/0001_initial.cpython-311.pyc b/inventory/migrations/__pycache__/0001_initial.cpython-311.pyc deleted file mode 100644 index 0b51c813e25ccce3a387260c9db756e18d90eb96..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18658 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 AA^-pY