Skip to content

Instantly share code, notes, and snippets.

@KanybekMomukeyev
Last active June 5, 2018 09:05
Show Gist options
  • Select an option

  • Save KanybekMomukeyev/e72ddf336011eecbc096aeca8d585632 to your computer and use it in GitHub Desktop.

Select an option

Save KanybekMomukeyev/e72ddf336011eecbc096aeca8d585632 to your computer and use it in GitHub Desktop.
MainDocumentGVC.swift
//
// 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