예제 #1
0
        public ErrorCodes UpdateStatus(int orderId, OrderStatusEnum changeStatus, string reasonNote = "", string user = "", string cashierRefund = "", bool isCS = false)
        {
            ErrorCodes errorCodes = ErrorCodes.UnknowError;

            try
            {
                var result = 0;
                var order  = _orderDal.GetById(orderId);
                if (order != null && order.order_id > 0)
                {
                    var currentStatus = (OrderStatusEnum)order.status;

                    // Nếu là đơn Take Away thì từ KitchenDone => Success luôn
                    if (currentStatus == OrderStatusEnum.KitchenDone && changeStatus == OrderStatusEnum.Delivering && order.order_type == OrderTypeEnum.TakeAway.GetHashCode())
                    {
                        changeStatus = OrderStatusEnum.Success;
                    }

                    if (!ValidateChangeStatus(currentStatus, changeStatus))
                    {
                        return(ErrorCodes.StatusError);
                    }

                    // Nếu là CS hủy đơn thì đơn phải là trạng thái chờ xác nhận
                    if (isCS && changeStatus == OrderStatusEnum.Destroy && currentStatus != OrderStatusEnum.Inactive)
                    {
                        return(ErrorCodes.StatusError);
                    }

                    var changeStatusShort = (short)changeStatus;
                    var changeRequestType = (short)order.request_type;

                    switch (changeStatus)
                    {
                        #region TH: Bếp báo done, service call để đẩy sang Ahamove. Sau khi Shipper đến nhận hàng giao tiền thì thu ngân click nhận tiền
                    case OrderStatusEnum.Delivering:
                        result = _orderDal.UpdateStatus(orderId, changeStatusShort, changeRequestType, user, reasonNote: order.reason_note, cashierReceive: user);
                        break;

                        #endregion
                        #region TH: Quản lý hủy đơn mà do giao hàng không thanh công, phải refund tiền cho shipper. Phải ghi nhận thêm thu ngân hoàn tiền
                    case OrderStatusEnum.Destroy:
                        // TH currentt status là đang vận chuyển or giao hàng không thành công mới ghi nhận cashierRefund
                        if (currentStatus != OrderStatusEnum.Delivering && currentStatus != OrderStatusEnum.Failure)
                        {
                            cashierRefund = string.Empty;
                        }

                        // TH Hủy đơn do bếp k adapt được khách => cần update thêm request cs báo lại khách

                        if ((currentStatus == OrderStatusEnum.PushToPOS ||
                             currentStatus == OrderStatusEnum.KitchenAccept ||
                             currentStatus == OrderStatusEnum.KitchenDone ||
                             currentStatus == OrderStatusEnum.Delivering ||
                             currentStatus == OrderStatusEnum.Failure) && order.request_type != RequestTypeEnum.CSRequestDestroy.GetHashCode())
                        {
                            changeRequestType = (short)RequestTypeEnum.KitchenDestroy;

                            // Push notify
                            _notifyService.PushNotifyToAccounts(orderId.ToString(), RequestTypeEnum.KitchenDestroy);
                        }

                        // TH Hủy đơn CS báo hủy => request type đổi sang Hủy đơn theo yêu cầu của CSKH và không cần note lý do nữa
                        if (changeStatus == OrderStatusEnum.Destroy && order.request_type == RequestTypeEnum.CSRequestDestroy.GetHashCode())
                        {
                            changeRequestType = (short)RequestTypeEnum.ConfirmDestroyForCS;
                            reasonNote        = order.reason_note;
                        }


                        result = _orderDal.UpdateStatus(orderId, changeStatusShort, changeRequestType, user, reasonNote: reasonNote, cashierReceive: order.cashier_receive, cashierRefund: cashierRefund);

                        break;

                        #endregion
                    default:
                        result = _orderDal.UpdateStatus(orderId, changeStatusShort, changeRequestType, user, reasonNote: order.reason_note, cashierReceive: order.cashier_receive, cashierRefund: order.cashier_refund);
                        break;
                    }

                    if (result <= 0)
                    {
                        errorCodes = ErrorCodes.BusinessError;
                    }
                    else
                    {
                        // history khi thay đổi trạng thái sẽ full các trường
                        _orderHistoryBo.Insert(new OrderHistory
                        {
                            change_log      = reasonNote,
                            created_by      = user,
                            order_id        = orderId,
                            status          = changeStatusShort,
                            request_type    = changeRequestType,
                            delivery_status = order.delivery_status
                        });

                        errorCodes = ErrorCodes.Success;
                    }
                }
            }
            catch (Exception ex)
            {
                Logger.Error(ex);
                errorCodes = ErrorCodes.Exception;
            }
            return(errorCodes);
        }