fix the uploaded
This commit is contained in:
parent
3f85df0124
commit
f49c63da95
@ -97,7 +97,7 @@ class InjectDealerMiddleware:
|
|||||||
request.is_staff = False
|
request.is_staff = False
|
||||||
if hasattr(request.user, "dealer"):
|
if hasattr(request.user, "dealer"):
|
||||||
request.is_dealer = True
|
request.is_dealer = True
|
||||||
if hasattr(request.user, "staffmember"):
|
elif hasattr(request.user, "staffmember"):
|
||||||
request.is_staff = True
|
request.is_staff = True
|
||||||
except Exception:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
|
|||||||
@ -31,6 +31,8 @@ from django_ledger.models import (
|
|||||||
InvoiceModel,
|
InvoiceModel,
|
||||||
AccountModel,
|
AccountModel,
|
||||||
EntityManagementModel,
|
EntityManagementModel,
|
||||||
|
PurchaseOrderModel,
|
||||||
|
ItemTransactionModel,
|
||||||
)
|
)
|
||||||
from django.contrib.contenttypes.fields import GenericForeignKey
|
from django.contrib.contenttypes.fields import GenericForeignKey
|
||||||
from django.contrib.contenttypes.models import ContentType
|
from django.contrib.contenttypes.models import ContentType
|
||||||
@ -722,7 +724,7 @@ class Car(Base):
|
|||||||
self.save()
|
self.save()
|
||||||
@property
|
@property
|
||||||
def logo(self):
|
def logo(self):
|
||||||
return self.id_car_make.logo.url if self.id_car_make.logo else None
|
return self.id_car_make.logo.url if self.id_car_make.logo else None
|
||||||
|
|
||||||
class CarTransfer(models.Model):
|
class CarTransfer(models.Model):
|
||||||
car = models.ForeignKey(
|
car = models.ForeignKey(
|
||||||
@ -2835,3 +2837,18 @@ class PaymentHistory(models.Model):
|
|||||||
######################################################################################################
|
######################################################################################################
|
||||||
######################################################################################################
|
######################################################################################################
|
||||||
######################################################################################################
|
######################################################################################################
|
||||||
|
class PoItemsUploaded(models.Model):
|
||||||
|
dealer = models.ForeignKey(Dealer, on_delete=models.CASCADE, null=True, blank=True)
|
||||||
|
po = models.ForeignKey(
|
||||||
|
PurchaseOrderModel, on_delete=models.CASCADE, null=True, blank=True, related_name="items"
|
||||||
|
)
|
||||||
|
item = models.ForeignKey(
|
||||||
|
ItemTransactionModel,
|
||||||
|
on_delete=models.CASCADE,
|
||||||
|
null=True,
|
||||||
|
blank=True,
|
||||||
|
related_name="po_items",
|
||||||
|
)
|
||||||
|
status = models.CharField(max_length=100, null=True, blank=True)
|
||||||
|
created_at = models.DateTimeField(auto_now_add=True)
|
||||||
|
updated_at = models.DateTimeField(auto_now=True)
|
||||||
@ -2916,21 +2916,22 @@ class UserCreateView(
|
|||||||
return self.form_invalid(form)
|
return self.form_invalid(form)
|
||||||
|
|
||||||
email = form.cleaned_data["email"]
|
email = form.cleaned_data["email"]
|
||||||
password = "Tenhal@123"
|
if User.objects.filter(email=email).exists():
|
||||||
try:
|
|
||||||
user = User.objects.create_user(
|
|
||||||
username=email, email=email, password=password
|
|
||||||
)
|
|
||||||
user.is_staff = True
|
|
||||||
user.save()
|
|
||||||
except IntegrityError as e:
|
|
||||||
messages.error(
|
messages.error(
|
||||||
self.request,
|
self.request,
|
||||||
_(
|
_(
|
||||||
"A user with this email already exists. Please use a different email."
|
"A user with this email already exists. Please use a different email."
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
return redirect("user_create")
|
return redirect("user_create", dealer_slug=dealer.slug)
|
||||||
|
password = "Tenhal@123"
|
||||||
|
|
||||||
|
user = User.objects.create_user(
|
||||||
|
username=email, email=email, password=password
|
||||||
|
)
|
||||||
|
user.is_staff = True
|
||||||
|
user.save()
|
||||||
|
|
||||||
staff_member = StaffMember.objects.create(user=user)
|
staff_member = StaffMember.objects.create(user=user)
|
||||||
for service in form.cleaned_data["service_offered"]:
|
for service in form.cleaned_data["service_offered"]:
|
||||||
staff_member.services_offered.add(service)
|
staff_member.services_offered.add(service)
|
||||||
@ -9522,6 +9523,11 @@ class PurchaseOrderMarkAsApprovedView(BasePurchaseOrderActionActionView):
|
|||||||
class PurchaseOrderMarkAsFulfilledView(BasePurchaseOrderActionActionView):
|
class PurchaseOrderMarkAsFulfilledView(BasePurchaseOrderActionActionView):
|
||||||
action_name = "mark_as_fulfilled"
|
action_name = "mark_as_fulfilled"
|
||||||
|
|
||||||
|
def get(self, request, dealer_slug, entity_slug, po_pk, *args, **kwargs):
|
||||||
|
po = get_object_or_404(PurchaseOrderModel, pk=po_pk)
|
||||||
|
for item in po.get_itemtxs_data()[0]:
|
||||||
|
models.PoItemsUploaded.objects.create(po=po, item=item, status="fulfilled")
|
||||||
|
return super().get(request, dealer_slug, entity_slug, po_pk, *args, **kwargs)
|
||||||
|
|
||||||
class PurchaseOrderMarkAsCanceledView(BasePurchaseOrderActionActionView):
|
class PurchaseOrderMarkAsCanceledView(BasePurchaseOrderActionActionView):
|
||||||
action_name = "mark_as_canceled"
|
action_name = "mark_as_canceled"
|
||||||
@ -9589,36 +9595,23 @@ class BillModelActionForceMigrateView(BaseBillActionView):
|
|||||||
|
|
||||||
|
|
||||||
def view_items_inventory(request, dealer_slug, entity_slug, po_pk):
|
def view_items_inventory(request, dealer_slug, entity_slug, po_pk):
|
||||||
dealer = get_object_or_404(models.Dealer, slug=dealer_slug)
|
get_object_or_404(models.Dealer, slug=dealer_slug)
|
||||||
po = PurchaseOrderModel.objects.get(pk=po_pk)
|
po = PurchaseOrderModel.objects.get(pk=po_pk)
|
||||||
items = po.get_itemtxs_data()[0]
|
items = po.items.all()
|
||||||
items_per_page = 30
|
|
||||||
paginator = Paginator(items, items_per_page)
|
|
||||||
|
|
||||||
page_number = request.GET.get("page")
|
return render(request,"purchase_orders/po_upload_cars.html",{"po": po, "items": items})
|
||||||
try:
|
|
||||||
page_obj = paginator.get_page(page_number)
|
|
||||||
except PageNotAnInteger:
|
|
||||||
# If page is not an integer, deliver first page.
|
|
||||||
page_obj = paginator.get_page(1)
|
|
||||||
except EmptyPage:
|
|
||||||
# If page is out of range (e.g. 9999), deliver last page of results.
|
|
||||||
page_obj = paginator.get_page(paginator.num_pages)
|
|
||||||
return render(
|
|
||||||
request,
|
|
||||||
"purchase_orders/po_upload_cars.html",
|
|
||||||
{"po": po, "items": items, "page_obj": page_obj},
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def upload_cars(request, dealer_slug, pk=None):
|
def upload_cars(request, dealer_slug, pk=None):
|
||||||
item = None
|
item = None
|
||||||
|
po_item = None
|
||||||
dealer = get_object_or_404(models.Dealer, slug=dealer_slug)
|
dealer = get_object_or_404(models.Dealer, slug=dealer_slug)
|
||||||
response = redirect("upload_cars", dealer_slug=dealer_slug)
|
response = redirect("upload_cars", dealer_slug=dealer_slug)
|
||||||
if pk:
|
if pk:
|
||||||
item = get_object_or_404(ItemTransactionModel, pk=pk)
|
item = get_object_or_404(ItemTransactionModel, pk=pk)
|
||||||
|
po_item = models.PoItemsUploaded.objects.get(dealer=dealer, item=item)
|
||||||
response = redirect("upload_cars", dealer_slug=dealer_slug, pk=pk)
|
response = redirect("upload_cars", dealer_slug=dealer_slug, pk=pk)
|
||||||
if item.item_model.additional_info.get("uploaded"):
|
if po_item.status == "uploaded":
|
||||||
messages.add_message(request, messages.ERROR, "Item already uploaded.")
|
messages.add_message(request, messages.ERROR, "Item already uploaded.")
|
||||||
return redirect(
|
return redirect(
|
||||||
"view_items_inventory",
|
"view_items_inventory",
|
||||||
@ -9632,7 +9625,6 @@ def upload_cars(request, dealer_slug, pk=None):
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
if item:
|
if item:
|
||||||
item = ItemTransactionModel.objects.get(pk=pk)
|
|
||||||
data = [x.strip() for x in item.item_model.name.split("||")]
|
data = [x.strip() for x in item.item_model.name.split("||")]
|
||||||
make = models.CarMake.objects.filter(is_sa_import=True).get(
|
make = models.CarMake.objects.filter(is_sa_import=True).get(
|
||||||
name=data[0]
|
name=data[0]
|
||||||
@ -9712,9 +9704,9 @@ def upload_cars(request, dealer_slug, pk=None):
|
|||||||
)
|
)
|
||||||
car.add_colors(exterior=exterior, interior=interior)
|
car.add_colors(exterior=exterior, interior=interior)
|
||||||
cars_created += 1
|
cars_created += 1
|
||||||
if item:
|
if po_item:
|
||||||
item.item_model.additional_info["uploaded"] = True
|
po_item.status = "uploaded"
|
||||||
item.item_model.save()
|
po_item.save()
|
||||||
|
|
||||||
messages.success(request, f"Successfully imported {cars_created} cars")
|
messages.success(request, f"Successfully imported {cars_created} cars")
|
||||||
return response
|
return response
|
||||||
|
|||||||
@ -66,7 +66,11 @@
|
|||||||
<button class="btn btn-sm dropdown-toggle dropdown-caret-none transition-none btn-reveal fs-10" type="button" data-bs-toggle="dropdown" data-boundary="window" aria-haspopup="true" aria-expanded="false" data-bs-reference="parent"><span class="fas fa-ellipsis-h fs-10"></span></button>
|
<button class="btn btn-sm dropdown-toggle dropdown-caret-none transition-none btn-reveal fs-10" type="button" data-bs-toggle="dropdown" data-boundary="window" aria-haspopup="true" aria-expanded="false" data-bs-reference="parent"><span class="fas fa-ellipsis-h fs-10"></span></button>
|
||||||
<div class="dropdown-menu dropdown-menu-end py-2">
|
<div class="dropdown-menu dropdown-menu-end py-2">
|
||||||
<a href="{% url 'purchase_order_detail' request.dealer.slug po.pk %}" class="dropdown-item text-success-dark">{% trans 'Detail' %}</a>
|
<a href="{% url 'purchase_order_detail' request.dealer.slug po.pk %}" class="dropdown-item text-success-dark">{% trans 'Detail' %}</a>
|
||||||
<a href="{% url 'view_items_inventory' dealer_slug=request.dealer.slug entity_slug=entity_slug po_pk=po.pk %}" class="dropdown-item text-success-dark">{% trans 'View Inventory Items' %}</a>
|
{% if po.po_status == 'fulfilled' %}
|
||||||
|
<a href="{% url 'view_items_inventory' dealer_slug=request.dealer.slug entity_slug=entity_slug po_pk=po.pk %}" class="dropdown-item text-success-dark">{% trans 'View Inventory Items' %}</a>
|
||||||
|
{% else %}
|
||||||
|
<button class="dropdown-item text-warning-dark" disabled><span class="fas fa-exclamation-triangle me-1"></span> Fulfill the PO Before Viewing Inventory</button>
|
||||||
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
|
|||||||
@ -33,16 +33,16 @@
|
|||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
{% for item in items %}
|
{% for i in items %}
|
||||||
<tr>
|
<tr>
|
||||||
<th scope="row">{{ item.item_model }}</th>
|
<th scope="row">{{ i.item.item_model }}</th>
|
||||||
<th scope="row">{{ item.po_quantity }}</th>
|
<th scope="row">{{ i.item.po_quantity }}</th>
|
||||||
<th scope="row">{{ item.po_unit_cost }}</th>
|
<th scope="row">{{ i.item.po_unit_cost }}</th>
|
||||||
<th scope="row">
|
<th scope="row">
|
||||||
{% if item.item_model.additional_info.uploaded %}
|
{% if i.status == "uploaded" %}
|
||||||
<i data-feather="check-circle" class="text-success"></i>
|
<i data-feather="check-circle" class="text-success"></i>
|
||||||
{% else %}
|
{% else %}
|
||||||
<a href="{% url 'upload_cars' request.dealer.slug item.pk %}" class="btn btn-sm btn-phoenix-primary">
|
<a href="{% url 'upload_cars' request.dealer.slug i.item.pk %}" class="btn btn-sm btn-phoenix-primary">
|
||||||
<i data-feather="upload" class="me-2"></i>Upload Data
|
<i data-feather="upload" class="me-2"></i>Upload Data
|
||||||
</a>
|
</a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
@ -52,15 +52,5 @@
|
|||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
{% if page_obj.paginator.num_pages > 1 %}
|
|
||||||
|
|
||||||
<div class="d-flex justify-content-end mt-3">
|
|
||||||
|
|
||||||
<div class="d-flex">
|
|
||||||
{% include 'partials/pagination.html'%}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
<div>
|
<div>
|
||||||
{% endblock content %}
|
{% endblock content %}
|
||||||
Loading…
x
Reference in New Issue
Block a user