Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
Binary file added .DS_Store
Binary file not shown.
509 changes: 509 additions & 0 deletions DiplomProject/DiplomProject.xcodeproj/project.pbxproj

Large diffs are not rendered by default.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
//
// AppDelegate.swift
// Lesson13
// DiplomProject
//
// Created by Михаил Беленко on 03.02.2020.
// Created by Михаил Беленко on 05.02.2020.
// Copyright © 2020 Михаил Беленко. All rights reserved.
//

Expand Down
195 changes: 195 additions & 0 deletions DiplomProject/DiplomProject/Base.lproj/Main.storyboard

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
//
// ChartExpenseIncomeViewController.swift
// DiplomProject
//
// Created by Михаил Беленко on 05.02.2020.
// Copyright © 2020 Михаил Беленко. All rights reserved.
//

import UIKit
import DTTableViewManager

class ChartExpenseIncomeViewController: UIViewController, DTTableViewManageable {

@IBOutlet weak var tableView: UITableView!
@IBOutlet weak var segmentedControl: UISegmentedControl!

override func viewDidLoad() {
super.viewDidLoad()

setupUI()
manager.register(TransactionTableViewCell.self)
changeSegmen(self)
}

private func setupUI() {
navigationItem.title = "График расходов/доходов"
}

@IBAction func changeSegmen(_ sender: Any) {
switch segmentedControl.selectedSegmentIndex {
case 0:
manager.memoryStorage.setItems(Persistence.storage.getTransactionFromPeriod(with: Calendar.current.date(byAdding: .weekOfYear, value: -1, to: Date())!))
case 1:
manager.memoryStorage.setItems(Persistence.storage.getTransactionFromPeriod(with: Calendar.current.date(byAdding: .month, value: -1, to: Date())!))
case 2:
manager.memoryStorage.setItems(Persistence.storage.getTransactionFromPeriod(with: Calendar.current.date(byAdding: .month, value: -3, to: Date())!))
case 3:
manager.memoryStorage.setItems(Persistence.storage.getTransactionFromPeriod(with: Date.init(timeIntervalSince1970: 0)))
default:
fatalError("imposible")
}
}
}
27 changes: 27 additions & 0 deletions DiplomProject/DiplomProject/CustomView/DefaultButton.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
//
// DefaultButton.swift
// DiplomProject
//
// Created by Михаил Беленко on 05.02.2020.
// Copyright © 2020 Михаил Беленко. All rights reserved.
//

import UIKit

class DefaultButton: UIButton {
private var isSetuped = false

override func layoutSubviews() {
super.layoutSubviews()

if isSetuped { return }
isSetuped = true

setTitleColor(.white, for: .normal)

backgroundColor = .systemBlue
layer.cornerRadius = 10
contentHorizontalAlignment = .center
contentVerticalAlignment = .center
}
}
16 changes: 16 additions & 0 deletions DiplomProject/DiplomProject/Entity/Expense.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
//
// Expense.swift
// DiplomProject
//
// Created by Михаил Беленко on 05.02.2020.
// Copyright © 2020 Михаил Беленко. All rights reserved.
//

import RealmSwift
import Foundation

class Expense: Object, Transaction {
@objc dynamic var value: Float = 0.0
@objc dynamic var date: Date = Date()
@objc dynamic var category: ExpenseCategory?
}
14 changes: 14 additions & 0 deletions DiplomProject/DiplomProject/Entity/ExpenseCategory.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
//
// ExpenseCategory.swift
// DiplomProject
//
// Created by Михаил Беленко on 05.02.2020.
// Copyright © 2020 Михаил Беленко. All rights reserved.
//

import RealmSwift

class ExpenseCategory: Object {
@objc dynamic var name: String = ""
let expensesList = List<Expense>()
}
15 changes: 15 additions & 0 deletions DiplomProject/DiplomProject/Entity/Income.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
//
// Income.swift
// DiplomProject
//
// Created by Михаил Беленко on 05.02.2020.
// Copyright © 2020 Михаил Беленко. All rights reserved.
//

import RealmSwift
import Foundation

class Income: Object, Transaction {
@objc dynamic var value: Float = 0.0
@objc dynamic var date: Date = Date()
}
14 changes: 14 additions & 0 deletions DiplomProject/DiplomProject/Entity/Transaction.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
//
// Transaction.swift
// DiplomProject
//
// Created by Михаил Беленко on 05.02.2020.
// Copyright © 2020 Михаил Беленко. All rights reserved.
//

import Foundation

protocol Transaction {
var value: Float { get set }
var date: Date { get }
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
//
// ExcenseScreenViewConroller + Alerts.swift
// DiplomProject
//
// Created by Михаил Беленко on 05.02.2020.
// Copyright © 2020 Михаил Беленко. All rights reserved.
//

import UIKit

extension ExcenseScreenViewConroller {

func showAddExcenseAlert() {

let alert = UIAlertController(title: "Добавление расхода", message: "Введите сумму расхода", preferredStyle: .alert)

alert.addTextField()
let textField = alert.textFields![0] // Force unwrapping because we know it exists.

let saveAction = UIAlertAction(title: "OK", style: .default, handler: { [unowned self] (_) in
let expense = Expense()
expense.value = Float(textField.text!)!
Persistence.storage.addExpenseInCategory(expense: expense, nameCategory: self.nameCategory)
self.manager.memoryStorage.addItem(expense)
})

let cancelAction = UIAlertAction(title: "Отмена",
style: .default) { (action: UIAlertAction!) -> Void in
}

textField.rx.text.subscribe(onNext: { text in
if let text = text, let value = Float(text), !text.isEmpty && value > 0 {
saveAction.isEnabled = true
}
else {
saveAction.isEnabled = false
}
}).disposed(by: disposeBag)

alert.addAction(saveAction)
alert.addAction(cancelAction)


self.present(alert, animated: true, completion: nil)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
//
// ExcenseScreenViewConroller.swift
// DiplomProject
//
// Created by Михаил Беленко on 05.02.2020.
// Copyright © 2020 Михаил Беленко. All rights reserved.
//

import UIKit
import DTTableViewManager
import RxSwift
import RxCocoa

class ExcenseScreenViewConroller: UIViewController, DTTableViewManageable {

var disposeBag = DisposeBag()

@IBOutlet weak var tableView: UITableView!

private lazy var addExcenseView: UIView = {
let view = UIView(frame: CGRect(x: 0, y: 0, width: self.tableView.frame.size.width, height: 70))
let button = DefaultButton()
button.setTitle("Добавить расход", for: .normal)

button.rx.controlEvent(.touchUpInside).subscribe(onNext: { [unowned self] _ in
self.showAddExcenseAlert()
}).disposed(by: disposeBag)

view.addSubview(button)

button.snp.makeConstraints { make in
make.edges.equalToSuperview().inset(16)
}

return view
}()

var nameCategory: String!

override func viewDidLoad() {
super.viewDidLoad()

manager.register(TransactionTableViewCell.self)
setupUI()
configureTableView()
manager.memoryStorage.setItems(Persistence.storage.getExpensesFromCategory(nameCategory: nameCategory))
}

private func setupUI() {
navigationItem.title = nameCategory
}

private func configureTableView() {
tableView.tableFooterView = addExcenseView
}
}
57 changes: 57 additions & 0 deletions DiplomProject/DiplomProject/ExcensesCategoryTableViewCell.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
//
// ExcensesCategoryTableViewCell.swift
// DiplomProject
//
// Created by Михаил Беленко on 05.02.2020.
// Copyright © 2020 Михаил Беленко. All rights reserved.
//

import UIKit
import DTModelStorage
import SnapKit

class ExcensesCategoryTableViewCell: UITableViewCell, ModelTransfer {
typealias ModelType = ExpenseCategory

private lazy var nameLabel: UILabel = {
let label = UILabel()
label.font = .systemFont(ofSize: 20, weight: .medium)
label.textColor = .systemBlue
return label
}()

private lazy var expensesSumLabel: UILabel = {
let label = UILabel()
label.font = .systemFont(ofSize: 20, weight: .regular)
label.textColor = .systemRed
return label
}()

override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)

contentView.addSubview(nameLabel)
contentView.addSubview(expensesSumLabel)
setupConstraints()
}

required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}

func update(with model: ExpenseCategory) {
nameLabel.text = model.name
expensesSumLabel.text = "-\(model.expensesList.reduce(0, { $0 + $1.value })) ₽"
}

private func setupConstraints() {
nameLabel.snp.makeConstraints { make in
make.top.bottom.leading.equalToSuperview().inset(16)
}

expensesSumLabel.snp.makeConstraints { make in
make.leading.equalTo(nameLabel.snp.trailing).offset(8)
make.top.bottom.trailing.equalToSuperview().inset(16)
}
}
}
Loading