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); })); }
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)); }
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) };
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());