diff --git a/inventory/forms.py b/inventory/forms.py index b0a1af6a..ce124c1e 100644 --- a/inventory/forms.py +++ b/inventory/forms.py @@ -367,6 +367,18 @@ class CarSelectionTable(tables.Table): class WizardForm1(forms.Form): + username = forms.CharField( + widget=forms.TextInput( + attrs={ + "class": "form-control", + "placeholder": "Username", + "required": "required", + } + ), + error_messages={ + "required": _("You must add a username."), + }, + ) email = forms.EmailField( widget=forms.EmailInput( attrs={ diff --git a/inventory/signals.py b/inventory/signals.py index 6dcafbbe..5d358539 100644 --- a/inventory/signals.py +++ b/inventory/signals.py @@ -64,20 +64,20 @@ def create_car_location(sender, instance, created, **kwargs): print(f"Failed to create CarLocation for car {instance.vin}: {e}") -@receiver(post_save, sender=models.CarReservation) -def update_car_status_on_reservation(sender, instance, created, **kwargs): - if created: - car = instance.car - car.status = models.CarStatusChoices.RESERVED - car.save() +# @receiver(post_save, sender=models.CarReservation) +# def update_car_status_on_reservation(sender, instance, created, **kwargs): +# if created: +# car = instance.car +# car.status = models.CarStatusChoices.RESERVED +# car.save() -@receiver(post_delete, sender=models.CarReservation) -def update_car_status_on_reservation_delete(sender, instance, **kwargs): - car = instance.car - if not car.is_reserved(): - car.status = models.CarStatusChoices.AVAILABLE - car.save() +# @receiver(post_delete, sender=models.CarReservation) +# def update_car_status_on_reservation_delete(sender, instance, **kwargs): +# car = instance.car +# if not car.is_reserved(): +# car.status = models.CarStatusChoices.AVAILABLE +# car.save() # Create Entity @@ -103,17 +103,18 @@ def create_ledger_entity(sender, instance, created, **kwargs): print(f"Ledger entity created for Dealer: {instance.name}") # Create Cash Account - entity.create_account( + asset_ca_cash = entity.create_account( coa_model=coa, - code="1101", + code="1010", role=roles.ASSET_CA_CASH, name=_("Cash"), balance_type="debit", active=True, ) - + asset_ca_cash.role_default = True + asset_ca_cash.save() # Create Accounts Receivable Account - entity.create_account( + asset_ca_receivables = entity.create_account( coa_model=coa, code="1102", role=roles.ASSET_CA_RECEIVABLES, @@ -121,9 +122,11 @@ def create_ledger_entity(sender, instance, created, **kwargs): balance_type="debit", active=True, ) + asset_ca_receivables.role_default = True + asset_ca_receivables.save() # Create Inventory Account - entity.create_account( + asset_ca_inventory = entity.create_account( coa_model=coa, code="1103", role=roles.ASSET_CA_INVENTORY, @@ -132,8 +135,10 @@ def create_ledger_entity(sender, instance, created, **kwargs): active=True, ) + asset_ca_inventory.role_default = True + asset_ca_inventory.save() # Create Accounts Payable Account - entity.create_account( + asset_ca_accounts_payable = entity.create_account( coa_model=coa, code="2101", role=roles.LIABILITY_CL_ACC_PAYABLE, @@ -141,8 +146,10 @@ def create_ledger_entity(sender, instance, created, **kwargs): balance_type="credit", active=True, ) + asset_ca_accounts_payable.role_default = True + asset_ca_accounts_payable.save() # Create Equity Account - entity.create_account( + asset_ca_equity = entity.create_account( coa_model=coa, code="3101", role=roles.EQUITY_CAPITAL, @@ -150,9 +157,11 @@ def create_ledger_entity(sender, instance, created, **kwargs): balance_type="credit", active=True, ) + asset_ca_equity.role_default = True + asset_ca_equity.save() # Create Sales Revenue Account - entity.create_account( + asset_ca_revenue = entity.create_account( coa_model=coa, code="4101", role=roles.INCOME_OPERATIONAL, @@ -160,9 +169,11 @@ def create_ledger_entity(sender, instance, created, **kwargs): balance_type="credit", active=True, ) + asset_ca_revenue.role_default = True + asset_ca_revenue.save() # Create Cost of Goods Sold Account - entity.create_account( + asset_ca_cogs = entity.create_account( coa_model=coa, code="5101", role=roles.COGS, @@ -170,9 +181,11 @@ def create_ledger_entity(sender, instance, created, **kwargs): balance_type="debit", active=True, ) + asset_ca_cogs.role_default = True + asset_ca_cogs.save() # Create Rent Expense Account - entity.create_account( + expense = entity.create_account( coa_model=coa, code="6101", role=roles.EXPENSE_OPERATIONAL, @@ -180,6 +193,8 @@ def create_ledger_entity(sender, instance, created, **kwargs): balance_type="debit", active=True, ) + expense.role_default = True + expense.save() # Create Utilities Expense Account entity.create_account( @@ -257,11 +272,12 @@ def create_item_model(sender, instance, created, **kwargs): # print(f"UOM created: {uom_name}") # else: # print(f"Using existing UOM: {uom_name}") - - entity = EntityModel.objects.first() + name = instance.dealer.name + entity = EntityModel.objects.filter(name=name).first() uom = entity.get_uom_all().first() coa = entity.get_default_coa() + entity.get_items_all().filter(item_id=instance.vin) entity.create_item_product( name=f"{instance.vin}", item_type=ItemModel.ITEM_TYPE_OTHER, diff --git a/inventory/views.py b/inventory/views.py index 46cb1cde..b1353dfe 100644 --- a/inventory/views.py +++ b/inventory/views.py @@ -70,6 +70,8 @@ from .utils import get_calculations, send_email, get_user_type from django.contrib.auth.models import User from allauth.account import views from django.db.models import Count, F, Value +from django.contrib.auth import authenticate + logger = logging.getLogger(__name__) logging.basicConfig(level=logging.INFO) @@ -117,6 +119,7 @@ def dealer_signup(request, *args, **kwargs): wf1 = data.get("wizardValidationForm1") wf2 = data.get("wizardValidationForm2") wf3 = data.get("wizardValidationForm3") + username = wf1.get("username") email = wf1.get("email") password = wf1.get("password") password_confirm = wf1.get("confirm_password") @@ -132,7 +135,9 @@ def dealer_signup(request, *args, **kwargs): try: with transaction.atomic(): - user = User.objects.create(email=email, password=password) + user = User.objects.create(username=username, email=email) + user.set_password(password) + user.save() models.Dealer.objects.create( user=user, @@ -143,7 +148,12 @@ def dealer_signup(request, *args, **kwargs): phone_number=phone, address=address, ) - return JsonResponse({"message": "User created successfully."}, status=200) + user = authenticate(request, username=username, password=password) + if user is not None: + return JsonResponse({"message": "User created successfully."}, status=200) + else: + return JsonResponse({"error": "User creation failed."}, status=400) + except Exception as e: return JsonResponse({"error": str(e)}, status=400) @@ -475,7 +485,7 @@ def inventory_stats_view(request): ]["total_cars"] += 1 except Exception as e: print(e) - result = { + result = { "total_cars": cars.count(), "makes": [ { @@ -653,7 +663,10 @@ def manage_reservation(request, reservation_id): return redirect("car_detail", pk=reservation.car.pk) elif action == "cancel": + car = reservation.car reservation.delete() + car.status = models.CarStatusChoices.AVAILABLE + car.save() messages.success(request, _("Reservation canceled successfully.")) return redirect("car_detail", pk=reservation.car.pk) @@ -1685,6 +1698,9 @@ class EstimateListView(LoginRequiredMixin, ListView): template_name = "sales/estimates/estimate_list.html" context_object_name = "estimates" + def get_queryset(self): + entity = self.request.user.dealer.entity + return entity.get_estimates() # class EstimateCreateView(LoginRequiredMixin, SuccessMessageMixin, CreateView): # model = EstimateModel @@ -1810,9 +1826,10 @@ def create_estimate(request): ) form = EstimateModelCreateForm(entity_slug=entity.slug, user_model=entity.admin) + car_list = models.Car.objects.filter(dealer=dealer,finances__selling_price__gt=0).exclude(status='reserved').values_list("vin", flat=True) context = { "form": form, - "items": entity.get_items_all().filter(item_role=ItemModel.ITEM_ROLE_PRODUCT), + "items": entity.get_items_all().filter(item_role=ItemModel.ITEM_ROLE_PRODUCT,name__in=[car_list]), } return render(request, "sales/estimates/estimate_form.html", context) diff --git a/static/images/logos/users/tenhal_hero.png b/static/images/logos/users/tenhal_hero.png new file mode 100644 index 00000000..c4892c6c Binary files /dev/null and b/static/images/logos/users/tenhal_hero.png differ diff --git a/templates/account/signup-wizard.html b/templates/account/signup-wizard.html index ac3c850b..66399b65 100644 --- a/templates/account/signup-wizard.html +++ b/templates/account/signup-wizard.html @@ -117,6 +117,9 @@ const url = "{% url 'account_signup' %}"; const data = await response.json(); if (response.ok) { notify("success","Account created successfully"); + setTimeout(() => { + window.location.href = "{% url 'account_login' %}"; + }, 1000); } else { notify("error",data.error); } diff --git a/templates/inventory/car_form.html b/templates/inventory/car_form.html index 7c9994c5..a43d82f7 100644 --- a/templates/inventory/car_form.html +++ b/templates/inventory/car_form.html @@ -212,6 +212,7 @@ + {{ form.receiving_date }}