public async Task <SimpleResonse> SendOrderShippmentStatusChangedNotification(Guid orderId)
        {
            var order = await _orderDataService.Query.Include(x => x.Shipment).Include(x => x.Creator).FirstOrDefaultAsync(x => x.Id == orderId);

            if (!AccessManager.HasAccess(order, AccessPremission.Manage))
            {
                _securityLogger.LogDangeriousActionAttemp(_identityManager.GetCurrentPrincipal(), order, "send notification to order owner for shipping status change");
                return(new SimpleResonse()
                {
                    Access = ResponseAccess.Deny
                });
            }
            if (order.ShippingStatus != ShippingStatus.Shipped)
            {
                return(new SimpleResonse()
                {
                    Access = ResponseAccess.BadRequest
                });
            }

            var shipmentTrackNumber = order.Shipment?.TrackingNumber;

            JobManager.AddJob(new UserMessageNotifier(order.Creator.Email, "وضعیت سفارش", "سفارش شما بسته بندی و ارسال شد " + shipmentTrackNumber), (s) => s.ToRunNow());

            return(new SimpleResonse()
            {
                Access = ResponseAccess.Granted
            });
        }
        public async Task ChangeOrderItemDownLoadActivationState(Guid orderItemId)
        {
            var orderItem = _unitOfWork.Set <OrderItem>().Include(x => x.Order).First(x => x.Id == orderItemId);

            if (!AccessManager.HasAccess(orderItem.Order, AccessPremission.Manage))
            {
                _securityLogger.LogDangeriousActionAttemp(_identityManager.GetCurrentPrincipal(), orderItem, "change download file product");
            }

            orderItem.IsDownloadActivated = !orderItem.IsDownloadActivated;
            _unitOfWork.Update(orderItem);
            _orderLogger.OrderItemDownloadActivateStateChanged(orderItem);
            await _unitOfWork.SaveChangesAsync();
        }
        public async Task <OrderEditResponse> Edit(OrderEditRequest request)
        {
            var order = await _orderDataService.Query.Include(x => x.Shipment).FirstAsync(x => x.Id == request.Id);

            bool hasShipment = order.Shipment != null;

            if (!AccessManager.HasAccess(order, AccessPremission.See))
            {
                _securityLogger.LogDangeriousUpdateAttemp(request.RequestOwner, order);
                return(new OrderEditResponse()
                {
                    Access = ResponseAccess.Deny
                });
            }
            _orderLogger.OrderUpdated(order, request.Model.MapToModel());
            request.Model.MapToExisting(order);
            await BaseBeforeUpdateAsync(order, request.RequestOwner);

            if (order.ShippingStatus == ShippingStatus.Delivered && order.PaymentStatus == PaymentStatus.Paid)
            {
                order.OrderStatus = OrderStatus.Complete;
            }
            else
            {
                order.OrderStatus = OrderStatus.Pending;
            }

            _unitOfWork.Update(order);
            await BaseAfterUpdateAsync(order, request.RequestOwner);

            await _unitOfWork.SaveChangesAsync();

            return(new OrderEditResponse()
            {
                Access = ResponseAccess.Granted,
                Logs = _orderLogDataService.Query.Include(x => x.Creator).Where(x => x.OrderId == order.Id).ToList().MapToViewModel()
            });
        }