SertifikatBelumUploadVC.swift 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528
  1. //
  2. // SertifikatBelumUploadVC.swift
  3. // Sirani
  4. //
  5. // Created by Anhar Solehudin on 16/04/19.
  6. // Copyright © 2019 Anhar Solehudin. All rights reserved.
  7. //
  8. import UIKit
  9. import MobileCoreServices
  10. class SertifikatBelumUploadVC: UIViewController {
  11. // Outlets
  12. @IBOutlet weak var sertBlmUploadTV: UITableView!
  13. @IBOutlet weak var noDataLayout: UIView!
  14. @IBOutlet weak var progressLayout: UIView!
  15. @IBOutlet weak var progress: UIActivityIndicatorView!
  16. @IBOutlet weak var modalUploadLayout: UIView!
  17. @IBOutlet weak var lblSelectedAplikasiId: UILabel!
  18. @IBOutlet weak var lblSelectedNo: UILabel!
  19. @IBOutlet weak var lblSelectedTanggal: UILabel!
  20. @IBOutlet weak var lblSelectedPlgId: UILabel!
  21. @IBOutlet weak var lblSelectedNib: UILabel!
  22. @IBOutlet weak var lblSelectedCustName: UILabel!
  23. @IBOutlet weak var lblSelectedEqpName: UILabel!
  24. @IBOutlet weak var lblSelectedMerk: UILabel!
  25. @IBOutlet weak var lblSelectedModel: UILabel!
  26. @IBOutlet weak var lblSelectedBrand: UILabel!
  27. @IBOutlet weak var btnSelectedSimpan: UIButton!
  28. @IBOutlet weak var btnSelectQrCode: UIButton!
  29. @IBOutlet weak var btnSelectKeterangan: UIButton!
  30. @IBOutlet weak var btnSelectPeringatan: UIButton!
  31. @IBOutlet weak var lblSelectedQrCodeFilename: UILabel!
  32. @IBOutlet weak var lblSelectedKetFilename: UILabel!
  33. @IBOutlet weak var lblSelectedPeringatanFilename: UILabel!
  34. // View Id
  35. private let cellId = "sertifikatBlmUploadCellId"
  36. // Segue Id
  37. private let unwindToHomeSegueId = "unwindSertBlmUploadToHomeSegueId"
  38. private let searchSegueId = "searchSertifikatBelumUploadSegueId"
  39. // String Message
  40. private let alertNoConnectionTitle = "Informasi"
  41. private let alertNoConnectionMsg = "Sepertinya Anda sedang tidak tersambung pada koneksi internet"
  42. private let alertNoConnectionActionYes = "OK"
  43. // Initialize
  44. private var presenter: SertifikatBelumUploadPresenter!
  45. private var dataList: [SertifikatBelumUpload] = [SertifikatBelumUpload]()
  46. private var documentInteractorController: UIDocumentInteractionController!
  47. private var imagePickerController = UIImagePickerController()
  48. // Constants
  49. private let QR_CODE_FILE_TAG_ID = 21
  50. private let KETERANGAN_FILE_TAG_ID = 22
  51. private let PERINGATAN_FILE_TAG_ID = 23
  52. // Request Params
  53. private var cursor: Int = 0
  54. private var prev: Int = 1
  55. private var jenis: String = ""
  56. private var columns: String = ""
  57. private var search: String = ""
  58. // Variables
  59. private var selectedFileTagId = 0
  60. private var plgId = 0
  61. private var aplikasiId = 0
  62. private var urlFileQrCode: URL?
  63. private var urlFileKeterangan: URL?
  64. private var urlFilePeringatan: URL?
  65. private var filenameQrCode: String = ""
  66. private var filenameKeterangan: String = ""
  67. private var filenamePeringatan: String = ""
  68. private var loading = false
  69. private var lastDataLoadedEmpty = false
  70. private var loadMore = false
  71. // View Lifecycles
  72. override var preferredStatusBarStyle: UIStatusBarStyle {
  73. return .lightContent
  74. }
  75. override func viewDidLoad() {
  76. super.viewDidLoad()
  77. sertBlmUploadTV.delegate = self
  78. sertBlmUploadTV.dataSource = self
  79. sertBlmUploadTV.separatorStyle = .none
  80. sertBlmUploadTV.rowHeight = UITableView.automaticDimension
  81. sertBlmUploadTV.estimatedRowHeight = 220
  82. presenter = SertifikatBelumUploadPresenter(siraniApiServices: SiraniApiServices())
  83. presenter.attachView(view: self)
  84. loadData()
  85. imagePickerController.delegate = self
  86. }
  87. override func viewWillAppear(_ animated: Bool) {
  88. customSomeViews()
  89. presenter.attachView(view: self)
  90. }
  91. override func viewDidDisappear(_ animated: Bool) {
  92. presenter.detachView()
  93. }
  94. // private functions
  95. private func customSomeViews() {
  96. btnSelectedSimpan.layer.cornerRadius = 5
  97. btnSelectQrCode.layer.borderWidth = 1
  98. btnSelectQrCode.layer.borderColor = #colorLiteral(red: 0.3333333433, green: 0.3333333433, blue: 0.3333333433, alpha: 1)
  99. btnSelectKeterangan.layer.borderWidth = 1
  100. btnSelectKeterangan.layer.borderColor = #colorLiteral(red: 0.3333333433, green: 0.3333333433, blue: 0.3333333433, alpha: 1)
  101. btnSelectPeringatan.layer.borderWidth = 1
  102. btnSelectPeringatan.layer.borderColor = #colorLiteral(red: 0.3333333433, green: 0.3333333433, blue: 0.3333333433, alpha: 1)
  103. btnSelectQrCode.layer.cornerRadius = 5
  104. btnSelectKeterangan.layer.cornerRadius = 5
  105. btnSelectPeringatan.layer.cornerRadius = 5
  106. }
  107. private func loadData() {
  108. if !loading && !lastDataLoadedEmpty {
  109. if ConnectionHelper.isConnectedToNetwork() {
  110. presenter.loadData(cursor: cursor, prev: prev, jenis: jenis, columns: columns, search: search)
  111. } else {
  112. showNoConnection()
  113. }
  114. }
  115. }
  116. private func downloadFile(urlWeb: String, filename: String) {
  117. if !loading {
  118. if ConnectionHelper.isConnectedToNetwork() {
  119. presenter.downloadFile(urlWeb: urlWeb, filename: filename)
  120. } else {
  121. showNoConnection()
  122. }
  123. }
  124. }
  125. private func loadUploadDetails(aplikasiId: Int) {
  126. if !loading {
  127. if ConnectionHelper.isConnectedToNetwork() {
  128. presenter.loadUploadDetail(aplikasiId: aplikasiId)
  129. } else {
  130. showNoConnection()
  131. }
  132. }
  133. }
  134. private func uploadFile(plgId: Int, aplId: Int, qrCodeFileURL: URL, keteranganFileURL: URL, peringatanFileURL: URL, qrCodeFilename: String, keteranganFilename: String, peringatanFilename: String) {
  135. if !loading {
  136. if ConnectionHelper.isConnectedToNetwork() {
  137. presenter.uploadSertifikasi(
  138. plgId: plgId,
  139. aplId: aplId,
  140. qrCodeFileURL: qrCodeFileURL,
  141. keteranganFileURL: keteranganFileURL,
  142. peringatanFileURL: peringatanFileURL,
  143. qrCodeFilename: qrCodeFilename,
  144. keteranganFilename: keteranganFilename,
  145. peringatanFilename: peringatanFilename
  146. )
  147. } else {
  148. showNoConnection()
  149. }
  150. }
  151. }
  152. private func showAlert(title: String, msg: String, actionTitle: String) {
  153. let alertNoConnection = UIAlertController(
  154. title: title,
  155. message: msg,
  156. preferredStyle: .alert
  157. )
  158. alertNoConnection.addAction(
  159. UIAlertAction(title: actionTitle, style: .default, handler: nil)
  160. )
  161. self.present(alertNoConnection, animated: true, completion: nil)
  162. }
  163. private func showPicker() {
  164. let actionSheet = UIAlertController(title: nil, message: nil, preferredStyle: .actionSheet)
  165. let gallery = UIAlertAction(title: "Galeri", style: .default) { action in
  166. self.showImagePicker()
  167. }
  168. let fileManager = UIAlertAction(title: "Dokumen", style: .default) { action in
  169. self.showDocumentPicker()
  170. }
  171. let cancel = UIAlertAction(title: "Batal", style: .cancel, handler: nil)
  172. actionSheet.addAction(gallery)
  173. actionSheet.addAction(fileManager)
  174. actionSheet.addAction(cancel)
  175. self.present(actionSheet, animated: true, completion: nil)
  176. }
  177. private func showImagePicker() {
  178. imagePickerController.allowsEditing = false
  179. imagePickerController.sourceType = .photoLibrary
  180. self.present(imagePickerController, animated: true, completion: nil)
  181. }
  182. private func showDocumentPicker() {
  183. let types = [String(kUTTypePDF), String(kUTTypeText), String(kUTTypeJPEG), String(kUTTypePNG)]
  184. let picker = UIDocumentPickerViewController(documentTypes: types, in: .import)
  185. picker.delegate = self
  186. picker.modalPresentationStyle = .formSheet
  187. self.present(picker, animated: true, completion: nil)
  188. }
  189. // Actions
  190. @IBAction func onBtnBackTap(_ sender: Any) {
  191. performSegue(withIdentifier: unwindToHomeSegueId, sender: self)
  192. }
  193. @IBAction func onBtnSearchTap(_ sender: Any) {
  194. performSegue(withIdentifier: searchSegueId, sender: self)
  195. }
  196. @IBAction func unwindToSertifikatBelumUpload(segue: UIStoryboardSegue) {}
  197. @IBAction func onBtnSelectQrCodeTap(_ sender: Any) {
  198. selectedFileTagId = QR_CODE_FILE_TAG_ID
  199. showPicker()
  200. }
  201. @IBAction func onBtnSelectKetTap(_ sender: Any) {
  202. selectedFileTagId = KETERANGAN_FILE_TAG_ID
  203. showPicker()
  204. }
  205. @IBAction func onBtnSelectPeringatan(_ sender: Any) {
  206. selectedFileTagId = PERINGATAN_FILE_TAG_ID
  207. showPicker()
  208. }
  209. @IBAction func onBtnUploadSave(_ sender: Any) {
  210. if (urlFileQrCode != nil && urlFileKeterangan != nil && urlFilePeringatan != nil) {
  211. uploadFile(
  212. plgId: plgId,
  213. aplId: aplikasiId,
  214. qrCodeFileURL: urlFileQrCode!,
  215. keteranganFileURL: urlFileKeterangan!,
  216. peringatanFileURL: urlFilePeringatan!,
  217. qrCodeFilename: filenameQrCode,
  218. keteranganFilename: filenameKeterangan,
  219. peringatanFilename: filenamePeringatan
  220. )
  221. } else {
  222. showAlert(title: "Informasi", msg: "Mohon Lengkapi Semua File", actionTitle: "OK")
  223. }
  224. }
  225. @IBAction func onBtnUploadCancel(_ sender: Any) {
  226. modalUploadLayout.hide()
  227. }
  228. }
  229. // View Delegate Protocols
  230. extension SertifikatBelumUploadVC: SertifikatBelumUploadViewDelegate {
  231. func showNoConnection() {
  232. showAlert(title: alertNoConnectionTitle, msg: alertNoConnectionMsg, actionTitle: alertNoConnectionActionYes)
  233. }
  234. func showLoading() {
  235. loading = true
  236. progress.startAnimating()
  237. progressLayout.show()
  238. }
  239. func hideLoading() {
  240. loading = false
  241. progress.stopAnimating()
  242. progressLayout.hide()
  243. }
  244. func showNoDataLayout() {
  245. if cursor == 0 {
  246. noDataLayout.show()
  247. }
  248. }
  249. func hideNoDataLayout() {
  250. noDataLayout.hide()
  251. }
  252. func setDataList(dataList: [SertifikatBelumUpload]) {
  253. if cursor == 0 {
  254. noDataLayout.hide()
  255. }
  256. if dataList.count > 0 {
  257. for data in dataList {
  258. self.dataList.append(data)
  259. sertBlmUploadTV.beginUpdates()
  260. sertBlmUploadTV.insertRows(
  261. at: [IndexPath(row: self.dataList.count-1, section: 0)],
  262. with: .none
  263. )
  264. sertBlmUploadTV.endUpdates()
  265. }
  266. let totalData = dataList.count
  267. cursor += totalData
  268. loadMore = true
  269. } else {
  270. lastDataLoadedEmpty = true
  271. loadMore = false
  272. }
  273. }
  274. func onDownloadSuccess(urlFile: URL) {
  275. self.documentInteractorController = UIDocumentInteractionController()
  276. self.documentInteractorController.delegate = self
  277. self.documentInteractorController.url = urlFile
  278. self.documentInteractorController.presentPreview(animated: true)
  279. }
  280. func onDownloadFailed() {
  281. showAlert(title: "Informasi", msg: "File Tidak Ditemukan", actionTitle: "OK")
  282. }
  283. func setModalUploadDetail(sertifikatBelumUploadDetail: SertifikatBelumUploadDetail) {
  284. plgId = sertifikatBelumUploadDetail.plg_id
  285. aplikasiId = sertifikatBelumUploadDetail.apl_id
  286. lblSelectedAplikasiId.text = "\(aplikasiId)"
  287. lblSelectedNo.text = "\(sertifikatBelumUploadDetail.nomor)"
  288. lblSelectedTanggal.text = "\(sertifikatBelumUploadDetail.tgl) s/d \(sertifikatBelumUploadDetail.exp)"
  289. lblSelectedPlgId.text = "PLG ID: \(plgId)"
  290. lblSelectedNib.text = "NIB: \(sertifikatBelumUploadDetail.nib)"
  291. lblSelectedCustName.text = "\(sertifikatBelumUploadDetail.cust_name)"
  292. lblSelectedEqpName.text = "\(sertifikatBelumUploadDetail.eqp_name)"
  293. lblSelectedMerk.text = "Merk: \(sertifikatBelumUploadDetail.merk)"
  294. lblSelectedModel.text = "Model: \(sertifikatBelumUploadDetail.model)"
  295. lblSelectedBrand.text = "Brand: \(sertifikatBelumUploadDetail.brand)"
  296. modalUploadLayout.show()
  297. }
  298. func onUploadSuccess() {
  299. modalUploadLayout.hide()
  300. showAlert(title: "Informasi", msg: "Proses Simpan Berhasil", actionTitle: "OK")
  301. }
  302. func onUploadFailed() {
  303. showAlert(title: "Gagal", msg: "Proses Simpan Gagal", actionTitle: "OK")
  304. }
  305. }
  306. // UITableController Protocols
  307. extension SertifikatBelumUploadVC: UITableViewDelegate, UITableViewDataSource, UIScrollViewDelegate, SertifikatBelumUploadCellDelegate {
  308. func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
  309. return dataList.count
  310. }
  311. func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
  312. if tableView == sertBlmUploadTV {
  313. if let cell = tableView.dequeueReusableCell(withIdentifier: cellId, for: indexPath) as? SertifikatBelumUploadCell {
  314. let data = dataList[indexPath.row]
  315. cell.cellDelegate = self
  316. cell.btnUpload.tag = indexPath.row
  317. cell.btnDownloadSt1.tag = indexPath.row
  318. cell.btnDownloadSt2.tag = indexPath.row
  319. cell.btnDownloadSpt.tag = indexPath.row
  320. cell.updateViews(sertBlmUpload: data)
  321. return cell
  322. } else {
  323. return SertifikatBelumUploadCell()
  324. }
  325. } else {
  326. return SertifikatBelumUploadCell()
  327. }
  328. }
  329. func scrollViewDidScroll(_ scrollView: UIScrollView) {
  330. let threshold = -5
  331. let contentOffset = scrollView.contentOffset.y
  332. let maximumOffset = scrollView.contentSize.height - scrollView.frame.size.height;
  333. if loadMore && !loading && (Int(maximumOffset - contentOffset) <= threshold) {
  334. loadData()
  335. }
  336. }
  337. func download(urlWeb: String?, filename: String?) {
  338. if let url = urlWeb {
  339. if !url.isEmpty {
  340. if let fileName = filename {
  341. self.downloadFile(urlWeb: url, filename: fileName)
  342. } else {
  343. self.downloadFile(urlWeb: url, filename: "file.jpg")
  344. }
  345. } else {
  346. showAlert(title: "Informasi", msg: "File Tidak Ditemukan", actionTitle: "OK")
  347. }
  348. } else {
  349. showAlert(title: "Informasi", msg: "File Tidak Ditemukan", actionTitle: "OK")
  350. }
  351. }
  352. func upload(aplikasiId: Int?) {
  353. if let aplId = aplikasiId {
  354. loadUploadDetails(aplikasiId: aplId)
  355. }
  356. }
  357. }
  358. // DocumentInteractionController
  359. extension SertifikatBelumUploadVC: UIDocumentInteractionControllerDelegate {
  360. func documentInteractionControllerViewControllerForPreview(_ controller: UIDocumentInteractionController) -> UIViewController {
  361. guard let navVC = self.navigationController else {
  362. return self
  363. }
  364. return navVC
  365. }
  366. }
  367. // Search Delegate Protocols
  368. extension SertifikatBelumUploadVC: SearchSertifikatBelumUploadDelegate {
  369. func onSearch(search: String, parameter: String, jenis: String) {
  370. presenter.attachView(view: self)
  371. loadMore = false
  372. loading = false
  373. lastDataLoadedEmpty = false
  374. self.cursor = 0
  375. self.prev = 1
  376. self.search = search
  377. self.jenis = jenis
  378. self.columns = parameter
  379. dataList.removeAll()
  380. sertBlmUploadTV.reloadData()
  381. loadData()
  382. }
  383. override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
  384. if segue.identifier == searchSegueId {
  385. let destinationVC: SearchSertifikatBelumUploadVC = segue.destination as! SearchSertifikatBelumUploadVC
  386. destinationVC.delegate = self
  387. }
  388. }
  389. }
  390. extension SertifikatBelumUploadVC: UIDocumentPickerDelegate, UINavigationControllerDelegate {
  391. func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]) {
  392. if urls.count > 0 {
  393. let selectedUrlFile = urls[0] as URL
  394. let url = selectedUrlFile.absoluteString
  395. let urlSplits = url.split(separator: "/")
  396. let filename = urlSplits[urlSplits.count-1]
  397. if (selectedFileTagId == QR_CODE_FILE_TAG_ID) {
  398. urlFileQrCode = selectedUrlFile
  399. filenameQrCode = String(filename)
  400. lblSelectedQrCodeFilename.text = filenameQrCode
  401. } else if (selectedFileTagId == KETERANGAN_FILE_TAG_ID) {
  402. urlFileKeterangan = selectedUrlFile
  403. filenameKeterangan = String(filename)
  404. lblSelectedKetFilename.text = filenameKeterangan
  405. } else if (selectedFileTagId == PERINGATAN_FILE_TAG_ID) {
  406. urlFilePeringatan = selectedUrlFile
  407. filenamePeringatan = String(filename)
  408. lblSelectedPeringatanFilename.text = filenamePeringatan
  409. }
  410. }
  411. }
  412. func documentPickerWasCancelled(_ controller: UIDocumentPickerViewController) {
  413. print("document view was cancelled")
  414. }
  415. }
  416. extension SertifikatBelumUploadVC: UIImagePickerControllerDelegate {
  417. func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
  418. if let selectedUrlFile = info[UIImagePickerController.InfoKey.imageURL] as? URL {
  419. let url = selectedUrlFile.absoluteString
  420. let urlSplits = url.split(separator: "/")
  421. let filename = urlSplits[urlSplits.count-1]
  422. if (selectedFileTagId == QR_CODE_FILE_TAG_ID) {
  423. urlFileQrCode = selectedUrlFile
  424. filenameQrCode = String(filename)
  425. lblSelectedQrCodeFilename.text = filenameQrCode
  426. } else if (selectedFileTagId == KETERANGAN_FILE_TAG_ID) {
  427. urlFileKeterangan = selectedUrlFile
  428. filenameKeterangan = String(filename)
  429. lblSelectedKetFilename.text = filenameKeterangan
  430. } else if (selectedFileTagId == PERINGATAN_FILE_TAG_ID) {
  431. urlFilePeringatan = selectedUrlFile
  432. filenamePeringatan = String(filename)
  433. lblSelectedPeringatanFilename.text = filenamePeringatan
  434. }
  435. }
  436. dismiss(animated: true, completion: nil)
  437. }
  438. func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
  439. print("gallery was cancelled")
  440. }
  441. }