// -------------------- .CREATE -------------------- //
 // -------------------- UPDATE -------------------- //
 /// <summary>
 /// Update booking
 /// </summary>
 /// <param name="booking"></param>
 public void Update(BookingDto booking)
 {
     Repository.Update<Booking>(booking.ExposedAs<Booking>(Repository));
     UnitOfWork.Save();
 }
        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>();
        }
        // -------------------- .GET -------------------- //
        // -------------------- CREATE -------------------- //
        /// <summary>
        /// Create a booking
        /// </summary>
        /// <param name="booking"></param>
        /// <returns></returns>
        public BookingDto Create(BookingDto booking)
        {
            // IRepository repository = Repository;
            var book = booking.ExposedAs<Booking>(Repository);
            book.ReferenceNo = GetBookingReferenceNo();
            // Convert date time to UTC
            book.CreatedDate = DateTime.UtcNow;
            book.ModifiedDate = DateTime.UtcNow;

            Repository.Insert<Booking>(book);
            UnitOfWork.Save();

            booking = book.ExposedAs<BookingDto>();

            // Add to booking event for consultant
            if (booking.Type != BookingType.TalkNow)
            {
                var bookingEventDto = new BookingEventDto
                {
                    Booking = booking,
                    SourceUser = booking.Customer,
                    TargetUser = booking.Specialist,
                    ShortDescription = AlertShortDescription.BookingRequestMade,
                    Description = AlertDescription.BookingRequestMade,
                    CreatedDate = DateTime.UtcNow,
                    ModifiedDate = DateTime.UtcNow,
                    IsRead = false,
                    EmailAlertSubject = EmailAlertSubject.BookingRequestMade,
                    EmailAlertDetail = EmailAlertDetail.BookingRequestMade,
                    SMSAlertDetail = SMSAlertDetail.BookingRequestMade
                };

                CreateBookingEvent(bookingEventDto);
            }

            return booking;
        }