· 6 years ago · Jun 25, 2019, 08:26 AM
1//
2// GetDirectDebitUrlService.swift
3// ETDataLib
4//
5// Created by Jeetendra Kumar on 11/29/18.
6// Copyright © 2018 Emaar Technologies LLC. All rights reserved.
7//
8
9import Foundation
10
11
12public enum DebitDirectStatusType : Int{
13 case none = 0
14 case success
15 case duplicate
16 case failed
17}
18
19
20
21public class GetDirectDebitUrlRequest: ETClientRequest {
22
23 public init() {
24
25 }
26
27 public var webServiceMethod: ETWebServiceMethod {
28 return .netBankingGetDirectDebitUrl
29 }
30
31 public var bankInfo:BankInfo?
32 public var propertyInfo:Property?
33 public var bankProductInfo:BankProductInfo?
34 public var invoices:[InvoiceInfo]?
35 public var amountToBePaid:Double = Double(0)
36
37 public var paymentSourceType:PaymentSourceType = .invoice
38
39}
40
41public class GetDirectDebitUrlResponse: ETClientResponse {
42
43 public var responseStatus = ETBaseResponseStatus.none
44 public var responseStatusMessage: String?
45 public var responseStatusCode = ETBaseResponseStatusCode.unknown
46 public var debitDirectStatusType = DebitDirectStatusType.none
47
48 required public init() {
49
50 }
51
52
53 public var bankInfo:BankInfo?
54 public var propertyInfo:Property?
55 public var bankProductInfo:BankProductInfo?
56 public var invoices:[InvoiceInfo]?
57 public var amountToBePaid:Double = Double(0)
58
59 public var paymentGatewayUrl:String?
60 public var paymentTxnRefNo:String?
61 public var status:String?
62 public var statusDesc:String?
63
64}
65class GetDirectDebitUrlService: ETBaseXMLService {
66 private var responseObject = GetDirectDebitUrlResponse()
67 private var requestObject = GetDirectDebitUrlRequest()
68
69 // MARK: - Override Methods
70 override var xmlResponseData: ETClientResponse? {
71 return responseObject
72 }
73
74 override var isDefaultXmlParser: Bool {
75 return true
76 }
77
78 override var webServiceUrl: String {
79 if let url = ETDataLibSettingsManager.sharedInstance[ETDataLibConstants.netBankingSOAURL] as? String {
80 return url
81 }
82 return ""
83 }
84
85 override func buildReuqestBody(withRequest request: ETClientRequest) -> String? {
86
87 requestObject = (request as! GetDirectDebitUrlRequest)
88
89 responseObject.invoices = requestObject.invoices
90 responseObject.propertyInfo = requestObject.propertyInfo
91 responseObject.bankProductInfo = requestObject.bankProductInfo
92 responseObject.bankInfo = requestObject.bankInfo
93 responseObject.amountToBePaid = requestObject.amountToBePaid
94
95
96
97 var targetSystem = ""
98 if let instance = ETDataLibSettingsManager.sharedInstance[ETDataLibConstants.paymentDefaultInstance] as? String {
99 targetSystem = instance
100 }
101
102 var secretKey = ""
103 if let key = ETDataLibSettingsManager.sharedInstance[ETDataLibConstants.netBankingHmacSecretKey] as? String {
104 secretKey = key
105 }
106 let accountNo = requestObject.propertyInfo?.customerAccountNo.validateStringValue() ?? "0"
107 var appIDString = ""
108 if let appID = ETDataLibSettingsManager.sharedInstance[ETDataLibConstants.netBankingAppID] as? String {
109 appIDString = appID
110 }
111
112 var bankID = requestObject.bankInfo?.bankCode.validateStringValue() ?? ""
113 let bankName = requestObject.bankInfo?.bankName.validStringForWebService() ?? ""
114 let currencyType = "AED"
115 let custAccountID = requestObject.propertyInfo?.customerAccountId.validateStringValue() ?? "0"
116 let custAccountName = requestObject.propertyInfo?.oracle?.accountName.validStringForWebService() ?? ""
117 let custPropertyID = requestObject.propertyInfo?.customerAccountNo.validateStringValue() ?? "0"
118 //let eServicesAppID = "ESERVICES_APP"//"EmaarOne_App"
119 let eServicesAppID = "EmaarOne_App"
120 let isQuickPay = "N"
121 let language = "EN"
122 let locationCode = requestObject.propertyInfo?.locationCode.validStringForWebService() ?? ""
123 let loggedInUserName = Customer.sharedInstance.fullNameNoTitle?.validStringForWebService() ?? ""
124 let orgID = requestObject.propertyInfo?.oracle?.orgId.validateStringValue() ?? "0"
125 let partyID = requestObject.propertyInfo?.partyId.validString() ?? "0"
126 //let projectID = requestObject.propertyInfo?.oracle?.projectId.validString() ?? "0"
127 //let projectName = requestObject.propertyInfo?.oracle?.projectName?.validStringForWebService() ?? ""
128 let buildingName = requestObject.propertyInfo?.oracle?.building?.validStringForWebService() ?? ""
129 let pymtType = "Direct Debit"
130 let productID = requestObject.bankProductInfo?.productID.validateStringValue() ?? "0"
131 bankID = requestObject.bankProductInfo?.bankID.validateStringValue() ?? "0"
132
133 if let migrated = requestObject.propertyInfo?.isMigratedToSakani, migrated == true {
134 targetSystem = requestObject.propertyInfo?.oracle?.ecmInstance?.validStringForWebService() ?? "SAKANI"
135 }
136
137 if let invoices = requestObject.invoices, invoices.count > 0 {
138 let invoice = invoices[0]
139 switch invoice.invoiceType {
140 case .oracleAdminFee, .oraclePropertyInstallment:
141 if let instance = ETDataLibSettingsManager.sharedInstance[ETDataLibConstants.paymentDefaultInstance] as? String {
142 targetSystem = instance
143 }
144 default:
145 break
146 }
147 }
148
149 switch requestObject.paymentSourceType {
150 case .invoice:
151 if let instance = ETDataLibSettingsManager.sharedInstance[ETDataLibConstants.paymentDefaultInstance] as? String {
152 targetSystem = instance
153 }
154 default:
155 break
156 }
157
158 let totalInvAmnt = "\(requestObject.amountToBePaid)"
159
160 let plainString = "\(secretKey)&\(accountNo)&\(appIDString)&\(bankID)&\(bankName)&\(productID)&\(buildingName)&\(currencyType)&\(custAccountID)&\(custAccountName)&\(custPropertyID)&\(eServicesAppID)&\(isQuickPay)&\(language)&\(locationCode)&\(loggedInUserName)&\(orgID)&\(partyID)&\(pymtType)&\(targetSystem)&\(totalInvAmnt)"
161
162 let secureHash = ETSharedUtils.hmacSHA256EncryptString(forPlainString: plainString)
163
164
165 let invoiceTemplate = """
166 <pay:Debitelement>
167 <pay:AMOUNT>[AMOUNT]</pay:AMOUNT>
168 <pay:CUSTOMER_TRX_ID>[CUSTOMER_TRX_ID]</pay:CUSTOMER_TRX_ID>
169 <pay:INV_CATEGORY>[INV_CATEGORY]</pay:INV_CATEGORY>
170 <pay:INV_TYPE>[INV_TYPE]</pay:INV_TYPE>
171 <pay:TRX_NUMBER>[TRX_NUMBER]</pay:TRX_NUMBER>
172 </pay:Debitelement>
173 """
174 var invoiceString = ""
175 if let items = requestObject.invoices {
176 for item in items {
177 var templateString = ""
178 templateString.append(invoiceTemplate)
179 switch item.source {
180 case .ecm:
181 templateString.replaceWithValues([
182 "[AMOUNT]":item.ecmInvoice.amountToPay?.amountPlainStringValue() ?? "0.0",
183 "[CUSTOMER_TRX_ID]":item.ecmInvoice.customerTrxID.validString(),
184 "[INV_CATEGORY]":"",
185 "[INV_TYPE]":"NA",
186 "[TRX_NUMBER]":item.ecmInvoice.trxNumber.validString()
187 ])
188 default:
189 templateString.replaceWithValues([
190 "[AMOUNT]":item.oracleInvoice.amountToPay?.amountPlainStringValue() ?? "0.0",
191 "[CUSTOMER_TRX_ID]":item.oracleInvoice.customerTrxID.validString(),
192 "[INV_CATEGORY]":"",
193 "[INV_TYPE]":"NA",
194 "[TRX_NUMBER]":item.oracleInvoice.trxNumber.validString()
195 ])
196 }
197 invoiceString.append(templateString)
198
199 }
200 }
201
202 var requestString = httpRequestData(request: requestObject)!
203
204 requestString.replaceWithValues([
205 "[AccountNo]":accountNo,
206 "[AppId]":appIDString,
207 "[BankName]":bankName,
208 "[BuildingName]":buildingName,
209 "[CurrencyType]":currencyType,
210 "[CustAccountID]":custAccountID,
211 "[CustAccountName]":custAccountName,
212 "[CustPropertyID]":custPropertyID,
213 "[EServiceAppId]":eServicesAppID,
214 "[ProductID]":productID,
215 "[BankID]":bankID,
216 "[InvDatas]":invoiceString,
217 "[IsQuickPayTrxn]":isQuickPay,
218 "[Language]":language,
219 "[LocationCode]":locationCode,
220 "[LoggedInUser]":loggedInUserName,
221 "[OrgId]":orgID,
222 "[PartyId]":partyID,
223 "[PymtType]":pymtType,
224 "[SecureHash]":secureHash,
225 "[TargetSystem]":targetSystem,
226 "[TotalInvAmnt]":totalInvAmnt
227 ], isCDataEnabled: false)
228
229 return requestString
230
231
232 /*
233 <pay:AccountNo>[AccountNo]</pay:AccountNo>//
234 <pay:AppId>[AppId]</pay:AppId>//
235 <pay:BankName>[BankName]</pay:BankName>//
236 <pay:BuildingName>[BuildingName]</pay:BuildingName>//
237 <pay:CurrencyType>[CurrencyType]</pay:CurrencyType>//
238 <pay:CustAccountID>[CustAccountID]</pay:CustAccountID>//
239 <pay:CustAccountName>[CustAccountName]</pay:CustAccountName>//
240 <pay:CustPropertyID>[CustPropertyID]</pay:CustPropertyID>//
241 <pay:EServiceAppId>[EServiceAppId]</pay:EServiceAppId>//
242 <pay:ProductID>[ProductID]</pay:ProductID>//
243 <pay:BankID>[BankID]</pay:BankID>//
244 <pay:InvDatas>
245 [InvDatas]
246 </pay:InvDatas>//
247 <pay:IsQuickPayTrxn>[IsQuickPayTrxn]</pay:IsQuickPayTrxn>//
248 <pay:Language>[Language]</pay:Language>//
249 <pay:LocationCode>[LocationCode]</pay:LocationCode>//
250 <pay:LoggedInUser>[LoggedInUser]</pay:LoggedInUser>//
251 <pay:OrgId>[OrgId]</pay:OrgId>//
252 <pay:PartyId>[PartyId]</pay:PartyId>//
253 <pay:PymtType>[PymtType]</pay:PymtType>//
254 <pay:SecureHash>[SecureHash]</pay:SecureHash>
255 <pay:TargetSystem>[TargetSystem]</pay:TargetSystem>
256 <pay:TotalInvAmnt>[TotalInvAmnt]</pay:TotalInvAmnt>
257 */
258
259
260
261 }
262
263 private var keyValueDictionary:[String:String]?
264 private var secondaryKeyValueDictionary:[String:String]?
265
266 override func parserDidStartDocument(_ parser: XMLParser) {
267
268 }
269
270 override func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String]) {
271 super.parser(parser, didStartElement: elementName, namespaceURI: namespaceURI, qualifiedName: qName, attributes: attributeDict)
272 if elementName == "DirectDebitOutput" {
273 keyValueDictionary = [String:String]()
274 }
275 else if elementName == "InvDatasOut" {
276 secondaryKeyValueDictionary = [String:String]()
277 }
278 }
279 func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {
280 if elementName == "DirectDebitOutput" {
281 if let dictionary = keyValueDictionary {
282 responseObject.paymentGatewayUrl = dictionary.stringValue(forKey: "paymentGatewayUrl")
283 responseObject.paymentGatewayUrl = responseObject.paymentGatewayUrl?.decodeServerResponse()
284 responseObject.paymentTxnRefNo = dictionary.stringValue(forKey: "paymentTxnRefNo")
285 responseObject.status = dictionary.stringValue(forKey: "status")
286 responseObject.statusDesc = dictionary.stringValue(forKey: "statusDesc")
287 responseObject.debitDirectStatusType = responseObject.status.validString().uppercased() == "DUPLICATE" ? .duplicate : (responseObject.status.validString().uppercased() == "SUCCESS" ? .success : .failed)
288 switch responseObject.debitDirectStatusType {
289 case .duplicate, .success:
290 responseObject.responseStatus = .success
291 default:
292 responseObject.responseStatus = .fail
293 }
294 if responseObject.paymentGatewayUrl.isBlank() {
295 responseObject.responseStatus = .fail
296 }
297 }
298 }
299 else if elementName == "InvDatasOut" {
300 secondaryKeyValueDictionary = nil
301 }
302 else {
303 if secondaryKeyValueDictionary != nil {
304 secondaryKeyValueDictionary?[elementName.validateStringValue()] = "\(currentXmlElementContents.validateStringValue())"
305 }
306 if keyValueDictionary != nil {
307 keyValueDictionary?[elementName.validateStringValue()] = "\(currentXmlElementContents.validateStringValue())"
308 }
309 }
310 }
311
312 override func parserDidEndDocument(_ parser: XMLParser) {
313
314 }
315}