示例#1
0
        public static PurchaseOrderMailerModel GetTemplateData(this Domain.PurchaseOrder purchaseOrder, string purchaseOrderId, string url)
        {
            var senderName = purchaseOrder.SenderInfo.Name;
            var lines      = purchaseOrder.Products.Select(o => new PurchaseOrderLineMailerModel
            {
                Line_Name     = o.Name,
                Line_Quantity = o.Quantity,
                Line_Price    = o.TotalOnSalePrice
            }).ToList();

            var address = purchaseOrder.ExpectedDelivery.Address;

            return(new PurchaseOrderMailerModel
            {
                Id = purchaseOrderId,
                Lines = lines,
                SenderName = senderName,
                Reference = purchaseOrder.Reference.AsPurchaseOrderIdentifier(),
                VendorName = purchaseOrder.VendorInfo.Name,
                CreatedOn = purchaseOrder.CreatedOn,
                ExpectedDeliveryDate = purchaseOrder.ExpectedDelivery.ExpectedDeliveryDate,
                TotalOnSalePrice = purchaseOrder.TotalOnSalePrice,
                TotalWholeSalePrice = purchaseOrder.TotalWholeSalePrice,
                TotalVatPrice = purchaseOrder.TotalVatPrice,
                DeliveryFeesWholeSalePrice = purchaseOrder.ExpectedDelivery.DeliveryFeesWholeSalePrice,
                DeliveryFeesVatPrice = purchaseOrder.ExpectedDelivery.DeliveryFeesVatPrice,
                DeliveryFeesOnSalePrice = purchaseOrder.ExpectedDelivery.DeliveryFeesOnSalePrice,
                PurchaseOrderUrl = url,
                ExpectedFrom = purchaseOrder.ExpectedDelivery.From,
                ExpectedTo = purchaseOrder.ExpectedDelivery.To,
                Address = address != null ? $"{address.Line1} {address.Line2} {address.Zipcode} {address.City}" : null,
                Reason = purchaseOrder.Reason,
                ClientKind = purchaseOrder.SenderInfo.Kind
            });
        }
        public async Task HandleAsync(CreatePurchaseOrderCommand command)
        {
            //Issue: Crossing the boundary context to cut shot the time.
            //This should call the Basket Api and get the details. Not the repository directly.
            var basketSpecification = new BasketWithItemsSpecification(command.BasketId);
            var basket = await _basketAsyncRepository.GetSingleAsync(basketSpecification);

            var items = new List <PurchaseOrderItem>();

            foreach (var basketItem in basket.BasketItems)
            {
                var catalogItem = await _catalogItemAsyncRepository.GetByIdAsync(basketItem.CatalogItemId);

                var itemOrdered = new CatalogItemOrdered(catalogItem.Id,
                                                         (CatalogItemType)catalogItem.CatalogType, catalogItem.Name, catalogItem.PictureUri);
                var orderItem = new PurchaseOrderItem(itemOrdered, basketItem.UnitPrice, basketItem.Quantity);
                items.Add(orderItem);
            }

            var purchaseOrderId = Guid.NewGuid();
            var purchaseOrderIdNumberMapping = new PurchaseOrderIdNumberMapping {
                PurchaseOrderId = purchaseOrderId
            };

            _purchaseOrderIdNumberMappingAsyncRepository.Add(purchaseOrderIdNumberMapping);
            await _unitOfWork.SaveChangesAsync();

            var purchaseOrder = new Domain.PurchaseOrder(purchaseOrderId, purchaseOrderIdNumberMapping.Id, basket.BuyerId, command.Address, items);
            await _shopAggregateRepositoryService.SaveAsync(purchaseOrder);
        }
示例#3
0
 public static object GetPurchaseNotifModel(this Domain.PurchaseOrder purchaseOrder, string purchaseOrderId)
 {
     return(new
     {
         PurchaseOrderId = purchaseOrderId,
         Status = purchaseOrder.Status,
         Reference = purchaseOrder.Reference,
         VendorName = purchaseOrder.VendorInfo.Name,
         SenderName = purchaseOrder.SenderInfo.Name,
         CreatedOn = purchaseOrder.CreatedOn,
         TotalOnSalePrice = purchaseOrder.TotalOnSalePrice,
         TotalWholeSalePrice = purchaseOrder.TotalWholeSalePrice,
         ExpectedDeliveryDate = purchaseOrder.ExpectedDelivery.ExpectedDeliveryDate
     });
 }
        private async Task NotifyProducerAsync(Domain.PurchaseOrder purchaseOrder, CancellationToken token)
        {
            var purchaseOrderIdentifier = _idSerializer.Serialize("Query", nameof(PurchaseOrder), purchaseOrder.Id);
            await _signalrService.SendNotificationToUserAsync(purchaseOrder.ProducerId, "PurchaseOrderWithdrawnEvent",
                                                              purchaseOrder.GetPurchaseNotifModelAsString(purchaseOrderIdentifier));

            var url = $"{_configuration.GetValue<string>("Portal:url")}/#/purchase-orders/{purchaseOrderIdentifier}?refresh={Guid.NewGuid():N}";
            await _emailService.SendTemplatedEmailAsync(
                purchaseOrder.VendorInfo.Email,
                purchaseOrder.VendorInfo.Name,
                $"Votre commande a expirée",
                nameof(PurchaseOrderExpiredEvent),
                purchaseOrder.GetTemplateData(purchaseOrderIdentifier, url),
                true,
                token);
        }
示例#5
0
        private static List <DeliveryProductMailerModel> GetProductsModel(Domain.PurchaseOrder purchaseOrder)
        {
            var products = new List <DeliveryProductMailerModel>();

            if (purchaseOrder.PickingId.HasValue)
            {
                products = purchaseOrder.Picking.PreparedProducts
                           .Where(p => p.PurchaseOrderId == purchaseOrder.Id)
                           .Select(p => GetProductModel(p, ModificationKind.ToDeliver))
                           .ToList();
            }
            else
            {
                products = purchaseOrder.Products
                           .Select(p => GetProductModel(p, ModificationKind.ToDeliver))
                           .ToList();
            }

            return(products);
        }
示例#6
0
        private static List <DeliveryReturnableMailerModel> GetReturnablesModel(Domain.PurchaseOrder purchaseOrder)
        {
            var returnables = new List <DeliveryReturnableMailerModel>();

            if (purchaseOrder.PickingId.HasValue)
            {
                returnables = purchaseOrder.Picking.PreparedProducts
                              .Where(p => p.HasReturnable && p.PurchaseOrderId == purchaseOrder.Id && p.Quantity > 0)
                              .Select(p => GetReturnableModel(p, ModificationKind.ToDeliver))
                              .ToList();
            }
            else
            {
                returnables = purchaseOrder.Products
                              .Where(p => p.HasReturnable)
                              .Select(p => GetReturnableModel(p, ModificationKind.ToDeliver))
                              .ToList();
            }

            return(returnables);
        }
示例#7
0
 public static string GetPurchaseNotifModelAsString(this Domain.PurchaseOrder purchaseOrder, string purchaseOrderId)
 {
     return(JsonConvert.SerializeObject(GetPurchaseNotifModel(purchaseOrder, purchaseOrderId)));
 }
示例#8
0
        public async Task <Result <Guid> > Handle(CreatePurchaseOrderCommand request, CancellationToken token)
        {
            var producer = await _context.Producers.SingleAsync(e => e.Id == request.ProducerId, token);

            var client = await _context.Users.SingleAsync(e => e.Id == request.ClientId, token);

            var deliveryMode =
                await _context.DeliveryModes.SingleAsync(
                    d => d.Id == request.DeliveryModeId && d.ProducerId == producer.Id, token);

            if (client.Kind == ProfileKind.Consumer)
            {
                return(Failure <Guid>(
                           "Cette fonction ne peux être utilisée que pour créer des commandes pour les professionels."));
            }

            if (request.Products == null || !request.Products.Any())
            {
                return(Failure <Guid>(
                           "Vous devez ajouter des produits à votre commande."));
            }

            if (request.Products.Any(p => p.Quantity <= 0))
            {
                return(Failure <Guid>(
                           "Un ou plusieurs produits possèdent une quantité inférieure ou égale à 0."));
            }

            if (request.ExpectedDeliveryDate < DateTimeOffset.UtcNow)
            {
                return(Failure <Guid>(
                           "La date de livraison ne peut être inférieure à aujourd'hui."));
            }

            if (request.From > request.To)
            {
                return(Failure <Guid>(
                           "L'heure de début ne peut être supérieure à l'heure de fin."));
            }

            var productsQuantity = new List <KeyValuePair <Domain.Product, int> >();
            var productIds       = request.Products.Select(p => p.Id).Distinct();
            var products         = await _context.Products
                                   .Where(p => productIds.Contains(p.Id) && p.ProducerId == producer.Id)
                                   .ToListAsync(token);

            Domain.Catalog catalog   = null;
            var            agreement = await _context.Agreements.SingleAsync(
                a => a.StoreId == client.Id && a.ProducerId == producer.Id && a.Status == AgreementStatus.Accepted,
                token);

            if (agreement != null)
            {
                catalog = agreement.Catalog;
            }

            catalog ??= await _context.Catalogs.SingleAsync(
                c => c.ProducerId == producer.Id && c.Kind == CatalogKind.Stores && c.Available && c.IsDefault, token);

            foreach (var product in products)
            {
                var quantity = request.Products.Where(p => p.Id == product.Id).Sum(p => p.Quantity);
                productsQuantity.Add(new KeyValuePair <Domain.Product, int>(product, quantity ?? 0));
            }

            var resultIdentifier =
                await _identifierService.GetNextPurchaseOrderReferenceAsync(request.ProducerId, token);

            if (!resultIdentifier.Succeeded)
            {
                return(Failure <Guid>(resultIdentifier));
            }

            var purchaseOrder = new Domain.PurchaseOrder(Guid.NewGuid(), resultIdentifier.Data,
                                                         PurchaseOrderStatus.Accepted, request.ExpectedDeliveryDate, request.From, request.To, deliveryMode,
                                                         producer, client, productsQuantity, catalog, request.SkipNotification, request.Comment);

            await _context.AddAsync(purchaseOrder, token);

            await _context.SaveChangesAsync(token);

            if (deliveryMode.MaxPurchaseOrdersPerTimeSlot.HasValue)
            {
                await _tableService.IncreaseProducerDeliveryCountAsync(producer.Id, deliveryMode.Id,
                                                                       request.ExpectedDeliveryDate, request.From,
                                                                       request.To, deliveryMode.MaxPurchaseOrdersPerTimeSlot.Value, token);
            }

            return(Success(purchaseOrder.Id));
        }