Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //
- // HotelPaymentController.swift
- // Sesam Rent
- //
- // Created by Giorgio Casti on 01/07/2019.
- // Copyright © 2019 Giorgio Casti. All rights reserved.
- //
- import Foundation
- import Firebase
- import Stripe
- class HotelPaymentController: UIViewController,UITextFieldDelegate,STPPaymentOptionsViewControllerDelegate {
- //dati utente ok
- //dati hotel
- //dati camera
- var paymentOpt: STPPaymentOption?
- @IBOutlet var paymentbutton: RoundedBtn!
- var bedType:String!
- var personPerRoom: Int!
- var priceamount: Int!
- var HotelName:String!
- var bookDatestart:Date!
- var bookDateEnd: Date!
- var destinationAccount: String!
- var ownerUID: String!
- var ServiceID: String!
- var card = ""
- var nights: Int!
- var address: String!
- @IBOutlet var activityIndicator: UIActivityIndicatorView!
- var reservationID: String!
- var redirectContext: STPRedirectContext!
- @IBOutlet var datestartlabel: UILabel!
- @IBOutlet var dateendlabel: UILabel!
- @IBOutlet var fullName: UITextField!
- @IBOutlet var emailAddress: UITextField!
- @IBOutlet var phone: UITextField!
- @IBOutlet var carModel: UITextField!
- @IBOutlet var hotelName: UITextField!
- @IBOutlet var roomInfo: UITextField!
- @IBOutlet var nightNumber: UILabel!
- @IBOutlet var fromdate: UILabel!
- @IBOutlet var todate: UILabel!
- @IBOutlet var Total: UILabel!
- @IBOutlet var price: UITextField!
- @IBAction func paybutton(_ sender: Any) {
- paymentbutton.isEnabled = false
- let ref = db.collection("users").document(Auth.auth().currentUser!.uid)
- ref.getDocument { (document, error) in
- let data = document?.data()
- self.card = data?["defaultCardID"] as! String
- print(self.card)
- if (self.card == ""){
- let config = STPPaymentConfiguration.shared()
- config.additionalPaymentOptions = .all
- config.requiredBillingAddressFields = .none
- // config.appleMerchantIdentifier = "dummy-merchant-id"
- let keyprovider = KeyProvider()
- let customerContext = STPCustomerContext(keyProvider: keyprovider)
- let paymentMethodsViewController = STPPaymentOptionsViewController(configuration: STPPaymentConfiguration.shared(), theme: STPTheme.default(), customerContext: customerContext, delegate: self as STPPaymentOptionsViewControllerDelegate)
- let navigationController = UINavigationController(rootViewController: paymentMethodsViewController)
- self.present(navigationController, animated: true)
- self.paymentbutton.isEnabled = true
- } else {
- print("calling payment.....")
- self.activityIndicator.isHidden = false
- self.activityIndicator.startAnimating()
- functions.httpsCallable("stripePaymentIntents").call(["account":self.ownerUID,"amount":self.priceamount.description,"from": self.dateformat(date: self.bookDatestart), "to":self.dateformat(date: self.bookDateEnd),"customerphone":self.phone.text! , "customeremail":self.emailAddress.text!,"nights":self.nightNumber.text!]) { (result, error) in
- if let error = error as NSError? {
- if error.domain == FunctionsErrorDomain {
- let code = FunctionsErrorCode(rawValue: error.code)
- let message = error.localizedDescription
- print("error domain")
- print(error)
- print (code ?? "")
- print (message)
- }
- }
- // if (result?.data as? [String: Any]) != nil{
- if let res = (result?.data as? [AnyHashable: Any] ){
- print ("RESULT IS")
- print (res)
- self.redirectContext = nil
- let paymentIntent = STPPaymentIntent.decodedObject(fromAPIResponse: res)
- if paymentIntent?.status == .requiresAction {
- print("action is required")
- self.redirectContext = STPRedirectContext(paymentIntent: paymentIntent!, completion: { clientSecret, redirectError in
- // Fetch the latest status of the Payment Intent if necessary
- print("we got callback, checking ")
- STPAPIClient.shared().retrievePaymentIntent(withClientSecret: clientSecret) { paymentIntent, error in
- //( print(paymentIntent?.allResponseFields)
- if (paymentIntent?.status == .succeeded){
- print("ok to go")
- //HEERE CALL SEGUE
- //
- functions.httpsCallable("createReservation").call(["hotelname":self.HotelName,"fromdate": self.bookDatestart.description,"todate": self.bookDateEnd.description,"room":self.bedType,"price":self.priceamount,"serviceID":self.ServiceID,"carinfo":self.carModel.text!,"owneruid":self.ownerUID,"personnumber":self.personPerRoom,"address": self.address, "email":Auth.auth().currentUser?.email ?? "", "paymentIntents":paymentIntent?.clientSecret as Any]
- ) { (result, error) in
- self.reservationID = result!.data as? String
- self.activityIndicator.stopAnimating()
- /// PROBLEM HERE ///
- // ATTEMPTING TO PRESENT SEGUE WHILE SFSAfariviewcontroller is still active
- self.performSegue(withIdentifier: "showticket", sender: nil)
- }
- }
- if (paymentIntent?.status == .requiresPaymentMethod){
- Waiter.shared.showAlertfromcontroller(title: "Error", message: "Your Payment has beed declined", button: "Ok", fromController: self)
- }
- if (paymentIntent?.status == .unknown){
- Waiter.shared.showAlertfromcontroller(title: "Error", message: "Your Payment has beed declined", button: "Ok", fromController: self)
- }
- }
- })
- //calling redirect for 3ds
- self.redirectContext.startRedirectFlow(from: self)
- }
- //PAYMENT NOT REQUIRE 3ds Auth
- if paymentIntent?.status == .succeeded{
- //CALL SEGUE HERE
- self.redirectContext = nil
- functions.httpsCallable("createReservation").call(["hotelname":self.HotelName,"fromdate":self.bookDatestart.description,"todate": self.bookDateEnd.description,"room":self.bedType,"price":self.priceamount,"serviceID":self.ServiceID,"carinfo":self.carModel.text!,"owneruid":self.ownerUID,"email":Auth.auth().currentUser?.email ?? "","personnumber":self.personPerRoom,"paymentIntents":paymentIntent?.clientSecret as Any,"address":self.address]
- ) { (result, error) in
- self.reservationID = result!.data as? String
- self.performSegue(withIdentifier: "showticket", sender: nil)
- }
- }
- if paymentIntent?.status == .requiresPaymentMethod {
- Waiter.shared.showAlertfromcontroller(title: "Error", message: "Your Payment has beed declined", button: "Ok", fromController: self)
- }
- } else {
- Waiter.shared.showAlertfromcontroller(title: "Error", message: "Error processing your payment, no charge have been created", button: "Ok", fromController: self)
- self.paymentbutton.isEnabled = true
- }
- }
- }
- }
- }
- @IBOutlet var nightslabel: UILabel!
- override func viewDidLoad() {
- //init toolbar
- activityIndicator.isHidden = true
- let toolbar:UIToolbar = UIToolbar(frame: CGRect(x: 0, y: 0, width: self.view.frame.size.width, height: 30))
- //create left side empty space so that done button set on right side
- let flexSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
- let doneBtn: UIBarButtonItem = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: Selector(("donebutton")))
- toolbar.setItems([flexSpace, doneBtn], animated: false)
- toolbar.sizeToFit()
- //setting toolbar as inputAccessoryView
- self.phone!.inputAccessoryView = toolbar
- self.fullName.isUserInteractionEnabled = false
- self.carModel.isUserInteractionEnabled = false
- self.emailAddress.isUserInteractionEnabled = false
- self.price.isUserInteractionEnabled = false
- self.hotelName.isUserInteractionEnabled = false
- self.dateendlabel.isUserInteractionEnabled = false
- self.datestartlabel.isUserInteractionEnabled = false
- self.roomInfo.isUserInteractionEnabled = false
- //number of night calculation
- let nights = self.daysBetweenDates(startDate: bookDatestart, endDate: bookDateEnd)
- nightslabel.text = nights.description
- let totalprice = (self.priceamount * nights)
- Total.text = totalprice.description + " €"
- self.price.text = priceamount.description + " €"
- self.hotelName.text = HotelName
- //converting dates to someting readable
- let dateformatter = DateFormatter()
- dateformatter.dateFormat = "dd-MM-yyyy"
- let newbookDatestart = dateformatter.string(from: bookDatestart)
- let newbookDateEnd = dateformatter.string(from: bookDateEnd)
- self.datestartlabel.text = newbookDatestart.description
- self.dateendlabel.text = newbookDateEnd.description
- self.roomInfo.text = self.personPerRoom.description + (" Person -") + self.bedType
- UserHelper.shared.getLoggedUser(handler: { user in
- if (user?.userType == "standard"){
- let name = user?.name ?? "-"
- let surname = user?.surname ?? "-"
- let carbrand = user?.carBrand ?? "-"
- let carmodel = user?.carModel ?? "-"
- let carplate = user?.carPlate ?? "-"
- self.fullName.text = name + " " + surname
- self.carModel.text = "\(carbrand)" + " " + "\(carmodel)" + " " + "\(carplate)"
- self.emailAddress.text = user?.email ?? "-"
- } else {
- let name = user?.ownername ?? "-"
- let surname = user?.ownersurname ?? "-"
- self.fullName.text = name + " " + surname
- self.carModel.text = "NO CAR INFO"
- self.emailAddress.text = user?.email ?? "-"
- }
- })
- // db.collection("Hotels").document(serviceID).collection("HotelRooms").document(roomID).getDocument { (document, error) in
- // let roomdata = document?.data()
- // print (roomdata)
- // }
- }
- override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
- let ticket = segue.destination as! HotelReservationTicket
- ticket.reservation_idPrep = self.reservationID
- ticket.addressPrep = self.address
- ticket.fromPrep = self.bookDatestart
- ticket.toPrep = self.bookDateEnd
- ticket.guestNumberPrep = self.personPerRoom
- ticket.hotelnamePrep = self.HotelName
- ticket.roomPrep = self.bedType
- ticket.popup = true
- }
- func textFieldShouldReturn(textField: UITextField) -> Bool {
- textField.resignFirstResponder()
- //or
- //self.view.endEditing(true)
- return true
- }
- @IBAction func back(_ sender: Any) {
- print("dismiss")
- self.dismiss(animated: true, completion: nil)
- }
- @objc func donebutton() {
- self.view.endEditing(true)
- }
- func daysBetweenDates(startDate: Date, endDate: Date) -> Int
- {
- let requestedComponent: Set<Calendar.Component> = [.day]
- let calendar = Calendar.current
- let timeDifference = calendar.dateComponents(requestedComponent, from: startDate, to: endDate)
- return timeDifference.day ?? 1
- }
- func dateformat(date: Date) -> String{
- let dateformatter = DateFormatter()
- dateformatter.dateFormat = "dd-MM-yyyy"
- return dateformatter.string(from: date)
- }
- func paymentOptionsViewController(_ paymentOptionsViewController: STPPaymentOptionsViewController, didFailToLoadWithError error: Error) {
- dismiss(animated: true, completion: nil)
- }
- func paymentOptionsViewControllerDidCancel(_ paymentOptionsViewController: STPPaymentOptionsViewController) {
- dismiss(animated: true, completion: nil)
- }
- func paymentOptionsViewControllerDidFinish(_ paymentOptionsViewController: STPPaymentOptionsViewController) {
- if let card = paymentOpt as? STPCard {
- let paymentStripeId = card.stripeID
- // db.collection("users").document(Auth.auth().currentUser!.uid).setValue(paymentStripeId as String, forKey: "defaultCardID")
- print (Auth.auth().currentUser!.uid)
- db.collection("users").document(Auth.auth().currentUser!.uid).setData(["defaultCardID": paymentStripeId as String], merge: true)
- print("CARD HAS BEEN INSERTED IN BACKEND from paymentcontroller")
- }
- dismiss(animated: true, completion: nil)
- }
- func paymentOptionsViewController(_ paymentOptionsViewController: STPPaymentOptionsViewController, didSelect paymentOption: STPPaymentOption) {
- print("OPTION HAS BEEN SELECTED")
- paymentOpt = paymentOption
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement