HistoryCCViewController.swift 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319
  1. //
  2. // HistoryCCViewController.swift
  3. // DigiXLite
  4. //
  5. // Created by Qindi on 24/03/22.
  6. //
  7. import UIKit
  8. import QuickLook
  9. public class HistoryCCViewController: UITableViewController, QLPreviewControllerDataSource {
  10. var data: [[String: Any?]] = []
  11. public var isOfficer = false
  12. var previewItem: NSURL?
  13. var fromAPI = false
  14. public override func viewDidLoad() {
  15. super.viewDidLoad()
  16. self.title = "Call Center History".localized()
  17. self.view.backgroundColor = .white
  18. if fromAPI {
  19. let imageButton = UIImageView(frame: CGRect(x: -16, y: 0, width: 20, height: 44))
  20. imageButton.image = UIImage(systemName: "chevron.backward", withConfiguration: UIImage.SymbolConfiguration(pointSize: 20, weight: .regular, scale: .default))?.withTintColor(.white)
  21. imageButton.contentMode = .left
  22. let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(didTapExit))
  23. imageButton.isUserInteractionEnabled = true
  24. imageButton.addGestureRecognizer(tapGestureRecognizer)
  25. let leftItem = UIBarButtonItem(customView: imageButton)
  26. self.navigationItem.leftBarButtonItem = leftItem
  27. }
  28. }
  29. @objc func didTapExit() {
  30. self.dismiss(animated: true, completion: nil)
  31. }
  32. public override func viewWillAppear(_ animated: Bool) {
  33. getData()
  34. }
  35. public override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
  36. if data.count == 0 {
  37. return 1
  38. }
  39. return data.count
  40. }
  41. public override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
  42. if data.count == 0 {
  43. let cellNoData = UITableViewCell()
  44. cellNoData.backgroundColor = .clear
  45. cellNoData.selectionStyle = .none
  46. let contentData = cellNoData.contentView
  47. let viewContainer = UIView()
  48. contentData.addSubview(viewContainer)
  49. viewContainer.anchor(top: contentData.topAnchor, left: contentData.leftAnchor, bottom: contentData.bottomAnchor, right: contentData.rightAnchor)
  50. let textNoData = UILabel()
  51. viewContainer.addSubview(textNoData)
  52. textNoData.anchor(top: viewContainer.topAnchor, left:viewContainer.leftAnchor, right:viewContainer.rightAnchor, paddingTop: 20.0)
  53. textNoData.textAlignment = .center
  54. textNoData.text = "No call center history".localized()
  55. textNoData.font = .systemFont(ofSize: 14)
  56. return cellNoData
  57. }
  58. let cell = tableView.dequeueReusableCell(withIdentifier: "cellHistoryCC", for: indexPath) as! CellMyHistory
  59. let dataOfficer = getDataProfile(f_pin: data[indexPath.row]["officer"] as! String)
  60. let dataRequester = getDataProfile(f_pin: data[indexPath.row]["requester"] as! String)
  61. cell.imageOfficer.image = nil
  62. if dataOfficer.count > 0 {
  63. if isOfficer {
  64. cell.labelOfficer.text = dataRequester["name"] ?? ""
  65. } else {
  66. cell.labelOfficer.text = "Officer".localized() + " : " + dataOfficer["name"]!
  67. }
  68. if !(dataOfficer["image"] ?? "").isEmpty || !(dataRequester["image"] ?? "").isEmpty {
  69. if isOfficer {
  70. getImage(name: dataRequester["image"]!, placeholderImage: UIImage(systemName: "person.circle.fill")!, isCircle: true, tableView: tableView, indexPath: indexPath) { result, isDownloaded, image in
  71. cell.imageOfficer.image = image
  72. }
  73. } else {
  74. getImage(name: dataOfficer["image"]!, placeholderImage: UIImage(systemName: "person.circle.fill")!, isCircle: true, tableView: tableView, indexPath: indexPath) { result, isDownloaded, image in
  75. cell.imageOfficer.image = image
  76. }
  77. }
  78. } else {
  79. cell.imageOfficer.image = UIImage(systemName: "person.circle.fill")!
  80. cell.imageOfficer.tintColor = .lightGray
  81. }
  82. } else {
  83. if isOfficer {
  84. cell.labelOfficer.text = "User"
  85. } else {
  86. cell.labelOfficer.text = "Officer".localized() + " : User"
  87. }
  88. }
  89. if isOfficer {
  90. cell.labelRequester.isHidden = true
  91. } else {
  92. if dataRequester.count > 0 {
  93. cell.labelRequester.text = "Requester".localized() + " : " + dataRequester["name"]!
  94. } else {
  95. cell.labelRequester.text = "Requester".localized() + " : User"
  96. }
  97. }
  98. cell.labelComplaintId.text = data[indexPath.row]["complaint_id"] as? String
  99. let stringDate = data[indexPath.row]["date_start"] as! String
  100. let date = Date(milliseconds: Int64(stringDate) ?? 0)
  101. let formatter = DateFormatter()
  102. formatter.dateFormat = "dd/MM/yyyy HH:mm"
  103. formatter.locale = NSLocale(localeIdentifier: "id") as Locale?
  104. cell.labelDate.text = formatter.string(from: date as Date)
  105. cell.viewContainer.layer.borderWidth = 1
  106. cell.viewContainer.layer.borderColor = UIColor.grayColor.cgColor
  107. cell.viewContainer.layer.cornerRadius = 10
  108. cell.viewContainer.clipsToBounds = true
  109. cell.buttonEditor.addTarget(self, action: #selector(buttonClicked(sender:)), for: .touchUpInside)
  110. cell.buttonEditor.tag = indexPath.row
  111. cell.buttonPDF.addTarget(self, action: #selector(buttonPDFClicked(sender:)), for: .touchUpInside)
  112. cell.buttonPDF.tag = indexPath.row
  113. return cell
  114. }
  115. public override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
  116. return 120
  117. }
  118. func getData() {
  119. Database.shared.database?.inTransaction({ fmdb, rollback in
  120. var data: [[String: Any?]] = []
  121. if let cursorHistory = Database.shared.getRecords(fmdb: fmdb, query: "SELECT type, f_pin, complaint_id, time, time_end, requester FROM CALL_CENTER_HISTORY order by time desc") {
  122. while cursorHistory.next() {
  123. var row: [String: Any?] = [:]
  124. row["type"] = cursorHistory.string(forColumnIndex: 0)
  125. row["officer"] = cursorHistory.string(forColumnIndex: 1)
  126. row["complaint_id"] = cursorHistory.string(forColumnIndex: 2)
  127. row["date_start"] = cursorHistory.string(forColumnIndex: 3)
  128. row["date_end"] = cursorHistory.string(forColumnIndex: 4)
  129. row["requester"] = cursorHistory.string(forColumnIndex: 5)
  130. data.append(row)
  131. }
  132. cursorHistory.close()
  133. }
  134. self.data = data
  135. })
  136. }
  137. func getDataProfile(f_pin: String) -> [String: String]{
  138. var data: [String: String] = [:]
  139. Database().database?.inTransaction({ fmdb, rollback in
  140. if let c = Database().getRecords(fmdb: fmdb, query: "select first_name || ' ' || last_name, image_id from BUDDY where f_pin = '\(f_pin)'"), c.next() {
  141. data["name"] = c.string(forColumnIndex: 0)!.trimmingCharacters(in: .whitespacesAndNewlines)
  142. data["image"] = c.string(forColumnIndex: 1)!
  143. c.close()
  144. }
  145. })
  146. return data
  147. }
  148. @objc func buttonClicked(sender: UIButton) {
  149. let editorGroupVC = AppStoryBoard.Palio.instance.instantiateViewController(withIdentifier: "editorGroupVC") as! EditorGroup
  150. editorGroupVC.isHistoryCC = true
  151. editorGroupVC.complaintId = data[sender.tag]["complaint_id"] as! String
  152. navigationController?.show(editorGroupVC, sender: nil)
  153. }
  154. @objc func buttonPDFClicked(sender: UIButton) {
  155. var dataMessages: [[String: Any?]] = []
  156. Database.shared.database?.inTransaction({ (fmdb, rollback) in
  157. let query = "SELECT f_pin, l_pin, message_text, audio_id, video_id, image_id, thumb_id, file_id FROM MESSAGE where call_center_id='\(data[sender.tag]["complaint_id"] as! String)' order by server_date asc"
  158. if let cursorData = Database.shared.getRecords(fmdb: fmdb, query: query) {
  159. while cursorData.next() {
  160. var row: [String: Any?] = [:]
  161. row["f_pin"] = cursorData.string(forColumnIndex: 0)
  162. row["l_pin"] = cursorData.string(forColumnIndex: 1)
  163. row["message_text"] = cursorData.string(forColumnIndex: 2)
  164. row["audio_id"] = cursorData.string(forColumnIndex: 3)
  165. row["video_id"] = cursorData.string(forColumnIndex: 4)
  166. row["image_id"] = cursorData.string(forColumnIndex: 5)
  167. row["thumb_id"] = cursorData.string(forColumnIndex: 6)
  168. row["file_id"] = cursorData.string(forColumnIndex: 7)
  169. dataMessages.append(row)
  170. }
  171. cursorData.close()
  172. }
  173. })
  174. let dataOfficer = getDataProfile(f_pin: data[sender.tag]["officer"] as! String)
  175. let dataRequester = getDataProfile(f_pin: data[sender.tag]["requester"] as! String)
  176. let stringDate = data[sender.tag]["date_start"] as! String
  177. let date = Date(milliseconds: Int64(stringDate) ?? 0)
  178. let formatter = DateFormatter()
  179. formatter.dateFormat = "dd MMMM yyyy"
  180. let lang = UserDefaults.standard.string(forKey: "i18n_language")
  181. if lang == "id" {
  182. formatter.locale = NSLocale(localeIdentifier: "id") as Locale?
  183. }
  184. var textPDF = """
  185. <html>
  186. <head>
  187. <style>
  188. h1 {
  189. text-align: center;
  190. }
  191. .column {
  192. float: left;
  193. width: 50%;
  194. }
  195. .row:after {
  196. content: "";
  197. display: table;
  198. clear: both;
  199. }
  200. .customh3 {
  201. text-align: right;
  202. }
  203. </style>
  204. </head>
  205. <body>
  206. <h1>Call Center History</h1>
  207. <div class="row">
  208. <div class="column">
  209. <h3>\(dataOfficer["name"]!) (Officer)</h3>
  210. <h3>\(dataRequester["name"]!) (Requester)<h3>
  211. </div>
  212. <div class="column">
  213. <h3 class="customh3">\(formatter.string(from: date as Date))</h3>
  214. </div>
  215. </div>
  216. """
  217. for i in 0..<dataMessages.count {
  218. let name = getDataProfile(f_pin: dataMessages[i]["f_pin"] as! String)["name"]!
  219. textPDF = textPDF + """
  220. <p>\(name) : \(dataMessages[i]["message_text"]!!)<p>
  221. """
  222. }
  223. textPDF = textPDF + """
  224. </body>
  225. </html>
  226. """
  227. convertToPdfFileAndShare(textMessage: textPDF)
  228. }
  229. func convertToPdfFileAndShare(textMessage: String){
  230. let fmt = UIMarkupTextPrintFormatter(markupText: textMessage)
  231. // 2. Assign print formatter to UIPrintPageRenderer
  232. let render = UIPrintPageRenderer()
  233. render.addPrintFormatter(fmt, startingAtPageAt: 0)
  234. // 3. Assign paperRect and printableRect
  235. let page = CGRect(x: 0, y: 0, width: 595.2, height: 841.8) // A4, 72 dpi
  236. render.setValue(page, forKey: "paperRect")
  237. render.setValue(page, forKey: "printableRect")
  238. // 4. Create PDF context and draw
  239. let pdfData = NSMutableData()
  240. UIGraphicsBeginPDFContextToData(pdfData, .zero, nil)
  241. for i in 0..<render.numberOfPages {
  242. UIGraphicsBeginPDFPage();
  243. render.drawPage(at: i, in: UIGraphicsGetPDFContextBounds())
  244. }
  245. UIGraphicsEndPDFContext();
  246. // 5. Save PDF file
  247. guard let outputURL = try? FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false).appendingPathComponent("ContactCenter-\(Date().currentTimeMillis())").appendingPathExtension("pdf")
  248. else { fatalError("Destination URL not created") }
  249. pdfData.write(to: outputURL, atomically: true)
  250. //print(("open \(outputURL.path)")
  251. if FileManager.default.fileExists(atPath: outputURL.path){
  252. let url = URL(fileURLWithPath: outputURL.path)
  253. self.previewItem = url as NSURL
  254. let previewController = QLPreviewController()
  255. let rightBarButton = UIBarButtonItem()
  256. previewController.navigationItem.rightBarButtonItem = rightBarButton
  257. previewController.dataSource = self
  258. previewController.modalPresentationStyle = .custom
  259. self.present(previewController, animated: true, completion: nil)
  260. }
  261. else {
  262. //print(("document was not found")
  263. }
  264. }
  265. public func numberOfPreviewItems(in controller: QLPreviewController) -> Int {
  266. return 1
  267. }
  268. public func previewController(_ controller: QLPreviewController, previewItemAt index: Int) -> QLPreviewItem {
  269. return self.previewItem!
  270. }
  271. }
  272. class CellMyHistory: UITableViewCell {
  273. @IBOutlet weak var viewContainer: UIView!
  274. @IBOutlet weak var viewTitle: UIView!
  275. @IBOutlet weak var imageOfficer: UIImageView!
  276. @IBOutlet weak var labelOfficer: UILabel!
  277. @IBOutlet weak var labelRequester: UILabel!
  278. @IBOutlet weak var labelComplaintId: UILabel!
  279. @IBOutlet weak var labelDate: UILabel!
  280. @IBOutlet weak var buttonEditor: UIButton!
  281. @IBOutlet weak var buttonPDF: UIButton!
  282. }