def update(request, pk):
    template_url = 'order-items/update.html'
    operator = Operators.login_required(request)
    if operator is None:
        Operators.set_redirect_field_name(request, request.path)
        return redirect(reverse("operators_signin"))
    else:
        auth_permissions = Operators.get_auth_permissions(operator)
        if settings.ACCESS_PERMISSION_ORDER_UPDATE in auth_permissions.values(
        ):
            # try:
            model = Order_Items.objects.get(order_item_id=pk)
            order = Orders.objects.get(order_id=model.orders_order_id)
            if request.method == 'POST':

                form = OrderItemUpdateForm(request.POST)

                # noinspection PyArgumentList
                if form.is_valid():
                    title = 'unknown'
                    type = form.cleaned_data['type']
                    model.order_item_type_id = 0
                    if type == 'service':
                        title = form.cleaned_data['title_service']
                    if type == 'goods':
                        type_id = form.cleaned_data['title_goods']
                        model.order_item_type_id = type_id
                        product = Products.objects.get(product_id=type_id)
                        title = product.product_title
                    if type == 'asset':
                        type_id = form.cleaned_data['title_asset']
                        model.order_item_type_id = type_id
                        product = Products.objects.get(product_id=type_id)
                        title = product.product_title

                    model.order_item_type = type
                    model.order_item_title = title
                    model.order_item_sub_title = ''
                    model.order_item_quantity_ordered = form.cleaned_data[
                        'quantity_ordered']
                    model.order_item_quantity_unit = form.cleaned_data[
                        'quantity_unit']
                    model.order_item_unit_price = form.cleaned_data[
                        'unit_price']
                    model.order_item_total_price = model.order_item_quantity_ordered * model.order_item_unit_price

                    model.order_item_updated_at = Utils.get_current_datetime_utc(
                    )
                    model.order_item_updated_id = operator.operator_id
                    model.order_item_updated_by = operator.operator_name
                    model.order_item_updated_department = operator.operator_department
                    model.order_item_updated_role = operator.operator_role
                    model.save()

                    Orders.update_grand_total(request, order, operator)

                    messages.success(request, 'Item updated successfully.')
                    return redirect(
                        reverse("orders_view", args=[order.order_id]))
                else:
                    error_string = ' '.join([
                        ' '.join(x for x in l)
                        for l in list(form.errors.values())
                    ])
                    messages.error(request, '' + error_string)
                    return redirect(reverse("orders_view", args=[order_id]))
            else:
                title = 'unknown'
                type = model.order_item_type
                if type == 'service':
                    title = model.order_item_title
                if type == 'goods':
                    title = model.order_item_type_id
                if type == 'asset':
                    title = model.order_item_type_id
                form = OrderItemUpdateForm(
                    initial={
                        'order_id': order.order_code,
                        'type': type,
                        'title_service': title,
                        'title_goods': title,
                        'title_asset': title,
                        'duration': model.order_item_duration,
                        'unit_price': model.order_item_unit_price,
                        'currency': model.order_item_currency,
                        'quantity_ordered': model.order_item_quantity_ordered,
                        'quantity_unit': model.order_item_quantity_unit,
                    })

            return render(
                request, template_url, {
                    'section':
                    settings.BACKEND_SECTION_PROCUREMENT_ALL_REQUESTS,
                    'title': Order_Items.TITLE,
                    'name': Order_Items.NAME,
                    'operator': operator,
                    'auth_permissions': auth_permissions,
                    'form': form,
                    'model': model,
                })
        # except(TypeError, ValueError, OverflowError, Orders.DoesNotExist, Order_Items.DoesNotExist):
        #     return HttpResponseNotFound('Not Found', content_type='text/plain')
        else:
            return HttpResponseForbidden('Forbidden',
                                         content_type='text/plain')
def select_multiple(request):
    if request.is_ajax():
        operator = Operators.login_required(request)
        if operator is None:
            # Operators.set_redirect_field_name(request, request.path)
            # return redirect(reverse("operators_signin"))
            return HttpResponse('signin', content_type='text/plain')
        else:
            auth_permissions = Operators.get_auth_permissions(operator)
            action = request.POST['action']
            ids = request.POST['ids']
            try:
                ids = ids.split(",")
            except (TypeError, ValueError, OverflowError):
                ids = None
            if action != '' and ids is not None:
                if action == 'usaid-approve-yes':
                    if settings.ACCESS_PERMISSION_ORDER_UPDATE in auth_permissions.values(
                    ):
                        for id in ids:
                            try:
                                model = Order_Items.objects.get(
                                    order_item_id=id)
                                model.order_item_usaid_approval = True
                                model.save()
                            except (TypeError, ValueError, OverflowError,
                                    Order_Items.DoesNotExist):
                                continue
                        messages.success(request, 'Updated successfully.')
                    else:
                        return HttpResponseForbidden('Forbidden',
                                                     content_type='text/plain')
                if action == 'usaid-approve-no':
                    if settings.ACCESS_PERMISSION_ORDER_UPDATE in auth_permissions.values(
                    ):
                        for id in ids:
                            try:
                                model = Order_Items.objects.get(
                                    order_item_id=id)
                                model.order_item_usaid_approval = False
                                model.save()
                            except (TypeError, ValueError, OverflowError,
                                    Order_Items.DoesNotExist):
                                continue
                        messages.success(request, 'Updated successfully.')
                    else:
                        return HttpResponseForbidden('Forbidden',
                                                     content_type='text/plain')
                if action == 'order-item-received':
                    if settings.ACCESS_PERMISSION_ORDER_UPDATE in auth_permissions.values(
                    ):
                        for id in ids:
                            try:
                                model = Order_Items.objects.get(
                                    order_item_id=id)
                                if model.order_item_status == Order_Items.STATUS_PENDING:
                                    if model.order_item_type == Order_Items.TYPE_SERVICE:
                                        model.order_item_received_at = Utils.get_current_datetime_utc(
                                        )
                                        model.order_item_received_id = operator.operator_id
                                        model.order_item_received_by = operator.operator_name
                                        model.order_item_received_department = operator.operator_department
                                        model.order_item_received_role = operator.operator_role
                                        model.order_item_status = Order_Items.STATUS_RECEIVED
                                        model.save()
                            except (TypeError, ValueError, OverflowError,
                                    Order_Items.DoesNotExist):
                                continue
                        messages.success(request, 'Updated successfully.')
                    else:
                        return HttpResponseForbidden('Forbidden',
                                                     content_type='text/plain')
                if action == 'order-item-pending':
                    if settings.ACCESS_PERMISSION_ORDER_UPDATE in auth_permissions.values(
                    ):
                        for id in ids:
                            try:
                                model = Order_Items.objects.get(
                                    order_item_id=id)
                                if model.order_item_status == Order_Items.STATUS_RECEIVED:
                                    if model.order_item_type != Order_Items.TYPE_SERVICE:
                                        try:
                                            order = Orders.objects.get(
                                                order_id=model.orders_order_id)
                                            inventory = Inventory.objects.get(
                                                inventory_order_purchase_no=
                                                order.order_purchase_no)
                                            inventory_items = Inventory_Items.objects.filter(
                                                inventory_inventory_id=inventory
                                                .inventory_id)
                                            for inventory_item in inventory_items:
                                                try:
                                                    product = Products.objects.get(
                                                        product_id=inventory_item
                                                        .products_product_id)
                                                    product.product_quantity_available = product.product_quantity_available - inventory_item.inventory_item_product_quantity_ordered
                                                    product.product_updated_at = Utils.get_current_datetime_utc(
                                                    )
                                                    product.product_updated_id = operator.operator_id
                                                    product.product_updated_by = operator.operator_name
                                                    product.product_updated_department = operator.operator_department
                                                    product.product_updated_role = operator.operator_role
                                                    product.save()
                                                    inventory_item.delete()
                                                except Products.DoesNotExist:
                                                    inventory_item.delete()
                                                    continue
                                        except (Orders.DoesNotExist,
                                                Inventory.DoesNotExist):
                                            print(
                                                'Order or inventory does not exist.'
                                            )
                                    model.order_item_received_at = settings.APP_CONSTANT_DEFAULT_DATETIME_VALUE
                                    model.order_item_received_id = ''
                                    model.order_item_received_by = ''
                                    model.order_item_received_department = ''
                                    model.order_item_received_role = ''
                                    model.order_item_status = Order_Items.STATUS_PENDING
                                    model.save()

                            except (TypeError, ValueError, OverflowError,
                                    Order_Items.DoesNotExist):
                                continue
                        messages.success(request, 'Updated successfully.')
                    else:
                        return HttpResponseForbidden('Forbidden',
                                                     content_type='text/plain')

                return HttpResponse('success', content_type='text/plain')
            else:
                return HttpResponseBadRequest('Bad Request',
                                              content_type='text/plain')
    else:
        return HttpResponseForbidden('Forbidden', content_type='text/plain')
def create(request, pk, action, ids):
    template_url = 'inventory-items/create.html'
    operator = Operators.login_required(request)
    if operator is None:
        Operators.set_redirect_field_name(request, request.path)
        return redirect(reverse("operators_signin"))
    else:
        auth_permissions = Operators.get_auth_permissions(operator)
        if settings.ACCESS_PERMISSION_ORDER_UPDATE in auth_permissions.values(
        ):
            # try:
            order = Orders.objects.get(order_id=pk)
            order_proposal = Order_Proposals.objects.get(
                order_proposal_id=order.order_proposal_id)
            try:
                ids = ids.split("-")
            except (TypeError, ValueError, OverflowError):
                ids = None
            if action != 'order-item-received' or ids is None:
                return HttpResponseNotFound('Not Found',
                                            content_type='text/plain')
            else:
                if request.method == 'POST':
                    form = InventoryItemCreateForm(request.POST)
                    # noinspection PyArgumentList
                    if form.is_valid():
                        inventory_item_voucher_reference = form.cleaned_data[
                            'inventory_item_voucher_reference']
                        inventory_item_location = form.cleaned_data[
                            'inventory_item_location']
                        inventory_item_equipment_holder_status = form.cleaned_data[
                            'inventory_item_equipment_holder_status']
                        inventory_item_staff_name = form.cleaned_data[
                            'inventory_item_staff_name']
                        inventory_item_room_number = form.cleaned_data[
                            'inventory_item_room_number']
                        inventory_item_disposal_date = form.cleaned_data[
                            'inventory_item_disposal_date']
                        inventory_item_verified_date = form.cleaned_data[
                            'inventory_item_verified_date']
                        inventory_item_present_condition = form.cleaned_data[
                            'inventory_item_present_condition']
                        inventory_item_remark = form.cleaned_data[
                            'inventory_item_remark']

                        try:
                            inventory = Inventory.objects.get(
                                inventory_order_purchase_no=order.
                                order_purchase_no)
                            inventory.inventory_order_proposal_id = order.order_proposal_id
                            inventory.inventory_order_proposal_supplier_title = order_proposal.order_proposal_supplier_title
                            inventory.inventory_updated_at = Utils.get_current_datetime_utc(
                            )
                            inventory.inventory_updated_id = operator.operator_id
                            inventory.inventory_updated_by = operator.operator_name
                            inventory.inventory_updated_department = operator.operator_department
                            inventory.inventory_updated_role = operator.operator_role
                            inventory.save()
                        except Inventory.DoesNotExist:
                            inventory = Inventory()
                            inventory.inventory_order_purchase_no = order.order_purchase_no
                            inventory.inventory_order_proposal_id = order.order_proposal_id
                            inventory.inventory_order_proposal_supplier_title = order_proposal.order_proposal_supplier_title
                            inventory.inventory_created_at = Utils.get_current_datetime_utc(
                            )
                            inventory.inventory_created_id = operator.operator_id
                            inventory.inventory_created_by = operator.operator_name
                            inventory.inventory_created_department = operator.operator_department
                            inventory.inventory_created_role = operator.operator_role
                            inventory.inventory_updated_at = Utils.get_current_datetime_utc(
                            )
                            inventory.inventory_updated_id = operator.operator_id
                            inventory.inventory_updated_by = operator.operator_name
                            inventory.inventory_updated_department = operator.operator_department
                            inventory.inventory_updated_role = operator.operator_role
                            inventory.save()

                        for id in ids:
                            try:
                                order_item = Order_Items.objects.get(
                                    order_item_id=id)
                                if order_item.order_item_status == Order_Items.STATUS_PENDING:
                                    if order_item.order_item_type != Order_Items.TYPE_SERVICE:
                                        order_item.order_item_received_at = Utils.get_current_datetime_utc(
                                        )
                                        order_item.order_item_received_id = operator.operator_id
                                        order_item.order_item_received_by = operator.operator_name
                                        order_item.order_item_received_department = operator.operator_department
                                        order_item.order_item_received_role = operator.operator_role
                                        order_item.order_item_status = Order_Items.STATUS_RECEIVED
                                        order_item.save()

                                        try:
                                            product = Products.objects.get(
                                                product_id=order_item.
                                                order_item_type_id)
                                            inventory_item = Inventory_Items()
                                            inventory_item.inventory_inventory_id = inventory.inventory_id
                                            inventory_item.products_product_id = order_item.order_item_type_id
                                            inventory_item.inventory_item_product_type = order_item.order_item_type
                                            inventory_item.inventory_item_product_code = product.product_code
                                            inventory_item.inventory_item_product_tag = product.product_tag
                                            inventory_item.inventory_item_product_category = product.product_category
                                            inventory_item.inventory_item_product_title = product.product_title
                                            inventory_item.inventory_item_product_sub_title = product.product_sub_title
                                            inventory_item.inventory_item_product_quantity_initial = product.product_quantity_available
                                            inventory_item.inventory_item_product_quantity_ordered = order_item.order_item_quantity_ordered
                                            inventory_item.inventory_item_product_quantity_balance = product.product_quantity_available + order_item.order_item_quantity_ordered
                                            inventory_item.inventory_item_product_quantity_unit = product.product_quantity_unit
                                            inventory_item.inventory_item_product_currency = order_item.order_item_currency
                                            inventory_item.inventory_item_product_unit_price = order_item.order_item_unit_price
                                            inventory_item.inventory_item_product_rate_price = 0
                                            inventory_item.inventory_item_product_usd_price = 0
                                            inventory_item.inventory_item_product_usaid_equipment_price = 0
                                            inventory_item.inventory_item_product_small_equipment_price = 0
                                            inventory_item.inventory_item_project = order.order_project_name
                                            inventory_item.inventory_item_voucher_reference = inventory_item_voucher_reference
                                            inventory_item.inventory_item_location = inventory_item_location
                                            inventory_item.inventory_item_equipment_holder_status = inventory_item_equipment_holder_status
                                            inventory_item.inventory_item_staff_name = inventory_item_staff_name
                                            inventory_item.inventory_item_room_number = inventory_item_room_number
                                            inventory_item.inventory_item_present_condition = inventory_item_present_condition
                                            inventory_item.inventory_item_disposal_date = inventory_item_disposal_date
                                            inventory_item.inventory_item_verified_date = inventory_item_verified_date
                                            inventory_item.inventory_item_remark = inventory_item_remark
                                            inventory_item.inventory_created_at = Utils.get_current_datetime_utc(
                                            )
                                            inventory_item.inventory_created_id = operator.operator_id
                                            inventory_item.inventory_created_by = operator.operator_name
                                            inventory_item.inventory_created_department = operator.operator_department
                                            inventory_item.inventory_created_role = operator.operator_role
                                            inventory_item.inventory_updated_at = Utils.get_current_datetime_utc(
                                            )
                                            inventory_item.inventory_updated_id = operator.operator_id
                                            inventory_item.inventory_updated_by = operator.operator_name
                                            inventory_item.inventory_updated_department = operator.operator_department
                                            inventory_item.inventory_updated_role = operator.operator_role
                                            inventory_item.save()

                                            product.product_quantity_available = product.product_quantity_available + order_item.order_item_quantity_ordered
                                            product.product_updated_at = Utils.get_current_datetime_utc(
                                            )
                                            product.product_updated_id = operator.operator_id
                                            product.product_updated_by = operator.operator_name
                                            product.product_updated_department = operator.operator_department
                                            product.product_updated_role = operator.operator_role
                                            product.save()

                                        except Products.DoesNotExist:
                                            continue

                            except Order_Items.DoesNotExist:
                                continue

                        messages.success(request, 'Updated successfully.')
                        return redirect(
                            reverse("order_items_index",
                                    args=[order.order_id]))
                    else:
                        error_string = ' '.join([
                            ' '.join(x for x in l)
                            for l in list(form.errors.values())
                        ])
                        messages.error(request, '' + error_string)
                        return redirect(
                            reverse("order_items_index",
                                    args=[order.order_id]))
                else:
                    form = InventoryItemCreateForm(
                        initial={
                            'inventory_order_purchase_no':
                            order.order_purchase_no,
                            'inventory_order_project_name':
                            order.order_project_name,
                        })

                return render(
                    request, template_url, {
                        'section':
                        settings.BACKEND_SECTION_PROCUREMENT_ALL_REQUESTS,
                        'title': Orders.TITLE,
                        'name': Orders.NAME,
                        'operator': operator,
                        'auth_permissions': auth_permissions,
                        'form': form,
                    })
        # except(TypeError, ValueError, OverflowError, Orders.DoesNotExist, Order_Proposals.DoesNotExist,
        #        Order_Proposals.DoesNotExist):
        #     return HttpResponseNotFound('Not Found', content_type='text/plain')
        else:
            return HttpResponseForbidden('Forbidden',
                                         content_type='text/plain')