public Task <Result> SendInvoice(Booking booking, string email, bool sendCopyToAdmins, SlimAgentContext agent)
        {
            // TODO: hardcoded to be removed with UEDA-20
            var addresses = new List <string> {
                email
            };

            if (sendCopyToAdmins)
            {
                addresses.AddRange(_options.CcNotificationAddresses);
            }

            return(_documentsService.GetActualInvoice(booking)
                   .Bind(async invoice =>
            {
                var(registrationInfo, data) = invoice;
                var invoiceData = new InvoiceData
                {
                    Number = registrationInfo.Number,
                    BuyerDetails = data.BuyerDetails,
                    InvoiceDate = DateTimeFormatters.ToDateString(registrationInfo.Date),
                    InvoiceItems = data.InvoiceItems
                                   .Select(i => new InvoiceData.InvoiceItem
                    {
                        Number = i.Number,
                        Price = FormatPrice(i.Price),
                        Total = FormatPrice(i.Total),
                        AccommodationName = i.AccommodationName,
                        RoomDescription = i.RoomDescription,
                        RoomType = EnumFormatters.FromDescription <RoomTypes>(i.RoomType),
                        DeadlineDate = DateTimeFormatters.ToDateString(i.DeadlineDate),
                        MainPassengerName = PersonNameFormatters.ToMaskedName(i.MainPassengerFirstName, i.MainPassengerLastName)
                    })
                                   .ToList(),
                    TotalPrice = FormatPrice(data.TotalPrice),
                    CurrencyCode = EnumFormatters.FromDescription(data.TotalPrice.Currency),
                    ReferenceCode = data.ReferenceCode,
                    SupplierReferenceCode = data.SupplierReferenceCode,
                    SellerDetails = data.SellerDetails,
                    PayDueDate = DateTimeFormatters.ToDateString(data.PayDueDate),
                    CheckInDate = DateTimeFormatters.ToDateString(data.CheckInDate),
                    CheckOutDate = DateTimeFormatters.ToDateString(data.CheckOutDate),
                    PaymentStatus = EnumFormatters.FromDescription(data.PaymentStatus),
                    DeadlineDate = DateTimeFormatters.ToDateString(data.DeadlineDate)
                };

                return await _notificationsService.Send(agent: agent,
                                                        messageData: invoiceData,
                                                        notificationType: NotificationTypes.BookingInvoice,
                                                        emails: addresses);
            }));
        }
        public Task <Result> SendInvoice(int bookingId, string email, int agentId)
        {
            // TODO: hardcoded to be removed with UEDA-20
            var addresses = new List <string> {
                email
            };

            addresses.AddRange(_options.CcNotificationAddresses);

            return(_bookingDocumentsService.GetActualInvoice(bookingId, agentId)
                   .Bind(invoice =>
            {
                var(registrationInfo, data) = invoice;
                var invoiceData = new InvoiceData
                {
                    Number = registrationInfo.Number,
                    BuyerDetails = data.BuyerDetails,
                    InvoiceDate = DateTimeFormatters.ToDateString(registrationInfo.Date),
                    InvoiceItems = data.InvoiceItems
                                   .Select(i => new InvoiceData.InvoiceItem
                    {
                        Number = i.Number,
                        Price = FormatPrice(i.Price),
                        Total = FormatPrice(i.Total),
                        AccommodationName = i.AccommodationName,
                        RoomDescription = i.RoomDescription,
                        RoomType = EnumFormatters.FromDescription(i.RoomType),
                        DeadlineDate = DateTimeFormatters.ToDateString(i.DeadlineDate),
                        MainPassengerName = PersonNameFormatters.ToMaskedName(i.MainPassengerFirstName, i.MainPassengerLastName)
                    })
                                   .ToList(),
                    TotalPrice = FormatPrice(data.TotalPrice),
                    CurrencyCode = EnumFormatters.FromDescription(data.TotalPrice.Currency),
                    ReferenceCode = data.ReferenceCode,
                    SellerDetails = data.SellerDetails,
                    PayDueDate = DateTimeFormatters.ToDateString(data.PayDueDate),
                    CheckInDate = DateTimeFormatters.ToDateString(data.CheckInDate),
                    CheckOutDate = DateTimeFormatters.ToDateString(data.CheckOutDate),
                    PaymentStatus = EnumFormatters.FromDescription(data.PaymentStatus)
                };

                return _mailSender.Send(_options.InvoiceTemplateId, addresses, invoiceData);
            }));
        }
        public static string GetLeadingPassengerFormattedName(this Booking booking)
        {
            var leadingPassengersList = booking.Rooms
                                        .SelectMany(r =>
            {
                if (r.Passengers == null)
                {
                    return(new List <Passenger>(0));
                }

                return(r.Passengers.Where(p => p.IsLeader));
            })
                                        .ToList();

            if (leadingPassengersList.Any())
            {
                var leadingPassenger = leadingPassengersList.First();
                return(PersonNameFormatters.ToMaskedName(leadingPassenger.FirstName, leadingPassenger.LastName,
                                                         EnumFormatters.FromDescription(leadingPassenger.Title)));
            }

            return(PersonNameFormatters.ToMaskedName("*", string.Empty));
        }