Last active
June 5, 2018 09:05
-
-
Save KanybekMomukeyev/e72ddf336011eecbc096aeca8d585632 to your computer and use it in GitHub Desktop.
MainDocumentGVC.swift
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| // | |
| // MainDocumentGVC.swift | |
| // RentautomationPhone | |
| // | |
| // Created by kanybek on 3/6/18. | |
| // Copyright © 2018 kanybek. All rights reserved. | |
| // | |
| import UIKit | |
| import IGListKit | |
| import MZFormSheetPresentationController | |
| class MainDocumentGVC: BaseVC, ErrorPopoverRenderer { | |
| var docType: OrderDocumentType | |
| var disposeSet: DisposableSet? | |
| var selectedProducts: [OrderDetail] = [] | |
| var totalPrice: Double = 0.0 | |
| var totalDiscount: Discount = Discount() | |
| var adapter: ListAdapter? | |
| @IBOutlet weak var collectionView: UICollectionView! | |
| @IBOutlet weak var totalSumLabel: UILabel! | |
| @IBOutlet weak var totalSumLabelWithDiscount: UILabel! | |
| lazy var titleView: TitleView2 = { | |
| let view = TitleView2() | |
| return view | |
| }() | |
| override var title: String? { | |
| set { | |
| titleView.titleLabel.text = newValue | |
| } | |
| get { | |
| return titleView.titleLabel.text | |
| } | |
| } | |
| convenience init() { | |
| self.init(docType: .none) | |
| } | |
| init(docType: OrderDocumentType) { | |
| self.docType = docType | |
| self.disposeSet = DisposableSet() | |
| OrderMemomry.shared.clearAllVariables() | |
| OrderMemomry.shared.orderDocument = docType | |
| super.init(nibName: "MainDocumentGVC", bundle: nil) | |
| } | |
| required init(coder aDecoder: NSCoder) { | |
| fatalError("init(coder:) has not been implemented") | |
| } | |
| deinit { | |
| print("MainDocumentGVC deallocated") | |
| self.disposeSet?.dispose() | |
| self.disposeSet = nil | |
| self.collectionView = nil | |
| self.adapter = nil | |
| } | |
| override func viewDidLoad() { | |
| super.viewDidLoad() | |
| self.adapter = ListAdapter(updater: ListAdapterUpdater(), viewController: self) | |
| //lazy var adapter: ListAdapter = { return ListAdapter(updater: ListAdapterUpdater(), viewController: self)//}() | |
| let cancelButton = UIBarButtonItem(title: "Отмена", style: .plain, target: self, action: #selector(cancelDidPressed(_:))) | |
| self.navigationItem.leftBarButtonItem = cancelButton | |
| let saveButton = UIBarButtonItem(barButtonSystemItem: .save, target: self, action: #selector(saveDidPressed(_:))) | |
| self.navigationItem.rightBarButtonItem = saveButton | |
| navigationItem.titleView = self.titleView | |
| self.titleView.titleLabel.textColor = Order.orderDocumentTypeColor(orderDocType: docType) | |
| self.titleView.detailLabel.text = "\(Date().toString(format: .custom("EEE, dd MMM HH:mm")))" | |
| switch docType { | |
| case .saleToCustomer: | |
| self.title = "Продажа" | |
| case .receiveFromSupplier: | |
| self.title = "Закупка" | |
| case .returnFromCustomer: | |
| self.title = "Возврат от клиента" | |
| case .returnToSupplier: | |
| self.title = "Возврат к потавщику" | |
| case .saleToCustomerEdited: | |
| self.title = "Редак. продажи" | |
| case .receiveFromSupplierEdited: | |
| self.title = "Редак. закупки" | |
| case .preOrderToCustomer, .preOrderToCustomerEdited: | |
| self.title = "Заказ для клиента" | |
| case .stockTaking: | |
| self.title = "Инвентаризация" | |
| case .rawProductGoneToProd: | |
| self.title = "Расход сырья" | |
| case .rawProductGoneToProdEdited: | |
| self.title = "Редак. расход сырья" | |
| case .readyProductReceivedFromProd: | |
| self.title = "Выход готовой продукции" | |
| case .readyProductReceivedFromProdEdited: | |
| self.title = "Редак. готовой" | |
| case .removeProducts: | |
| self.title = "Брак" | |
| case .removeProductsEdited: | |
| self.title = "Редак. брак" | |
| default: | |
| print("default:") | |
| } | |
| view.backgroundColor = UIColor.white | |
| collectionView.backgroundColor = UIColor.white | |
| collectionView.alwaysBounceVertical = true | |
| adapter?.collectionView = self.collectionView | |
| adapter?.dataSource = self | |
| self.totalSumLabel.text = Global.shared.priceFormatter.string(for: self.totalPrice) | |
| let totalPriceWithDiscount = self.totalDiscount.totalPriceWithDiscount() | |
| self.totalSumLabelWithDiscount.text = Global.shared.priceFormatter.string(for: totalPriceWithDiscount) | |
| let nib = UINib(nibName: "ButtonsFooterCVCell", bundle: nil) | |
| self.collectionView.register(nib, forSupplementaryViewOfKind: UICollectionElementKindSectionFooter, withReuseIdentifier: "ButtonsFooterCVCell") | |
| let nib2 = UINib(nibName: "ButtonsFooterCVCell", bundle: nil) | |
| self.collectionView.register(nib2, forSupplementaryViewOfKind: UICollectionElementKindSectionHeader, withReuseIdentifier: "ButtonsFooterCVCell") | |
| self.setUpListeners() | |
| } | |
| override func viewWillAppear(_ animated: Bool) { | |
| super.viewWillAppear(animated) | |
| } | |
| override func didReceiveMemoryWarning() { | |
| super.didReceiveMemoryWarning() | |
| } | |
| override func viewDidLayoutSubviews() { | |
| super.viewDidLayoutSubviews() | |
| if #available(iOS 11.0, *) { | |
| self.collectionView.contentInsetAdjustmentBehavior = .never | |
| } | |
| let top_ = self.topLayoutGuide.length | |
| let bottom_ = self.bottomLayoutGuide.length | |
| self.collectionView.contentInset = UIEdgeInsets(top: top_, left: 0, bottom: bottom_, right: 0) | |
| } | |
| @objc func saveDidPressed(_ sender: UIBarButtonItem) { | |
| if selectedProducts.count == 0 { | |
| let _ = self.showErrorAlert(text: "Выберите товар!") | |
| return | |
| } | |
| let chooseCustVC = ChooseCustomerVC(orderDetails: self.selectedProducts, totalPrice: self.totalPrice, totalDiscount: self.totalDiscount) | |
| self.navigationController?.pushViewController(chooseCustVC, animated: true) | |
| } | |
| private func setUpListeners() { | |
| let oDetSignal: Signal = PipesStore.shared.orderDetailSelectedSignal() | |
| let dispose = oDetSignal.start(next: {[weak self] (oDetail_, shouldSalePrice) in | |
| if let self_ = self { | |
| if let indexFound = self_.selectedProducts.index(where: {$0.productId == oDetail_.productId}) { | |
| // found in array | |
| let orderDetail = self_.selectedProducts[indexFound] | |
| orderDetail.price = oDetail_.price | |
| orderDetail.orderQuantity = oDetail_.orderQuantity | |
| self_.selectedProducts[indexFound] = orderDetail | |
| self_.adapter?.scroll(to: orderDetail, supplementaryKinds: nil, scrollDirection: .vertical, scrollPosition: .top, animated: false) | |
| self_.adapter?.reloadObjects([orderDetail]) | |
| } else { | |
| // not found in array | |
| self_.insertOdetail(orderDetail: oDetail_) | |
| } | |
| PipesStore.shared.totalSelectedOrderDetailsPipe.putNext(self_.selectedProducts) | |
| } | |
| }) | |
| self.disposeSet?.add(dispose) | |
| let totalSum: Signal = PipesStore.shared.totalSelectedOrderDetailsSignal() | |
| let dispose2 = totalSum.start(next: {[weak self] (orderDetails: [OrderDetail]) in | |
| if let strongSelf = self { | |
| var totalPrice_: Double = 0.0 | |
| var totalAmount: Double = 0.0 | |
| for orderDetail in orderDetails { | |
| totalAmount = totalAmount + orderDetail.orderQuantity | |
| let totalPriceWithDiscount = orderDetail.price * orderDetail.orderQuantity | |
| totalPrice_ = totalPrice_ + totalPriceWithDiscount | |
| } | |
| strongSelf.totalPrice = totalPrice_ | |
| strongSelf.totalDiscount.totalPrice = totalPrice_ | |
| strongSelf.totalSumLabel.text = Global.shared.priceFormatter.string(for: strongSelf.totalPrice) | |
| //strongSelf.totalAmountLabel.text = Global.shared.amountFormatter.string(for: totalAmount) | |
| let totalPriceWithDiscount = strongSelf.totalDiscount.totalPriceWithDiscount() | |
| strongSelf.totalSumLabelWithDiscount.text = Global.shared.priceFormatter.string(for: totalPriceWithDiscount) | |
| } | |
| }) | |
| self.disposeSet?.add(dispose2) | |
| } | |
| private func insertOdetail(orderDetail: OrderDetail) { | |
| self.selectedProducts.insert(orderDetail, at: self.selectedProducts.count) | |
| self.updateHeaders(self.selectedProducts) | |
| //self.adapter.performUpdates(animated: true, completion: nil) | |
| self.adapter?.reloadData {[weak self] (finished) in | |
| if let last = self?.selectedProducts.last { | |
| self?.adapter?.scroll(to: last, supplementaryKinds: nil, scrollDirection: .vertical, scrollPosition: .centeredVertically, animated: false) | |
| } | |
| } | |
| } | |
| private func updateHeaders(_ oDetails_: [OrderDetail]) { | |
| let count_ = oDetails_.count | |
| for (index, oDetail_) in oDetails_.enumerated() { | |
| oDetail_.shoudShowHeader = false | |
| oDetail_.indexInArray = (index + 1) | |
| if index == (count_ - 1) { | |
| oDetail_.shoudShowHeader = true | |
| } | |
| } | |
| } | |
| } | |
| extension MainDocumentGVC: ListAdapterDataSource { | |
| func objects(for listAdapter: ListAdapter) -> [ListDiffable] { | |
| return self.selectedProducts | |
| } | |
| func listAdapter(_ listAdapter: ListAdapter, sectionControllerFor object: Any) -> ListSectionController { | |
| let orderDetail_ = object as! OrderDetail | |
| let mainDocSC = MainDocumentSC(shouldShow: orderDetail_.shoudShowHeader) | |
| mainDocSC.selectHandler = {[weak self] (orderDetail__: OrderDetail) in | |
| if let self_ = self { | |
| let quantityVC = SetQuantityVC(orderDetail: orderDetail__) | |
| quantityVC.doneHandler = {(_orderDetail_: OrderDetail) in | |
| PipesStore.shared.orderDetailSelectedPipe.putNext((_orderDetail_, true)) | |
| } | |
| let navController = RNNavigationController(rootViewController: quantityVC) | |
| let formSheetController = MZFormSheetPresentationViewController(contentViewController: navController) | |
| formSheetController.allowDismissByPanningPresentedView = true | |
| formSheetController.contentViewControllerTransitionStyle = .slideAndBounceFromBottom | |
| formSheetController.presentationController?.contentViewSize = CGSize(width: 300, height: 250) | |
| self_.present(formSheetController, animated: true, completion:{() in | |
| }) | |
| } | |
| } | |
| mainDocSC.removeHandler = {[weak self] (orderDetail__: OrderDetail) in | |
| if let self_ = self { | |
| var productName = "" | |
| if let product_ = TPDatabase.shared.productFor(productId: orderDetail_.productId) { | |
| productName = product_.productName | |
| } | |
| let sheet = UIAlertController(title: productName, message: nil, preferredStyle: .actionSheet) | |
| sheet.addAction(UIAlertAction(title: "Удалить", style: .destructive, handler: {[weak self] _ in | |
| if let self_ = self { | |
| if let indexFound = self_.selectedProducts.index(where: {$0.productId == orderDetail__.productId}) { | |
| PipesStore.shared.productRemovedFromSaleListPipe.putNext(orderDetail__) | |
| self_.selectedProducts.remove(at: indexFound) | |
| self_.updateHeaders(self_.selectedProducts) | |
| PipesStore.shared.totalSelectedOrderDetailsPipe.putNext(self_.selectedProducts) | |
| //self_.adapter.performUpdates(animated: true, completion: ) | |
| self_.adapter?.performUpdates(animated: true, completion: {[weak self] (finished) in | |
| self?.adapter?.reloadData(completion: nil) | |
| }) | |
| } | |
| } | |
| })) | |
| sheet.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil)) | |
| self_.present(sheet, animated: true, completion: nil) | |
| } | |
| } | |
| mainDocSC.addProductHandler = {[weak self] in | |
| let selOdetails = self?.selectedProducts ?? [] | |
| let choosePrVC = ChooseProductsVC(selectedODetails_: selOdetails) | |
| self?.navigationController?.present(UINavigationController(rootViewController: choosePrVC), animated: true, completion: nil) | |
| } | |
| mainDocSC.scannerHandler = {[weak self] in | |
| let selOdetails = self?.selectedProducts ?? [] | |
| let scanPrVC = ScanProductsVC(selectedODetails_: selOdetails) | |
| self?.navigationController?.present(UINavigationController(rootViewController: scanPrVC), animated: true, completion: nil) | |
| } | |
| return mainDocSC | |
| } | |
| func emptyView(for listAdapter: ListAdapter) -> UIView? { | |
| let instance = DocEmptyView.instance() | |
| instance.addProductHandler = {[weak self] in | |
| let selOdetails = self?.selectedProducts ?? [] | |
| let choosePrVC = ChooseProductsVC(selectedODetails_: selOdetails) | |
| self?.navigationController?.present(UINavigationController(rootViewController: choosePrVC), animated: true, completion: nil) | |
| } | |
| instance.scannerHandler = {[weak self] in | |
| let selOdetails = self?.selectedProducts ?? [] | |
| let scanPrVC = ScanProductsVC(selectedODetails_: selOdetails) | |
| self?.navigationController?.present(UINavigationController(rootViewController: scanPrVC), animated: true, completion: nil) | |
| } | |
| return instance | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment