From 875344e3aa7eef91da2cacc28539659e0dac4a46 Mon Sep 17 00:00:00 2001 From: luizprocesso <34315141+luizprocesso@users.noreply.github.com> Date: Sun, 29 Sep 2019 12:14:06 -0300 Subject: [PATCH] Add files via upload --- .../project.pbxproj | 812 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../UserInterfaceState.xcuserstate | Bin 0 -> 104126 bytes .../xcdebugger/Breakpoints_v2.xcbkptlist | 6 + .../xcschemes/xcschememanagement.plist | 14 + .../AppDelegate.swift | 34 + .../AppIcon.appiconset/Contents.json | 98 +++ .../Assets.xcassets/Contents.json | 6 + .../Shape.imageset/Contents.json | 21 + .../Assets.xcassets/Shape.imageset/Shape.png | Bin 0 -> 348 bytes .../downArrow.imageset/Contents.json | 21 + .../downArrow.imageset/downArrow.png | Bin 0 -> 295 bytes .../downLine.imageset/Contents.json | 21 + .../downLine.imageset/downLine.png | Bin 0 -> 110 bytes .../Base.lproj/LaunchScreen.storyboard | 25 + .../CustomCells/ReturnView.swift | 62 ++ .../CustomCells/form/SendTableViewCell.swift | 74 ++ .../form/TxtFieldTableViewCell.swift | 51 ++ .../invest/HeaderTableViewCell.swift | 60 ++ .../invest/InvestBtnTableViewCell.swift | 45 + .../invest/InvestInfoTableViewCell.swift | 55 ++ .../invest/InvestMoreInfoTableViewCell.swift | 57 ++ .../invest/ReturnTableViewCell.swift | 99 +++ .../invest/RiskTableViewCell.swift | 118 +++ .../CustomExtensions/CustomColors.swift | 33 + .../CustomExtensions/DoubleExtension.swift | 18 + .../CustomExtensions/ImageExtension.swift | 38 + .../CustomExtensions/VisualFormat.swift | 23 + .../Formulario/FormInteractor.swift | 36 + .../Formulario/FormModels.swift | 28 + .../Formulario/FormPresenter.swift | 31 + .../Formulario/FormRouter.swift | 56 ++ .../Formulario/FormViewController.swift | 144 ++++ .../Formulario/FormWorker.swift | 37 + .../LuizProcessoTesteSantader/Info.plist | 45 + .../Investimento/InvestInteractor.swift | 36 + .../Investimento/InvestModels.swift | 28 + .../Investimento/InvestPresenter.swift | 31 + .../Investimento/InvestRouter.swift | 46 + .../Investimento/InvestViewController.swift | 234 +++++ .../Investimento/InvestWorker.swift | 37 + .../contents | 4 + .../Menssagem/MessageInteractor.swift | 37 + .../Menssagem/MessageModels.swift | 26 + .../Menssagem/MessagePresenter.swift | 28 + .../Menssagem/MessageRouter.swift | 56 ++ .../Menssagem/MessageViewController.swift | 87 ++ .../Menssagem/MessageWorker.swift | 18 + .../Models/InvestViewInfo.swift | 51 ++ .../Models/ViewInfo.swift | 14 + .../Models/ViewInfoObj.swift | 20 + .../Views/FormView.swift | 66 ++ .../Views/InvestView.swift | 67 ++ .../Views/MessageView.swift | 91 ++ .../LuizProcessoTesteSantaderTests/Info.plist | 22 + .../LuizProcessoTesteSantaderTests.swift | 34 + .../Info.plist | 22 + .../LuizProcessoTesteSantaderUITests.swift | 43 + 59 files changed, 3281 insertions(+) create mode 100644 LuizProcessoTesteSantader/LuizProcessoTesteSantader.xcodeproj/project.pbxproj create mode 100644 LuizProcessoTesteSantader/LuizProcessoTesteSantader.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 LuizProcessoTesteSantader/LuizProcessoTesteSantader.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 LuizProcessoTesteSantader/LuizProcessoTesteSantader.xcodeproj/project.xcworkspace/xcuserdata/luizprocesso.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 LuizProcessoTesteSantader/LuizProcessoTesteSantader.xcodeproj/xcuserdata/luizprocesso.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist create mode 100644 LuizProcessoTesteSantader/LuizProcessoTesteSantader.xcodeproj/xcuserdata/luizprocesso.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 LuizProcessoTesteSantader/LuizProcessoTesteSantader/AppDelegate.swift create mode 100644 LuizProcessoTesteSantader/LuizProcessoTesteSantader/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 LuizProcessoTesteSantader/LuizProcessoTesteSantader/Assets.xcassets/Contents.json create mode 100644 LuizProcessoTesteSantader/LuizProcessoTesteSantader/Assets.xcassets/Shape.imageset/Contents.json create mode 100644 LuizProcessoTesteSantader/LuizProcessoTesteSantader/Assets.xcassets/Shape.imageset/Shape.png create mode 100644 LuizProcessoTesteSantader/LuizProcessoTesteSantader/Assets.xcassets/downArrow.imageset/Contents.json create mode 100644 LuizProcessoTesteSantader/LuizProcessoTesteSantader/Assets.xcassets/downArrow.imageset/downArrow.png create mode 100644 LuizProcessoTesteSantader/LuizProcessoTesteSantader/Assets.xcassets/downLine.imageset/Contents.json create mode 100644 LuizProcessoTesteSantader/LuizProcessoTesteSantader/Assets.xcassets/downLine.imageset/downLine.png create mode 100644 LuizProcessoTesteSantader/LuizProcessoTesteSantader/Base.lproj/LaunchScreen.storyboard create mode 100644 LuizProcessoTesteSantader/LuizProcessoTesteSantader/CustomCells/ReturnView.swift create mode 100644 LuizProcessoTesteSantader/LuizProcessoTesteSantader/CustomCells/form/SendTableViewCell.swift create mode 100644 LuizProcessoTesteSantader/LuizProcessoTesteSantader/CustomCells/form/TxtFieldTableViewCell.swift create mode 100644 LuizProcessoTesteSantader/LuizProcessoTesteSantader/CustomCells/invest/HeaderTableViewCell.swift create mode 100644 LuizProcessoTesteSantader/LuizProcessoTesteSantader/CustomCells/invest/InvestBtnTableViewCell.swift create mode 100644 LuizProcessoTesteSantader/LuizProcessoTesteSantader/CustomCells/invest/InvestInfoTableViewCell.swift create mode 100644 LuizProcessoTesteSantader/LuizProcessoTesteSantader/CustomCells/invest/InvestMoreInfoTableViewCell.swift create mode 100644 LuizProcessoTesteSantader/LuizProcessoTesteSantader/CustomCells/invest/ReturnTableViewCell.swift create mode 100644 LuizProcessoTesteSantader/LuizProcessoTesteSantader/CustomCells/invest/RiskTableViewCell.swift create mode 100644 LuizProcessoTesteSantader/LuizProcessoTesteSantader/CustomExtensions/CustomColors.swift create mode 100644 LuizProcessoTesteSantader/LuizProcessoTesteSantader/CustomExtensions/DoubleExtension.swift create mode 100644 LuizProcessoTesteSantader/LuizProcessoTesteSantader/CustomExtensions/ImageExtension.swift create mode 100644 LuizProcessoTesteSantader/LuizProcessoTesteSantader/CustomExtensions/VisualFormat.swift create mode 100644 LuizProcessoTesteSantader/LuizProcessoTesteSantader/Formulario/FormInteractor.swift create mode 100644 LuizProcessoTesteSantader/LuizProcessoTesteSantader/Formulario/FormModels.swift create mode 100644 LuizProcessoTesteSantader/LuizProcessoTesteSantader/Formulario/FormPresenter.swift create mode 100644 LuizProcessoTesteSantader/LuizProcessoTesteSantader/Formulario/FormRouter.swift create mode 100644 LuizProcessoTesteSantader/LuizProcessoTesteSantader/Formulario/FormViewController.swift create mode 100644 LuizProcessoTesteSantader/LuizProcessoTesteSantader/Formulario/FormWorker.swift create mode 100644 LuizProcessoTesteSantader/LuizProcessoTesteSantader/Info.plist create mode 100644 LuizProcessoTesteSantader/LuizProcessoTesteSantader/Investimento/InvestInteractor.swift create mode 100644 LuizProcessoTesteSantader/LuizProcessoTesteSantader/Investimento/InvestModels.swift create mode 100644 LuizProcessoTesteSantader/LuizProcessoTesteSantader/Investimento/InvestPresenter.swift create mode 100644 LuizProcessoTesteSantader/LuizProcessoTesteSantader/Investimento/InvestRouter.swift create mode 100644 LuizProcessoTesteSantader/LuizProcessoTesteSantader/Investimento/InvestViewController.swift create mode 100644 LuizProcessoTesteSantader/LuizProcessoTesteSantader/Investimento/InvestWorker.swift create mode 100644 LuizProcessoTesteSantader/LuizProcessoTesteSantader/LuizProcessoTesteSantader.xcdatamodeld/LuizProcessoTesteSantader.xcdatamodel/contents create mode 100644 LuizProcessoTesteSantader/LuizProcessoTesteSantader/Menssagem/MessageInteractor.swift create mode 100644 LuizProcessoTesteSantader/LuizProcessoTesteSantader/Menssagem/MessageModels.swift create mode 100644 LuizProcessoTesteSantader/LuizProcessoTesteSantader/Menssagem/MessagePresenter.swift create mode 100644 LuizProcessoTesteSantader/LuizProcessoTesteSantader/Menssagem/MessageRouter.swift create mode 100644 LuizProcessoTesteSantader/LuizProcessoTesteSantader/Menssagem/MessageViewController.swift create mode 100644 LuizProcessoTesteSantader/LuizProcessoTesteSantader/Menssagem/MessageWorker.swift create mode 100644 LuizProcessoTesteSantader/LuizProcessoTesteSantader/Models/InvestViewInfo.swift create mode 100644 LuizProcessoTesteSantader/LuizProcessoTesteSantader/Models/ViewInfo.swift create mode 100644 LuizProcessoTesteSantader/LuizProcessoTesteSantader/Models/ViewInfoObj.swift create mode 100644 LuizProcessoTesteSantader/LuizProcessoTesteSantader/Views/FormView.swift create mode 100644 LuizProcessoTesteSantader/LuizProcessoTesteSantader/Views/InvestView.swift create mode 100644 LuizProcessoTesteSantader/LuizProcessoTesteSantader/Views/MessageView.swift create mode 100644 LuizProcessoTesteSantader/LuizProcessoTesteSantaderTests/Info.plist create mode 100644 LuizProcessoTesteSantader/LuizProcessoTesteSantaderTests/LuizProcessoTesteSantaderTests.swift create mode 100644 LuizProcessoTesteSantader/LuizProcessoTesteSantaderUITests/Info.plist create mode 100644 LuizProcessoTesteSantader/LuizProcessoTesteSantaderUITests/LuizProcessoTesteSantaderUITests.swift diff --git a/LuizProcessoTesteSantader/LuizProcessoTesteSantader.xcodeproj/project.pbxproj b/LuizProcessoTesteSantader/LuizProcessoTesteSantader.xcodeproj/project.pbxproj new file mode 100644 index 00000000..53a625f0 --- /dev/null +++ b/LuizProcessoTesteSantader/LuizProcessoTesteSantader.xcodeproj/project.pbxproj @@ -0,0 +1,812 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + objects = { + +/* Begin PBXBuildFile section */ + 6D3D5B21233D496F00E310D1 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D3D5B20233D496F00E310D1 /* AppDelegate.swift */; }; + 6D3D5B2B233D496F00E310D1 /* LuizProcessoTesteSantader.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = 6D3D5B29233D496F00E310D1 /* LuizProcessoTesteSantader.xcdatamodeld */; }; + 6D3D5B2D233D496F00E310D1 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 6D3D5B2C233D496F00E310D1 /* Assets.xcassets */; }; + 6D3D5B30233D496F00E310D1 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 6D3D5B2E233D496F00E310D1 /* LaunchScreen.storyboard */; }; + 6D3D5B3B233D497000E310D1 /* LuizProcessoTesteSantaderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D3D5B3A233D497000E310D1 /* LuizProcessoTesteSantaderTests.swift */; }; + 6D3D5B46233D497000E310D1 /* LuizProcessoTesteSantaderUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D3D5B45233D497000E310D1 /* LuizProcessoTesteSantaderUITests.swift */; }; + 6D3D5B5A233D498C00E310D1 /* FormPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D3D5B54233D498C00E310D1 /* FormPresenter.swift */; }; + 6D3D5B5B233D498C00E310D1 /* FormWorker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D3D5B55233D498C00E310D1 /* FormWorker.swift */; }; + 6D3D5B5C233D498C00E310D1 /* FormRouter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D3D5B56233D498C00E310D1 /* FormRouter.swift */; }; + 6D3D5B5D233D498C00E310D1 /* FormModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D3D5B57233D498C00E310D1 /* FormModels.swift */; }; + 6D3D5B5E233D498C00E310D1 /* FormViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D3D5B58233D498C00E310D1 /* FormViewController.swift */; }; + 6D3D5B5F233D498C00E310D1 /* FormInteractor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D3D5B59233D498C00E310D1 /* FormInteractor.swift */; }; + 6D3D5BA4233D6E4D00E310D1 /* TxtFieldTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D3D5BA2233D6E4D00E310D1 /* TxtFieldTableViewCell.swift */; }; + 6D3D5BA9233D6E7700E310D1 /* SendTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D3D5BA7233D6E7700E310D1 /* SendTableViewCell.swift */; }; + 6D3D5BAC233D6E9200E310D1 /* VisualFormat.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D3D5BAB233D6E9200E310D1 /* VisualFormat.swift */; }; + 6D3D5BAE233E84A400E310D1 /* FormView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D3D5BAD233E84A400E310D1 /* FormView.swift */; }; + 6D3D5BB6233E857300E310D1 /* InvestPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D3D5BB0233E857300E310D1 /* InvestPresenter.swift */; }; + 6D3D5BB7233E857300E310D1 /* InvestWorker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D3D5BB1233E857300E310D1 /* InvestWorker.swift */; }; + 6D3D5BB8233E857300E310D1 /* InvestRouter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D3D5BB2233E857300E310D1 /* InvestRouter.swift */; }; + 6D3D5BB9233E857300E310D1 /* InvestModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D3D5BB3233E857300E310D1 /* InvestModels.swift */; }; + 6D3D5BBA233E857300E310D1 /* InvestViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D3D5BB4233E857300E310D1 /* InvestViewController.swift */; }; + 6D3D5BBB233E857300E310D1 /* InvestInteractor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D3D5BB5233E857300E310D1 /* InvestInteractor.swift */; }; + 6D3D5BBD233E8E6400E310D1 /* InvestView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D3D5BBC233E8E6300E310D1 /* InvestView.swift */; }; + 6D3D5BBF233E8F8A00E310D1 /* CustomColors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D3D5BBE233E8F8A00E310D1 /* CustomColors.swift */; }; + 6D3D5BC8233EB16200E310D1 /* ViewInfoObj.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D3D5BC7233EB16200E310D1 /* ViewInfoObj.swift */; }; + 6D3D5BCA233ECFA200E310D1 /* ViewInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D3D5BC9233ECFA200E310D1 /* ViewInfo.swift */; }; + 6D3D5BCC233ECFB600E310D1 /* InvestViewInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D3D5BCB233ECFB600E310D1 /* InvestViewInfo.swift */; }; + 6D3D5BCE233FC49300E310D1 /* MessageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D3D5BCD233FC49300E310D1 /* MessageView.swift */; }; + 6D3D5BD6233FCF8300E310D1 /* HeaderTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D3D5BD5233FCF8300E310D1 /* HeaderTableViewCell.swift */; }; + 6D3D5BD8233FCFAF00E310D1 /* RiskTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D3D5BD7233FCFAF00E310D1 /* RiskTableViewCell.swift */; }; + 6D3D5BDA233FCFC500E310D1 /* ReturnTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D3D5BD9233FCFC500E310D1 /* ReturnTableViewCell.swift */; }; + 6D3D5BDC233FD02500E310D1 /* InvestInfoTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D3D5BDB233FD02500E310D1 /* InvestInfoTableViewCell.swift */; }; + 6D3D5BDE233FD03400E310D1 /* InvestMoreInfoTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D3D5BDD233FD03400E310D1 /* InvestMoreInfoTableViewCell.swift */; }; + 6D3D5BE0233FED8500E310D1 /* ImageExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D3D5BDF233FED8500E310D1 /* ImageExtension.swift */; }; + 6D3D5BE2233FEFB200E310D1 /* ReturnView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D3D5BE1233FEFB200E310D1 /* ReturnView.swift */; }; + 6D3D5BE4233FF3B700E310D1 /* InvestBtnTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D3D5BE3233FF3B700E310D1 /* InvestBtnTableViewCell.swift */; }; + 6D3D5BE623401D0200E310D1 /* DoubleExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D3D5BE523401D0200E310D1 /* DoubleExtension.swift */; }; + 6D3D5BEE234047C300E310D1 /* MessagePresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D3D5BE8234047C300E310D1 /* MessagePresenter.swift */; }; + 6D3D5BEF234047C300E310D1 /* MessageWorker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D3D5BE9234047C300E310D1 /* MessageWorker.swift */; }; + 6D3D5BF0234047C300E310D1 /* MessageRouter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D3D5BEA234047C300E310D1 /* MessageRouter.swift */; }; + 6D3D5BF1234047C300E310D1 /* MessageModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D3D5BEB234047C300E310D1 /* MessageModels.swift */; }; + 6D3D5BF2234047C300E310D1 /* MessageViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D3D5BEC234047C300E310D1 /* MessageViewController.swift */; }; + 6D3D5BF3234047C300E310D1 /* MessageInteractor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D3D5BED234047C300E310D1 /* MessageInteractor.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 6D3D5B37233D497000E310D1 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 6D3D5B15233D496F00E310D1 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 6D3D5B1C233D496F00E310D1; + remoteInfo = LuizProcessoTesteSantader; + }; + 6D3D5B42233D497000E310D1 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 6D3D5B15233D496F00E310D1 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 6D3D5B1C233D496F00E310D1; + remoteInfo = LuizProcessoTesteSantader; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 6D3D5B1D233D496F00E310D1 /* LuizProcessoTesteSantader.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = LuizProcessoTesteSantader.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 6D3D5B20233D496F00E310D1 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 6D3D5B2A233D496F00E310D1 /* LuizProcessoTesteSantader.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = LuizProcessoTesteSantader.xcdatamodel; sourceTree = ""; }; + 6D3D5B2C233D496F00E310D1 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 6D3D5B2F233D496F00E310D1 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 6D3D5B31233D496F00E310D1 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 6D3D5B36233D497000E310D1 /* LuizProcessoTesteSantaderTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = LuizProcessoTesteSantaderTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 6D3D5B3A233D497000E310D1 /* LuizProcessoTesteSantaderTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LuizProcessoTesteSantaderTests.swift; sourceTree = ""; }; + 6D3D5B3C233D497000E310D1 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 6D3D5B41233D497000E310D1 /* LuizProcessoTesteSantaderUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = LuizProcessoTesteSantaderUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 6D3D5B45233D497000E310D1 /* LuizProcessoTesteSantaderUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LuizProcessoTesteSantaderUITests.swift; sourceTree = ""; }; + 6D3D5B47233D497000E310D1 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 6D3D5B54233D498C00E310D1 /* FormPresenter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FormPresenter.swift; sourceTree = ""; }; + 6D3D5B55233D498C00E310D1 /* FormWorker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FormWorker.swift; sourceTree = ""; }; + 6D3D5B56233D498C00E310D1 /* FormRouter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FormRouter.swift; sourceTree = ""; }; + 6D3D5B57233D498C00E310D1 /* FormModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FormModels.swift; sourceTree = ""; }; + 6D3D5B58233D498C00E310D1 /* FormViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FormViewController.swift; sourceTree = ""; }; + 6D3D5B59233D498C00E310D1 /* FormInteractor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FormInteractor.swift; sourceTree = ""; }; + 6D3D5BA2233D6E4D00E310D1 /* TxtFieldTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TxtFieldTableViewCell.swift; sourceTree = ""; }; + 6D3D5BA7233D6E7700E310D1 /* SendTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SendTableViewCell.swift; sourceTree = ""; }; + 6D3D5BAB233D6E9200E310D1 /* VisualFormat.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VisualFormat.swift; sourceTree = ""; }; + 6D3D5BAD233E84A400E310D1 /* FormView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FormView.swift; sourceTree = ""; }; + 6D3D5BB0233E857300E310D1 /* InvestPresenter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InvestPresenter.swift; sourceTree = ""; }; + 6D3D5BB1233E857300E310D1 /* InvestWorker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InvestWorker.swift; sourceTree = ""; }; + 6D3D5BB2233E857300E310D1 /* InvestRouter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InvestRouter.swift; sourceTree = ""; }; + 6D3D5BB3233E857300E310D1 /* InvestModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InvestModels.swift; sourceTree = ""; }; + 6D3D5BB4233E857300E310D1 /* InvestViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InvestViewController.swift; sourceTree = ""; }; + 6D3D5BB5233E857300E310D1 /* InvestInteractor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InvestInteractor.swift; sourceTree = ""; }; + 6D3D5BBC233E8E6300E310D1 /* InvestView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InvestView.swift; sourceTree = ""; }; + 6D3D5BBE233E8F8A00E310D1 /* CustomColors.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomColors.swift; sourceTree = ""; }; + 6D3D5BC7233EB16200E310D1 /* ViewInfoObj.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewInfoObj.swift; sourceTree = ""; }; + 6D3D5BC9233ECFA200E310D1 /* ViewInfo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ViewInfo.swift; sourceTree = ""; }; + 6D3D5BCB233ECFB600E310D1 /* InvestViewInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InvestViewInfo.swift; sourceTree = ""; }; + 6D3D5BCD233FC49300E310D1 /* MessageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageView.swift; sourceTree = ""; }; + 6D3D5BD5233FCF8300E310D1 /* HeaderTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HeaderTableViewCell.swift; sourceTree = ""; }; + 6D3D5BD7233FCFAF00E310D1 /* RiskTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RiskTableViewCell.swift; sourceTree = ""; }; + 6D3D5BD9233FCFC500E310D1 /* ReturnTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReturnTableViewCell.swift; sourceTree = ""; }; + 6D3D5BDB233FD02500E310D1 /* InvestInfoTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InvestInfoTableViewCell.swift; sourceTree = ""; }; + 6D3D5BDD233FD03400E310D1 /* InvestMoreInfoTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InvestMoreInfoTableViewCell.swift; sourceTree = ""; }; + 6D3D5BDF233FED8500E310D1 /* ImageExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImageExtension.swift; sourceTree = ""; }; + 6D3D5BE1233FEFB200E310D1 /* ReturnView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReturnView.swift; sourceTree = ""; }; + 6D3D5BE3233FF3B700E310D1 /* InvestBtnTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InvestBtnTableViewCell.swift; sourceTree = ""; }; + 6D3D5BE523401D0200E310D1 /* DoubleExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DoubleExtension.swift; sourceTree = ""; }; + 6D3D5BE8234047C300E310D1 /* MessagePresenter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessagePresenter.swift; sourceTree = ""; }; + 6D3D5BE9234047C300E310D1 /* MessageWorker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageWorker.swift; sourceTree = ""; }; + 6D3D5BEA234047C300E310D1 /* MessageRouter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageRouter.swift; sourceTree = ""; }; + 6D3D5BEB234047C300E310D1 /* MessageModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageModels.swift; sourceTree = ""; }; + 6D3D5BEC234047C300E310D1 /* MessageViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageViewController.swift; sourceTree = ""; }; + 6D3D5BED234047C300E310D1 /* MessageInteractor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageInteractor.swift; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 6D3D5B1A233D496F00E310D1 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 6D3D5B33233D497000E310D1 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 6D3D5B3E233D497000E310D1 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 6D3D5B14233D496F00E310D1 = { + isa = PBXGroup; + children = ( + 6D3D5B1F233D496F00E310D1 /* LuizProcessoTesteSantader */, + 6D3D5B39233D497000E310D1 /* LuizProcessoTesteSantaderTests */, + 6D3D5B44233D497000E310D1 /* LuizProcessoTesteSantaderUITests */, + 6D3D5B1E233D496F00E310D1 /* Products */, + ); + sourceTree = ""; + }; + 6D3D5B1E233D496F00E310D1 /* Products */ = { + isa = PBXGroup; + children = ( + 6D3D5B1D233D496F00E310D1 /* LuizProcessoTesteSantader.app */, + 6D3D5B36233D497000E310D1 /* LuizProcessoTesteSantaderTests.xctest */, + 6D3D5B41233D497000E310D1 /* LuizProcessoTesteSantaderUITests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 6D3D5B1F233D496F00E310D1 /* LuizProcessoTesteSantader */ = { + isa = PBXGroup; + children = ( + 6D3D5BC0233EA6B000E310D1 /* Models */, + 6D3D5BA1233D6E1D00E310D1 /* CustomExtensions */, + 6D3D5BA0233D6E1400E310D1 /* CustomCells */, + 6D3D5BAF233E84AE00E310D1 /* Views */, + 6D3D5B53233D497600E310D1 /* Formulario */, + 6D3D5B9F233D577D00E310D1 /* Investimento */, + 6D3D5BE72340479C00E310D1 /* Menssagem */, + 6D3D5B20233D496F00E310D1 /* AppDelegate.swift */, + 6D3D5B2C233D496F00E310D1 /* Assets.xcassets */, + 6D3D5B2E233D496F00E310D1 /* LaunchScreen.storyboard */, + 6D3D5B31233D496F00E310D1 /* Info.plist */, + 6D3D5B29233D496F00E310D1 /* LuizProcessoTesteSantader.xcdatamodeld */, + ); + path = LuizProcessoTesteSantader; + sourceTree = ""; + }; + 6D3D5B39233D497000E310D1 /* LuizProcessoTesteSantaderTests */ = { + isa = PBXGroup; + children = ( + 6D3D5B3A233D497000E310D1 /* LuizProcessoTesteSantaderTests.swift */, + 6D3D5B3C233D497000E310D1 /* Info.plist */, + ); + path = LuizProcessoTesteSantaderTests; + sourceTree = ""; + }; + 6D3D5B44233D497000E310D1 /* LuizProcessoTesteSantaderUITests */ = { + isa = PBXGroup; + children = ( + 6D3D5B45233D497000E310D1 /* LuizProcessoTesteSantaderUITests.swift */, + 6D3D5B47233D497000E310D1 /* Info.plist */, + ); + path = LuizProcessoTesteSantaderUITests; + sourceTree = ""; + }; + 6D3D5B53233D497600E310D1 /* Formulario */ = { + isa = PBXGroup; + children = ( + 6D3D5B54233D498C00E310D1 /* FormPresenter.swift */, + 6D3D5B55233D498C00E310D1 /* FormWorker.swift */, + 6D3D5B56233D498C00E310D1 /* FormRouter.swift */, + 6D3D5B57233D498C00E310D1 /* FormModels.swift */, + 6D3D5B58233D498C00E310D1 /* FormViewController.swift */, + 6D3D5B59233D498C00E310D1 /* FormInteractor.swift */, + ); + path = Formulario; + sourceTree = ""; + }; + 6D3D5B9F233D577D00E310D1 /* Investimento */ = { + isa = PBXGroup; + children = ( + 6D3D5BB0233E857300E310D1 /* InvestPresenter.swift */, + 6D3D5BB1233E857300E310D1 /* InvestWorker.swift */, + 6D3D5BB2233E857300E310D1 /* InvestRouter.swift */, + 6D3D5BB3233E857300E310D1 /* InvestModels.swift */, + 6D3D5BB4233E857300E310D1 /* InvestViewController.swift */, + 6D3D5BB5233E857300E310D1 /* InvestInteractor.swift */, + ); + path = Investimento; + sourceTree = ""; + }; + 6D3D5BA0233D6E1400E310D1 /* CustomCells */ = { + isa = PBXGroup; + children = ( + 6D3D5BE1233FEFB200E310D1 /* ReturnView.swift */, + 6D3D5BCF233FCEDD00E310D1 /* form */, + 6D3D5BD0233FCEEE00E310D1 /* invest */, + ); + path = CustomCells; + sourceTree = ""; + }; + 6D3D5BA1233D6E1D00E310D1 /* CustomExtensions */ = { + isa = PBXGroup; + children = ( + 6D3D5BAB233D6E9200E310D1 /* VisualFormat.swift */, + 6D3D5BBE233E8F8A00E310D1 /* CustomColors.swift */, + 6D3D5BDF233FED8500E310D1 /* ImageExtension.swift */, + 6D3D5BE523401D0200E310D1 /* DoubleExtension.swift */, + ); + path = CustomExtensions; + sourceTree = ""; + }; + 6D3D5BAF233E84AE00E310D1 /* Views */ = { + isa = PBXGroup; + children = ( + 6D3D5BAD233E84A400E310D1 /* FormView.swift */, + 6D3D5BBC233E8E6300E310D1 /* InvestView.swift */, + 6D3D5BCD233FC49300E310D1 /* MessageView.swift */, + ); + path = Views; + sourceTree = ""; + }; + 6D3D5BC0233EA6B000E310D1 /* Models */ = { + isa = PBXGroup; + children = ( + 6D3D5BC9233ECFA200E310D1 /* ViewInfo.swift */, + 6D3D5BC7233EB16200E310D1 /* ViewInfoObj.swift */, + 6D3D5BCB233ECFB600E310D1 /* InvestViewInfo.swift */, + ); + path = Models; + sourceTree = ""; + }; + 6D3D5BCF233FCEDD00E310D1 /* form */ = { + isa = PBXGroup; + children = ( + 6D3D5BA7233D6E7700E310D1 /* SendTableViewCell.swift */, + 6D3D5BA2233D6E4D00E310D1 /* TxtFieldTableViewCell.swift */, + ); + path = form; + sourceTree = ""; + }; + 6D3D5BD0233FCEEE00E310D1 /* invest */ = { + isa = PBXGroup; + children = ( + 6D3D5BD5233FCF8300E310D1 /* HeaderTableViewCell.swift */, + 6D3D5BD7233FCFAF00E310D1 /* RiskTableViewCell.swift */, + 6D3D5BD9233FCFC500E310D1 /* ReturnTableViewCell.swift */, + 6D3D5BDB233FD02500E310D1 /* InvestInfoTableViewCell.swift */, + 6D3D5BDD233FD03400E310D1 /* InvestMoreInfoTableViewCell.swift */, + 6D3D5BE3233FF3B700E310D1 /* InvestBtnTableViewCell.swift */, + ); + path = invest; + sourceTree = ""; + }; + 6D3D5BE72340479C00E310D1 /* Menssagem */ = { + isa = PBXGroup; + children = ( + 6D3D5BE8234047C300E310D1 /* MessagePresenter.swift */, + 6D3D5BE9234047C300E310D1 /* MessageWorker.swift */, + 6D3D5BEA234047C300E310D1 /* MessageRouter.swift */, + 6D3D5BEB234047C300E310D1 /* MessageModels.swift */, + 6D3D5BEC234047C300E310D1 /* MessageViewController.swift */, + 6D3D5BED234047C300E310D1 /* MessageInteractor.swift */, + ); + path = Menssagem; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 6D3D5B1C233D496F00E310D1 /* LuizProcessoTesteSantader */ = { + isa = PBXNativeTarget; + buildConfigurationList = 6D3D5B4A233D497000E310D1 /* Build configuration list for PBXNativeTarget "LuizProcessoTesteSantader" */; + buildPhases = ( + 6D3D5B19233D496F00E310D1 /* Sources */, + 6D3D5B1A233D496F00E310D1 /* Frameworks */, + 6D3D5B1B233D496F00E310D1 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = LuizProcessoTesteSantader; + productName = LuizProcessoTesteSantader; + productReference = 6D3D5B1D233D496F00E310D1 /* LuizProcessoTesteSantader.app */; + productType = "com.apple.product-type.application"; + }; + 6D3D5B35233D497000E310D1 /* LuizProcessoTesteSantaderTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 6D3D5B4D233D497000E310D1 /* Build configuration list for PBXNativeTarget "LuizProcessoTesteSantaderTests" */; + buildPhases = ( + 6D3D5B32233D497000E310D1 /* Sources */, + 6D3D5B33233D497000E310D1 /* Frameworks */, + 6D3D5B34233D497000E310D1 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 6D3D5B38233D497000E310D1 /* PBXTargetDependency */, + ); + name = LuizProcessoTesteSantaderTests; + productName = LuizProcessoTesteSantaderTests; + productReference = 6D3D5B36233D497000E310D1 /* LuizProcessoTesteSantaderTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 6D3D5B40233D497000E310D1 /* LuizProcessoTesteSantaderUITests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 6D3D5B50233D497000E310D1 /* Build configuration list for PBXNativeTarget "LuizProcessoTesteSantaderUITests" */; + buildPhases = ( + 6D3D5B3D233D497000E310D1 /* Sources */, + 6D3D5B3E233D497000E310D1 /* Frameworks */, + 6D3D5B3F233D497000E310D1 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 6D3D5B43233D497000E310D1 /* PBXTargetDependency */, + ); + name = LuizProcessoTesteSantaderUITests; + productName = LuizProcessoTesteSantaderUITests; + productReference = 6D3D5B41233D497000E310D1 /* LuizProcessoTesteSantaderUITests.xctest */; + productType = "com.apple.product-type.bundle.ui-testing"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 6D3D5B15233D496F00E310D1 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 1100; + LastUpgradeCheck = 1100; + ORGANIZATIONNAME = "Luiz Otavio Processo"; + TargetAttributes = { + 6D3D5B1C233D496F00E310D1 = { + CreatedOnToolsVersion = 11.0; + }; + 6D3D5B35233D497000E310D1 = { + CreatedOnToolsVersion = 11.0; + TestTargetID = 6D3D5B1C233D496F00E310D1; + }; + 6D3D5B40233D497000E310D1 = { + CreatedOnToolsVersion = 11.0; + TestTargetID = 6D3D5B1C233D496F00E310D1; + }; + }; + }; + buildConfigurationList = 6D3D5B18233D496F00E310D1 /* Build configuration list for PBXProject "LuizProcessoTesteSantader" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 6D3D5B14233D496F00E310D1; + productRefGroup = 6D3D5B1E233D496F00E310D1 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 6D3D5B1C233D496F00E310D1 /* LuizProcessoTesteSantader */, + 6D3D5B35233D497000E310D1 /* LuizProcessoTesteSantaderTests */, + 6D3D5B40233D497000E310D1 /* LuizProcessoTesteSantaderUITests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 6D3D5B1B233D496F00E310D1 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 6D3D5B30233D496F00E310D1 /* LaunchScreen.storyboard in Resources */, + 6D3D5B2D233D496F00E310D1 /* Assets.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 6D3D5B34233D497000E310D1 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 6D3D5B3F233D497000E310D1 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 6D3D5B19233D496F00E310D1 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 6D3D5BAE233E84A400E310D1 /* FormView.swift in Sources */, + 6D3D5BBA233E857300E310D1 /* InvestViewController.swift in Sources */, + 6D3D5BCA233ECFA200E310D1 /* ViewInfo.swift in Sources */, + 6D3D5BE623401D0200E310D1 /* DoubleExtension.swift in Sources */, + 6D3D5BB6233E857300E310D1 /* InvestPresenter.swift in Sources */, + 6D3D5BDC233FD02500E310D1 /* InvestInfoTableViewCell.swift in Sources */, + 6D3D5BEF234047C300E310D1 /* MessageWorker.swift in Sources */, + 6D3D5B5E233D498C00E310D1 /* FormViewController.swift in Sources */, + 6D3D5BC8233EB16200E310D1 /* ViewInfoObj.swift in Sources */, + 6D3D5BF1234047C300E310D1 /* MessageModels.swift in Sources */, + 6D3D5B5A233D498C00E310D1 /* FormPresenter.swift in Sources */, + 6D3D5BB8233E857300E310D1 /* InvestRouter.swift in Sources */, + 6D3D5BBF233E8F8A00E310D1 /* CustomColors.swift in Sources */, + 6D3D5BDA233FCFC500E310D1 /* ReturnTableViewCell.swift in Sources */, + 6D3D5BF2234047C300E310D1 /* MessageViewController.swift in Sources */, + 6D3D5B5B233D498C00E310D1 /* FormWorker.swift in Sources */, + 6D3D5BA9233D6E7700E310D1 /* SendTableViewCell.swift in Sources */, + 6D3D5BE0233FED8500E310D1 /* ImageExtension.swift in Sources */, + 6D3D5BDE233FD03400E310D1 /* InvestMoreInfoTableViewCell.swift in Sources */, + 6D3D5BF3234047C300E310D1 /* MessageInteractor.swift in Sources */, + 6D3D5B5D233D498C00E310D1 /* FormModels.swift in Sources */, + 6D3D5BD8233FCFAF00E310D1 /* RiskTableViewCell.swift in Sources */, + 6D3D5BCE233FC49300E310D1 /* MessageView.swift in Sources */, + 6D3D5BBB233E857300E310D1 /* InvestInteractor.swift in Sources */, + 6D3D5BAC233D6E9200E310D1 /* VisualFormat.swift in Sources */, + 6D3D5BB7233E857300E310D1 /* InvestWorker.swift in Sources */, + 6D3D5BB9233E857300E310D1 /* InvestModels.swift in Sources */, + 6D3D5BF0234047C300E310D1 /* MessageRouter.swift in Sources */, + 6D3D5BCC233ECFB600E310D1 /* InvestViewInfo.swift in Sources */, + 6D3D5BEE234047C300E310D1 /* MessagePresenter.swift in Sources */, + 6D3D5BE4233FF3B700E310D1 /* InvestBtnTableViewCell.swift in Sources */, + 6D3D5B21233D496F00E310D1 /* AppDelegate.swift in Sources */, + 6D3D5B2B233D496F00E310D1 /* LuizProcessoTesteSantader.xcdatamodeld in Sources */, + 6D3D5BD6233FCF8300E310D1 /* HeaderTableViewCell.swift in Sources */, + 6D3D5BA4233D6E4D00E310D1 /* TxtFieldTableViewCell.swift in Sources */, + 6D3D5B5F233D498C00E310D1 /* FormInteractor.swift in Sources */, + 6D3D5B5C233D498C00E310D1 /* FormRouter.swift in Sources */, + 6D3D5BBD233E8E6400E310D1 /* InvestView.swift in Sources */, + 6D3D5BE2233FEFB200E310D1 /* ReturnView.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 6D3D5B32233D497000E310D1 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 6D3D5B3B233D497000E310D1 /* LuizProcessoTesteSantaderTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 6D3D5B3D233D497000E310D1 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 6D3D5B46233D497000E310D1 /* LuizProcessoTesteSantaderUITests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 6D3D5B38233D497000E310D1 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 6D3D5B1C233D496F00E310D1 /* LuizProcessoTesteSantader */; + targetProxy = 6D3D5B37233D497000E310D1 /* PBXContainerItemProxy */; + }; + 6D3D5B43233D497000E310D1 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 6D3D5B1C233D496F00E310D1 /* LuizProcessoTesteSantader */; + targetProxy = 6D3D5B42233D497000E310D1 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 6D3D5B2E233D496F00E310D1 /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 6D3D5B2F233D496F00E310D1 /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 6D3D5B48233D497000E310D1 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 6D3D5B49233D497000E310D1 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 6D3D5B4B233D497000E310D1 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = 98LD6VB48K; + INFOPLIST_FILE = LuizProcessoTesteSantader/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = LuizProcesso.LuizProcessoTesteSantader; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 1; + }; + name = Debug; + }; + 6D3D5B4C233D497000E310D1 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = 98LD6VB48K; + INFOPLIST_FILE = LuizProcessoTesteSantader/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = LuizProcesso.LuizProcessoTesteSantader; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 1; + }; + name = Release; + }; + 6D3D5B4E233D497000E310D1 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = 98LD6VB48K; + INFOPLIST_FILE = LuizProcessoTesteSantaderTests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = LuizProcesso.LuizProcessoTesteSantaderTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/LuizProcessoTesteSantader.app/LuizProcessoTesteSantader"; + }; + name = Debug; + }; + 6D3D5B4F233D497000E310D1 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = 98LD6VB48K; + INFOPLIST_FILE = LuizProcessoTesteSantaderTests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = LuizProcesso.LuizProcessoTesteSantaderTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/LuizProcessoTesteSantader.app/LuizProcessoTesteSantader"; + }; + name = Release; + }; + 6D3D5B51233D497000E310D1 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = 98LD6VB48K; + INFOPLIST_FILE = LuizProcessoTesteSantaderUITests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = LuizProcesso.LuizProcessoTesteSantaderUITests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_TARGET_NAME = LuizProcessoTesteSantader; + }; + name = Debug; + }; + 6D3D5B52233D497000E310D1 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = 98LD6VB48K; + INFOPLIST_FILE = LuizProcessoTesteSantaderUITests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = LuizProcesso.LuizProcessoTesteSantaderUITests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_TARGET_NAME = LuizProcessoTesteSantader; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 6D3D5B18233D496F00E310D1 /* Build configuration list for PBXProject "LuizProcessoTesteSantader" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 6D3D5B48233D497000E310D1 /* Debug */, + 6D3D5B49233D497000E310D1 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 6D3D5B4A233D497000E310D1 /* Build configuration list for PBXNativeTarget "LuizProcessoTesteSantader" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 6D3D5B4B233D497000E310D1 /* Debug */, + 6D3D5B4C233D497000E310D1 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 6D3D5B4D233D497000E310D1 /* Build configuration list for PBXNativeTarget "LuizProcessoTesteSantaderTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 6D3D5B4E233D497000E310D1 /* Debug */, + 6D3D5B4F233D497000E310D1 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 6D3D5B50233D497000E310D1 /* Build configuration list for PBXNativeTarget "LuizProcessoTesteSantaderUITests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 6D3D5B51233D497000E310D1 /* Debug */, + 6D3D5B52233D497000E310D1 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + +/* Begin XCVersionGroup section */ + 6D3D5B29233D496F00E310D1 /* LuizProcessoTesteSantader.xcdatamodeld */ = { + isa = XCVersionGroup; + children = ( + 6D3D5B2A233D496F00E310D1 /* LuizProcessoTesteSantader.xcdatamodel */, + ); + currentVersion = 6D3D5B2A233D496F00E310D1 /* LuizProcessoTesteSantader.xcdatamodel */; + path = LuizProcessoTesteSantader.xcdatamodeld; + sourceTree = ""; + versionGroupType = wrapper.xcdatamodel; + }; +/* End XCVersionGroup section */ + }; + rootObject = 6D3D5B15233D496F00E310D1 /* Project object */; +} diff --git a/LuizProcessoTesteSantader/LuizProcessoTesteSantader.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/LuizProcessoTesteSantader/LuizProcessoTesteSantader.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..05410e46 --- /dev/null +++ b/LuizProcessoTesteSantader/LuizProcessoTesteSantader.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/LuizProcessoTesteSantader/LuizProcessoTesteSantader.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/LuizProcessoTesteSantader/LuizProcessoTesteSantader.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/LuizProcessoTesteSantader/LuizProcessoTesteSantader.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/LuizProcessoTesteSantader/LuizProcessoTesteSantader.xcodeproj/project.xcworkspace/xcuserdata/luizprocesso.xcuserdatad/UserInterfaceState.xcuserstate b/LuizProcessoTesteSantader/LuizProcessoTesteSantader.xcodeproj/project.xcworkspace/xcuserdata/luizprocesso.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..1f067642376c832f71cae459755f5d1a7f3c19d9 GIT binary patch literal 104126 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%0Ait24sl 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 E3(b-@a{vGU literal 0 HcmV?d00001 diff --git a/LuizProcessoTesteSantader/LuizProcessoTesteSantader.xcodeproj/xcuserdata/luizprocesso.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/LuizProcessoTesteSantader/LuizProcessoTesteSantader.xcodeproj/xcuserdata/luizprocesso.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist new file mode 100644 index 00000000..58bb1733 --- /dev/null +++ b/LuizProcessoTesteSantader/LuizProcessoTesteSantader.xcodeproj/xcuserdata/luizprocesso.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -0,0 +1,6 @@ + + + diff --git a/LuizProcessoTesteSantader/LuizProcessoTesteSantader.xcodeproj/xcuserdata/luizprocesso.xcuserdatad/xcschemes/xcschememanagement.plist b/LuizProcessoTesteSantader/LuizProcessoTesteSantader.xcodeproj/xcuserdata/luizprocesso.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 00000000..e906d74a --- /dev/null +++ b/LuizProcessoTesteSantader/LuizProcessoTesteSantader.xcodeproj/xcuserdata/luizprocesso.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,14 @@ + + + + + SchemeUserState + + LuizProcessoTesteSantader.xcscheme_^#shared#^_ + + orderHint + 0 + + + + diff --git a/LuizProcessoTesteSantader/LuizProcessoTesteSantader/AppDelegate.swift b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/AppDelegate.swift new file mode 100644 index 00000000..e88a4ac1 --- /dev/null +++ b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/AppDelegate.swift @@ -0,0 +1,34 @@ +// +// AppDelegate.swift +// LuizProcessoTesteSantader +// +// Created by Luiz Otavio Processo on 26/09/19. +// Copyright © 2019 Luiz Otavio Processo. All rights reserved. +// + +import UIKit +import CoreData + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + + var window: UIWindow? + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { + + self.window = UIWindow(frame: UIScreen.main.bounds) + if let window = self.window { + window.backgroundColor = .white + let mainView = FormViewController() +// let mainView = InvestViewController() + let navigation = UINavigationController(rootViewController: mainView) +// navigation.title = "Contato" +// navigation.viewControllers = [mainView] + window.rootViewController = navigation + window.makeKeyAndVisible() + } + return true + } + +} + diff --git a/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Assets.xcassets/AppIcon.appiconset/Contents.json b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..d8db8d65 --- /dev/null +++ b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,98 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "3x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "83.5x83.5", + "scale" : "2x" + }, + { + "idiom" : "ios-marketing", + "size" : "1024x1024", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Assets.xcassets/Contents.json b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Assets.xcassets/Contents.json new file mode 100644 index 00000000..da4a164c --- /dev/null +++ b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Assets.xcassets/Shape.imageset/Contents.json b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Assets.xcassets/Shape.imageset/Contents.json new file mode 100644 index 00000000..24d67427 --- /dev/null +++ b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Assets.xcassets/Shape.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Shape.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Assets.xcassets/Shape.imageset/Shape.png b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Assets.xcassets/Shape.imageset/Shape.png new file mode 100644 index 0000000000000000000000000000000000000000..1219c0fad9272316b80181fb4c561a1430ab6d8e GIT binary patch literal 348 zcmV-i0i*tjP)Px$7D+@wR2Ug!Y-niUVEFqzsG+%Y83O^ZYSk*{YnRVPGB9&4WBT{|hxgyV3`^^( zDyRJa|DO?;-kCFJvR=7(ZY5CdB8K0;Ex-zEt1HVG{{QP_U}T)f%*v4pbj3ep113$H z#Qyr_vo#F=|9dhsFeEj!buI$Z3=D@3A317oXZsc?QT6}tA5|x3*G&fw8~|$u8p8GU z|Z~<-vZ>DGcq!SHnnzc z25ABT6pbK(y6TE(pu&YfXYXYE&mjDt;lCa;6JtO_OUEvdJPcrH1W5oj2Lm-P2RiL1 u6T^S+hSttQFbxFhhMEeO+S&?JTnYh-z;tXT!tQSX0000Px#;Ymb6R2Ug!U_b+RIXUHSGcsPf!^0znCdI&nF2MNvxBPzw23_W#Kc&#+FchOJ zK<3j>@f}uHW1xo)+-7H2Mz#{hzRk*Nbc>Pk;B8J$873B1)@MKoh5x^P9lXoVt_D*C zqCpB7{`}bkWD4-|@x5nK`1b8N69e*D-6lvDz8S%4CMf$Ymbg)TCmKfeVlLM9$?aY+K*cMXXD1O0LC tF(020vOESG6mz$km=-_e=NCkm1OUybNP71&-K_us002ovPDHLkV1nPjdaD2c literal 0 HcmV?d00001 diff --git a/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Assets.xcassets/downLine.imageset/Contents.json b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Assets.xcassets/downLine.imageset/Contents.json new file mode 100644 index 00000000..32ab5cb1 --- /dev/null +++ b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Assets.xcassets/downLine.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "downLine.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Assets.xcassets/downLine.imageset/downLine.png b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Assets.xcassets/downLine.imageset/downLine.png new file mode 100644 index 0000000000000000000000000000000000000000..79d328599ebe3eac5f5f50382ad19036d174123c GIT binary patch literal 110 zcmeAS@N?(olHy`uVBq!ia0vp@K+MF!1|*yJhOGorjKx9jP7LeL$-D$|G(24#LpWrU z_Z&U+=+uYz^NpA%HgtBrGgTe~ HDWM4fTC*dm literal 0 HcmV?d00001 diff --git a/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Base.lproj/LaunchScreen.storyboard b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 00000000..865e9329 --- /dev/null +++ b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/LuizProcessoTesteSantader/LuizProcessoTesteSantader/CustomCells/ReturnView.swift b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/CustomCells/ReturnView.swift new file mode 100644 index 00000000..d183bcf4 --- /dev/null +++ b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/CustomCells/ReturnView.swift @@ -0,0 +1,62 @@ +// +// ReturnView.swift +// LuizProcessoTesteSantader +// +// Created by Luiz Otavio Processo on 28/09/19. +// Copyright © 2019 Luiz Otavio Processo. All rights reserved. +// + +import Foundation +import UIKit + +class ReturnView:UIView{ + + var intervalo = UILabel() + var fundReturn = UILabel() + var cdiReturn = UILabel() + + + override init(frame: CGRect) { + super.init(frame:frame) + setElementsLayout() + setUpView() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + func setUpView(){ + + let viewWidth = self.frame.size.width + let viewHeight = self.frame.size.height + + self.addSubview(intervalo) + self.addSubview(fundReturn) + self.addSubview(cdiReturn) + + self.setUpContraint(pattern: "H:|-10-[v0(\(viewWidth/2))]-50-[v1(\(viewWidth/5))][v2(\(viewWidth/6))]-10-|", views: intervalo,fundReturn,cdiReturn) + self.setUpContraint(pattern: "V:|[v0(\(viewHeight*2))]", views: intervalo) + self.setUpContraint(pattern: "V:|[v0(\(viewHeight*2))]", views: fundReturn) + self.setUpContraint(pattern: "V:|[v0(\(viewHeight*2))]", views: cdiReturn) + + + } + + func setElementsLayout(){ + + intervalo.textAlignment = .left + intervalo.textColor = .darkGray + intervalo.font = UIFont(name: "HelveticaNeue-Thin", size: 12) + + fundReturn.textAlignment = .right + fundReturn.textColor = .darkGray + fundReturn.font = UIFont(name: "HelveticaNeue-Bold", size: 12) + + cdiReturn.textAlignment = .right + cdiReturn.textColor = .darkGray + cdiReturn.font = UIFont(name: "HelveticaNeue-Bold", size: 12) + + } + +} diff --git a/LuizProcessoTesteSantader/LuizProcessoTesteSantader/CustomCells/form/SendTableViewCell.swift b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/CustomCells/form/SendTableViewCell.swift new file mode 100644 index 00000000..0a0bb346 --- /dev/null +++ b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/CustomCells/form/SendTableViewCell.swift @@ -0,0 +1,74 @@ +// +// SendTableViewCell.swift +// LuizProcessoTesteSantader +// +// Created by Luiz Otavio Processo on 26/09/19. +// Copyright © 2019 Luiz Otavio Processo. All rights reserved. +// + +import UIKit + +class SendTableViewCell: UITableViewCell { + + static let identifier = "SendTableViewCell" + var checkBox = UIButton() + var sendBtn = UIButton() + var label = UILabel() + var innerView = UIView() + + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { + super.init(style: style, reuseIdentifier: reuseIdentifier) + setElementsLayout() + setUpView() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + func setElementsLayout(){ + + checkBox.backgroundColor = .clear + checkBox.layer.cornerRadius = 5.0 + checkBox.layer.borderWidth = 1.0 + checkBox.layer.borderColor = UIColor.gray.cgColor + checkBox.addTarget(self, action: #selector(selectedBox), for: .touchUpInside) + + sendBtn.backgroundColor = .appRed + sendBtn.layer.cornerRadius = 20.0 + + innerView.backgroundColor = .clear + } + + func setUpView(){ + + let cellWidth = contentView.frame.width + let cellHeigt = contentView.frame.height + + innerView.addSubview(checkBox) + innerView.addSubview(label) + + self.contentView.addSubview(innerView) + self.contentView.addSubview(sendBtn) + + sendBtn.centerXAnchor.constraint(equalTo: self.contentView.centerXAnchor).isActive = true + innerView.centerXAnchor.constraint(equalTo: self.contentView.centerXAnchor).isActive = true + + innerView.setUpContraint(pattern: "H:[v0(\(cellWidth/16))]-5-[v1(\(cellWidth/1.2))]", views: checkBox,label) + innerView.setUpContraint(pattern: "V:|-3-[v0(\(cellHeigt/2.5))]", views: checkBox) + innerView.setUpContraint(pattern: "V:|-5-[v0(\(cellHeigt/3))]", views: label) + + self.contentView.setUpContraint(pattern: "V:|-30-[v0(\(cellHeigt/2))]-25-[v1(\(cellHeigt))]", views: innerView, sendBtn) + self.contentView.setUpContraint(pattern: "H:[v0(\(cellWidth))]", views: innerView) + self.contentView.setUpContraint(pattern: "H:[v0(\(cellWidth/1.2))]", views: sendBtn) + } + + @objc func selectedBox(){ + + if(checkBox.backgroundColor == .appRed){ + checkBox.backgroundColor = .clear + }else{ + checkBox.backgroundColor = .appRed + } + } +} diff --git a/LuizProcessoTesteSantader/LuizProcessoTesteSantader/CustomCells/form/TxtFieldTableViewCell.swift b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/CustomCells/form/TxtFieldTableViewCell.swift new file mode 100644 index 00000000..b4b781a4 --- /dev/null +++ b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/CustomCells/form/TxtFieldTableViewCell.swift @@ -0,0 +1,51 @@ +// +// TxtFieldTableViewCell.swift +// LuizProcessoTesteSantader +// +// Created by Luiz Otavio Processo on 26/09/19. +// Copyright © 2019 Luiz Otavio Processo. All rights reserved. +// + +import UIKit + +class TxtFieldTableViewCell: UITableViewCell { + + static let identifier = "TxtFieldTableViewCell" + var txtField = UITextField() + + + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { + super.init(style: style, reuseIdentifier: reuseIdentifier) + setUpView() + setElementsLayout() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + func setUpView(){ + + let cellWidth = self.contentView.frame.size.width + let cellHeight = self.contentView.frame.size.height + +// let centerX = self.contentView.centerXAnchor. + + contentView.addSubview(txtField) + + txtField.centerXAnchor.constraint(equalTo: self.contentView.centerXAnchor).isActive = true + + contentView.setUpContraint(pattern: "H:[v0(\(cellWidth))]", views: txtField) + contentView.setUpContraint(pattern: "V:|-\(cellHeight/2)-[v0(\(cellHeight))]", views: txtField) + + + } + + func setElementsLayout(){ + let bottomBorder = CALayer() + bottomBorder.backgroundColor = UIColor.gray.cgColor + bottomBorder.frame = CGRect(x: 0, y: txtField.center.y+self.contentView.frame.height, width: self.contentView.frame.width, height: 1) + txtField.layer.addSublayer(bottomBorder) + + } +} diff --git a/LuizProcessoTesteSantader/LuizProcessoTesteSantader/CustomCells/invest/HeaderTableViewCell.swift b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/CustomCells/invest/HeaderTableViewCell.swift new file mode 100644 index 00000000..a591237b --- /dev/null +++ b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/CustomCells/invest/HeaderTableViewCell.swift @@ -0,0 +1,60 @@ +// +// HeaderTableViewCell.swift +// LuizProcessoTesteSantader +// +// Created by Luiz Otavio Processo on 28/09/19. +// Copyright © 2019 Luiz Otavio Processo. All rights reserved. +// + +import UIKit + +class HeaderTableViewCell: UITableViewCell { + + static let identifier = "HeaderTableViewCell" + + var upperTitle = UILabel() + var title = UILabel() + + + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { + super.init(style: style, reuseIdentifier: reuseIdentifier) + setElementsLayout() + setUpView() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + func setUpView(){ + + let cellWidth = self.contentView.frame.size.width + let cellHeight = self.contentView.frame.size.height + + self.contentView.addSubview(upperTitle) + self.contentView.addSubview(title) + + upperTitle.centerXAnchor.constraint(equalTo: self.contentView.centerXAnchor).isActive = true + title.centerXAnchor.constraint(equalTo: self.contentView.centerXAnchor).isActive = true + + self.contentView.setUpContraint(pattern: "V:|[v0(\(cellHeight))][v1(\(cellHeight*1.5))]", views: upperTitle,title) + self.contentView.setUpContraint(pattern: "H:[v0(\(cellWidth))]", views: upperTitle) + self.contentView.setUpContraint(pattern: "H:[v0(\(cellWidth))]", views: title) + + } + + func setElementsLayout(){ + + upperTitle.textAlignment = .center + upperTitle.textColor = .darkGray + upperTitle.font = UIFont(name: "HelveticaNeue-Light", size: 15) + + title.textAlignment = .center + title.numberOfLines = 2 + title.textColor = .darkGray + title.font = UIFont(name: "HelveticaNeue-Medium", size: 25) + + } + + +} diff --git a/LuizProcessoTesteSantader/LuizProcessoTesteSantader/CustomCells/invest/InvestBtnTableViewCell.swift b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/CustomCells/invest/InvestBtnTableViewCell.swift new file mode 100644 index 00000000..ecfe6447 --- /dev/null +++ b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/CustomCells/invest/InvestBtnTableViewCell.swift @@ -0,0 +1,45 @@ +// +// InvestBtnTableViewCell.swift +// LuizProcessoTesteSantader +// +// Created by Luiz Otavio Processo on 28/09/19. +// Copyright © 2019 Luiz Otavio Processo. All rights reserved. +// + +import UIKit + +class InvestBtnTableViewCell: UITableViewCell { + + static let identifier = "InvestBtnTableViewCell" + var btn = UIButton() + + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { + super.init(style: style, reuseIdentifier: reuseIdentifier) + setElementsLayout() + setUpView() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + func setUpView(){ + + let cellWidth = contentView.frame.width + let cellHeigt = contentView.frame.height + + self.contentView.addSubview(btn) + + self.contentView.setUpContraint(pattern: "V:|-30-[v0(\(cellHeigt))]", views: btn) + self.contentView.setUpContraint(pattern: "H:|-50-[v0(\(cellWidth/1.2))]", views: btn) + + } + + func setElementsLayout(){ + + btn.backgroundColor = .appRed + btn.layer.cornerRadius = 20.0 + btn.setTitle("Investir", for: .normal) + } + +} diff --git a/LuizProcessoTesteSantader/LuizProcessoTesteSantader/CustomCells/invest/InvestInfoTableViewCell.swift b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/CustomCells/invest/InvestInfoTableViewCell.swift new file mode 100644 index 00000000..8d233825 --- /dev/null +++ b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/CustomCells/invest/InvestInfoTableViewCell.swift @@ -0,0 +1,55 @@ +// +// InvestInfoTableViewCell.swift +// LuizProcessoTesteSantader +// +// Created by Luiz Otavio Processo on 28/09/19. +// Copyright © 2019 Luiz Otavio Processo. All rights reserved. +// + +import UIKit + +class InvestInfoTableViewCell: UITableViewCell { + + + static let identifier = "InvestInfoTableViewCell" + + var title = UILabel() + var infoDettail = UILabel() + + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { + super.init(style: style, reuseIdentifier: reuseIdentifier) + setElementsLayout() + setUpView() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + func setUpView(){ + + let cellWidth = self.contentView.frame.size.width + let cellHeight = self.contentView.frame.size.height + + contentView.addSubview(title) + contentView.addSubview(infoDettail) + + contentView.setUpContraint(pattern: "H:|-10-[v0(\(cellWidth/2))][v1(\(cellWidth/4))]-10-|", views: title, infoDettail) + contentView.setUpContraint(pattern: "V:|[v0(\(20))]", views: title) + contentView.setUpContraint(pattern: "V:|[v0(\(20))]", views: infoDettail) + + + } + func setElementsLayout(){ + + title.textAlignment = .left + title.textColor = .darkGray + title.font = UIFont(name: "HelveticaNeue-Thin", size: 12) + + infoDettail.textAlignment = .right + infoDettail.textColor = .darkGray + infoDettail.font = UIFont(name: "HelveticaNeue-Bold", size: 12) + + } + +} diff --git a/LuizProcessoTesteSantader/LuizProcessoTesteSantader/CustomCells/invest/InvestMoreInfoTableViewCell.swift b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/CustomCells/invest/InvestMoreInfoTableViewCell.swift new file mode 100644 index 00000000..34b9e068 --- /dev/null +++ b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/CustomCells/invest/InvestMoreInfoTableViewCell.swift @@ -0,0 +1,57 @@ +// +// InvestMoreInfoTableViewCell.swift +// LuizProcessoTesteSantader +// +// Created by Luiz Otavio Processo on 28/09/19. +// Copyright © 2019 Luiz Otavio Processo. All rights reserved. +// + +import UIKit + +class InvestMoreInfoTableViewCell: UITableViewCell { + + static let identifier = "InvestMoreInfoTableViewCell" + + var title = UILabel() + var downLoadImg = UIButton() + + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { + super.init(style: style, reuseIdentifier: reuseIdentifier) + setElementsLayout() + setUpView() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + func setUpView(){ + + let cellWidth = self.contentView.frame.size.width + let cellHeight = self.contentView.frame.size.height + + contentView.addSubview(title) + contentView.addSubview(downLoadImg) + + contentView.setUpContraint(pattern: "H:|-10-[v0(\(cellWidth/2))][v1(\(cellWidth/4))]-10-|", views: title, downLoadImg) + contentView.setUpContraint(pattern: "V:|[v0(\(20))]", views: title) + contentView.setUpContraint(pattern: "V:|-5-[v0(\(20))]", views: downLoadImg) + + } + func setElementsLayout(){ + + title.textAlignment = .left + title.textColor = .darkGray + title.font = UIFont(name: "HelveticaNeue-Thin", size: 12) + + //downLoadImg.setBackgroundImage(UIImage(named: "downArrow"), for: .normal) + downLoadImg.titleEdgeInsets = UIEdgeInsets(top: 0, left: 30, bottom: 0, right: 0) + downLoadImg.titleLabel?.font = UIFont(name: "HelveticaNeue-Bold", size: 12) + downLoadImg.titleLabel?.textAlignment = .right + downLoadImg.setTitle("Baixar", for: .normal) + downLoadImg.setTitleColor(.appRed, for: .normal) + downLoadImg.contentMode = .scaleAspectFit + downLoadImg.backgroundColor = .clear + + } +} diff --git a/LuizProcessoTesteSantader/LuizProcessoTesteSantader/CustomCells/invest/ReturnTableViewCell.swift b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/CustomCells/invest/ReturnTableViewCell.swift new file mode 100644 index 00000000..22e6b023 --- /dev/null +++ b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/CustomCells/invest/ReturnTableViewCell.swift @@ -0,0 +1,99 @@ +// +// ReturnTableViewCell.swift +// LuizProcessoTesteSantader +// +// Created by Luiz Otavio Processo on 28/09/19. +// Copyright © 2019 Luiz Otavio Processo. All rights reserved. +// + +import UIKit + +class ReturnTableViewCell: UITableViewCell { + + static let identifier = "ReturnTableViewCell" + + var headerLbl = UILabel() + var fundLbl = UILabel() + var cdiLbl = UILabel() + + var innerView = UIView() + + var monthView:ReturnView? + var yearView:ReturnView? + var twelveView:ReturnView? + + var border = UIView() + + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { + super.init(style: style, reuseIdentifier: reuseIdentifier) + setElementsLayout() + setUpView() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + func setUpView(){ + + let cellWidth = self.contentView.frame.size.width + let cellHeight = self.contentView.frame.size.height + + self.contentView.addSubview(headerLbl) + self.contentView.addSubview(innerView) + self.contentView.addSubview(monthView!) + self.contentView.addSubview(yearView!) + self.contentView.addSubview(twelveView!) + self.contentView.addSubview(border) + + innerView.addSubview(fundLbl) + innerView.addSubview(cdiLbl) + + headerLbl.centerXAnchor.constraint(equalTo: self.contentView.centerXAnchor).isActive = true + innerView.trailingAnchor.constraint(equalTo: self.contentView.trailingAnchor, constant: -15).isActive = true + monthView!.centerXAnchor.constraint(equalTo: self.contentView.centerXAnchor).isActive = true + yearView!.centerXAnchor.constraint(equalTo: self.contentView.centerXAnchor).isActive = true + twelveView!.centerXAnchor.constraint(equalTo: self.contentView.centerXAnchor).isActive = true + border.centerXAnchor.constraint(equalTo: self.contentView.centerXAnchor).isActive = true + + print(cellWidth) + self.contentView.setUpContraint(pattern: "V:|-20-[v0(\(cellHeight/5))]-5-[v1(\(cellHeight))][v2(\(cellHeight/2))]-2-[v3(\(cellHeight/2))]-2-[v4(\(cellHeight/2))]-5-[v5(\(cellHeight/5))]", views: headerLbl,innerView,monthView!,yearView!,twelveView!,border) + self.contentView.setUpContraint(pattern: "H:[v0(\(cellWidth))]", views: headerLbl) + self.contentView.setUpContraint(pattern: "H:[v0(\(cellWidth*1.35))]", views: innerView) + self.contentView.setUpContraint(pattern: "H:[v0(\(cellWidth*1.17))]", views: monthView!) + self.contentView.setUpContraint(pattern: "H:[v0(\(cellWidth*1.17))]", views: yearView!) + self.contentView.setUpContraint(pattern: "H:[v0(\(cellWidth*1.17))]", views: twelveView!) + self.contentView.setUpContraint(pattern: "H:[v0(\(cellWidth))]", views: border) + + innerView.setUpContraint(pattern: "H:[v0(\(cellWidth/6))]-10-[v1(\(cellWidth/6))]|", views: fundLbl,cdiLbl) + innerView.setUpContraint(pattern: "V:|[v0(\(cellHeight))]", views: fundLbl) + innerView.setUpContraint(pattern: "V:|[v0(\(cellHeight))]", views: cdiLbl) + + + } + + func setElementsLayout(){ + + monthView = ReturnView(frame: CGRect(x: 0, y: 0, width: self.contentView.frame.width, height: self.contentView.frame.height/6)) + yearView = ReturnView(frame: CGRect(x: 0, y: 0, width: self.contentView.frame.width, height: self.contentView.frame.height/6)) + twelveView = ReturnView(frame: CGRect(x: 0, y: 0, width: self.contentView.frame.width, height: self.contentView.frame.height/6)) + + headerLbl.textAlignment = .center + headerLbl.textColor = .darkGray + headerLbl.font = UIFont(name: "HelveticaNeue-Light", size: 18) + + cdiLbl.textAlignment = .right + cdiLbl.textColor = .darkGray + cdiLbl.font = UIFont(name: "HelveticaNeue-Thin", size: 12) + + fundLbl.textAlignment = .right + fundLbl.textColor = .darkGray + fundLbl.font = UIFont(name: "HelveticaNeue-Thin", size: 12) + + let bottomBorder = CALayer() + bottomBorder.backgroundColor = UIColor.lightGray.cgColor + bottomBorder.frame = CGRect(x: 0, y: 0, width: self.contentView.frame.width, height: 1) + border.layer.addSublayer(bottomBorder) + + } +} diff --git a/LuizProcessoTesteSantader/LuizProcessoTesteSantader/CustomCells/invest/RiskTableViewCell.swift b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/CustomCells/invest/RiskTableViewCell.swift new file mode 100644 index 00000000..721e4210 --- /dev/null +++ b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/CustomCells/invest/RiskTableViewCell.swift @@ -0,0 +1,118 @@ +// +// RiskTableViewCell.swift +// LuizProcessoTesteSantader +// +// Created by Luiz Otavio Processo on 28/09/19. +// Copyright © 2019 Luiz Otavio Processo. All rights reserved. +// + +import UIKit + +class RiskTableViewCell: UITableViewCell { + + + static let identifier = "RiskTableViewCell" + + var whatIs = UILabel() + var descript = UILabel() + var risk = UILabel() + + var arrowImgArray:[UIImageView] = [UIImageView(),UIImageView(),UIImageView(),UIImageView(),UIImageView()] + var colorImgArray:[UIImageView] = [UIImageView(),UIImageView(),UIImageView(),UIImageView(),UIImageView()] + + var arrowView = UIView() + var colorView = UIView() + + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { + super.init(style: style, reuseIdentifier: reuseIdentifier) + setImgArray() + setElementsLayout() + setUpView() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + func setUpView(){ + + let cellWidth = self.contentView.frame.size.width + let cellHeight = self.contentView.frame.size.height + + contentView.addSubview(whatIs) + contentView.addSubview(descript) + contentView.addSubview(risk) + contentView.addSubview(arrowView) + contentView.addSubview(colorView) + for i in 0 ..< arrowImgArray.count{ + arrowView.addSubview(arrowImgArray[i]) + colorView.addSubview(colorImgArray[i]) + } + + whatIs.centerXAnchor.constraint(equalTo: self.contentView.centerXAnchor).isActive = true + descript.centerXAnchor.constraint(equalTo: self.contentView.centerXAnchor).isActive = true + risk.centerXAnchor.constraint(equalTo: self.contentView.centerXAnchor).isActive = true + arrowView.centerXAnchor.constraint(equalTo: self.contentView.centerXAnchor).isActive = true + colorView.centerXAnchor.constraint(equalTo: self.contentView.centerXAnchor).isActive = true + + contentView.setUpContraint(pattern: "V:|-20-[v0(\(cellHeight/5))]-10-[v1(\(cellHeight*1.5))]-15-[v2(\(cellHeight/3))]-15-[v3(\(cellHeight/10))]-10-[v4(\(cellHeight/10))]", views: whatIs,descript,risk,arrowView,colorView) + contentView.setUpContraint(pattern: "H:[v0(\(cellWidth))]", views: whatIs) + contentView.setUpContraint(pattern: "H:[v0(\(cellWidth))]", views: descript) + contentView.setUpContraint(pattern: "H:[v0(\(cellWidth))]", views: risk) + contentView.setUpContraint(pattern: "H:[v0(\(cellWidth))]", views: arrowView) + contentView.setUpContraint(pattern: "H:[v0(\(cellWidth))]", views: colorView) + + arrowView.setUpContraint(pattern: "H:|[v0(\(cellWidth/5))][v1(\(cellWidth/5))][v2(\(cellWidth/5))][v3(\(cellWidth/5))][v4(\(cellWidth/5))]", views: arrowImgArray[0],arrowImgArray[1],arrowImgArray[2],arrowImgArray[3],arrowImgArray[4]) + arrowView.setUpContraint(pattern: "V:[v0(10)]", views: arrowImgArray[0]) + arrowView.setUpContraint(pattern: "V:[v0(10)]", views: arrowImgArray[1]) + arrowView.setUpContraint(pattern: "V:[v0(10)]", views: arrowImgArray[2]) + arrowView.setUpContraint(pattern: "V:[v0(10)]", views: arrowImgArray[3]) + arrowView.setUpContraint(pattern: "V:[v0(10)]", views: arrowImgArray[4]) + + + colorView.setUpContraint(pattern: "H:|[v0(\(cellWidth/5))][v1(\(cellWidth/5))][v2(\(cellWidth/5))][v3(\(cellWidth/5))][v4(\(cellWidth/5))]", views: colorImgArray[0],colorImgArray[1],colorImgArray[2],colorImgArray[3],colorImgArray[4]) + colorView.setUpContraint(pattern: "V:|-2-[v0(10)]", views: colorImgArray[0]) + colorView.setUpContraint(pattern: "V:|-2-[v0(10)]", views: colorImgArray[1]) + colorView.setUpContraint(pattern: "V:|-2-[v0(10)]", views: colorImgArray[2]) + colorView.setUpContraint(pattern: "V:|[v0(15)]", views: colorImgArray[3]) + colorView.setUpContraint(pattern: "V:|-2-[v0(10)]", views: colorImgArray[4]) + + } + + func setElementsLayout(){ + + whatIs.textAlignment = .center + whatIs.textColor = .darkGray + whatIs.font = UIFont(name: "HelveticaNeue-Light", size: 18) + + descript.textAlignment = .center + descript.textColor = .darkGray + descript.numberOfLines = 3 + descript.font = UIFont(name: "HelveticaNeue-Thin", size: 15) + + risk.textAlignment = .center + risk.textColor = .darkGray + risk.font = UIFont(name: "HelveticaNeue-Light", size: 18) + + let bottomBorder = CALayer() + bottomBorder.backgroundColor = UIColor.lightGray.cgColor + bottomBorder.frame = CGRect(x: 0, y: -20, width: self.contentView.frame.width, height: 1) + whatIs.layer.addSublayer(bottomBorder) + + + } + + func setImgArray(){ + for i in 0 ..< arrowImgArray.count{ + arrowImgArray[i].contentMode = .scaleAspectFit + colorImgArray[i].contentMode = .scaleAspectFit + } + arrowImgArray[3].image = UIImage(named: "Shape") + colorImgArray[0].backgroundColor = .appLightGreen + colorImgArray[1].backgroundColor = .appGreen + colorImgArray[2].backgroundColor = .appYellow + colorImgArray[3].backgroundColor = .appOrange + colorImgArray[4].backgroundColor = .appRiskRed + + } +} diff --git a/LuizProcessoTesteSantader/LuizProcessoTesteSantader/CustomExtensions/CustomColors.swift b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/CustomExtensions/CustomColors.swift new file mode 100644 index 00000000..d9cb64dd --- /dev/null +++ b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/CustomExtensions/CustomColors.swift @@ -0,0 +1,33 @@ +// +// CustomColors.swift +// LuizProcessoTesteSantader +// +// Created by Luiz Otavio Processo on 27/09/19. +// Copyright © 2019 Luiz Otavio Processo. All rights reserved. +// + +import Foundation +import UIKit + +extension UIColor{ + + static var appRed: UIColor { return UIColor.fromIntRGB(red: 218.0, green: 1.0, blue: 1.0) } + static var appDarkRed: UIColor { return UIColor.fromIntRGB(red: 150.0, green: 1.0, blue: 1.0) } + + static var appLightGreen: UIColor { return UIColor.fromIntRGB(red: 116.0, green: 218.0, blue: 97.0) } + static var appGreen: UIColor { return UIColor.fromIntRGB(red: 74.0, green: 193.0, blue: 108.0) } + static var appYellow: UIColor { return UIColor.fromIntRGB(red: 255.0 , green: 192.0, blue: 17.0) } + static var appOrange: UIColor { return UIColor.fromIntRGB(red: 255.0, green: 116.0, blue: 44.0) } + static var appRiskRed: UIColor { return UIColor.fromIntRGB(red: 255.0, green: 54.0, blue: 52.0) } + + static func fromIntRGB(red: CGFloat, green: CGFloat, blue: CGFloat) -> UIColor { + + let r = (red * 1) / 255.0 + let g = (green * 1) / 255.0 + let b = (blue * 1) / 255.0 + let a = CGFloat(1.0) + + return UIColor(red: r, green: g, blue: b, alpha: a) + + } +} diff --git a/LuizProcessoTesteSantader/LuizProcessoTesteSantader/CustomExtensions/DoubleExtension.swift b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/CustomExtensions/DoubleExtension.swift new file mode 100644 index 00000000..9c00e190 --- /dev/null +++ b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/CustomExtensions/DoubleExtension.swift @@ -0,0 +1,18 @@ +// +// DoubleExtension.swift +// LuizProcessoTesteSantader +// +// Created by Luiz Otavio Processo on 28/09/19. +// Copyright © 2019 Luiz Otavio Processo. All rights reserved. +// + +import Foundation + + +extension Double { + + var toString: String { + return NSNumber(value: self).stringValue + } + +} diff --git a/LuizProcessoTesteSantader/LuizProcessoTesteSantader/CustomExtensions/ImageExtension.swift b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/CustomExtensions/ImageExtension.swift new file mode 100644 index 00000000..ecde0eb0 --- /dev/null +++ b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/CustomExtensions/ImageExtension.swift @@ -0,0 +1,38 @@ +// +// ImageExtension.swift +// LuizProcessoTesteSantader +// +// Created by Luiz Otavio Processo on 28/09/19. +// Copyright © 2019 Luiz Otavio Processo. All rights reserved. +// + +import Foundation +import UIKit + +extension UIImage { + + class func imageByCombiningImage(firstImage: UIImage, withImage secondImage: UIImage) -> UIImage { + + let newImageWidth = max(firstImage.size.width, secondImage.size.width ) + let newImageHeight = max(firstImage.size.height, secondImage.size.height) + let newImageSize = CGSize(width : newImageWidth, height: newImageHeight) + + + UIGraphicsBeginImageContextWithOptions(newImageSize, false, UIScreen.main.scale) + + let firstImageDrawX = round((newImageSize.width - firstImage.size.width ) / 2) + let firstImageDrawY = round((newImageSize.height - firstImage.size.height ) / 2) + + let secondImageDrawX = round((newImageSize.width - secondImage.size.width ) / 2) + let secondImageDrawY = round((newImageSize.height - secondImage.size.height) / 2) + + firstImage .draw(at: CGPoint(x: firstImageDrawX, y: firstImageDrawY)) + secondImage.draw(at: CGPoint(x: secondImageDrawX, y: secondImageDrawY)) + + let image = UIGraphicsGetImageFromCurrentImageContext() + + UIGraphicsEndImageContext() + + return image! + } +} diff --git a/LuizProcessoTesteSantader/LuizProcessoTesteSantader/CustomExtensions/VisualFormat.swift b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/CustomExtensions/VisualFormat.swift new file mode 100644 index 00000000..34ff61e5 --- /dev/null +++ b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/CustomExtensions/VisualFormat.swift @@ -0,0 +1,23 @@ +// +// VisualFormat.swift +// LuizProcessoTesteSantader +// +// Created by Luiz Otavio Processo on 26/09/19. +// Copyright © 2019 Luiz Otavio Processo. All rights reserved. +// + +import Foundation +import UIKit + +extension UIView { + + func setUpContraint(pattern: String, views: UIView...) { + var myViews: [String : UIView] = [:] + + for (index, view) in views.enumerated() { + view.translatesAutoresizingMaskIntoConstraints = false + myViews["v\(index)"] = view + } + addConstraints(NSLayoutConstraint.constraints(withVisualFormat: pattern, options: NSLayoutConstraint.FormatOptions(), metrics: nil, views: myViews)) + } +} diff --git a/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Formulario/FormInteractor.swift b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Formulario/FormInteractor.swift new file mode 100644 index 00000000..f9a6dd84 --- /dev/null +++ b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Formulario/FormInteractor.swift @@ -0,0 +1,36 @@ +// +// FormInteractor.swift +// LuizProcessoTesteSantader +// +// Created by Luiz Otavio Processo on 26/09/19. +// Copyright (c) 2019 Luiz Otavio Processo. All rights reserved. +// +// This file was generated by the Clean Swift Xcode Templates so +// you can apply clean architecture to your iOS and Mac projects, +// see http://clean-swift.com +// + +import UIKit + +protocol FormBusinessLogicProtocol{ + func getFormData(request: Form.UserInfo.Request) +} + +protocol FormDataStoreProtocol{ + //var name: String { get set } +} + +class FormInteractor: FormBusinessLogicProtocol, FormDataStoreProtocol{ + var presenter: FormPresentationLogicProtocol? + var worker: FormWorker? + + // MARK: Do something + + func getFormData(request: Form.UserInfo.Request){ + worker = FormWorker() + worker?.requestFromAPI(completionHandler: { infos in + let response = Form.UserInfo.Response(infos: infos.cells) + self.presenter?.presentFormData(response: response) + }) + } +} diff --git a/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Formulario/FormModels.swift b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Formulario/FormModels.swift new file mode 100644 index 00000000..506e674f --- /dev/null +++ b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Formulario/FormModels.swift @@ -0,0 +1,28 @@ +// +// FormModels.swift +// LuizProcessoTesteSantader +// +// Created by Luiz Otavio Processo on 26/09/19. +// Copyright (c) 2019 Luiz Otavio Processo. All rights reserved. +// +// This file was generated by the Clean Swift Xcode Templates so +// you can apply clean architecture to your iOS and Mac projects, +// see http://clean-swift.com +// + +import UIKit + +enum Form{ + // MARK: Use cases + + enum UserInfo{ + struct Request{ + } + struct Response:Codable{ + var infos:[ViewInfoObj] + } + struct ViewModel:Codable{ + var infos:[ViewInfoObj] + } + } +} diff --git a/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Formulario/FormPresenter.swift b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Formulario/FormPresenter.swift new file mode 100644 index 00000000..18f8082d --- /dev/null +++ b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Formulario/FormPresenter.swift @@ -0,0 +1,31 @@ +// +// FormPresenter.swift +// LuizProcessoTesteSantader +// +// Created by Luiz Otavio Processo on 26/09/19. +// Copyright (c) 2019 Luiz Otavio Processo. All rights reserved. +// +// This file was generated by the Clean Swift Xcode Templates so +// you can apply clean architecture to your iOS and Mac projects, +// see http://clean-swift.com +// + +import UIKit + +protocol FormPresentationLogicProtocol +{ + func presentFormData(response: Form.UserInfo.Response) +} + +class FormPresenter: FormPresentationLogicProtocol +{ + weak var viewController: FormDisplayLogicProtocol? + + // MARK: Do something + + func presentFormData(response: Form.UserInfo.Response) + { + let viewModel = Form.UserInfo.ViewModel(infos: response.infos) + viewController?.displayViewInfo(viewModel: viewModel) + } +} diff --git a/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Formulario/FormRouter.swift b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Formulario/FormRouter.swift new file mode 100644 index 00000000..b29101c6 --- /dev/null +++ b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Formulario/FormRouter.swift @@ -0,0 +1,56 @@ +// +// FormRouter.swift +// LuizProcessoTesteSantader +// +// Created by Luiz Otavio Processo on 26/09/19. +// Copyright (c) 2019 Luiz Otavio Processo. All rights reserved. +// +// This file was generated by the Clean Swift Xcode Templates so +// you can apply clean architecture to your iOS and Mac projects, +// see http://clean-swift.com +// + +import UIKit + +@objc protocol FormRoutingLogicProtocol{ + func routeToInvestiment() + func routeToMessage() +} + +protocol FormDataPassingProtocol{ + var dataStore: FormDataStoreProtocol? { get } +} + +class FormRouter: NSObject, FormRoutingLogicProtocol, FormDataPassingProtocol{ + weak var viewController: FormViewController? + var dataStore: FormDataStoreProtocol? + + // MARK: Routing + + func routeToInvestiment() { + let destination = InvestViewController() + navigateToInvestiment(source: viewController!, destination: destination ) + } + + func routeToMessage() { + let destination = MessageViewController() + navigateToMessage(source: viewController!, destination: destination ) + } + + // MARK: Navigation + + func navigateToInvestiment(source: FormViewController, destination: InvestViewController){ + source.navigationController?.pushViewController(destination, animated: false) + } + + func navigateToMessage(source: FormViewController, destination: MessageViewController){ + source.navigationController?.pushViewController(destination, animated: false) + } + + // MARK: Passing data + + //func passDataToSomewhere(source: FormDataStore, destination: inout SomewhereDataStore) + //{ + // destination.name = source.name + //} +} diff --git a/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Formulario/FormViewController.swift b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Formulario/FormViewController.swift new file mode 100644 index 00000000..b85dbce1 --- /dev/null +++ b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Formulario/FormViewController.swift @@ -0,0 +1,144 @@ +// +// FormViewController.swift +// LuizProcessoTesteSantader +// +// Created by Luiz Otavio Processo on 26/09/19. +// Copyright (c) 2019 Luiz Otavio Processo. All rights reserved. +// +// This file was generated by the Clean Swift Xcode Templates so +// you can apply clean architecture to your iOS and Mac projects, +// see http://clean-swift.com +// + +import UIKit + +protocol FormDisplayLogicProtocol: class{ + func displayViewInfo(viewModel: Form.UserInfo.ViewModel) +} + +class FormViewController: UIViewController{ + var interactor: FormBusinessLogicProtocol? + var router: (NSObjectProtocol & FormRoutingLogicProtocol & FormDataPassingProtocol)? + var formView:FormView? + var infoForView:[ViewInfoObj] = [] + + // MARK: Object lifecycle + + override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?){ + super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil) + setup() + } + + required init?(coder aDecoder: NSCoder){ + super.init(coder: aDecoder) + setup() + } + + // MARK: View lifecycle + + override func viewDidLoad(){ + super.viewDidLoad() + + formView = FormView(frame: CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height)) + self.view = formView + + formView!.table.register(SendTableViewCell.self, forCellReuseIdentifier: SendTableViewCell.identifier) + formView!.table.register(TxtFieldTableViewCell.self, forCellReuseIdentifier: TxtFieldTableViewCell.identifier) + formView!.table.delegate = self + formView!.table.dataSource = self + + formView?.investBtn.addTarget(self, action: #selector(routingToInvestiment), for: .touchUpInside) + navigationItem.leftBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: self, action: nil) + loadFormData() + } + + // MARK: Setup + + private func setup(){ + let viewController = self + self.title = "Contato" + let interactor = FormInteractor() + let presenter = FormPresenter() + let router = FormRouter() + viewController.interactor = interactor + viewController.router = router + interactor.presenter = presenter + presenter.viewController = viewController + router.viewController = viewController + router.dataStore = interactor + + } + + // MARK: Routing + + @objc func routingToInvestiment(){ + router?.routeToInvestiment() + } + + @objc func routingToMessage(){ + router?.routeToMessage() + } + + // MARK: Do something + + func loadFormData(){ + let request = Form.UserInfo.Request() + interactor?.getFormData(request: request) + } +} + +extension FormViewController:FormDisplayLogicProtocol{ + + func displayViewInfo(viewModel: Form.UserInfo.ViewModel){ + infoForView = viewModel.infos + formView?.table.reloadData() + } +} + +extension FormViewController: UITableViewDelegate, UITableViewDataSource{ + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return 4 + } + + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + + if(infoForView.count > 0){ + + switch indexPath.row { + case 0: + let cell = tableView.dequeueReusableCell(withIdentifier: TxtFieldTableViewCell.identifier, for: indexPath) as? TxtFieldTableViewCell + cell?.txtField.placeholder = infoForView[1].message + return cell ?? UITableViewCell() + case 1: + let cell = tableView.dequeueReusableCell(withIdentifier: TxtFieldTableViewCell.identifier, for: indexPath) as? TxtFieldTableViewCell + cell?.txtField.placeholder = infoForView[2].message + return cell ?? UITableViewCell() + case 2: + let cell = tableView.dequeueReusableCell(withIdentifier: TxtFieldTableViewCell.identifier, for: indexPath) as? TxtFieldTableViewCell + cell?.txtField.placeholder = infoForView[3].message + return cell ?? UITableViewCell() + case 3: + let cell = tableView.dequeueReusableCell(withIdentifier: SendTableViewCell.identifier, for: indexPath) as? SendTableViewCell + cell?.label.text = infoForView[4].message + cell?.sendBtn.setTitle(infoForView[5].message, for: .normal) + cell?.sendBtn.addTarget(self, action: #selector(routingToMessage), for: .touchUpInside) + + return cell ?? UITableViewCell() + default: + break + } + + return UITableViewCell() + + }else{ + return UITableViewCell() + } + } + + func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { + if(indexPath.row == 3){ + return 200 + } + return 70 + } +} diff --git a/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Formulario/FormWorker.swift b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Formulario/FormWorker.swift new file mode 100644 index 00000000..56c779ed --- /dev/null +++ b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Formulario/FormWorker.swift @@ -0,0 +1,37 @@ +// +// FormWorker.swift +// LuizProcessoTesteSantader +// +// Created by Luiz Otavio Processo on 26/09/19. +// Copyright (c) 2019 Luiz Otavio Processo. All rights reserved. +// +// This file was generated by the Clean Swift Xcode Templates so +// you can apply clean architecture to your iOS and Mac projects, +// see http://clean-swift.com +// + +import UIKit + +class FormWorker{ + func requestFromAPI(completionHandler: @escaping (FormViewInfo) -> Void ){ + let url = URL(string: "https://floating-mountain-50292.herokuapp.com/cells.json") + let task = URLSession.shared.dataTask(with: url!){(data,response, error) in + DispatchQueue.main.async{ + if let data = data{ + let decoder = JSONDecoder() + do{ + let decodedData = try decoder.decode(FormViewInfo.self, from: data) + completionHandler(decodedData) + }catch{ + print(error.localizedDescription) + let objArray:[ViewInfoObj] = [] + let emptyInfo = FormViewInfo(cells: objArray) + completionHandler(emptyInfo) + } + } + } + } + task.resume() + } +} + diff --git a/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Info.plist b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Info.plist new file mode 100644 index 00000000..7e6d9097 --- /dev/null +++ b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Info.plist @@ -0,0 +1,45 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + LaunchScreen + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Investimento/InvestInteractor.swift b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Investimento/InvestInteractor.swift new file mode 100644 index 00000000..b482a4c5 --- /dev/null +++ b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Investimento/InvestInteractor.swift @@ -0,0 +1,36 @@ +// +// InvestInteractor.swift +// LuizProcessoTesteSantader +// +// Created by Luiz Otavio Processo on 27/09/19. +// Copyright (c) 2019 Luiz Otavio Processo. All rights reserved. +// +// This file was generated by the Clean Swift Xcode Templates so +// you can apply clean architecture to your iOS and Mac projects, +// see http://clean-swift.com +// + +import UIKit + +protocol InvestBusinessLogicProtocol{ + func getInvestmentData(request: Invest.InvestInfo.Request) +} + +protocol InvestDataStoreProtocol{ + //var name: String { get set } +} + +class InvestInteractor: InvestBusinessLogicProtocol, InvestDataStoreProtocol{ + var presenter: InvestPresentationLogicProtocol? + var worker: InvestWorker? + + // MARK: Do something + + func getInvestmentData(request: Invest.InvestInfo.Request){ + worker = InvestWorker() + worker?.getInvestInfo(completionHandler: { data in + let response = Invest.InvestInfo.Response(investInfo: data) + self.presenter?.presentInvestData(response: response) + }) + } +} diff --git a/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Investimento/InvestModels.swift b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Investimento/InvestModels.swift new file mode 100644 index 00000000..6662709c --- /dev/null +++ b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Investimento/InvestModels.swift @@ -0,0 +1,28 @@ +// +// InvestModels.swift +// LuizProcessoTesteSantader +// +// Created by Luiz Otavio Processo on 27/09/19. +// Copyright (c) 2019 Luiz Otavio Processo. All rights reserved. +// +// This file was generated by the Clean Swift Xcode Templates so +// you can apply clean architecture to your iOS and Mac projects, +// see http://clean-swift.com +// + +import UIKit + +enum Invest{ + // MARK: Use cases + + enum InvestInfo{ + struct Request{ + } + struct Response{ + let investInfo:InvestViewInfo + } + struct ViewModel{ + let investInfo:InvestViewInfo + } + } +} diff --git a/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Investimento/InvestPresenter.swift b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Investimento/InvestPresenter.swift new file mode 100644 index 00000000..00bcda1a --- /dev/null +++ b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Investimento/InvestPresenter.swift @@ -0,0 +1,31 @@ +// +// InvestPresenter.swift +// LuizProcessoTesteSantader +// +// Created by Luiz Otavio Processo on 27/09/19. +// Copyright (c) 2019 Luiz Otavio Processo. All rights reserved. +// +// This file was generated by the Clean Swift Xcode Templates so +// you can apply clean architecture to your iOS and Mac projects, +// see http://clean-swift.com +// + +import UIKit + +protocol InvestPresentationLogicProtocol +{ + func presentInvestData(response: Invest.InvestInfo.Response) +} + +class InvestPresenter: InvestPresentationLogicProtocol +{ + weak var viewController: InvestDisplayLogicProtocol? + + // MARK: Do something + + func presentInvestData(response: Invest.InvestInfo.Response) + { + let viewModel = Invest.InvestInfo.ViewModel(investInfo: response.investInfo) + viewController?.displayInvestData(viewModel: viewModel) + } +} diff --git a/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Investimento/InvestRouter.swift b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Investimento/InvestRouter.swift new file mode 100644 index 00000000..6af11216 --- /dev/null +++ b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Investimento/InvestRouter.swift @@ -0,0 +1,46 @@ +// +// InvestRouter.swift +// LuizProcessoTesteSantader +// +// Created by Luiz Otavio Processo on 27/09/19. +// Copyright (c) 2019 Luiz Otavio Processo. All rights reserved. +// +// This file was generated by the Clean Swift Xcode Templates so +// you can apply clean architecture to your iOS and Mac projects, +// see http://clean-swift.com +// + +import UIKit + +@objc protocol InvestRoutingLogicProtocol{ + func routeToForm() +} + +protocol InvestDataPassingProtocol{ + var dataStore: InvestDataStoreProtocol? { get } +} + +class InvestRouter: NSObject, InvestRoutingLogicProtocol, InvestDataPassingProtocol{ + weak var viewController: InvestViewController? + var dataStore: InvestDataStoreProtocol? + + // MARK: Routing + + func routeToForm() { + let destination = FormViewController() + navigateToForm(source: viewController!, destination: destination) + } + + // MARK: Navigation + + func navigateToForm(source: InvestViewController, destination: FormViewController){ + source.navigationController?.pushViewController(destination, animated: false) + } + + // MARK: Passing data + + //func passDataToSomewhere(source: InvestDataStore, destination: inout SomewhereDataStore) + //{ + // destination.name = source.name + //} +} diff --git a/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Investimento/InvestViewController.swift b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Investimento/InvestViewController.swift new file mode 100644 index 00000000..825be868 --- /dev/null +++ b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Investimento/InvestViewController.swift @@ -0,0 +1,234 @@ +// +// InvestViewController.swift +// LuizProcessoTesteSantader +// +// Created by Luiz Otavio Processo on 27/09/19. +// Copyright (c) 2019 Luiz Otavio Processo. All rights reserved. +// +// This file was generated by the Clean Swift Xcode Templates so +// you can apply clean architecture to your iOS and Mac projects, +// see http://clean-swift.com +// + +import UIKit +import SafariServices + +protocol InvestDisplayLogicProtocol: class +{ + func displayInvestData(viewModel: Invest.InvestInfo.ViewModel) +} + +class InvestViewController: UIViewController, SFSafariViewControllerDelegate{ + var interactor: InvestBusinessLogicProtocol? + var router: (NSObjectProtocol & InvestRoutingLogicProtocol & InvestDataPassingProtocol)? + var investView:InvestView? + var investInfo:InvestViewInfo? + + // MARK: Object lifecycle + + override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?){ + super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil) + setup() + } + + required init?(coder aDecoder: NSCoder){ + super.init(coder: aDecoder) + setup() + } + + // MARK: Setup + + private func setup(){ + let viewController = self + self.title = "Investimento" + let interactor = InvestInteractor() + let presenter = InvestPresenter() + let router = InvestRouter() + viewController.interactor = interactor + viewController.router = router + interactor.presenter = presenter + presenter.viewController = viewController + router.viewController = viewController + router.dataStore = interactor + } + + // MARK: Routing + + @objc func routingToForm(){ + router?.routeToForm() + } + + // MARK: View lifecycle + + override func viewDidLoad(){ + super.viewDidLoad() + + investView = InvestView(frame: CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height)) + self.view = investView + + investView!.table.register(HeaderTableViewCell.self, forCellReuseIdentifier: HeaderTableViewCell.identifier) + investView!.table.register(RiskTableViewCell.self, forCellReuseIdentifier: RiskTableViewCell.identifier) + investView!.table.register(ReturnTableViewCell.self, forCellReuseIdentifier: ReturnTableViewCell.identifier) + investView!.table.register(InvestInfoTableViewCell.self, forCellReuseIdentifier: InvestInfoTableViewCell.identifier) + investView!.table.register(InvestMoreInfoTableViewCell.self, forCellReuseIdentifier: InvestMoreInfoTableViewCell.identifier) + investView!.table.register(InvestBtnTableViewCell.self, forCellReuseIdentifier: InvestBtnTableViewCell.identifier) + + investView!.table.delegate = self + investView!.table.dataSource = self + + investView?.contactBtn.addTarget(self, action: #selector(routingToForm), for: .touchUpInside) + navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .action, target: self, action: nil) + navigationItem.rightBarButtonItem?.tintColor = .appRed + navigationItem.leftBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: self, action: nil) + + loadInvestData() + } + + // MARK: Do something + func loadInvestData(){ + let request = Invest.InvestInfo.Request() + interactor?.getInvestmentData(request: request) + } + + @objc func openSafari(){ + let safariViewController = SFSafariViewController(url: NSURL(string: "https://www.google.com")! as URL) + safariViewController.delegate = self + self.present(safariViewController, animated: true, completion: nil) + } +} +extension InvestViewController: InvestDisplayLogicProtocol{ + + func displayInvestData(viewModel: Invest.InvestInfo.ViewModel){ + investInfo = viewModel.investInfo + investView?.table.reloadData() + } +} + +extension InvestViewController: UITableViewDelegate, UITableViewDataSource{ + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return 18 + } + + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + + if(investInfo != nil){ + + switch indexPath.row { + case 0: + let cell = tableView.dequeueReusableCell(withIdentifier: HeaderTableViewCell.identifier, for: indexPath) as? HeaderTableViewCell + cell?.upperTitle.text = investInfo?.screen?.title + cell?.title.text = investInfo?.screen?.fundName + return cell ?? UITableViewCell() + case 1: + let cell = tableView.dequeueReusableCell(withIdentifier: RiskTableViewCell.identifier, for: indexPath) as? RiskTableViewCell + cell?.whatIs.text = investInfo?.screen?.whatIs + cell?.descript.text = investInfo?.screen?.definition + cell?.risk.text = investInfo?.screen?.riskTitle + return cell ?? UITableViewCell() + case 2: + let cell = tableView.dequeueReusableCell(withIdentifier: ReturnTableViewCell.identifier, for: indexPath) as? ReturnTableViewCell + cell?.headerLbl.text = investInfo?.screen?.infoTitle + cell?.fundLbl.text = "Fundo" + cell?.cdiLbl.text = "CDI" + cell?.monthView!.intervalo.text = "No mês" + cell?.yearView!.intervalo.text = "No ano" + cell?.twelveView!.intervalo.text = "12 meses" + + cell?.monthView!.fundReturn.text = (investInfo?.screen?.moreInfo?.month?.fund)!.toString+"%" + cell?.yearView!.fundReturn.text = (investInfo?.screen?.moreInfo?.year?.fund)!.toString+"%" + cell?.twelveView!.fundReturn.text = (investInfo?.screen?.moreInfo?.twelveMonth?.fund)!.toString+"%" + + cell?.monthView!.cdiReturn.text = (investInfo?.screen?.moreInfo?.month?.CDI)!.toString+"%" + cell?.yearView!.cdiReturn.text = (investInfo?.screen?.moreInfo?.year?.CDI)!.toString+"%" + cell?.twelveView!.cdiReturn.text = (investInfo?.screen?.moreInfo?.twelveMonth?.CDI)!.toString+"%" + + return cell ?? UITableViewCell() + case 3: + let cell = tableView.dequeueReusableCell(withIdentifier: InvestInfoTableViewCell.identifier, for: indexPath) as? InvestInfoTableViewCell + + cell?.title.text = investInfo?.screen?.info![0].name + cell?.infoDettail.text = investInfo?.screen?.info![0].data + return cell ?? UITableViewCell() + case 4: + let cell = tableView.dequeueReusableCell(withIdentifier: InvestInfoTableViewCell.identifier, for: indexPath) as? InvestInfoTableViewCell + cell?.title.text = investInfo?.screen?.info![1].name + cell?.infoDettail.text = investInfo?.screen?.info![1].data + return cell ?? UITableViewCell() + case 5: + let cell = tableView.dequeueReusableCell(withIdentifier: InvestInfoTableViewCell.identifier, for: indexPath) as? InvestInfoTableViewCell + cell?.title.text = investInfo?.screen?.info![2].name + cell?.infoDettail.text = investInfo?.screen?.info![2].data + return cell ?? UITableViewCell() + case 6: + let cell = tableView.dequeueReusableCell(withIdentifier: InvestInfoTableViewCell.identifier, for: indexPath) as? InvestInfoTableViewCell + cell?.title.text = investInfo?.screen?.info![3].name + cell?.infoDettail.text = investInfo?.screen?.info![3].data + return cell ?? UITableViewCell() + case 7: + let cell = tableView.dequeueReusableCell(withIdentifier: InvestInfoTableViewCell.identifier, for: indexPath) as? InvestInfoTableViewCell + cell?.title.text = investInfo?.screen?.info![4].name + cell?.infoDettail.text = investInfo?.screen?.info![4].data + return cell ?? UITableViewCell() + case 8: + let cell = tableView.dequeueReusableCell(withIdentifier: InvestInfoTableViewCell.identifier, for: indexPath) as? InvestInfoTableViewCell + cell?.title.text = investInfo?.screen?.info![5].name + cell?.infoDettail.text = investInfo?.screen?.info![5].data + return cell ?? UITableViewCell() + case 9: + let cell = tableView.dequeueReusableCell(withIdentifier: InvestInfoTableViewCell.identifier, for: indexPath) as? InvestInfoTableViewCell + cell?.title.text = investInfo?.screen?.info![6].name + cell?.infoDettail.text = investInfo?.screen?.info![6].data + return cell ?? UITableViewCell() + case 10: + let cell = tableView.dequeueReusableCell(withIdentifier: InvestMoreInfoTableViewCell.identifier, for: indexPath) as? InvestMoreInfoTableViewCell + cell?.title.text = investInfo?.screen?.downInfo![0].name + cell?.downLoadImg.addTarget(self, action: #selector(openSafari), for: .touchUpInside) + return cell ?? UITableViewCell() + case 11: + let cell = tableView.dequeueReusableCell(withIdentifier: InvestMoreInfoTableViewCell.identifier, for: indexPath) as? InvestMoreInfoTableViewCell + cell?.title.text = investInfo?.screen?.downInfo![1].name + cell?.downLoadImg.addTarget(self, action: #selector(openSafari), for: .touchUpInside) + return cell ?? UITableViewCell() + case 12: + let cell = tableView.dequeueReusableCell(withIdentifier: InvestMoreInfoTableViewCell.identifier, for: indexPath) as? InvestMoreInfoTableViewCell + cell?.title.text = investInfo?.screen?.downInfo![2].name + cell?.downLoadImg.addTarget(self, action: #selector(openSafari), for: .touchUpInside) + return cell ?? UITableViewCell() + case 13: + let cell = tableView.dequeueReusableCell(withIdentifier: InvestMoreInfoTableViewCell.identifier, for: indexPath) as? InvestMoreInfoTableViewCell + cell?.title.text = investInfo?.screen?.downInfo![3].name + cell?.downLoadImg.addTarget(self, action: #selector(openSafari), for: .touchUpInside) + return cell ?? UITableViewCell() + case 14: + let cell = tableView.dequeueReusableCell(withIdentifier: InvestMoreInfoTableViewCell.identifier, for: indexPath) as? InvestMoreInfoTableViewCell + cell?.title.text = investInfo?.screen?.downInfo![4].name + cell?.downLoadImg.addTarget(self, action: #selector(openSafari), for: .touchUpInside) + return cell ?? UITableViewCell() + case 15: + let cell = tableView.dequeueReusableCell(withIdentifier: InvestBtnTableViewCell.identifier, for: indexPath) as? InvestBtnTableViewCell + return cell ?? UITableViewCell() + default: + break + } + } + return UITableViewCell() + } + + func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { + + switch indexPath.row{ + case 0: + return 120 + case 1: + return 200 + case 2: + return 170 + case 16: + return 100 + default: + return 30 + } + } +} + + diff --git a/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Investimento/InvestWorker.swift b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Investimento/InvestWorker.swift new file mode 100644 index 00000000..962fed17 --- /dev/null +++ b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Investimento/InvestWorker.swift @@ -0,0 +1,37 @@ +// +// InvestWorker.swift +// LuizProcessoTesteSantader +// +// Created by Luiz Otavio Processo on 27/09/19. +// Copyright (c) 2019 Luiz Otavio Processo. All rights reserved. +// +// This file was generated by the Clean Swift Xcode Templates so +// you can apply clean architecture to your iOS and Mac projects, +// see http://clean-swift.com +// + +import UIKit + +class InvestWorker{ + + func getInvestInfo(completionHandler: @escaping (InvestViewInfo) -> Void ){ + + let url = URL(string: "https://floating-mountain-50292.herokuapp.com/fund.json") + let task = URLSession.shared.dataTask(with: url!){(data,response, error) in + DispatchQueue.main.async{ + if let data = data{ + let decoder = JSONDecoder() + do{ + let decodedData = try decoder.decode(InvestViewInfo.self, from: data) + print(decodedData) + completionHandler(decodedData) + }catch{ + print(error) + print(error.localizedDescription) + } + } + } + } + task.resume() + } +} diff --git a/LuizProcessoTesteSantader/LuizProcessoTesteSantader/LuizProcessoTesteSantader.xcdatamodeld/LuizProcessoTesteSantader.xcdatamodel/contents b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/LuizProcessoTesteSantader.xcdatamodeld/LuizProcessoTesteSantader.xcdatamodel/contents new file mode 100644 index 00000000..50d2514e --- /dev/null +++ b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/LuizProcessoTesteSantader.xcdatamodeld/LuizProcessoTesteSantader.xcdatamodel/contents @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Menssagem/MessageInteractor.swift b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Menssagem/MessageInteractor.swift new file mode 100644 index 00000000..0b1e1518 --- /dev/null +++ b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Menssagem/MessageInteractor.swift @@ -0,0 +1,37 @@ +// +// MessageInteractor.swift +// LuizProcessoTesteSantader +// +// Created by Luiz Otavio Processo on 28/09/19. +// Copyright (c) 2019 Luiz Otavio Processo. All rights reserved. +// +// This file was generated by the Clean Swift Xcode Templates so +// you can apply clean architecture to your iOS and Mac projects, +// see http://clean-swift.com +// + +import UIKit + +protocol MessageBusinessLogic{ + func doSomething(request: Message.Something.Request) +} + +protocol MessageDataStore{ + //var name: String { get set } +} + +class MessageInteractor: MessageBusinessLogic, MessageDataStore{ + var presenter: MessagePresentationLogic? + var worker: MessageWorker? + //var name: String = "" + + // MARK: Do something + + func doSomething(request: Message.Something.Request){ + worker = MessageWorker() + worker?.doSomeWork() + + let response = Message.Something.Response() + presenter?.presentSomething(response: response) + } +} diff --git a/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Menssagem/MessageModels.swift b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Menssagem/MessageModels.swift new file mode 100644 index 00000000..b1593a03 --- /dev/null +++ b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Menssagem/MessageModels.swift @@ -0,0 +1,26 @@ +// +// MessageModels.swift +// LuizProcessoTesteSantader +// +// Created by Luiz Otavio Processo on 28/09/19. +// Copyright (c) 2019 Luiz Otavio Processo. All rights reserved. +// +// This file was generated by the Clean Swift Xcode Templates so +// you can apply clean architecture to your iOS and Mac projects, +// see http://clean-swift.com +// + +import UIKit + +enum Message{ + // MARK: Use cases + + enum Something{ + struct Request{ + } + struct Response{ + } + struct ViewModel{ + } + } +} diff --git a/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Menssagem/MessagePresenter.swift b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Menssagem/MessagePresenter.swift new file mode 100644 index 00000000..d62d834d --- /dev/null +++ b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Menssagem/MessagePresenter.swift @@ -0,0 +1,28 @@ +// +// MessagePresenter.swift +// LuizProcessoTesteSantader +// +// Created by Luiz Otavio Processo on 28/09/19. +// Copyright (c) 2019 Luiz Otavio Processo. All rights reserved. +// +// This file was generated by the Clean Swift Xcode Templates so +// you can apply clean architecture to your iOS and Mac projects, +// see http://clean-swift.com +// + +import UIKit + +protocol MessagePresentationLogic{ + func presentSomething(response: Message.Something.Response) +} + +class MessagePresenter: MessagePresentationLogic{ + weak var viewController: MessageDisplayLogic? + + // MARK: Do something + + func presentSomething(response: Message.Something.Response){ + let viewModel = Message.Something.ViewModel() + viewController?.displaySomething(viewModel: viewModel) + } +} diff --git a/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Menssagem/MessageRouter.swift b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Menssagem/MessageRouter.swift new file mode 100644 index 00000000..7199df2a --- /dev/null +++ b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Menssagem/MessageRouter.swift @@ -0,0 +1,56 @@ +// +// MessageRouter.swift +// LuizProcessoTesteSantader +// +// Created by Luiz Otavio Processo on 28/09/19. +// Copyright (c) 2019 Luiz Otavio Processo. All rights reserved. +// +// This file was generated by the Clean Swift Xcode Templates so +// you can apply clean architecture to your iOS and Mac projects, +// see http://clean-swift.com +// + +import UIKit + +@objc protocol MessageRoutingLogic{ + func routeToForm() + func routeToInvest() +} + +protocol MessageDataPassing{ + var dataStore: MessageDataStore? { get } +} + +class MessageRouter: NSObject, MessageRoutingLogic, MessageDataPassing{ + weak var viewController: MessageViewController? + var dataStore: MessageDataStore? + + // MARK: Routing + + func routeToForm() { + let destination = FormViewController() + navigateToForm(source: viewController!, destination: destination) + } + + func routeToInvest() { + let destination = InvestViewController() + navigateToInvest(source: viewController!, destination: destination) + } + + + // MARK: Navigation + + func navigateToForm(source: MessageViewController, destination: FormViewController){ + source.navigationController?.pushViewController(destination, animated: false) + } + func navigateToInvest(source: MessageViewController, destination: InvestViewController){ + source.navigationController?.pushViewController(destination, animated: false) + } + + // MARK: Passing data + + //func passDataToSomewhere(source: MessageDataStore, destination: inout SomewhereDataStore) + //{ + // destination.name = source.name + //} +} diff --git a/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Menssagem/MessageViewController.swift b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Menssagem/MessageViewController.swift new file mode 100644 index 00000000..d2e0ff23 --- /dev/null +++ b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Menssagem/MessageViewController.swift @@ -0,0 +1,87 @@ +// +// MessageViewController.swift +// LuizProcessoTesteSantader +// +// Created by Luiz Otavio Processo on 28/09/19. +// Copyright (c) 2019 Luiz Otavio Processo. All rights reserved. +// +// This file was generated by the Clean Swift Xcode Templates so +// you can apply clean architecture to your iOS and Mac projects, +// see http://clean-swift.com +// + +import UIKit + +protocol MessageDisplayLogic: class{ + func displaySomething(viewModel: Message.Something.ViewModel) +} + +class MessageViewController: UIViewController, MessageDisplayLogic{ + var interactor: MessageBusinessLogic? + var router: (NSObjectProtocol & MessageRoutingLogic & MessageDataPassing)? + var messageView:MessageView? + + // MARK: Object lifecycle + + override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?){ + super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil) + setup() + } + + required init?(coder aDecoder: NSCoder){ + super.init(coder: aDecoder) + setup() + } + + // MARK: Setup + + private func setup(){ + let viewController = self + self.title = "Contato" + let interactor = MessageInteractor() + let presenter = MessagePresenter() + let router = MessageRouter() + viewController.interactor = interactor + viewController.router = router + interactor.presenter = presenter + presenter.viewController = viewController + router.viewController = viewController + router.dataStore = interactor + } + + // MARK: Routing + + @objc func routingToForm(){ + router?.routeToForm() + } + @objc func routingToInvest(){ + router?.routeToInvest() + } + + // MARK: View lifecycle + + override func viewDidLoad(){ + super.viewDidLoad() + messageView = MessageView(frame: CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height)) + self.view = messageView + + messageView?.newMsgBtn.addTarget(self, action: #selector(routingToForm), for: .touchUpInside) + messageView?.investBtn.addTarget(self, action: #selector(routingToInvest), for: .touchUpInside) + + navigationItem.leftBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: self, action: nil) + doSomething() + } + + // MARK: Do something + + //@IBOutlet weak var nameTextField: UITextField! + + func doSomething(){ + let request = Message.Something.Request() + interactor?.doSomething(request: request) + } + + func displaySomething(viewModel: Message.Something.ViewModel){ + //nameTextField.text = viewModel.name + } +} diff --git a/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Menssagem/MessageWorker.swift b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Menssagem/MessageWorker.swift new file mode 100644 index 00000000..c7ef9455 --- /dev/null +++ b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Menssagem/MessageWorker.swift @@ -0,0 +1,18 @@ +// +// MessageWorker.swift +// LuizProcessoTesteSantader +// +// Created by Luiz Otavio Processo on 28/09/19. +// Copyright (c) 2019 Luiz Otavio Processo. All rights reserved. +// +// This file was generated by the Clean Swift Xcode Templates so +// you can apply clean architecture to your iOS and Mac projects, +// see http://clean-swift.com +// + +import UIKit + +class MessageWorker{ + func doSomeWork(){ + } +} diff --git a/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Models/InvestViewInfo.swift b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Models/InvestViewInfo.swift new file mode 100644 index 00000000..afb18ada --- /dev/null +++ b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Models/InvestViewInfo.swift @@ -0,0 +1,51 @@ +// +// InvestViewInfo.swift +// LuizProcessoTesteSantader +// +// Created by Luiz Otavio Processo on 27/09/19. +// Copyright © 2019 Luiz Otavio Processo. All rights reserved. +// + +import Foundation + +struct InvestViewInfo:Codable{ + var screen:Screen? +} + +struct Screen:Codable{ + var title:String? + var fundName:String? + var whatIs:String? + var definition:String? + var riskTitle:String? + var risk:Int? + var infoTitle:String? + var moreInfo:MoreInfo? + var info:[Info]? + var downInfo:[DownInfo]? +} +struct MoreInfo:Codable { + var month:IntervaloTempo? + var year:IntervaloTempo? + var twelveMonth: IntervaloTempo? + + private enum CodingKeys: String, CodingKey{ + case month, year, twelveMonth = "12months" + } +} + +struct IntervaloTempo:Codable { + var fund:Double? + var CDI:Double? +} + +struct Info:Codable { + var name:String? + var data:String? +} + +struct DownInfo:Codable { + var name:String? + var data:String? +} + diff --git a/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Models/ViewInfo.swift b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Models/ViewInfo.swift new file mode 100644 index 00000000..d6869784 --- /dev/null +++ b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Models/ViewInfo.swift @@ -0,0 +1,14 @@ +// +// ViewInfo.swift +// LuizProcessoTesteSantader +// +// Created by Luiz Otavio Processo on 27/09/19. +// Copyright © 2019 Luiz Otavio Processo. All rights reserved. +// + +import Foundation + +struct FormViewInfo:Codable{ + var cells:[ViewInfoObj] +} + diff --git a/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Models/ViewInfoObj.swift b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Models/ViewInfoObj.swift new file mode 100644 index 00000000..c0368b26 --- /dev/null +++ b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Models/ViewInfoObj.swift @@ -0,0 +1,20 @@ +// +// ViewInfoObj.swift +// LuizProcessoTesteSantader +// +// Created by Luiz Otavio Processo on 27/09/19. +// Copyright © 2019 Luiz Otavio Processo. All rights reserved. +// + +import Foundation + +struct ViewInfoObj:Codable { + var id:Int? +// var type:Int? + var message:String? +// var typefield:Int? +// var hidden:Bool? +// var topspacing:Float? +// var show:Int? +// var required:Bool? +} diff --git a/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Views/FormView.swift b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Views/FormView.swift new file mode 100644 index 00000000..a29b9747 --- /dev/null +++ b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Views/FormView.swift @@ -0,0 +1,66 @@ +// +// FormView.swift +// LuizProcessoTesteSantader +// +// Created by Luiz Otavio Processo on 27/09/19. +// Copyright © 2019 Luiz Otavio Processo. All rights reserved. +// + +import Foundation +import UIKit + + +class FormView: UIView{ + + let table = UITableView() + + var innerView:UIView = { + let v = UIView() + v.backgroundColor = .clear + return v + }() + var contactBtn = UIButton() + var investBtn = UIButton() + + var sentMsgview:MessageView? + + override init(frame: CGRect) { + super.init(frame: frame) + table.separatorStyle = .none + table.allowsSelection = false + setElementsLayout() + setUpView() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + func setUpView(){ + + let viewWidth = self.frame.width + let viewHeight = self.frame.height + + self.addSubview(table) + self.addSubview(innerView) + innerView.addSubview(contactBtn) + innerView.addSubview(investBtn) + + self.setUpContraint(pattern: "V:|[v0(\(viewHeight))][v1(\(viewHeight/10))]|", views: table, innerView) + self.setUpContraint(pattern: "H:|[v0(\(viewWidth))]", views: table) + self.setUpContraint(pattern: "H:|[v0(\(viewWidth))]", views: innerView) + + innerView.setUpContraint(pattern: "V:[v0(\(viewHeight/11))]|", views: investBtn) + innerView.setUpContraint(pattern: "V:[v0(\(viewHeight/10))]|", views: contactBtn) + innerView.setUpContraint(pattern: "H:|[v0(\(viewWidth/2))][v1(\(viewWidth/2))]", views: investBtn, contactBtn) + + + } + + func setElementsLayout(){ + contactBtn.backgroundColor = .appDarkRed + contactBtn.setTitle("Contato", for: .normal) + investBtn.backgroundColor = .appRed + investBtn.setTitle("Investimento", for: .normal) + } +} diff --git a/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Views/InvestView.swift b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Views/InvestView.swift new file mode 100644 index 00000000..ef9575b4 --- /dev/null +++ b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Views/InvestView.swift @@ -0,0 +1,67 @@ +// +// InvestView.swift +// LuizProcessoTesteSantader +// +// Created by Luiz Otavio Processo on 27/09/19. +// Copyright © 2019 Luiz Otavio Processo. All rights reserved. +// + +import Foundation +import UIKit + +class InvestView:UIView{ + + var table = UITableView() + + + var innerView:UIView = { + let v = UIView() + v.backgroundColor = .clear + return v + }() + var contactBtn = UIButton() + var investBtn = UIButton() + + + override init(frame: CGRect) { + super.init(frame: frame) + table.separatorStyle = .none + table.allowsSelection = false + setElementsLayout() + setUpView() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + func setUpView(){ + + let viewWidth = self.frame.width + let viewHeight = self.frame.height + + self.addSubview(table) + self.addSubview(innerView) + innerView.addSubview(investBtn) + innerView.addSubview(contactBtn) + + print(viewWidth) + + self.setUpContraint(pattern: "V:|[v0(\(viewHeight))][v1(\(viewHeight/10))]|", views: table, innerView) + self.setUpContraint(pattern: "H:|[v0(\(viewWidth))]|", views: table) + self.setUpContraint(pattern: "H:|[v0(\(viewWidth))]", views: innerView) + + innerView.setUpContraint(pattern: "H:|[v0(\(viewWidth/2))][v1(\(viewWidth/2))]", views: investBtn,contactBtn) + innerView.setUpContraint(pattern: "V:[v0(\(viewHeight/10))]|", views: investBtn) + innerView.setUpContraint(pattern: "V:[v0(\(viewHeight/11))]|", views: contactBtn) + + + } + + func setElementsLayout(){ + contactBtn.backgroundColor = .appRed + contactBtn.setTitle("Contato", for: .normal) + investBtn.backgroundColor = .appDarkRed + investBtn.setTitle("Investimento", for: .normal) + } +} diff --git a/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Views/MessageView.swift b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Views/MessageView.swift new file mode 100644 index 00000000..c16e63ea --- /dev/null +++ b/LuizProcessoTesteSantader/LuizProcessoTesteSantader/Views/MessageView.swift @@ -0,0 +1,91 @@ +// +// MessageView.swift +// LuizProcessoTesteSantader +// +// Created by Luiz Otavio Processo on 28/09/19. +// Copyright © 2019 Luiz Otavio Processo. All rights reserved. +// + +import Foundation +import UIKit + + +class MessageView:UIView{ + + var upperLbl = UILabel() + var titleLbl = UILabel() + var newMsgBtn = UIButton() + + var innerView:UIView = { + let v = UIView() + v.backgroundColor = .clear + return v + }() + var contactBtn = UIButton() + var investBtn = UIButton() + + override init(frame: CGRect) { + super.init(frame: frame) + setElementsLayout() + setUpView() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + func setUpView(){ + + let viewWidth = self.frame.width + let viewHeight = self.frame.height + + self.addSubview(upperLbl) + self.addSubview(titleLbl) + self.addSubview(newMsgBtn) + self.addSubview(innerView) + + innerView.addSubview(investBtn) + innerView.addSubview(contactBtn) + + upperLbl.centerXAnchor.constraint(equalTo: self.centerXAnchor).isActive = true + titleLbl.centerXAnchor.constraint(equalTo: self.centerXAnchor).isActive = true + newMsgBtn.centerXAnchor.constraint(equalTo: self.centerXAnchor).isActive = true + + self.setUpContraint(pattern: "V:|-\(viewHeight/4)-[v0(\(viewHeight/10))][v1(\(viewHeight/8))]-\(viewHeight/6)-[v2(\(viewHeight/10))]-30-[v3(\(viewHeight/10))]|", views: upperLbl,titleLbl,newMsgBtn, innerView) + self.setUpContraint(pattern: "H:[v0(\(viewWidth/2))]", views: upperLbl) + self.setUpContraint(pattern: "H:[v0(\(viewWidth))]", views: titleLbl) + self.setUpContraint(pattern: "H:[v0(\(viewWidth/2))]", views: newMsgBtn) + self.setUpContraint(pattern: "H:|[v0(\(viewWidth))]", views: innerView) + + innerView.setUpContraint(pattern: "V:[v0(\(viewHeight/11))]|", views: investBtn) + innerView.setUpContraint(pattern: "V:[v0(\(viewHeight/10))]|", views: contactBtn) + innerView.setUpContraint(pattern: "H:|[v0(\(viewWidth/2))][v1(\(viewWidth/2))]", views: investBtn, contactBtn) + + } + + func setElementsLayout(){ + + upperLbl.text = "Obrigado!" + upperLbl.textAlignment = .center + upperLbl.textColor = .lightGray + upperLbl.font = UIFont(name: "HelveticaNeue-Medium", size: 15) + + + titleLbl.text = "Menssagem enviada \ncom sucesso :)" + titleLbl.textAlignment = .center + titleLbl.numberOfLines = 2 + titleLbl.textColor = .darkGray + titleLbl.font = UIFont(name: "HelveticaNeue-Medium", size: 25) + + newMsgBtn.backgroundColor = .clear + newMsgBtn.setTitle("Enviar nova mensagem", for: .normal) + newMsgBtn.titleLabel?.font = UIFont(name: "HelveticaNeue-Bold", size: 15) + newMsgBtn.setTitleColor(.appRed, for: .normal) + + contactBtn.backgroundColor = .appDarkRed + contactBtn.setTitle("Contato", for: .normal) + investBtn.backgroundColor = .appRed + investBtn.setTitle("Investimento", for: .normal) + + } +} diff --git a/LuizProcessoTesteSantader/LuizProcessoTesteSantaderTests/Info.plist b/LuizProcessoTesteSantader/LuizProcessoTesteSantaderTests/Info.plist new file mode 100644 index 00000000..64d65ca4 --- /dev/null +++ b/LuizProcessoTesteSantader/LuizProcessoTesteSantaderTests/Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + + diff --git a/LuizProcessoTesteSantader/LuizProcessoTesteSantaderTests/LuizProcessoTesteSantaderTests.swift b/LuizProcessoTesteSantader/LuizProcessoTesteSantaderTests/LuizProcessoTesteSantaderTests.swift new file mode 100644 index 00000000..763eecba --- /dev/null +++ b/LuizProcessoTesteSantader/LuizProcessoTesteSantaderTests/LuizProcessoTesteSantaderTests.swift @@ -0,0 +1,34 @@ +// +// LuizProcessoTesteSantaderTests.swift +// LuizProcessoTesteSantaderTests +// +// Created by Luiz Otavio Processo on 26/09/19. +// Copyright © 2019 Luiz Otavio Processo. All rights reserved. +// + +import XCTest +@testable import LuizProcessoTesteSantader + +class LuizProcessoTesteSantaderTests: XCTestCase { + + override func setUp() { + // Put setup code here. This method is called before the invocation of each test method in the class. + } + + override func tearDown() { + // Put teardown code here. This method is called after the invocation of each test method in the class. + } + + func testExample() { + // This is an example of a functional test case. + // Use XCTAssert and related functions to verify your tests produce the correct results. + } + + func testPerformanceExample() { + // This is an example of a performance test case. + self.measure { + // Put the code you want to measure the time of here. + } + } + +} diff --git a/LuizProcessoTesteSantader/LuizProcessoTesteSantaderUITests/Info.plist b/LuizProcessoTesteSantader/LuizProcessoTesteSantaderUITests/Info.plist new file mode 100644 index 00000000..64d65ca4 --- /dev/null +++ b/LuizProcessoTesteSantader/LuizProcessoTesteSantaderUITests/Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + + diff --git a/LuizProcessoTesteSantader/LuizProcessoTesteSantaderUITests/LuizProcessoTesteSantaderUITests.swift b/LuizProcessoTesteSantader/LuizProcessoTesteSantaderUITests/LuizProcessoTesteSantaderUITests.swift new file mode 100644 index 00000000..15069ffe --- /dev/null +++ b/LuizProcessoTesteSantader/LuizProcessoTesteSantaderUITests/LuizProcessoTesteSantaderUITests.swift @@ -0,0 +1,43 @@ +// +// LuizProcessoTesteSantaderUITests.swift +// LuizProcessoTesteSantaderUITests +// +// Created by Luiz Otavio Processo on 26/09/19. +// Copyright © 2019 Luiz Otavio Processo. All rights reserved. +// + +import XCTest + +class LuizProcessoTesteSantaderUITests: XCTestCase { + + override func setUp() { + // Put setup code here. This method is called before the invocation of each test method in the class. + + // In UI tests it is usually best to stop immediately when a failure occurs. + continueAfterFailure = false + + // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this. + } + + override func tearDown() { + // Put teardown code here. This method is called after the invocation of each test method in the class. + } + + func testExample() { + // UI tests must launch the application that they test. + let app = XCUIApplication() + app.launch() + + // Use recording to get started writing UI tests. + // Use XCTAssert and related functions to verify your tests produce the correct results. + } + + func testLaunchPerformance() { + if #available(macOS 10.15, iOS 13.0, tvOS 13.0, *) { + // This measures how long it takes to launch your application. + measure(metrics: [XCTOSSignpostMetric.applicationLaunch]) { + XCUIApplication().launch() + } + } + } +}