/// <summary> /// Create a subscription invoice /// </summary> /// <param name="planId"></param> /// <param name="userId"></param> /// <returns></returns> public Invoice CreateSubscriptionInvoice(Braintree.Plan planDetail, Guid userId, string transactionId) { //var planDetail = new PaymentService(UnitOfWork, Repository, Settings).GetPlanById(planId); try { User user = Repository.FindById<User>(userId); if (planDetail == null || user == null) { throw new ArgumentException("Generate subscription invoice. Cannot find Plan or User with id:" + userId); } var invoice = new Invoice() { InvoiceNumber = GetInvoiceNumber(), User = user, Description = string.Format(InvoiceConst.InvoiceSubscriptionDescription, planDetail.BillingFrequency.Value), CreatedDate = DateTime.UtcNow, GST = SubtractGSTCalculator(planDetail.Price.Value), Amount = planDetail.Price.Value, Currency = planDetail.CurrencyIsoCode, Duration = planDetail.BillingFrequency.Value, Type = InvoiceType.Subscription, PaymentStatus = true, TransactionId = transactionId, }; Repository.Insert<Invoice>(invoice); UnitOfWork.Save(); if (!invoice.Id.Equals(Guid.Empty)) { string mailContent = GetEmailContentOfInvoice(invoice.ExposedAs<InvoiceDto>()); string mailToPdf = TranformToInvoiceTemplate(invoice.User.ExposedAs<UserDto>(), invoice.ExposedAs<InvoiceDto>(), "months", ConstEmailTemplateKey.SubscriptionInvoiceTemplate, null); System.Threading.Tasks.Task.Factory.StartNew(() => { byte[] pdfAsByte = HtmlToPdf.GetPdfData(mailToPdf, baseUrl); string fileName = string.Format("invoice_{0}.pdf", invoice.InvoiceNumber); SendInvoice(fileName, pdfAsByte, mailContent, user.Email, ConstEmailSubject.SubscriptionInvoice); }); } else { throw new ArgumentException("Cannot save subscription invoice to database"); } return invoice; } catch (Exception e) { throw new ArgumentException(e.Message); } }
public InvoiceDto CreateTranscriptionInvoice(decimal amount, int duration, decimal ratePerMinute, BookingDto booking, UserDto user, string transactionId) { Invoice invoice = new Invoice { InvoiceNumber = GetInvoiceNumber(), Amount = amount, GST = SubtractGSTCalculator(amount), RatePerMinute = ratePerMinute, Duration = duration, Type = InvoiceType.OrderTranscript, CreatedDate = DateTime.UtcNow, ModifiedDate = DateTime.UtcNow, SentDate = DateTime.UtcNow, User = user.ExposedAs<User>(Repository), Currency = Currency.AUD.ToString(), PaymentStatus = true, Booking = booking.ExposedAs<Booking>(Repository) }; invoice.Description = string.Format(InvoiceConst.InvoiceCallRecordDescription, invoice.Booking.ReferenceNo); Repository.Insert<Invoice>(invoice); UnitOfWork.Save(); if (!invoice.Id.Equals(Guid.Empty)) { var mailContent = GetEmailContentOfInvoice(invoice.ExposedAs<InvoiceDto>()); var mailPdfContent = TranformToInvoiceTemplate(user, invoice.ExposedAs<InvoiceDto>(), null, ConstEmailTemplateKey.ConsultationInvoiceTemplate, null); System.Threading.Tasks.Task.Factory.StartNew(() => { byte[] pdfAsByte = HtmlToPdf.GetPdfData(mailPdfContent, baseUrl); string fileName = GenerateInvoiceName(invoice.InvoiceNumber); SendInvoice(fileName, pdfAsByte, mailContent, user.Email, ConstEmailSubject.TranscriptionInvoice); }); } else { throw new ArgumentException("Cannot save transcription invoice to database"); } return invoice.ExposedAs<InvoiceDto>(); }
/// <summary> /// Create a consultation invoice /// </summary> /// <param name="minimumCharge">true if apply minimum charge</param> /// <returns></returns> public InvoiceDto CreateConsultationInvoice(decimal amount, Guid bookingId, bool minimumCharge, bool isCustomer, string transactionId) { var SystemConfig = new SystemConfigService(UnitOfWork, Repository, Settings); string emailAddress = string.Empty; Invoice invoice = new Invoice(amount, InvoiceType.Consultation, Currency.AUD.ToString(), string.Empty, true, null, DateTime.UtcNow, DateTime.UtcNow); invoice.InvoiceNumber = GetInvoiceNumber(); Booking booking = Repository.FindById<Booking>(bookingId); invoice.User = isCustomer ? booking.Customer : booking.Specialist; emailAddress = invoice.User.Email; invoice.Description = string.Format(InvoiceConst.InvoiceNormalDescription, booking.ReferenceNo, invoice.User.ExposedAs<UserDto>().Name); Log.Debug("CreateConsultationInvoice - before calculate GST - Customer:" + booking.Customer.UserName + " - specialist:" + booking.Specialist.UserName + " - Amount: " + amount + " - GSTRegistered:" + booking.Specialist.Profile.GstRegistered + " - SpecializationGST:" + booking.Specialization.GST); invoice.GST = booking.Specialist.Profile.GstRegistered ? booking.Specialization.GST ? SubtractGSTCalculator(amount) : 0 : 0; Log.Debug("CreateConsultationInvoice - after calculate GST - Customer:" + booking.Customer.UserName + " - specialist:" + booking.Specialist.UserName + " - Amount: " + amount + " - Invoice Calculated GST:" + invoice.GST + " - function calculate GST return:" + SubtractGSTCalculator(amount)); invoice.TransactionId = transactionId; if (minimumCharge) // minimum charge invoice { invoice.Description = string.Format(InvoiceConst.InvoiceCancelDescription, booking.ReferenceNo) + InvoiceConst.InvoiceApplyMinimumDescription; invoice.Duration = 0; invoice.RatePerMinute = booking.RatePerMinute; invoice.ConsultationType = ConsultationType.MinimumCharge; invoice.Booking = booking; invoice.DeclineBookingRate = isCustomer ? booking.CustomerMinCharge : booking.SpecialistMinCharge; invoice.Amount = invoice.DeclineBookingRate; } else // normal consultation invoice { var call = Repository.Query<Call>().FirstOrDefault(x => x.Booking.Id.Equals(bookingId)); if (call == null) { throw new ArgumentException("Generate consulation invoice with booking Id: " + bookingId); } ConsultationType consultType; if (call.Booking.Type == BookingType.ASAP) { consultType = ConsultationType.StandardHour; } else { Enum.TryParse(call.Booking.Type.ToString(), out consultType); } invoice.Booking = call.Booking; invoice.Duration = call.Duration; invoice.RatePerMinute = isCustomer ? call.Booking.CostPerMinute : call.Booking.RatePerMinute; invoice.ConsultationType = consultType; if (call.Duration < Convert.ToInt32(SystemConfig.GetByKey(ParamatricBusinessRules.STARTING_TIME.ToString()).Value)) { invoice.Description += InvoiceConst.InvoiceApplyMinimumDescription; } } Repository.Insert<Invoice>(invoice); UnitOfWork.Save(); Log.Debug("CreateConsultationInvoice - after insert invoice - Customer:" + booking.Customer.UserName + " - specialist:" + booking.Specialist.UserName + " - Amount: " + invoice.Amount + " - Invoice Calculated GST:" + invoice.GST); if (invoice.Id.Equals(Guid.Empty)) { throw new ArgumentException("Cannot save consultation invoice to database"); } return invoice.ExposedAs<InvoiceDto>(); }