import json from apps.shop.models import ( Order as OrderModel, OrderItem as OrderItemModel, Product as ProductModel, ) from apps.customer.models import Customer as CustomerModel from rest_framework import exceptions from decimal import Decimal from django.db import transaction def create_order(responsible_group_id: int, customer_id: int, total_amount: Decimal, factor_type: int, factor_status: int, workspace) -> OrderModel: try: order_obj = OrderModel() order_obj.responsible_group_id = responsible_group_id order_obj.customer_id = customer_id order_obj.total_amount = total_amount order_obj.factor_type = factor_type order_obj.factor_status = factor_status order_obj.sys_ws = workspace order_obj.full_clean() order_obj.save() return order_obj except Exception as exp: message = f'Error Create Order: {exp}' exceptions.ValidationError({'error': message}) def create_order_and_items(items: str, customer: CustomerModel, workspace) -> OrderModel: with transaction.atomic(): try: sum_price = 0 order_obj = OrderModel() order_obj.responsible_group = customer.responsible_group order_obj.customer = customer order_obj.total_price = 0 order_obj.factor_type = 1 order_obj.factor_status = 1 order_obj.sys_ws = workspace order_obj.full_clean() order_obj.save() json_items = json.loads(items) for item in json_items: product_obj = ProductModel.objects.get(id=int(item['product_id'])) product_price = product_obj.price product_name = product_obj.name order_item_obj = OrderItemModel() order_item_obj.order = order_obj order_item_obj.product_name = product_name order_item_obj.price = product_price order_item_obj.amount = int(item['amount']) order_item_obj.product_id = int(item['product_id']) order_item_obj.full_clean() order_item_obj.save() sum_price += product_price order_obj.total_price = sum_price order_obj.full_clean() order_obj.save() return order_obj except Exception as exp: transaction.set_rollback(True) message = f'Error Create Order: {exp}' raise exceptions.ValidationError({'error': message}) def update_order(order_id: int, responsible_group_id: int = None, customer_id: int = None, total_amount: Decimal = None, factor_type: int = None, factor_status: int = None, workspace_uuid = None) -> OrderModel: try: order_obj = OrderModel.objects.get(id=order_id, sys_ws__uuid=workspace_uuid) if responsible_group_id is not None: order_obj.responsible_group_id = responsible_group_id if customer_id is not None: order_obj.customer_id = customer_id if total_amount is not None: order_obj.total_amount = total_amount if factor_type is not None: order_obj.factor_type = factor_type if factor_status is not None: order_obj.factor_status = factor_status order_obj.full_clean() order_obj.save() return order_obj except Exception as exp: message = f'Error Updating Order: {exp}' raise exceptions.ValidationError({'error': message}) def delete_order(order_id: int, workspace_uuid: str) -> OrderModel: try: order_obj = OrderModel.objects.get(id=order_id, sys_ws__uuid=workspace_uuid).delete() return order_obj except Exception as exp: message = f'Error Deleting Order: {exp}' raise exceptions.ValidationError({'error': message})