コード例 #1
0
        public async Task <IActionResult> Handle(UpsertOpportunityCommand request, CancellationToken cancellationToken)
        {
            try
            {
                var validator = new SellOpportunityDetailsValidator();
                var result    = validator.Validate(request.SellOpportunity);

                if (!result.IsValid)
                {
                    var errorMsg = "";

                    foreach (var err in result.Errors)
                    {
                        errorMsg += err.ErrorMessage + "\r\n";
                    }

                    return(new JsonResult(new ApiResponse <object>
                    {
                        Data = null,
                        Code = 406,
                        ErrorMessage = errorMsg
                    }));
                }

                var opportunity = await _opportunityRepository.GetOpportunityAsync(request.SellOpportunity.Id, request.CompanyId);

                if (opportunity == null)
                {
                    opportunity                  = new SellOpportunityHeader();
                    opportunity.Id               = 0;
                    opportunity.CreateDate       = DateTime.Now;
                    opportunity.ModificationDate = opportunity.CreateDate;
                    opportunity.Positions        = new List <SellOpportunityPosition>();
                    opportunity.CompanyId        = request.CompanyId;
                }
                if (opportunity.Id > 0)
                {
                    opportunity.ModificationDate = DateTime.Now;
                }

                opportunity.Status = (await _opportunityStatusRepository.GetOpportunityStatusesAsync()).FirstOrDefault(x => x.Name == request.SellOpportunity.Status);
                opportunity.Lead   = await _leadRepository.GetLeadByNameAsync(request.SellOpportunity.Lead, request.CompanyId);

                opportunity.SumGrossValue  = 0;
                opportunity.SumMarkupValue = 0;
                opportunity.SumNetValue    = 0;
                opportunity.SumVatValue    = 0;
                opportunity.Trader         = await _userRepository.GetUserByNameAsync(request.SellOpportunity.Trader, request.CompanyId);

                foreach (var positionDto in request.SellOpportunity.Positions)
                {
                    if (!positionDto.Deleted)
                    {
                        if (positionDto.Id > 0)
                        {
                            opportunity.Positions[opportunity.Positions.FindIndex(x => x.Id == positionDto.Id)].ModificationDate = opportunity.ModificationDate;
                            opportunity.Positions[opportunity.Positions.FindIndex(x => x.Id == positionDto.Id)].NetValue         = positionDto.NetValue;
                            opportunity.Positions[opportunity.Positions.FindIndex(x => x.Id == positionDto.Id)].Product          = await _productRepository.GetProductByNameAsync(positionDto.Product, request.CompanyId);

                            opportunity.Positions[opportunity.Positions.FindIndex(x => x.Id == positionDto.Id)].Quantity   = positionDto.Quantity;
                            opportunity.Positions[opportunity.Positions.FindIndex(x => x.Id == positionDto.Id)].VatValue   = positionDto.VatValue;
                            opportunity.Positions[opportunity.Positions.FindIndex(x => x.Id == positionDto.Id)].Markup     = positionDto.Markup;
                            opportunity.Positions[opportunity.Positions.FindIndex(x => x.Id == positionDto.Id)].GrossValue = positionDto.GrossValue;
                        }
                        else
                        {
                            var position = new SellOpportunityPosition
                            {
                                Id                = 0,
                                CreateDate        = opportunity.CreateDate,
                                GrossValue        = positionDto.GrossValue,
                                Markup            = positionDto.Markup,
                                VatValue          = positionDto.VatValue,
                                ModificationDate  = opportunity.CreateDate,
                                NetValue          = positionDto.NetValue,
                                OpportunityHeader = opportunity,
                                Product           = await _productRepository.GetProductByNameAsync(positionDto.Product, request.CompanyId),
                                Quantity          = positionDto.Quantity
                            };
                            opportunity.Positions.Add(position);
                        }

                        opportunity.SumNetValue    += positionDto.NetValue;
                        opportunity.SumGrossValue  += positionDto.GrossValue;
                        opportunity.SumMarkupValue += positionDto.Markup;
                        opportunity.SumVatValue    += positionDto.VatValue;
                    }
                    else
                    {
                        await _opportunityRepository.RemoveOpportunityPositionAsync(positionDto.Id);
                    }
                }


                if (opportunity.Id == 0)
                {
                    opportunity = await _opportunityRepository.AddOpportunityAsync(opportunity);
                }
                else
                {
                    opportunity = await _opportunityRepository.UpdateAsync(opportunity);
                }

                if (opportunity != null)
                {
                    return(new JsonResult(new ApiResponse <object>
                    {
                        Data = null,
                        Code = 201,
                        ErrorMessage = ""
                    }));
                }
                else
                {
                    return(new JsonResult(new ApiResponse <object>
                    {
                        Data = null,
                        Code = 400,
                        ErrorMessage = "Coś poszło nie tak, sprawdź dane i spróbuj ponownie."
                    }));
                }
            }
            catch
            {
                return(new JsonResult(new ApiResponse <object>
                {
                    Data = null,
                    Code = 500,
                    ErrorMessage = "Nastąpił problem z serwerem, skontaktuj się z działem IT."
                }));
            }
        }