SertifikatBelumUploadVC.swift 19 KB

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