public async Task <ActionResult> UpdateTransits([FromBody] TransitDto transits, [FromRoute] int forwardingOrderId)
        {
            var updateTransitResult = await transitService.UpdateTransits(transits, forwardingOrderId);

            if (!updateTransitResult.IsSuccessful)
            {
                return(BadRequest(updateTransitResult));
            }

            return(Ok(updateTransitResult));
        }
Esempio n. 2
0
        public async Task <GenericResponse> UpdateTransits(TransitDto transits, int forwardingOrderId)
        {
            if (transits == null || transits.Transits == null)
            {
                return(new GenericResponse(false, "Dane przejazdów nie zostały podane"));
            }

            // get old transits from transitForwardingOrders table
            var oldTransitForwardingOrders = await unitOfWork.TransitForwardingOrderRepository.GetTransitForwardingOrdersByForwardingOrderAsync(forwardingOrderId);

            var oldTransits = new List <Transit>();

            foreach (var oldTransitForwardingOrder in oldTransitForwardingOrders)
            {
                var oldTransit = await unitOfWork.TransitRepository.GetTransitByIdAsync(oldTransitForwardingOrder.TransitId);

                if (oldTransit == null)
                {
                    continue;
                }

                oldTransits.Add(oldTransit);
            }

            // create new list of transits to add or update
            var transitsToAddOrUpdate = new List <Transit>();

            // create new list of transitForwardingOders to add or update
            var transitForwardingOrdersToAddOrUpdate = new List <TransitForwardingOrder>();

            foreach (var _transit in transits.Transits)
            {
                var transitToUpdate = await unitOfWork.TransitRepository.GetTransitByIdAsync(_transit.Id);

                if (transitToUpdate == null)
                {
                    transitsToAddOrUpdate.Add(_transit);
                    continue;
                }

                #region Transit data update
                transitToUpdate.GrossPrice                      = _transit.GrossPrice;
                transitToUpdate.NetPrice                        = _transit.NetPrice;
                transitToUpdate.TransportDistance               = _transit.TransportDistance;
                transitToUpdate.PaymentFormId                   = _transit.PaymentFormId;
                transitToUpdate.DriverId                        = _transit.DriverId;
                transitToUpdate.StartDate                       = _transit.StartDate;
                transitToUpdate.EndDate                         = _transit.EndDate;
                transitToUpdate.TransporterId                   = _transit.TransporterId;
                transitToUpdate.VehicleId                       = _transit.VehicleId;
                transitToUpdate.RouteShortPath                  = _transit.RouteShortPath;
                transitToUpdate.TransitDestinationCity          = _transit.TransitDestinationCity;
                transitToUpdate.TransitDestinationCountry       = _transit.TransitDestinationCountry;
                transitToUpdate.TransitDestinationStreetAddress = _transit.TransitDestinationStreetAddress;
                transitToUpdate.TransitDestinationZipCode       = _transit.TransitDestinationZipCode;
                transitToUpdate.TransitSourceCity               = _transit.TransitSourceCity;
                transitToUpdate.TransitSourceCountry            = _transit.TransitSourceCountry;
                transitToUpdate.TransitSourceStreetAddress      = _transit.TransitSourceStreetAddress;
                transitToUpdate.TransitSourceZipCode            = _transit.TransitSourceZipCode;
                transitsToAddOrUpdate.Add(transitToUpdate);
                #endregion
            }

            // catch removed transits from given forwarding order
            foreach (var oldTransit in oldTransits)
            {
                var transitToDelete = transitsToAddOrUpdate.FirstOrDefault(x => x.Id.Equals(oldTransit.Id));
                if (transitToDelete == null)
                {
                    // get all transit forwarding order by transit id to check, if there are other forwarding orders that use this transit
                    var transitsForwardingOrderToDeleteByTransitId = await unitOfWork.TransitForwardingOrderRepository.GetTransitForwardingOrdersByTransitAsync(oldTransit.Id);

                    if (transitsForwardingOrderToDeleteByTransitId == null || transitsForwardingOrderToDeleteByTransitId.Count() == 0)
                    {
                        continue;
                    }

                    try
                    {
                        var _transitForwardinOrderToDelete = transitsForwardingOrderToDeleteByTransitId.FirstOrDefault(x => x.ForwardingOrderId.Equals(forwardingOrderId));
                        await unitOfWork.TransitForwardingOrderRepository.RemoveTransitForwardingOrder(_transitForwardinOrderToDelete);
                    }
                    catch (DbUpdateConcurrencyException ex)
                    {
                        return(new GenericResponse(false, ex.InnerException.Message));
                    }
                    catch (DbUpdateException ex)
                    {
                        return(new GenericResponse(false, ex.InnerException.Message));
                    }

                    // filter those which are not related to given forwarding order
                    var transitsForwardingOrderToDelete = transitsForwardingOrderToDeleteByTransitId.Where(x => x.ForwardingOrderId != forwardingOrderId);
                    if (transitsForwardingOrderToDelete.Count() == 0)
                    {
                        // delete also transit from transits table
                        try
                        {
                            await unitOfWork.TransitRepository.RemoveTransit(oldTransit);
                        }
                        catch (DbUpdateConcurrencyException ex)
                        {
                            return(new GenericResponse(false, ex.InnerException.Message));
                        }
                        catch (DbUpdateException ex)
                        {
                            return(new GenericResponse(false, ex.InnerException.Message));
                        }
                        continue;
                    }
                }
            }

            try
            {
                await unitOfWork.TransitRepository.UpdateTransits(transitsToAddOrUpdate);

                foreach (var _transit in transits.Transits)
                {
                    var transitForwardingOrderToUpdate = await unitOfWork.TransitForwardingOrderRepository.GetTransitForwardingOrderByTransitAndForwardingOrderAsync(_transit.Id, forwardingOrderId);

                    if (transitForwardingOrderToUpdate == null)
                    {
                        var newTransitForwardingOrder = new TransitForwardingOrder()
                        {
                            TransitId         = _transit.Id,
                            ForwardingOrderId = forwardingOrderId
                        };
                        transitForwardingOrdersToAddOrUpdate.Add(newTransitForwardingOrder);
                    }
                }

                await unitOfWork.TransitForwardingOrderRepository.UpdateTransitForwardingOrders(transitForwardingOrdersToAddOrUpdate);
            }
            catch (DbUpdateConcurrencyException ex)
            {
                return(new GenericResponse(false, ex.InnerException.Message));
            }
            catch (DbUpdateException ex)
            {
                return(new GenericResponse(false, ex.InnerException.Message));
            }
            return(new GenericResponse(true, "Transit has been updated."));
        }