Exemplo n.º 1
0
        private async Task <List <AgentInvitationResponse> > GetInvitationsWithInviter(Expression <Func <UserInvitation, bool> > filterExpression)
        {
            var rows = await _context
                       .UserInvitations
                       .Where(i => i.InvitationStatus != UserInvitationStatuses.Resent)
                       .Where(filterExpression)
                       .Join(
                _context.Agents,
                invite => invite.InviterUserId,
                agent => agent.Id,
                (invite, inviter) => new { Invite = invite, Inviter = inviter }
                )
                       .ToListAsync();

            return(rows.Select(r => new { r.Invite, r.Inviter, Data = _invitationRecordService.GetInvitationData(r.Invite) })
                   .Select(i => new AgentInvitationResponse(
                               i.Invite.CodeHash,
                               i.Data.UserRegistrationInfo.Title,
                               i.Data.UserRegistrationInfo.FirstName,
                               i.Data.UserRegistrationInfo.LastName,
                               i.Data.UserRegistrationInfo.Position,
                               i.Invite.Email,
                               $"{i.Inviter.FirstName} {i.Inviter.LastName}",
                               DateTimeFormatters.ToDateString(i.Invite.Created),
                               i.Invite.InvitationStatus,
                               i.Invite.IsExpired(_dateTimeProvider.UtcNow()))
                           )
                   .ToList());
        }
        public Task <Result> SendVoucher(Booking booking, string email, string languageCode, SlimAgentContext agent)
        {
            return(_documentsService.GenerateVoucher(booking, languageCode)
                   .Bind(async voucher =>
            {
                var voucherData = new VoucherData
                {
                    Accommodation = voucher.Accommodation,
                    AgentName = voucher.AgentName,
                    BookingId = voucher.BookingId,
                    DeadlineDate = DateTimeFormatters.ToDateString(voucher.DeadlineDate),
                    NightCount = voucher.NightCount,
                    ReferenceCode = voucher.ReferenceCode,
                    SupplierReferenceCode = voucher.SupplierReferenceCode,
                    PropertyOwnerConfirmationCode = voucher.PropertyOwnerConfirmationCode,
                    RoomConfirmationCodes = string.Join("; ", voucher.RoomDetails.Select(r => r.SupplierRoomReferenceCode)),
                    RoomDetails = voucher.RoomDetails,
                    CheckInDate = DateTimeFormatters.ToDateString(voucher.CheckInDate),
                    CheckOutDate = DateTimeFormatters.ToDateString(voucher.CheckOutDate),
                    MainPassengerName = voucher.MainPassengerName,
                    BannerUrl = voucher.BannerUrl,
                    LogoUrl = voucher.LogoUrl
                };

                return await _notificationsService.Send(agent: agent,
                                                        messageData: voucherData,
                                                        notificationType: NotificationTypes.BookingVoucher,
                                                        email: email);
            }));
        }
        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);
            }));
        }
Exemplo n.º 4
0
 public VccBookingRow Convert(VccBookingData data)
 => new VccBookingRow
 {
     GuestName          = data.GuestName,
     ReferenceCode      = data.ReferenceCode,
     CheckInDate        = DateTimeFormatters.ToDateString(data.CheckInDate),
     CheckOutDate       = DateTimeFormatters.ToDateString(data.CheckOutDate),
     Amount             = data.Amount,
     Currency           = EnumFormatters.FromDescription(data.Currency),
     CardActivationDate = DateTimeFormatters.ToDateString(data.CardActivationDate),
     CardDueDate        = DateTimeFormatters.ToDateString(data.CardDueDate),
     CardNumber         = data.CardNumber,
     CardAmount         = data.CardAmount
 };
        public Task <Result> SendPaymentConfirmation(PaymentLinkData link)
        {
            var payload = new PaymentLinkPaymentConfirmation
            {
                Date               = DateTimeFormatters.ToDateString(link.Date),
                Amount             = MoneyFormatter.ToCurrencyString(link.Amount, link.Currency),
                ReferenceCode      = link.ReferenceCode,
                ServiceDescription = link.ServiceType.ToString(),
            };

            return(_notificationService.Send(messageData: payload,
                                             notificationType: NotificationTypes.PaymentLinkPaidNotification,
                                             email: link.Email));
        }
Exemplo n.º 6
0
 static BookingSummaryNotificationData.BookingData CreateBookingData(Booking booking)
 => new BookingSummaryNotificationData.BookingData
 {
     ReferenceCode    = booking.ReferenceCode,
     Accommodation    = booking.AccommodationName,
     Location         = $"{booking.Location.Country}, {booking.Location.Locality}",
     LeadingPassenger = booking.GetLeadingPassengerFormattedName(),
     Amount           = MoneyFormatter.ToCurrencyString(booking.TotalPrice, booking.Currency),
     DeadlineDate     = DateTimeFormatters.ToDateString(booking.DeadlineDate),
     CheckInDate      = DateTimeFormatters.ToDateString(booking.CheckInDate),
     CheckOutDate     = DateTimeFormatters.ToDateString(booking.CheckOutDate),
     Status           = EnumFormatters.FromDescription(booking.Status),
     PaymentType      = EnumFormatters.FromDescription(booking.PaymentType)
 };
Exemplo n.º 7
0
        public async Task <Result <string> > SendBookingReports(int agencyId)
        {
            var reportBeginTime = _dateTimeProvider.UtcNow();
            var reportEndTime   = reportBeginTime.AddDays(1);

            return(await GetEmailsAndSettings()
                   .Map(GetBookings)
                   .Bind(CreateMailData)
                   .Bind(SendMails));


            async Task <Result <List <EmailAndSetting> > > GetEmailsAndSettings()
            {
                var rolesWithPermission = await _context.AgentRoles
                                          .Where(x => x.Permissions.HasFlag(InAgencyPermissions.ReceiveBookingSummary))
                                          .Select(x => x.Id)
                                          .ToListAsync();

                var emailsAndSettings = await
                                            (from relation in _context.AgentAgencyRelations
                                            join agent in _context.Agents
                                            on relation.AgentId equals agent.Id
                                            where relation.AgencyId == agencyId &&
                                            relation.IsActive &&
                                            relation.AgentRoleIds.Any(rolesWithPermission.Contains)
                                            select new EmailAndSetting
                {
                    AgentId           = relation.AgentId,
                    AgencyId          = relation.AgencyId,
                    Email             = agent.Email,
                    ReportDaysSetting = _agentSettingsManager.GetUserSettings(agent).BookingReportDays
                }).ToListAsync();

                return(emailsAndSettings.Any()
                    ? Result.Success(emailsAndSettings)
                    : Result.Failure <List <EmailAndSetting> >($"Couldn't find any agents in agency with id {agencyId} to send summary to"));
            }

            async Task <(List <EmailAndSetting>, List <Booking>)> GetBookings(List <EmailAndSetting> emailsAndSettings)
            {
                var bookings = await _context.Bookings
                               .Where(b => b.AgencyId == agencyId &&
                                      b.PaymentType == PaymentTypes.VirtualAccount &&
                                      b.PaymentStatus != BookingPaymentStatuses.Captured &&
                                      BookingStatusesForSummary.Contains(b.Status) &&
                                      ((b.DeadlineDate != null) ? b.DeadlineDate : b.CheckInDate) > reportBeginTime &&
                                      ((b.DeadlineDate != null) ? b.DeadlineDate : b.CheckInDate) <= reportEndTime)
                               .ToListAsync();

                return(emailsAndSettings, bookings);
            }

            async Task <Result <List <(BookingSummaryNotificationData, EmailAndSetting)> > > CreateMailData(
                (List <EmailAndSetting> emailsAndSettings, List <Booking> bookings) values)
            {
                var(_, isFailure, balanceInfo, error) = await _accountPaymentService.GetAccountBalance(Currencies.USD, agencyId);

                if (isFailure)
                {
                    return(Result.Failure <List <(BookingSummaryNotificationData, EmailAndSetting)> >(
                               $"Couldn't retrieve account balance for agency with id {agencyId}. Error: {error}"));
                }

                var agencyBalance = balanceInfo.Balance;

                return(values.emailsAndSettings.Select(emailAndSetting =>
                {
                    var resultingBalance = agencyBalance - values.bookings.Sum(b => b.TotalPrice);

                    return (new BookingSummaryNotificationData
                    {
                        Bookings = values.bookings.OrderBy(b => b.DeadlineDate).Select(CreateBookingData).ToList(),
                        CurrentBalance = MoneyFormatter.ToCurrencyString(agencyBalance, Currencies.USD),
                        ResultingBalance = MoneyFormatter.ToCurrencyString(resultingBalance, Currencies.USD),
                        ShowAlert = resultingBalance < 0m,
                        ReportDate = DateTimeFormatters.ToDateString(reportBeginTime)
                    },
                            emailAndSetting);
                }).Where(t => t.Item1.Bookings.Any()).ToList());