Advertisement
Guest User

Untitled

a guest
Jul 16th, 2019
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 17.67 KB | None | 0 0
  1. //
  2. // HotelPaymentController.swift
  3. // Sesam Rent
  4. //
  5. // Created by Giorgio Casti on 01/07/2019.
  6. // Copyright © 2019 Giorgio Casti. All rights reserved.
  7. //
  8.  
  9. import Foundation
  10. import Firebase
  11. import Stripe
  12.  
  13. class HotelPaymentController: UIViewController,UITextFieldDelegate,STPPaymentOptionsViewControllerDelegate {
  14.  
  15. //dati utente ok
  16. //dati hotel
  17. //dati camera
  18.  
  19. var paymentOpt: STPPaymentOption?
  20.  
  21. @IBOutlet var paymentbutton: RoundedBtn!
  22. var bedType:String!
  23. var personPerRoom: Int!
  24. var priceamount: Int!
  25. var HotelName:String!
  26. var bookDatestart:Date!
  27. var bookDateEnd: Date!
  28. var destinationAccount: String!
  29. var ownerUID: String!
  30. var ServiceID: String!
  31. var card = ""
  32. var nights: Int!
  33. var address: String!
  34.  
  35. @IBOutlet var activityIndicator: UIActivityIndicatorView!
  36. var reservationID: String!
  37.  
  38. var redirectContext: STPRedirectContext!
  39. @IBOutlet var datestartlabel: UILabel!
  40. @IBOutlet var dateendlabel: UILabel!
  41. @IBOutlet var fullName: UITextField!
  42. @IBOutlet var emailAddress: UITextField!
  43.  
  44.  
  45. @IBOutlet var phone: UITextField!
  46. @IBOutlet var carModel: UITextField!
  47. @IBOutlet var hotelName: UITextField!
  48. @IBOutlet var roomInfo: UITextField!
  49. @IBOutlet var nightNumber: UILabel!
  50. @IBOutlet var fromdate: UILabel!
  51. @IBOutlet var todate: UILabel!
  52. @IBOutlet var Total: UILabel!
  53. @IBOutlet var price: UITextField!
  54.  
  55. @IBAction func paybutton(_ sender: Any) {
  56.  
  57. paymentbutton.isEnabled = false
  58.  
  59.  
  60. let ref = db.collection("users").document(Auth.auth().currentUser!.uid)
  61. ref.getDocument { (document, error) in
  62.  
  63. let data = document?.data()
  64. self.card = data?["defaultCardID"] as! String
  65.  
  66. print(self.card)
  67.  
  68. if (self.card == ""){
  69.  
  70. let config = STPPaymentConfiguration.shared()
  71. config.additionalPaymentOptions = .all
  72. config.requiredBillingAddressFields = .none
  73. // config.appleMerchantIdentifier = "dummy-merchant-id"
  74. let keyprovider = KeyProvider()
  75. let customerContext = STPCustomerContext(keyProvider: keyprovider)
  76. let paymentMethodsViewController = STPPaymentOptionsViewController(configuration: STPPaymentConfiguration.shared(), theme: STPTheme.default(), customerContext: customerContext, delegate: self as STPPaymentOptionsViewControllerDelegate)
  77.  
  78. let navigationController = UINavigationController(rootViewController: paymentMethodsViewController)
  79. self.present(navigationController, animated: true)
  80.  
  81. self.paymentbutton.isEnabled = true
  82.  
  83. } else {
  84. print("calling payment.....")
  85. self.activityIndicator.isHidden = false
  86. self.activityIndicator.startAnimating()
  87. 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
  88.  
  89. if let error = error as NSError? {
  90. if error.domain == FunctionsErrorDomain {
  91. let code = FunctionsErrorCode(rawValue: error.code)
  92. let message = error.localizedDescription
  93. print("error domain")
  94. print(error)
  95. print (code ?? "")
  96. print (message)
  97.  
  98. }
  99. }
  100.  
  101.  
  102. // if (result?.data as? [String: Any]) != nil{
  103.  
  104.  
  105.  
  106. if let res = (result?.data as? [AnyHashable: Any] ){
  107. print ("RESULT IS")
  108. print (res)
  109.  
  110. self.redirectContext = nil
  111. let paymentIntent = STPPaymentIntent.decodedObject(fromAPIResponse: res)
  112.  
  113.  
  114.  
  115. if paymentIntent?.status == .requiresAction {
  116.  
  117.  
  118.  
  119. print("action is required")
  120.  
  121. self.redirectContext = STPRedirectContext(paymentIntent: paymentIntent!, completion: { clientSecret, redirectError in
  122. // Fetch the latest status of the Payment Intent if necessary
  123. print("we got callback, checking ")
  124.  
  125.  
  126.  
  127.  
  128. STPAPIClient.shared().retrievePaymentIntent(withClientSecret: clientSecret) { paymentIntent, error in
  129. //( print(paymentIntent?.allResponseFields)
  130.  
  131. if (paymentIntent?.status == .succeeded){
  132. print("ok to go")
  133.  
  134.  
  135. //HEERE CALL SEGUE
  136. //
  137. 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]
  138. ) { (result, error) in
  139.  
  140.  
  141. self.reservationID = result!.data as? String
  142. self.activityIndicator.stopAnimating()
  143.  
  144.  
  145. /// PROBLEM HERE ///
  146. // ATTEMPTING TO PRESENT SEGUE WHILE SFSAfariviewcontroller is still active
  147.  
  148. self.performSegue(withIdentifier: "showticket", sender: nil)
  149.  
  150.  
  151.  
  152.  
  153.  
  154.  
  155. }
  156.  
  157.  
  158. }
  159.  
  160. if (paymentIntent?.status == .requiresPaymentMethod){
  161.  
  162. Waiter.shared.showAlertfromcontroller(title: "Error", message: "Your Payment has beed declined", button: "Ok", fromController: self)
  163.  
  164.  
  165. }
  166.  
  167.  
  168. if (paymentIntent?.status == .unknown){
  169.  
  170. Waiter.shared.showAlertfromcontroller(title: "Error", message: "Your Payment has beed declined", button: "Ok", fromController: self)
  171.  
  172. }
  173.  
  174.  
  175.  
  176.  
  177.  
  178.  
  179. }
  180. })
  181.  
  182.  
  183. //calling redirect for 3ds
  184. self.redirectContext.startRedirectFlow(from: self)
  185.  
  186. }
  187.  
  188. //PAYMENT NOT REQUIRE 3ds Auth
  189.  
  190. if paymentIntent?.status == .succeeded{
  191.  
  192. //CALL SEGUE HERE
  193.  
  194.  
  195. self.redirectContext = nil
  196. 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]
  197. ) { (result, error) in
  198.  
  199.  
  200.  
  201. self.reservationID = result!.data as? String
  202.  
  203.  
  204. self.performSegue(withIdentifier: "showticket", sender: nil)
  205.  
  206.  
  207. }
  208.  
  209.  
  210.  
  211. }
  212.  
  213. if paymentIntent?.status == .requiresPaymentMethod {
  214. Waiter.shared.showAlertfromcontroller(title: "Error", message: "Your Payment has beed declined", button: "Ok", fromController: self)
  215.  
  216. }
  217.  
  218.  
  219.  
  220.  
  221.  
  222.  
  223. } else {
  224.  
  225. Waiter.shared.showAlertfromcontroller(title: "Error", message: "Error processing your payment, no charge have been created", button: "Ok", fromController: self)
  226. self.paymentbutton.isEnabled = true
  227. }
  228.  
  229.  
  230. }
  231.  
  232.  
  233. }
  234.  
  235. }
  236.  
  237. }
  238.  
  239.  
  240.  
  241.  
  242.  
  243. @IBOutlet var nightslabel: UILabel!
  244.  
  245.  
  246.  
  247.  
  248. override func viewDidLoad() {
  249.  
  250. //init toolbar
  251. activityIndicator.isHidden = true
  252. let toolbar:UIToolbar = UIToolbar(frame: CGRect(x: 0, y: 0, width: self.view.frame.size.width, height: 30))
  253. //create left side empty space so that done button set on right side
  254. let flexSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
  255. let doneBtn: UIBarButtonItem = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: Selector(("donebutton")))
  256. toolbar.setItems([flexSpace, doneBtn], animated: false)
  257. toolbar.sizeToFit()
  258. //setting toolbar as inputAccessoryView
  259. self.phone!.inputAccessoryView = toolbar
  260.  
  261.  
  262.  
  263.  
  264.  
  265. self.fullName.isUserInteractionEnabled = false
  266. self.carModel.isUserInteractionEnabled = false
  267. self.emailAddress.isUserInteractionEnabled = false
  268. self.price.isUserInteractionEnabled = false
  269. self.hotelName.isUserInteractionEnabled = false
  270. self.dateendlabel.isUserInteractionEnabled = false
  271. self.datestartlabel.isUserInteractionEnabled = false
  272. self.roomInfo.isUserInteractionEnabled = false
  273. //number of night calculation
  274.  
  275.  
  276. let nights = self.daysBetweenDates(startDate: bookDatestart, endDate: bookDateEnd)
  277. nightslabel.text = nights.description
  278. let totalprice = (self.priceamount * nights)
  279. Total.text = totalprice.description + " €"
  280. self.price.text = priceamount.description + " €"
  281. self.hotelName.text = HotelName
  282. //converting dates to someting readable
  283. let dateformatter = DateFormatter()
  284. dateformatter.dateFormat = "dd-MM-yyyy"
  285.  
  286. let newbookDatestart = dateformatter.string(from: bookDatestart)
  287. let newbookDateEnd = dateformatter.string(from: bookDateEnd)
  288. self.datestartlabel.text = newbookDatestart.description
  289. self.dateendlabel.text = newbookDateEnd.description
  290. self.roomInfo.text = self.personPerRoom.description + (" Person -") + self.bedType
  291.  
  292. UserHelper.shared.getLoggedUser(handler: { user in
  293.  
  294.  
  295. if (user?.userType == "standard"){
  296.  
  297. let name = user?.name ?? "-"
  298. let surname = user?.surname ?? "-"
  299. let carbrand = user?.carBrand ?? "-"
  300. let carmodel = user?.carModel ?? "-"
  301. let carplate = user?.carPlate ?? "-"
  302. self.fullName.text = name + " " + surname
  303. self.carModel.text = "\(carbrand)" + " " + "\(carmodel)" + " " + "\(carplate)"
  304. self.emailAddress.text = user?.email ?? "-"
  305.  
  306. } else {
  307. let name = user?.ownername ?? "-"
  308. let surname = user?.ownersurname ?? "-"
  309.  
  310. self.fullName.text = name + " " + surname
  311. self.carModel.text = "NO CAR INFO"
  312. self.emailAddress.text = user?.email ?? "-"
  313.  
  314.  
  315.  
  316. }
  317. })
  318.  
  319.  
  320.  
  321.  
  322.  
  323.  
  324. // db.collection("Hotels").document(serviceID).collection("HotelRooms").document(roomID).getDocument { (document, error) in
  325.  
  326. // let roomdata = document?.data()
  327. // print (roomdata)
  328.  
  329.  
  330.  
  331. // }
  332.  
  333.  
  334.  
  335.  
  336.  
  337.  
  338. }
  339.  
  340. override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
  341. let ticket = segue.destination as! HotelReservationTicket
  342.  
  343.  
  344. ticket.reservation_idPrep = self.reservationID
  345. ticket.addressPrep = self.address
  346. ticket.fromPrep = self.bookDatestart
  347. ticket.toPrep = self.bookDateEnd
  348. ticket.guestNumberPrep = self.personPerRoom
  349. ticket.hotelnamePrep = self.HotelName
  350. ticket.roomPrep = self.bedType
  351. ticket.popup = true
  352.  
  353.  
  354.  
  355.  
  356. }
  357.  
  358. func textFieldShouldReturn(textField: UITextField) -> Bool {
  359.  
  360. textField.resignFirstResponder()
  361. //or
  362. //self.view.endEditing(true)
  363. return true
  364. }
  365.  
  366. @IBAction func back(_ sender: Any) {
  367. print("dismiss")
  368. self.dismiss(animated: true, completion: nil)
  369. }
  370.  
  371. @objc func donebutton() {
  372. self.view.endEditing(true)
  373. }
  374.  
  375.  
  376. func daysBetweenDates(startDate: Date, endDate: Date) -> Int
  377. {
  378. let requestedComponent: Set<Calendar.Component> = [.day]
  379. let calendar = Calendar.current
  380. let timeDifference = calendar.dateComponents(requestedComponent, from: startDate, to: endDate)
  381. return timeDifference.day ?? 1
  382.  
  383.  
  384. }
  385.  
  386. func dateformat(date: Date) -> String{
  387. let dateformatter = DateFormatter()
  388. dateformatter.dateFormat = "dd-MM-yyyy"
  389. return dateformatter.string(from: date)
  390. }
  391.  
  392.  
  393.  
  394. func paymentOptionsViewController(_ paymentOptionsViewController: STPPaymentOptionsViewController, didFailToLoadWithError error: Error) {
  395. dismiss(animated: true, completion: nil)
  396. }
  397.  
  398. func paymentOptionsViewControllerDidCancel(_ paymentOptionsViewController: STPPaymentOptionsViewController) {
  399. dismiss(animated: true, completion: nil)
  400. }
  401.  
  402. func paymentOptionsViewControllerDidFinish(_ paymentOptionsViewController: STPPaymentOptionsViewController) {
  403. if let card = paymentOpt as? STPCard {
  404. let paymentStripeId = card.stripeID
  405.  
  406. // db.collection("users").document(Auth.auth().currentUser!.uid).setValue(paymentStripeId as String, forKey: "defaultCardID")
  407. print (Auth.auth().currentUser!.uid)
  408. db.collection("users").document(Auth.auth().currentUser!.uid).setData(["defaultCardID": paymentStripeId as String], merge: true)
  409. print("CARD HAS BEEN INSERTED IN BACKEND from paymentcontroller")
  410. }
  411. dismiss(animated: true, completion: nil)
  412. }
  413.  
  414. func paymentOptionsViewController(_ paymentOptionsViewController: STPPaymentOptionsViewController, didSelect paymentOption: STPPaymentOption) {
  415. print("OPTION HAS BEEN SELECTED")
  416. paymentOpt = paymentOption
  417. }
  418.  
  419.  
  420.  
  421. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement